OpenCoverage

variables.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/variables.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* variables.c -- Functions for hacking shell variables. */-
2-
3/* Copyright (C) 1987-2018 Free Software Foundation, Inc.-
4-
5 This file is part of GNU Bash, the Bourne Again SHell.-
6-
7 Bash is free software: you can redistribute it and/or modify-
8 it under the terms of the GNU General Public License as published by-
9 the Free Software Foundation, either version 3 of the License, or-
10 (at your option) any later version.-
11-
12 Bash is distributed in the hope that it will be useful,-
13 but WITHOUT ANY WARRANTY; without even the implied warranty of-
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
15 GNU General Public License for more details.-
16-
17 You should have received a copy of the GNU General Public License-
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.-
19*/-
20-
21#include "config.h"-
22-
23#include "bashtypes.h"-
24#include "posixstat.h"-
25#include "posixtime.h"-
26-
27#if defined (__QNX__)-
28# if defined (__QNXNTO__)-
29# include <sys/netmgr.h>-
30# else-
31# include <sys/vc.h>-
32# endif /* !__QNXNTO__ */-
33#endif /* __QNX__ */-
34-
35#if defined (HAVE_UNISTD_H)-
36# include <unistd.h>-
37#endif-
38-
39#include <stdio.h>-
40#include "chartypes.h"-
41#if defined (HAVE_PWD_H)-
42# include <pwd.h>-
43#endif-
44#include "bashansi.h"-
45#include "bashintl.h"-
46-
47#define NEED_XTRACE_SET_DECL-
48-
49#include "shell.h"-
50#include "parser.h"-
51#include "flags.h"-
52#include "execute_cmd.h"-
53#include "findcmd.h"-
54#include "mailcheck.h"-
55#include "input.h"-
56#include "hashcmd.h"-
57#include "pathexp.h"-
58#include "alias.h"-
59#include "jobs.h"-
60-
61#include "version.h"-
62-
63#include "builtins/getopt.h"-
64#include "builtins/common.h"-
65#include "builtins/builtext.h"-
66-
67#if defined (READLINE)-
68# include "bashline.h"-
69# include <readline/readline.h>-
70#else-
71# include <tilde/tilde.h>-
72#endif-
73-
74#if defined (HISTORY)-
75# include "bashhist.h"-
76# include <readline/history.h>-
77#endif /* HISTORY */-
78-
79#if defined (PROGRAMMABLE_COMPLETION)-
80# include "pcomplete.h"-
81#endif-
82-
83#define VARIABLES_HASH_BUCKETS 1024 /* must be power of two */-
84#define FUNCTIONS_HASH_BUCKETS 512-
85#define TEMPENV_HASH_BUCKETS 4 /* must be power of two */-
86-
87#define BASHFUNC_PREFIX "BASH_FUNC_"-
88#define BASHFUNC_PREFLEN 10 /* == strlen(BASHFUNC_PREFIX */-
89#define BASHFUNC_SUFFIX "%%"-
90#define BASHFUNC_SUFFLEN 2 /* == strlen(BASHFUNC_SUFFIX) */-
91-
92/* flags for find_variable_internal */-
93-
94#define FV_FORCETEMPENV 0x01-
95#define FV_SKIPINVISIBLE 0x02-
96-
97extern char **environ;-
98-
99/* Variables used here and defined in other files. */-
100extern time_t shell_start_time;-
101-
102/* The list of shell variables that the user has created at the global-
103 scope, or that came from the environment. */-
104VAR_CONTEXT *global_variables = (VAR_CONTEXT *)NULL;-
105-
106/* The current list of shell variables, including function scopes */-
107VAR_CONTEXT *shell_variables = (VAR_CONTEXT *)NULL;-
108-
109/* The list of shell functions that the user has created, or that came from-
110 the environment. */-
111HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;-
112-
113#if defined (DEBUGGER)-
114/* The table of shell function definitions that the user defined or that-
115 came from the environment. */-
116HASH_TABLE *shell_function_defs = (HASH_TABLE *)NULL;-
117#endif-
118-
119/* The current variable context. This is really a count of how deep into-
120 executing functions we are. */-
121int variable_context = 0;-
122-
123/* If non-zero, local variables inherit values and attributes from a variable-
124 with the same name at a previous scope. */-
125int localvar_inherit = 0;-
126-
127/* If non-zero, calling `unset' on local variables in previous scopes marks-
128 them as invisible so lookups find them unset. This is the same behavior-
129 as local variables in the current local scope. */-
130int localvar_unset = 0;-
131-
132/* The set of shell assignments which are made only in the environment-
133 for a single command. */-
134HASH_TABLE *temporary_env = (HASH_TABLE *)NULL;-
135-
136/* Set to non-zero if an assignment error occurs while putting variables-
137 into the temporary environment. */-
138int tempenv_assign_error;-
139-
140/* Some funky variables which are known about specially. Here is where-
141 "$*", "$1", and all the cruft is kept. */-
142char *dollar_vars[10];-
143WORD_LIST *rest_of_args = (WORD_LIST *)NULL;-
144-
145/* The value of $$. */-
146pid_t dollar_dollar_pid;-
147-
148/* Non-zero means that we have to remake EXPORT_ENV. */-
149int array_needs_making = 1;-
150-
151/* The number of times BASH has been executed. This is set-
152 by initialize_variables (). */-
153int shell_level = 0;-
154-
155/* An array which is passed to commands as their environment. It is-
156 manufactured from the union of the initial environment and the-
157 shell variables that are marked for export. */-
158char **export_env = (char **)NULL;-
159static int export_env_index;-
160static int export_env_size;-
161-
162#if defined (READLINE)-
163static int winsize_assignment; /* currently assigning to LINES or COLUMNS */-
164#endif-
165-
166SHELL_VAR nameref_invalid_value;-
167static SHELL_VAR nameref_maxloop_value;-
168-
169static HASH_TABLE *last_table_searched; /* hash_lookup sets this */-
170-
171/* Some forward declarations. */-
172static void create_variable_tables __P((void));-
173-
174static void set_machine_vars __P((void));-
175static void set_home_var __P((void));-
176static void set_shell_var __P((void));-
177static char *get_bash_name __P((void));-
178static void initialize_shell_level __P((void));-
179static void uidset __P((void));-
180#if defined (ARRAY_VARS)-
181static void make_vers_array __P((void));-
182#endif-
183-
184static SHELL_VAR *null_assign __P((SHELL_VAR *, char *, arrayind_t, char *));-
185#if defined (ARRAY_VARS)-
186static SHELL_VAR *null_array_assign __P((SHELL_VAR *, char *, arrayind_t, char *));-
187#endif-
188static SHELL_VAR *get_self __P((SHELL_VAR *));-
189-
190#if defined (ARRAY_VARS)-
191static SHELL_VAR *init_dynamic_array_var __P((char *, sh_var_value_func_t *, sh_var_assign_func_t *, int));-
192static SHELL_VAR *init_dynamic_assoc_var __P((char *, sh_var_value_func_t *, sh_var_assign_func_t *, int));-
193#endif-
194-
195static SHELL_VAR *assign_seconds __P((SHELL_VAR *, char *, arrayind_t, char *));-
196static SHELL_VAR *get_seconds __P((SHELL_VAR *));-
197static SHELL_VAR *init_seconds_var __P((void));-
198-
199static int brand __P((void));-
200static void sbrand __P((unsigned long)); /* set bash random number generator. */-
201static void seedrand __P((void)); /* seed generator randomly */-
202static SHELL_VAR *assign_random __P((SHELL_VAR *, char *, arrayind_t, char *));-
203static SHELL_VAR *get_random __P((SHELL_VAR *));-
204-
205static SHELL_VAR *assign_lineno __P((SHELL_VAR *, char *, arrayind_t, char *));-
206static SHELL_VAR *get_lineno __P((SHELL_VAR *));-
207-
208static SHELL_VAR *assign_subshell __P((SHELL_VAR *, char *, arrayind_t, char *));-
209static SHELL_VAR *get_subshell __P((SHELL_VAR *));-
210-
211static SHELL_VAR *get_epochseconds __P((SHELL_VAR *));-
212static SHELL_VAR *get_epochrealtime __P((SHELL_VAR *));-
213-
214static SHELL_VAR *get_bashpid __P((SHELL_VAR *));-
215-
216#if defined (HISTORY)-
217static SHELL_VAR *get_histcmd __P((SHELL_VAR *));-
218#endif-
219-
220#if defined (READLINE)-
221static SHELL_VAR *get_comp_wordbreaks __P((SHELL_VAR *));-
222static SHELL_VAR *assign_comp_wordbreaks __P((SHELL_VAR *, char *, arrayind_t, char *));-
223#endif-
224-
225#if defined (PUSHD_AND_POPD) && defined (ARRAY_VARS)-
226static SHELL_VAR *assign_dirstack __P((SHELL_VAR *, char *, arrayind_t, char *));-
227static SHELL_VAR *get_dirstack __P((SHELL_VAR *));-
228#endif-
229-
230#if defined (ARRAY_VARS)-
231static SHELL_VAR *get_groupset __P((SHELL_VAR *));-
232-
233static SHELL_VAR *build_hashcmd __P((SHELL_VAR *));-
234static SHELL_VAR *get_hashcmd __P((SHELL_VAR *));-
235static SHELL_VAR *assign_hashcmd __P((SHELL_VAR *, char *, arrayind_t, char *));-
236# if defined (ALIAS)-
237static SHELL_VAR *build_aliasvar __P((SHELL_VAR *));-
238static SHELL_VAR *get_aliasvar __P((SHELL_VAR *));-
239static SHELL_VAR *assign_aliasvar __P((SHELL_VAR *, char *, arrayind_t, char *));-
240# endif-
241#endif-
242-
243static SHELL_VAR *get_funcname __P((SHELL_VAR *));-
244static SHELL_VAR *init_funcname_var __P((void));-
245-
246static void initialize_dynamic_variables __P((void));-
247-
248static SHELL_VAR *hash_lookup __P((const char *, HASH_TABLE *));-
249static SHELL_VAR *new_shell_variable __P((const char *));-
250static SHELL_VAR *make_new_variable __P((const char *, HASH_TABLE *));-
251static SHELL_VAR *bind_variable_internal __P((const char *, char *, HASH_TABLE *, int, int));-
252-
253static void dispose_variable_value __P((SHELL_VAR *));-
254static void free_variable_hash_data __P((PTR_T));-
255-
256static VARLIST *vlist_alloc __P((int));-
257static VARLIST *vlist_realloc __P((VARLIST *, int));-
258static void vlist_add __P((VARLIST *, SHELL_VAR *, int));-
259-
260static void flatten __P((HASH_TABLE *, sh_var_map_func_t *, VARLIST *, int));-
261-
262static int qsort_var_comp __P((SHELL_VAR **, SHELL_VAR **));-
263-
264static SHELL_VAR **vapply __P((sh_var_map_func_t *));-
265static SHELL_VAR **fapply __P((sh_var_map_func_t *));-
266-
267static int visible_var __P((SHELL_VAR *));-
268static int visible_and_exported __P((SHELL_VAR *));-
269static int export_environment_candidate __P((SHELL_VAR *));-
270static int local_and_exported __P((SHELL_VAR *));-
271static int variable_in_context __P((SHELL_VAR *));-
272#if defined (ARRAY_VARS)-
273static int visible_array_vars __P((SHELL_VAR *));-
274#endif-
275-
276static SHELL_VAR *find_variable_internal __P((const char *, int));-
277-
278static SHELL_VAR *find_nameref_at_context __P((SHELL_VAR *, VAR_CONTEXT *));-
279static SHELL_VAR *find_variable_nameref_context __P((SHELL_VAR *, VAR_CONTEXT *, VAR_CONTEXT **));-
280static SHELL_VAR *find_variable_last_nameref_context __P((SHELL_VAR *, VAR_CONTEXT *, VAR_CONTEXT **));-
281-
282static SHELL_VAR *bind_tempenv_variable __P((const char *, char *));-
283static void push_temp_var __P((PTR_T));-
284static void propagate_temp_var __P((PTR_T));-
285static void dispose_temporary_env __P((sh_free_func_t *)); -
286-
287static inline char *mk_env_string __P((const char *, const char *, int));-
288static char **make_env_array_from_var_list __P((SHELL_VAR **));-
289static char **make_var_export_array __P((VAR_CONTEXT *));-
290static char **make_func_export_array __P((void));-
291static void add_temp_array_to_env __P((char **, int, int));-
292-
293static int n_shell_variables __P((void));-
294static int set_context __P((SHELL_VAR *));-
295-
296static void push_func_var __P((PTR_T));-
297static void push_exported_var __P((PTR_T));-
298-
299static inline int find_special_var __P((const char *));-
300-
301static void-
302create_variable_tables ()-
303{-
304 if (shell_variables == 0)
shell_variables == 0Description
TRUEevaluated 5432 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 32 times by 1 test
Evaluated by:
  • Self test
32-5432
305 {-
306 shell_variables = global_variables = new_var_context ((char *)NULL, 0);-
307 shell_variables->scope = 0;-
308 shell_variables->table = hash_create (VARIABLES_HASH_BUCKETS);-
309 }
executed 5432 times by 1 test: end of block
Executed by:
  • Self test
5432
310-
311 if (shell_functions == 0)
shell_functions == 0Description
TRUEevaluated 5432 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 32 times by 1 test
Evaluated by:
  • Self test
32-5432
312 shell_functions = hash_create (FUNCTIONS_HASH_BUCKETS);
executed 5432 times by 1 test: shell_functions = hash_create (512);
Executed by:
  • Self test
5432
313-
314#if defined (DEBUGGER)-
315 if (shell_function_defs == 0)
shell_function_defs == 0Description
TRUEevaluated 5432 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 32 times by 1 test
Evaluated by:
  • Self test
32-5432
316 shell_function_defs = hash_create (FUNCTIONS_HASH_BUCKETS);
executed 5432 times by 1 test: shell_function_defs = hash_create (512);
Executed by:
  • Self test
5432
317#endif-
318}
executed 5464 times by 1 test: end of block
Executed by:
  • Self test
5464
319-
320/* Initialize the shell variables from the current environment.-
321 If PRIVMODE is nonzero, don't import functions from ENV or-
322 parse $SHELLOPTS. */-
323void-
324initialize_shell_variables (env, privmode)-
325 char **env;-
326 int privmode;-
327{-
328 char *name, *string, *temp_string;-
329 int c, char_index, string_index, string_length, ro;-
330 SHELL_VAR *temp_var;-
331-
332 create_variable_tables ();-
333-
334 for (string_index = 0; env && (string = env[string_index++]); )
envDescription
TRUEevaluated 131099 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(string = env[string_index++])Description
TRUEevaluated 125652 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
0-131099
335 {-
336 char_index = 0;-
337 name = string;-
338 while ((c = *string++) && c != '=')
(c = *string++)Description
TRUEevaluated 1108719 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
c != '='Description
TRUEevaluated 983067 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 125652 times by 1 test
Evaluated by:
  • Self test
0-1108719
339 ;
executed 983067 times by 1 test: ;
Executed by:
  • Self test
983067
340 if (string[-1] == '=')
string[-1] == '='Description
TRUEevaluated 125652 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-125652
341 char_index = string - name - 1;
executed 125652 times by 1 test: char_index = string - name - 1;
Executed by:
  • Self test
125652
342-
343 /* If there are weird things in the environment, like `=xxx' or a-
344 string without an `=', just skip them. */-
345 if (char_index == 0)
char_index == 0Description
TRUEnever evaluated
FALSEevaluated 125652 times by 1 test
Evaluated by:
  • Self test
0-125652
346 continue;
never executed: continue;
0
347-
348 /* ASSERT(name[char_index] == '=') */-
349 name[char_index] = '\0';-
350 /* Now, name = env variable name, string = env variable value, and-
351 char_index == strlen (name) */-
352-
353 temp_var = (SHELL_VAR *)NULL;-
354-
355#if defined (FUNCTION_IMPORT)-
356 /* If exported function, define it now. Don't import functions from-
357 the environment in privileged mode. */-
358 if (privmode == 0 && read_but_dont_execute == 0 &&
privmode == 0Description
TRUEevaluated 125652 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
read_but_dont_execute == 0Description
TRUEevaluated 125652 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-125652
359 STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) &&
never executed: __result = (((const unsigned char *) (const char *) ( "BASH_FUNC_" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(10 == 0)Description
TRUEnever evaluated
FALSEevaluated 125652 times by 1 test
Evaluated by:
  • Self test
((10 == 0) ? (... 10 ))) == 0))Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 125591 times by 1 test
Evaluated by:
  • Self test
("BASH_FUNC_")[0] == (name)[0]Description
TRUEevaluated 5505 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 120147 times by 1 test
Evaluated by:
  • Self test
(__extension__... , 10 ))) == 0Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
__builtin_constant_p ( 10 )Description
TRUEevaluated 5505 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__builtin_cons..."BASH_FUNC_" )Description
TRUEevaluated 5505 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
strlen ( "BASH...ize_t) ( 10 ))Description
TRUEnever evaluated
FALSEevaluated 5505 times by 1 test
Evaluated by:
  • Self test
__builtin_constant_p ( name )Description
TRUEnever evaluated
FALSEevaluated 5505 times by 1 test
Evaluated by:
  • Self test
strlen ( name ...ize_t) ( 10 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-125652
360 STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) &&
never executed: __result = (((const unsigned char *) (const char *) ( "%%" ))[3] - __s2[3]);
executed 61 times by 1 test: end of block
Executed by:
  • Self test
executed 61 times by 1 test: end of block
Executed by:
  • Self test
never executed: __result = (((const unsigned char *) (const char *) ( name + char_index - 2 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
("%%")[0] == (..._index - 2)[0]Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__s1_len > 0Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__result == 0Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__s1_len > 1Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__result == 0Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-61
361 STREQN ("() {", string, 4))
never executed: __result = (((const unsigned char *) (const char *) ( "() {" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( string ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(4 == 0)Description
TRUEnever evaluated
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test
((4 == 0) ? (1..., 4 ))) == 0))Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
("() {")[0] == (string)[0]Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(__extension__...g , 4 ))) == 0Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__builtin_constant_p ( 4 )Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
__builtin_cons...t_p ( "() {" )Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
strlen ( "() {...size_t) ( 4 ))Description
TRUEnever evaluated
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test
__builtin_cons...t_p ( string )Description
TRUEnever evaluated
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test
strlen ( strin...size_t) ( 4 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-61
362 {-
363 size_t namelen;-
364 char *tname; /* desired imported function name */-
365-
366 namelen = char_index - BASHFUNC_PREFLEN - BASHFUNC_SUFFLEN;-
367-
368 tname = name + BASHFUNC_PREFLEN; /* start of func name */-
369 tname[namelen] = '\0'; /* now tname == func name */-
370-
371 string_length = strlen (string);-
372 temp_string = (char *)xmalloc (namelen + string_length + 2);-
373-
374 memcpy (temp_string, tname, namelen);-
375 temp_string[namelen] = ' ';-
376 memcpy (temp_string + namelen + 1, string, string_length + 1);-
377-
378 /* Don't import function names that are invalid identifiers from the-
379 environment in posix mode, though we still allow them to be defined as-
380 shell variables. */-
381 if (absolute_program (tname) == 0 && (posixly_correct == 0 || legal_identifier (tname)))
absolute_program (tname) == 0Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
posixly_correct == 0Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
legal_identifier (tname)Description
TRUEnever evaluated
FALSEnever evaluated
0-61
382 parse_and_execute (temp_string, tname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
executed 61 times by 1 test: parse_and_execute (temp_string, tname, 0x001|0x004|0x080|0x100);
Executed by:
  • Self test
61
383 else-
384 free (temp_string); /* parse_and_execute does this */
never executed: sh_xfree((temp_string), "variables.c", 384);
0
385-
386 if (temp_var = find_function (tname))
temp_var = fin...nction (tname)Description
TRUEevaluated 49 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
12-49
387 {-
388 VSETATTR (temp_var, (att_exported|att_imported));-
389 array_needs_making = 1;-
390 }
executed 49 times by 1 test: end of block
Executed by:
  • Self test
49
391 else-
392 {-
393 if (temp_var = bind_variable (name, string, 0))
temp_var = bin...me, string, 0)Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-12
394 {-
395 VSETATTR (temp_var, (att_exported | att_imported | att_invisible));-
396 array_needs_making = 1;-
397 }
executed 12 times by 1 test: end of block
Executed by:
  • Self test
12
398 last_command_exit_value = 1;-
399 report_error (_("error importing function definition for `%s'"), tname);-
400 }
executed 12 times by 1 test: end of block
Executed by:
  • Self test
12
401-
402 /* Restore original suffix */-
403 tname[namelen] = BASHFUNC_SUFFIX[0];-
404 }
executed 61 times by 1 test: end of block
Executed by:
  • Self test
61
405 else-
406#endif /* FUNCTION_IMPORT */-
407#if defined (ARRAY_VARS)-
408# if ARRAY_EXPORT-
409 /* Array variables may not yet be exported. */-
410 if (*string == '(' && string[1] == '[' && string[strlen (string) - 1] == ')')-
411 {-
412 string_length = 1;-
413 temp_string = extract_array_assignment_list (string, &string_length);-
414 temp_var = assign_array_from_string (name, temp_string, 0);-
415 FREE (temp_string);-
416 VSETATTR (temp_var, (att_exported | att_imported));-
417 array_needs_making = 1;-
418 }-
419 else-
420# endif /* ARRAY_EXPORT */-
421#endif-
422 {-
423 ro = 0;-
424 /* If we processed a command-line option that caused SHELLOPTS to be-
425 set, it may already be set (and read-only) by the time we process-
426 the shell's environment. */-
427 if (/* posixly_correct &&*/ STREQ (name, "SHELLOPTS"))
never executed: __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "SHELLOPTS" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(name)[0] == ("SHELLOPTS")[0]Description
TRUEevaluated 10888 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 114703 times by 1 test
Evaluated by:
  • Self test
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEevaluated 10888 times by 1 test
Evaluated by:
  • Self test
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-114703
428 {-
429 temp_var = find_variable ("SHELLOPTS");-
430 ro = temp_var && readonly_p (temp_var);
temp_varDescription
TRUEnever evaluated
FALSEnever evaluated
((((temp_var)-... (0x0000002)))Description
TRUEnever evaluated
FALSEnever evaluated
0
431 if (temp_var)
temp_varDescription
TRUEnever evaluated
FALSEnever evaluated
0
432 VUNSETATTR (temp_var, att_readonly);
never executed: ((temp_var)->attributes &= ~(0x0000002));
0
433 }
never executed: end of block
0
434 temp_var = bind_variable (name, string, 0);-
435 if (temp_var)
temp_varDescription
TRUEevaluated 125591 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-125591
436 {-
437 if (legal_identifier (name))
legal_identifier (name)Description
TRUEevaluated 125591 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-125591
438 VSETATTR (temp_var, (att_exported | att_imported));
executed 125591 times by 1 test: ((temp_var)->attributes |= ((0x0000001 | 0x0008000)));
Executed by:
  • Self test
125591
439 else-
440 VSETATTR (temp_var, (att_exported | att_imported | att_invisible));
never executed: ((temp_var)->attributes |= ((0x0000001 | 0x0008000 | 0x0001000)));
0
441 if (ro)
roDescription
TRUEnever evaluated
FALSEevaluated 125591 times by 1 test
Evaluated by:
  • Self test
0-125591
442 VSETATTR (temp_var, att_readonly);
never executed: ((temp_var)->attributes |= (0x0000002));
0
443 array_needs_making = 1;-
444 }
executed 125591 times by 1 test: end of block
Executed by:
  • Self test
125591
445 }
executed 125591 times by 1 test: end of block
Executed by:
  • Self test
125591
446-
447 name[char_index] = '=';-
448 /* temp_var can be NULL if it was an exported function with a syntax-
449 error (a different bug, but it still shouldn't dump core). */-
450 if (temp_var && function_p (temp_var) == 0) /* XXX not yet */
temp_varDescription
TRUEevaluated 125652 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
((((temp_var)-...000008))) == 0Description
TRUEevaluated 125603 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 49 times by 1 test
Evaluated by:
  • Self test
0-125652
451 {-
452 CACHE_IMPORTSTR (temp_var, name);-
453 }
executed 125603 times by 1 test: end of block
Executed by:
  • Self test
125603
454 }
executed 125652 times by 1 test: end of block
Executed by:
  • Self test
125652
455-
456 set_pwd ();-
457-
458 /* Set up initial value of $_ */-
459 temp_var = set_if_not ("_", dollar_vars[0]);-
460-
461 /* Remember this pid. */-
462 dollar_dollar_pid = getpid ();-
463-
464 /* Now make our own defaults in case the vars that we think are-
465 important are missing. */-
466 temp_var = set_if_not ("PATH", DEFAULT_PATH_VALUE);-
467 temp_var = set_if_not ("TERM", "dumb");-
468-
469#if defined (__QNX__)-
470 /* set node id -- don't import it from the environment */-
471 {-
472 char node_name[22];-
473# if defined (__QNXNTO__)-
474 netmgr_ndtostr(ND2S_LOCAL_STR, ND_LOCAL_NODE, node_name, sizeof(node_name));-
475# else-
476 qnx_nidtostr (getnid (), node_name, sizeof (node_name));-
477# endif-
478 temp_var = bind_variable ("NODE", node_name, 0);-
479 if (temp_var)-
480 set_auto_export (temp_var);-
481 }-
482#endif-
483-
484 /* set up the prompts. */-
485 if (interactive_shell)
interactive_shellDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5445 times by 1 test
Evaluated by:
  • Self test
2-5445
486 {-
487#if defined (PROMPT_STRING_DECODE)-
488 set_if_not ("PS1", primary_prompt);-
489#else-
490 if (current_user.uid == -1)-
491 get_current_user_info ();-
492 set_if_not ("PS1", current_user.euid == 0 ? "# " : primary_prompt);-
493#endif-
494 set_if_not ("PS2", secondary_prompt);-
495 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
496-
497 if (current_user.euid == 0)
current_user.euid == 0Description
TRUEnever evaluated
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
0-5447
498 bind_variable ("PS4", "+ ", 0);
never executed: bind_variable ("PS4", "+ ", 0);
0
499 else-
500 set_if_not ("PS4", "+ ");
executed 5447 times by 1 test: set_if_not ("PS4", "+ ");
Executed by:
  • Self test
5447
501-
502 /* Don't allow IFS to be imported from the environment. */-
503 temp_var = bind_variable ("IFS", " \t\n", 0);-
504 setifs (temp_var);-
505-
506 /* Magic machine types. Pretty convenient. */-
507 set_machine_vars ();-
508-
509 /* Default MAILCHECK for interactive shells. Defer the creation of a-
510 default MAILPATH until the startup files are read, because MAIL-
511 names a mail file if MAILPATH is not set, and we should provide a-
512 default only if neither is set. */-
513 if (interactive_shell)
interactive_shellDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5445 times by 1 test
Evaluated by:
  • Self test
2-5445
514 {-
515 temp_var = set_if_not ("MAILCHECK", posixly_correct ? "600" : "60");-
516 VSETATTR (temp_var, att_integer);-
517 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
518-
519 /* Do some things with shell level. */-
520 initialize_shell_level ();-
521-
522 set_ppid ();-
523-
524 /* Initialize the `getopts' stuff. */-
525 temp_var = bind_variable ("OPTIND", "1", 0);-
526 VSETATTR (temp_var, att_integer);-
527 getopts_reset (0);-
528 bind_variable ("OPTERR", "1", 0);-
529 sh_opterr = 1;-
530-
531 if (login_shell == 1 && posixly_correct == 0)
login_shell == 1Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5446 times by 1 test
Evaluated by:
  • Self test
posixly_correct == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5446
532 set_home_var ();
executed 1 time by 1 test: set_home_var ();
Executed by:
  • Self test
1
533-
534 /* Get the full pathname to THIS shell, and set the BASH variable-
535 to it. */-
536 name = get_bash_name ();-
537 temp_var = bind_variable ("BASH", name, 0);-
538 free (name);-
539-
540 /* Make the exported environment variable SHELL be the user's login-
541 shell. Note that the `tset' command looks at this variable-
542 to determine what style of commands to output; if it ends in "csh",-
543 then C-shell commands are output, else Bourne shell commands. */-
544 set_shell_var ();-
545-
546 /* Make a variable called BASH_VERSION which contains the version info. */-
547 bind_variable ("BASH_VERSION", shell_version_string (), 0);-
548#if defined (ARRAY_VARS)-
549 make_vers_array ();-
550#endif-
551-
552 if (command_execution_string)
command_execution_stringDescription
TRUEevaluated 177 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5270 times by 1 test
Evaluated by:
  • Self test
177-5270
553 bind_variable ("BASH_EXECUTION_STRING", command_execution_string, 0);
executed 177 times by 1 test: bind_variable ("BASH_EXECUTION_STRING", command_execution_string, 0);
Executed by:
  • Self test
177
554-
555 /* Find out if we're supposed to be in Posix.2 mode via an-
556 environment variable. */-
557 temp_var = find_variable ("POSIXLY_CORRECT");-
558 if (!temp_var)
!temp_varDescription
TRUEevaluated 5430 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 17 times by 1 test
Evaluated by:
  • Self test
17-5430
559 temp_var = find_variable ("POSIX_PEDANTIC");
executed 5430 times by 1 test: temp_var = find_variable ("POSIX_PEDANTIC");
Executed by:
  • Self test
5430
560 if (temp_var && imported_p (temp_var))
temp_varDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5430 times by 1 test
Evaluated by:
  • Self test
((((temp_var)-... (0x0008000)))Description
TRUEnever evaluated
FALSEevaluated 17 times by 1 test
Evaluated by:
  • Self test
0-5430
561 sv_strict_posix (temp_var->name);
never executed: sv_strict_posix (temp_var->name);
0
562-
563#if defined (HISTORY)-
564 /* Set history variables to defaults, and then do whatever we would-
565 do if the variable had just been set. Do this only in the case-
566 that we are remembering commands on the history list. */-
567 if (remember_on_history)
remember_on_historyDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5445 times by 1 test
Evaluated by:
  • Self test
2-5445
568 {-
569 name = bash_tilde_expand (posixly_correct ? "~/.sh_history" : "~/.bash_history", 0);-
570-
571 set_if_not ("HISTFILE", name);-
572 free (name);-
573 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
574#endif /* HISTORY */-
575-
576 /* Seed the random number generator. */-
577 seedrand ();-
578-
579 /* Handle some "special" variables that we may have inherited from a-
580 parent shell. */-
581 if (interactive_shell)
interactive_shellDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5445 times by 1 test
Evaluated by:
  • Self test
2-5445
582 {-
583 temp_var = find_variable ("IGNOREEOF");-
584 if (!temp_var)
!temp_varDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
585 temp_var = find_variable ("ignoreeof");
executed 2 times by 1 test: temp_var = find_variable ("ignoreeof");
Executed by:
  • Self test
2
586 if (temp_var && imported_p (temp_var))
temp_varDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
((((temp_var)-... (0x0008000)))Description
TRUEnever evaluated
FALSEnever evaluated
0-2
587 sv_ignoreeof (temp_var->name);
never executed: sv_ignoreeof (temp_var->name);
0
588 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
589-
590#if defined (HISTORY)-
591 if (interactive_shell && remember_on_history)
interactive_shellDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5445 times by 1 test
Evaluated by:
  • Self test
remember_on_historyDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5445
592 {-
593 sv_history_control ("HISTCONTROL");-
594 sv_histignore ("HISTIGNORE");-
595 sv_histtimefmt ("HISTTIMEFORMAT");-
596 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
597#endif /* HISTORY */-
598-
599#if defined (READLINE) && defined (STRICT_POSIX)-
600 /* POSIXLY_CORRECT will be 1 here if the shell was compiled-
601 -DSTRICT_POSIX or if POSIXLY_CORRECT was supplied in the shell's-
602 environment */-
603 if (interactive_shell && posixly_correct && no_line_editing == 0)-
604 rl_prefer_env_winsize = 1;-
605#endif /* READLINE && STRICT_POSIX */-
606-
607 /*-
608 * 24 October 2001-
609 *-
610 * I'm tired of the arguing and bug reports. Bash now leaves SSH_CLIENT-
611 * and SSH2_CLIENT alone. I'm going to rely on the shell_level check in-
612 * isnetconn() to avoid running the startup files more often than wanted.-
613 * That will, of course, only work if the user's login shell is bash, so-
614 * I've made that behavior conditional on SSH_SOURCE_BASHRC being defined-
615 * in config-top.h.-
616 */-
617#if 0-
618 temp_var = find_variable ("SSH_CLIENT");-
619 if (temp_var && imported_p (temp_var))-
620 {-
621 VUNSETATTR (temp_var, att_exported);-
622 array_needs_making = 1;-
623 }-
624 temp_var = find_variable ("SSH2_CLIENT");-
625 if (temp_var && imported_p (temp_var))-
626 {-
627 VUNSETATTR (temp_var, att_exported);-
628 array_needs_making = 1;-
629 }-
630#endif-
631-
632 /* Get the user's real and effective user ids. */-
633 uidset ();-
634-
635 temp_var = find_variable ("BASH_XTRACEFD");-
636 if (temp_var && imported_p (temp_var))
temp_varDescription
TRUEnever evaluated
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
((((temp_var)-... (0x0008000)))Description
TRUEnever evaluated
FALSEnever evaluated
0-5447
637 sv_xtracefd (temp_var->name);
never executed: sv_xtracefd (temp_var->name);
0
638-
639 sv_shcompat ("BASH_COMPAT");-
640-
641 /* Allow FUNCNEST to be inherited from the environment. */-
642 sv_funcnest ("FUNCNEST");-
643-
644 /* Initialize the dynamic variables, and seed their values. */-
645 initialize_dynamic_variables ();-
646}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
647-
648/* **************************************************************** */-
649/* */-
650/* Setting values for special shell variables */-
651/* */-
652/* **************************************************************** */-
653-
654static void-
655set_machine_vars ()-
656{-
657 SHELL_VAR *temp_var;-
658-
659 temp_var = set_if_not ("HOSTTYPE", HOSTTYPE);-
660 temp_var = set_if_not ("OSTYPE", OSTYPE);-
661 temp_var = set_if_not ("MACHTYPE", MACHTYPE);-
662-
663 temp_var = set_if_not ("HOSTNAME", current_host_name);-
664}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
665-
666/* Set $HOME to the information in the password file if we didn't get-
667 it from the environment. */-
668-
669/* This function is not static so the tilde and readline libraries can-
670 use it. */-
671char *-
672sh_get_home_dir ()-
673{-
674 if (current_user.home_dir == 0)
current_user.home_dir == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
675 get_current_user_info ();
never executed: get_current_user_info ();
0
676 return current_user.home_dir;
never executed: return current_user.home_dir;
0
677}-
678-
679static void-
680set_home_var ()-
681{-
682 SHELL_VAR *temp_var;-
683-
684 temp_var = find_variable ("HOME");-
685 if (temp_var == 0)
temp_var == 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
686 temp_var = bind_variable ("HOME", sh_get_home_dir (), 0);
never executed: temp_var = bind_variable ("HOME", sh_get_home_dir (), 0);
0
687#if 0-
688 VSETATTR (temp_var, att_exported);-
689#endif-
690}
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
691-
692/* Set $SHELL to the user's login shell if it is not already set. Call-
693 get_current_user_info if we haven't already fetched the shell. */-
694static void-
695set_shell_var ()-
696{-
697 SHELL_VAR *temp_var;-
698-
699 temp_var = find_variable ("SHELL");-
700 if (temp_var == 0)
temp_var == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
3-5444
701 {-
702 if (current_user.shell == 0)
current_user.shell == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
703 get_current_user_info ();
executed 3 times by 1 test: get_current_user_info ();
Executed by:
  • Self test
3
704 temp_var = bind_variable ("SHELL", current_user.shell, 0);-
705 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
706#if 0-
707 VSETATTR (temp_var, att_exported);-
708#endif-
709}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
710-
711static char *-
712get_bash_name ()-
713{-
714 char *name;-
715-
716 if ((login_shell == 1) && RELPATH(shell_name))
(login_shell == 1)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5446 times by 1 test
Evaluated by:
  • Self test
((shell_name)[0] != '/')Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5446
717 {-
718 if (current_user.shell == 0)
current_user.shell == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1
719 get_current_user_info ();
executed 1 time by 1 test: get_current_user_info ();
Executed by:
  • Self test
1
720 name = savestring (current_user.shell);-
721 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
722 else if (ABSPATH(shell_name))
((shell_name)[0] == '/')Description
TRUEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-5444
723 name = savestring (shell_name);
executed 5444 times by 1 test: name = (char *)strcpy (sh_xmalloc((1 + strlen (shell_name)), "variables.c", 723), (shell_name));
Executed by:
  • Self test
5444
724 else if (shell_name[0] == '.' && shell_name[1] == '/')
shell_name[0] == '.'Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
shell_name[1] == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0-2
725 {-
726 /* Fast path for common case. */-
727 char *cdir;-
728 int len;-
729-
730 cdir = get_string_value ("PWD");-
731 if (cdir)
cdirDescription
TRUEnever evaluated
FALSEnever evaluated
0
732 {-
733 len = strlen (cdir);-
734 name = (char *)xmalloc (len + strlen (shell_name) + 1);-
735 strcpy (name, cdir);-
736 strcpy (name + len, shell_name + 1);-
737 }
never executed: end of block
0
738 else-
739 name = savestring (shell_name);
never executed: name = (char *)strcpy (sh_xmalloc((1 + strlen (shell_name)), "variables.c", 739), (shell_name));
0
740 }-
741 else-
742 {-
743 char *tname;-
744 int s;-
745-
746 tname = find_user_command (shell_name);-
747-
748 if (tname == 0)
tname == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
749 {-
750 /* Try the current directory. If there is not an executable-
751 there, just punt and use the login shell. */-
752 s = file_status (shell_name);-
753 if (s & FS_EXECABLE)
s & 0x2Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
754 {-
755 tname = make_absolute (shell_name, get_string_value ("PWD"));-
756 if (*shell_name == '.')
*shell_name == '.'Description
TRUEnever evaluated
FALSEnever evaluated
0
757 {-
758 name = sh_canonpath (tname, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);-
759 if (name == 0)
name == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
760 name = tname;
never executed: name = tname;
0
761 else-
762 free (tname);
never executed: sh_xfree((tname), "variables.c", 762);
0
763 }-
764 else-
765 name = tname;
never executed: name = tname;
0
766 }-
767 else-
768 {-
769 if (current_user.shell == 0)
current_user.shell == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
770 get_current_user_info ();
executed 2 times by 1 test: get_current_user_info ();
Executed by:
  • Self test
2
771 name = savestring (current_user.shell);-
772 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
773 }-
774 else-
775 {-
776 name = full_pathname (tname);-
777 free (tname);-
778 }
never executed: end of block
0
779 }-
780-
781 return (name);
executed 5447 times by 1 test: return (name);
Executed by:
  • Self test
5447
782}-
783-
784void-
785adjust_shell_level (change)-
786 int change;-
787{-
788 char new_level[5], *old_SHLVL;-
789 intmax_t old_level;-
790 SHELL_VAR *temp_var;-
791-
792 old_SHLVL = get_string_value ("SHLVL");-
793 if (old_SHLVL == 0 || *old_SHLVL == '\0' || legal_number (old_SHLVL, &old_level) == 0)
old_SHLVL == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5448 times by 1 test
Evaluated by:
  • Self test
*old_SHLVL == '\0'Description
TRUEnever evaluated
FALSEevaluated 5448 times by 1 test
Evaluated by:
  • Self test
legal_number (...ld_level) == 0Description
TRUEnever evaluated
FALSEevaluated 5448 times by 1 test
Evaluated by:
  • Self test
0-5448
794 old_level = 0;
executed 3 times by 1 test: old_level = 0;
Executed by:
  • Self test
3
795-
796 shell_level = old_level + change;-
797 if (shell_level < 0)
shell_level < 0Description
TRUEnever evaluated
FALSEevaluated 5451 times by 1 test
Evaluated by:
  • Self test
0-5451
798 shell_level = 0;
never executed: shell_level = 0;
0
799 else if (shell_level >= 1000)
shell_level >= 1000Description
TRUEnever evaluated
FALSEevaluated 5451 times by 1 test
Evaluated by:
  • Self test
0-5451
800 {-
801 internal_warning (_("shell level (%d) too high, resetting to 1"), shell_level);-
802 shell_level = 1;-
803 }
never executed: end of block
0
804-
805 /* We don't need the full generality of itos here. */-
806 if (shell_level < 10)
shell_level < 10Description
TRUEevaluated 5451 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5451
807 {-
808 new_level[0] = shell_level + '0';-
809 new_level[1] = '\0';-
810 }
executed 5451 times by 1 test: end of block
Executed by:
  • Self test
5451
811 else if (shell_level < 100)
shell_level < 100Description
TRUEnever evaluated
FALSEnever evaluated
0
812 {-
813 new_level[0] = (shell_level / 10) + '0';-
814 new_level[1] = (shell_level % 10) + '0';-
815 new_level[2] = '\0';-
816 }
never executed: end of block
0
817 else if (shell_level < 1000)
shell_level < 1000Description
TRUEnever evaluated
FALSEnever evaluated
0
818 {-
819 new_level[0] = (shell_level / 100) + '0';-
820 old_level = shell_level % 100;-
821 new_level[1] = (old_level / 10) + '0';-
822 new_level[2] = (old_level % 10) + '0';-
823 new_level[3] = '\0';-
824 }
never executed: end of block
0
825-
826 temp_var = bind_variable ("SHLVL", new_level, 0);-
827 set_auto_export (temp_var);-
828}
executed 5451 times by 1 test: end of block
Executed by:
  • Self test
5451
829-
830static void-
831initialize_shell_level ()-
832{-
833 adjust_shell_level (1);-
834}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
835-
836/* If we got PWD from the environment, update our idea of the current-
837 working directory. In any case, make sure that PWD exists before-
838 checking it. It is possible for getcwd () to fail on shell startup,-
839 and in that case, PWD would be undefined. If this is an interactive-
840 login shell, see if $HOME is the current working directory, and if-
841 that's not the same string as $PWD, set PWD=$HOME. */-
842-
843void-
844set_pwd ()-
845{-
846 SHELL_VAR *temp_var, *home_var;-
847 char *temp_string, *home_string, *current_dir;-
848-
849 home_var = find_variable ("HOME");-
850 home_string = home_var ? value_cell (home_var) : (char *)NULL;
home_varDescription
TRUEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
3-5444
851-
852 temp_var = find_variable ("PWD");-
853 /* Follow posix rules for importing PWD */-
854 if (temp_var && imported_p (temp_var) &&
temp_varDescription
TRUEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
((((temp_var)-... (0x0008000)))Description
TRUEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5444
855 (temp_string = value_cell (temp_var)) &&
(temp_string =..._var)->value))Description
TRUEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5444
856 temp_string[0] == '/' &&
temp_string[0] == '/'Description
TRUEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5444
857 same_file (temp_string, ".", (struct stat *)NULL, (struct stat *)NULL))
same_file (tem... ((void *)0) )Description
TRUEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5444
858 {-
859 current_dir = sh_canonpath (temp_string, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);-
860 if (current_dir == 0)
current_dir == 0Description
TRUEnever evaluated
FALSEevaluated 5444 times by 1 test
Evaluated by:
  • Self test
0-5444
861 current_dir = get_working_directory ("shell_init");
never executed: current_dir = get_working_directory ("shell_init");
0
862 else-
863 set_working_directory (current_dir);
executed 5444 times by 1 test: set_working_directory (current_dir);
Executed by:
  • Self test
5444
864 if (posixly_correct && current_dir)
posixly_correctDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5427 times by 1 test
Evaluated by:
  • Self test
current_dirDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5427
865 {-
866 temp_var = bind_variable ("PWD", current_dir, 0);-
867 set_auto_export (temp_var);-
868 }
executed 17 times by 1 test: end of block
Executed by:
  • Self test
17
869 free (current_dir);-
870 }
executed 5444 times by 1 test: end of block
Executed by:
  • Self test
5444
871 else if (home_string && interactive_shell && login_shell &&
home_stringDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
interactive_shellDescription
TRUEnever evaluated
FALSEnever evaluated
login_shellDescription
TRUEnever evaluated
FALSEnever evaluated
0-3
872 same_file (home_string, ".", (struct stat *)NULL, (struct stat *)NULL))
same_file (hom... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
873 {-
874 set_working_directory (home_string);-
875 temp_var = bind_variable ("PWD", home_string, 0);-
876 set_auto_export (temp_var);-
877 }
never executed: end of block
0
878 else-
879 {-
880 temp_string = get_working_directory ("shell-init");-
881 if (temp_string)
temp_stringDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
882 {-
883 temp_var = bind_variable ("PWD", temp_string, 0);-
884 set_auto_export (temp_var);-
885 free (temp_string);-
886 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
887 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
888-
889 /* According to the Single Unix Specification, v2, $OLDPWD is an-
890 `environment variable' and therefore should be auto-exported. If we-
891 don't find OLDPWD in the environment, or it doesn't name a directory,-
892 make a dummy invisible variable for OLDPWD, and mark it as exported. */-
893 temp_var = find_variable ("OLDPWD");-
894#if defined (OLDPWD_CHECK_DIRECTORY)-
895 if (temp_var == 0 || value_cell (temp_var) == 0 || file_isdir (value_cell (temp_var)) == 0)
temp_var == 0Description
TRUEevaluated 26 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5421 times by 1 test
Evaluated by:
  • Self test
((temp_var)->value) == 0Description
TRUEnever evaluated
FALSEevaluated 5421 times by 1 test
Evaluated by:
  • Self test
file_isdir (((...->value)) == 0Description
TRUEevaluated 23 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5398 times by 1 test
Evaluated by:
  • Self test
0-5421
896#else-
897 if (temp_var == 0 || value_cell (temp_var) == 0)-
898#endif-
899 {-
900 temp_var = bind_variable ("OLDPWD", (char *)NULL, 0);-
901 VSETATTR (temp_var, (att_exported | att_invisible));-
902 }
executed 49 times by 1 test: end of block
Executed by:
  • Self test
49
903}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
904-
905/* Make a variable $PPID, which holds the pid of the shell's parent. */-
906void-
907set_ppid ()-
908{-
909 char namebuf[INT_STRLEN_BOUND(pid_t) + 1], *name;-
910 SHELL_VAR *temp_var;-
911-
912 name = inttostr (getppid (), namebuf, sizeof(namebuf));-
913 temp_var = find_variable ("PPID");-
914 if (temp_var)
temp_varDescription
TRUEnever evaluated
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
0-5447
915 VUNSETATTR (temp_var, (att_readonly | att_exported));
never executed: ((temp_var)->attributes &= ~((0x0000002 | 0x0000001)));
0
916 temp_var = bind_variable ("PPID", name, 0);-
917 VSETATTR (temp_var, (att_readonly | att_integer));-
918}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
919-
920static void-
921uidset ()-
922{-
923 char buff[INT_STRLEN_BOUND(uid_t) + 1], *b;-
924 register SHELL_VAR *v;-
925-
926 b = inttostr (current_user.uid, buff, sizeof (buff));-
927 v = find_variable ("UID");-
928 if (v == 0)
v == 0Description
TRUEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5447
929 {-
930 v = bind_variable ("UID", b, 0);-
931 VSETATTR (v, (att_readonly | att_integer));-
932 }
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
933-
934 if (current_user.euid != current_user.uid)
current_user.e...rrent_user.uidDescription
TRUEnever evaluated
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
0-5447
935 b = inttostr (current_user.euid, buff, sizeof (buff));
never executed: b = inttostr (current_user.euid, buff, sizeof (buff));
0
936-
937 v = find_variable ("EUID");-
938 if (v == 0)
v == 0Description
TRUEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5447
939 {-
940 v = bind_variable ("EUID", b, 0);-
941 VSETATTR (v, (att_readonly | att_integer));-
942 }
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
943}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
944-
945#if defined (ARRAY_VARS)-
946static void-
947make_vers_array ()-
948{-
949 SHELL_VAR *vv;-
950 ARRAY *av;-
951 char *s, d[32], b[INT_STRLEN_BOUND(int) + 1];-
952-
953 unbind_variable_noref ("BASH_VERSINFO");-
954-
955 vv = make_new_array_variable ("BASH_VERSINFO");-
956 av = array_cell (vv);-
957 strcpy (d, dist_version);-
958 s = strchr (d, '.');
__builtin_constant_p ( '.' )Description
TRUEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
!__builtin_constant_p ( d )Description
TRUEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
( '.' ) == '\0'Description
TRUEnever evaluated
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
0-5447
959 if (s)
sDescription
TRUEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5447
960 *s++ = '\0';
executed 5447 times by 1 test: *s++ = '\0';
Executed by:
  • Self test
5447
961 array_insert (av, 0, d);-
962 array_insert (av, 1, s);-
963 s = inttostr (patch_level, b, sizeof (b));-
964 array_insert (av, 2, s);-
965 s = inttostr (build_version, b, sizeof (b));-
966 array_insert (av, 3, s);-
967 array_insert (av, 4, release_status);-
968 array_insert (av, 5, MACHTYPE);-
969-
970 VSETATTR (vv, att_readonly);-
971}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
972#endif /* ARRAY_VARS */-
973-
974/* Set the environment variables $LINES and $COLUMNS in response to-
975 a window size change. */-
976void-
977sh_set_lines_and_columns (lines, cols)-
978 int lines, cols;-
979{-
980 char val[INT_STRLEN_BOUND(int) + 1], *v;-
981-
982#if defined (READLINE)-
983 /* If we are currently assigning to LINES or COLUMNS, don't do anything. */-
984 if (winsize_assignment)
winsize_assignmentDescription
TRUEnever evaluated
FALSEnever evaluated
0
985 return;
never executed: return;
0
986#endif-
987-
988 v = inttostr (lines, val, sizeof (val));-
989 bind_variable ("LINES", v, 0);-
990-
991 v = inttostr (cols, val, sizeof (val));-
992 bind_variable ("COLUMNS", v, 0);-
993}
never executed: end of block
0
994-
995/* **************************************************************** */-
996/* */-
997/* Printing variables and values */-
998/* */-
999/* **************************************************************** */-
1000-
1001/* Print LIST (a list of shell variables) to stdout in such a way that-
1002 they can be read back in. */-
1003void-
1004print_var_list (list)-
1005 register SHELL_VAR **list;-
1006{-
1007 register int i;-
1008 register SHELL_VAR *var;-
1009-
1010 for (i = 0; list && (var = list[i]); i++)
listDescription
TRUEevaluated 429 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(var = list[i])Description
TRUEevaluated 423 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-429
1011 if (invisible_p (var) == 0)
((((var)->attr...001000))) == 0Description
TRUEevaluated 417 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
6-417
1012 print_assignment (var);
executed 417 times by 1 test: print_assignment (var);
Executed by:
  • Self test
417
1013}
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
1014-
1015/* Print LIST (a list of shell functions) to stdout in such a way that-
1016 they can be read back in. */-
1017void-
1018print_func_list (list)-
1019 register SHELL_VAR **list;-
1020{-
1021 register int i;-
1022 register SHELL_VAR *var;-
1023-
1024 for (i = 0; list && (var = list[i]); i++)
listDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(var = list[i])Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
0-12
1025 {-
1026 printf ("%s ", var->name);-
1027 print_var_function (var);-
1028 printf ("\n");-
1029 }
executed 8 times by 1 test: end of block
Executed by:
  • Self test
8
1030}
executed 4 times by 1 test: end of block
Executed by:
  • Self test
4
1031 -
1032/* Print the value of a single SHELL_VAR. No newline is-
1033 output, but the variable is printed in such a way that-
1034 it can be read back in. */-
1035void-
1036print_assignment (var)-
1037 SHELL_VAR *var;-
1038{-
1039 if (var_isset (var) == 0)
((var)->value != 0) == 0Description
TRUEevaluated 66 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 357 times by 1 test
Evaluated by:
  • Self test
66-357
1040 return;
executed 66 times by 1 test: return;
Executed by:
  • Self test
66
1041-
1042 if (function_p (var))
((((var)->attr... (0x0000008)))Description
TRUEnever evaluated
FALSEevaluated 357 times by 1 test
Evaluated by:
  • Self test
0-357
1043 {-
1044 printf ("%s", var->name);-
1045 print_var_function (var);-
1046 printf ("\n");-
1047 }
never executed: end of block
0
1048#if defined (ARRAY_VARS)-
1049 else if (array_p (var))
((((var)->attr... (0x0000004)))Description
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 306 times by 1 test
Evaluated by:
  • Self test
51-306
1050 print_array_assignment (var, 0);
executed 51 times by 1 test: print_array_assignment (var, 0);
Executed by:
  • Self test
51
1051 else if (assoc_p (var))
((((var)->attr... (0x0000040)))Description
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 292 times by 1 test
Evaluated by:
  • Self test
14-292
1052 print_assoc_assignment (var, 0);
executed 14 times by 1 test: print_assoc_assignment (var, 0);
Executed by:
  • Self test
14
1053#endif /* ARRAY_VARS */-
1054 else-
1055 {-
1056 printf ("%s=", var->name);-
1057 print_var_value (var, 1);-
1058 printf ("\n");-
1059 }
executed 292 times by 1 test: end of block
Executed by:
  • Self test
292
1060}-
1061-
1062/* Print the value cell of VAR, a shell variable. Do not print-
1063 the name, nor leading/trailing newline. If QUOTE is non-zero,-
1064 and the value contains shell metacharacters, quote the value-
1065 in such a way that it can be read back in. */-
1066void-
1067print_var_value (var, quote)-
1068 SHELL_VAR *var;-
1069 int quote;-
1070{-
1071 char *t;-
1072-
1073 if (var_isset (var) == 0)
((var)->value != 0) == 0Description
TRUEnever evaluated
FALSEevaluated 292 times by 1 test
Evaluated by:
  • Self test
0-292
1074 return;
never executed: return;
0
1075-
1076 if (quote && posixly_correct == 0 && ansic_shouldquote (value_cell (var)))
quoteDescription
TRUEevaluated 292 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
posixly_correct == 0Description
TRUEevaluated 292 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
ansic_shouldqu...(var)->value))Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 282 times by 1 test
Evaluated by:
  • Self test
0-292
1077 {-
1078 t = ansic_quote (value_cell (var), 0, (int *)0);-
1079 printf ("%s", t);-
1080 free (t);-
1081 }
executed 10 times by 1 test: end of block
Executed by:
  • Self test
10
1082 else if (quote && sh_contains_shell_metas (value_cell (var)))
quoteDescription
TRUEevaluated 282 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
sh_contains_sh...(var)->value))Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 258 times by 1 test
Evaluated by:
  • Self test
0-282
1083 {-
1084 t = sh_single_quote (value_cell (var));-
1085 printf ("%s", t);-
1086 free (t);-
1087 }
executed 24 times by 1 test: end of block
Executed by:
  • Self test
24
1088 else-
1089 printf ("%s", value_cell (var));
executed 258 times by 1 test: printf ("%s", ((var)->value));
Executed by:
  • Self test
258
1090}-
1091-
1092/* Print the function cell of VAR, a shell variable. Do not-
1093 print the name, nor leading/trailing newline. */-
1094void-
1095print_var_function (var)-
1096 SHELL_VAR *var;-
1097{-
1098 char *x;-
1099-
1100 if (function_p (var) && var_isset (var))
((((var)->attr... (0x0000008)))Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
((var)->value != 0)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-8
1101 {-
1102 x = named_function_string ((char *)NULL, function_cell(var), FUNC_MULTILINE|FUNC_EXTERNAL);-
1103 printf ("%s", x);-
1104 }
executed 8 times by 1 test: end of block
Executed by:
  • Self test
8
1105}
executed 8 times by 1 test: end of block
Executed by:
  • Self test
8
1106-
1107/* **************************************************************** */-
1108/* */-
1109/* Dynamic Variables */-
1110/* */-
1111/* **************************************************************** */-
1112-
1113/* DYNAMIC VARIABLES-
1114-
1115 These are variables whose values are generated anew each time they are-
1116 referenced. These are implemented using a pair of function pointers-
1117 in the struct variable: assign_func, which is called from bind_variable-
1118 and, if arrays are compiled into the shell, some of the functions in-
1119 arrayfunc.c, and dynamic_value, which is called from find_variable.-
1120-
1121 assign_func is called from bind_variable_internal, if-
1122 bind_variable_internal discovers that the variable being assigned to-
1123 has such a function. The function is called as-
1124 SHELL_VAR *temp = (*(entry->assign_func)) (entry, value, ind)-
1125 and the (SHELL_VAR *)temp is returned as the value of bind_variable. It-
1126 is usually ENTRY (self). IND is an index for an array variable, and-
1127 unused otherwise.-
1128-
1129 dynamic_value is called from find_variable_internal to return a `new'-
1130 value for the specified dynamic varible. If this function is NULL,-
1131 the variable is treated as a `normal' shell variable. If it is not,-
1132 however, then this function is called like this:-
1133 tempvar = (*(var->dynamic_value)) (var);-
1134-
1135 Sometimes `tempvar' will replace the value of `var'. Other times, the-
1136 shell will simply use the string value. Pretty object-oriented, huh?-
1137-
1138 Be warned, though: if you `unset' a special variable, it loses its-
1139 special meaning, even if you subsequently set it.-
1140-
1141 The special assignment code would probably have been better put in-
1142 subst.c: do_assignment_internal, in the same style as-
1143 stupidly_hack_special_variables, but I wanted the changes as-
1144 localized as possible. */-
1145-
1146#define INIT_DYNAMIC_VAR(var, val, gfunc, afunc) \-
1147 do \-
1148 { \-
1149 v = bind_variable (var, (val), 0); \-
1150 v->dynamic_value = gfunc; \-
1151 v->assign_func = afunc; \-
1152 } \-
1153 while (0)-
1154-
1155#define INIT_DYNAMIC_ARRAY_VAR(var, gfunc, afunc) \-
1156 do \-
1157 { \-
1158 v = make_new_array_variable (var); \-
1159 v->dynamic_value = gfunc; \-
1160 v->assign_func = afunc; \-
1161 } \-
1162 while (0)-
1163-
1164#define INIT_DYNAMIC_ASSOC_VAR(var, gfunc, afunc) \-
1165 do \-
1166 { \-
1167 v = make_new_assoc_variable (var); \-
1168 v->dynamic_value = gfunc; \-
1169 v->assign_func = afunc; \-
1170 } \-
1171 while (0)-
1172-
1173static SHELL_VAR *-
1174null_assign (self, value, unused, key)-
1175 SHELL_VAR *self;-
1176 char *value;-
1177 arrayind_t unused;-
1178 char *key;-
1179{-
1180 return (self);
never executed: return (self);
0
1181}-
1182-
1183#if defined (ARRAY_VARS)-
1184static SHELL_VAR *-
1185null_array_assign (self, value, ind, key)-
1186 SHELL_VAR *self;-
1187 char *value;-
1188 arrayind_t ind;-
1189 char *key;-
1190{-
1191 return (self);
executed 4 times by 1 test: return (self);
Executed by:
  • Self test
4
1192}-
1193#endif-
1194-
1195/* Degenerate `dynamic_value' function; just returns what's passed without-
1196 manipulation. */-
1197static SHELL_VAR *-
1198get_self (self)-
1199 SHELL_VAR *self;-
1200{-
1201 return (self);
executed 3319909 times by 1 test: return (self);
Executed by:
  • Self test
3319909
1202}-
1203-
1204#if defined (ARRAY_VARS)-
1205/* A generic dynamic array variable initializer. Initialize array variable-
1206 NAME with dynamic value function GETFUNC and assignment function SETFUNC. */-
1207static SHELL_VAR *-
1208init_dynamic_array_var (name, getfunc, setfunc, attrs)-
1209 char *name;-
1210 sh_var_value_func_t *getfunc;-
1211 sh_var_assign_func_t *setfunc;-
1212 int attrs;-
1213{-
1214 SHELL_VAR *v;-
1215-
1216 v = find_variable (name);-
1217 if (v)
vDescription
TRUEnever evaluated
FALSEevaluated 32682 times by 1 test
Evaluated by:
  • Self test
0-32682
1218 return (v);
never executed: return (v);
0
1219 INIT_DYNAMIC_ARRAY_VAR (name, getfunc, setfunc);-
1220 if (attrs)
attrsDescription
TRUEevaluated 27235 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
5447-27235
1221 VSETATTR (v, attrs);
executed 27235 times by 1 test: ((v)->attributes |= (attrs));
Executed by:
  • Self test
27235
1222 return v;
executed 32682 times by 1 test: return v;
Executed by:
  • Self test
32682
1223}-
1224-
1225static SHELL_VAR *-
1226init_dynamic_assoc_var (name, getfunc, setfunc, attrs)-
1227 char *name;-
1228 sh_var_value_func_t *getfunc;-
1229 sh_var_assign_func_t *setfunc;-
1230 int attrs;-
1231{-
1232 SHELL_VAR *v;-
1233-
1234 v = find_variable (name);-
1235 if (v)
vDescription
TRUEnever evaluated
FALSEevaluated 10894 times by 1 test
Evaluated by:
  • Self test
0-10894
1236 return (v);
never executed: return (v);
0
1237 INIT_DYNAMIC_ASSOC_VAR (name, getfunc, setfunc);-
1238 if (attrs)
attrsDescription
TRUEevaluated 10894 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-10894
1239 VSETATTR (v, attrs);
executed 10894 times by 1 test: ((v)->attributes |= (attrs));
Executed by:
  • Self test
10894
1240 return v;
executed 10894 times by 1 test: return v;
Executed by:
  • Self test
10894
1241}-
1242#endif-
1243-
1244/* The value of $SECONDS. This is the number of seconds since shell-
1245 invocation, or, the number of seconds since the last assignment + the-
1246 value of the last assignment. */-
1247static intmax_t seconds_value_assigned;-
1248-
1249static SHELL_VAR *-
1250assign_seconds (self, value, unused, key)-
1251 SHELL_VAR *self;-
1252 char *value;-
1253 arrayind_t unused;-
1254 char *key;-
1255{-
1256 if (legal_number (value, &seconds_value_assigned) == 0)
legal_number (...assigned) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1257 seconds_value_assigned = 0;
never executed: seconds_value_assigned = 0;
0
1258 shell_start_time = NOW;-
1259 return (self);
never executed: return (self);
0
1260}-
1261-
1262static SHELL_VAR *-
1263get_seconds (var)-
1264 SHELL_VAR *var;-
1265{-
1266 time_t time_since_start;-
1267 char *p;-
1268-
1269 time_since_start = NOW - shell_start_time;-
1270 p = itos(seconds_value_assigned + time_since_start);-
1271-
1272 FREE (value_cell (var));
executed 1 time by 1 test: sh_xfree((((var)->value)), "variables.c", 1272);
Executed by:
  • Self test
((var)->value)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1
1273-
1274 VSETATTR (var, att_integer);-
1275 var_setvalue (var, p);-
1276 return (var);
executed 2 times by 1 test: return (var);
Executed by:
  • Self test
2
1277}-
1278-
1279static SHELL_VAR *-
1280init_seconds_var ()-
1281{-
1282 SHELL_VAR *v;-
1283-
1284 v = find_variable ("SECONDS");-
1285 if (v)
vDescription
TRUEnever evaluated
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
0-5447
1286 {-
1287 if (legal_number (value_cell(v), &seconds_value_assigned) == 0)
legal_number (...assigned) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1288 seconds_value_assigned = 0;
never executed: seconds_value_assigned = 0;
0
1289 }
never executed: end of block
0
1290 INIT_DYNAMIC_VAR ("SECONDS", (v ? value_cell (v) : (char *)NULL), get_seconds, assign_seconds);-
1291 return v;
executed 5447 times by 1 test: return v;
Executed by:
  • Self test
5447
1292}-
1293 -
1294/* The random number seed. You can change this by setting RANDOM. */-
1295static unsigned long rseed = 1;-
1296static int last_random_value;-
1297static int seeded_subshell = 0;-
1298-
1299/* A linear congruential random number generator based on the example-
1300 one in the ANSI C standard. This one isn't very good, but a more-
1301 complicated one is overkill. */-
1302-
1303/* Returns a pseudo-random number between 0 and 32767. */-
1304static int-
1305brand ()-
1306{-
1307 /* From "Random number generators: good ones are hard to find",-
1308 Park and Miller, Communications of the ACM, vol. 31, no. 10,-
1309 October 1988, p. 1195. filtered through FreeBSD */-
1310 long h, l;-
1311-
1312 /* Can't seed with 0. */-
1313 if (rseed == 0)
rseed == 0Description
TRUEnever evaluated
FALSEevaluated 20021 times by 1 test
Evaluated by:
  • Self test
0-20021
1314 rseed = 123459876;
never executed: rseed = 123459876;
0
1315 h = rseed / 127773;-
1316 l = rseed % 127773;-
1317 rseed = 16807 * l - 2836 * h;-
1318#if 0-
1319 if (rseed < 0)-
1320 rseed += 0x7fffffff;-
1321#endif-
1322 return ((unsigned int)(rseed & 32767)); /* was % 32768 */
executed 20021 times by 1 test: return ((unsigned int)(rseed & 32767));
Executed by:
  • Self test
20021
1323}-
1324-
1325/* Set the random number generator seed to SEED. */-
1326static void-
1327sbrand (seed)-
1328 unsigned long seed;-
1329{-
1330 rseed = seed;-
1331 last_random_value = 0;-
1332}
executed 5452 times by 1 test: end of block
Executed by:
  • Self test
5452
1333-
1334static void-
1335seedrand ()-
1336{-
1337 struct timeval tv;-
1338-
1339 gettimeofday (&tv, NULL);-
1340 sbrand (tv.tv_sec ^ tv.tv_usec ^ getpid ());-
1341}
executed 5448 times by 1 test: end of block
Executed by:
  • Self test
5448
1342-
1343static SHELL_VAR *-
1344assign_random (self, value, unused, key)-
1345 SHELL_VAR *self;-
1346 char *value;-
1347 arrayind_t unused;-
1348 char *key;-
1349{-
1350 sbrand (strtoul (value, (char **)NULL, 10));-
1351 if (subshell_environment)
subshell_environmentDescription
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
0-4
1352 seeded_subshell = getpid ();
never executed: seeded_subshell = getpid ();
0
1353 return (self);
executed 4 times by 1 test: return (self);
Executed by:
  • Self test
4
1354}-
1355-
1356int-
1357get_random_number ()-
1358{-
1359 int rv, pid;-
1360-
1361 /* Reset for command and process substitution. */-
1362 pid = getpid ();-
1363 if (subshell_environment && seeded_subshell != pid)
subshell_environmentDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 20020 times by 1 test
Evaluated by:
  • Self test
seeded_subshell != pidDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-20020
1364 {-
1365 seedrand ();-
1366 seeded_subshell = pid;-
1367 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
1368-
1369 do-
1370 rv = brand ();
executed 20021 times by 1 test: rv = brand ();
Executed by:
  • Self test
20021
1371 while (rv == last_random_value);
rv == last_random_valueDescription
TRUEnever evaluated
FALSEevaluated 20021 times by 1 test
Evaluated by:
  • Self test
0-20021
1372 return rv;
executed 20021 times by 1 test: return rv;
Executed by:
  • Self test
20021
1373}-
1374-
1375static SHELL_VAR *-
1376get_random (var)-
1377 SHELL_VAR *var;-
1378{-
1379 int rv;-
1380 char *p;-
1381-
1382 rv = get_random_number ();-
1383 last_random_value = rv;-
1384 p = itos (rv);-
1385-
1386 FREE (value_cell (var));
executed 20012 times by 1 test: sh_xfree((((var)->value)), "variables.c", 1386);
Executed by:
  • Self test
((var)->value)Description
TRUEevaluated 20012 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
9-20012
1387-
1388 VSETATTR (var, att_integer);-
1389 var_setvalue (var, p);-
1390 return (var);
executed 20021 times by 1 test: return (var);
Executed by:
  • Self test
20021
1391}-
1392-
1393static SHELL_VAR *-
1394assign_lineno (var, value, unused, key)-
1395 SHELL_VAR *var;-
1396 char *value;-
1397 arrayind_t unused;-
1398 char *key;-
1399{-
1400 intmax_t new_value;-
1401-
1402 if (value == 0 || *value == '\0' || legal_number (value, &new_value) == 0)
value == 0Description
TRUEnever evaluated
FALSEnever evaluated
*value == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
legal_number (...ew_value) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1403 new_value = 0;
never executed: new_value = 0;
0
1404 line_number = line_number_base = new_value;-
1405 return var;
never executed: return var;
0
1406}-
1407-
1408/* Function which returns the current line number. */-
1409static SHELL_VAR *-
1410get_lineno (var)-
1411 SHELL_VAR *var;-
1412{-
1413 char *p;-
1414 int ln;-
1415-
1416 ln = executing_line_number ();-
1417 p = itos (ln);-
1418 FREE (value_cell (var));
executed 2243 times by 1 test: sh_xfree((((var)->value)), "variables.c", 1418);
Executed by:
  • Self test
((var)->value)Description
TRUEevaluated 2243 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31 times by 1 test
Evaluated by:
  • Self test
31-2243
1419 var_setvalue (var, p);-
1420 return (var);
executed 2274 times by 1 test: return (var);
Executed by:
  • Self test
2274
1421}-
1422-
1423static SHELL_VAR *-
1424assign_subshell (var, value, unused, key)-
1425 SHELL_VAR *var;-
1426 char *value;-
1427 arrayind_t unused;-
1428 char *key;-
1429{-
1430 intmax_t new_value;-
1431-
1432 if (value == 0 || *value == '\0' || legal_number (value, &new_value) == 0)
value == 0Description
TRUEnever evaluated
FALSEnever evaluated
*value == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
legal_number (...ew_value) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1433 new_value = 0;
never executed: new_value = 0;
0
1434 subshell_level = new_value;-
1435 return var;
never executed: return var;
0
1436}-
1437-
1438static SHELL_VAR *-
1439get_subshell (var)-
1440 SHELL_VAR *var;-
1441{-
1442 char *p;-
1443-
1444 p = itos (subshell_level);-
1445 FREE (value_cell (var));
executed 1 time by 1 test: sh_xfree((((var)->value)), "variables.c", 1445);
Executed by:
  • Self test
((var)->value)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
1-4
1446 var_setvalue (var, p);-
1447 return (var);
executed 5 times by 1 test: return (var);
Executed by:
  • Self test
5
1448}-
1449-
1450static SHELL_VAR *-
1451get_epochseconds (var)-
1452 SHELL_VAR *var;-
1453{-
1454 intmax_t now;-
1455 char *p;-
1456-
1457 now = NOW;-
1458 p = itos (now);-
1459-
1460 FREE (value_cell (var));
never executed: sh_xfree((((var)->value)), "variables.c", 1460);
((var)->value)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
1461 var_setvalue (var, p);-
1462 return (var);
executed 1 time by 1 test: return (var);
Executed by:
  • Self test
1
1463}-
1464-
1465static SHELL_VAR *-
1466get_epochrealtime (var)-
1467 SHELL_VAR *var;-
1468{-
1469 char buf[32];-
1470 char *p;-
1471 struct timeval tv;-
1472-
1473 gettimeofday (&tv, NULL);-
1474 snprintf (buf, sizeof (buf), "%u%c%06u", (unsigned)tv.tv_sec,-
1475 locale_decpoint (),-
1476 (unsigned)tv.tv_usec);-
1477-
1478 p = savestring (buf);-
1479 FREE (value_cell (var));
executed 1 time by 1 test: sh_xfree((((var)->value)), "variables.c", 1479);
Executed by:
  • Self test
((var)->value)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1
1480 var_setvalue (var, p);-
1481 return (var);
executed 2 times by 1 test: return (var);
Executed by:
  • Self test
2
1482}-
1483-
1484static SHELL_VAR *-
1485get_bashpid (var)-
1486 SHELL_VAR *var;-
1487{-
1488 int pid;-
1489 char *p;-
1490-
1491 pid = getpid ();-
1492 p = itos (pid);-
1493-
1494 FREE (value_cell (var));
executed 1 time by 1 test: sh_xfree((((var)->value)), "variables.c", 1494);
Executed by:
  • Self test
((var)->value)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
1-8
1495 VSETATTR (var, att_integer); /* XXX - was also att_readonly */-
1496 var_setvalue (var, p);-
1497 return (var);
executed 9 times by 1 test: return (var);
Executed by:
  • Self test
9
1498}-
1499-
1500static SHELL_VAR *-
1501get_bash_argv0 (var)-
1502 SHELL_VAR *var;-
1503{-
1504 char *p;-
1505-
1506 p = savestring (dollar_vars[0]);-
1507 FREE (value_cell (var));
never executed: sh_xfree((((var)->value)), "variables.c", 1507);
((var)->value)Description
TRUEnever evaluated
FALSEnever evaluated
0
1508 var_setvalue (var, p);-
1509 return var;
never executed: return var;
0
1510}-
1511-
1512static char *static_shell_name = 0;-
1513-
1514static SHELL_VAR *-
1515assign_bash_argv0 (var, value, unused, key)-
1516 SHELL_VAR *var;-
1517 char *value;-
1518 arrayind_t unused;-
1519 char *key;-
1520{-
1521 size_t vlen;-
1522-
1523 if (value == 0)
value == 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
1524 return var;
never executed: return var;
0
1525-
1526 FREE (dollar_vars[0]);
executed 2 times by 1 test: sh_xfree((dollar_vars[0]), "variables.c", 1526);
Executed by:
  • Self test
dollar_vars[0]Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
1527 dollar_vars[0] = savestring (value);-
1528-
1529 /* Need these gyrations because shell_name isn't dynamically allocated */-
1530 vlen = STRLEN (value);
(value)[1]Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(value)[2]Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(value)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(value)[0]Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
1531 static_shell_name = xrealloc (static_shell_name, vlen + 1);-
1532 strcpy (static_shell_name, value);-
1533 -
1534 shell_name = static_shell_name;-
1535 return var;
executed 2 times by 1 test: return var;
Executed by:
  • Self test
2
1536}-
1537 -
1538static SHELL_VAR *-
1539get_bash_command (var)-
1540 SHELL_VAR *var;-
1541{-
1542 char *p;-
1543-
1544 if (the_printed_command_except_trap)
the_printed_co...nd_except_trapDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1
1545 p = savestring (the_printed_command_except_trap);
executed 1 time by 1 test: p = (char *)strcpy (sh_xmalloc((1 + strlen (the_printed_command_except_trap)), "variables.c", 1545), (the_printed_command_except_trap));
Executed by:
  • Self test
1
1546 else-
1547 {-
1548 p = (char *)xmalloc (1);-
1549 p[0] = '\0';-
1550 }
never executed: end of block
0
1551 FREE (value_cell (var));
never executed: sh_xfree((((var)->value)), "variables.c", 1551);
((var)->value)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
1552 var_setvalue (var, p);-
1553 return (var);
executed 1 time by 1 test: return (var);
Executed by:
  • Self test
1
1554}-
1555-
1556#if defined (HISTORY)-
1557static SHELL_VAR *-
1558get_histcmd (var)-
1559 SHELL_VAR *var;-
1560{-
1561 char *p;-
1562-
1563 p = itos (history_number ());-
1564 FREE (value_cell (var));
never executed: sh_xfree((((var)->value)), "variables.c", 1564);
((var)->value)Description
TRUEnever evaluated
FALSEnever evaluated
0
1565 var_setvalue (var, p);-
1566 return (var);
never executed: return (var);
0
1567}-
1568#endif-
1569-
1570#if defined (READLINE)-
1571/* When this function returns, VAR->value points to malloced memory. */-
1572static SHELL_VAR *-
1573get_comp_wordbreaks (var)-
1574 SHELL_VAR *var;-
1575{-
1576 /* If we don't have anything yet, assign a default value. */-
1577 if (rl_completer_word_break_characters == 0 && bash_readline_initialized == 0)
rl_completer_w...haracters == 0Description
TRUEnever evaluated
FALSEnever evaluated
bash_readline_initialized == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1578 enable_hostname_completion (perform_hostname_completion);
never executed: enable_hostname_completion (perform_hostname_completion);
0
1579-
1580 FREE (value_cell (var));
never executed: sh_xfree((((var)->value)), "variables.c", 1580);
((var)->value)Description
TRUEnever evaluated
FALSEnever evaluated
0
1581 var_setvalue (var, savestring (rl_completer_word_break_characters));-
1582-
1583 return (var);
never executed: return (var);
0
1584}-
1585-
1586/* When this function returns, rl_completer_word_break_characters points to-
1587 malloced memory. */-
1588static SHELL_VAR *-
1589assign_comp_wordbreaks (self, value, unused, key)-
1590 SHELL_VAR *self;-
1591 char *value;-
1592 arrayind_t unused;-
1593 char *key;-
1594{-
1595 if (rl_completer_word_break_characters &&
rl_completer_w...eak_charactersDescription
TRUEnever evaluated
FALSEnever evaluated
0
1596 rl_completer_word_break_characters != rl_basic_word_break_characters)
rl_completer_w...eak_charactersDescription
TRUEnever evaluated
FALSEnever evaluated
0
1597 free (rl_completer_word_break_characters);
never executed: sh_xfree((rl_completer_word_break_characters), "variables.c", 1597);
0
1598-
1599 rl_completer_word_break_characters = savestring (value);-
1600 return self;
never executed: return self;
0
1601}-
1602#endif /* READLINE */-
1603-
1604#if defined (PUSHD_AND_POPD) && defined (ARRAY_VARS)-
1605static SHELL_VAR *-
1606assign_dirstack (self, value, ind, key)-
1607 SHELL_VAR *self;-
1608 char *value;-
1609 arrayind_t ind;-
1610 char *key;-
1611{-
1612 set_dirstack_element (ind, 1, value);-
1613 return self;
executed 1 time by 1 test: return self;
Executed by:
  • Self test
1
1614}-
1615-
1616static SHELL_VAR *-
1617get_dirstack (self)-
1618 SHELL_VAR *self;-
1619{-
1620 ARRAY *a;-
1621 WORD_LIST *l;-
1622-
1623 l = get_directory_stack (0);-
1624 a = array_from_word_list (l);-
1625 array_dispose (array_cell (self));-
1626 dispose_words (l);-
1627 var_setarray (self, a);-
1628 return self;
executed 27 times by 1 test: return self;
Executed by:
  • Self test
27
1629}-
1630#endif /* PUSHD AND POPD && ARRAY_VARS */-
1631-
1632#if defined (ARRAY_VARS)-
1633/* We don't want to initialize the group set with a call to getgroups()-
1634 unless we're asked to, but we only want to do it once. */-
1635static SHELL_VAR *-
1636get_groupset (self)-
1637 SHELL_VAR *self;-
1638{-
1639 register int i;-
1640 int ng;-
1641 ARRAY *a;-
1642 static char **group_set = (char **)NULL;-
1643-
1644 if (group_set == 0)
group_set == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
1-5
1645 {-
1646 group_set = get_group_list (&ng);-
1647 a = array_cell (self);-
1648 for (i = 0; i < ng; i++)
i < ngDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-11
1649 array_insert (a, i, group_set[i]);
executed 11 times by 1 test: array_insert (a, i, group_set[i]);
Executed by:
  • Self test
11
1650 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
1651 return (self);
executed 6 times by 1 test: return (self);
Executed by:
  • Self test
6
1652}-
1653-
1654static SHELL_VAR *-
1655build_hashcmd (self)-
1656 SHELL_VAR *self;-
1657{-
1658 HASH_TABLE *h;-
1659 int i;-
1660 char *k, *v;-
1661 BUCKET_CONTENTS *item;-
1662-
1663 h = assoc_cell (self);-
1664 if (h)
hDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-10
1665 assoc_dispose (h);
executed 10 times by 1 test: assoc_dispose (h);
Executed by:
  • Self test
10
1666-
1667 if (hashed_filenames == 0 || HASH_ENTRIES (hashed_filenames) == 0)
(hashed_filenames)Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
hashed_filenames == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
((hashed_filen...ries : 0) == 0Description
TRUEnever evaluated
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
0-10
1668 {-
1669 var_setvalue (self, (char *)NULL);-
1670 return self;
executed 2 times by 1 test: return self;
Executed by:
  • Self test
2
1671 }-
1672-
1673 h = assoc_create (hashed_filenames->nbuckets);-
1674 for (i = 0; i < hashed_filenames->nbuckets; i++)
i < hashed_filenames->nbucketsDescription
TRUEevaluated 640 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
10-640
1675 {-
1676 for (item = hash_items (i, hashed_filenames); item; item = item->next)
itemDescription
TRUEevaluated 30 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 640 times by 1 test
Evaluated by:
  • Self test
30-640
1677 {-
1678 k = savestring (item->key);-
1679 v = pathdata(item)->path;-
1680 assoc_insert (h, k, v);-
1681 }
executed 30 times by 1 test: end of block
Executed by:
  • Self test
30
1682 }
executed 640 times by 1 test: end of block
Executed by:
  • Self test
640
1683-
1684 var_setvalue (self, (char *)h);-
1685 return self;
executed 10 times by 1 test: return self;
Executed by:
  • Self test
10
1686}-
1687-
1688static SHELL_VAR *-
1689get_hashcmd (self)-
1690 SHELL_VAR *self;-
1691{-
1692 build_hashcmd (self);-
1693 return (self);
executed 10 times by 1 test: return (self);
Executed by:
  • Self test
10
1694}-
1695-
1696static SHELL_VAR *-
1697assign_hashcmd (self, value, ind, key)-
1698 SHELL_VAR *self;-
1699 char *value;-
1700 arrayind_t ind;-
1701 char *key;-
1702{-
1703#if defined (RESTRICTED_SHELL)-
1704 char *full_path;-
1705-
1706 if (restricted)
restrictedDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
1707 {-
1708 if (strchr (value, '/'))
(__extension__...alue , '/' )))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( '/' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_con...nt_p ( value )Description
TRUEnever evaluated
FALSEnever evaluated
( '/' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
1709 {-
1710 sh_restricted (value);-
1711 return (SHELL_VAR *)NULL;
never executed: return (SHELL_VAR *) ((void *)0) ;
0
1712 }-
1713 /* If we are changing the hash table in a restricted shell, make sure the-
1714 target pathname can be found using a $PATH search. */-
1715 full_path = find_user_command (value);-
1716 if (full_path == 0 || *full_path == 0 || executable_file (full_path) == 0)
full_path == 0Description
TRUEnever evaluated
FALSEnever evaluated
*full_path == 0Description
TRUEnever evaluated
FALSEnever evaluated
executable_fil...ull_path) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1717 {-
1718 sh_notfound (value);-
1719 free (full_path);-
1720 return ((SHELL_VAR *)NULL);
never executed: return ((SHELL_VAR *) ((void *)0) );
0
1721 }-
1722 free (full_path);-
1723 }
never executed: end of block
0
1724#endif-
1725 phash_insert (key, value, 0, 0);-
1726 return (build_hashcmd (self));
executed 2 times by 1 test: return (build_hashcmd (self));
Executed by:
  • Self test
2
1727}-
1728-
1729#if defined (ALIAS)-
1730static SHELL_VAR *-
1731build_aliasvar (self)-
1732 SHELL_VAR *self;-
1733{-
1734 HASH_TABLE *h;-
1735 int i;-
1736 char *k, *v;-
1737 BUCKET_CONTENTS *item;-
1738-
1739 h = assoc_cell (self);-
1740 if (h)
hDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-10
1741 assoc_dispose (h);
executed 10 times by 1 test: assoc_dispose (h);
Executed by:
  • Self test
10
1742-
1743 if (aliases == 0 || HASH_ENTRIES (aliases) == 0)
(aliases)Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
aliases == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
((aliases) ? (...ries : 0) == 0Description
TRUEnever evaluated
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
0-10
1744 {-
1745 var_setvalue (self, (char *)NULL);-
1746 return self;
executed 2 times by 1 test: return self;
Executed by:
  • Self test
2
1747 }-
1748-
1749 h = assoc_create (aliases->nbuckets);-
1750 for (i = 0; i < aliases->nbuckets; i++)
i < aliases->nbucketsDescription
TRUEevaluated 640 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
10-640
1751 {-
1752 for (item = hash_items (i, aliases); item; item = item->next)
itemDescription
TRUEevaluated 30 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 640 times by 1 test
Evaluated by:
  • Self test
30-640
1753 {-
1754 k = savestring (item->key);-
1755 v = ((alias_t *)(item->data))->value;-
1756 assoc_insert (h, k, v);-
1757 }
executed 30 times by 1 test: end of block
Executed by:
  • Self test
30
1758 }
executed 640 times by 1 test: end of block
Executed by:
  • Self test
640
1759-
1760 var_setvalue (self, (char *)h);-
1761 return self;
executed 10 times by 1 test: return self;
Executed by:
  • Self test
10
1762}-
1763-
1764static SHELL_VAR *-
1765get_aliasvar (self)-
1766 SHELL_VAR *self;-
1767{-
1768 build_aliasvar (self);-
1769 return (self);
executed 10 times by 1 test: return (self);
Executed by:
  • Self test
10
1770}-
1771-
1772static SHELL_VAR *-
1773assign_aliasvar (self, value, ind, key)-
1774 SHELL_VAR *self;-
1775 char *value;-
1776 arrayind_t ind;-
1777 char *key;-
1778{-
1779 add_alias (key, value);-
1780 return (build_aliasvar (self));
executed 2 times by 1 test: return (build_aliasvar (self));
Executed by:
  • Self test
2
1781}-
1782#endif /* ALIAS */-
1783-
1784#endif /* ARRAY_VARS */-
1785-
1786/* If ARRAY_VARS is not defined, this just returns the name of any-
1787 currently-executing function. If we have arrays, it's a call stack. */-
1788static SHELL_VAR *-
1789get_funcname (self)-
1790 SHELL_VAR *self;-
1791{-
1792#if ! defined (ARRAY_VARS)-
1793 char *t;-
1794 if (variable_context && this_shell_function)-
1795 {-
1796 FREE (value_cell (self));-
1797 t = savestring (this_shell_function->name);-
1798 var_setvalue (self, t);-
1799 }-
1800#endif-
1801 return (self);
executed 6553497 times by 1 test: return (self);
Executed by:
  • Self test
6553497
1802}-
1803-
1804void-
1805make_funcname_visible (on_or_off)-
1806 int on_or_off;-
1807{-
1808 SHELL_VAR *v;-
1809-
1810 v = find_variable ("FUNCNAME");-
1811 if (v == 0 || v->dynamic_value == 0)
v == 0Description
TRUEnever evaluated
FALSEevaluated 3264159 times by 1 test
Evaluated by:
  • Self test
v->dynamic_value == 0Description
TRUEnever evaluated
FALSEevaluated 3264159 times by 1 test
Evaluated by:
  • Self test
0-3264159
1812 return;
never executed: return;
0
1813-
1814 if (on_or_off)
on_or_offDescription
TRUEevaluated 1640471 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1623688 times by 1 test
Evaluated by:
  • Self test
1623688-1640471
1815 VUNSETATTR (v, att_invisible);
executed 1640471 times by 1 test: ((v)->attributes &= ~(0x0001000));
Executed by:
  • Self test
1640471
1816 else-
1817 VSETATTR (v, att_invisible);
executed 1623688 times by 1 test: ((v)->attributes |= (0x0001000));
Executed by:
  • Self test
1623688
1818}-
1819-
1820static SHELL_VAR *-
1821init_funcname_var ()-
1822{-
1823 SHELL_VAR *v;-
1824-
1825 v = find_variable ("FUNCNAME");-
1826 if (v)
vDescription
TRUEnever evaluated
FALSEevaluated 5447 times by 1 test
Evaluated by:
  • Self test
0-5447
1827 return v;
never executed: return v;
0
1828#if defined (ARRAY_VARS)-
1829 INIT_DYNAMIC_ARRAY_VAR ("FUNCNAME", get_funcname, null_array_assign);-
1830#else-
1831 INIT_DYNAMIC_VAR ("FUNCNAME", (char *)NULL, get_funcname, null_assign);-
1832#endif-
1833 VSETATTR (v, att_invisible|att_noassign);-
1834 return v;
executed 5447 times by 1 test: return v;
Executed by:
  • Self test
5447
1835}-
1836-
1837static void-
1838initialize_dynamic_variables ()-
1839{-
1840 SHELL_VAR *v;-
1841-
1842 v = init_seconds_var ();-
1843-
1844 INIT_DYNAMIC_VAR ("BASH_ARGV0", (char *)NULL, get_bash_argv0, assign_bash_argv0);-
1845-
1846 INIT_DYNAMIC_VAR ("BASH_COMMAND", (char *)NULL, get_bash_command, (sh_var_assign_func_t *)NULL);-
1847 INIT_DYNAMIC_VAR ("BASH_SUBSHELL", (char *)NULL, get_subshell, assign_subshell);-
1848-
1849 INIT_DYNAMIC_VAR ("RANDOM", (char *)NULL, get_random, assign_random);-
1850 VSETATTR (v, att_integer);-
1851 INIT_DYNAMIC_VAR ("LINENO", (char *)NULL, get_lineno, assign_lineno);-
1852 VSETATTR (v, att_integer|att_regenerate);-
1853-
1854 INIT_DYNAMIC_VAR ("BASHPID", (char *)NULL, get_bashpid, null_assign);-
1855 VSETATTR (v, att_integer);-
1856-
1857 INIT_DYNAMIC_VAR ("EPOCHSECONDS", (char *)NULL, get_epochseconds, null_assign);-
1858 VSETATTR (v, att_regenerate);-
1859 INIT_DYNAMIC_VAR ("EPOCHREALTIME", (char *)NULL, get_epochrealtime, null_assign);-
1860 VSETATTR (v, att_regenerate);-
1861-
1862#if defined (HISTORY)-
1863 INIT_DYNAMIC_VAR ("HISTCMD", (char *)NULL, get_histcmd, (sh_var_assign_func_t *)NULL);-
1864 VSETATTR (v, att_integer);-
1865#endif-
1866-
1867#if defined (READLINE)-
1868 INIT_DYNAMIC_VAR ("COMP_WORDBREAKS", (char *)NULL, get_comp_wordbreaks, assign_comp_wordbreaks);-
1869#endif-
1870-
1871#if defined (PUSHD_AND_POPD) && defined (ARRAY_VARS)-
1872 v = init_dynamic_array_var ("DIRSTACK", get_dirstack, assign_dirstack, 0);-
1873#endif /* PUSHD_AND_POPD && ARRAY_VARS */-
1874-
1875#if defined (ARRAY_VARS)-
1876 v = init_dynamic_array_var ("GROUPS", get_groupset, null_array_assign, att_noassign);-
1877-
1878# if defined (DEBUGGER)-
1879 v = init_dynamic_array_var ("BASH_ARGC", get_self, null_array_assign, att_noassign|att_nounset);-
1880 v = init_dynamic_array_var ("BASH_ARGV", get_self, null_array_assign, att_noassign|att_nounset);-
1881# endif /* DEBUGGER */-
1882 v = init_dynamic_array_var ("BASH_SOURCE", get_self, null_array_assign, att_noassign|att_nounset);-
1883 v = init_dynamic_array_var ("BASH_LINENO", get_self, null_array_assign, att_noassign|att_nounset);-
1884-
1885 v = init_dynamic_assoc_var ("BASH_CMDS", get_hashcmd, assign_hashcmd, att_nofree);-
1886# if defined (ALIAS)-
1887 v = init_dynamic_assoc_var ("BASH_ALIASES", get_aliasvar, assign_aliasvar, att_nofree);-
1888# endif-
1889#endif-
1890-
1891 v = init_funcname_var ();-
1892}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
1893-
1894/* **************************************************************** */-
1895/* */-
1896/* Retrieving variables and values */-
1897/* */-
1898/* **************************************************************** */-
1899-
1900/* How to get a pointer to the shell variable or function named NAME.-
1901 HASHED_VARS is a pointer to the hash table containing the list-
1902 of interest (either variables or functions). */-
1903-
1904static SHELL_VAR *-
1905hash_lookup (name, hashed_vars)-
1906 const char *name;-
1907 HASH_TABLE *hashed_vars;-
1908{-
1909 BUCKET_CONTENTS *bucket;-
1910-
1911 bucket = hash_search (name, hashed_vars, 0);-
1912 /* If we find the name in HASHED_VARS, set LAST_TABLE_SEARCHED to that-
1913 table. */-
1914 if (bucket)
bucketDescription
TRUEevaluated 317768149 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 290516185 times by 1 test
Evaluated by:
  • Self test
290516185-317768149
1915 last_table_searched = hashed_vars;
executed 317768149 times by 1 test: last_table_searched = hashed_vars;
Executed by:
  • Self test
317768149
1916 return (bucket ? (SHELL_VAR *)bucket->data : (SHELL_VAR *)NULL);
executed 608284334 times by 1 test: return (bucket ? (SHELL_VAR *)bucket->data : (SHELL_VAR *) ((void *)0) );
Executed by:
  • Self test
608284334
1917}-
1918-
1919SHELL_VAR *-
1920var_lookup (name, vcontext)-
1921 const char *name;-
1922 VAR_CONTEXT *vcontext;-
1923{-
1924 VAR_CONTEXT *vc;-
1925 SHELL_VAR *v;-
1926-
1927 v = (SHELL_VAR *)NULL;-
1928 for (vc = vcontext; vc; vc = vc->down)
vcDescription
TRUEevaluated 352391221 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1646277 times by 1 test
Evaluated by:
  • Self test
1646277-352391221
1929 if (v = hash_lookup (name, vc->table))
v = hash_looku...me, vc->table)Description
TRUEevaluated 199428273 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 152962948 times by 1 test
Evaluated by:
  • Self test
152962948-199428273
1930 break;
executed 199428273 times by 1 test: break;
Executed by:
  • Self test
199428273
1931-
1932 return v;
executed 201074550 times by 1 test: return v;
Executed by:
  • Self test
201074550
1933}-
1934-
1935/* Look up the variable entry named NAME. If SEARCH_TEMPENV is non-zero,-
1936 then also search the temporarily built list of exported variables.-
1937 The lookup order is:-
1938 temporary_env-
1939 shell_variables list-
1940*/-
1941-
1942SHELL_VAR *-
1943find_variable_internal (name, flags)-
1944 const char *name;-
1945 int flags;-
1946{-
1947 SHELL_VAR *var;-
1948 int search_tempenv, force_tempenv;-
1949 VAR_CONTEXT *vc;-
1950-
1951 var = (SHELL_VAR *)NULL;-
1952-
1953 force_tempenv = (flags & FV_FORCETEMPENV);-
1954-
1955 /* If explicitly requested, first look in the temporary environment for-
1956 the variable. This allows constructs such as "foo=x eval 'echo $foo'"-
1957 to get the `exported' value of $foo. This happens if we are executing-
1958 a function or builtin, or if we are looking up a variable in a-
1959 "subshell environment". */-
1960 search_tempenv = force_tempenv || (expanding_redir == 0 && subshell_environment);
force_tempenvDescription
TRUEevaluated 36498286 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 164543196 times by 1 test
Evaluated by:
  • Self test
expanding_redir == 0Description
TRUEevaluated 162551006 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1992190 times by 1 test
Evaluated by:
  • Self test
subshell_environmentDescription
TRUEevaluated 56514 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 162494492 times by 1 test
Evaluated by:
  • Self test
56514-164543196
1961-
1962 if (search_tempenv && temporary_env)
search_tempenvDescription
TRUEevaluated 36554800 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 164486682 times by 1 test
Evaluated by:
  • Self test
temporary_envDescription
TRUEevaluated 6885 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 36547915 times by 1 test
Evaluated by:
  • Self test
6885-164486682
1963 var = hash_lookup (name, temporary_env);
executed 6885 times by 1 test: var = hash_lookup (name, temporary_env);
Executed by:
  • Self test
6885
1964-
1965 if (var == 0)
var == 0Description
TRUEevaluated 201038167 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3315 times by 1 test
Evaluated by:
  • Self test
3315-201038167
1966 {-
1967 if ((flags & FV_SKIPINVISIBLE) == 0)
(flags & 0x02) == 0Description
TRUEevaluated 201038167 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-201038167
1968 var = var_lookup (name, shell_variables);
executed 201038167 times by 1 test: var = var_lookup (name, shell_variables);
Executed by:
  • Self test
201038167
1969 else-
1970 {-
1971 /* essentially var_lookup expanded inline so we can check for-
1972 att_invisible */-
1973 for (vc = shell_variables; vc; vc = vc->down)
vcDescription
TRUEnever evaluated
FALSEnever evaluated
0
1974 {-
1975 var = hash_lookup (name, vc->table);-
1976 if (var && invisible_p (var))
varDescription
TRUEnever evaluated
FALSEnever evaluated
((((var)->attr... (0x0001000)))Description
TRUEnever evaluated
FALSEnever evaluated
0
1977 var = 0;
never executed: var = 0;
0
1978 if (var)
varDescription
TRUEnever evaluated
FALSEnever evaluated
0
1979 break;
never executed: break;
0
1980 }
never executed: end of block
0
1981 }
never executed: end of block
0
1982 }-
1983-
1984 if (var == 0)
var == 0Description
TRUEevaluated 1627791 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 199413691 times by 1 test
Evaluated by:
  • Self test
1627791-199413691
1985 return ((SHELL_VAR *)NULL);
executed 1627791 times by 1 test: return ((SHELL_VAR *) ((void *)0) );
Executed by:
  • Self test
1627791
1986-
1987 return (var->dynamic_value ? (*(var->dynamic_value)) (var) : var);
executed 199413691 times by 1 test: return (var->dynamic_value ? (*(var->dynamic_value)) (var) : var);
Executed by:
  • Self test
199413691
1988}-
1989-
1990/* Look up and resolve the chain of nameref variables starting at V all the-
1991 way to NULL or non-nameref. */-
1992SHELL_VAR *-
1993find_variable_nameref (v)-
1994 SHELL_VAR *v;-
1995{-
1996 int level, flags;-
1997 char *newname;-
1998 SHELL_VAR *orig, *oldv;-
1999-
2000 level = 0;-
2001 orig = v;-
2002 while (v && nameref_p (v))
vDescription
TRUEevaluated 480 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 83 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000800)))Description
TRUEevaluated 331 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 149 times by 1 test
Evaluated by:
  • Self test
83-480
2003 {-
2004 level++;-
2005 if (level > NAMEREF_MAX)
level > 8Description
TRUEnever evaluated
FALSEevaluated 331 times by 1 test
Evaluated by:
  • Self test
0-331
2006 return ((SHELL_VAR *)0); /* error message here? */
never executed: return ((SHELL_VAR *)0);
0
2007 newname = nameref_cell (v);-
2008 if (newname == 0 || *newname == '\0')
newname == 0Description
TRUEevaluated 82 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 249 times by 1 test
Evaluated by:
  • Self test
*newname == '\0'Description
TRUEnever evaluated
FALSEevaluated 249 times by 1 test
Evaluated by:
  • Self test
0-249
2009 return ((SHELL_VAR *)0);
executed 82 times by 1 test: return ((SHELL_VAR *)0);
Executed by:
  • Self test
82
2010 oldv = v;-
2011 flags = 0;-
2012 if (expanding_redir == 0 && (assigning_in_environment || executing_builtin))
expanding_redir == 0Description
TRUEevaluated 249 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
assigning_in_environmentDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 232 times by 1 test
Evaluated by:
  • Self test
executing_builtinDescription
TRUEevaluated 59 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 173 times by 1 test
Evaluated by:
  • Self test
0-249
2013 flags |= FV_FORCETEMPENV;
executed 76 times by 1 test: flags |= 0x01;
Executed by:
  • Self test
76
2014 /* We don't handle array subscripts here. */-
2015 v = find_variable_internal (newname, flags);-
2016 if (v == orig || v == oldv)
v == origDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 245 times by 1 test
Evaluated by:
  • Self test
v == oldvDescription
TRUEnever evaluated
FALSEevaluated 245 times by 1 test
Evaluated by:
  • Self test
0-245
2017 {-
2018 internal_warning (_("%s: circular name reference"), orig->name);-
2019#if 1-
2020 /* XXX - provisional change - bash-5.0 - circular refs go to-
2021 global scope for resolution, without namerefs. */-
2022 if (variable_context && v->context)
variable_contextDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
v->contextDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
2023 return (find_global_variable_noref (v->name));
executed 2 times by 1 test: return (find_global_variable_noref (v->name));
Executed by:
  • Self test
2
2024 else-
2025#endif-
2026 return ((SHELL_VAR *)0);
executed 2 times by 1 test: return ((SHELL_VAR *)0);
Executed by:
  • Self test
2
2027 }-
2028 }
executed 245 times by 1 test: end of block
Executed by:
  • Self test
245
2029 return v;
executed 232 times by 1 test: return v;
Executed by:
  • Self test
232
2030}-
2031-
2032/* Resolve the chain of nameref variables for NAME. XXX - could change later */-
2033SHELL_VAR *-
2034find_variable_last_nameref (name, vflags)-
2035 const char *name;-
2036 int vflags;-
2037{-
2038 SHELL_VAR *v, *nv;-
2039 char *newname;-
2040 int level, flags;-
2041-
2042 nv = v = find_variable_noref (name);-
2043 level = 0;-
2044 while (v && nameref_p (v))
vDescription
TRUEevaluated 5444914 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 24801 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000800)))Description
TRUEevaluated 341 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5444573 times by 1 test
Evaluated by:
  • Self test
341-5444914
2045 {-
2046 level++;-
2047 if (level > NAMEREF_MAX)
level > 8Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 338 times by 1 test
Evaluated by:
  • Self test
3-338
2048 return ((SHELL_VAR *)0); /* error message here? */
executed 3 times by 1 test: return ((SHELL_VAR *)0);
Executed by:
  • Self test
3
2049 newname = nameref_cell (v);-
2050 if (newname == 0 || *newname == '\0')
newname == 0Description
TRUEevaluated 128 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 210 times by 1 test
Evaluated by:
  • Self test
*newname == '\0'Description
TRUEnever evaluated
FALSEevaluated 210 times by 1 test
Evaluated by:
  • Self test
0-210
2051 return ((vflags && invisible_p (v)) ? v : (SHELL_VAR *)0);
executed 128 times by 1 test: return ((vflags && ((((v)->attributes) & (0x0001000)))) ? v : (SHELL_VAR *)0);
Executed by:
  • Self test
128
2052 nv = v;-
2053 flags = 0;-
2054 if (expanding_redir == 0 && (assigning_in_environment || executing_builtin))
expanding_redir == 0Description
TRUEevaluated 210 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
assigning_in_environmentDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 209 times by 1 test
Evaluated by:
  • Self test
executing_builtinDescription
TRUEevaluated 108 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 101 times by 1 test
Evaluated by:
  • Self test
0-210
2055 flags |= FV_FORCETEMPENV;
executed 109 times by 1 test: flags |= 0x01;
Executed by:
  • Self test
109
2056 /* We don't accommodate array subscripts here. */-
2057 v = find_variable_internal (newname, flags);-
2058 }
executed 210 times by 1 test: end of block
Executed by:
  • Self test
210
2059 return nv;
executed 5469374 times by 1 test: return nv;
Executed by:
  • Self test
5469374
2060}-
2061-
2062/* Resolve the chain of nameref variables for NAME. XXX - could change later */-
2063SHELL_VAR *-
2064find_global_variable_last_nameref (name, vflags)-
2065 const char *name;-
2066 int vflags;-
2067{-
2068 SHELL_VAR *v, *nv;-
2069 char *newname;-
2070 int level;-
2071-
2072 nv = v = find_global_variable_noref (name);-
2073 level = 0;-
2074 while (v && nameref_p (v))
vDescription
TRUEevaluated 28 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000800)))Description
TRUEnever evaluated
FALSEevaluated 28 times by 1 test
Evaluated by:
  • Self test
0-28
2075 {-
2076 level++;-
2077 if (level > NAMEREF_MAX)
level > 8Description
TRUEnever evaluated
FALSEnever evaluated
0
2078 return ((SHELL_VAR *)0); /* error message here? */
never executed: return ((SHELL_VAR *)0);
0
2079 newname = nameref_cell (v);-
2080 if (newname == 0 || *newname == '\0')
newname == 0Description
TRUEnever evaluated
FALSEnever evaluated
*newname == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
2081 return ((vflags && invisible_p (v)) ? v : (SHELL_VAR *)0);
never executed: return ((vflags && ((((v)->attributes) & (0x0001000)))) ? v : (SHELL_VAR *)0);
0
2082 nv = v;-
2083 /* We don't accommodate array subscripts here. */-
2084 v = find_global_variable_noref (newname);-
2085 }
never executed: end of block
0
2086 return nv;
executed 46 times by 1 test: return nv;
Executed by:
  • Self test
46
2087}-
2088-
2089static SHELL_VAR *-
2090find_nameref_at_context (v, vc)-
2091 SHELL_VAR *v;-
2092 VAR_CONTEXT *vc;-
2093{-
2094 SHELL_VAR *nv, *nv2;-
2095 char *newname;-
2096 int level;-
2097-
2098 nv = v;-
2099 level = 1;-
2100 while (nv && nameref_p (nv))
nvDescription
TRUEevaluated 98 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
((((nv)->attri... (0x0000800)))Description
TRUEevaluated 93 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
0-98
2101 {-
2102 level++;-
2103 if (level > NAMEREF_MAX)
level > 8Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 87 times by 1 test
Evaluated by:
  • Self test
6-87
2104 return (&nameref_maxloop_value);
executed 6 times by 1 test: return (&nameref_maxloop_value);
Executed by:
  • Self test
6
2105 newname = nameref_cell (nv);-
2106 if (newname == 0 || *newname == '\0')
newname == 0Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 71 times by 1 test
Evaluated by:
  • Self test
*newname == '\0'Description
TRUEnever evaluated
FALSEevaluated 71 times by 1 test
Evaluated by:
  • Self test
0-71
2107 return ((SHELL_VAR *)NULL);
executed 16 times by 1 test: return ((SHELL_VAR *) ((void *)0) );
Executed by:
  • Self test
16
2108 nv2 = hash_lookup (newname, vc->table);-
2109 if (nv2 == 0)
nv2 == 0Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 47 times by 1 test
Evaluated by:
  • Self test
24-47
2110 break;
executed 24 times by 1 test: break;
Executed by:
  • Self test
24
2111 nv = nv2;-
2112 }
executed 47 times by 1 test: end of block
Executed by:
  • Self test
47
2113 return nv;
executed 29 times by 1 test: return nv;
Executed by:
  • Self test
29
2114}-
2115