1 /* variables.c -- Functions for hacking shell variables. */
3 /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 Bash is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
23 #include "bashtypes.h"
24 #include "posixstat.h"
25 #include "posixtime.h"
29 # include <sy/netmgr.h>
35 #if defined (HAVE_UNISTD_H)
40 #include "chartypes.h"
47 #include "execute_cmd.h"
49 #include "mailcheck.h"
54 #include "builtins/getopt.h"
55 #include "builtins/common.h"
57 #if defined (READLINE)
58 # include "bashline.h"
59 # include <readline/readline.h>
61 # include <tilde/tilde.h>
65 # include "bashhist.h"
66 # include <readline/history.h>
69 #if defined (PROGRAMMABLE_COMPLETION)
70 # include "pcomplete.h"
73 #define TEMPENV_HASH_BUCKETS 4 /* must be power of two */
75 #define ifsname(s) ((s)[0] == 'I' && (s)[1] == 'F' && (s)[2] == 'S' && (s)[3] == '\0')
77 extern char **environ
;
79 /* Variables used here and defined in other files. */
80 extern int posixly_correct
;
81 extern int line_number
;
82 extern int subshell_environment
, indirection_level
, subshell_level
;
83 extern int build_version
, patch_level
;
84 extern int expanding_redir
;
85 extern char *dist_version
, *release_status
;
86 extern char *shell_name
;
87 extern char *primary_prompt
, *secondary_prompt
;
88 extern char *current_host_name
;
89 extern sh_builtin_func_t
*this_shell_builtin
;
90 extern SHELL_VAR
*this_shell_function
;
91 extern char *the_printed_command_except_trap
;
92 extern char *this_command_name
;
93 extern char *command_execution_string
;
94 extern time_t shell_start_time
;
96 #if defined (READLINE)
97 extern int no_line_editing
;
98 extern int perform_hostname_completion
;
101 /* The list of shell variables that the user has created at the global
102 scope, or that came from the environment. */
103 VAR_CONTEXT
*global_variables
= (VAR_CONTEXT
*)NULL
;
105 /* The current list of shell variables, including function scopes */
106 VAR_CONTEXT
*shell_variables
= (VAR_CONTEXT
*)NULL
;
108 /* The list of shell functions that the user has created, or that came from
110 HASH_TABLE
*shell_functions
= (HASH_TABLE
*)NULL
;
112 #if defined (DEBUGGER)
113 /* The table of shell function definitions that the user defined or that
114 came from the environment. */
115 HASH_TABLE
*shell_function_defs
= (HASH_TABLE
*)NULL
;
118 /* The current variable context. This is really a count of how deep into
119 executing functions we are. */
120 int variable_context
= 0;
122 /* The set of shell assignments which are made only in the environment
123 for a single command. */
124 HASH_TABLE
*temporary_env
= (HASH_TABLE
*)NULL
;
126 /* Set to non-zero if an assignment error occurs while putting variables
127 into the temporary environment. */
128 int tempenv_assign_error
;
130 /* Some funky variables which are known about specially. Here is where
131 "$*", "$1", and all the cruft is kept. */
132 char *dollar_vars
[10];
133 WORD_LIST
*rest_of_args
= (WORD_LIST
*)NULL
;
135 /* The value of $$. */
136 pid_t dollar_dollar_pid
;
138 /* An array which is passed to commands as their environment. It is
139 manufactured from the union of the initial environment and the
140 shell variables that are marked for export. */
141 char **export_env
= (char **)NULL
;
142 static int export_env_index
;
143 static int export_env_size
;
145 #if defined (READLINE)
146 static int winsize_assignment
; /* currently assigning to LINES or COLUMNS */
147 static int winsize_assigned
; /* assigned to LINES or COLUMNS */
150 /* Non-zero means that we have to remake EXPORT_ENV. */
151 int array_needs_making
= 1;
153 /* The number of times BASH has been executed. This is set
154 by initialize_variables (). */
157 /* Some forward declarations. */
158 static void create_variable_tables
__P((void));
160 static void set_machine_vars
__P((void));
161 static void set_home_var
__P((void));
162 static void set_shell_var
__P((void));
163 static char *get_bash_name
__P((void));
164 static void initialize_shell_level
__P((void));
165 static void uidset
__P((void));
166 #if defined (ARRAY_VARS)
167 static void make_vers_array
__P((void));
170 static SHELL_VAR
*null_assign
__P((SHELL_VAR
*, char *, arrayind_t
));
171 #if defined (ARRAY_VARS)
172 static SHELL_VAR
*null_array_assign
__P((SHELL_VAR
*, char *, arrayind_t
));
174 static SHELL_VAR
*get_self
__P((SHELL_VAR
*));
176 #if defined (ARRAY_VARS)
177 static SHELL_VAR
*init_dynamic_array_var
__P((char *, sh_var_value_func_t
*, sh_var_assign_func_t
*, int));
180 static SHELL_VAR
*assign_seconds
__P((SHELL_VAR
*, char *, arrayind_t
));
181 static SHELL_VAR
*get_seconds
__P((SHELL_VAR
*));
182 static SHELL_VAR
*init_seconds_var
__P((void));
184 static int brand
__P((void));
185 static void sbrand
__P((unsigned long)); /* set bash random number generator. */
186 static SHELL_VAR
*assign_random
__P((SHELL_VAR
*, char *, arrayind_t
));
187 static SHELL_VAR
*get_random
__P((SHELL_VAR
*));
189 static SHELL_VAR
*assign_lineno
__P((SHELL_VAR
*, char *, arrayind_t
));
190 static SHELL_VAR
*get_lineno
__P((SHELL_VAR
*));
192 static SHELL_VAR
*assign_subshell
__P((SHELL_VAR
*, char *, arrayind_t
));
193 static SHELL_VAR
*get_subshell
__P((SHELL_VAR
*));
195 #if defined (HISTORY)
196 static SHELL_VAR
*get_histcmd
__P((SHELL_VAR
*));
199 #if defined (PUSHD_AND_POPD) && defined (ARRAY_VARS)
200 static SHELL_VAR
*assign_dirstack
__P((SHELL_VAR
*, char *, arrayind_t
));
201 static SHELL_VAR
*get_dirstack
__P((SHELL_VAR
*));
204 #if defined (ARRAY_VARS)
205 static SHELL_VAR
*get_groupset
__P((SHELL_VAR
*));
208 static SHELL_VAR
*get_funcname
__P((SHELL_VAR
*));
209 static SHELL_VAR
*init_funcname_var
__P((void));
211 static void initialize_dynamic_variables
__P((void));
213 static SHELL_VAR
*hash_lookup
__P((const char *, HASH_TABLE
*));
214 static SHELL_VAR
*new_shell_variable
__P((const char *));
215 static SHELL_VAR
*make_new_variable
__P((const char *, HASH_TABLE
*));
216 static SHELL_VAR
*bind_variable_internal
__P((const char *, char *, HASH_TABLE
*, int, int));
218 static void free_variable_hash_data
__P((PTR_T
));
220 static VARLIST
*vlist_alloc
__P((int));
221 static VARLIST
*vlist_realloc
__P((VARLIST
*, int));
222 static void vlist_add
__P((VARLIST
*, SHELL_VAR
*, int));
224 static void flatten
__P((HASH_TABLE
*, sh_var_map_func_t
*, VARLIST
*, int));
226 static int qsort_var_comp
__P((SHELL_VAR
**, SHELL_VAR
**));
228 static SHELL_VAR
**vapply
__P((sh_var_map_func_t
*));
229 static SHELL_VAR
**fapply
__P((sh_var_map_func_t
*));
231 static int visible_var
__P((SHELL_VAR
*));
232 static int visible_and_exported
__P((SHELL_VAR
*));
233 static int local_and_exported
__P((SHELL_VAR
*));
234 static int variable_in_context
__P((SHELL_VAR
*));
235 #if defined (ARRAY_VARS)
236 static int visible_array_vars
__P((SHELL_VAR
*));
239 static SHELL_VAR
*bind_tempenv_variable
__P((const char *, char *));
240 static void push_temp_var
__P((PTR_T
));
241 static void propagate_temp_var
__P((PTR_T
));
242 static void dispose_temporary_env
__P((sh_free_func_t
*));
244 static inline char *mk_env_string
__P((const char *, const char *));
245 static char **make_env_array_from_var_list
__P((SHELL_VAR
**));
246 static char **make_var_export_array
__P((VAR_CONTEXT
*));
247 static char **make_func_export_array
__P((void));
248 static void add_temp_array_to_env
__P((char **, int, int));
250 static int n_shell_variables
__P((void));
251 static int set_context
__P((SHELL_VAR
*));
253 static void push_func_var
__P((PTR_T
));
254 static void push_exported_var
__P((PTR_T
));
256 static inline int find_special_var
__P((const char *));
259 create_variable_tables ()
261 if (shell_variables
== 0)
263 shell_variables
= global_variables
= new_var_context ((char *)NULL
, 0);
264 shell_variables
->scope
= 0;
265 shell_variables
->table
= hash_create (0);
268 if (shell_functions
== 0)
269 shell_functions
= hash_create (0);
271 #if defined (DEBUGGER)
272 if (shell_function_defs
== 0)
273 shell_function_defs
= hash_create (0);
277 /* Initialize the shell variables from the current environment.
278 If PRIVMODE is nonzero, don't import functions from ENV or
281 initialize_shell_variables (env
, privmode
)
285 char *name
, *string
, *temp_string
;
286 int c
, char_index
, string_index
, string_length
;
289 create_variable_tables ();
291 for (string_index
= 0; string
= env
[string_index
++]; )
295 while ((c
= *string
++) && c
!= '=')
297 if (string
[-1] == '=')
298 char_index
= string
- name
- 1;
300 /* If there are weird things in the environment, like `=xxx' or a
301 string without an `=', just skip them. */
305 /* ASSERT(name[char_index] == '=') */
306 name
[char_index
] = '\0';
307 /* Now, name = env variable name, string = env variable value, and
308 char_index == strlen (name) */
310 /* If exported function, define it now. Don't import functions from
311 the environment in privileged mode. */
312 if (privmode
== 0 && read_but_dont_execute
== 0 && STREQN ("() {", string
, 4))
314 string_length
= strlen (string
);
315 temp_string
= (char *)xmalloc (3 + string_length
+ char_index
);
317 strcpy (temp_string
, name
);
318 temp_string
[char_index
] = ' ';
319 strcpy (temp_string
+ char_index
+ 1, string
);
321 parse_and_execute (temp_string
, name
, SEVAL_NONINT
|SEVAL_NOHIST
);
323 /* Ancient backwards compatibility. Old versions of bash exported
324 functions like name()=() {...} */
325 if (name
[char_index
- 1] == ')' && name
[char_index
- 2] == '(')
326 name
[char_index
- 2] = '\0';
328 if (temp_var
= find_function (name
))
330 VSETATTR (temp_var
, (att_exported
|att_imported
));
331 array_needs_making
= 1;
334 report_error (_("error importing function definition for `%s'"), name
);
337 if (name
[char_index
- 1] == ')' && name
[char_index
- 2] == '\0')
338 name
[char_index
- 2] = '('; /* ) */
340 #if defined (ARRAY_VARS)
342 /* Array variables may not yet be exported. */
343 else if (*string
== '(' && string
[1] == '[' && string
[strlen (string
) - 1] == ')')
346 temp_string
= extract_array_assignment_list (string
, &string_length
);
347 temp_var
= assign_array_from_string (name
, temp_string
);
349 VSETATTR (temp_var
, (att_exported
| att_imported
));
350 array_needs_making
= 1;
356 temp_var
= bind_variable (name
, string
, 0);
357 VSETATTR (temp_var
, (att_exported
| att_imported
));
358 array_needs_making
= 1;
361 name
[char_index
] = '=';
362 /* temp_var can be NULL if it was an exported function with a syntax
363 error (a different bug, but it still shouldn't dump core). */
364 if (temp_var
&& function_p (temp_var
) == 0) /* XXX not yet */
366 CACHE_IMPORTSTR (temp_var
, name
);
372 /* Set up initial value of $_ */
373 temp_var
= set_if_not ("_", dollar_vars
[0]);
375 /* Remember this pid. */
376 dollar_dollar_pid
= getpid ();
378 /* Now make our own defaults in case the vars that we think are
379 important are missing. */
380 temp_var
= set_if_not ("PATH", DEFAULT_PATH_VALUE
);
382 set_auto_export (temp_var
); /* XXX */
385 temp_var
= set_if_not ("TERM", "dumb");
387 set_auto_export (temp_var
); /* XXX */
391 /* set node id -- don't import it from the environment */
395 netmgr_ndtostr(ND2S_LOCAL_STR
, ND_LOCAL_NODE
, node_name
, sizeof(node_name
));
397 qnx_nidtostr (getnid (), node_name
, sizeof (node_name
));
399 temp_var
= bind_variable ("NODE", node_name
, 0);
400 set_auto_export (temp_var
);
404 /* set up the prompts. */
405 if (interactive_shell
)
407 #if defined (PROMPT_STRING_DECODE)
408 set_if_not ("PS1", primary_prompt
);
410 if (current_user
.uid
== -1)
411 get_current_user_info ();
412 set_if_not ("PS1", current_user
.euid
== 0 ? "# " : primary_prompt
);
414 set_if_not ("PS2", secondary_prompt
);
416 set_if_not ("PS4", "+ ");
418 /* Don't allow IFS to be imported from the environment. */
419 temp_var
= bind_variable ("IFS", " \t\n", 0);
422 /* Magic machine types. Pretty convenient. */
425 /* Default MAILCHECK for interactive shells. Defer the creation of a
426 default MAILPATH until the startup files are read, because MAIL
427 names a mail file if MAILPATH is not set, and we should provide a
428 default only if neither is set. */
429 if (interactive_shell
)
431 temp_var
= set_if_not ("MAILCHECK", posixly_correct
? "600" : "60");
432 VSETATTR (temp_var
, att_integer
);
435 /* Do some things with shell level. */
436 initialize_shell_level ();
440 /* Initialize the `getopts' stuff. */
441 temp_var
= bind_variable ("OPTIND", "1", 0);
442 VSETATTR (temp_var
, att_integer
);
444 bind_variable ("OPTERR", "1", 0);
447 if (login_shell
== 1 && posixly_correct
== 0)
450 /* Get the full pathname to THIS shell, and set the BASH variable
452 name
= get_bash_name ();
453 temp_var
= bind_variable ("BASH", name
, 0);
456 /* Make the exported environment variable SHELL be the user's login
457 shell. Note that the `tset' command looks at this variable
458 to determine what style of commands to output; if it ends in "csh",
459 then C-shell commands are output, else Bourne shell commands. */
462 /* Make a variable called BASH_VERSION which contains the version info. */
463 bind_variable ("BASH_VERSION", shell_version_string (), 0);
464 #if defined (ARRAY_VARS)
468 if (command_execution_string
)
469 bind_variable ("BASH_EXECUTION_STRING", command_execution_string
, 0);
471 /* Find out if we're supposed to be in Posix.2 mode via an
472 environment variable. */
473 temp_var
= find_variable ("POSIXLY_CORRECT");
475 temp_var
= find_variable ("POSIX_PEDANTIC");
476 if (temp_var
&& imported_p (temp_var
))
477 sv_strict_posix (temp_var
->name
);
479 #if defined (HISTORY)
480 /* Set history variables to defaults, and then do whatever we would
481 do if the variable had just been set. Do this only in the case
482 that we are remembering commands on the history list. */
483 if (remember_on_history
)
485 name
= bash_tilde_expand (posixly_correct
? "~/.sh_history" : "~/.bash_history", 0);
487 set_if_not ("HISTFILE", name
);
491 set_if_not ("HISTSIZE", "500");
492 sv_histsize ("HISTSIZE");
497 /* Seed the random number generator. */
498 sbrand (dollar_dollar_pid
+ shell_start_time
);
500 /* Handle some "special" variables that we may have inherited from a
502 if (interactive_shell
)
504 temp_var
= find_variable ("IGNOREEOF");
506 temp_var
= find_variable ("ignoreeof");
507 if (temp_var
&& imported_p (temp_var
))
508 sv_ignoreeof (temp_var
->name
);
511 #if defined (HISTORY)
512 if (interactive_shell
&& remember_on_history
)
514 sv_history_control ("HISTCONTROL");
515 sv_histignore ("HISTIGNORE");
519 #if defined (READLINE) && defined (STRICT_POSIX)
520 /* POSIXLY_CORRECT will only be 1 here if the shell was compiled
522 if (interactive_shell
&& posixly_correct
&& no_line_editing
== 0)
523 rl_prefer_env_winsize
= 1;
524 #endif /* READLINE && STRICT_POSIX */
529 * I'm tired of the arguing and bug reports. Bash now leaves SSH_CLIENT
530 * and SSH2_CLIENT alone. I'm going to rely on the shell_level check in
531 * isnetconn() to avoid running the startup files more often than wanted.
532 * That will, of course, only work if the user's login shell is bash, so
533 * I've made that behavior conditional on SSH_SOURCE_BASHRC being defined
537 temp_var
= find_variable ("SSH_CLIENT");
538 if (temp_var
&& imported_p (temp_var
))
540 VUNSETATTR (temp_var
, att_exported
);
541 array_needs_making
= 1;
543 temp_var
= find_variable ("SSH2_CLIENT");
544 if (temp_var
&& imported_p (temp_var
))
546 VUNSETATTR (temp_var
, att_exported
);
547 array_needs_making
= 1;
551 /* Get the user's real and effective user ids. */
554 /* Initialize the dynamic variables, and seed their values. */
555 initialize_dynamic_variables ();
558 /* **************************************************************** */
560 /* Setting values for special shell variables */
562 /* **************************************************************** */
569 temp_var
= set_if_not ("HOSTTYPE", HOSTTYPE
);
570 temp_var
= set_if_not ("OSTYPE", OSTYPE
);
571 temp_var
= set_if_not ("MACHTYPE", MACHTYPE
);
573 temp_var
= set_if_not ("HOSTNAME", current_host_name
);
576 /* Set $HOME to the information in the password file if we didn't get
577 it from the environment. */
579 /* This function is not static so the tilde and readline libraries can
584 if (current_user
.home_dir
== 0)
585 get_current_user_info ();
586 return current_user
.home_dir
;
594 temp_var
= find_variable ("HOME");
596 temp_var
= bind_variable ("HOME", sh_get_home_dir (), 0);
598 VSETATTR (temp_var
, att_exported
);
602 /* Set $SHELL to the user's login shell if it is not already set. Call
603 get_current_user_info if we haven't already fetched the shell. */
609 temp_var
= find_variable ("SHELL");
612 if (current_user
.shell
== 0)
613 get_current_user_info ();
614 temp_var
= bind_variable ("SHELL", current_user
.shell
, 0);
617 VSETATTR (temp_var
, att_exported
);
626 if ((login_shell
== 1) && RELPATH(shell_name
))
628 if (current_user
.shell
== 0)
629 get_current_user_info ();
630 name
= savestring (current_user
.shell
);
632 else if (ABSPATH(shell_name
))
633 name
= savestring (shell_name
);
634 else if (shell_name
[0] == '.' && shell_name
[1] == '/')
636 /* Fast path for common case. */
640 cdir
= get_string_value ("PWD");
644 name
= (char *)xmalloc (len
+ strlen (shell_name
) + 1);
646 strcpy (name
+ len
, shell_name
+ 1);
649 name
= savestring (shell_name
);
656 tname
= find_user_command (shell_name
);
660 /* Try the current directory. If there is not an executable
661 there, just punt and use the login shell. */
662 s
= file_status (shell_name
);
665 tname
= make_absolute (shell_name
, get_string_value ("PWD"));
666 if (*shell_name
== '.')
668 name
= sh_canonpath (tname
, PATH_CHECKDOTDOT
|PATH_CHECKEXISTS
);
679 if (current_user
.shell
== 0)
680 get_current_user_info ();
681 name
= savestring (current_user
.shell
);
686 name
= full_pathname (tname
);
695 adjust_shell_level (change
)
698 char new_level
[5], *old_SHLVL
;
702 old_SHLVL
= get_string_value ("SHLVL");
703 if (old_SHLVL
== 0 || *old_SHLVL
== '\0' || legal_number (old_SHLVL
, &old_level
) == 0)
706 shell_level
= old_level
+ change
;
709 else if (shell_level
> 1000)
711 internal_warning (_("shell level (%d) too high, resetting to 1"), shell_level
);
715 /* We don't need the full generality of itos here. */
716 if (shell_level
< 10)
718 new_level
[0] = shell_level
+ '0';
721 else if (shell_level
< 100)
723 new_level
[0] = (shell_level
/ 10) + '0';
724 new_level
[1] = (shell_level
% 10) + '0';
727 else if (shell_level
< 1000)
729 new_level
[0] = (shell_level
/ 100) + '0';
730 old_level
= shell_level
% 100;
731 new_level
[1] = (old_level
/ 10) + '0';
732 new_level
[2] = (old_level
% 10) + '0';
736 temp_var
= bind_variable ("SHLVL", new_level
, 0);
737 set_auto_export (temp_var
);
741 initialize_shell_level ()
743 adjust_shell_level (1);
746 /* If we got PWD from the environment, update our idea of the current
747 working directory. In any case, make sure that PWD exists before
748 checking it. It is possible for getcwd () to fail on shell startup,
749 and in that case, PWD would be undefined. If this is an interactive
750 login shell, see if $HOME is the current working directory, and if
751 that's not the same string as $PWD, set PWD=$HOME. */
756 SHELL_VAR
*temp_var
, *home_var
;
757 char *temp_string
, *home_string
;
759 home_var
= find_variable ("HOME");
760 home_string
= home_var
? value_cell (home_var
) : (char *)NULL
;
762 temp_var
= find_variable ("PWD");
763 if (temp_var
&& imported_p (temp_var
) &&
764 (temp_string
= value_cell (temp_var
)) &&
765 same_file (temp_string
, ".", (struct stat
*)NULL
, (struct stat
*)NULL
))
766 set_working_directory (temp_string
);
767 else if (home_string
&& interactive_shell
&& login_shell
&&
768 same_file (home_string
, ".", (struct stat
*)NULL
, (struct stat
*)NULL
))
770 set_working_directory (home_string
);
771 temp_var
= bind_variable ("PWD", home_string
, 0);
772 set_auto_export (temp_var
);
776 temp_string
= get_working_directory ("shell-init");
779 temp_var
= bind_variable ("PWD", temp_string
, 0);
780 set_auto_export (temp_var
);
785 /* According to the Single Unix Specification, v2, $OLDPWD is an
786 `environment variable' and therefore should be auto-exported.
787 Make a dummy invisible variable for OLDPWD, and mark it as exported. */
788 temp_var
= bind_variable ("OLDPWD", (char *)NULL
, 0);
789 VSETATTR (temp_var
, (att_exported
| att_invisible
));
792 /* Make a variable $PPID, which holds the pid of the shell's parent. */
796 char namebuf
[INT_STRLEN_BOUND(pid_t
) + 1], *name
;
799 name
= inttostr (getppid (), namebuf
, sizeof(namebuf
));
800 temp_var
= find_variable ("PPID");
802 VUNSETATTR (temp_var
, (att_readonly
| att_exported
));
803 temp_var
= bind_variable ("PPID", name
, 0);
804 VSETATTR (temp_var
, (att_readonly
| att_integer
));
810 char buff
[INT_STRLEN_BOUND(uid_t
) + 1], *b
;
811 register SHELL_VAR
*v
;
813 b
= inttostr (current_user
.uid
, buff
, sizeof (buff
));
814 v
= find_variable ("UID");
817 v
= bind_variable ("UID", b
, 0);
818 VSETATTR (v
, (att_readonly
| att_integer
));
821 if (current_user
.euid
!= current_user
.uid
)
822 b
= inttostr (current_user
.euid
, buff
, sizeof (buff
));
824 v
= find_variable ("EUID");
827 v
= bind_variable ("EUID", b
, 0);
828 VSETATTR (v
, (att_readonly
| att_integer
));
832 #if defined (ARRAY_VARS)
838 char *s
, d
[32], b
[INT_STRLEN_BOUND(int) + 1];
840 unbind_variable ("BASH_VERSINFO");
842 vv
= make_new_array_variable ("BASH_VERSINFO");
843 av
= array_cell (vv
);
844 strcpy (d
, dist_version
);
845 s
= xstrchr (d
, '.');
848 array_insert (av
, 0, d
);
849 array_insert (av
, 1, s
);
850 s
= inttostr (patch_level
, b
, sizeof (b
));
851 array_insert (av
, 2, s
);
852 s
= inttostr (build_version
, b
, sizeof (b
));
853 array_insert (av
, 3, s
);
854 array_insert (av
, 4, release_status
);
855 array_insert (av
, 5, MACHTYPE
);
857 VSETATTR (vv
, att_readonly
);
859 #endif /* ARRAY_VARS */
861 /* Set the environment variables $LINES and $COLUMNS in response to
862 a window size change. */
864 sh_set_lines_and_columns (lines
, cols
)
867 char val
[INT_STRLEN_BOUND(int) + 1], *v
;
869 #if defined (READLINE)
870 /* If we are currently assigning to LINES or COLUMNS, don't do anything. */
871 if (winsize_assignment
)
875 v
= inttostr (lines
, val
, sizeof (val
));
876 bind_variable ("LINES", v
, 0);
878 v
= inttostr (cols
, val
, sizeof (val
));
879 bind_variable ("COLUMNS", v
, 0);
882 /* **************************************************************** */
884 /* Printing variables and values */
886 /* **************************************************************** */
888 /* Print LIST (a list of shell variables) to stdout in such a way that
889 they can be read back in. */
891 print_var_list (list
)
892 register SHELL_VAR
**list
;
895 register SHELL_VAR
*var
;
897 for (i
= 0; list
&& (var
= list
[i
]); i
++)
898 if (invisible_p (var
) == 0)
899 print_assignment (var
);
902 /* Print LIST (a list of shell functions) to stdout in such a way that
903 they can be read back in. */
905 print_func_list (list
)
906 register SHELL_VAR
**list
;
909 register SHELL_VAR
*var
;
911 for (i
= 0; list
&& (var
= list
[i
]); i
++)
913 printf ("%s ", var
->name
);
914 print_var_function (var
);
919 /* Print the value of a single SHELL_VAR. No newline is
920 output, but the variable is printed in such a way that
921 it can be read back in. */
923 print_assignment (var
)
926 if (var_isset (var
) == 0)
929 if (function_p (var
))
931 printf ("%s", var
->name
);
932 print_var_function (var
);
935 #if defined (ARRAY_VARS)
936 else if (array_p (var
))
937 print_array_assignment (var
, 0);
938 #endif /* ARRAY_VARS */
941 printf ("%s=", var
->name
);
942 print_var_value (var
, 1);
947 /* Print the value cell of VAR, a shell variable. Do not print
948 the name, nor leading/trailing newline. If QUOTE is non-zero,
949 and the value contains shell metacharacters, quote the value
950 in such a way that it can be read back in. */
952 print_var_value (var
, quote
)
958 if (var_isset (var
) == 0)
961 if (quote
&& posixly_correct
== 0 && ansic_shouldquote (value_cell (var
)))
963 t
= ansic_quote (value_cell (var
), 0, (int *)0);
967 else if (quote
&& sh_contains_shell_metas (value_cell (var
)))
969 t
= sh_single_quote (value_cell (var
));
974 printf ("%s", value_cell (var
));
977 /* Print the function cell of VAR, a shell variable. Do not
978 print the name, nor leading/trailing newline. */
980 print_var_function (var
)
983 if (function_p (var
) && var_isset (var
))
984 printf ("%s", named_function_string ((char *)NULL
, function_cell(var
), 1));
987 /* **************************************************************** */
989 /* Dynamic Variables */
991 /* **************************************************************** */
995 These are variables whose values are generated anew each time they are
996 referenced. These are implemented using a pair of function pointers
997 in the struct variable: assign_func, which is called from bind_variable
998 and, if arrays are compiled into the shell, some of the functions in
999 arrayfunc.c, and dynamic_value, which is called from find_variable.
1001 assign_func is called from bind_variable_internal, if
1002 bind_variable_internal discovers that the variable being assigned to
1003 has such a function. The function is called as
1004 SHELL_VAR *temp = (*(entry->assign_func)) (entry, value, ind)
1005 and the (SHELL_VAR *)temp is returned as the value of bind_variable. It
1006 is usually ENTRY (self). IND is an index for an array variable, and
1009 dynamic_value is called from find_variable_internal to return a `new'
1010 value for the specified dynamic varible. If this function is NULL,
1011 the variable is treated as a `normal' shell variable. If it is not,
1012 however, then this function is called like this:
1013 tempvar = (*(var->dynamic_value)) (var);
1015 Sometimes `tempvar' will replace the value of `var'. Other times, the
1016 shell will simply use the string value. Pretty object-oriented, huh?
1018 Be warned, though: if you `unset' a special variable, it loses its
1019 special meaning, even if you subsequently set it.
1021 The special assignment code would probably have been better put in
1022 subst.c: do_assignment_internal, in the same style as
1023 stupidly_hack_special_variables, but I wanted the changes as
1024 localized as possible. */
1026 #define INIT_DYNAMIC_VAR(var, val, gfunc, afunc) \
1029 v = bind_variable (var, (val), 0); \
1030 v->dynamic_value = gfunc; \
1031 v->assign_func = afunc; \
1035 #define INIT_DYNAMIC_ARRAY_VAR(var, gfunc, afunc) \
1038 v = make_new_array_variable (var); \
1039 v->dynamic_value = gfunc; \
1040 v->assign_func = afunc; \
1045 null_assign (self
, value
, unused
)
1053 #if defined (ARRAY_VARS)
1055 null_array_assign (self
, value
, ind
)
1064 /* Degenerate `dynamic_value' function; just returns what's passed without
1073 #if defined (ARRAY_VARS)
1074 /* A generic dynamic array variable initializer. Intialize array variable
1075 NAME with dynamic value function GETFUNC and assignment function SETFUNC. */
1077 init_dynamic_array_var (name
, getfunc
, setfunc
, attrs
)
1079 sh_var_value_func_t
*getfunc
;
1080 sh_var_assign_func_t
*setfunc
;
1085 v
= find_variable (name
);
1088 INIT_DYNAMIC_ARRAY_VAR (name
, getfunc
, setfunc
);
1090 VSETATTR (v
, attrs
);
1096 /* The value of $SECONDS. This is the number of seconds since shell
1097 invocation, or, the number of seconds since the last assignment + the
1098 value of the last assignment. */
1099 static intmax_t seconds_value_assigned
;
1102 assign_seconds (self
, value
, unused
)
1107 if (legal_number (value
, &seconds_value_assigned
) == 0)
1108 seconds_value_assigned
= 0;
1109 shell_start_time
= NOW
;
1117 time_t time_since_start
;
1120 time_since_start
= NOW
- shell_start_time
;
1121 p
= itos(seconds_value_assigned
+ time_since_start
);
1123 FREE (value_cell (var
));
1125 VSETATTR (var
, att_integer
);
1126 var_setvalue (var
, p
);
1135 v
= find_variable ("SECONDS");
1138 if (legal_number (value_cell(v
), &seconds_value_assigned
) == 0)
1139 seconds_value_assigned
= 0;
1141 INIT_DYNAMIC_VAR ("SECONDS", (v
? value_cell (v
) : (char *)NULL
), get_seconds
, assign_seconds
);
1145 /* The random number seed. You can change this by setting RANDOM. */
1146 static unsigned long rseed
= 1;
1147 static int last_random_value
;
1148 static int seeded_subshell
= 0;
1150 /* A linear congruential random number generator based on the example
1151 one in the ANSI C standard. This one isn't very good, but a more
1152 complicated one is overkill. */
1154 /* Returns a pseudo-random number between 0 and 32767. */
1158 rseed
= rseed
* 1103515245 + 12345;
1159 return ((unsigned int)((rseed
>> 16) & 32767)); /* was % 32768 */
1162 /* Set the random number generator seed to SEED. */
1168 last_random_value
= 0;
1172 assign_random (self
, value
, unused
)
1177 sbrand (strtoul (value
, (char **)NULL
, 10));
1178 if (subshell_environment
)
1179 seeded_subshell
= 1;
1184 get_random_number ()
1188 /* Reset for command and process substitution. */
1189 if (subshell_environment
&& seeded_subshell
== 0)
1191 sbrand (rseed
+ getpid() + NOW
);
1192 seeded_subshell
= 1;
1197 while (rv
== last_random_value
);
1208 rv
= get_random_number ();
1209 last_random_value
= rv
;
1212 FREE (value_cell (var
));
1214 VSETATTR (var
, att_integer
);
1215 var_setvalue (var
, p
);
1220 assign_lineno (var
, value
, unused
)
1227 if (value
== 0 || *value
== '\0' || legal_number (value
, &new_value
) == 0)
1229 line_number
= new_value
;
1233 /* Function which returns the current line number. */
1241 ln
= executing_line_number ();
1243 FREE (value_cell (var
));
1244 var_setvalue (var
, p
);
1249 assign_subshell (var
, value
, unused
)
1256 if (value
== 0 || *value
== '\0' || legal_number (value
, &new_value
) == 0)
1258 subshell_level
= new_value
;
1268 p
= itos (subshell_level
);
1269 FREE (value_cell (var
));
1270 var_setvalue (var
, p
);
1275 get_bash_command (var
)
1281 if (the_printed_command_except_trap
)
1282 p
= savestring (the_printed_command_except_trap
);
1285 p
= (char *)xmalloc (1);
1288 FREE (value_cell (var
));
1289 var_setvalue (var
, p
);
1293 #if defined (HISTORY)
1300 p
= itos (history_number ());
1301 FREE (value_cell (var
));
1302 var_setvalue (var
, p
);
1307 #if defined (READLINE)
1308 /* When this function returns, VAR->value points to malloced memory. */
1310 get_comp_wordbreaks (var
)
1313 /* If we don't have anything yet, assign a default value. */
1314 if (rl_completer_word_break_characters
== 0 && bash_readline_initialized
== 0)
1315 enable_hostname_completion (perform_hostname_completion
);
1317 var_setvalue (var
, rl_completer_word_break_characters
);
1322 /* When this function returns, rl_completer_word_break_characters points to
1325 assign_comp_wordbreaks (self
, value
, unused
)
1330 if (rl_completer_word_break_characters
&&
1331 rl_completer_word_break_characters
!= rl_basic_word_break_characters
)
1332 free (rl_completer_word_break_characters
);
1334 rl_completer_word_break_characters
= savestring (value
);
1337 #endif /* READLINE */
1339 #if defined (PUSHD_AND_POPD) && defined (ARRAY_VARS)
1341 assign_dirstack (self
, value
, ind
)
1346 set_dirstack_element (ind
, 1, value
);
1357 l
= get_directory_stack (0);
1358 a
= array_from_word_list (l
);
1359 array_dispose (array_cell (self
));
1361 var_setarray (self
, a
);
1364 #endif /* PUSHD AND POPD && ARRAY_VARS */
1366 #if defined (ARRAY_VARS)
1367 /* We don't want to initialize the group set with a call to getgroups()
1368 unless we're asked to, but we only want to do it once. */
1376 static char **group_set
= (char **)NULL
;
1380 group_set
= get_group_list (&ng
);
1381 a
= array_cell (self
);
1382 for (i
= 0; i
< ng
; i
++)
1383 array_insert (a
, i
, group_set
[i
]);
1387 #endif /* ARRAY_VARS */
1389 /* If ARRAY_VARS is not defined, this just returns the name of any
1390 currently-executing function. If we have arrays, it's a call stack. */
1395 #if ! defined (ARRAY_VARS)
1397 if (variable_context
&& this_shell_function
)
1399 FREE (value_cell (self
));
1400 t
= savestring (this_shell_function
->name
);
1401 var_setvalue (self
, t
);
1408 make_funcname_visible (on_or_off
)
1413 v
= find_variable ("FUNCNAME");
1414 if (v
== 0 || v
->dynamic_value
== 0)
1418 VUNSETATTR (v
, att_invisible
);
1420 VSETATTR (v
, att_invisible
);
1424 init_funcname_var ()
1428 v
= find_variable ("FUNCNAME");
1431 #if defined (ARRAY_VARS)
1432 INIT_DYNAMIC_ARRAY_VAR ("FUNCNAME", get_funcname
, null_array_assign
);
1434 INIT_DYNAMIC_VAR ("FUNCNAME", (char *)NULL
, get_funcname
, null_assign
);
1436 VSETATTR (v
, att_invisible
|att_noassign
);
1441 initialize_dynamic_variables ()
1445 v
= init_seconds_var ();
1447 INIT_DYNAMIC_VAR ("BASH_COMMAND", (char *)NULL
, get_bash_command
, (sh_var_assign_func_t
*)NULL
);
1448 INIT_DYNAMIC_VAR ("BASH_SUBSHELL", (char *)NULL
, get_subshell
, assign_subshell
);
1450 INIT_DYNAMIC_VAR ("RANDOM", (char *)NULL
, get_random
, assign_random
);
1451 VSETATTR (v
, att_integer
);
1452 INIT_DYNAMIC_VAR ("LINENO", (char *)NULL
, get_lineno
, assign_lineno
);
1453 VSETATTR (v
, att_integer
);
1455 #if defined (HISTORY)
1456 INIT_DYNAMIC_VAR ("HISTCMD", (char *)NULL
, get_histcmd
, (sh_var_assign_func_t
*)NULL
);
1457 VSETATTR (v
, att_integer
);
1460 #if defined (READLINE)
1461 INIT_DYNAMIC_VAR ("COMP_WORDBREAKS", (char *)NULL
, get_comp_wordbreaks
, assign_comp_wordbreaks
);
1464 #if defined (PUSHD_AND_POPD) && defined (ARRAY_VARS)
1465 v
= init_dynamic_array_var ("DIRSTACK", get_dirstack
, assign_dirstack
, 0);
1466 #endif /* PUSHD_AND_POPD && ARRAY_VARS */
1468 #if defined (ARRAY_VARS)
1469 v
= init_dynamic_array_var ("GROUPS", get_groupset
, null_array_assign
, att_noassign
);
1471 # if defined (DEBUGGER)
1472 v
= init_dynamic_array_var ("BASH_ARGC", get_self
, null_array_assign
, att_noassign
|att_nounset
);
1473 v
= init_dynamic_array_var ("BASH_ARGV", get_self
, null_array_assign
, att_noassign
|att_nounset
);
1474 # endif /* DEBUGGER */
1475 v
= init_dynamic_array_var ("BASH_SOURCE", get_self
, null_array_assign
, att_noassign
|att_nounset
);
1476 v
= init_dynamic_array_var ("BASH_LINENO", get_self
, null_array_assign
, att_noassign
|att_nounset
);
1479 v
= init_funcname_var ();
1482 /* **************************************************************** */
1484 /* Retrieving variables and values */
1486 /* **************************************************************** */
1488 /* How to get a pointer to the shell variable or function named NAME.
1489 HASHED_VARS is a pointer to the hash table containing the list
1490 of interest (either variables or functions). */
1493 hash_lookup (name
, hashed_vars
)
1495 HASH_TABLE
*hashed_vars
;
1497 BUCKET_CONTENTS
*bucket
;
1499 bucket
= hash_search (name
, hashed_vars
, 0);
1500 return (bucket
? (SHELL_VAR
*)bucket
->data
: (SHELL_VAR
*)NULL
);
1504 var_lookup (name
, vcontext
)
1506 VAR_CONTEXT
*vcontext
;
1511 v
= (SHELL_VAR
*)NULL
;
1512 for (vc
= vcontext
; vc
; vc
= vc
->down
)
1513 if (v
= hash_lookup (name
, vc
->table
))
1519 /* Look up the variable entry named NAME. If SEARCH_TEMPENV is non-zero,
1520 then also search the temporarily built list of exported variables.
1521 The lookup order is:
1523 shell_variables list
1527 find_variable_internal (name
, force_tempenv
)
1534 var
= (SHELL_VAR
*)NULL
;
1536 /* If explicitly requested, first look in the temporary environment for
1537 the variable. This allows constructs such as "foo=x eval 'echo $foo'"
1538 to get the `exported' value of $foo. This happens if we are executing
1539 a function or builtin, or if we are looking up a variable in a
1540 "subshell environment". */
1541 search_tempenv
= force_tempenv
|| (expanding_redir
== 0 && subshell_environment
);
1543 if (search_tempenv
&& temporary_env
)
1544 var
= hash_lookup (name
, temporary_env
);
1547 var
= var_lookup (name
, shell_variables
);
1550 return ((SHELL_VAR
*)NULL
);
1552 return (var
->dynamic_value
? (*(var
->dynamic_value
)) (var
) : var
);
1555 /* Look up the variable entry named NAME. Returns the entry or NULL. */
1557 find_variable (name
)
1560 return (find_variable_internal (name
, (expanding_redir
== 0 && this_shell_builtin
!= 0)));
1563 /* Look up the function entry whose name matches STRING.
1564 Returns the entry or NULL. */
1566 find_function (name
)
1569 return (hash_lookup (name
, shell_functions
));
1572 /* Find the function definition for the shell function named NAME. Returns
1573 the entry or NULL. */
1575 find_function_def (name
)
1578 return ((FUNCTION_DEF
*)hash_lookup (name
, shell_function_defs
));
1581 /* Return the value of VAR. VAR is assumed to have been the result of a
1582 lookup without any subscript, if arrays are compiled into the shell. */
1584 get_variable_value (var
)
1588 return ((char *)NULL
);
1589 #if defined (ARRAY_VARS)
1590 else if (array_p (var
))
1591 return (array_reference (array_cell (var
), 0));
1594 return (value_cell (var
));
1597 /* Return the string value of a variable. Return NULL if the variable
1598 doesn't exist. Don't cons a new string. This is a potential memory
1599 leak if the variable is found in the temporary environment. Since
1600 functions and variables have separate name spaces, returns NULL if
1601 var_name is a shell function only. */
1603 get_string_value (var_name
)
1604 const char *var_name
;
1608 var
= find_variable (var_name
);
1609 return ((var
) ? get_variable_value (var
) : (char *)NULL
);
1612 /* This is present for use by the tilde and readline libraries. */
1614 sh_get_env_value (v
)
1617 return get_string_value (v
);
1620 /* **************************************************************** */
1622 /* Creating and setting variables */
1624 /* **************************************************************** */
1626 /* Set NAME to VALUE if NAME has no value. */
1628 set_if_not (name
, value
)
1633 if (shell_variables
== 0)
1634 create_variable_tables ();
1636 v
= find_variable (name
);
1638 v
= bind_variable_internal (name
, value
, global_variables
->table
, HASH_NOSRCH
, 0);
1642 /* Create a local variable referenced by NAME. */
1644 make_local_variable (name
)
1647 SHELL_VAR
*new_var
, *old_var
;
1652 /* local foo; local foo; is a no-op. */
1653 old_var
= find_variable (name
);
1654 if (old_var
&& local_p (old_var
) && old_var
->context
== variable_context
)
1656 VUNSETATTR (old_var
, att_invisible
);
1660 was_tmpvar
= old_var
&& tempvar_p (old_var
);
1662 tmp_value
= value_cell (old_var
);
1664 for (vc
= shell_variables
; vc
; vc
= vc
->down
)
1665 if (vc_isfuncenv (vc
) && vc
->scope
== variable_context
)
1670 internal_error (_("make_local_variable: no function context at current scope"));
1671 return ((SHELL_VAR
*)NULL
);
1673 else if (vc
->table
== 0)
1674 vc
->table
= hash_create (TEMPENV_HASH_BUCKETS
);
1676 /* Since this is called only from the local/declare/typeset code, we can
1677 call builtin_error here without worry (of course, it will also work
1678 for anything that sets this_command_name). Variables with the `noassign'
1679 attribute may not be made local. The test against old_var's context
1680 level is to disallow local copies of readonly global variables (since I
1681 believe that this could be a security hole). Readonly copies of calling
1682 function local variables are OK. */
1683 if (old_var
&& (noassign_p (old_var
) ||
1684 (readonly_p (old_var
) && old_var
->context
== 0)))
1686 if (readonly_p (old_var
))
1688 return ((SHELL_VAR
*)NULL
);
1692 new_var
= bind_variable_internal (name
, "", vc
->table
, HASH_NOSRCH
, 0);
1695 new_var
= make_new_variable (name
, vc
->table
);
1697 /* If we found this variable in one of the temporary environments,
1698 inherit its value. Watch to see if this causes problems with
1699 things like `x=4 local x'. */
1701 var_setvalue (new_var
, savestring (tmp_value
));
1703 new_var
->attributes
= exported_p (old_var
) ? att_exported
: 0;
1706 vc
->flags
|= VC_HASLOCAL
;
1708 new_var
->context
= variable_context
;
1709 VSETATTR (new_var
, att_local
);
1717 #if defined (ARRAY_VARS)
1719 make_local_array_variable (name
)
1725 var
= make_local_variable (name
);
1726 if (var
== 0 || array_p (var
))
1729 array
= array_create ();
1731 FREE (value_cell(var
));
1732 var_setarray (var
, array
);
1733 VSETATTR (var
, att_array
);
1736 #endif /* ARRAY_VARS */
1738 /* Create a new shell variable with name NAME. */
1740 new_shell_variable (name
)
1745 entry
= (SHELL_VAR
*)xmalloc (sizeof (SHELL_VAR
));
1747 entry
->name
= savestring (name
);
1748 var_setvalue (entry
, (char *)NULL
);
1749 CLEAR_EXPORTSTR (entry
);
1751 entry
->dynamic_value
= (sh_var_value_func_t
*)NULL
;
1752 entry
->assign_func
= (sh_var_assign_func_t
*)NULL
;
1754 entry
->attributes
= 0;
1756 /* Always assume variables are to be made at toplevel!
1757 make_local_variable has the responsibilty of changing the
1758 variable context. */
1764 /* Create a new shell variable with name NAME and add it to the hash table
1767 make_new_variable (name
, table
)
1772 BUCKET_CONTENTS
*elt
;
1774 entry
= new_shell_variable (name
);
1776 /* Make sure we have a shell_variables hash table to add to. */
1777 if (shell_variables
== 0)
1778 create_variable_tables ();
1780 elt
= hash_insert (savestring (name
), table
, HASH_NOSRCH
);
1781 elt
->data
= (PTR_T
)entry
;
1786 #if defined (ARRAY_VARS)
1788 make_new_array_variable (name
)
1794 entry
= make_new_variable (name
, global_variables
->table
);
1795 array
= array_create ();
1796 var_setarray (entry
, array
);
1797 VSETATTR (entry
, att_array
);
1803 make_variable_value (var
, value
, flags
)
1808 char *retval
, *oval
;
1809 intmax_t lval
, rval
;
1812 /* If this variable has had its type set to integer (via `declare -i'),
1813 then do expression evaluation on it and store the result. The
1814 functions in expr.c (evalexp()) and bind_int_variable() are responsible
1815 for turning off the integer flag if they don't want further
1817 if (integer_p (var
))
1819 if (flags
& ASS_APPEND
)
1821 oval
= value_cell (var
);
1822 lval
= evalexp (oval
, &expok
); /* ksh93 seems to do this */
1825 top_level_cleanup ();
1826 jump_to_top_level (DISCARD
);
1829 rval
= evalexp (value
, &expok
);
1832 top_level_cleanup ();
1833 jump_to_top_level (DISCARD
);
1835 if (flags
& ASS_APPEND
)
1837 retval
= itos (rval
);
1841 if (flags
& ASS_APPEND
)
1843 oval
= get_variable_value (var
);
1844 if (oval
== 0) /* paranoia */
1846 olen
= STRLEN (oval
);
1847 retval
= (char *)xmalloc (olen
+ (value
? STRLEN (value
) : 0) + 1);
1848 strcpy (retval
, oval
);
1850 strcpy (retval
+olen
, value
);
1853 retval
= savestring (value
);
1856 retval
= (char *)xmalloc (1);
1861 retval
= (char *)NULL
;
1866 /* Bind a variable NAME to VALUE in the HASH_TABLE TABLE, which may be the
1867 temporary environment (but usually is not). */
1869 bind_variable_internal (name
, value
, table
, hflags
, aflags
)
1878 entry
= (hflags
& HASH_NOSRCH
) ? (SHELL_VAR
*)NULL
: hash_lookup (name
, table
);
1882 entry
= make_new_variable (name
, table
);
1883 var_setvalue (entry
, make_variable_value (entry
, value
, 0)); /* XXX */
1885 else if (entry
->assign_func
) /* array vars have assign functions now */
1887 INVALIDATE_EXPORTSTR (entry
);
1888 newval
= (aflags
& ASS_APPEND
) ? make_variable_value (entry
, value
, aflags
) : value
;
1889 entry
= (*(entry
->assign_func
)) (entry
, newval
, -1);
1890 if (newval
!= value
)
1896 if (readonly_p (entry
) || noassign_p (entry
))
1898 if (readonly_p (entry
))
1899 err_readonly (name
);
1903 /* Variables which are bound are visible. */
1904 VUNSETATTR (entry
, att_invisible
);
1906 newval
= make_variable_value (entry
, value
, aflags
); /* XXX */
1908 /* Invalidate any cached export string */
1909 INVALIDATE_EXPORTSTR (entry
);
1911 #if defined (ARRAY_VARS)
1912 /* XXX -- this bears looking at again -- XXX */
1913 /* If an existing array variable x is being assigned to with x=b or
1914 `read x' or something of that nature, silently convert it to
1915 x[0]=b or `read x[0]'. */
1916 if (array_p (entry
))
1918 array_insert (array_cell (entry
), 0, newval
);
1924 FREE (value_cell (entry
));
1925 var_setvalue (entry
, newval
);
1929 if (mark_modified_vars
)
1930 VSETATTR (entry
, att_exported
);
1932 if (exported_p (entry
))
1933 array_needs_making
= 1;
1938 /* Bind a variable NAME to VALUE. This conses up the name
1939 and value strings. If we have a temporary environment, we bind there
1940 first, then we bind into shell_variables. */
1943 bind_variable (name
, value
, flags
)
1951 if (shell_variables
== 0)
1952 create_variable_tables ();
1954 /* If we have a temporary environment, look there first for the variable,
1955 and, if found, modify the value there before modifying it in the
1956 shell_variables table. This allows sourced scripts to modify values
1957 given to them in a temporary environment while modifying the variable
1958 value that the caller sees. */
1960 bind_tempenv_variable (name
, value
);
1962 /* XXX -- handle local variables here. */
1963 for (vc
= shell_variables
; vc
; vc
= vc
->down
)
1965 if (vc_isfuncenv (vc
) || vc_isbltnenv (vc
))
1967 v
= hash_lookup (name
, vc
->table
);
1969 return (bind_variable_internal (name
, value
, vc
->table
, 0, flags
));
1972 return (bind_variable_internal (name
, value
, global_variables
->table
, 0, flags
));
1975 /* Make VAR, a simple shell variable, have value VALUE. Once assigned a
1976 value, variables are no longer invisible. This is a duplicate of part
1977 of the internals of bind_variable. If the variable is exported, or
1978 all modified variables should be exported, mark the variable for export
1979 and note that the export environment needs to be recreated. */
1981 bind_variable_value (var
, value
, aflags
)
1988 VUNSETATTR (var
, att_invisible
);
1990 if (var
->assign_func
)
1992 /* If we're appending, we need the old value, so use
1993 make_variable_value */
1994 t
= (aflags
& ASS_APPEND
) ? make_variable_value (var
, value
, aflags
) : value
;
1995 (*(var
->assign_func
)) (var
, t
, -1);
1996 if (t
!= value
&& t
)
2001 t
= make_variable_value (var
, value
, aflags
);
2002 FREE (value_cell (var
));
2003 var_setvalue (var
, t
);
2006 INVALIDATE_EXPORTSTR (var
);
2008 if (mark_modified_vars
)
2009 VSETATTR (var
, att_exported
);
2011 if (exported_p (var
))
2012 array_needs_making
= 1;
2017 /* Bind/create a shell variable with the name LHS to the RHS.
2018 This creates or modifies a variable such that it is an integer.
2020 This used to be in expr.c, but it is here so that all of the
2021 variable binding stuff is localized. Since we don't want any
2022 recursive evaluation from bind_variable() (possible without this code,
2023 since bind_variable() calls the evaluator for variables with the integer
2024 attribute set), we temporarily turn off the integer attribute for each
2025 variable we set here, then turn it back on after binding as necessary. */
2028 bind_int_variable (lhs
, rhs
)
2031 register SHELL_VAR
*v
;
2035 #if defined (ARRAY_VARS)
2036 if (valid_array_reference (lhs
))
2039 v
= array_variable_part (lhs
, (char **)0, (int *)0);
2043 v
= find_variable (lhs
);
2047 isint
= integer_p (v
);
2048 VUNSETATTR (v
, att_integer
);
2051 #if defined (ARRAY_VARS)
2053 v
= assign_array_element (lhs
, rhs
, 0);
2056 v
= bind_variable (lhs
, rhs
, 0);
2059 VSETATTR (v
, att_integer
);
2065 bind_var_to_int (var
, val
)
2069 char ibuf
[INT_STRLEN_BOUND (intmax_t) + 1], *p
;
2071 p
= fmtulong (val
, 10, ibuf
, sizeof (ibuf
), 0);
2072 return (bind_int_variable (var
, p
));
2075 /* Do a function binding to a variable. You pass the name and
2076 the command to bind to. This conses the name and command. */
2078 bind_function (name
, value
)
2084 entry
= find_function (name
);
2087 BUCKET_CONTENTS
*elt
;
2089 elt
= hash_insert (savestring (name
), shell_functions
, HASH_NOSRCH
);
2090 entry
= new_shell_variable (name
);
2091 elt
->data
= (PTR_T
)entry
;
2094 INVALIDATE_EXPORTSTR (entry
);
2096 if (var_isset (entry
))
2097 dispose_command (function_cell (entry
));
2100 var_setfunc (entry
, copy_command (value
));
2102 var_setfunc (entry
, 0);
2104 VSETATTR (entry
, att_function
);
2106 if (mark_modified_vars
)
2107 VSETATTR (entry
, att_exported
);
2109 VUNSETATTR (entry
, att_invisible
); /* Just to be sure */
2111 if (exported_p (entry
))
2112 array_needs_making
= 1;
2114 #if defined (PROGRAMMABLE_COMPLETION)
2115 set_itemlist_dirty (&it_functions
);
2121 /* Bind a function definition, which includes source file and line number
2122 information in addition to the command, into the FUNCTION_DEF hash table.*/
2124 bind_function_def (name
, value
)
2126 FUNCTION_DEF
*value
;
2128 FUNCTION_DEF
*entry
;
2129 BUCKET_CONTENTS
*elt
;
2132 entry
= find_function_def (name
);
2135 dispose_function_def_contents (entry
);
2136 entry
= copy_function_def_contents (value
, entry
);
2140 cmd
= value
->command
;
2142 entry
= copy_function_def (value
);
2143 value
->command
= cmd
;
2145 elt
= hash_insert (savestring (name
), shell_function_defs
, HASH_NOSRCH
);
2146 elt
->data
= (PTR_T
*)entry
;
2150 /* Add STRING, which is of the form foo=bar, to the temporary environment
2151 HASH_TABLE (temporary_env). The functions in execute_cmd.c are
2152 responsible for moving the main temporary env to one of the other
2153 temporary environments. The expansion code in subst.c calls this. */
2155 assign_in_env (word
)
2159 char *name
, *temp
, *value
;
2163 string
= word
->word
;
2165 offset
= assignment (string
, 0);
2166 name
= savestring (string
);
2167 value
= (char *)NULL
;
2169 if (name
[offset
] == '=')
2173 /* ignore the `+' when assigning temporary environment */
2174 if (name
[offset
- 1] == '+')
2175 name
[offset
- 1] = '\0';
2177 var
= find_variable (name
);
2178 if (var
&& (readonly_p (var
) || noassign_p (var
)))
2180 if (readonly_p (var
))
2181 err_readonly (name
);
2186 temp
= name
+ offset
+ 1;
2188 temp
= (xstrchr (temp
, '~') != 0) ? bash_tilde_expand (temp
, 1) : savestring (temp
);
2189 value
= expand_string_unsplit_to_string (temp
, 0);
2192 value
= expand_assignment_string_to_string (temp
, 0);
2196 if (temporary_env
== 0)
2197 temporary_env
= hash_create (TEMPENV_HASH_BUCKETS
);
2199 var
= hash_lookup (name
, temporary_env
);
2201 var
= make_new_variable (name
, temporary_env
);
2203 FREE (value_cell (var
));
2207 value
= (char *)xmalloc (1); /* like do_assignment_internal */
2211 var_setvalue (var
, value
);
2212 var
->attributes
|= (att_exported
|att_tempvar
);
2213 var
->context
= variable_context
; /* XXX */
2215 INVALIDATE_EXPORTSTR (var
);
2216 var
->exportstr
= mk_env_string (name
, value
);
2218 array_needs_making
= 1;
2223 if (echo_command_at_execute
)
2224 /* The Korn shell prints the `+ ' in front of assignment statements,
2226 xtrace_print_assignment (name
, value
, 0, 1);
2232 /* **************************************************************** */
2234 /* Copying variables */
2236 /* **************************************************************** */
2238 #ifdef INCLUDE_UNUSED
2239 /* Copy VAR to a new data structure and return that structure. */
2244 SHELL_VAR
*copy
= (SHELL_VAR
*)NULL
;
2248 copy
= (SHELL_VAR
*)xmalloc (sizeof (SHELL_VAR
));
2250 copy
->attributes
= var
->attributes
;
2251 copy
->name
= savestring (var
->name
);
2253 if (function_p (var
))
2254 var_setfunc (copy
, copy_command (function_cell (var
)));
2255 #if defined (ARRAY_VARS)
2256 else if (array_p (var
))
2257 var_setarray (copy
, dup_array (array_cell (var
)));
2259 else if (value_cell (var
))
2260 var_setvalue (copy
, savestring (value_cell (var
)));
2262 var_setvalue (copy
, (char *)NULL
);
2264 copy
->dynamic_value
= var
->dynamic_value
;
2265 copy
->assign_func
= var
->assign_func
;
2267 copy
->exportstr
= COPY_EXPORTSTR (var
);
2269 copy
->context
= var
->context
;
2275 /* **************************************************************** */
2277 /* Deleting and unsetting variables */
2279 /* **************************************************************** */
2281 /* Dispose of the information attached to VAR. */
2283 dispose_variable (var
)
2289 if (function_p (var
))
2290 dispose_command (function_cell (var
));
2291 #if defined (ARRAY_VARS)
2292 else if (array_p (var
))
2293 array_dispose (array_cell (var
));
2296 FREE (value_cell (var
));
2298 FREE_EXPORTSTR (var
);
2302 if (exported_p (var
))
2303 array_needs_making
= 1;
2308 /* Unset the shell variable referenced by NAME. */
2310 unbind_variable (name
)
2313 return makunbound (name
, shell_variables
);
2316 /* Unset the shell function named NAME. */
2321 BUCKET_CONTENTS
*elt
;
2324 elt
= hash_remove (name
, shell_functions
, 0);
2329 #if defined (PROGRAMMABLE_COMPLETION)
2330 set_itemlist_dirty (&it_functions
);
2333 func
= (SHELL_VAR
*)elt
->data
;
2336 if (exported_p (func
))
2337 array_needs_making
++;
2338 dispose_variable (func
);
2348 unbind_function_def (name
)
2351 BUCKET_CONTENTS
*elt
;
2352 FUNCTION_DEF
*funcdef
;
2354 elt
= hash_remove (name
, shell_function_defs
, 0);
2359 funcdef
= (FUNCTION_DEF
*)elt
->data
;
2361 dispose_function_def (funcdef
);
2369 /* Make the variable associated with NAME go away. HASH_LIST is the
2370 hash table from which this variable should be deleted (either
2371 shell_variables or shell_functions).
2372 Returns non-zero if the variable couldn't be found. */
2374 makunbound (name
, vc
)
2378 BUCKET_CONTENTS
*elt
, *new_elt
;
2383 for (elt
= (BUCKET_CONTENTS
*)NULL
, v
= vc
; v
; v
= v
->down
)
2384 if (elt
= hash_remove (name
, v
->table
, 0))
2390 old_var
= (SHELL_VAR
*)elt
->data
;
2392 if (old_var
&& exported_p (old_var
))
2393 array_needs_making
++;
2395 /* If we're unsetting a local variable and we're still executing inside
2396 the function, just mark the variable as invisible. The function
2397 eventually called by pop_var_context() will clean it up later. This
2398 must be done so that if the variable is subsequently assigned a new
2399 value inside the function, the `local' attribute is still present.
2400 We also need to add it back into the correct hash table. */
2401 if (old_var
&& local_p (old_var
) && variable_context
== old_var
->context
)
2403 #if defined (ARRAY_VARS)
2404 if (array_p (old_var
))
2405 array_dispose (array_cell (old_var
));
2408 FREE (value_cell (old_var
));
2409 /* Reset the attributes. Preserve the export attribute if the variable
2410 came from a temporary environment. Make sure it stays local, and
2411 make it invisible. */
2412 old_var
->attributes
= (exported_p (old_var
) && tempvar_p (old_var
)) ? att_exported
: 0;
2413 VSETATTR (old_var
, att_local
);
2414 VSETATTR (old_var
, att_invisible
);
2415 var_setvalue (old_var
, (char *)NULL
);
2416 INVALIDATE_EXPORTSTR (old_var
);
2418 new_elt
= hash_insert (savestring (old_var
->name
), v
->table
, 0);
2419 new_elt
->data
= (PTR_T
)old_var
;
2420 stupidly_hack_special_variables (old_var
->name
);
2427 /* Have to save a copy of name here, because it might refer to
2428 old_var->name. If so, stupidly_hack_special_variables will
2429 reference freed memory. */
2430 t
= savestring (name
);
2435 dispose_variable (old_var
);
2436 stupidly_hack_special_variables (t
);
2442 /* Get rid of all of the variables in the current context. */
2444 kill_all_local_variables ()
2448 for (vc
= shell_variables
; vc
; vc
= vc
->down
)
2449 if (vc_isfuncenv (vc
) && vc
->scope
== variable_context
)
2454 if (vc
->table
&& vc_haslocals (vc
))
2456 delete_all_variables (vc
->table
);
2457 hash_dispose (vc
->table
);
2459 vc
->table
= (HASH_TABLE
*)NULL
;
2463 free_variable_hash_data (data
)
2468 var
= (SHELL_VAR
*)data
;
2469 dispose_variable (var
);
2472 /* Delete the entire contents of the hash table. */
2474 delete_all_variables (hashed_vars
)
2475 HASH_TABLE
*hashed_vars
;
2477 hash_flush (hashed_vars
, free_variable_hash_data
);
2480 /* **************************************************************** */
2482 /* Setting variable attributes */
2484 /* **************************************************************** */
2486 #define FIND_OR_MAKE_VARIABLE(name, entry) \
2489 entry = find_variable (name); \
2492 entry = bind_variable (name, "", 0); \
2493 if (!no_invisible_vars) entry->attributes |= att_invisible; \
2498 /* Make the variable associated with NAME be readonly.
2499 If NAME does not exist yet, create it. */
2501 set_var_read_only (name
)
2506 FIND_OR_MAKE_VARIABLE (name
, entry
);
2507 VSETATTR (entry
, att_readonly
);
2510 #ifdef INCLUDE_UNUSED
2511 /* Make the function associated with NAME be readonly.
2512 If NAME does not exist, we just punt, like auto_export code below. */
2514 set_func_read_only (name
)
2519 entry
= find_function (name
);
2521 VSETATTR (entry
, att_readonly
);
2524 /* Make the variable associated with NAME be auto-exported.
2525 If NAME does not exist yet, create it. */
2527 set_var_auto_export (name
)
2532 FIND_OR_MAKE_VARIABLE (name
, entry
);
2533 set_auto_export (entry
);
2536 /* Make the function associated with NAME be auto-exported. */
2538 set_func_auto_export (name
)
2543 entry
= find_function (name
);
2545 set_auto_export (entry
);
2549 /* **************************************************************** */
2551 /* Creating lists of variables */
2553 /* **************************************************************** */
2556 vlist_alloc (nentries
)
2561 vlist
= (VARLIST
*)xmalloc (sizeof (VARLIST
));
2562 vlist
->list
= (SHELL_VAR
**)xmalloc ((nentries
+ 1) * sizeof (SHELL_VAR
*));
2563 vlist
->list_size
= nentries
;
2564 vlist
->list_len
= 0;
2565 vlist
->list
[0] = (SHELL_VAR
*)NULL
;
2571 vlist_realloc (vlist
, n
)
2576 return (vlist
= vlist_alloc (n
));
2577 if (n
> vlist
->list_size
)
2579 vlist
->list_size
= n
;
2580 vlist
->list
= (SHELL_VAR
**)xrealloc (vlist
->list
, (vlist
->list_size
+ 1) * sizeof (SHELL_VAR
*));
2586 vlist_add (vlist
, var
, flags
)
2593 for (i
= 0; i
< vlist
->list_len
; i
++)
2594 if (STREQ (var
->name
, vlist
->list
[i
]->name
))
2596 if (i
< vlist
->list_len
)
2599 if (i
>= vlist
->list_size
)
2600 vlist
= vlist_realloc (vlist
, vlist
->list_size
+ 16);
2602 vlist
->list
[vlist
->list_len
++] = var
;
2603 vlist
->list
[vlist
->list_len
] = (SHELL_VAR
*)NULL
;
2606 /* Map FUNCTION over the variables in VAR_HASH_TABLE. Return an array of the
2607 variables for which FUNCTION returns a non-zero value. A NULL value
2608 for FUNCTION means to use all variables. */
2610 map_over (function
, vc
)
2611 sh_var_map_func_t
*function
;
2619 for (nentries
= 0, v
= vc
; v
; v
= v
->down
)
2620 nentries
+= HASH_ENTRIES (v
->table
);
2623 return (SHELL_VAR
**)NULL
;
2625 vlist
= vlist_alloc (nentries
);
2627 for (v
= vc
; v
; v
= v
->down
)
2628 flatten (v
->table
, function
, vlist
, 0);
2636 map_over_funcs (function
)
2637 sh_var_map_func_t
*function
;
2642 if (shell_functions
== 0 || HASH_ENTRIES (shell_functions
) == 0)
2643 return ((SHELL_VAR
**)NULL
);
2645 vlist
= vlist_alloc (HASH_ENTRIES (shell_functions
));
2647 flatten (shell_functions
, function
, vlist
, 0);
2654 /* Flatten VAR_HASH_TABLE, applying FUNC to each member and adding those
2655 elements for which FUNC succeeds to VLIST->list. FLAGS is reserved
2656 for future use. Only unique names are added to VLIST. If FUNC is
2657 NULL, each variable in VAR_HASH_TABLE is added to VLIST. If VLIST is
2658 NULL, FUNC is applied to each SHELL_VAR in VAR_HASH_TABLE. If VLIST
2659 and FUNC are both NULL, nothing happens. */
2661 flatten (var_hash_table
, func
, vlist
, flags
)
2662 HASH_TABLE
*var_hash_table
;
2663 sh_var_map_func_t
*func
;
2668 register BUCKET_CONTENTS
*tlist
;
2672 if (var_hash_table
== 0 || (HASH_ENTRIES (var_hash_table
) == 0) || (vlist
== 0 && func
== 0))
2675 for (i
= 0; i
< var_hash_table
->nbuckets
; i
++)
2677 for (tlist
= hash_items (i
, var_hash_table
); tlist
; tlist
= tlist
->next
)
2679 var
= (SHELL_VAR
*)tlist
->data
;
2681 r
= func
? (*func
) (var
) : 1;
2683 vlist_add (vlist
, var
, flags
);
2689 sort_variables (array
)
2692 qsort (array
, strvec_len ((char **)array
), sizeof (SHELL_VAR
*), (QSFUNC
*)qsort_var_comp
);
2696 qsort_var_comp (var1
, var2
)
2697 SHELL_VAR
**var1
, **var2
;
2701 if ((result
= (*var1
)->name
[0] - (*var2
)->name
[0]) == 0)
2702 result
= strcmp ((*var1
)->name
, (*var2
)->name
);
2707 /* Apply FUNC to each variable in SHELL_VARIABLES, adding each one for
2708 which FUNC succeeds to an array of SHELL_VAR *s. Returns the array. */
2711 sh_var_map_func_t
*func
;
2715 list
= map_over (func
, shell_variables
);
2716 if (list
/* && posixly_correct */)
2717 sort_variables (list
);
2721 /* Apply FUNC to each variable in SHELL_FUNCTIONS, adding each one for
2722 which FUNC succeeds to an array of SHELL_VAR *s. Returns the array. */
2725 sh_var_map_func_t
*func
;
2729 list
= map_over_funcs (func
);
2730 if (list
/* && posixly_correct */)
2731 sort_variables (list
);
2735 /* Create a NULL terminated array of all the shell variables. */
2737 all_shell_variables ()
2739 return (vapply ((sh_var_map_func_t
*)NULL
));
2742 /* Create a NULL terminated array of all the shell functions. */
2744 all_shell_functions ()
2746 return (fapply ((sh_var_map_func_t
*)NULL
));
2753 return (invisible_p (var
) == 0);
2757 all_visible_functions ()
2759 return (fapply (visible_var
));
2763 all_visible_variables ()
2765 return (vapply (visible_var
));
2768 /* Return non-zero if the variable VAR is visible and exported. Array
2769 variables cannot be exported. */
2771 visible_and_exported (var
)
2774 return (invisible_p (var
) == 0 && exported_p (var
));
2777 /* Return non-zero if VAR is a local variable in the current context and
2780 local_and_exported (var
)
2783 return (invisible_p (var
) == 0 && local_p (var
) && var
->context
== variable_context
&& exported_p (var
));
2787 all_exported_variables ()
2789 return (vapply (visible_and_exported
));
2793 local_exported_variables ()
2795 return (vapply (local_and_exported
));
2799 variable_in_context (var
)
2802 return (invisible_p (var
) == 0 && local_p (var
) && var
->context
== variable_context
);
2806 all_local_variables ()
2812 vc
= shell_variables
;
2813 for (vc
= shell_variables
; vc
; vc
= vc
->down
)
2814 if (vc_isfuncenv (vc
) && vc
->scope
== variable_context
)
2819 internal_error (_("all_local_variables: no function context at current scope"));
2820 return (SHELL_VAR
**)NULL
;
2822 if (vc
->table
== 0 || HASH_ENTRIES (vc
->table
) == 0 || vc_haslocals (vc
) == 0)
2823 return (SHELL_VAR
**)NULL
;
2825 vlist
= vlist_alloc (HASH_ENTRIES (vc
->table
));
2827 flatten (vc
->table
, variable_in_context
, vlist
, 0);
2832 sort_variables (ret
);
2836 #if defined (ARRAY_VARS)
2837 /* Return non-zero if the variable VAR is visible and an array. */
2839 visible_array_vars (var
)
2842 return (invisible_p (var
) == 0 && array_p (var
));
2846 all_array_variables ()
2848 return (vapply (visible_array_vars
));
2850 #endif /* ARRAY_VARS */
2853 all_variables_matching_prefix (prefix
)
2856 SHELL_VAR
**varlist
;
2858 int vind
, rind
, plen
;
2860 plen
= STRLEN (prefix
);
2861 varlist
= all_visible_variables ();
2862 for (vind
= 0; varlist
&& varlist
[vind
]; vind
++)
2864 if (varlist
== 0 || vind
== 0)
2865 return ((char **)NULL
);
2866 rlist
= strvec_create (vind
+ 1);
2867 for (vind
= rind
= 0; varlist
[vind
]; vind
++)
2869 if (plen
== 0 || STREQN (prefix
, varlist
[vind
]->name
, plen
))
2870 rlist
[rind
++] = savestring (varlist
[vind
]->name
);
2872 rlist
[rind
] = (char *)0;
2878 /* **************************************************************** */
2880 /* Managing temporary variable scopes */
2882 /* **************************************************************** */
2884 /* Make variable NAME have VALUE in the temporary environment. */
2886 bind_tempenv_variable (name
, value
)
2892 var
= temporary_env
? hash_lookup (name
, temporary_env
) : (SHELL_VAR
*)NULL
;
2896 FREE (value_cell (var
));
2897 var_setvalue (var
, savestring (value
));
2898 INVALIDATE_EXPORTSTR (var
);
2904 /* Find a variable in the temporary environment that is named NAME.
2905 Return the SHELL_VAR *, or NULL if not found. */
2907 find_tempenv_variable (name
)
2910 return (temporary_env
? hash_lookup (name
, temporary_env
) : (SHELL_VAR
*)NULL
);
2913 /* Push the variable described by (SHELL_VAR *)DATA down to the next
2914 variable context from the temporary environment. */
2916 push_temp_var (data
)
2920 HASH_TABLE
*binding_table
;
2922 var
= (SHELL_VAR
*)data
;
2924 binding_table
= shell_variables
->table
;
2925 if (binding_table
== 0)
2927 if (shell_variables
== global_variables
)
2928 /* shouldn't happen */
2929 binding_table
= shell_variables
->table
= global_variables
->table
= hash_create (0);
2931 binding_table
= shell_variables
->table
= hash_create (TEMPENV_HASH_BUCKETS
);
2934 v
= bind_variable_internal (var
->name
, value_cell (var
), binding_table
, 0, 0);
2936 /* XXX - should we set the context here? It shouldn't matter because of how
2937 assign_in_env works, but might want to check. */
2938 if (binding_table
== global_variables
->table
) /* XXX */
2939 var
->attributes
&= ~(att_tempvar
|att_propagate
);
2942 var
->attributes
|= att_propagate
;
2943 if (binding_table
== shell_variables
->table
)
2944 shell_variables
->flags
|= VC_HASTMPVAR
;
2946 v
->attributes
|= var
->attributes
;
2948 dispose_variable (var
);
2952 propagate_temp_var (data
)
2957 var
= (SHELL_VAR
*)data
;
2958 if (tempvar_p (var
) && (var
->attributes
& att_propagate
))
2959 push_temp_var (data
);
2961 dispose_variable (var
);
2964 /* Free the storage used in the hash table for temporary
2965 environment variables. PUSHF is a function to be called
2966 to free each hash table entry. It takes care of pushing variables
2967 to previous scopes if appropriate. */
2969 dispose_temporary_env (pushf
)
2970 sh_free_func_t
*pushf
;
2972 hash_flush (temporary_env
, pushf
);
2973 hash_dispose (temporary_env
);
2974 temporary_env
= (HASH_TABLE
*)NULL
;
2976 array_needs_making
= 1;
2978 sv_ifs ("IFS"); /* XXX here for now */
2982 dispose_used_env_vars ()
2986 dispose_temporary_env (propagate_temp_var
);
2987 maybe_make_export_env ();
2991 /* Take all of the shell variables in the temporary environment HASH_TABLE
2992 and make shell variables from them at the current variable context. */
2994 merge_temporary_env ()
2997 dispose_temporary_env (push_temp_var
);
3000 /* **************************************************************** */
3002 /* Creating and manipulating the environment */
3004 /* **************************************************************** */
3006 static inline char *
3007 mk_env_string (name
, value
)
3008 const char *name
, *value
;
3010 int name_len
, value_len
;
3013 name_len
= strlen (name
);
3014 value_len
= STRLEN (value
);
3015 p
= (char *)xmalloc (2 + name_len
+ value_len
);
3018 if (value
&& *value
)
3019 strcpy (p
+ name_len
+ 1, value
);
3021 p
[name_len
+ 1] = '\0';
3034 if (legal_variable_starter ((unsigned char)*s
) == 0)
3036 internal_error (_("invalid character %d in exportstr for %s"), *s
, v
->name
);
3039 for (s
= v
->exportstr
+ 1; s
&& *s
; s
++)
3043 if (legal_variable_char ((unsigned char)*s
) == 0)
3045 internal_error (_("invalid character %d in exportstr for %s"), *s
, v
->name
);
3051 internal_error (_("no `=' in exportstr for %s"), v
->name
);
3059 make_env_array_from_var_list (vars
)
3062 register int i
, list_index
;
3063 register SHELL_VAR
*var
;
3064 char **list
, *value
;
3066 list
= strvec_create ((1 + strvec_len ((char **)vars
)));
3068 #define USE_EXPORTSTR (value == var->exportstr)
3070 for (i
= 0, list_index
= 0; var
= vars
[i
]; i
++)
3072 #if defined (__CYGWIN__)
3073 /* We don't use the exportstr stuff on Cygwin at all. */
3074 INVALIDATE_EXPORTSTR (var
);
3077 value
= var
->exportstr
;
3078 else if (function_p (var
))
3079 value
= named_function_string ((char *)NULL
, function_cell (var
), 0);
3080 #if defined (ARRAY_VARS)
3081 else if (array_p (var
))
3083 value
= array_to_assignment_string (array_cell (var
));
3085 continue; /* XXX array vars cannot yet be exported */
3089 value
= value_cell (var
);
3093 /* Gee, I'd like to get away with not using savestring() if we're
3094 using the cached exportstr... */
3095 list
[list_index
] = USE_EXPORTSTR
? savestring (value
)
3096 : mk_env_string (var
->name
, value
);
3098 if (USE_EXPORTSTR
== 0)
3099 SAVE_EXPORTSTR (var
, list
[list_index
]);
3102 #undef USE_EXPORTSTR
3105 #if defined (ARRAY_VARS)
3113 list
[list_index
] = (char *)NULL
;
3117 /* Make an array of assignment statements from the hash table
3118 HASHED_VARS which contains SHELL_VARs. Only visible, exported
3119 variables are eligible. */
3121 make_var_export_array (vcxt
)
3127 vars
= map_over (visible_and_exported
, vcxt
);
3130 return (char **)NULL
;
3132 list
= make_env_array_from_var_list (vars
);
3139 make_func_export_array ()
3144 vars
= map_over_funcs (visible_and_exported
);
3146 return (char **)NULL
;
3148 list
= make_env_array_from_var_list (vars
);
3154 /* Add ENVSTR to the end of the exported environment, EXPORT_ENV. */
3155 #define add_to_export_env(envstr,do_alloc) \
3158 if (export_env_index >= (export_env_size - 1)) \
3160 export_env_size += 16; \
3161 export_env = strvec_resize (export_env, export_env_size); \
3162 environ = export_env; \
3164 export_env[export_env_index++] = (do_alloc) ? savestring (envstr) : envstr; \
3165 export_env[export_env_index] = (char *)NULL; \
3168 /* Add ASSIGN to EXPORT_ENV, or supercede a previous assignment in the
3169 array with the same left-hand side. Return the new EXPORT_ENV. */
3171 add_or_supercede_exported_var (assign
, do_alloc
)
3178 equal_offset
= assignment (assign
, 0);
3179 if (equal_offset
== 0)
3180 return (export_env
);
3182 /* If this is a function, then only supersede the function definition.
3183 We do this by including the `=() {' in the comparison, like
3184 initialize_shell_variables does. */
3185 if (assign
[equal_offset
+ 1] == '(' &&
3186 strncmp (assign
+ equal_offset
+ 2, ") {", 3) == 0) /* } */
3189 for (i
= 0; i
< export_env_index
; i
++)
3191 if (STREQN (assign
, export_env
[i
], equal_offset
+ 1))
3193 free (export_env
[i
]);
3194 export_env
[i
] = do_alloc
? savestring (assign
) : assign
;
3195 return (export_env
);
3198 add_to_export_env (assign
, do_alloc
);
3199 return (export_env
);
3203 add_temp_array_to_env (temp_array
, do_alloc
, do_supercede
)
3205 int do_alloc
, do_supercede
;
3209 if (temp_array
== 0)
3212 for (i
= 0; temp_array
[i
]; i
++)
3215 export_env
= add_or_supercede_exported_var (temp_array
[i
], do_alloc
);
3217 add_to_export_env (temp_array
[i
], do_alloc
);
3223 /* Make the environment array for the command about to be executed, if the
3224 array needs making. Otherwise, do nothing. If a shell action could
3225 change the array that commands receive for their environment, then the
3226 code should `array_needs_making++'.
3228 The order to add to the array is:
3230 list of var contexts whose head is shell_variables
3233 This is the shell variable lookup order. We add only new variable
3234 names at each step, which allows local variables and variables in
3235 the temporary environments to shadow variables in the global (or
3236 any previous) scope.
3240 n_shell_variables ()
3245 for (n
= 0, vc
= shell_variables
; vc
; vc
= vc
->down
)
3246 n
+= HASH_ENTRIES (vc
->table
);
3251 maybe_make_export_env ()
3253 register char **temp_array
;
3257 if (array_needs_making
)
3260 strvec_flush (export_env
);
3262 /* Make a guess based on how many shell variables and functions we
3263 have. Since there will always be array variables, and array
3264 variables are not (yet) exported, this will always be big enough
3265 for the exported variables and functions. */
3266 new_size
= n_shell_variables () + HASH_ENTRIES (shell_functions
) + 1 +
3267 HASH_ENTRIES (temporary_env
);
3268 if (new_size
> export_env_size
)
3270 export_env_size
= new_size
;
3271 export_env
= strvec_resize (export_env
, export_env_size
);
3272 environ
= export_env
;
3274 export_env
[export_env_index
= 0] = (char *)NULL
;
3276 /* Make a dummy variable context from the temporary_env, stick it on
3277 the front of shell_variables, call make_var_export_array on the
3278 whole thing to flatten it, and convert the list of SHELL_VAR *s
3279 to the form needed by the environment. */
3282 tcxt
= new_var_context ((char *)NULL
, 0);
3283 tcxt
->table
= temporary_env
;
3284 tcxt
->down
= shell_variables
;
3287 tcxt
= shell_variables
;
3289 temp_array
= make_var_export_array (tcxt
);
3291 add_temp_array_to_env (temp_array
, 0, 0);
3293 if (tcxt
!= shell_variables
)
3296 #if defined (RESTRICTED_SHELL)
3297 /* Restricted shells may not export shell functions. */
3298 temp_array
= restricted
? (char **)0 : make_func_export_array ();
3300 temp_array
= make_func_export_array ();
3303 add_temp_array_to_env (temp_array
, 0, 0);
3305 array_needs_making
= 0;
3309 /* This is an efficiency hack. PWD and OLDPWD are auto-exported, so
3310 we will need to remake the exported environment every time we
3311 change directories. `_' is always put into the environment for
3312 every external command, so without special treatment it will always
3313 cause the environment to be remade.
3315 If there is no other reason to make the exported environment, we can
3316 just update the variables in place and mark the exported environment
3317 as no longer needing a remake. */
3319 update_export_env_inplace (env_prefix
, preflen
, value
)
3326 evar
= (char *)xmalloc (STRLEN (value
) + preflen
+ 1);
3327 strcpy (evar
, env_prefix
);
3329 strcpy (evar
+ preflen
, value
);
3330 export_env
= add_or_supercede_exported_var (evar
, 0);
3333 /* We always put _ in the environment as the name of this command. */
3335 put_command_name_into_env (command_name
)
3338 update_export_env_inplace ("_=", 2, command_name
);
3341 #if 0 /* UNUSED -- it caused too many problems */
3343 put_gnu_argv_flags_into_env (pid
, flags_string
)
3353 fl
= strlen (flags_string
);
3355 dummy
= (char *)xmalloc (l
+ fl
+ 30);
3357 strcpy (dummy
+ 1, pbuf
);
3358 strcpy (dummy
+ 1 + l
, "_GNU_nonoption_argv_flags_");
3359 dummy
[l
+ 27] = '=';
3360 strcpy (dummy
+ l
+ 28, flags_string
);
3364 export_env
= add_or_supercede_exported_var (dummy
, 0);
3368 /* **************************************************************** */
3370 /* Managing variable contexts */
3372 /* **************************************************************** */
3374 /* Allocate and return a new variable context with NAME and FLAGS.
3375 NAME can be NULL. */
3378 new_var_context (name
, flags
)
3384 vc
= (VAR_CONTEXT
*)xmalloc (sizeof (VAR_CONTEXT
));
3385 vc
->name
= name
? savestring (name
) : (char *)NULL
;
3386 vc
->scope
= variable_context
;
3389 vc
->up
= vc
->down
= (VAR_CONTEXT
*)NULL
;
3390 vc
->table
= (HASH_TABLE
*)NULL
;
3395 /* Free a variable context and its data, including the hash table. Dispose
3396 all of the variables. */
3398 dispose_var_context (vc
)
3405 delete_all_variables (vc
->table
);
3406 hash_dispose (vc
->table
);
3412 /* Set VAR's scope level to the current variable context. */
3417 return (var
->context
= variable_context
);
3420 /* Make a new variable context with NAME and FLAGS and a HASH_TABLE of
3421 temporary variables, and push it onto shell_variables. This is
3422 for shell functions. */
3424 push_var_context (name
, flags
, tempvars
)
3427 HASH_TABLE
*tempvars
;
3431 vc
= new_var_context (name
, flags
);
3432 vc
->table
= tempvars
;
3435 /* Have to do this because the temp environment was created before
3436 variable_context was incremented. */
3437 flatten (tempvars
, set_context
, (VARLIST
*)NULL
, 0);
3438 vc
->flags
|= VC_HASTMPVAR
;
3440 vc
->down
= shell_variables
;
3441 shell_variables
->up
= vc
;
3443 return (shell_variables
= vc
);
3447 push_func_var (data
)
3452 var
= (SHELL_VAR
*)data
;
3454 if (tempvar_p (var
) && (posixly_correct
|| (var
->attributes
& att_propagate
)))
3456 /* XXX - should we set v->context here? */
3457 v
= bind_variable_internal (var
->name
, value_cell (var
), shell_variables
->table
, 0, 0);
3458 if (shell_variables
== global_variables
)
3459 var
->attributes
&= ~(att_tempvar
|att_propagate
);
3461 shell_variables
->flags
|= VC_HASTMPVAR
;
3462 v
->attributes
|= var
->attributes
;
3465 stupidly_hack_special_variables (var
->name
); /* XXX */
3467 dispose_variable (var
);
3470 /* Pop the top context off of VCXT and dispose of it, returning the rest of
3475 VAR_CONTEXT
*ret
, *vcxt
;
3477 vcxt
= shell_variables
;
3478 if (vc_isfuncenv (vcxt
) == 0)
3480 internal_error (_("pop_var_context: head of shell_variables not a function context"));
3484 if (ret
= vcxt
->down
)
3486 ret
->up
= (VAR_CONTEXT
*)NULL
;
3487 shell_variables
= ret
;
3489 hash_flush (vcxt
->table
, push_func_var
);
3490 dispose_var_context (vcxt
);
3493 internal_error (_("pop_var_context: no global_variables context"));
3496 /* Delete the HASH_TABLEs for all variable contexts beginning at VCXT, and
3497 all of the VAR_CONTEXTs except GLOBAL_VARIABLES. */
3499 delete_all_contexts (vcxt
)
3504 for (v
= vcxt
; v
!= global_variables
; v
= t
)
3507 dispose_var_context (v
);
3510 delete_all_variables (global_variables
->table
);
3511 shell_variables
= global_variables
;
3514 /* **************************************************************** */
3516 /* Pushing and Popping temporary variable scopes */
3518 /* **************************************************************** */
3521 push_scope (flags
, tmpvars
)
3523 HASH_TABLE
*tmpvars
;
3525 return (push_var_context ((char *)NULL
, flags
, tmpvars
));
3529 push_exported_var (data
)
3534 var
= (SHELL_VAR
*)data
;
3536 /* If a temp var had its export attribute set, or it's marked to be
3537 propagated, bind it in the previous scope before disposing it. */
3538 /* XXX - This isn't exactly right, because all tempenv variables have the
3539 export attribute set. */
3541 if (exported_p (var
) || (var
->attributes
& att_propagate
))
3543 if (tempvar_p (var
) && exported_p (var
) && (var
->attributes
& att_propagate
))
3546 var
->attributes
&= ~att_tempvar
; /* XXX */
3547 v
= bind_variable_internal (var
->name
, value_cell (var
), shell_variables
->table
, 0, 0);
3548 if (shell_variables
== global_variables
)
3549 var
->attributes
&= ~att_propagate
;
3550 v
->attributes
|= var
->attributes
;
3553 stupidly_hack_special_variables (var
->name
); /* XXX */
3555 dispose_variable (var
);
3559 pop_scope (is_special
)
3562 VAR_CONTEXT
*vcxt
, *ret
;
3564 vcxt
= shell_variables
;
3565 if (vc_istempscope (vcxt
) == 0)
3567 internal_error (_("pop_scope: head of shell_variables not a temporary environment scope"));
3573 ret
->up
= (VAR_CONTEXT
*)NULL
;
3575 shell_variables
= ret
;
3577 /* Now we can take care of merging variables in VCXT into set of scopes
3578 whose head is RET (shell_variables). */
3583 hash_flush (vcxt
->table
, push_func_var
);
3585 hash_flush (vcxt
->table
, push_exported_var
);
3586 hash_dispose (vcxt
->table
);
3590 sv_ifs ("IFS"); /* XXX here for now */
3593 /* **************************************************************** */
3595 /* Pushing and Popping function contexts */
3597 /* **************************************************************** */
3599 static WORD_LIST
**dollar_arg_stack
= (WORD_LIST
**)NULL
;
3600 static int dollar_arg_stack_slots
;
3601 static int dollar_arg_stack_index
;
3603 /* XXX - we might want to consider pushing and popping the `getopts' state
3604 when we modify the positional parameters. */
3606 push_context (name
, is_subshell
, tempvars
)
3607 char *name
; /* function name */
3609 HASH_TABLE
*tempvars
;
3611 if (is_subshell
== 0)
3612 push_dollar_vars ();
3614 push_var_context (name
, VC_FUNCENV
, tempvars
);
3617 /* Only called when subshell == 0, so we don't need to check, and can
3618 unconditionally pop the dollar vars off the stack. */
3626 sv_ifs ("IFS"); /* XXX here for now */
3629 /* Save the existing positional parameters on a stack. */
3633 if (dollar_arg_stack_index
+ 2 > dollar_arg_stack_slots
)
3635 dollar_arg_stack
= (WORD_LIST
**)
3636 xrealloc (dollar_arg_stack
, (dollar_arg_stack_slots
+= 10)
3637 * sizeof (WORD_LIST
**));
3639 dollar_arg_stack
[dollar_arg_stack_index
++] = list_rest_of_args ();
3640 dollar_arg_stack
[dollar_arg_stack_index
] = (WORD_LIST
*)NULL
;
3643 /* Restore the positional parameters from our stack. */
3647 if (!dollar_arg_stack
|| dollar_arg_stack_index
== 0)
3650 remember_args (dollar_arg_stack
[--dollar_arg_stack_index
], 1);
3651 dispose_words (dollar_arg_stack
[dollar_arg_stack_index
]);
3652 dollar_arg_stack
[dollar_arg_stack_index
] = (WORD_LIST
*)NULL
;
3653 set_dollar_vars_unchanged ();
3657 dispose_saved_dollar_vars ()
3659 if (!dollar_arg_stack
|| dollar_arg_stack_index
== 0)
3662 dispose_words (dollar_arg_stack
[dollar_arg_stack_index
]);
3663 dollar_arg_stack
[dollar_arg_stack_index
] = (WORD_LIST
*)NULL
;
3666 /* Manipulate the special BASH_ARGV and BASH_ARGC variables. */
3672 #if defined (ARRAY_VARS) && defined (DEBUGGER)
3673 SHELL_VAR
*bash_argv_v
, *bash_argc_v
;
3674 ARRAY
*bash_argv_a
, *bash_argc_a
;
3679 GET_ARRAY_FROM_VAR ("BASH_ARGV", bash_argv_v
, bash_argv_a
);
3680 GET_ARRAY_FROM_VAR ("BASH_ARGC", bash_argc_v
, bash_argc_a
);
3682 for (l
= list
, i
= 0; l
; l
= l
->next
, i
++)
3683 array_push (bash_argv_a
, l
->word
->word
);
3686 array_push (bash_argc_a
, t
);
3688 #endif /* ARRAY_VARS && DEBUGGER */
3691 /* Remove arguments from BASH_ARGV array. Pop top element off BASH_ARGC
3692 array and use that value as the count of elements to remove from
3697 #if defined (ARRAY_VARS) && defined (DEBUGGER)
3698 SHELL_VAR
*bash_argv_v
, *bash_argc_v
;
3699 ARRAY
*bash_argv_a
, *bash_argc_a
;
3703 GET_ARRAY_FROM_VAR ("BASH_ARGV", bash_argv_v
, bash_argv_a
);
3704 GET_ARRAY_FROM_VAR ("BASH_ARGC", bash_argc_v
, bash_argc_a
);
3706 ce
= array_shift (bash_argc_a
, 1, 0);
3707 if (ce
== 0 || legal_number (element_value (ce
), &i
) == 0)
3711 array_pop (bash_argv_a
);
3712 array_dispose_element (ce
);
3713 #endif /* ARRAY_VARS && DEBUGGER */
3716 /*************************************************
3718 * Functions to manage special variables *
3720 *************************************************/
3722 /* Extern declarations for variables this code has to manage. */
3723 extern int eof_encountered
, eof_encountered_limit
, ignoreeof
;
3725 #if defined (READLINE)
3726 extern int hostname_list_initialized
;
3729 /* An alist of name.function for each special variable. Most of the
3730 functions don't do much, and in fact, this would be faster with a
3731 switch statement, but by the end of this file, I am sick of switch
3734 #define SET_INT_VAR(name, intvar) intvar = find_variable (name) != 0
3736 /* This table will be sorted with qsort() the first time it's accessed. */
3737 struct name_and_function
{
3739 sh_sv_func_t
*function
;
3742 static struct name_and_function special_vars
[] = {
3743 #if defined (READLINE)
3744 # if defined (STRICT_POSIX)
3745 { "COLUMNS", sv_winsize
},
3747 { "COMP_WORDBREAKS", sv_comp_wordbreaks
},
3750 { "GLOBIGNORE", sv_globignore
},
3752 #if defined (HISTORY)
3753 { "HISTCONTROL", sv_history_control
},
3754 { "HISTFILESIZE", sv_histsize
},
3755 { "HISTIGNORE", sv_histignore
},
3756 { "HISTSIZE", sv_histsize
},
3757 { "HISTTIMEFORMAT", sv_histtimefmt
},
3760 #if defined (__CYGWIN__)
3761 { "HOME", sv_home
},
3764 #if defined (READLINE)
3765 { "HOSTFILE", sv_hostfile
},
3769 { "IGNOREEOF", sv_ignoreeof
},
3771 { "LANG", sv_locale
},
3772 { "LC_ALL", sv_locale
},
3773 { "LC_COLLATE", sv_locale
},
3774 { "LC_CTYPE", sv_locale
},
3775 { "LC_MESSAGES", sv_locale
},
3776 { "LC_NUMERIC", sv_locale
},
3777 { "LC_TIME", sv_locale
},
3779 #if defined (READLINE) && defined (STRICT_POSIX)
3780 { "LINES", sv_winsize
},
3783 { "MAIL", sv_mail
},
3784 { "MAILCHECK", sv_mail
},
3785 { "MAILPATH", sv_mail
},
3787 { "OPTERR", sv_opterr
},
3788 { "OPTIND", sv_optind
},
3790 { "PATH", sv_path
},
3791 { "POSIXLY_CORRECT", sv_strict_posix
},
3793 #if defined (READLINE)
3794 { "TERM", sv_terminal
},
3795 { "TERMCAP", sv_terminal
},
3796 { "TERMINFO", sv_terminal
},
3797 #endif /* READLINE */
3799 { "TEXTDOMAIN", sv_locale
},
3800 { "TEXTDOMAINDIR", sv_locale
},
3802 #if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE)
3806 #if defined (HISTORY) && defined (BANG_HISTORY)
3807 { "histchars", sv_histchars
},
3808 #endif /* HISTORY && BANG_HISTORY */
3810 { "ignoreeof", sv_ignoreeof
},
3812 { (char *)0, (sh_sv_func_t
*)0 }
3815 #define N_SPECIAL_VARS (sizeof (special_vars) / sizeof (special_vars[0]) - 1)
3818 sv_compare (sv1
, sv2
)
3819 struct name_and_function
*sv1
, *sv2
;
3823 if ((r
= sv1
->name
[0] - sv2
->name
[0]) == 0)
3824 r
= strcmp (sv1
->name
, sv2
->name
);
3829 find_special_var (name
)
3834 for (i
= 0; special_vars
[i
].name
; i
++)
3836 r
= special_vars
[i
].name
[0] - name
[0];
3838 r
= strcmp (special_vars
[i
].name
, name
);
3842 /* Can't match any of rest of elements in sorted list. Take this out
3843 if it causes problems in certain environments. */
3849 /* The variable in NAME has just had its state changed. Check to see if it
3850 is one of the special ones where something special happens. */
3852 stupidly_hack_special_variables (name
)
3855 static int sv_sorted
= 0;
3858 if (sv_sorted
== 0) /* shouldn't need, but it's fairly cheap. */
3860 qsort (special_vars
, N_SPECIAL_VARS
, sizeof (special_vars
[0]),
3861 (QSFUNC
*)sv_compare
);
3865 i
= find_special_var (name
);
3867 (*(special_vars
[i
].function
)) (name
);
3876 v
= find_variable ("IFS");
3880 /* What to do just after the PATH variable has changed. */
3889 /* What to do just after one of the MAILxxxx variables has changed. NAME
3890 is the name of the variable. This is called with NAME set to one of
3891 MAIL, MAILCHECK, or MAILPATH. */
3896 /* If the time interval for checking the files has changed, then
3897 reset the mail timer. Otherwise, one of the pathname vars
3898 to the users mailbox has changed, so rebuild the array of
3900 if (name
[4] == 'C') /* if (strcmp (name, "MAILCHECK") == 0) */
3901 reset_mail_timer ();
3905 remember_mail_dates ();
3909 /* What to do when GLOBIGNORE changes. */
3911 sv_globignore (name
)
3914 setup_glob_ignore (name
);
3917 #if defined (READLINE)
3919 sv_comp_wordbreaks (name
)
3924 sv
= find_variable (name
);
3926 rl_completer_word_break_characters
= (char *)NULL
;
3929 /* What to do just after one of the TERMxxx variables has changed.
3930 If we are an interactive shell, then try to reset the terminal
3931 information in readline. */
3936 if (interactive_shell
&& no_line_editing
== 0)
3937 rl_reset_terminal (get_string_value ("TERM"));
3946 v
= find_variable (name
);
3948 clear_hostname_list ();
3950 hostname_list_initialized
= 0;
3953 #if defined (STRICT_POSIX)
3954 /* In strict posix mode, we allow assignments to LINES and COLUMNS (and values
3955 found in the initial environment) to override the terminal size reported by
3965 if (posixly_correct
== 0 || interactive_shell
== 0 || no_line_editing
)
3968 v
= find_variable (name
);
3969 if (v
== 0 || var_isnull (v
))
3970 rl_reset_screen_size ();
3973 if (legal_number (value_cell (v
), &xd
) == 0)
3975 winsize_assignment
= winsize_assigned
= 1;
3976 d
= xd
; /* truncate */
3977 if (name
[0] == 'L') /* LINES */
3978 rl_set_screen_size (d
, -1);
3980 rl_set_screen_size (-1, d
);
3981 winsize_assignment
= 0;
3984 #endif /* STRICT_POSIX */
3985 #endif /* READLINE */
3987 /* Update the value of HOME in the export environment so tilde expansion will
3989 #if defined (__CYGWIN__)
3993 array_needs_making
= 1;
3994 maybe_make_export_env ();
3998 #if defined (HISTORY)
3999 /* What to do after the HISTSIZE or HISTFILESIZE variables change.
4000 If there is a value for this HISTSIZE (and it is numeric), then stifle
4001 the history. Otherwise, if there is NO value for this variable,
4002 unstifle the history. If name is HISTFILESIZE, and its value is
4003 numeric, truncate the history file to hold no more than that many
4013 temp
= get_string_value (name
);
4017 if (legal_number (temp
, &num
))
4022 stifle_history (hmax
);
4023 hmax
= where_history ();
4024 if (history_lines_this_session
> hmax
)
4025 history_lines_this_session
= hmax
;
4029 history_truncate_file (get_string_value ("HISTFILE"), hmax
);
4030 if (hmax
<= history_lines_in_file
)
4031 history_lines_in_file
= hmax
;
4035 else if (name
[4] == 'S')
4036 unstifle_history ();
4039 /* What to do after the HISTIGNORE variable changes. */
4041 sv_histignore (name
)
4044 setup_history_ignore (name
);
4047 /* What to do after the HISTCONTROL variable changes. */
4049 sv_history_control (name
)
4056 history_control
= 0;
4057 temp
= get_string_value (name
);
4059 if (temp
== 0 || *temp
== 0)
4063 while (val
= extract_colon_unit (temp
, &tptr
))
4065 if (STREQ (val
, "ignorespace"))
4066 history_control
|= HC_IGNSPACE
;
4067 else if (STREQ (val
, "ignoredups"))
4068 history_control
|= HC_IGNDUPS
;
4069 else if (STREQ (val
, "ignoreboth"))
4070 history_control
|= HC_IGNBOTH
;
4071 else if (STREQ (val
, "erasedups"))
4072 history_control
|= HC_ERASEDUPS
;
4078 #if defined (BANG_HISTORY)
4079 /* Setting/unsetting of the history expansion character. */
4086 temp
= get_string_value (name
);
4089 history_expansion_char
= *temp
;
4090 if (temp
[0] && temp
[1])
4092 history_subst_char
= temp
[1];
4094 history_comment_char
= temp
[2];
4099 history_expansion_char
= '!';
4100 history_subst_char
= '^';
4101 history_comment_char
= '#';
4104 #endif /* BANG_HISTORY */
4107 sv_histtimefmt (name
)
4112 v
= find_variable (name
);
4113 history_write_timestamps
= (v
!= 0);
4115 #endif /* HISTORY */
4117 #if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE)
4126 /* If the variable exists, then the value of it can be the number
4127 of times we actually ignore the EOF. The default is small,
4128 (smaller than csh, anyway). */
4136 eof_encountered
= 0;
4138 tmp_var
= find_variable (name
);
4139 ignoreeof
= tmp_var
!= 0;
4140 temp
= tmp_var
? value_cell (tmp_var
) : (char *)NULL
;
4142 eof_encountered_limit
= (*temp
&& all_digits (temp
)) ? atoi (temp
) : 10;
4143 set_shellopts (); /* make sure `ignoreeof' is/is not in $SHELLOPTS */
4153 tt
= get_string_value ("OPTIND");
4158 /* According to POSIX, setting OPTIND=1 resets the internal state
4160 if (s
< 0 || s
== 1)
4174 tt
= get_string_value ("OPTERR");
4175 sh_opterr
= (tt
&& *tt
) ? atoi (tt
) : 1;
4179 sv_strict_posix (name
)
4182 SET_INT_VAR (name
, posixly_correct
);
4183 posix_initialize (posixly_correct
);
4184 #if defined (READLINE)
4185 if (interactive_shell
)
4186 posix_readline_initialize (posixly_correct
);
4187 #endif /* READLINE */
4188 set_shellopts (); /* make sure `posix' is/is not in $SHELLOPTS */
4197 v
= get_string_value (name
);
4198 if (name
[0] == 'L' && name
[1] == 'A') /* LANG */
4201 set_locale_var (name
, v
); /* LC_*, TEXTDOMAIN* */
4204 #if defined (ARRAY_VARS)
4206 set_pipestatus_array (ps
, nproc
)
4214 char *t
, tbuf
[INT_STRLEN_BOUND(int) + 1];
4216 v
= find_variable ("PIPESTATUS");
4218 v
= make_new_array_variable ("PIPESTATUS");
4219 if (array_p (v
) == 0)
4220 return; /* Do nothing if not an array variable. */
4223 if (a
== 0 || array_num_elements (a
) == 0)
4225 for (i
= 0; i
< nproc
; i
++) /* was ps[i] != -1, not i < nproc */
4227 t
= inttostr (ps
[i
], tbuf
, sizeof (tbuf
));
4228 array_insert (a
, i
, t
);
4234 if (array_num_elements (a
) == nproc
&& nproc
== 1)
4236 ae
= element_forw (a
->head
);
4237 free (element_value (ae
));
4238 ae
->value
= itos (ps
[0]);
4240 else if (array_num_elements (a
) <= nproc
)
4242 /* modify in array_num_elements members in place, then add */
4244 for (i
= 0; i
< array_num_elements (a
); i
++)
4246 ae
= element_forw (ae
);
4247 free (element_value (ae
));
4248 ae
->value
= itos (ps
[i
]);
4251 for ( ; i
< nproc
; i
++)
4253 t
= inttostr (ps
[i
], tbuf
, sizeof (tbuf
));
4254 array_insert (a
, i
, t
);
4259 /* deleting elements. it's faster to rebuild the array. */
4261 for (i
= 0; ps
[i
] != -1; i
++)
4263 t
= inttostr (ps
[i
], tbuf
, sizeof (tbuf
));
4264 array_insert (a
, i
, t
);
4271 set_pipestatus_from_exit (s
)
4274 #if defined (ARRAY_VARS)
4275 static int v
[2] = { 0, -1 };
4278 set_pipestatus_array (v
, 1);