OpenCoverage

execute_cmd.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/execute_cmd.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* execute_cmd.c -- Execute a COMMAND structure. */-
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#if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)-
24 #pragma alloca-
25#endif /* _AIX && RISC6000 && !__GNUC__ */-
26-
27#include <stdio.h>-
28#include "chartypes.h"-
29#include "bashtypes.h"-
30#if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)-
31# include <sys/file.h>-
32#endif-
33#include "filecntl.h"-
34#include "posixstat.h"-
35#include <signal.h>-
36#if defined (HAVE_SYS_PARAM_H)-
37# include <sys/param.h>-
38#endif-
39-
40#if defined (HAVE_UNISTD_H)-
41# include <unistd.h>-
42#endif-
43-
44#include "posixtime.h"-
45-
46#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)-
47# include <sys/resource.h>-
48#endif-
49-
50#if defined (HAVE_SYS_TIMES_H) && defined (HAVE_TIMES)-
51# include <sys/times.h>-
52#endif-
53-
54#include <errno.h>-
55-
56#if !defined (errno)-
57extern int errno;-
58#endif-
59-
60#define NEED_FPURGE_DECL-
61#define NEED_SH_SETLINEBUF_DECL-
62-
63#include "bashansi.h"-
64#include "bashintl.h"-
65-
66#include "memalloc.h"-
67#include "shell.h"-
68#include <y.tab.h> /* use <...> so we pick it up from the build directory */-
69#include "parser.h"-
70#include "flags.h"-
71#include "builtins.h"-
72#include "hashlib.h"-
73#include "jobs.h"-
74#include "execute_cmd.h"-
75#include "findcmd.h"-
76#include "redir.h"-
77#include "trap.h"-
78#include "pathexp.h"-
79#include "hashcmd.h"-
80-
81#if defined (COND_COMMAND)-
82# include "test.h"-
83#endif-
84-
85#include "builtins/common.h"-
86#include "builtins/builtext.h" /* list of builtins */-
87-
88#include "builtins/getopt.h"-
89-
90#include <glob/strmatch.h>-
91#include <tilde/tilde.h>-
92-
93#if defined (BUFFERED_INPUT)-
94# include "input.h"-
95#endif-
96-
97#if defined (ALIAS)-
98# include "alias.h"-
99#endif-
100-
101#if defined (HISTORY)-
102# include "bashhist.h"-
103#endif-
104-
105#if defined (HAVE_MBSTR_H) && defined (HAVE_MBSCHR)-
106# include <mbstr.h> /* mbschr */-
107#endif-
108-
109extern int command_string_index;-
110extern char *the_printed_command;-
111extern time_t shell_start_time;-
112#if 0-
113extern char *glob_argv_flags;-
114#endif-
115-
116extern int close __P((int));-
117-
118/* Static functions defined and used in this file. */-
119static void close_pipes __P((int, int));-
120static void do_piping __P((int, int));-
121static void bind_lastarg __P((char *));-
122static int shell_control_structure __P((enum command_type));-
123static void cleanup_redirects __P((REDIRECT *));-
124-
125#if defined (JOB_CONTROL)-
126static int restore_signal_mask __P((sigset_t *));-
127#endif-
128-
129static void async_redirect_stdin __P((void));-
130-
131static int builtin_status __P((int));-
132-
133static int execute_for_command __P((FOR_COM *));-
134#if defined (SELECT_COMMAND)-
135static int displen __P((const char *));-
136static int print_index_and_element __P((int, int, WORD_LIST *));-
137static void indent __P((int, int));-
138static void print_select_list __P((WORD_LIST *, int, int, int));-
139static char *select_query __P((WORD_LIST *, int, char *, int));-
140static int execute_select_command __P((SELECT_COM *));-
141#endif-
142#if defined (DPAREN_ARITHMETIC)-
143static int execute_arith_command __P((ARITH_COM *));-
144#endif-
145#if defined (COND_COMMAND)-
146static int execute_cond_node __P((COND_COM *));-
147static int execute_cond_command __P((COND_COM *));-
148#endif-
149#if defined (COMMAND_TIMING)-
150static int mkfmt __P((char *, int, int, time_t, int));-
151static void print_formatted_time __P((FILE *, char *,-
152 time_t, int, time_t, int,-
153 time_t, int, int));-
154static int time_command __P((COMMAND *, int, int, int, struct fd_bitmap *));-
155#endif-
156#if defined (ARITH_FOR_COMMAND)-
157static intmax_t eval_arith_for_expr __P((WORD_LIST *, int *));-
158static int execute_arith_for_command __P((ARITH_FOR_COM *));-
159#endif-
160static int execute_case_command __P((CASE_COM *));-
161static int execute_while_command __P((WHILE_COM *));-
162static int execute_until_command __P((WHILE_COM *));-
163static int execute_while_or_until __P((WHILE_COM *, int));-
164static int execute_if_command __P((IF_COM *));-
165static int execute_null_command __P((REDIRECT *, int, int, int));-
166static void fix_assignment_words __P((WORD_LIST *));-
167static int execute_simple_command __P((SIMPLE_COM *, int, int, int, struct fd_bitmap *));-
168static int execute_builtin __P((sh_builtin_func_t *, WORD_LIST *, int, int));-
169static int execute_function __P((SHELL_VAR *, WORD_LIST *, int, struct fd_bitmap *, int, int));-
170static int execute_builtin_or_function __P((WORD_LIST *, sh_builtin_func_t *,-
171 SHELL_VAR *,-
172 REDIRECT *, struct fd_bitmap *, int));-
173static void execute_subshell_builtin_or_function __P((WORD_LIST *, REDIRECT *,-
174 sh_builtin_func_t *,-
175 SHELL_VAR *,-
176 int, int, int,-
177 struct fd_bitmap *,-
178 int));-
179static int execute_disk_command __P((WORD_LIST *, REDIRECT *, char *,-
180 int, int, int, struct fd_bitmap *, int));-
181-
182static char *getinterp __P((char *, int, int *));-
183static void initialize_subshell __P((void));-
184static int execute_in_subshell __P((COMMAND *, int, int, int, struct fd_bitmap *));-
185#if defined (COPROCESS_SUPPORT)-
186static void coproc_setstatus __P((struct coproc *, int));-
187static int execute_coproc __P((COMMAND *, int, int, struct fd_bitmap *));-
188#endif-
189-
190static int execute_pipeline __P((COMMAND *, int, int, int, struct fd_bitmap *));-
191-
192static int execute_connection __P((COMMAND *, int, int, int, struct fd_bitmap *));-
193-
194static int execute_intern_function __P((WORD_DESC *, FUNCTION_DEF *));-
195-
196/* Set to 1 if fd 0 was the subject of redirection to a subshell. Global-
197 so that reader_loop can set it to zero before executing a command. */-
198int stdin_redir;-
199-
200/* The name of the command that is currently being executed.-
201 `test' needs this, for example. */-
202char *this_command_name;-
203-
204/* The printed representation of the currently-executing command (same as-
205 the_printed_command), except when a trap is being executed. Useful for-
206 a debugger to know where exactly the program is currently executing. */-
207char *the_printed_command_except_trap;-
208-
209/* For catching RETURN in a function. */-
210int return_catch_flag;-
211int return_catch_value;-
212procenv_t return_catch;-
213-
214/* The value returned by the last synchronous command. */-
215volatile int last_command_exit_value;-
216-
217/* Whether or not the last command (corresponding to last_command_exit_value)-
218 was terminated by a signal, and, if so, which one. */-
219int last_command_exit_signal;-
220-
221/* Are we currently ignoring the -e option for the duration of a builtin's-
222 execution? */-
223int builtin_ignoring_errexit = 0;-
224-
225/* The list of redirections to perform which will undo the redirections-
226 that I made in the shell. */-
227REDIRECT *redirection_undo_list = (REDIRECT *)NULL;-
228-
229/* The list of redirections to perform which will undo the internal-
230 redirections performed by the `exec' builtin. These are redirections-
231 that must be undone even when exec discards redirection_undo_list. */-
232REDIRECT *exec_redirection_undo_list = (REDIRECT *)NULL;-
233-
234/* When greater than zero, value is the `level' of builtins we are-
235 currently executing (e.g. `eval echo a' would have it set to 2). */-
236int executing_builtin = 0;-
237-
238/* Non-zero if we are executing a command list (a;b;c, etc.) */-
239int executing_list = 0;-
240-
241/* Non-zero if failing commands in a command substitution should not exit the-
242 shell even if -e is set. Used to pass the CMD_IGNORE_RETURN flag down to-
243 commands run in command substitutions by parse_and_execute. */-
244int comsub_ignore_return = 0;-
245-
246/* Non-zero if we have just forked and are currently running in a subshell-
247 environment. */-
248int subshell_environment;-
249-
250/* Count of nested subshells, like SHLVL. Available via $BASH_SUBSHELL */-
251int subshell_level = 0;-
252-
253/* Currently-executing shell function. */-
254SHELL_VAR *this_shell_function;-
255-
256/* If non-zero, matches in case and [[ ... ]] are case-insensitive */-
257int match_ignore_case = 0;-
258-
259int executing_command_builtin = 0;-
260-
261struct stat SB; /* used for debugging */-
262-
263static int special_builtin_failed;-
264-
265static COMMAND *currently_executing_command;-
266-
267/* The line number that the currently executing function starts on. */-
268static int function_line_number;-
269-
270/* XXX - set to 1 if we're running the DEBUG trap and we want to show the line-
271 number containing the function name. Used by executing_line_number to-
272 report the correct line number. Kind of a hack. */-
273static int showing_function_line;-
274-
275static int connection_count;-
276-
277/* $LINENO ($BASH_LINENO) for use by an ERR trap. Global so parse_and_execute-
278 can save and restore it. */-
279int line_number_for_err_trap;-
280-
281/* A sort of function nesting level counter */-
282int funcnest = 0;-
283int funcnest_max = 0;-
284-
285int evalnest = 0; /* bash-4.4/bash-5.0 */-
286int evalnest_max = EVALNEST_MAX;-
287-
288int sourcenest = 0;-
289int sourcenest_max = SOURCENEST_MAX;-
290-
291volatile int from_return_trap = 0;-
292-
293int lastpipe_opt = 0;-
294-
295struct fd_bitmap *current_fds_to_close = (struct fd_bitmap *)NULL;-
296-
297#define FD_BITMAP_DEFAULT_SIZE 32-
298-
299/* Functions to allocate and deallocate the structures used to pass-
300 information from the shell to its children about file descriptors-
301 to close. */-
302struct fd_bitmap *-
303new_fd_bitmap (size)-
304 int size;-
305{-
306 struct fd_bitmap *ret;-
307-
308 ret = (struct fd_bitmap *)xmalloc (sizeof (struct fd_bitmap));-
309-
310 ret->size = size;-
311-
312 if (size)
sizeDescription
TRUEevaluated 122425482 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-122425482
313 {-
314 ret->bitmap = (char *)xmalloc (size);-
315 memset (ret->bitmap, '\0', size);-
316 }
executed 122425482 times by 1 test: end of block
Executed by:
  • Self test
122425482
317 else-
318 ret->bitmap = (char *)NULL;
never executed: ret->bitmap = (char *) ((void *)0) ;
0
319 return (ret);
executed 122425482 times by 1 test: return (ret);
Executed by:
  • Self test
122425482
320}-
321-
322void-
323dispose_fd_bitmap (fdbp)-
324 struct fd_bitmap *fdbp;-
325{-
326 FREE (fdbp->bitmap);
executed 122385484 times by 1 test: sh_xfree((fdbp->bitmap), "execute_cmd.c", 326);
Executed by:
  • Self test
fdbp->bitmapDescription
TRUEevaluated 122385484 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-122385484
327 free (fdbp);-
328}
executed 122385484 times by 1 test: end of block
Executed by:
  • Self test
122385484
329-
330void-
331close_fd_bitmap (fdbp)-
332 struct fd_bitmap *fdbp;-
333{-
334 register int i;-
335-
336 if (fdbp)
fdbpDescription
TRUEevaluated 3446 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3446
337 {-
338 for (i = 0; i < fdbp->size; i++)
i < fdbp->sizeDescription
TRUEevaluated 110272 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3446 times by 1 test
Evaluated by:
  • Self test
3446-110272
339 if (fdbp->bitmap[i])
fdbp->bitmap[i]Description
TRUEevaluated 1026 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 109246 times by 1 test
Evaluated by:
  • Self test
1026-109246
340 {-
341 close (i);-
342 fdbp->bitmap[i] = 0;-
343 }
executed 1026 times by 1 test: end of block
Executed by:
  • Self test
1026
344 }
executed 3446 times by 1 test: end of block
Executed by:
  • Self test
3446
345}
executed 3446 times by 1 test: end of block
Executed by:
  • Self test
3446
346-
347/* Return the line number of the currently executing command. */-
348int-
349executing_line_number ()-
350{-
351 if (executing && showing_function_line == 0 &&
executingDescription
TRUEevaluated 1645807 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5434 times by 1 test
Evaluated by:
  • Self test
showing_function_line == 0Description
TRUEevaluated 1645431 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 376 times by 1 test
Evaluated by:
  • Self test
376-1645807
352 (variable_context == 0 || interactive_shell == 0) &&
variable_context == 0Description
TRUEevaluated 3083 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1642348 times by 1 test
Evaluated by:
  • Self test
interactive_shell == 0Description
TRUEevaluated 1642348 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1642348
353 currently_executing_command)
currently_executing_commandDescription
TRUEevaluated 1644947 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 484 times by 1 test
Evaluated by:
  • Self test
484-1644947
354 {-
355#if defined (COND_COMMAND)-
356 if (currently_executing_command->type == cm_cond)
currently_exec...ype == cm_condDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1644946 times by 1 test
Evaluated by:
  • Self test
1-1644946
357 return currently_executing_command->value.Cond->line;
executed 1 time by 1 test: return currently_executing_command->value.Cond->line;
Executed by:
  • Self test
1
358#endif-
359#if defined (DPAREN_ARITHMETIC)-
360 if (currently_executing_command->type == cm_arith)
currently_exec...pe == cm_arithDescription
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1644928 times by 1 test
Evaluated by:
  • Self test
18-1644928
361 return currently_executing_command->value.Arith->line;
executed 18 times by 1 test: return currently_executing_command->value.Arith->line;
Executed by:
  • Self test
18
362#endif-
363#if defined (ARITH_FOR_COMMAND)-
364 if (currently_executing_command->type == cm_arith_for)
currently_exec...= cm_arith_forDescription
TRUEnever evaluated
FALSEevaluated 1644928 times by 1 test
Evaluated by:
  • Self test
0-1644928
365 return currently_executing_command->value.ArithFor->line;
never executed: return currently_executing_command->value.ArithFor->line;
0
366#endif-
367-
368 return line_number;
executed 1644928 times by 1 test: return line_number;
Executed by:
  • Self test
1644928
369 }-
370 else-
371 return line_number;
executed 6294 times by 1 test: return line_number;
Executed by:
  • Self test
6294
372}-
373-
374/* Execute the command passed in COMMAND. COMMAND is exactly what-
375 read_command () places into GLOBAL_COMMAND. See "command.h" for the-
376 details of the command structure.-
377-
378 EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible-
379 return values. Executing a command with nothing in it returns-
380 EXECUTION_SUCCESS. */-
381int-
382execute_command (command)-
383 COMMAND *command;-
384{-
385 struct fd_bitmap *bitmap;-
386 int result;-
387-
388 current_fds_to_close = (struct fd_bitmap *)NULL;-
389 bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);-
390 begin_unwind_frame ("execute-command");-
391 add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);-
392-
393 /* Just do the command, but not asynchronously. */-
394 result = execute_command_internal (command, 0, NO_PIPE, NO_PIPE, bitmap);-
395-
396 dispose_fd_bitmap (bitmap);-
397 discard_unwind_frame ("execute-command");-
398-
399#if defined (PROCESS_SUBSTITUTION)-
400 /* don't unlink fifos if we're in a shell function; wait until the function-
401 returns. */-
402 if (variable_context == 0 && executing_list == 0)
variable_context == 0Description
TRUEevaluated 8640812 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 113709561 times by 1 test
Evaluated by:
  • Self test
executing_list == 0Description
TRUEevaluated 151946 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8488866 times by 1 test
Evaluated by:
  • Self test
151946-113709561
403 unlink_fifo_list ();
executed 151946 times by 1 test: unlink_fifo_list ();
Executed by:
  • Self test
151946
404#endif /* PROCESS_SUBSTITUTION */-
405-
406 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 122350373 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 122350373 times by 1 test
Evaluated by:
  • Self test
0-122350373
407 return (result);
executed 122350373 times by 1 test: return (result);
Executed by:
  • Self test
122350373
408}-
409-
410/* Return 1 if TYPE is a shell control structure type. */-
411static int-
412shell_control_structure (type)-
413 enum command_type type;-
414{-
415 switch (type)-
416 {-
417#if defined (ARITH_FOR_COMMAND)-
418 case cm_arith_for:
executed 5223 times by 1 test: case cm_arith_for:
Executed by:
  • Self test
5223
419#endif-
420#if defined (SELECT_COMMAND)-
421 case cm_select:
executed 18 times by 1 test: case cm_select:
Executed by:
  • Self test
18
422#endif-
423#if defined (DPAREN_ARITHMETIC)-
424 case cm_arith:
executed 12952036 times by 1 test: case cm_arith:
Executed by:
  • Self test
12952036
425#endif-
426#if defined (COND_COMMAND)-
427 case cm_cond:
executed 1260 times by 1 test: case cm_cond:
Executed by:
  • Self test
1260
428#endif-
429 case cm_case:
executed 73894342 times by 1 test: case cm_case:
Executed by:
  • Self test
73894342
430 case cm_while:
executed 7785223 times by 1 test: case cm_while:
Executed by:
  • Self test
7785223
431 case cm_until:
executed 24 times by 1 test: case cm_until:
Executed by:
  • Self test
24
432 case cm_if:
executed 16483 times by 1 test: case cm_if:
Executed by:
  • Self test
16483
433 case cm_for:
executed 4028953 times by 1 test: case cm_for:
Executed by:
  • Self test
4028953
434 case cm_group:
executed 3281807 times by 1 test: case cm_group:
Executed by:
  • Self test
3281807
435 case cm_function_def:
executed 22320 times by 1 test: case cm_function_def:
Executed by:
  • Self test
22320
436 return (1);
executed 101987689 times by 1 test: return (1);
Executed by:
  • Self test
101987689
437-
438 default:
executed 253660192 times by 1 test: default:
Executed by:
  • Self test
253660192
439 return (0);
executed 253660192 times by 1 test: return (0);
Executed by:
  • Self test
253660192
440 }-
441}-
442-
443/* A function to use to unwind_protect the redirection undo list-
444 for loops. */-
445static void-
446cleanup_redirects (list)-
447 REDIRECT *list;-
448{-
449 do_redirections (list, RX_ACTIVE);-
450 dispose_redirects (list);-
451}
executed 30627293 times by 1 test: end of block
Executed by:
  • Self test
30627293
452-
453void-
454undo_partial_redirects ()-
455{-
456 if (redirection_undo_list)
redirection_undo_listDescription
TRUEevaluated 5597 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34681550 times by 1 test
Evaluated by:
  • Self test
5597-34681550
457 {-
458 cleanup_redirects (redirection_undo_list);-
459 redirection_undo_list = (REDIRECT *)NULL;-
460 }
executed 5597 times by 1 test: end of block
Executed by:
  • Self test
5597
461}
executed 34687147 times by 1 test: end of block
Executed by:
  • Self test
34687147
462-
463#if 0-
464/* Function to unwind_protect the redirections for functions and builtins. */-
465static void-
466cleanup_func_redirects (list)-
467 REDIRECT *list;-
468{-
469 do_redirections (list, RX_ACTIVE);-
470}-
471#endif-
472-
473void-
474dispose_exec_redirects ()-
475{-
476 if (exec_redirection_undo_list)
exec_redirection_undo_listDescription
TRUEevaluated 31689 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34687854 times by 1 test
Evaluated by:
  • Self test
31689-34687854
477 {-
478 dispose_redirects (exec_redirection_undo_list);-
479 exec_redirection_undo_list = (REDIRECT *)NULL;-
480 }
executed 31689 times by 1 test: end of block
Executed by:
  • Self test
31689
481}
executed 34719543 times by 1 test: end of block
Executed by:
  • Self test
34719543
482-
483void-
484dispose_partial_redirects ()-
485{-
486 if (redirection_undo_list)
redirection_undo_listDescription
TRUEevaluated 660672 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-660672
487 {-
488 dispose_redirects (redirection_undo_list);-
489 redirection_undo_list = (REDIRECT *)NULL;-
490 }
executed 660672 times by 1 test: end of block
Executed by:
  • Self test
660672
491}
executed 660672 times by 1 test: end of block
Executed by:
  • Self test
660672
492-
493#if defined (JOB_CONTROL)-
494/* A function to restore the signal mask to its proper value when the shell-
495 is interrupted or errors occur while creating a pipeline. */-
496static int-
497restore_signal_mask (set)-
498 sigset_t *set;-
499{-
500 return (sigprocmask (SIG_SETMASK, set, (sigset_t *)NULL));
executed 1 time by 1 test: return (sigprocmask ( 2 , set, (sigset_t *) ((void *)0) ));
Executed by:
  • Self test
1
501}-
502#endif /* JOB_CONTROL */-
503-
504#ifdef DEBUG-
505/* A debugging function that can be called from gdb, for instance. */-
506void-
507open_files ()-
508{-
509 register int i;-
510 int f, fd_table_size;-
511-
512 fd_table_size = getdtablesize ();-
513-
514 fprintf (stderr, "pid %ld open files:", (long)getpid ());-
515 for (i = 3; i < fd_table_size; i++)
i < fd_table_sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
516 {-
517 if ((f = fcntl (i, F_GETFD, 0)) != -1)
(f = fcntl (i, 1 , 0)) != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
518 fprintf (stderr, " %d (%s)", i, f ? "close" : "open");
never executed: fprintf ( stderr , " %d (%s)", i, f ? "close" : "open");
0
519 }
never executed: end of block
0
520 fprintf (stderr, "\n");-
521}
never executed: end of block
0
522#endif-
523-
524static void-
525async_redirect_stdin ()-
526{-
527 int fd;-
528-
529 fd = open ("/dev/null", O_RDONLY);-
530 if (fd > 0)
fd > 0Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-8
531 {-
532 dup2 (fd, 0);-
533 close (fd);-
534 }
executed 8 times by 1 test: end of block
Executed by:
  • Self test
8
535 else if (fd < 0)
fd < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
536 internal_error (_("cannot redirect standard input from /dev/null: %s"), strerror (errno));
never executed: internal_error ( dcgettext (((void *)0), "cannot redirect standard input from /dev/null: %s" , 5) , strerror ( (*__errno_location ()) ));
0
537}
executed 8 times by 1 test: end of block
Executed by:
  • Self test
8
538-
539#define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)-
540-
541/* Execute the command passed in COMMAND, perhaps doing it asynchronously.-
542 COMMAND is exactly what read_command () places into GLOBAL_COMMAND.-
543 ASYNCHROUNOUS, if non-zero, says to do this command in the background.-
544 PIPE_IN and PIPE_OUT are file descriptors saying where input comes-
545 from and where it goes. They can have the value of NO_PIPE, which means-
546 I/O is stdin/stdout.-
547 FDS_TO_CLOSE is a list of file descriptors to close once the child has-
548 been forked. This list often contains the unusable sides of pipes, etc.-
549-
550 EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible-
551 return values. Executing a command with nothing in it returns-
552 EXECUTION_SUCCESS. */-
553int-
554execute_command_internal (command, asynchronous, pipe_in, pipe_out,-
555 fds_to_close)-
556 COMMAND *command;-
557 int asynchronous;-
558 int pipe_in, pipe_out;-
559 struct fd_bitmap *fds_to_close;-
560{-
561 int exec_result, user_subshell, invert, ignore_return, was_error_trap;-
562 REDIRECT *my_undo_list, *exec_undo_list;-
563 char *tcmd;-
564 volatile int save_line_number;-
565#if defined (PROCESS_SUBSTITUTION)-
566 volatile int ofifo, nfifo, osize, saved_fifo;-
567 volatile char *ofifo_list;-
568#endif-
569-
570 if (breaking || continuing)
breakingDescription
TRUEevaluated 6459626 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 181348925 times by 1 test
Evaluated by:
  • Self test
continuingDescription
TRUEevaluated 140874 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 181208051 times by 1 test
Evaluated by:
  • Self test
140874-181348925
571 return (last_command_exit_value);
executed 6600500 times by 1 test: return (last_command_exit_value);
Executed by:
  • Self test
6600500
572 if (command == 0 || read_but_dont_execute)
command == 0Description
TRUEevaluated 3378607 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177829444 times by 1 test
Evaluated by:
  • Self test
read_but_dont_executeDescription
TRUEnever evaluated
FALSEevaluated 177829444 times by 1 test
Evaluated by:
  • Self test
0-177829444
573 return (EXECUTION_SUCCESS);
executed 3378607 times by 1 test: return (0);
Executed by:
  • Self test
3378607
574-
575 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 177829444 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 177829444 times by 1 test
Evaluated by:
  • Self test
0-177829444
576 run_pending_traps ();-
577-
578#if 0-
579 if (running_trap == 0)-
580#endif-
581 currently_executing_command = command;-
582-
583 invert = (command->flags & CMD_INVERT_RETURN) != 0;-
584-
585 /* If we're inverting the return value and `set -e' has been executed,-
586 we don't want a failing command to inadvertently cause the shell-
587 to exit. */-
588 if (exit_immediately_on_error && invert) /* XXX */
exit_immediately_on_errorDescription
TRUEevaluated 90761 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177738683 times by 1 test
Evaluated by:
  • Self test
invertDescription
TRUEevaluated 57 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 90704 times by 1 test
Evaluated by:
  • Self test
57-177738683
589 command->flags |= CMD_IGNORE_RETURN; /* XXX */
executed 57 times by 1 test: command->flags |= 0x08;
Executed by:
  • Self test
57
590-
591 exec_result = EXECUTION_SUCCESS;-
592-
593 /* If a command was being explicitly run in a subshell, or if it is-
594 a shell control-structure, and it has a pipe, then we do the command-
595 in a subshell. */-
596 if (command->type == cm_subshell && (command->flags & CMD_NO_FORK))
command->type == cm_subshellDescription
TRUEevaluated 5129 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177824315 times by 1 test
Evaluated by:
  • Self test
(command->flags & 0x40)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5127 times by 1 test
Evaluated by:
  • Self test
2-177824315
597 return (execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close));
executed 2 times by 1 test: return (execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close));
Executed by:
  • Self test
2
598-
599#if defined (COPROCESS_SUPPORT)-
600 if (command->type == cm_coproc)
command->type == cm_coprocDescription
TRUEevaluated 34 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177829408 times by 1 test
Evaluated by:
  • Self test
34-177829408
601 return (last_command_exit_value = execute_coproc (command, pipe_in, pipe_out, fds_to_close));
executed 34 times by 1 test: return (last_command_exit_value = execute_coproc (command, pipe_in, pipe_out, fds_to_close));
Executed by:
  • Self test
34
602#endif-
603-
604 user_subshell = command->type == cm_subshell || ((command->flags & CMD_WANT_SUBSHELL) != 0);
command->type == cm_subshellDescription
TRUEevaluated 5127 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177824281 times by 1 test
Evaluated by:
  • Self test
((command->flags & 0x01) != 0)Description
TRUEnever evaluated
FALSEevaluated 177824281 times by 1 test
Evaluated by:
  • Self test
0-177824281
605-
606#if defined (TIME_BEFORE_SUBSHELL)-
607 if ((command->flags & CMD_TIME_PIPELINE) && user_subshell && asynchronous == 0)-
608 {-
609 command->flags |= CMD_FORCE_SUBSHELL;-
610 exec_result = time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close);-
611 currently_executing_command = (COMMAND *)NULL;-
612 return (exec_result);-
613 }-
614#endif-
615-
616 if (command->type == cm_subshell ||
command->type == cm_subshellDescription
TRUEevaluated 5127 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177824281 times by 1 test
Evaluated by:
  • Self test
5127-177824281
617 (command->flags & (CMD_WANT_SUBSHELL|CMD_FORCE_SUBSHELL)) ||
(command->flags & (0x01|0x02))Description
TRUEnever evaluated
FALSEevaluated 177824281 times by 1 test
Evaluated by:
  • Self test
0-177824281
618 (shell_control_structure (command->type) &&
shell_control_...command->type)Description
TRUEevaluated 50994182 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 126830099 times by 1 test
Evaluated by:
  • Self test
50994182-126830099
619 (pipe_out != NO_PIPE || pipe_in != NO_PIPE || asynchronous)))
pipe_out != -1Description
TRUEevaluated 473 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50993709 times by 1 test
Evaluated by:
  • Self test
pipe_in != -1Description
TRUEevaluated 205 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50993504 times by 1 test
Evaluated by:
  • Self test
asynchronousDescription
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50993453 times by 1 test
Evaluated by:
  • Self test
51-50993709
620 {-
621 pid_t paren_pid;-
622 int s;-
623 char *p;-
624-
625 /* Fork a subshell, turn off the subshell bit, turn off job-
626 control and call execute_command () on the command again. */-
627 line_number_for_err_trap = line_number = command->value.Subshell->line; /* XXX - save value? */-
628 tcmd = make_command_string (command);-
629 paren_pid = make_child (p = savestring (tcmd), asynchronous);-
630-
631 if (user_subshell && signal_is_trapped (ERROR_TRAP) &&
user_subshellDescription
TRUEevaluated 5127 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 729 times by 1 test
Evaluated by:
  • Self test
signal_is_trapped ( 65 +1)Description
TRUEnever evaluated
FALSEevaluated 5127 times by 1 test
Evaluated by:
  • Self test
0-5127
632 signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
signal_in_progress ( 65 ) == 0Description
TRUEnever evaluated
FALSEnever evaluated
running_trap == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
633 {-
634 FREE (the_printed_command_except_trap);
never executed: sh_xfree((the_printed_command_except_trap), "execute_cmd.c", 634);
the_printed_co...nd_except_trapDescription
TRUEnever evaluated
FALSEnever evaluated
0
635 the_printed_command_except_trap = savestring (the_printed_command);-
636 }
never executed: end of block
0
637-
638 if (paren_pid == 0)
paren_pid == 0Description
TRUEevaluated 1112 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4744 times by 1 test
Evaluated by:
  • Self test
1112-4744
639 {-
640#if defined (JOB_CONTROL)-
641 FREE (p); /* child doesn't use pointer */
executed 1112 times by 1 test: sh_xfree((p), "execute_cmd.c", 641);
Executed by:
  • Self test
pDescription
TRUEevaluated 1112 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1112
642#endif-
643 /* We want to run the exit trap for forced {} subshells, and we-
644 want to note this before execute_in_subshell modifies the-
645 COMMAND struct. Need to keep in mind that execute_in_subshell-
646 runs the exit trap for () subshells itself. */-
647 /* This handles { command; } & */-
648 s = user_subshell == 0 && command->type == cm_group && pipe_in == NO_PIPE && pipe_out == NO_PIPE && asynchronous;
user_subshell == 0Description
TRUEevaluated 54 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1058 times by 1 test
Evaluated by:
  • Self test
command->type == cm_groupDescription
TRUEevaluated 46 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
pipe_in == -1Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30 times by 1 test
Evaluated by:
  • Self test
pipe_out == -1Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
asynchronousDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1058
649 /* run exit trap for : | { ...; } and { ...; } | : */-
650 /* run exit trap for : | ( ...; ) and ( ...; ) | : */-
651 s += user_subshell == 0 && command->type == cm_group && (pipe_in != NO_PIPE || pipe_out != NO_PIPE) && asynchronous == 0;
user_subshell == 0Description
TRUEevaluated 54 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1058 times by 1 test
Evaluated by:
  • Self test
command->type == cm_groupDescription
TRUEevaluated 46 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
pipe_in != -1Description
TRUEevaluated 30 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 16 times by 1 test
Evaluated by:
  • Self test
pipe_out != -1Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
asynchronous == 0Description
TRUEevaluated 37 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1058
652-
653 last_command_exit_value = execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close);-
654 if (s)
sDescription
TRUEevaluated 46 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 936 times by 1 test
Evaluated by:
  • Self test
46-936
655 subshell_exit (last_command_exit_value);
executed 46 times by 1 test: subshell_exit (last_command_exit_value);
Executed by:
  • Self test
46
656 else-
657 sh_exit (last_command_exit_value);
executed 936 times by 1 test: sh_exit (last_command_exit_value);
Executed by:
  • Self test
936
658 /* NOTREACHED */-
659 }-
660 else-
661 {-
662 close_pipes (pipe_in, pipe_out);-
663-
664#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)-
665 if (variable_context == 0) /* wait until shell function completes */
variable_context == 0Description
TRUEevaluated 2839 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1905 times by 1 test
Evaluated by:
  • Self test
1905-2839
666 unlink_fifo_list ();
executed 2839 times by 1 test: unlink_fifo_list ();
Executed by:
  • Self test
2839
667#endif-
668 /* If we are part of a pipeline, and not the end of the pipeline,-
669 then we should simply return and let the last command in the-
670 pipe be waited for. If we are not in a pipeline, or are the-
671 last command in the pipeline, then we wait for the subshell-
672 and return its exit status as usual. */-
673 if (pipe_out != NO_PIPE)
pipe_out != -1Description
TRUEevaluated 535 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4209 times by 1 test
Evaluated by:
  • Self test
535-4209
674 return (EXECUTION_SUCCESS);
executed 535 times by 1 test: return (0);
Executed by:
  • Self test
535
675-
676 stop_pipeline (asynchronous, (COMMAND *)NULL);-
677-
678 if (asynchronous == 0)
asynchronous == 0Description
TRUEevaluated 4163 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 46 times by 1 test
Evaluated by:
  • Self test
46-4163
679 {-
680 was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
signal_is_trapped ( 65 +1)Description
TRUEnever evaluated
FALSEevaluated 4163 times by 1 test
Evaluated by:
  • Self test
signal_is_igno... ( 65 +1) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-4163
681 invert = (command->flags & CMD_INVERT_RETURN) != 0;-
682 ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;-
683-
684 exec_result = wait_for (paren_pid);-
685-
686 /* If we have to, invert the return value. */-
687 if (invert)
invertDescription
TRUEevaluated 52 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4111 times by 1 test
Evaluated by:
  • Self test
52-4111
688 exec_result = ((exec_result == EXECUTION_SUCCESS)
executed 52 times by 1 test: exec_result = ((exec_result == 0) ? 1 : 0);
Executed by:
  • Self test
(exec_result == 0)Description
TRUEevaluated 26 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 26 times by 1 test
Evaluated by:
  • Self test
26-52
689 ? EXECUTION_FAILURE
executed 52 times by 1 test: exec_result = ((exec_result == 0) ? 1 : 0);
Executed by:
  • Self test
52
690 : EXECUTION_SUCCESS);
executed 52 times by 1 test: exec_result = ((exec_result == 0) ? 1 : 0);
Executed by:
  • Self test
52
691-
692 last_command_exit_value = exec_result;-
693 if (user_subshell && was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
user_subshellDescription
TRUEevaluated 3989 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 174 times by 1 test
Evaluated by:
  • Self test
was_error_trapDescription
TRUEnever evaluated
FALSEevaluated 3989 times by 1 test
Evaluated by:
  • Self test
ignore_return == 0Description
TRUEnever evaluated
FALSEnever evaluated
invert == 0Description
TRUEnever evaluated
FALSEnever evaluated
exec_result != 0Description
TRUEnever evaluated
FALSEnever evaluated
0-3989
694 {-
695 save_line_number = line_number;-
696 line_number = line_number_for_err_trap;-
697 run_error_trap ();-
698 line_number = save_line_number;-
699 }
never executed: end of block
0
700-
701 if (user_subshell && ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
user_subshellDescription
TRUEevaluated 3989 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 174 times by 1 test
Evaluated by:
  • Self test
ignore_return == 0Description
TRUEevaluated 2854 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1135 times by 1 test
Evaluated by:
  • Self test
invert == 0Description
TRUEevaluated 2812 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 42 times by 1 test
Evaluated by:
  • Self test
exit_immediately_on_errorDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2799 times by 1 test
Evaluated by:
  • Self test
exec_result != 0Description
TRUEevaluated 13 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3989
702 {-
703 run_pending_traps ();-
704 jump_to_top_level (ERREXIT);-
705 }
never executed: end of block
0
706-
707 return (last_command_exit_value);
executed 4150 times by 1 test: return (last_command_exit_value);
Executed by:
  • Self test
4150
708 }-
709 else-
710 {-
711 DESCRIBE_PID (paren_pid);
never executed: describe_pid (paren_pid);
interactiveDescription
TRUEnever evaluated
FALSEevaluated 46 times by 1 test
Evaluated by:
  • Self test
0-46
712-
713 run_pending_traps ();-
714-
715 /* Posix 2013 2.9.3.1: "the exit status of an asynchronous list-
716 shall be zero." */-
717 last_command_exit_value = 0;-
718 return (EXECUTION_SUCCESS);
executed 46 times by 1 test: return (0);
Executed by:
  • Self test
46
719 }-
720 }-
721 }-
722-
723#if defined (COMMAND_TIMING)-
724 if (command->flags & CMD_TIME_PIPELINE)
command->flags & 0x80Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177823546 times by 1 test
Evaluated by:
  • Self test
6-177823546
725 {-
726 if (asynchronous)
asynchronousDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
727 {-
728 command->flags |= CMD_FORCE_SUBSHELL;-
729 exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);-
730 }
never executed: end of block
0
731 else-
732 {-
733 exec_result = time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close);-
734#if 0-
735 if (running_trap == 0)-
736#endif-
737 currently_executing_command = (COMMAND *)NULL;-
738 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
739 return (exec_result);
executed 6 times by 1 test: return (exec_result);
Executed by:
  • Self test
6
740 }-
741#endif /* COMMAND_TIMING */-
742-
743 if (shell_control_structure (command->type) && command->redirects)
shell_control_...command->type)Description
TRUEevaluated 50993453 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 126830093 times by 1 test
Evaluated by:
  • Self test
command->redirectsDescription
TRUEevaluated 662026 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50331427 times by 1 test
Evaluated by:
  • Self test
662026-126830093
744 stdin_redir = stdin_redirects (command->redirects);
executed 662026 times by 1 test: stdin_redir = stdin_redirects (command->redirects);
Executed by:
  • Self test
662026
745-
746#if defined (PROCESS_SUBSTITUTION)-
747 if (variable_context != 0)
variable_context != 0Description
TRUEevaluated 164977698 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12845848 times by 1 test
Evaluated by:
  • Self test
12845848-164977698
748 {-
749 ofifo = num_fifos ();-
750 ofifo_list = copy_fifo_list ((int *)&osize);-
751 begin_unwind_frame ("internal_fifos");-
752 add_unwind_protect (xfree, ofifo_list);-
753 saved_fifo = 1;-
754 }
executed 164977698 times by 1 test: end of block
Executed by:
  • Self test
164977698
755 else-
756 saved_fifo = 0;
executed 12845848 times by 1 test: saved_fifo = 0;
Executed by:
  • Self test
12845848
757#endif-
758-
759 /* Handle WHILE FOR CASE etc. with redirections. (Also '&' input-
760 redirection.) */-
761 if (do_redirections (command->redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
do_redirection...x01|0x02) != 0Description
TRUEnever evaluated
FALSEevaluated 177822193 times by 1 test
Evaluated by:
  • Self test
0-177822193
762 {-
763 undo_partial_redirects ();-
764 dispose_exec_redirects ();-
765#if defined (PROCESS_SUBSTITUTION)-
766 if (saved_fifo)
saved_fifoDescription
TRUEnever evaluated
FALSEnever evaluated
0
767 {-
768 free ((void *)ofifo_list);-
769 discard_unwind_frame ("internal_fifos");-
770 }
never executed: end of block
0
771#endif-
772 return (last_command_exit_value = EXECUTION_FAILURE);
never executed: return (last_command_exit_value = 1);
0
773 }-
774-
775 if (redirection_undo_list)
redirection_undo_listDescription
TRUEevaluated 660672 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177161521 times by 1 test
Evaluated by:
  • Self test
660672-177161521
776 {-
777 /* XXX - why copy here? */-
778 my_undo_list = (REDIRECT *)copy_redirects (redirection_undo_list);-
779 dispose_partial_redirects ();-
780 }
executed 660672 times by 1 test: end of block
Executed by:
  • Self test
660672
781 else-
782 my_undo_list = (REDIRECT *)NULL;
executed 177161521 times by 1 test: my_undo_list = (REDIRECT *) ((void *)0) ;
Executed by:
  • Self test
177161521
783-
784 if (exec_redirection_undo_list)
exec_redirection_undo_listDescription
TRUEevaluated 26173 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177796020 times by 1 test
Evaluated by:
  • Self test
26173-177796020
785 {-
786 /* XXX - why copy here? */-
787 exec_undo_list = (REDIRECT *)copy_redirects (exec_redirection_undo_list);-
788 dispose_exec_redirects ();-
789 }
executed 26173 times by 1 test: end of block
Executed by:
  • Self test
26173
790 else-
791 exec_undo_list = (REDIRECT *)NULL;
executed 177796020 times by 1 test: exec_undo_list = (REDIRECT *) ((void *)0) ;
Executed by:
  • Self test
177796020
792-
793 if (my_undo_list || exec_undo_list)
my_undo_listDescription
TRUEevaluated 660672 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177161521 times by 1 test
Evaluated by:
  • Self test
exec_undo_listDescription
TRUEnever evaluated
FALSEevaluated 177161521 times by 1 test
Evaluated by:
  • Self test
0-177161521
794 begin_unwind_frame ("loop_redirections");
executed 660672 times by 1 test: begin_unwind_frame ("loop_redirections");
Executed by:
  • Self test
660672
795-
796 if (my_undo_list)
my_undo_listDescription
TRUEevaluated 660672 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177161521 times by 1 test
Evaluated by:
  • Self test
660672-177161521
797 add_unwind_protect ((Function *)cleanup_redirects, my_undo_list);
executed 660672 times by 1 test: add_unwind_protect ((Function *)cleanup_redirects, my_undo_list);
Executed by:
  • Self test
660672
798-
799 if (exec_undo_list)
exec_undo_listDescription
TRUEevaluated 26173 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177796020 times by 1 test
Evaluated by:
  • Self test
26173-177796020
800 add_unwind_protect ((Function *)dispose_redirects, exec_undo_list);
executed 26173 times by 1 test: add_unwind_protect ((Function *)dispose_redirects, exec_undo_list);
Executed by:
  • Self test
26173
801-
802 ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;-
803-
804 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 177822193 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 177822193 times by 1 test
Evaluated by:
  • Self test
0-177822193
805-
806 switch (command->type)-
807 {-
808 case cm_simple:
executed 64710245 times by 1 test: case cm_simple:
Executed by:
  • Self test
64710245
809 {-
810 save_line_number = line_number;-
811 /* We can't rely on variables retaining their values across a-
812 call to execute_simple_command if a longjmp occurs as the-
813 result of a `return' builtin. This is true for sure with gcc. */-
814#if defined (RECYCLES_PIDS)-
815 last_made_pid = NO_PID;-
816#endif-
817 was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
signal_is_trapped ( 65 +1)Description
TRUEevaluated 62 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64710183 times by 1 test
Evaluated by:
  • Self test
signal_is_igno... ( 65 +1) == 0Description
TRUEevaluated 62 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-64710183
818-
819 if (ignore_return && command->value.Simple)
ignore_returnDescription
TRUEevaluated 13832348 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50877897 times by 1 test
Evaluated by:
  • Self test
command->value.SimpleDescription
TRUEevaluated 13832348 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-50877897
820 command->value.Simple->flags |= CMD_IGNORE_RETURN;
executed 13832348 times by 1 test: command->value.Simple->flags |= 0x08;
Executed by:
  • Self test
13832348
821 if (command->flags & CMD_STDIN_REDIR)
command->flags & 0x400Description
TRUEevaluated 100 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64710145 times by 1 test
Evaluated by:
  • Self test
100-64710145
822 command->value.Simple->flags |= CMD_STDIN_REDIR;
executed 100 times by 1 test: command->value.Simple->flags |= 0x400;
Executed by:
  • Self test
100
823-
824 line_number_for_err_trap = line_number = command->value.Simple->line;-
825 exec_result =-
826 execute_simple_command (command->value.Simple, pipe_in, pipe_out,-
827 asynchronous, fds_to_close);-
828 line_number = save_line_number;-
829-
830 /* The temporary environment should be used for only the simple-
831 command immediately following its definition. */-
832 dispose_used_env_vars ();-
833-
834#if (defined (ultrix) && defined (mips)) || defined (C_ALLOCA)-
835 /* Reclaim memory allocated with alloca () on machines which-
836 may be using the alloca emulation code. */-
837 (void) alloca (0);-
838#endif /* (ultrix && mips) || C_ALLOCA */-
839-
840 /* If we forked to do the command, then we must wait_for ()-
841 the child. */-
842-
843 /* XXX - this is something to watch out for if there are problems-
844 when the shell is compiled without job control. Don't worry about-
845 whether or not last_made_pid == last_pid; already_making_children-
846 tells us whether or not there are unwaited-for children to wait-
847 for and reap. */-
848 if (already_making_children && pipe_out == NO_PIPE)
already_making_childrenDescription
TRUEevaluated 51236 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64648200 times by 1 test
Evaluated by:
  • Self test
pipe_out == -1Description
TRUEevaluated 38402 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12834 times by 1 test
Evaluated by:
  • Self test
12834-64648200
849 {-
850 stop_pipeline (asynchronous, (COMMAND *)NULL);-
851-
852 if (asynchronous)
asynchronousDescription
TRUEevaluated 148 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 38254 times by 1 test
Evaluated by:
  • Self test
148-38254
853 {-
854 DESCRIBE_PID (last_made_pid);
never executed: describe_pid (last_made_pid);
interactiveDescription
TRUEnever evaluated
FALSEevaluated 148 times by 1 test
Evaluated by:
  • Self test
0-148
855 exec_result = EXECUTION_SUCCESS;-
856 invert = 0; /* async commands always succeed */-
857 }
executed 148 times by 1 test: end of block
Executed by:
  • Self test
148
858 else-
859#if !defined (JOB_CONTROL)-
860 /* Do not wait for asynchronous processes started from-
861 startup files. */-
862 if (last_made_pid != NO_PID && last_made_pid != last_asynchronous_pid)-
863#else-
864 if (last_made_pid != NO_PID)
last_made_pid != (pid_t)-1Description
TRUEevaluated 38254 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-38254
865#endif-
866 /* When executing a shell function that executes other-
867 commands, this causes the last simple command in-
868 the function to be waited for twice. This also causes-
869 subshells forked to execute builtin commands (e.g., in-
870 pipelines) to be waited for twice. */-
871 exec_result = wait_for (last_made_pid);
executed 38254 times by 1 test: exec_result = wait_for (last_made_pid);
Executed by:
  • Self test
38254
872 }
executed 38401 times by 1 test: end of block
Executed by:
  • Self test
38401
873 }-
874-
875 /* 2009/02/13 -- pipeline failure is processed elsewhere. This handles-
876 only the failure of a simple command. */-
877 if (was_error_trap && ignore_return == 0 && invert == 0 && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)
was_error_trapDescription
TRUEevaluated 58 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64699377 times by 1 test
Evaluated by:
  • Self test
ignore_return == 0Description
TRUEevaluated 52 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
invert == 0Description
TRUEevaluated 49 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
pipe_in == -1Description
TRUEevaluated 46 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
pipe_out == -1Description
TRUEevaluated 44 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
exec_result != 0Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 35 times by 1 test
Evaluated by:
  • Self test
2-64699377
878 {-
879 last_command_exit_value = exec_result;-
880 line_number = line_number_for_err_trap;-
881 run_error_trap ();-
882 line_number = save_line_number;-
883 }
executed 9 times by 1 test: end of block
Executed by:
  • Self test
9
884-
885 if (ignore_return == 0 && invert == 0 &&
ignore_return == 0Description
TRUEevaluated 50867129 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13832306 times by 1 test
Evaluated by:
  • Self test
invert == 0Description
TRUEevaluated 50867092 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 37 times by 1 test
Evaluated by:
  • Self test
37-50867129
886 ((posixly_correct && interactive == 0 && special_builtin_failed) ||
posixly_correctDescription
TRUEevaluated 773 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50866319 times by 1 test
Evaluated by:
  • Self test
interactive == 0Description
TRUEevaluated 773 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
special_builtin_failedDescription
TRUEnever evaluated
FALSEevaluated 773 times by 1 test
Evaluated by:
  • Self test
0-50866319
887 (exit_immediately_on_error && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)))
exit_immediately_on_errorDescription
TRUEevaluated 46783 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50820309 times by 1 test
Evaluated by:
  • Self test
pipe_in == -1Description
TRUEevaluated 41830 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4953 times by 1 test
Evaluated by:
  • Self test
pipe_out == -1Description
TRUEevaluated 36846 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4984 times by 1 test
Evaluated by:
  • Self test
exec_result != 0Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 36826 times by 1 test
Evaluated by:
  • Self test
20-50820309
888 {-
889 last_command_exit_value = exec_result;-
890 run_pending_traps ();-
891-
892 /* Undo redirections before running exit trap on the way out of-
893 set -e. Report by Mark Farrell 5/19/2014 */-
894 if (exit_immediately_on_error && signal_is_trapped (0) &&
exit_immediately_on_errorDescription
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
signal_is_trapped (0)Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13 times by 1 test
Evaluated by:
  • Self test
0-20
895 unwind_protect_tag_on_stack ("saved-redirects"))
unwind_protect...ed-redirects")Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
3-4
896 run_unwind_frame ("saved-redirects");
executed 3 times by 1 test: run_unwind_frame ("saved-redirects");
Executed by:
  • Self test
3
897-
898 jump_to_top_level (ERREXIT);-
899 }
never executed: end of block
0
900-
901 break;
executed 64699415 times by 1 test: break;
Executed by:
  • Self test
64699415
902-
903 case cm_for:
executed 2014469 times by 1 test: case cm_for:
Executed by:
  • Self test
2014469
904 if (ignore_return)
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 2014469 times by 1 test
Evaluated by:
  • Self test
0-2014469
905 command->value.For->flags |= CMD_IGNORE_RETURN;
never executed: command->value.For->flags |= 0x08;
0
906 exec_result = execute_for_command (command->value.For);-
907 break;
executed 2002020 times by 1 test: break;
Executed by:
  • Self test
2002020
908-
909#if defined (ARITH_FOR_COMMAND)-
910 case cm_arith_for:
executed 2607 times by 1 test: case cm_arith_for:
Executed by:
  • Self test
2607
911 if (ignore_return)
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 2607 times by 1 test
Evaluated by:
  • Self test
0-2607
912 command->value.ArithFor->flags |= CMD_IGNORE_RETURN;
never executed: command->value.ArithFor->flags |= 0x08;
0
913 exec_result = execute_arith_for_command (command->value.ArithFor);-
914 break;
executed 2398 times by 1 test: break;
Executed by:
  • Self test
2398
915#endif-
916-
917#if defined (SELECT_COMMAND)-
918 case cm_select:
executed 9 times by 1 test: case cm_select:
Executed by:
  • Self test
9
919 if (ignore_return)
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
0-9
920 command->value.Select->flags |= CMD_IGNORE_RETURN;
never executed: command->value.Select->flags |= 0x08;
0
921 exec_result = execute_select_command (command->value.Select);-
922 break;
executed 9 times by 1 test: break;
Executed by:
  • Self test
9
923#endif-
924-
925 case cm_case:
executed 36947171 times by 1 test: case cm_case:
Executed by:
  • Self test
36947171
926 if (ignore_return)
ignore_returnDescription
TRUEevaluated 3542 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 36943629 times by 1 test
Evaluated by:
  • Self test
3542-36943629
927 command->value.Case->flags |= CMD_IGNORE_RETURN;
executed 3542 times by 1 test: command->value.Case->flags |= 0x08;
Executed by:
  • Self test
3542
928 exec_result = execute_case_command (command->value.Case);-
929 break;
executed 36940300 times by 1 test: break;
Executed by:
  • Self test
36940300
930-
931 case cm_while:
executed 3891252 times by 1 test: case cm_while:
Executed by:
  • Self test
3891252
932 if (ignore_return)
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 3891252 times by 1 test
Evaluated by:
  • Self test
0-3891252
933 command->value.While->flags |= CMD_IGNORE_RETURN;
never executed: command->value.While->flags |= 0x08;
0
934 exec_result = execute_while_command (command->value.While);-
935 break;
executed 3889883 times by 1 test: break;
Executed by:
  • Self test
3889883
936-
937 case cm_until:
executed 12 times by 1 test: case cm_until:
Executed by:
  • Self test
12
938 if (ignore_return)
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
939 command->value.While->flags |= CMD_IGNORE_RETURN;
never executed: command->value.While->flags |= 0x08;
0
940 exec_result = execute_until_command (command->value.While);-
941 break;
executed 12 times by 1 test: break;
Executed by:
  • Self test
12
942-
943 case cm_if:
executed 8236 times by 1 test: case cm_if:
Executed by:
  • Self test
8236
944 if (ignore_return)
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 8236 times by 1 test
Evaluated by:
  • Self test
0-8236
945 command->value.If->flags |= CMD_IGNORE_RETURN;
never executed: command->value.If->flags |= 0x08;
0
946 exec_result = execute_if_command (command->value.If);-
947 break;
executed 8225 times by 1 test: break;
Executed by:
  • Self test
8225
948-
949 case cm_group:
executed 1640536 times by 1 test: case cm_group:
Executed by:
  • Self test
1640536
950-
951 /* This code can be executed from either of two paths: an explicit-
952 '{}' command, or via a function call. If we are executed via a-
953 function call, we have already taken care of the function being-
954 executed in the background (down there in execute_simple_command ()),-
955 and this command should *not* be marked as asynchronous. If we-
956 are executing a regular '{}' group command, and asynchronous == 1,-
957 we must want to execute the whole command in the background, so we-
958 need a subshell, and we want the stuff executed in that subshell-
959 (this group command) to be executed in the foreground of that-
960 subshell (i.e. there will not be *another* subshell forked).-
961-
962 What we do is to force a subshell if asynchronous, and then call-
963 execute_command_internal again with asynchronous still set to 1,-
964 but with the original group command, so the printed command will-
965 look right.-
966-
967 The code above that handles forking off subshells will note that-
968 both subshell and async are on, and turn off async in the child-
969 after forking the subshell (but leave async set in the parent, so-
970 the normal call to describe_pid is made). This turning off-
971 async is *crucial*; if it is not done, this will fall into an-
972 infinite loop of executions through this spot in subshell after-
973 subshell until the process limit is exhausted. */-
974-
975 if (asynchronous)
asynchronousDescription
TRUEnever evaluated
FALSEevaluated 1640536 times by 1 test
Evaluated by:
  • Self test
0-1640536
976 {-
977 command->flags |= CMD_FORCE_SUBSHELL;-
978 exec_result =-
979 execute_command_internal (command, 1, pipe_in, pipe_out,-
980 fds_to_close);-
981 }
never executed: end of block
0
982 else-
983 {-
984 if (ignore_return && command->value.Group->command)
ignore_returnDescription
TRUEevaluated 3624 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1636912 times by 1 test
Evaluated by:
  • Self test
command->value.Group->commandDescription
TRUEevaluated 3624 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1636912
985 command->value.Group->command->flags |= CMD_IGNORE_RETURN;
executed 3624 times by 1 test: command->value.Group->command->flags |= 0x08;
Executed by:
  • Self test
3624
986 exec_result =-
987 execute_command_internal (command->value.Group->command,-
988 asynchronous, pipe_in, pipe_out,-
989 fds_to_close);-
990 }
executed 1634193 times by 1 test: end of block
Executed by:
  • Self test
1634193
991 break;
executed 1634193 times by 1 test: break;
Executed by:
  • Self test
1634193
992-
993 case cm_connection:
executed 62119848 times by 1 test: case cm_connection:
Executed by:
  • Self test
62119848
994 exec_result = execute_connection (command, asynchronous,-
995 pipe_in, pipe_out, fds_to_close);-
996 if (asynchronous)
asynchronousDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 62089467 times by 1 test
Evaluated by:
  • Self test
8-62089467
997 invert = 0; /* XXX */
executed 8 times by 1 test: invert = 0;
Executed by:
  • Self test
8
998-
999 break;
executed 62089475 times by 1 test: break;
Executed by:
  • Self test
62089475
1000-
1001#if defined (DPAREN_ARITHMETIC)-
1002 case cm_arith:
executed 6476018 times by 1 test: case cm_arith:
Executed by:
  • Self test
6476018
1003 was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
signal_is_trapped ( 65 +1)Description
TRUEnever evaluated
FALSEevaluated 6476018 times by 1 test
Evaluated by:
  • Self test
signal_is_igno... ( 65 +1) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-6476018
1004 if (ignore_return)
ignore_returnDescription
TRUEevaluated 4706 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6471312 times by 1 test
Evaluated by:
  • Self test
4706-6471312
1005 command->value.Arith->flags |= CMD_IGNORE_RETURN;
executed 4706 times by 1 test: command->value.Arith->flags |= 0x08;
Executed by:
  • Self test
4706
1006 line_number_for_err_trap = save_line_number = line_number;-
1007 exec_result = execute_arith_command (command->value.Arith);-
1008 line_number = save_line_number;-
1009-
1010 if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
was_error_trapDescription
TRUEnever evaluated
FALSEevaluated 6476017 times by 1 test
Evaluated by:
  • Self test
ignore_return == 0Description
TRUEnever evaluated
FALSEnever evaluated
invert == 0Description
TRUEnever evaluated
FALSEnever evaluated
exec_result != 0Description
TRUEnever evaluated
FALSEnever evaluated
0-6476017
1011 {-
1012 last_command_exit_value = exec_result;-
1013 save_line_number = line_number;-
1014 line_number = line_number_for_err_trap;-
1015 run_error_trap ();-
1016 line_number = save_line_number;-
1017 }
never executed: end of block
0
1018-
1019 if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
ignore_return == 0Description
TRUEevaluated 6471311 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4706 times by 1 test
Evaluated by:
  • Self test
invert == 0Description
TRUEevaluated 6471311 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
exit_immediately_on_errorDescription
TRUEnever evaluated
FALSEevaluated 6471311 times by 1 test
Evaluated by:
  • Self test
exec_result != 0Description
TRUEnever evaluated
FALSEnever evaluated
0-6471311
1020 {-
1021 last_command_exit_value = exec_result;-
1022 run_pending_traps ();-
1023 jump_to_top_level (ERREXIT);-
1024 }
never executed: end of block
0
1025-
1026 break;
executed 6476017 times by 1 test: break;
Executed by:
  • Self test
6476017
1027#endif-
1028-
1029#if defined (COND_COMMAND)-
1030 case cm_cond:
executed 630 times by 1 test: case cm_cond:
Executed by:
  • Self test
630
1031 was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
signal_is_trapped ( 65 +1)Description
TRUEnever evaluated
FALSEevaluated 630 times by 1 test
Evaluated by:
  • Self test
signal_is_igno... ( 65 +1) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-630
1032 if (ignore_return)
ignore_returnDescription
TRUEevaluated 485 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 145 times by 1 test
Evaluated by:
  • Self test
145-485
1033 command->value.Cond->flags |= CMD_IGNORE_RETURN;
executed 485 times by 1 test: command->value.Cond->flags |= 0x08;
Executed by:
  • Self test
485
1034-
1035 line_number_for_err_trap = save_line_number = line_number;-
1036 exec_result = execute_cond_command (command->value.Cond);-
1037 line_number = save_line_number;-
1038-
1039 if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
was_error_trapDescription
TRUEnever evaluated
FALSEevaluated 629 times by 1 test
Evaluated by:
  • Self test
ignore_return == 0Description
TRUEnever evaluated
FALSEnever evaluated
invert == 0Description
TRUEnever evaluated
FALSEnever evaluated
exec_result != 0Description
TRUEnever evaluated
FALSEnever evaluated
0-629
1040 {-
1041 last_command_exit_value = exec_result;-
1042 save_line_number = line_number;-
1043 line_number = line_number_for_err_trap;-
1044 run_error_trap ();-
1045 line_number = save_line_number;-
1046 }
never executed: end of block
0
1047-
1048 if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
ignore_return == 0Description
TRUEevaluated 145 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 484 times by 1 test
Evaluated by:
  • Self test
invert == 0Description
TRUEevaluated 145 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
exit_immediately_on_errorDescription
TRUEnever evaluated
FALSEevaluated 145 times by 1 test
Evaluated by:
  • Self test
exec_result != 0Description
TRUEnever evaluated
FALSEnever evaluated
0-484
1049 {-
1050 last_command_exit_value = exec_result;-
1051 run_pending_traps ();-
1052 jump_to_top_level (ERREXIT);-
1053 }
never executed: end of block
0
1054-
1055 break;
executed 629 times by 1 test: break;
Executed by:
  • Self test
629
1056#endif-
1057 -
1058 case cm_function_def:
executed 11160 times by 1 test: case cm_function_def:
Executed by:
  • Self test
11160
1059 exec_result = execute_intern_function (command->value.Function_def->name,-
1060 command->value.Function_def);-
1061 break;
executed 11159 times by 1 test: break;
Executed by:
  • Self test
11159
1062-
1063 default:
never executed: default:
0
1064 command_error ("execute_command", CMDERR_BADTYPE, command->type, 0);-
1065 }
never executed: end of block
0
1066-
1067 if (my_undo_list)
my_undo_listDescription
TRUEevaluated 660640 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177093095 times by 1 test
Evaluated by:
  • Self test
660640-177093095
1068 cleanup_redirects (my_undo_list);
executed 660640 times by 1 test: cleanup_redirects (my_undo_list);
Executed by:
  • Self test
660640
1069-
1070 if (exec_undo_list)
exec_undo_listDescription
TRUEevaluated 26141 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177727594 times by 1 test
Evaluated by:
  • Self test
26141-177727594
1071 dispose_redirects (exec_undo_list);
executed 26141 times by 1 test: dispose_redirects (exec_undo_list);
Executed by:
  • Self test
26141
1072-
1073 if (my_undo_list || exec_undo_list)
my_undo_listDescription
TRUEevaluated 660640 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177093095 times by 1 test
Evaluated by:
  • Self test
exec_undo_listDescription
TRUEnever evaluated
FALSEevaluated 177093095 times by 1 test
Evaluated by:
  • Self test
0-177093095
1074 discard_unwind_frame ("loop_redirections");
executed 660640 times by 1 test: discard_unwind_frame ("loop_redirections");
Executed by:
  • Self test
660640
1075-
1076#if defined (PROCESS_SUBSTITUTION)-
1077 if (saved_fifo)
saved_fifoDescription
TRUEevaluated 164942946 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12810789 times by 1 test
Evaluated by:
  • Self test
12810789-164942946
1078 {-
1079 nfifo = num_fifos ();-
1080 if (nfifo > ofifo)
nfifo > ofifoDescription
TRUEevaluated 660604 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 164282342 times by 1 test
Evaluated by:
  • Self test
660604-164282342
1081 close_new_fifos ((char *)ofifo_list, osize);
executed 660604 times by 1 test: close_new_fifos ((char *)ofifo_list, osize);
Executed by:
  • Self test
660604
1082 free ((void *)ofifo_list);-
1083 discard_unwind_frame ("internal_fifos");-
1084 }
executed 164942946 times by 1 test: end of block
Executed by:
  • Self test
164942946
1085#endif-
1086-
1087 /* Invert the return value if we have to */-
1088 if (invert)
invertDescription
TRUEevaluated 113 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177753622 times by 1 test
Evaluated by:
  • Self test
113-177753622
1089 exec_result = (exec_result == EXECUTION_SUCCESS)
executed 113 times by 1 test: exec_result = (exec_result == 0) ? 1 : 0;
Executed by:
  • Self test
(exec_result == 0)Description
TRUEevaluated 52 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test
52-113
1090 ? EXECUTION_FAILURE
executed 113 times by 1 test: exec_result = (exec_result == 0) ? 1 : 0;
Executed by:
  • Self test
113
1091 : EXECUTION_SUCCESS;
executed 113 times by 1 test: exec_result = (exec_result == 0) ? 1 : 0;
Executed by:
  • Self test
113
1092-
1093#if defined (DPAREN_ARITHMETIC) || defined (COND_COMMAND)-
1094 /* This is where we set PIPESTATUS from the exit status of the appropriate-
1095 compound commands (the ones that look enough like simple commands to-
1096 cause confusion). We might be able to optimize by not doing this if-
1097 subshell_environment != 0. */-
1098 switch (command->type)-
1099 {-
1100# if defined (DPAREN_ARITHMETIC)-
1101 case cm_arith:
executed 6476017 times by 1 test: case cm_arith:
Executed by:
  • Self test
6476017
1102# endif-
1103# if defined (COND_COMMAND)-
1104 case cm_cond:
executed 629 times by 1 test: case cm_cond:
Executed by:
  • Self test
629
1105# endif-
1106 set_pipestatus_from_exit (exec_result);-
1107 break;
executed 6476646 times by 1 test: break;
Executed by:
  • Self test
6476646
1108 default:
executed 171277089 times by 1 test: default:
Executed by:
  • Self test
171277089
1109 break;
executed 171277089 times by 1 test: break;
Executed by:
  • Self test
171277089
1110 }-
1111#endif-
1112-
1113 last_command_exit_value = exec_result;-
1114 run_pending_traps ();-
1115#if 0-
1116 if (running_trap == 0)-
1117#endif-
1118 currently_executing_command = (COMMAND *)NULL;-
1119-
1120 return (last_command_exit_value);
executed 177753735 times by 1 test: return (last_command_exit_value);
Executed by:
  • Self test
177753735
1121}-
1122-
1123#if defined (COMMAND_TIMING)-
1124-
1125#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)-
1126extern struct timeval *difftimeval __P((struct timeval *, struct timeval *, struct timeval *));-
1127extern struct timeval *addtimeval __P((struct timeval *, struct timeval *, struct timeval *));-
1128extern int timeval_to_cpu __P((struct timeval *, struct timeval *, struct timeval *));-
1129#endif-
1130-
1131#define POSIX_TIMEFORMAT "real %2R\nuser %2U\nsys %2S"-
1132#define BASH_TIMEFORMAT "\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS"-
1133-
1134static const int precs[] = { 0, 100, 10, 1 };-
1135-
1136/* Expand one `%'-prefixed escape sequence from a time format string. */-
1137static int-
1138mkfmt (buf, prec, lng, sec, sec_fraction)-
1139 char *buf;-
1140 int prec, lng;-
1141 time_t sec;-
1142 int sec_fraction;-
1143{-
1144 time_t min;-
1145 char abuf[INT_STRLEN_BOUND(time_t) + 1];-
1146 int ind, aind;-
1147-
1148 ind = 0;-
1149 abuf[sizeof(abuf) - 1] = '\0';-
1150-
1151 /* If LNG is non-zero, we want to decompose SEC into minutes and seconds. */-
1152 if (lng)
lngDescription
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
1153 {-
1154 min = sec / 60;-
1155 sec %= 60;-
1156 aind = sizeof(abuf) - 2;-
1157 do-
1158 abuf[aind--] = (min % 10) + '0';
never executed: abuf[aind--] = (min % 10) + '0';
0
1159 while (min /= 10);
min /= 10Description
TRUEnever evaluated
FALSEnever evaluated
0
1160 aind++;-
1161 while (abuf[aind])
abuf[aind]Description
TRUEnever evaluated
FALSEnever evaluated
0
1162 buf[ind++] = abuf[aind++];
never executed: buf[ind++] = abuf[aind++];
0
1163 buf[ind++] = 'm';-
1164 }
never executed: end of block
0
1165-
1166 /* Now add the seconds. */-
1167 aind = sizeof (abuf) - 2;-
1168 do-
1169 abuf[aind--] = (sec % 10) + '0';
executed 18 times by 1 test: abuf[aind--] = (sec % 10) + '0';
Executed by:
  • Self test
18
1170 while (sec /= 10);
sec /= 10Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
1171 aind++;-
1172 while (abuf[aind])
abuf[aind]Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
18
1173 buf[ind++] = abuf[aind++];
executed 18 times by 1 test: buf[ind++] = abuf[aind++];
Executed by:
  • Self test
18
1174-
1175 /* We want to add a decimal point and PREC places after it if PREC is-
1176 nonzero. PREC is not greater than 3. SEC_FRACTION is between 0-
1177 and 999. */-
1178 if (prec != 0)
prec != 0Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-18
1179 {-
1180 buf[ind++] = locale_decpoint ();-
1181 for (aind = 1; aind <= prec; aind++)
aind <= precDescription
TRUEevaluated 36 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
18-36
1182 {-
1183 buf[ind++] = (sec_fraction / precs[aind]) + '0';-
1184 sec_fraction %= precs[aind];-
1185 }
executed 36 times by 1 test: end of block
Executed by:
  • Self test
36
1186 }
executed 18 times by 1 test: end of block
Executed by:
  • Self test
18
1187-
1188 if (lng)
lngDescription
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
1189 buf[ind++] = 's';
never executed: buf[ind++] = 's';
0
1190 buf[ind] = '\0';-
1191-
1192 return (ind);
executed 18 times by 1 test: return (ind);
Executed by:
  • Self test
18
1193}-
1194-
1195/* Interpret the format string FORMAT, interpolating the following escape-
1196 sequences:-
1197 %[prec][l][RUS]-
1198-
1199 where the optional `prec' is a precision, meaning the number of-
1200 characters after the decimal point, the optional `l' means to format-
1201 using minutes and seconds (MMmNN[.FF]s), like the `times' builtin',-
1202 and the last character is one of-
1203 -
1204 R number of seconds of `real' time-
1205 U number of seconds of `user' time-
1206 S number of seconds of `system' time-
1207-
1208 An occurrence of `%%' in the format string is translated to a `%'. The-
1209 result is printed to FP, a pointer to a FILE. The other variables are-
1210 the seconds and thousandths of a second of real, user, and system time,-
1211 resectively. */-
1212static void-
1213print_formatted_time (fp, format, rs, rsf, us, usf, ss, ssf, cpu)-
1214 FILE *fp;-
1215 char *format;-
1216 time_t rs;-
1217 int rsf;-
1218 time_t us;-
1219 int usf;-
1220 time_t ss;-
1221 int ssf, cpu;-
1222{-
1223 int prec, lng, len;-
1224 char *str, *s, ts[INT_STRLEN_BOUND (time_t) + sizeof ("mSS.FFFF")];-
1225 time_t sum;-
1226 int sum_frac;-
1227 int sindex, ssize;-
1228-
1229 len = strlen (format);-
1230 ssize = (len + 64) - (len % 64);-
1231 str = (char *)xmalloc (ssize);-
1232 sindex = 0;-
1233-
1234 for (s = format; *s; s++)
*sDescription
TRUEevaluated 114 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
6-114
1235 {-
1236 if (*s != '%' || s[1] == '\0')
*s != '%'Description
TRUEevaluated 96 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
s[1] == '\0'Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-96
1237 {-
1238 RESIZE_MALLOCED_BUFFER (str, sindex, 1, ssize, 64);
never executed: ssize += (64);
never executed: end of block
(sindex) + (1) >= ssizeDescription
TRUEnever evaluated
FALSEevaluated 96 times by 1 test
Evaluated by:
  • Self test
(sindex) + (1) >= ssizeDescription
TRUEnever evaluated
FALSEnever evaluated
0-96
1239 str[sindex++] = *s;-
1240 }
executed 96 times by 1 test: end of block
Executed by:
  • Self test
96
1241 else if (s[1] == '%')
s[1] == '%'Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
1242 {-
1243 s++;-
1244 RESIZE_MALLOCED_BUFFER (str, sindex, 1, ssize, 64);
never executed: ssize += (64);
never executed: end of block
(sindex) + (1) >= ssizeDescription
TRUEnever evaluated
FALSEnever evaluated
(sindex) + (1) >= ssizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1245 str[sindex++] = *s;-
1246 }
never executed: end of block
0
1247 else if (s[1] == 'P')
s[1] == 'P'Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
1248 {-
1249 s++;-
1250#if 0-
1251 /* clamp CPU usage at 100% */-
1252 if (cpu > 10000)-
1253 cpu = 10000;-
1254#endif-
1255 sum = cpu / 100;-
1256 sum_frac = (cpu % 100) * 10;-
1257 len = mkfmt (ts, 2, 0, sum, sum_frac);-
1258 RESIZE_MALLOCED_BUFFER (str, sindex, len, ssize, 64);
never executed: ssize += (64);
never executed: end of block
(sindex) + (len) >= ssizeDescription
TRUEnever evaluated
FALSEnever evaluated
(sindex) + (len) >= ssizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1259 strcpy (str + sindex, ts);-
1260 sindex += len;-
1261 }
never executed: end of block
0
1262 else-
1263 {-
1264 prec = 3; /* default is three places past the decimal point. */-
1265 lng = 0; /* default is to not use minutes or append `s' */-
1266 s++;-
1267 if (DIGIT (*s)) /* `precision' */
(*s) >= '0'Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(*s) <= '9'Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-18
1268 {-
1269 prec = *s++ - '0';-
1270 if (prec > 3) prec = 3;
never executed: prec = 3;
prec > 3Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
1271 }
executed 18 times by 1 test: end of block
Executed by:
  • Self test
18
1272 if (*s == 'l') /* `length extender' */
*s == 'l'Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
1273 {-
1274 lng = 1;-
1275 s++;-
1276 }
never executed: end of block
0
1277 if (*s == 'R' || *s == 'E')
*s == 'R'Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
*s == 'E'Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
1278 len = mkfmt (ts, prec, lng, rs, rsf);
executed 6 times by 1 test: len = mkfmt (ts, prec, lng, rs, rsf);
Executed by:
  • Self test
6
1279 else if (*s == 'U')
*s == 'U'Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
6
1280 len = mkfmt (ts, prec, lng, us, usf);
executed 6 times by 1 test: len = mkfmt (ts, prec, lng, us, usf);
Executed by:
  • Self test
6
1281 else if (*s == 'S')
*s == 'S'Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
1282 len = mkfmt (ts, prec, lng, ss, ssf);
executed 6 times by 1 test: len = mkfmt (ts, prec, lng, ss, ssf);
Executed by:
  • Self test
6
1283 else-
1284 {-
1285 internal_error (_("TIMEFORMAT: `%c': invalid format character"), *s);-
1286 free (str);-
1287 return;
never executed: return;
0
1288 }-
1289 RESIZE_MALLOCED_BUFFER (str, sindex, len, ssize, 64);
never executed: ssize += (64);
never executed: end of block
(sindex) + (len) >= ssizeDescription
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
(sindex) + (len) >= ssizeDescription
TRUEnever evaluated
FALSEnever evaluated
0-18
1290 strcpy (str + sindex, ts);-
1291 sindex += len;-
1292 }
executed 18 times by 1 test: end of block
Executed by:
  • Self test
18
1293 }-
1294-
1295 str[sindex] = '\0';-
1296 fprintf (fp, "%s\n", str);-
1297 fflush (fp);-
1298-
1299 free (str);-
1300}
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
1301-
1302static int-
1303time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close)-
1304 COMMAND *command;-
1305 int asynchronous, pipe_in, pipe_out;-
1306 struct fd_bitmap *fds_to_close;-
1307{-
1308 int rv, posix_time, old_flags, nullcmd, code;-
1309 time_t rs, us, ss;-
1310 int rsf, usf, ssf;-
1311 int cpu;-
1312 char *time_format;-
1313 volatile procenv_t save_top_level;-
1314-
1315#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)-
1316 struct timeval real, user, sys;-
1317 struct timeval before, after;-
1318# if defined (HAVE_STRUCT_TIMEZONE)-
1319 struct timezone dtz; /* posix doesn't define this */-
1320# endif-
1321 struct rusage selfb, selfa, kidsb, kidsa; /* a = after, b = before */-
1322#else-
1323# if defined (HAVE_TIMES)-
1324 clock_t tbefore, tafter, real, user, sys;-
1325 struct tms before, after;-
1326# endif-
1327#endif-
1328-
1329#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)-
1330# if defined (HAVE_STRUCT_TIMEZONE)-
1331 gettimeofday (&before, &dtz);-
1332# else-
1333 gettimeofday (&before, (void *)NULL);-
1334# endif /* !HAVE_STRUCT_TIMEZONE */-
1335 getrusage (RUSAGE_SELF, &selfb);-
1336 getrusage (RUSAGE_CHILDREN, &kidsb);-
1337#else-
1338# if defined (HAVE_TIMES)-
1339 tbefore = times (&before);-
1340# endif-
1341#endif-
1342-
1343 posix_time = command && (command->flags & CMD_TIME_POSIX);
commandDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(command->flags & 0x100)Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-6
1344-
1345 nullcmd = (command == 0) || (command->type == cm_simple && command->value.Simple->words == 0 && command->value.Simple->redirects == 0);
(command == 0)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
command->type == cm_simpleDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
command->value...le->words == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
command->value...redirects == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-6
1346 if (posixly_correct && nullcmd)
posixly_correctDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
nullcmdDescription
TRUEnever evaluated
FALSEnever evaluated
0-6
1347 {-
1348#if defined (HAVE_GETRUSAGE)-
1349 selfb.ru_utime.tv_sec = kidsb.ru_utime.tv_sec = selfb.ru_stime.tv_sec = kidsb.ru_stime.tv_sec = 0;-
1350 selfb.ru_utime.tv_usec = kidsb.ru_utime.tv_usec = selfb.ru_stime.tv_usec = kidsb.ru_stime.tv_usec = 0;-
1351 before.tv_sec = shell_start_time;-
1352 before.tv_usec = 0;-
1353#else-
1354 before.tms_utime = before.tms_stime = before.tms_cutime = before.tms_cstime = 0;-
1355 tbefore = shell_start_time;-
1356#endif-
1357 }
never executed: end of block
0
1358-
1359 old_flags = command->flags;-
1360 COPY_PROCENV (top_level, save_top_level);-
1361 command->flags &= ~(CMD_TIME_PIPELINE|CMD_TIME_POSIX);-
1362 code = setjmp_nosigs (top_level);-
1363 if (code == NOT_JUMPED)
code == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
1364 {-
1365 rv = execute_command_internal (command, asynchronous, pipe_in, pipe_out, fds_to_close);-
1366 command->flags = old_flags;-
1367 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
1368 COPY_PROCENV (save_top_level, top_level);-
1369-
1370 rs = us = ss = 0;-
1371 rsf = usf = ssf = cpu = 0;-
1372-
1373#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)-
1374# if defined (HAVE_STRUCT_TIMEZONE)-
1375 gettimeofday (&after, &dtz);-
1376# else-
1377 gettimeofday (&after, (void *)NULL);-
1378# endif /* !HAVE_STRUCT_TIMEZONE */-
1379 getrusage (RUSAGE_SELF, &selfa);-
1380 getrusage (RUSAGE_CHILDREN, &kidsa);-
1381-
1382 difftimeval (&real, &before, &after);-
1383 timeval_to_secs (&real, &rs, &rsf);-
1384-
1385 addtimeval (&user, difftimeval(&after, &selfb.ru_utime, &selfa.ru_utime),-
1386 difftimeval(&before, &kidsb.ru_utime, &kidsa.ru_utime));-
1387 timeval_to_secs (&user, &us, &usf);-
1388-
1389 addtimeval (&sys, difftimeval(&after, &selfb.ru_stime, &selfa.ru_stime),-
1390 difftimeval(&before, &kidsb.ru_stime, &kidsa.ru_stime));-
1391 timeval_to_secs (&sys, &ss, &ssf);-
1392-
1393 cpu = timeval_to_cpu (&real, &user, &sys);-
1394#else-
1395# if defined (HAVE_TIMES)-
1396 tafter = times (&after);-
1397-
1398 real = tafter - tbefore;-
1399 clock_t_to_secs (real, &rs, &rsf);-
1400-
1401 user = (after.tms_utime - before.tms_utime) + (after.tms_cutime - before.tms_cutime);-
1402 clock_t_to_secs (user, &us, &usf);-
1403-
1404 sys = (after.tms_stime - before.tms_stime) + (after.tms_cstime - before.tms_cstime);-
1405 clock_t_to_secs (sys, &ss, &ssf);-
1406-
1407 cpu = (real == 0) ? 0 : ((user + sys) * 10000) / real;-
1408-
1409# else-
1410 rs = us = ss = 0;-
1411 rsf = usf = ssf = cpu = 0;-
1412# endif-
1413#endif-
1414-
1415 if (posix_time)
posix_timeDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
3
1416 time_format = POSIX_TIMEFORMAT;
executed 3 times by 1 test: time_format = "real %2R\nuser %2U\nsys %2S";
Executed by:
  • Self test
3
1417 else if ((time_format = get_string_value ("TIMEFORMAT")) == 0)
(time_format =...FORMAT")) == 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
1418 {-
1419 if (posixly_correct && nullcmd)
posixly_correctDescription
TRUEnever evaluated
FALSEnever evaluated
nullcmdDescription
TRUEnever evaluated
FALSEnever evaluated
0
1420 time_format = "user\t%2lU\nsys\t%2lS";
never executed: time_format = "user\t%2lU\nsys\t%2lS";
0
1421 else-
1422 time_format = BASH_TIMEFORMAT;
never executed: time_format = "\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS";
0
1423 }-
1424 if (time_format && *time_format)
time_formatDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
*time_formatDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
1425 print_formatted_time (stderr, time_format, rs, rsf, us, usf, ss, ssf, cpu);
executed 6 times by 1 test: print_formatted_time ( stderr , time_format, rs, rsf, us, usf, ss, ssf, cpu);
Executed by:
  • Self test
6
1426-
1427 if (code)
codeDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
1428 sh_longjmp (top_level, code);
never executed: siglongjmp((top_level), (code));
0
1429-
1430 return rv;
executed 6 times by 1 test: return rv;
Executed by:
  • Self test
6
1431}-
1432#endif /* COMMAND_TIMING */-
1433-
1434/* Execute a command that's supposed to be in a subshell. This must be-
1435 called after make_child and we must be running in the child process.-
1436 The caller will return or exit() immediately with the value this returns. */-
1437static int-
1438execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)-
1439 COMMAND *command;-
1440 int asynchronous;-
1441 int pipe_in, pipe_out;-
1442 struct fd_bitmap *fds_to_close;-
1443{-
1444 volatile int user_subshell, user_coproc, invert;-
1445 int return_code, function_value, should_redir_stdin, ois, result;-
1446 volatile COMMAND *tcom;-
1447-
1448 USE_VAR(user_subshell);-
1449 USE_VAR(user_coproc);-
1450 USE_VAR(invert);-
1451 USE_VAR(tcom);-
1452 USE_VAR(asynchronous);-
1453-
1454 subshell_level++;-
1455 should_redir_stdin = (asynchronous && (command->flags & CMD_STDIN_REDIR) &&
asynchronousDescription
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1102 times by 1 test
Evaluated by:
  • Self test
(command->flags & 0x400)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 16 times by 1 test
Evaluated by:
  • Self test
4-1102
1456 pipe_in == NO_PIPE &&
pipe_in == -1Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-4
1457 stdin_redirects (command->redirects) == 0);
stdin_redirect...edirects) == 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-4
1458-
1459 invert = (command->flags & CMD_INVERT_RETURN) != 0;-
1460 user_subshell = command->type == cm_subshell || ((command->flags & CMD_WANT_SUBSHELL) != 0);
command->type == cm_subshellDescription
TRUEevaluated 1060 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 62 times by 1 test
Evaluated by:
  • Self test
((command->flags & 0x01) != 0)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test
8-1060
1461 user_coproc = command->type == cm_coproc;-
1462-
1463 command->flags &= ~(CMD_FORCE_SUBSHELL | CMD_WANT_SUBSHELL | CMD_INVERT_RETURN);-
1464-
1465 /* If a command is asynchronous in a subshell (like ( foo ) & or-
1466 the special case of an asynchronous GROUP command where the-
1467 the subshell bit is turned on down in case cm_group: below),-
1468 turn off `asynchronous', so that two subshells aren't spawned.-
1469 XXX - asynchronous used to be set to 0 in this block, but that-
1470 means that setup_async_signals was never run. Now it's set to-
1471 0 after subshell_environment is set appropriately and setup_async_signals-
1472 is run.-
1473-
1474 This seems semantically correct to me. For example,-
1475 ( foo ) & seems to say ``do the command `foo' in a subshell-
1476 environment, but don't wait for that subshell to finish'',-
1477 and "{ foo ; bar ; } &" seems to me to be like functions or-
1478 builtins in the background, which executed in a subshell-
1479 environment. I just don't see the need to fork two subshells. */-
1480-
1481 /* Don't fork again, we are already in a subshell. A `doubly-
1482 async' shell is not interactive, however. */-
1483 if (asynchronous)
asynchronousDescription
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1102 times by 1 test
Evaluated by:
  • Self test
20-1102
1484 {-
1485#if defined (JOB_CONTROL)-
1486 /* If a construct like ( exec xxx yyy ) & is given while job-
1487 control is active, we want to prevent exec from putting the-
1488 subshell back into the original process group, carefully-
1489 undoing all the work we just did in make_child. */-
1490 original_pgrp = -1;-
1491#endif /* JOB_CONTROL */-
1492 ois = interactive_shell;-
1493 interactive_shell = 0;-
1494 /* This test is to prevent alias expansion by interactive shells that-
1495 run `(command) &' but to allow scripts that have enabled alias-
1496 expansion with `shopt -s expand_alias' to continue to expand-
1497 aliases. */-
1498 if (ois != interactive_shell)
ois != interactive_shellDescription
TRUEnever evaluated
FALSEevaluated 20 times by 1 test
Evaluated by:
  • Self test
0-20
1499 expand_aliases = 0;
never executed: expand_aliases = 0;
0
1500 }
executed 20 times by 1 test: end of block
Executed by:
  • Self test
20
1501-
1502 /* Subshells are neither login nor interactive. */-
1503 login_shell = interactive = 0;-
1504-
1505 if (user_subshell)
user_subshellDescription
TRUEevaluated 1068 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test
54-1068
1506 {-
1507 subshell_environment = SUBSHELL_PAREN; /* XXX */-
1508 if (asynchronous)
asynchronousDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1057 times by 1 test
Evaluated by:
  • Self test
11-1057
1509 subshell_environment |= SUBSHELL_ASYNC;
executed 11 times by 1 test: subshell_environment |= 0x01;
Executed by:
  • Self test
11
1510 }
executed 1068 times by 1 test: end of block
Executed by:
  • Self test
1068
1511 else-
1512 {-
1513 subshell_environment = 0; /* XXX */-
1514 if (asynchronous)
asynchronousDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 45 times by 1 test
Evaluated by:
  • Self test
9-45
1515 subshell_environment |= SUBSHELL_ASYNC;
executed 9 times by 1 test: subshell_environment |= 0x01;
Executed by:
  • Self test
9
1516 if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
pipe_in != -1Description
TRUEevaluated 38 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 16 times by 1 test
Evaluated by:
  • Self test
pipe_out != -1Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
7-38
1517 subshell_environment |= SUBSHELL_PIPE;
executed 45 times by 1 test: subshell_environment |= 0x10;
Executed by:
  • Self test
45
1518 if (user_coproc)
user_coprocDescription
TRUEnever evaluated
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test
0-54
1519 subshell_environment |= SUBSHELL_COPROC;
never executed: subshell_environment |= 0x40;
0
1520 }
executed 54 times by 1 test: end of block
Executed by:
  • Self test
54
1521-
1522 reset_terminating_signals (); /* in sig.c */-
1523 /* Cancel traps, in trap.c. */-
1524 /* Reset the signal handlers in the child, but don't free the-
1525 trap strings. Set a flag noting that we have to free the-
1526 trap strings if we run trap to change a signal disposition. */-
1527 reset_signal_handlers ();-
1528 subshell_environment |= SUBSHELL_RESETTRAP;-
1529-
1530 /* Make sure restore_original_signals doesn't undo the work done by-
1531 make_child to ensure that asynchronous children are immune to SIGINT-
1532 and SIGQUIT. Turn off asynchronous to make sure more subshells are-
1533 not spawned. */-
1534 if (asynchronous)
asynchronousDescription
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1102 times by 1 test
Evaluated by:
  • Self test
20-1102
1535 {-
1536 setup_async_signals ();-
1537 asynchronous = 0;-
1538 }
executed 20 times by 1 test: end of block
Executed by:
  • Self test
20
1539-
1540#if defined (JOB_CONTROL)-
1541 set_sigchld_handler ();-
1542#endif /* JOB_CONTROL */-
1543-
1544 set_sigint_handler ();-
1545-
1546 /* Delete all traces that there were any jobs running. This is-
1547 only for subshells. */-
1548 without_job_control ();-
1549-
1550 if (fds_to_close)
fds_to_closeDescription
TRUEevaluated 1122 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1122
1551 close_fd_bitmap (fds_to_close);
executed 1122 times by 1 test: close_fd_bitmap (fds_to_close);
Executed by:
  • Self test
1122
1552-
1553 do_piping (pipe_in, pipe_out);-
1554-
1555#if defined (COPROCESS_SUPPORT)-
1556 coproc_closeall ();-
1557#endif-
1558-
1559 /* If this is a user subshell, set a flag if stdin was redirected.-
1560 This is used later to decide whether to redirect fd 0 to-
1561 /dev/null for async commands in the subshell. This adds more-
1562 sh compatibility, but I'm not sure it's the right thing to do.-
1563 Note that an input pipe to a compound command suffices to inhibit-
1564 the implicit /dev/null redirection for asynchronous commands-
1565 executed as part of that compound command. */-
1566 if (user_subshell)
user_subshellDescription
TRUEevaluated 1068 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test
54-1068
1567 {-
1568 stdin_redir = stdin_redirects (command->redirects) || pipe_in != NO_PIPE;
stdin_redirect...nd->redirects)Description
TRUEnever evaluated
FALSEevaluated 1068 times by 1 test
Evaluated by:
  • Self test
pipe_in != -1Description
TRUEevaluated 787 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 281 times by 1 test
Evaluated by:
  • Self test
0-1068
1569#if 0-
1570 restore_default_signal (EXIT_TRAP); /* XXX - reset_signal_handlers above */-
1571#endif-
1572 }
executed 1068 times by 1 test: end of block
Executed by:
  • Self test
1068
1573 else if (shell_control_structure (command->type) && pipe_in != NO_PIPE)
shell_control_...command->type)Description
TRUEevaluated 54 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
pipe_in != -1Description
TRUEevaluated 38 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 16 times by 1 test
Evaluated by:
  • Self test
0-54
1574 stdin_redir = 1;
executed 38 times by 1 test: stdin_redir = 1;
Executed by:
  • Self test
38
1575-
1576 /* If this is an asynchronous command (command &), we want to-
1577 redirect the standard input from /dev/null in the absence of-
1578 any specific redirection involving stdin. */-
1579 if (should_redir_stdin && stdin_redir == 0)
should_redir_stdinDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1118 times by 1 test
Evaluated by:
  • Self test
stdin_redir == 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1118
1580 async_redirect_stdin ();
executed 4 times by 1 test: async_redirect_stdin ();
Executed by:
  • Self test
4
1581-
1582#if 0-
1583 /* bash-5.0 */-
1584 if (user_subshell && command->type == cm_subshell)-
1585 optimize_subshell_command (command->value.Subshell->command);-
1586#endif-
1587-
1588 /* Do redirections, then dispose of them before recursive call. */-
1589 if (command->redirects)
command->redirectsDescription
TRUEevaluated 70 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1052 times by 1 test
Evaluated by:
  • Self test
70-1052
1590 {-
1591 if (do_redirections (command->redirects, RX_ACTIVE) != 0)
do_redirection...ts, 0x01) != 0Description
TRUEnever evaluated
FALSEevaluated 70 times by 1 test
Evaluated by:
  • Self test
0-70
1592 exit (invert ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
never executed: exit (invert ? 0 : 1);
0
1593-
1594 dispose_redirects (command->redirects);-
1595 command->redirects = (REDIRECT *)NULL;-
1596 }
executed 70 times by 1 test: end of block
Executed by:
  • Self test
70
1597-
1598 if (command->type == cm_subshell)
command->type == cm_subshellDescription
TRUEevaluated 1060 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 62 times by 1 test
Evaluated by:
  • Self test
62-1060
1599 tcom = command->value.Subshell->command;
executed 1060 times by 1 test: tcom = command->value.Subshell->command;
Executed by:
  • Self test
1060
1600 else if (user_coproc)
user_coprocDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test
8-54
1601 tcom = command->value.Coproc->command;
executed 8 times by 1 test: tcom = command->value.Coproc->command;
Executed by:
  • Self test
8
1602 else-
1603 tcom = command;
executed 54 times by 1 test: tcom = command;
Executed by:
  • Self test
54
1604-
1605 if (command->flags & CMD_TIME_PIPELINE)
command->flags & 0x80Description
TRUEnever evaluated
FALSEevaluated 1122 times by 1 test
Evaluated by:
  • Self test
0-1122
1606 tcom->flags |= CMD_TIME_PIPELINE;
never executed: tcom->flags |= 0x80;
0
1607 if (command->flags & CMD_TIME_POSIX)
command->flags & 0x100Description
TRUEnever evaluated
FALSEevaluated 1122 times by 1 test
Evaluated by:
  • Self test
0-1122
1608 tcom->flags |= CMD_TIME_POSIX;
never executed: tcom->flags |= 0x100;
0
1609 -
1610 /* Make sure the subshell inherits any CMD_IGNORE_RETURN flag. */-
1611 if ((command->flags & CMD_IGNORE_RETURN) && tcom != command)
(command->flags & 0x08)Description
TRUEevaluated 59 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1063 times by 1 test
Evaluated by:
  • Self test
tcom != commandDescription
TRUEevaluated 58 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-1063
1612 tcom->flags |= CMD_IGNORE_RETURN;
executed 58 times by 1 test: tcom->flags |= 0x08;
Executed by:
  • Self test
58
1613-
1614 /* If this is a simple command, tell execute_disk_command that it-
1615 might be able to get away without forking and simply exec.-
1616 This means things like ( sleep 10 ) will only cause one fork.-
1617 If we're timing the command or inverting its return value, however,-
1618 we cannot do this optimization. */-
1619 if ((user_subshell || user_coproc) && (tcom->type == cm_simple || tcom->type == cm_subshell) &&
user_subshellDescription
TRUEevaluated 1068 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test
user_coprocDescription
TRUEnever evaluated
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test
tcom->type == cm_simpleDescription
TRUEevaluated 91 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 977 times by 1 test
Evaluated by:
  • Self test
tcom->type == cm_subshellDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 975 times by 1 test
Evaluated by:
  • Self test
0-1068
1620 ((tcom->flags & CMD_TIME_PIPELINE) == 0) &&
((tcom->flags & 0x80) == 0)Description
TRUEevaluated 93 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-93
1621 ((tcom->flags & CMD_INVERT_RETURN) == 0))
((tcom->flags & 0x04) == 0)Description
TRUEevaluated 87 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
6-87
1622 {-
1623 tcom->flags |= CMD_NO_FORK;-
1624 if (tcom->type == cm_simple)
tcom->type == cm_simpleDescription
TRUEevaluated 85 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-85
1625 tcom->value.Simple->flags |= CMD_NO_FORK;
executed 85 times by 1 test: tcom->value.Simple->flags |= 0x40;
Executed by:
  • Self test
85
1626 }
executed 87 times by 1 test: end of block
Executed by:
  • Self test
87
1627-
1628 invert = (tcom->flags & CMD_INVERT_RETURN) != 0;-
1629 tcom->flags &= ~CMD_INVERT_RETURN;-
1630-
1631 result = setjmp_nosigs (top_level);-
1632-
1633 /* If we're inside a function while executing this subshell, we-
1634 need to handle a possible `return'. */-
1635 function_value = 0;-
1636 if (return_catch_flag)
return_catch_flagDescription
TRUEevaluated 792 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 384 times by 1 test
Evaluated by:
  • Self test
384-792
1637 function_value = setjmp_nosigs (return_catch);
executed 792 times by 1 test: function_value = __sigsetjmp ( (return_catch) , 0 ) ;
Executed by:
  • Self test
792
1638-
1639 /* If we're going to exit the shell, we don't want to invert the return-
1640 status. */-
1641 if (result == EXITPROG)
result == 3Description
TRUEevaluated 21 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1156 times by 1 test
Evaluated by:
  • Self test
21-1156
1642 invert = 0, return_code = last_command_exit_value;
executed 21 times by 1 test: invert = 0, return_code = last_command_exit_value;
Executed by:
  • Self test
21
1643 else if (result)
resultDescription
TRUEevaluated 33 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1123 times by 1 test
Evaluated by:
  • Self test
33-1123
1644 return_code = (last_command_exit_value == EXECUTION_SUCCESS) ? EXECUTION_FAILURE : last_command_exit_value;
executed 33 times by 1 test: return_code = (last_command_exit_value == 0) ? 1 : last_command_exit_value;
Executed by:
  • Self test
(last_command_exit_value == 0)Description
TRUEnever evaluated
FALSEevaluated 33 times by 1 test
Evaluated by:
  • Self test
0-33
1645 else if (function_value)
function_valueDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1122 times by 1 test
Evaluated by:
  • Self test
1-1122
1646 return_code = return_catch_value;
executed 1 time by 1 test: return_code = return_catch_value;
Executed by:
  • Self test
1
1647 else-
1648 return_code = execute_command_internal ((COMMAND *)tcom, asynchronous, NO_PIPE, NO_PIPE, fds_to_close);
executed 1122 times by 1 test: return_code = execute_command_internal ((COMMAND *)tcom, asynchronous, -1, -1, fds_to_close);
Executed by:
  • Self test
1122
1649-
1650 /* If we are asked to, invert the return value. */-
1651 if (invert)
invertDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 987 times by 1 test
Evaluated by:
  • Self test
4-987
1652 return_code = (return_code == EXECUTION_SUCCESS) ? EXECUTION_FAILURE
executed 4 times by 1 test: return_code = (return_code == 0) ? 1 : 0;
Executed by:
  • Self test
(return_code == 0)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-4
1653 : EXECUTION_SUCCESS;
executed 4 times by 1 test: return_code = (return_code == 0) ? 1 : 0;
Executed by:
  • Self test
4
1654-
1655 /* If we were explicitly placed in a subshell with (), we need-
1656 to do the `shell cleanup' things, such as running traps[0]. */-
1657 if (user_subshell && signal_is_trapped (0))
user_subshellDescription
TRUEevaluated 939 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 52 times by 1 test
Evaluated by:
  • Self test
signal_is_trapped (0)Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 927 times by 1 test
Evaluated by:
  • Self test
12-939
1658 {-
1659 last_command_exit_value = return_code;-
1660 return_code = run_exit_trap ();-
1661 }
executed 12 times by 1 test: end of block
Executed by:
  • Self test
12
1662-
1663#if 0-
1664 subshell_level--; /* don't bother, caller will just exit */-
1665#endif-
1666 return (return_code);
executed 991 times by 1 test: return (return_code);
Executed by:
  • Self test
991
1667 /* NOTREACHED */-
1668}-
1669-
1670#if defined (COPROCESS_SUPPORT)-
1671#define COPROC_MAX 16-
1672-
1673typedef struct cpelement-
1674 {-
1675 struct cpelement *next;-
1676 struct coproc *coproc;-
1677 }-
1678cpelement_t;-
1679 -
1680typedef struct cplist-
1681 {-
1682 struct cpelement *head;-
1683 struct cpelement *tail;-
1684 int ncoproc;-
1685 int lock;-
1686 }-
1687cplist_t;-
1688-
1689static struct cpelement *cpe_alloc __P((struct coproc *));-
1690static void cpe_dispose __P((struct cpelement *));-
1691static struct cpelement *cpl_add __P((struct coproc *));-
1692static struct cpelement *cpl_delete __P((pid_t));-
1693static void cpl_reap __P((void));-
1694static void cpl_flush __P((void));-
1695static void cpl_closeall __P((void));-
1696static struct cpelement *cpl_search __P((pid_t));-
1697static struct cpelement *cpl_searchbyname __P((const char *));-
1698static void cpl_prune __P((void));-
1699-
1700static void coproc_free __P((struct coproc *));-
1701-
1702/* Will go away when there is fully-implemented support for multiple coprocs. */-
1703Coproc sh_coproc = { 0, NO_PID, -1, -1, 0, 0, 0, 0, 0 };-
1704-
1705cplist_t coproc_list = {0, 0, 0};-
1706-
1707/* Functions to manage the list of coprocs */-
1708-
1709static struct cpelement *-
1710cpe_alloc (cp)-
1711 Coproc *cp;-
1712{-
1713 struct cpelement *cpe;-
1714-
1715 cpe = (struct cpelement *)xmalloc (sizeof (struct cpelement));-
1716 cpe->coproc = cp;-
1717 cpe->next = (struct cpelement *)0;-
1718 return cpe;
never executed: return cpe;
0
1719}-
1720-
1721static void-
1722cpe_dispose (cpe)-
1723 struct cpelement *cpe;-
1724{-
1725 free (cpe);-
1726}
never executed: end of block
0
1727-
1728static struct cpelement *-
1729cpl_add (cp)-
1730 Coproc *cp;-
1731{-
1732 struct cpelement *cpe;-
1733-
1734 cpe = cpe_alloc (cp);-
1735-
1736 if (coproc_list.head == 0)
coproc_list.head == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1737 {-
1738 coproc_list.head = coproc_list.tail = cpe;-
1739 coproc_list.ncoproc = 0; /* just to make sure */-
1740 }
never executed: end of block
0
1741 else-
1742 {-
1743 coproc_list.tail->next = cpe;-
1744 coproc_list.tail = cpe;-
1745 }
never executed: end of block
0
1746 coproc_list.ncoproc++;-
1747-
1748 return cpe;
never executed: return cpe;
0
1749}-
1750-
1751static struct cpelement *-
1752cpl_delete (pid)-
1753 pid_t pid;-
1754{-
1755 struct cpelement *prev, *p;-
1756-
1757 for (prev = p = coproc_list.head; p; prev = p, p = p->next)
pDescription
TRUEnever evaluated
FALSEnever evaluated
0
1758 if (p->coproc->c_pid == pid)
p->coproc->c_pid == pidDescription
TRUEnever evaluated
FALSEnever evaluated
0
1759 {-
1760 prev->next = p->next; /* remove from list */-
1761 break;
never executed: break;
0
1762 }-
1763-
1764 if (p == 0)
p == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1765 return 0; /* not found */
never executed: return 0;
0
1766-
1767#if defined (DEBUG)-
1768 itrace("cpl_delete: deleting %d", pid);-
1769#endif-
1770-
1771 /* Housekeeping in the border cases. */-
1772 if (p == coproc_list.head)
p == coproc_list.headDescription
TRUEnever evaluated
FALSEnever evaluated
0
1773 coproc_list.head = coproc_list.head->next;
never executed: coproc_list.head = coproc_list.head->next;
0
1774 else if (p == coproc_list.tail)
p == coproc_list.tailDescription
TRUEnever evaluated
FALSEnever evaluated
0
1775 coproc_list.tail = prev;
never executed: coproc_list.tail = prev;
0
1776-
1777 coproc_list.ncoproc--;-
1778 if (coproc_list.ncoproc == 0)
coproc_list.ncoproc == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1779 coproc_list.head = coproc_list.tail = 0;
never executed: coproc_list.head = coproc_list.tail = 0;
0
1780 else if (coproc_list.ncoproc == 1)
coproc_list.ncoproc == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
1781 coproc_list.tail = coproc_list.head; /* just to make sure */
never executed: coproc_list.tail = coproc_list.head;
0
1782-
1783 return (p);
never executed: return (p);
0
1784}-
1785-
1786static void-
1787cpl_reap ()-
1788{-
1789 struct cpelement *p, *next, *nh, *nt;-
1790-
1791 /* Build a new list by removing dead coprocs and fix up the coproc_list-
1792 pointers when done. */-
1793 nh = nt = next = (struct cpelement *)0;-
1794 for (p = coproc_list.head; p; p = next)
pDescription
TRUEnever evaluated
FALSEnever evaluated
0
1795 {-
1796 next = p->next;-
1797 if (p->coproc->c_flags & COPROC_DEAD)
p->coproc->c_flags & 0x02Description
TRUEnever evaluated
FALSEnever evaluated
0
1798 {-
1799 coproc_list.ncoproc--; /* keep running count, fix up pointers later */-
1800-
1801#if defined (DEBUG)-
1802 itrace("cpl_reap: deleting %d", p->coproc->c_pid);-
1803#endif-
1804-
1805 coproc_dispose (p->coproc);-
1806 cpe_dispose (p);-
1807 }
never executed: end of block
0
1808 else if (nh == 0)
nh == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1809 nh = nt = p;
never executed: nh = nt = p;
0
1810 else-
1811 {-
1812 nt->next = p;-
1813 nt = nt->next;-
1814 }
never executed: end of block
0
1815 }-
1816-
1817 if (coproc_list.ncoproc == 0)
coproc_list.ncoproc == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1818 coproc_list.head = coproc_list.tail = 0;
never executed: coproc_list.head = coproc_list.tail = 0;
0
1819 else-
1820 {-
1821 if (nt)
ntDescription
TRUEnever evaluated
FALSEnever evaluated
0
1822 nt->next = 0;
never executed: nt->next = 0;
0
1823 coproc_list.head = nh;-
1824 coproc_list.tail = nt;-
1825 if (coproc_list.ncoproc == 1)
coproc_list.ncoproc == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
1826 coproc_list.tail = coproc_list.head; /* just to make sure */
never executed: coproc_list.tail = coproc_list.head;
0
1827 }
never executed: end of block
0
1828}-
1829-
1830/* Clear out the list of saved statuses */-
1831static void-
1832cpl_flush ()-
1833{-
1834 struct cpelement *cpe, *p;-
1835-
1836 for (cpe = coproc_list.head; cpe; )
cpeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1837 {-
1838 p = cpe;-
1839 cpe = cpe->next;-
1840-
1841 coproc_dispose (p->coproc);-
1842 cpe_dispose (p);-
1843 }
never executed: end of block
0
1844-
1845 coproc_list.head = coproc_list.tail = 0;-
1846 coproc_list.ncoproc = 0;-
1847}
never executed: end of block
0
1848-
1849static void-
1850cpl_closeall ()-
1851{-
1852 struct cpelement *cpe;-
1853-
1854 for (cpe = coproc_list.head; cpe; cpe = cpe->next)
cpeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1855 coproc_close (cpe->coproc);
never executed: coproc_close (cpe->coproc);
0
1856}
never executed: end of block
0
1857-
1858static void-
1859cpl_fdchk (fd)-
1860 int fd;-
1861{-
1862 struct cpelement *cpe;-
1863-
1864 for (cpe = coproc_list.head; cpe; cpe = cpe->next)
cpeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1865 coproc_checkfd (cpe->coproc, fd);
never executed: coproc_checkfd (cpe->coproc, fd);
0
1866}
never executed: end of block
0
1867-
1868/* Search for PID in the list of coprocs; return the cpelement struct if-
1869 found. If not found, return NULL. */-
1870static struct cpelement *-
1871cpl_search (pid)-
1872 pid_t pid;-
1873{-
1874 struct cpelement *cpe;-
1875-
1876 for (cpe = coproc_list.head ; cpe; cpe = cpe->next)
cpeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1877 if (cpe->coproc->c_pid == pid)
cpe->coproc->c_pid == pidDescription
TRUEnever evaluated
FALSEnever evaluated
0
1878 return cpe;
never executed: return cpe;
0
1879 return (struct cpelement *)NULL;
never executed: return (struct cpelement *) ((void *)0) ;
0
1880}-
1881-
1882/* Search for the coproc named NAME in the list of coprocs; return the-
1883 cpelement struct if found. If not found, return NULL. */-
1884static struct cpelement *-
1885cpl_searchbyname (name)-
1886 const char *name;-
1887{-
1888 struct cpelement *cp;-
1889-
1890 for (cp = coproc_list.head ; cp; cp = cp->next)
cpDescription
TRUEnever evaluated
FALSEnever evaluated
0
1891 if (STREQ (cp->coproc->c_name, name))
never executed: __result = (((const unsigned char *) (const char *) ( cp->coproc->c_name ))[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
(cp->coproc->c...] == (name)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
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
1892 return cp;
never executed: return cp;
0
1893 return (struct cpelement *)NULL;
never executed: return (struct cpelement *) ((void *)0) ;
0
1894}-
1895-
1896static pid_t-
1897cpl_firstactive ()-
1898{-
1899 struct cpelement *cpe;-
1900-
1901 for (cpe = coproc_list.head ; cpe; cpe = cpe->next)
cpeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1902 if ((cpe->coproc->c_flags & COPROC_DEAD) == 0)
(cpe->coproc->...s & 0x02) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1903 return cpe->coproc->c_pid;
never executed: return cpe->coproc->c_pid;
0
1904 return (pid_t)NO_PID;
never executed: return (pid_t)(pid_t)-1;
0
1905}-
1906-
1907#if 0-
1908static void-
1909cpl_prune ()-
1910{-
1911 struct cpelement *cp;-
1912-
1913 while (coproc_list.head && coproc_list.ncoproc > COPROC_MAX)-
1914 {-
1915 cp = coproc_list.head;-
1916 coproc_list.head = coproc_list.head->next;-
1917 coproc_dispose (cp->coproc);-
1918 cpe_dispose (cp);-
1919 coproc_list.ncoproc--;-
1920 }-
1921}-
1922#endif-
1923-
1924/* These currently use a single global "shell coproc" but are written in a-
1925 way to not preclude additional coprocs later (using the list management-
1926 package above). */-
1927-
1928struct coproc *-
1929getcoprocbypid (pid)-
1930 pid_t pid;-
1931{-
1932#if MULTIPLE_COPROCS-
1933 struct cpelement *p;-
1934-
1935 p = cpl_search (pid);-
1936 return (p ? p->coproc : 0);-
1937#else-
1938 return (pid == sh_coproc.c_pid ? &sh_coproc : 0);
executed 3985831 times by 1 test: return (pid == sh_coproc.c_pid ? &sh_coproc : 0);
Executed by:
  • Self test
3985831
1939#endif-
1940}-
1941-
1942struct coproc *-
1943getcoprocbyname (name)-
1944 const char *name;-
1945{-
1946#if MULTIPLE_COPROCS-
1947 struct cpelement *p;-
1948-
1949 p = cpl_searchbyname (name);-
1950 return (p ? p->coproc : 0);-
1951#else-
1952 return ((sh_coproc.c_name && STREQ (sh_coproc.c_name, name)) ? &sh_coproc : 0);
never executed: return ((sh_coproc.c_name && ((sh_coproc.c_name)[0] == (name)[0] && __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ( sh_coproc.c_name ) && __builtin_constant_p ( name ) && (__s1_len = __builtin_strlen ( sh_coproc.c_name ), __s2_len = __...r *) (const char *) ( name ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]); } } __result; }))) : __builtin_strcmp ( sh_coproc.c_name , name )))); }) == 0)) ? &sh_coproc : 0);
never executed: __result = (((const unsigned char *) (const char *) ( sh_coproc.c_name ))[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
__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
1953#endif-
1954}-
1955-
1956void-
1957coproc_init (cp)-
1958 struct coproc *cp;-
1959{-
1960 cp->c_name = 0;-
1961 cp->c_pid = NO_PID;-
1962 cp->c_rfd = cp->c_wfd = -1;-
1963 cp->c_rsave = cp->c_wsave = -1;-
1964 cp->c_flags = cp->c_status = cp->c_lock = 0;-
1965}
executed 626 times by 1 test: end of block
Executed by:
  • Self test
626
1966-
1967struct coproc *-
1968coproc_alloc (name, pid)-
1969 char *name;-
1970 pid_t pid;-
1971{-
1972 struct coproc *cp;-
1973-
1974#if MULTIPLE_COPROCS-
1975 cp = (struct coproc *)xmalloc (sizeof (struct coproc));-
1976#else-
1977 cp = &sh_coproc;-
1978#endif-
1979 coproc_init (cp);-
1980 cp->c_lock = 2;-
1981-
1982 cp->c_pid = pid;-
1983 cp->c_name = savestring (name);-
1984#if MULTIPLE_COPROCS-
1985 cpl_add (cp);-
1986#endif-
1987 cp->c_lock = 0;-
1988 return (cp);
executed 22 times by 1 test: return (cp);
Executed by:
  • Self test
22
1989}-
1990-
1991static void-
1992coproc_free (cp)-
1993 struct coproc *cp;-
1994{-
1995 free (cp);-
1996}
never executed: end of block
0
1997-
1998void-
1999coproc_dispose (cp)-
2000 struct coproc *cp;-
2001{-
2002 sigset_t set, oset;-
2003-
2004 if (cp == 0)
cp == 0Description
TRUEnever evaluated
FALSEevaluated 570 times by 1 test
Evaluated by:
  • Self test
0-570
2005 return;
never executed: return;
0
2006-
2007 BLOCK_SIGNAL (SIGCHLD, set, oset);-
2008 cp->c_lock = 3;-
2009 coproc_unsetvars (cp);-
2010 FREE (cp->c_name);
executed 21 times by 1 test: sh_xfree((cp->c_name), "execute_cmd.c", 2010);
Executed by:
  • Self test
cp->c_nameDescription
TRUEevaluated 21 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 549 times by 1 test
Evaluated by:
  • Self test
21-549
2011 coproc_close (cp);-
2012#if MULTIPLE_COPROCS-
2013 coproc_free (cp);-
2014#else-
2015 coproc_init (cp);-
2016 cp->c_lock = 0;-
2017#endif-
2018 UNBLOCK_SIGNAL (oset);-
2019}
executed 570 times by 1 test: end of block
Executed by:
  • Self test
570
2020-
2021/* Placeholder for now. Will require changes for multiple coprocs */-
2022void-
2023coproc_flush ()-
2024{-
2025#if MULTIPLE_COPROCS-
2026 cpl_flush ();-
2027#else-
2028 coproc_dispose (&sh_coproc);-
2029#endif-
2030}
executed 550 times by 1 test: end of block
Executed by:
  • Self test
550
2031-
2032void-
2033coproc_close (cp)-
2034 struct coproc *cp;-
2035{-
2036 if (cp->c_rfd >= 0)
cp->c_rfd >= 0Description
TRUEevaluated 21 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2802 times by 1 test
Evaluated by:
  • Self test
21-2802
2037 {-
2038 close (cp->c_rfd);-
2039 cp->c_rfd = -1;-
2040 }
executed 21 times by 1 test: end of block
Executed by:
  • Self test
21
2041 if (cp->c_wfd >= 0)
cp->c_wfd >= 0Description
TRUEevaluated 21 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2802 times by 1 test
Evaluated by:
  • Self test
21-2802
2042 {-
2043 close (cp->c_wfd);-
2044 cp->c_wfd = -1;-
2045 }
executed 21 times by 1 test: end of block
Executed by:
  • Self test
21
2046 cp->c_rsave = cp->c_wsave = -1;-
2047}
executed 2823 times by 1 test: end of block
Executed by:
  • Self test
2823
2048-
2049void-
2050coproc_closeall ()-
2051{-
2052#if MULTIPLE_COPROCS-
2053 cpl_closeall ();-
2054#else-
2055 coproc_close (&sh_coproc); /* XXX - will require changes for multiple coprocs */-
2056#endif-
2057}
executed 2253 times by 1 test: end of block
Executed by:
  • Self test
2253
2058-
2059void-
2060coproc_reap ()-
2061{-
2062#if MULTIPLE_COPROCS-
2063 cpl_reap ();-
2064#else-
2065 struct coproc *cp;-
2066-
2067 cp = &sh_coproc; /* XXX - will require changes for multiple coprocs */-
2068 if (cp && (cp->c_flags & COPROC_DEAD))
cpDescription
TRUEevaluated 20808879 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(cp->c_flags & 0x02)Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 20808859 times by 1 test
Evaluated by:
  • Self test
0-20808879
2069 coproc_dispose (cp);
executed 20 times by 1 test: coproc_dispose (cp);
Executed by:
  • Self test
20
2070#endif-
2071}
executed 20808879 times by 1 test: end of block
Executed by:
  • Self test
20808879
2072-
2073void-
2074coproc_rclose (cp, fd)-
2075 struct coproc *cp;-
2076 int fd;-
2077{-
2078 if (cp->c_rfd >= 0 && cp->c_rfd == fd)
cp->c_rfd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
cp->c_rfd == fdDescription
TRUEnever evaluated
FALSEnever evaluated
0
2079 {-
2080 close (cp->c_rfd);-
2081 cp->c_rfd = -1;-
2082 }
never executed: end of block
0
2083}
never executed: end of block
0
2084-
2085void-
2086coproc_wclose (cp, fd)-
2087 struct coproc *cp;-
2088 int fd;-
2089{-
2090 if (cp->c_wfd >= 0 && cp->c_wfd == fd)
cp->c_wfd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
cp->c_wfd == fdDescription
TRUEnever evaluated
FALSEnever evaluated
0
2091 {-
2092 close (cp->c_wfd);-
2093 cp->c_wfd = -1;-
2094 }
never executed: end of block
0
2095}
never executed: end of block
0
2096-
2097void-
2098coproc_checkfd (cp, fd)-
2099 struct coproc *cp;-
2100 int fd;-
2101{-
2102 int update;-
2103-
2104 update = 0;-
2105 if (cp->c_rfd >= 0 && cp->c_rfd == fd)
cp->c_rfd >= 0Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 666430 times by 1 test
Evaluated by:
  • Self test
cp->c_rfd == fdDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
1-666430
2106 update = cp->c_rfd = -1;
executed 1 time by 1 test: update = cp->c_rfd = -1;
Executed by:
  • Self test
1
2107 if (cp->c_wfd >= 0 && cp->c_wfd == fd)
cp->c_wfd >= 0Description
TRUEevaluated 11 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 666429 times by 1 test
Evaluated by:
  • Self test
cp->c_wfd == fdDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
1-666429
2108 update = cp->c_wfd = -1;
executed 1 time by 1 test: update = cp->c_wfd = -1;
Executed by:
  • Self test
1
2109 if (update)
updateDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 666438 times by 1 test
Evaluated by:
  • Self test
2-666438
2110 coproc_setvars (cp);
executed 2 times by 1 test: coproc_setvars (cp);
Executed by:
  • Self test
2
2111}
executed 666440 times by 1 test: end of block
Executed by:
  • Self test
666440
2112-
2113void-
2114coproc_fdchk (fd)-
2115 int fd;-
2116{-
2117#if MULTIPLE_COPROCS-
2118 cpl_fdchk (fd);-
2119#else-
2120 coproc_checkfd (&sh_coproc, fd);-
2121#endif-
2122}
executed 666440 times by 1 test: end of block
Executed by:
  • Self test
666440
2123-
2124void-
2125coproc_fdclose (cp, fd)-
2126 struct coproc *cp;-
2127 int fd;-
2128{-
2129 coproc_rclose (cp, fd);-
2130 coproc_wclose (cp, fd);-
2131 coproc_setvars (cp);-
2132}
never executed: end of block
0
2133-
2134void-
2135coproc_fdsave (cp)-
2136 struct coproc *cp;-
2137{-
2138 cp->c_rsave = cp->c_rfd;-
2139 cp->c_wsave = cp->c_wfd;-
2140}
never executed: end of block
0
2141-
2142void-
2143coproc_fdrestore (cp)-
2144 struct coproc *cp;-
2145{-
2146 cp->c_rfd = cp->c_rsave;-
2147 cp->c_wfd = cp->c_wsave;-
2148}
never executed: end of block
0
2149-
2150static void-
2151coproc_setstatus (cp, status)-
2152 struct coproc *cp;-
2153 int status;-
2154{-
2155 cp->c_lock = 4;-
2156 cp->c_status = status;-
2157 cp->c_flags |= COPROC_DEAD;-
2158 cp->c_flags &= ~COPROC_RUNNING;-
2159 /* Don't dispose the coproc or unset the COPROC_XXX variables because-
2160 this is executed in a signal handler context. Wait until coproc_reap-
2161 takes care of it. */-
2162 cp->c_lock = 0;-
2163}
executed 20 times by 1 test: end of block
Executed by:
  • Self test
20
2164-
2165void-
2166coproc_pidchk (pid, status)-
2167 pid_t pid;-
2168 int status;-
2169{-
2170 struct coproc *cp;-
2171-
2172#if MULTIPLE_COPROCS-
2173 struct cpelement *cpe;-
2174-
2175 /* We're not disposing the coproc because this is executed in a signal-
2176 handler context */-
2177 cpe = cpl_search (pid);-
2178 cp = cpe ? cpe->coproc : 0;-
2179#else-
2180 cp = getcoprocbypid (pid);-
2181#endif-
2182 if (cp)
cpDescription
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3985811 times by 1 test
Evaluated by:
  • Self test
20-3985811
2183 coproc_setstatus (cp, status);
executed 20 times by 1 test: coproc_setstatus (cp, status);
Executed by:
  • Self test
20
2184}
executed 3985831 times by 1 test: end of block
Executed by:
  • Self test
3985831
2185-
2186pid_t-
2187coproc_active ()-
2188{-
2189#if MULTIPLE_COPROCS-
2190 return (cpl_firstactive ());-
2191#else-
2192 return ((sh_coproc.c_flags & COPROC_DEAD) ? NO_PID : sh_coproc.c_pid);
never executed: return ((sh_coproc.c_flags & 0x02) ? (pid_t)-1 : sh_coproc.c_pid);
0
2193#endif-
2194}-
2195void-
2196coproc_setvars (cp)-
2197 struct coproc *cp;-
2198{-
2199 SHELL_VAR *v;-
2200 char *namevar, *t;-
2201 int l;-
2202 WORD_DESC w;-
2203#if defined (ARRAY_VARS)-
2204 arrayind_t ind;-
2205#endif-
2206-
2207 if (cp->c_name == 0)
cp->c_name == 0Description
TRUEnever evaluated
FALSEevaluated 24 times by 1 test
Evaluated by:
  • Self test
0-24
2208 return;
never executed: return;
0
2209-
2210 /* We could do more here but right now we only check the name, warn if it's-
2211 not a valid identifier, and refuse to create variables with invalid names-
2212 if a coproc with such a name is supplied. */-
2213 w.word = cp->c_name;-
2214 w.flags = 0;-
2215 if (check_identifier (&w, 1) == 0)
check_identifier (&w, 1) == 0Description
TRUEnever evaluated
FALSEevaluated 24 times by 1 test
Evaluated by:
  • Self test
0-24
2216 return;
never executed: return;
0
2217-
2218 l = strlen (cp->c_name);-
2219 namevar = xmalloc (l + 16);-
2220-
2221#if defined (ARRAY_VARS)-
2222 v = find_variable (cp->c_name);-
2223-
2224 /* This is the same code as in find_or_make_array_variable */-
2225 if (v == 0)
v == 0Description
TRUEevaluated 13 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
11-13
2226 {-
2227 v = find_variable_nameref_for_create (cp->c_name, 1);-
2228 if (v == INVALID_NAMEREF_VALUE)
v == (void *)&..._invalid_valueDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
1-12
2229 return;
executed 1 time by 1 test: return;
Executed by:
  • Self test
1
2230 if (v && nameref_p (v))
vDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000800)))Description
TRUEnever evaluated
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
0-7
2231 {-
2232 free (cp->c_name);-
2233 cp->c_name = savestring (nameref_cell (v));-
2234 v = make_new_array_variable (cp->c_name); -
2235 }
never executed: end of block
0
2236 }
executed 12 times by 1 test: end of block
Executed by:
  • Self test
12
2237-
2238 if (v && (readonly_p (v) || noassign_p (v)))
vDescription
TRUEevaluated 16 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000002)))Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0004000)))Description
TRUEnever evaluated
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
0-16
2239 {-
2240 if (readonly_p (v))
((((v)->attrib... (0x0000002)))Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
2241 err_readonly (cp->c_name);
executed 6 times by 1 test: err_readonly (cp->c_name);
Executed by:
  • Self test
6
2242 return;
executed 6 times by 1 test: return;
Executed by:
  • Self test
6
2243 }-
2244 if (v == 0)
v == 0Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
7-10
2245 v = make_new_array_variable (cp->c_name);
executed 7 times by 1 test: v = make_new_array_variable (cp->c_name);
Executed by:
  • Self test
7
2246 if (array_p (v) == 0)
((((v)->attrib...000004))) == 0Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
8-9
2247 v = convert_var_to_array (v);
executed 8 times by 1 test: v = convert_var_to_array (v);
Executed by:
  • Self test
8
2248-
2249 t = itos (cp->c_rfd);-
2250 ind = 0;-
2251 v = bind_array_variable (cp->c_name, ind, t, 0);-
2252 free (t);-
2253-
2254 t = itos (cp->c_wfd);-
2255 ind = 1;-
2256 v = bind_array_variable (cp->c_name, ind, t, 0);-
2257 free (t);-
2258#else-
2259 sprintf (namevar, "%s_READ", cp->c_name);-
2260 t = itos (cp->c_rfd);-
2261 bind_variable (namevar, t, 0);-
2262 free (t);-
2263 sprintf (namevar, "%s_WRITE", cp->c_name);-
2264 t = itos (cp->c_wfd);-
2265 bind_variable (namevar, t, 0);-
2266 free (t);-
2267#endif-
2268-
2269 sprintf (namevar, "%s_PID", cp->c_name);-
2270 t = itos (cp->c_pid);-
2271 v = bind_variable (namevar, t, 0);-
2272 free (t);-
2273-
2274 free (namevar);-
2275}
executed 17 times by 1 test: end of block
Executed by:
  • Self test
17
2276-
2277void-
2278coproc_unsetvars (cp)-
2279 struct coproc *cp;-
2280{-
2281 int l;-
2282 char *namevar;-
2283-
2284 if (cp->c_name == 0)
cp->c_name == 0Description
TRUEevaluated 549 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 21 times by 1 test
Evaluated by:
  • Self test
21-549
2285 return;
executed 549 times by 1 test: return;
Executed by:
  • Self test
549
2286-
2287 l = strlen (cp->c_name);-
2288 namevar = xmalloc (l + 16);-
2289-
2290 sprintf (namevar, "%s_PID", cp->c_name);-
2291 unbind_variable_noref (namevar); -
2292-
2293#if defined (ARRAY_VARS)-
2294 check_unbind_variable (cp->c_name);-
2295#else-
2296 sprintf (namevar, "%s_READ", cp->c_name);-
2297 unbind_variable (namevar);-
2298 sprintf (namevar, "%s_WRITE", cp->c_name);-
2299 unbind_variable (namevar);-
2300#endif -
2301-
2302 free (namevar);-
2303}
executed 21 times by 1 test: end of block
Executed by:
  • Self test
21
2304-
2305static int-
2306execute_coproc (command, pipe_in, pipe_out, fds_to_close)-
2307 COMMAND *command;-
2308 int pipe_in, pipe_out;-
2309 struct fd_bitmap *fds_to_close;-
2310{-
2311 int rpipe[2], wpipe[2], estat, invert;-
2312 pid_t coproc_pid;-
2313 Coproc *cp;-
2314 char *tcmd, *p, *name;-
2315 sigset_t set, oset;-
2316-
2317 /* XXX -- can be removed after changes to handle multiple coprocs */-
2318#if !MULTIPLE_COPROCS-
2319 if (sh_coproc.c_pid != NO_PID && (sh_coproc.c_rfd >= 0 || sh_coproc.c_wfd >= 0))
sh_coproc.c_pid != (pid_t)-1Description
TRUEnever evaluated
FALSEevaluated 34 times by 1 test
Evaluated by:
  • Self test
sh_coproc.c_rfd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
sh_coproc.c_wfd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0-34
2320 internal_warning (_("execute_coproc: coproc [%d:%s] still exists"), sh_coproc.c_pid, sh_coproc.c_name);
never executed: internal_warning ( dcgettext (((void *)0), "execute_coproc: coproc [%d:%s] still exists" , 5) , sh_coproc.c_pid, sh_coproc.c_name);
0
2321 coproc_init (&sh_coproc);-
2322#endif-
2323-
2324 invert = (command->flags & CMD_INVERT_RETURN) != 0;-
2325-
2326 /* XXX - expand coproc name without splitting -- bash-5.0 */-
2327 /* could make this dependent on a shopt option */-
2328 name = expand_string_unsplit_to_string (command->value.Coproc->name, 0);-
2329 /* Optional check -- bash-5.0. */-
2330 if (legal_identifier (name) == 0)
legal_identifier (name) == 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30 times by 1 test
Evaluated by:
  • Self test
4-30
2331 {-
2332 internal_error (_("`%s': not a valid identifier"), name);-
2333 return (invert ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
executed 4 times by 1 test: return (invert ? 0 : 1);
Executed by:
  • Self test
4
2334 }-
2335 else-
2336 {-
2337 free (command->value.Coproc->name);-
2338 command->value.Coproc->name = name;-
2339 }
executed 30 times by 1 test: end of block
Executed by:
  • Self test
30
2340-
2341 command_string_index = 0;-
2342 tcmd = make_command_string (command);-
2343-
2344 sh_openpipe ((int *)&rpipe); /* 0 = parent read, 1 = child write */-
2345 sh_openpipe ((int *)&wpipe); /* 0 = child read, 1 = parent write */-
2346-
2347 BLOCK_SIGNAL (SIGCHLD, set, oset);-
2348-
2349 coproc_pid = make_child (p = savestring (tcmd), 1);-
2350-
2351 if (coproc_pid == 0)
coproc_pid == 0Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 22 times by 1 test
Evaluated by:
  • Self test
8-22
2352 {-
2353 close (rpipe[0]);-
2354 close (wpipe[1]);-
2355-
2356#if defined (JOB_CONTROL)-
2357 FREE (p);
executed 8 times by 1 test: sh_xfree((p), "execute_cmd.c", 2357);
Executed by:
  • Self test
pDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-8
2358#endif-
2359-
2360 UNBLOCK_SIGNAL (oset);-
2361 estat = execute_in_subshell (command, 1, wpipe[0], rpipe[1], fds_to_close);-
2362-
2363 fflush (stdout);-
2364 fflush (stderr);-
2365-
2366 exit (estat);
executed 7 times by 1 test: exit (estat);
Executed by:
  • Self test
7
2367 }-
2368-
2369 close (rpipe[1]);-
2370 close (wpipe[0]);-
2371-
2372 /* XXX - run Coproc->name through word expansion above -- bash-5.0 */-
2373 cp = coproc_alloc (command->value.Coproc->name, coproc_pid);-
2374 cp->c_rfd = rpipe[0];-
2375 cp->c_wfd = wpipe[1];-
2376-
2377 cp->c_flags |= COPROC_RUNNING;-
2378-
2379 SET_CLOSE_ON_EXEC (cp->c_rfd);-
2380 SET_CLOSE_ON_EXEC (cp->c_wfd);-
2381-
2382 coproc_setvars (cp);-
2383-
2384 UNBLOCK_SIGNAL (oset);-
2385-
2386#if 0-
2387 itrace ("execute_coproc (%s): [%d] %s", command->value.Coproc->name, coproc_pid, the_printed_command);-
2388#endif-
2389-
2390 close_pipes (pipe_in, pipe_out);-
2391#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)-
2392 unlink_fifo_list ();-
2393#endif-
2394 stop_pipeline (1, (COMMAND *)NULL);-
2395 DESCRIBE_PID (coproc_pid);
never executed: describe_pid (coproc_pid);
interactiveDescription
TRUEnever evaluated
FALSEevaluated 22 times by 1 test
Evaluated by:
  • Self test
0-22
2396 run_pending_traps ();-
2397-
2398 return (invert ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
executed 22 times by 1 test: return (invert ? 1 : 0);
Executed by:
  • Self test
22
2399}-
2400#endif-
2401-
2402static void-
2403restore_stdin (s)-
2404 int s;-
2405{-
2406 dup2 (s, 0);-
2407 close (s);-
2408}
executed 145 times by 1 test: end of block
Executed by:
  • Self test
145
2409-
2410/* Catch-all cleanup function for lastpipe code for unwind-protects */-
2411static void-
2412lastpipe_cleanup (s)-
2413 int s;-
2414{-
2415 unfreeze_jobs_list ();-
2416}
never executed: end of block
0
2417-
2418static int-
2419execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close)-
2420 COMMAND *command;-
2421 int asynchronous, pipe_in, pipe_out;-
2422 struct fd_bitmap *fds_to_close;-
2423{-
2424 int prev, fildes[2], new_bitmap_size, dummyfd, ignore_return, exec_result;-
2425 int lstdin, lastpipe_flag, lastpipe_jid;-
2426 COMMAND *cmd;-
2427 struct fd_bitmap *fd_bitmap;-
2428 pid_t lastpid;-
2429-
2430#if defined (JOB_CONTROL)-
2431 sigset_t set, oset;-
2432 BLOCK_CHILD (set, oset);-
2433#endif /* JOB_CONTROL */-
2434-
2435 ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;-
2436-
2437 prev = pipe_in;-
2438 cmd = command;-
2439-
2440 while (cmd && cmd->type == cm_connection &&
cmdDescription
TRUEevaluated 27434 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
cmd->type == cm_connectionDescription
TRUEevaluated 14395 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13039 times by 1 test
Evaluated by:
  • Self test
0-27434
2441 cmd->value.Connection && cmd->value.Connection->connector == '|')
cmd->value.ConnectionDescription
TRUEevaluated 14395 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
cmd->value.Con...nnector == '|'Description
TRUEevaluated 14395 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-14395
2442 {-
2443 /* Make a pipeline between the two commands. */-
2444 if (pipe (fildes) < 0)
pipe (fildes) < 0Description
TRUEnever evaluated
FALSEevaluated 14395 times by 1 test
Evaluated by:
  • Self test
0-14395
2445 {-
2446 sys_error (_("pipe error"));-
2447#if defined (JOB_CONTROL)-
2448 terminate_current_pipeline ();-
2449 kill_current_pipeline ();-
2450 UNBLOCK_CHILD (oset);-
2451#endif /* JOB_CONTROL */-
2452 last_command_exit_value = EXECUTION_FAILURE;-
2453 /* The unwind-protects installed below will take care-
2454 of closing all of the open file descriptors. */-
2455 throw_to_top_level ();-
2456 return (EXECUTION_FAILURE); /* XXX */
never executed: return (1);
0
2457 }-
2458-
2459 /* Here is a problem: with the new file close-on-exec-
2460 code, the read end of the pipe (fildes[0]) stays open-
2461 in the first process, so that process will never get a-
2462 SIGPIPE. There is no way to signal the first process-
2463 that it should close fildes[0] after forking, so it-
2464 remains open. No SIGPIPE is ever sent because there-
2465 is still a file descriptor open for reading connected-
2466 to the pipe. We take care of that here. This passes-
2467 around a bitmap of file descriptors that must be-
2468 closed after making a child process in execute_simple_command. */-
2469-
2470 /* We need fd_bitmap to be at least as big as fildes[0].-
2471 If fildes[0] is less than fds_to_close->size, then-
2472 use fds_to_close->size. */-
2473 new_bitmap_size = (fildes[0] < fds_to_close->size)
(fildes[0] < f...o_close->size)Description
TRUEevaluated 14395 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-14395
2474 ? fds_to_close->size-
2475 : fildes[0] + 8;-
2476-
2477 fd_bitmap = new_fd_bitmap (new_bitmap_size);-
2478-
2479 /* Now copy the old information into the new bitmap. */-
2480 xbcopy ((char *)fds_to_close->bitmap, (char *)fd_bitmap->bitmap, fds_to_close->size);-
2481-
2482 /* And mark the pipe file descriptors to be closed. */-
2483 fd_bitmap->bitmap[fildes[0]] = 1;-
2484-
2485 /* In case there are pipe or out-of-processes errors, we-
2486 want all these file descriptors to be closed when-
2487 unwind-protects are run, and the storage used for the-
2488 bitmaps freed up. */-
2489 begin_unwind_frame ("pipe-file-descriptors");-
2490 add_unwind_protect (dispose_fd_bitmap, fd_bitmap);-
2491 add_unwind_protect (close_fd_bitmap, fd_bitmap);-
2492 if (prev >= 0)
prev >= 0Description
TRUEevaluated 330 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 14065 times by 1 test
Evaluated by:
  • Self test
330-14065
2493 add_unwind_protect (close, prev);
executed 330 times by 1 test: add_unwind_protect (close, prev);
Executed by:
  • Self test
330
2494 dummyfd = fildes[1];-
2495 add_unwind_protect (close, dummyfd);-
2496-
2497#if defined (JOB_CONTROL)-
2498 add_unwind_protect (restore_signal_mask, &oset);-
2499#endif /* JOB_CONTROL */-
2500-
2501 if (ignore_return && cmd->value.Connection->first)
ignore_returnDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 14378 times by 1 test
Evaluated by:
  • Self test
cmd->value.Connection->firstDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-14378
2502 cmd->value.Connection->first->flags |= CMD_IGNORE_RETURN;
executed 17 times by 1 test: cmd->value.Connection->first->flags |= 0x08;
Executed by:
  • Self test
17
2503 execute_command_internal (cmd->value.Connection->first, asynchronous,-
2504 prev, fildes[1], fd_bitmap);-
2505-
2506 if (prev >= 0)
prev >= 0Description
TRUEevaluated 318 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13051 times by 1 test
Evaluated by:
  • Self test
318-13051
2507 close (prev);
executed 318 times by 1 test: close (prev);
Executed by:
  • Self test
318
2508-
2509 prev = fildes[0];-
2510 close (fildes[1]);-
2511-
2512 dispose_fd_bitmap (fd_bitmap);-
2513 discard_unwind_frame ("pipe-file-descriptors");-
2514-
2515 cmd = cmd->value.Connection->second;-
2516 }
executed 13369 times by 1 test: end of block
Executed by:
  • Self test
13369
2517-
2518 lastpid = last_made_pid;-
2519-
2520 /* Now execute the rightmost command in the pipeline. */-
2521 if (ignore_return && cmd)
ignore_returnDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13025 times by 1 test
Evaluated by:
  • Self test
cmdDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-13025
2522 cmd->flags |= CMD_IGNORE_RETURN;
executed 14 times by 1 test: cmd->flags |= 0x08;
Executed by:
  • Self test
14
2523-
2524 lastpipe_flag = 0;-
2525-
2526 begin_unwind_frame ("lastpipe-exec");-
2527 lstdin = -1;-
2528 /* If the `lastpipe' option is set with shopt, and job control is not-
2529 enabled, execute the last element of non-async pipelines in the-
2530 current shell environment. */-
2531 if (lastpipe_opt && job_control == 0 && asynchronous == 0 && pipe_out == NO_PIPE && prev > 0)
lastpipe_optDescription
TRUEevaluated 156 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12883 times by 1 test
Evaluated by:
  • Self test
job_control == 0Description
TRUEevaluated 156 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
asynchronous == 0Description
TRUEevaluated 156 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
pipe_out == -1Description
TRUEevaluated 156 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
prev > 0Description
TRUEevaluated 156 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-12883
2532 {-
2533 lstdin = move_to_high_fd (0, 1, -1);-
2534 if (lstdin > 0)
lstdin > 0Description
TRUEevaluated 156 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-156
2535 {-
2536 do_piping (prev, pipe_out);-
2537 prev = NO_PIPE;-
2538 add_unwind_protect (restore_stdin, lstdin);-
2539 lastpipe_flag = 1;-
2540 freeze_jobs_list ();-
2541 lastpipe_jid = stop_pipeline (0, (COMMAND *)NULL); /* XXX */-
2542 add_unwind_protect (lastpipe_cleanup, lastpipe_jid);-
2543 }
executed 156 times by 1 test: end of block
Executed by:
  • Self test
156
2544 if (cmd)
cmdDescription
TRUEevaluated 156 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-156
2545 cmd->flags |= CMD_LASTPIPE;
executed 156 times by 1 test: cmd->flags |= 0x2000;
Executed by:
  • Self test
156
2546 }
executed 156 times by 1 test: end of block
Executed by:
  • Self test
156
2547 if (prev >= 0)
prev >= 0Description
TRUEevaluated 12883 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 156 times by 1 test
Evaluated by:
  • Self test
156-12883
2548 add_unwind_protect (close, prev);
executed 12883 times by 1 test: add_unwind_protect (close, prev);
Executed by:
  • Self test
12883
2549-
2550 exec_result = execute_command_internal (cmd, asynchronous, prev, pipe_out, fds_to_close);-
2551-
2552 if (lstdin > 0)
lstdin > 0Description
TRUEevaluated 145 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11955 times by 1 test
Evaluated by:
  • Self test
145-11955
2553 restore_stdin (lstdin);
executed 145 times by 1 test: restore_stdin (lstdin);
Executed by:
  • Self test
145
2554-
2555 if (prev >= 0)
prev >= 0Description
TRUEevaluated 11955 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 145 times by 1 test
Evaluated by:
  • Self test
145-11955
2556 close (prev);
executed 11955 times by 1 test: close (prev);
Executed by:
  • Self test
11955
2557-
2558#if defined (JOB_CONTROL)-
2559 UNBLOCK_CHILD (oset);-
2560#endif-
2561-
2562 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 12100 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 12100 times by 1 test
Evaluated by:
  • Self test
0-12100
2563-
2564 if (lastpipe_flag)
lastpipe_flagDescription
TRUEevaluated 145 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11955 times by 1 test
Evaluated by:
  • Self test
145-11955
2565 {-
2566#if defined (JOB_CONTROL)-
2567 if (INVALID_JOB (lastpipe_jid) == 0)
((lastpipe_jid...)]) == 0) == 0Description
TRUEevaluated 136 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
(lastpipe_jid) < 0Description
TRUEnever evaluated
FALSEevaluated 145 times by 1 test
Evaluated by:
  • Self test
(lastpipe_jid)... js.j_jobslotsDescription
TRUEnever evaluated
FALSEevaluated 145 times by 1 test
Evaluated by:
  • Self test
(jobs[(lastpipe_jid)]) == 0Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 136 times by 1 test
Evaluated by:
  • Self test
0-145
2568 {-
2569 append_process (savestring (the_printed_command_except_trap), dollar_dollar_pid, exec_result, lastpipe_jid);-
2570 lstdin = wait_for (lastpid);-
2571 }
executed 136 times by 1 test: end of block
Executed by:
  • Self test
136
2572 else-
2573 lstdin = wait_for_single_pid (lastpid, 0); /* checks bgpids list */
executed 9 times by 1 test: lstdin = wait_for_single_pid (lastpid, 0);
Executed by:
  • Self test
9
2574#else-
2575 lstdin = wait_for (lastpid);-
2576#endif-
2577-
2578#if defined (JOB_CONTROL)-
2579 /* If wait_for removes the job from the jobs table, use result of last-
2580 command as pipeline's exit status as usual. The jobs list can get-
2581 frozen and unfrozen at inconvenient times if there are multiple pipelines-
2582 running simultaneously. */-
2583 if (INVALID_JOB (lastpipe_jid) == 0)
((lastpipe_jid...)]) == 0) == 0Description
TRUEevaluated 102 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 43 times by 1 test
Evaluated by:
  • Self test
(lastpipe_jid) < 0Description
TRUEnever evaluated
FALSEevaluated 145 times by 1 test
Evaluated by:
  • Self test
(lastpipe_jid)... js.j_jobslotsDescription
TRUEnever evaluated
FALSEevaluated 145 times by 1 test
Evaluated by:
  • Self test
(jobs[(lastpipe_jid)]) == 0Description
TRUEevaluated 43 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 102 times by 1 test
Evaluated by:
  • Self test
0-145
2584 exec_result = job_exit_status (lastpipe_jid);
executed 102 times by 1 test: exec_result = job_exit_status (lastpipe_jid);
Executed by:
  • Self test
102
2585 else if (pipefail_opt)
pipefail_optDescription
TRUEnever evaluated
FALSEevaluated 43 times by 1 test
Evaluated by:
  • Self test
0-43
2586 exec_result = exec_result | lstdin; /* XXX */
never executed: exec_result = exec_result | lstdin;
0
2587 /* otherwise we use exec_result */-
2588 -
2589#endif-
2590 unfreeze_jobs_list ();-
2591 }
executed 145 times by 1 test: end of block
Executed by:
  • Self test
145
2592-
2593 discard_unwind_frame ("lastpipe-exec");-
2594-
2595 return (exec_result);
executed 12100 times by 1 test: return (exec_result);
Executed by:
  • Self test
12100
2596}-
2597-
2598static int-
2599execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)-
2600 COMMAND *command;-
2601 int asynchronous, pipe_in, pipe_out;-
2602 struct fd_bitmap *fds_to_close;-
2603{-
2604 COMMAND *tc, *second;-
2605 int ignore_return, exec_result, was_error_trap, invert;-
2606 volatile int save_line_number;-
2607-
2608 ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;-
2609-
2610 switch (command->value.Connection->connector)-
2611 {-
2612 /* Do the first command asynchronously. */-
2613 case '&':
executed 217 times by 1 test: case '&':
Executed by:
  • Self test
217
2614 tc = command->value.Connection->first;-
2615 if (tc == 0)
tc == 0Description
TRUEnever evaluated
FALSEevaluated 217 times by 1 test
Evaluated by:
  • Self test
0-217
2616 return (EXECUTION_SUCCESS);
never executed: return (0);
0
2617-
2618 if (ignore_return)
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 217 times by 1 test
Evaluated by:
  • Self test
0-217
2619 tc->flags |= CMD_IGNORE_RETURN;
never executed: tc->flags |= 0x08;
0
2620 tc->flags |= CMD_AMPERSAND;-
2621-
2622 /* If this shell was compiled without job control support,-
2623 if we are currently in a subshell via `( xxx )', or if job-
2624 control is not active then the standard input for an-
2625 asynchronous command is forced to /dev/null. */-
2626#if defined (JOB_CONTROL)-
2627 if ((subshell_environment || !job_control) && !stdin_redir)
subshell_environmentDescription
TRUEevaluated 21 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 196 times by 1 test
Evaluated by:
  • Self test
!job_controlDescription
TRUEevaluated 154 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 42 times by 1 test
Evaluated by:
  • Self test
!stdin_redirDescription
TRUEevaluated 117 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 58 times by 1 test
Evaluated by:
  • Self test
21-196
2628#else-
2629 if (!stdin_redir)-
2630#endif /* JOB_CONTROL */-
2631 tc->flags |= CMD_STDIN_REDIR;
executed 117 times by 1 test: tc->flags |= 0x400;
Executed by:
  • Self test
117
2632-
2633 exec_result = execute_command_internal (tc, 1, pipe_in, pipe_out, fds_to_close);-
2634 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 194 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 194 times by 1 test
Evaluated by:
  • Self test
0-194
2635-
2636 if (tc->flags & CMD_STDIN_REDIR)
tc->flags & 0x400Description
TRUEevaluated 104 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 90 times by 1 test
Evaluated by:
  • Self test
90-104
2637 tc->flags &= ~CMD_STDIN_REDIR;
executed 104 times by 1 test: tc->flags &= ~0x400;
Executed by:
  • Self test
104
2638-
2639 second = command->value.Connection->second;-
2640 if (second)
secondDescription
TRUEevaluated 76 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 118 times by 1 test
Evaluated by:
  • Self test
76-118
2641 {-
2642 if (ignore_return)
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 76 times by 1 test
Evaluated by:
  • Self test
0-76
2643 second->flags |= CMD_IGNORE_RETURN;
never executed: second->flags |= 0x08;
0
2644-
2645 exec_result = execute_command_internal (second, asynchronous, pipe_in, pipe_out, fds_to_close);-
2646 }
executed 75 times by 1 test: end of block
Executed by:
  • Self test
75
2647-
2648 break;
executed 193 times by 1 test: break;
Executed by:
  • Self test
193
2649-
2650 /* Just call execute command on both sides. */-
2651 case ';':
executed 62099323 times by 1 test: case ';':
Executed by:
  • Self test
62099323
2652 if (ignore_return)
ignore_returnDescription
TRUEevaluated 72 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 62099251 times by 1 test
Evaluated by:
  • Self test
72-62099251
2653 {-
2654 if (command->value.Connection->first)
command->value...nection->firstDescription
TRUEevaluated 72 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-72
2655 command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
executed 72 times by 1 test: command->value.Connection->first->flags |= 0x08;
Executed by:
  • Self test
72
2656 if (command->value.Connection->second)
command->value...ection->secondDescription
TRUEevaluated 72 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-72
2657 command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
executed 72 times by 1 test: command->value.Connection->second->flags |= 0x08;
Executed by:
  • Self test
72
2658 }
executed 72 times by 1 test: end of block
Executed by:
  • Self test
72
2659 executing_list++;-
2660 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 62099323 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 62099323 times by 1 test
Evaluated by:
  • Self test
0-62099323
2661 execute_command (command->value.Connection->first);-
2662 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 62087607 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 62087607 times by 1 test
Evaluated by:
  • Self test
0-62087607
2663 exec_result = execute_command_internal (command->value.Connection->second,-
2664 asynchronous, pipe_in, pipe_out,-
2665 fds_to_close);-
2666 executing_list--;-
2667 break;
executed 62071014 times by 1 test: break;
Executed by:
  • Self test
62071014
2668-
2669 case '|':
executed 14065 times by 1 test: case '|':
Executed by:
  • Self test
14065
2670 was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
signal_is_trapped ( 65 +1)Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 14062 times by 1 test
Evaluated by:
  • Self test
signal_is_igno... ( 65 +1) == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-14062
2671 invert = (command->flags & CMD_INVERT_RETURN) != 0;-
2672 ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;-
2673-
2674 line_number_for_err_trap = line_number; /* XXX - save value? */-
2675 exec_result = execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close);-
2676-
2677 if (asynchronous)
asynchronousDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12098 times by 1 test
Evaluated by:
  • Self test
2-12098
2678 {-
2679 exec_result = EXECUTION_SUCCESS;-
2680 invert = 0;-
2681 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
2682-
2683 if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
was_error_trapDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12099 times by 1 test
Evaluated by:
  • Self test
ignore_return == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
invert == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
exec_result != 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-12099
2684 {-
2685 last_command_exit_value = exec_result;-
2686 save_line_number = line_number;-
2687 line_number = line_number_for_err_trap;-
2688 run_error_trap ();-
2689 line_number = save_line_number;-
2690 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
2691-
2692 if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
ignore_return == 0Description
TRUEevaluated 12087 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13 times by 1 test
Evaluated by:
  • Self test
invert == 0Description
TRUEevaluated 12058 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 29 times by 1 test
Evaluated by:
  • Self test
exit_immediately_on_errorDescription
TRUEevaluated 4937 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7121 times by 1 test
Evaluated by:
  • Self test
exec_result != 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4934 times by 1 test
Evaluated by:
  • Self test
3-12087
2693 {-
2694 last_command_exit_value = exec_result;-
2695 run_pending_traps ();-
2696 jump_to_top_level (ERREXIT);-
2697 }
never executed: end of block
0
2698-
2699 break;
executed 12097 times by 1 test: break;
Executed by:
  • Self test
12097
2700-
2701 case AND_AND:
executed 698 times by 1 test: case 288:
Executed by:
  • Self test
698
2702 case OR_OR:
executed 5545 times by 1 test: case 289:
Executed by:
  • Self test
5545
2703 if (asynchronous)
asynchronousDescription
TRUEnever evaluated
FALSEevaluated 6243 times by 1 test
Evaluated by:
  • Self test
0-6243
2704 {-
2705 /* If we have something like `a && b &' or `a || b &', run the-
2706 && or || stuff in a subshell. Force a subshell and just call-
2707 execute_command_internal again. Leave asynchronous on-
2708 so that we get a report from the parent shell about the-
2709 background job. */-
2710 command->flags |= CMD_FORCE_SUBSHELL;-
2711 exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);-
2712 break;
never executed: break;
0
2713 }-
2714-
2715 /* Execute the first command. If the result of that is successful-
2716 and the connector is AND_AND, or the result is not successful-
2717 and the connector is OR_OR, then execute the second command,-
2718 otherwise return. */-
2719-
2720 executing_list++;-
2721 if (command->value.Connection->first)
command->value...nection->firstDescription
TRUEevaluated 6243 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6243
2722 command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
executed 6243 times by 1 test: command->value.Connection->first->flags |= 0x08;
Executed by:
  • Self test
6243
2723-
2724 exec_result = execute_command (command->value.Connection->first);-
2725 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 6184 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 6184 times by 1 test
Evaluated by:
  • Self test
0-6184
2726 if (((command->value.Connection->connector == AND_AND) &&
(command->valu...nector == 288)Description
TRUEevaluated 694 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5490 times by 1 test
Evaluated by:
  • Self test
694-5490
2727 (exec_result == EXECUTION_SUCCESS)) ||
(exec_result == 0)Description
TRUEevaluated 439 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 255 times by 1 test
Evaluated by:
  • Self test
255-439
2728 ((command->value.Connection->connector == OR_OR) &&
(command->valu...nector == 289)Description
TRUEevaluated 5490 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 255 times by 1 test
Evaluated by:
  • Self test
255-5490
2729 (exec_result != EXECUTION_SUCCESS)))
(exec_result != 0)Description
TRUEevaluated 163 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5327 times by 1 test
Evaluated by:
  • Self test
163-5327
2730 {-
2731 second = command->value.Connection->second;-
2732 if (ignore_return && second)
ignore_returnDescription
TRUEevaluated 47 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 555 times by 1 test
Evaluated by:
  • Self test
secondDescription
TRUEevaluated 47 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-555
2733 second->flags |= CMD_IGNORE_RETURN;
executed 47 times by 1 test: second->flags |= 0x08;
Executed by:
  • Self test
47
2734-
2735 exec_result = execute_command (second);-
2736 }
executed 589 times by 1 test: end of block
Executed by:
  • Self test
589
2737 executing_list--;-
2738 break;
executed 6171 times by 1 test: break;
Executed by:
  • Self test
6171
2739-
2740 default:
never executed: default:
0
2741 command_error ("execute_connection", CMDERR_BADCONN, command->value.Connection->connector, 0);-
2742 jump_to_top_level (DISCARD);-
2743 exec_result = EXECUTION_FAILURE;-
2744 }
never executed: end of block
0
2745-
2746 return exec_result;
executed 62089475 times by 1 test: return exec_result;
Executed by:
  • Self test
62089475
2747}-
2748-
2749/* The test used to be only for interactive_shell, but we don't want to report-
2750 job status when the shell is not interactive or when job control isn't-
2751 enabled. */-
2752#define REAP() \-
2753 do \-
2754 { \-
2755 if (job_control == 0 || interactive_shell == 0) \-
2756 reap_dead_jobs (); \-
2757 } \-
2758 while (0)-
2759-
2760/* Execute a FOR command. The syntax is: FOR word_desc IN word_list;-
2761 DO command; DONE */-
2762static int-
2763execute_for_command (for_command)-
2764 FOR_COM *for_command;-
2765{-
2766 register WORD_LIST *releaser, *list;-
2767 SHELL_VAR *v;-
2768 char *identifier;-
2769 int retval, save_line_number;-
2770#if 0-
2771 SHELL_VAR *old_value = (SHELL_VAR *)NULL; /* Remember the old value of x. */-
2772#endif-
2773-
2774 save_line_number = line_number;-
2775 if (check_identifier (for_command->name, 1) == 0)
check_identifi...>name, 1) == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2014463 times by 1 test
Evaluated by:
  • Self test
6-2014463
2776 {-
2777 if (posixly_correct && interactive_shell == 0)
posixly_correctDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
interactive_shell == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-6
2778 {-
2779 last_command_exit_value = EX_BADUSAGE;-
2780 jump_to_top_level (ERREXIT);-
2781 }
never executed: end of block
0
2782 return (EXECUTION_FAILURE);
executed 6 times by 1 test: return (1);
Executed by:
  • Self test
6
2783 }-
2784-
2785 loop_level++;-
2786 identifier = for_command->name->word;-
2787-
2788 line_number = for_command->line; /* for expansion error messages */-
2789 list = releaser = expand_words_no_vars (for_command->map_list);-
2790-
2791 begin_unwind_frame ("for");-
2792 add_unwind_protect (dispose_words, releaser);-
2793-
2794#if 0-
2795 if (lexical_scoping)-
2796 {-
2797 old_value = copy_variable (find_variable (identifier));-
2798 if (old_value)-
2799 add_unwind_protect (dispose_variable, old_value);-
2800 }-
2801#endif-
2802-
2803 if (for_command->flags & CMD_IGNORE_RETURN)
for_command->flags & 0x08Description
TRUEnever evaluated
FALSEevaluated 2014461 times by 1 test
Evaluated by:
  • Self test
0-2014461
2804 for_command->action->flags |= CMD_IGNORE_RETURN;
never executed: for_command->action->flags |= 0x08;
0
2805-
2806 for (retval = EXECUTION_SUCCESS; list; list = list->next)
listDescription
TRUEevaluated 5456682 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2001902 times by 1 test
Evaluated by:
  • Self test
2001902-5456682
2807 {-
2808 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 5456682 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 5456682 times by 1 test
Evaluated by:
  • Self test
0-5456682
2809-
2810 line_number = for_command->line;-
2811-
2812 /* Remember what this command looks like, for debugger. */-
2813 command_string_index = 0;-
2814 print_for_command_head (for_command);-
2815-
2816 if (echo_command_at_execute)
echo_command_at_executeDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5456674 times by 1 test
Evaluated by:
  • Self test
8-5456674
2817 xtrace_print_for_command_head (for_command);
executed 8 times by 1 test: xtrace_print_for_command_head (for_command);
Executed by:
  • Self test
8
2818-
2819 /* Save this command unless it's a trap command and we're not running-
2820 a debug trap. */-
2821 if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
signal_in_progress ( 65 ) == 0Description
TRUEevaluated 5456682 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
running_trap == 0Description
TRUEevaluated 5456682 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5456682
2822 {-
2823 FREE (the_printed_command_except_trap);
executed 5456682 times by 1 test: sh_xfree((the_printed_command_except_trap), "execute_cmd.c", 2823);
Executed by:
  • Self test
the_printed_co...nd_except_trapDescription
TRUEevaluated 5456682 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5456682
2824 the_printed_command_except_trap = savestring (the_printed_command);-
2825 }
executed 5456682 times by 1 test: end of block
Executed by:
  • Self test
5456682
2826-
2827 retval = run_debug_trap ();-
2828#if defined (DEBUGGER)-
2829 /* In debugging mode, if the DEBUG trap returns a non-zero status, we-
2830 skip the command. */-
2831 if (debugging_mode && retval != EXECUTION_SUCCESS)
debugging_modeDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5456670 times by 1 test
Evaluated by:
  • Self test
retval != 0Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-5456670
2832 continue;
never executed: continue;
0
2833#endif-
2834-
2835 this_command_name = (char *)NULL;-
2836 /* XXX - special ksh93 for command index variable handling */-
2837 v = find_variable_last_nameref (identifier, 1);-
2838 if (v && nameref_p (v))
vDescription
TRUEevaluated 5444166 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12516 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000800)))Description
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5444149 times by 1 test
Evaluated by:
  • Self test
17-5444166
2839 {-
2840 if (valid_nameref_value (list->word->word, 1) == 0)
valid_nameref_...>word, 1) == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
6-11
2841 {-
2842 sh_invalidid (list->word->word);-
2843 v = 0;-
2844 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
2845 else if (readonly_p (v))
((((v)->attrib... (0x0000002)))Description
TRUEnever evaluated
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
0-11
2846 err_readonly (name_cell (v));
never executed: err_readonly (((v)->name));
0
2847 else-
2848 v = bind_variable_value (v, list->word->word, ASS_NAMEREF);
executed 11 times by 1 test: v = bind_variable_value (v, list->word->word, 0x0010);
Executed by:
  • Self test
11
2849 }-
2850 else-
2851 v = bind_variable (identifier, list->word->word, 0);
executed 5456665 times by 1 test: v = bind_variable (identifier, list->word->word, 0);
Executed by:
  • Self test
5456665
2852-
2853 if (v == 0 || readonly_p (v) || noassign_p (v))
v == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5456676 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000002)))Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5456673 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0004000)))Description
TRUEnever evaluated
FALSEevaluated 5456673 times by 1 test
Evaluated by:
  • Self test
0-5456676
2854 {-
2855 line_number = save_line_number;-
2856 if (v && readonly_p (v) && interactive_shell == 0 && posixly_correct)
vDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000002)))Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
interactive_shell == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
posixly_correctDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-6
2857 {-
2858 last_command_exit_value = EXECUTION_FAILURE;-
2859 jump_to_top_level (FORCE_EOF);-
2860 }
never executed: end of block
0
2861 else-
2862 {-
2863 dispose_words (releaser);-
2864 discard_unwind_frame ("for");-
2865 loop_level--;-
2866 return (EXECUTION_FAILURE);
executed 9 times by 1 test: return (1);
Executed by:
  • Self test
9
2867 }-
2868 }-
2869-
2870 if (ifsname (identifier))
(identifier)[0] == 'I'Description
TRUEnever evaluated
FALSEevaluated 5456673 times by 1 test
Evaluated by:
  • Self test
(identifier)[1] == 'F'Description
TRUEnever evaluated
FALSEnever evaluated
(identifier)[2] == 'S'Description
TRUEnever evaluated
FALSEnever evaluated
(identifier)[3] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0-5456673
2871 setifs (v);
never executed: setifs (v);
0
2872-
2873 retval = execute_command (for_command->action);-
2874 REAP ();
executed 5444226 times by 1 test: reap_dead_jobs ();
Executed by:
  • Self test
job_control == 0Description
TRUEevaluated 5444226 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
interactive_shell == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-5444226
2875 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 5444226 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 5444226 times by 1 test
Evaluated by:
  • Self test
0-5444226
2876-
2877 if (breaking)
breakingDescription
TRUEevaluated 73 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5444153 times by 1 test
Evaluated by:
  • Self test
73-5444153
2878 {-
2879 breaking--;-
2880 break;
executed 73 times by 1 test: break;
Executed by:
  • Self test
73
2881 }-
2882-
2883 if (continuing)
continuingDescription
TRUEevaluated 70226 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5373927 times by 1 test
Evaluated by:
  • Self test
70226-5373927
2884 {-
2885 continuing--;-
2886 if (continuing)
continuingDescription
TRUEevaluated 30 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 70196 times by 1 test
Evaluated by:
  • Self test
30-70196
2887 break;
executed 30 times by 1 test: break;
Executed by:
  • Self test
30
2888 }
executed 70196 times by 1 test: end of block
Executed by:
  • Self test
70196
2889 }
executed 5444123 times by 1 test: end of block
Executed by:
  • Self test
5444123
2890-
2891 loop_level--;-
2892 line_number = save_line_number;-
2893-
2894#if 0-
2895 if (lexical_scoping)-
2896 {-
2897 if (!old_value)-
2898 unbind_variable (identifier);-
2899 else-
2900 {-
2901 SHELL_VAR *new_value;-
2902-
2903 new_value = bind_variable (identifier, value_cell (old_value), 0);-
2904 new_value->attributes = old_value->attributes;-
2905 dispose_variable (old_value);-
2906 }-
2907 }-
2908#endif-
2909-
2910 dispose_words (releaser);-
2911 discard_unwind_frame ("for");-
2912 return (retval);
executed 2002005 times by 1 test: return (retval);
Executed by:
  • Self test
2002005
2913}-
2914-
2915#if defined (ARITH_FOR_COMMAND)-
2916/* Execute an arithmetic for command. The syntax is-
2917-
2918 for (( init ; step ; test ))-
2919 do-
2920 body-
2921 done-
2922-
2923 The execution should be exactly equivalent to-
2924-
2925 eval \(\( init \)\)-
2926 while eval \(\( test \)\) ; do-
2927 body;-
2928 eval \(\( step \)\)-
2929 done-
2930*/-
2931static intmax_t-
2932eval_arith_for_expr (l, okp)-
2933 WORD_LIST *l;-
2934 int *okp;-
2935{-
2936 WORD_LIST *new;-
2937 intmax_t expresult;-
2938 int r;-
2939-
2940 new = expand_words_no_vars (l);-
2941 if (new)
newDescription
TRUEevaluated 79313 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-79313
2942 {-
2943 if (echo_command_at_execute)
echo_command_at_executeDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 79299 times by 1 test
Evaluated by:
  • Self test
14-79299
2944 xtrace_print_arith_cmd (new);
executed 14 times by 1 test: xtrace_print_arith_cmd (new);
Executed by:
  • Self test
14
2945 this_command_name = "(("; /* )) for expression error messages */-
2946-
2947 command_string_index = 0;-
2948 print_arith_command (new);-
2949 if (signal_in_progress (DEBUG_TRAP) == 0)
signal_in_progress ( 65 ) == 0Description
TRUEevaluated 79313 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-79313
2950 {-
2951 FREE (the_printed_command_except_trap);
executed 79109 times by 1 test: sh_xfree((the_printed_command_except_trap), "execute_cmd.c", 2951);
Executed by:
  • Self test
the_printed_co...nd_except_trapDescription
TRUEevaluated 79109 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 204 times by 1 test
Evaluated by:
  • Self test
204-79109
2952 the_printed_command_except_trap = savestring (the_printed_command);-
2953 }
executed 79313 times by 1 test: end of block
Executed by:
  • Self test
79313
2954-
2955 r = run_debug_trap ();-
2956 /* In debugging mode, if the DEBUG trap returns a non-zero status, we-
2957 skip the command. */-
2958#if defined (DEBUGGER)-
2959 if (debugging_mode == 0 || r == EXECUTION_SUCCESS)
debugging_mode == 0Description
TRUEevaluated 78845 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 468 times by 1 test
Evaluated by:
  • Self test
r == 0Description
TRUEevaluated 468 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-78845
2960 expresult = evalexp (new->word->word, EXP_EXPANDED, okp);
executed 79313 times by 1 test: expresult = evalexp (new->word->word, 0x01, okp);
Executed by:
  • Self test
79313
2961 else-
2962 {-
2963 expresult = 0;-
2964 if (okp)
okpDescription
TRUEnever evaluated
FALSEnever evaluated
0
2965 *okp = 1;
never executed: *okp = 1;
0
2966 }
never executed: end of block
0
2967#else-
2968 expresult = evalexp (new->word->word, EXP_EXPANDED, okp);-
2969#endif-
2970 dispose_words (new);-
2971 }
executed 79313 times by 1 test: end of block
Executed by:
  • Self test
79313
2972 else-
2973 {-
2974 expresult = 0;-
2975 if (okp)
okpDescription
TRUEnever evaluated
FALSEnever evaluated
0
2976 *okp = 1;
never executed: *okp = 1;
0
2977 }
never executed: end of block
0
2978 return (expresult);
executed 79313 times by 1 test: return (expresult);
Executed by:
  • Self test
79313
2979}-
2980-
2981static int-
2982execute_arith_for_command (arith_for_command)-
2983 ARITH_FOR_COM *arith_for_command;-
2984{-
2985 intmax_t expresult;-
2986 int expok, body_status, arith_lineno, save_lineno;-
2987-
2988 body_status = EXECUTION_SUCCESS;-
2989 loop_level++;-
2990 save_lineno = line_number;-
2991-
2992 if (arith_for_command->flags & CMD_IGNORE_RETURN)
arith_for_comm...->flags & 0x08Description
TRUEnever evaluated
FALSEevaluated 2607 times by 1 test
Evaluated by:
  • Self test
0-2607
2993 arith_for_command->action->flags |= CMD_IGNORE_RETURN;
never executed: arith_for_command->action->flags |= 0x08;
0
2994-
2995 this_command_name = "(("; /* )) for expression error messages */-
2996-
2997 /* save the starting line number of the command so we can reset-
2998 line_number before executing each expression -- for $LINENO-
2999 and the DEBUG trap. */-
3000 line_number = arith_lineno = arith_for_command->line;-
3001 if (variable_context && interactive_shell && sourcelevel == 0)
variable_contextDescription
TRUEevaluated 1069 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1538 times by 1 test
Evaluated by:
  • Self test
interactive_shellDescription
TRUEnever evaluated
FALSEevaluated 1069 times by 1 test
Evaluated by:
  • Self test
sourcelevel == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-1538
3002 {-
3003 /* line numbers in a function start at 1 */-
3004 line_number -= function_line_number - 1;-
3005 if (line_number <= 0)
line_number <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3006 line_number = 1;
never executed: line_number = 1;
0
3007 }
never executed: end of block
0
3008-
3009 /* Evaluate the initialization expression. */-
3010 expresult = eval_arith_for_expr (arith_for_command->init, &expok);-
3011 if (expok == 0)
expok == 0Description
TRUEnever evaluated
FALSEevaluated 2607 times by 1 test
Evaluated by:
  • Self test
0-2607
3012 {-
3013 line_number = save_lineno;-
3014 return (EXECUTION_FAILURE);
never executed: return (1);
0
3015 }-
3016-
3017 while (1)-
3018 {-
3019 /* Evaluate the test expression. */-
3020 line_number = arith_lineno;-
3021 expresult = eval_arith_for_expr (arith_for_command->test, &expok);-
3022 line_number = save_lineno;-
3023-
3024 if (expok == 0)
expok == 0Description
TRUEnever evaluated
FALSEevaluated 39552 times by 1 test
Evaluated by:
  • Self test
0-39552
3025 {-
3026 body_status = EXECUTION_FAILURE;-
3027 break;
never executed: break;
0
3028 }-
3029 REAP ();
executed 39552 times by 1 test: reap_dead_jobs ();
Executed by:
  • Self test
job_control == 0Description
TRUEevaluated 39552 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
interactive_shell == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-39552
3030 if (expresult == 0)
expresult == 0Description
TRUEevaluated 1386 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 38166 times by 1 test
Evaluated by:
  • Self test
1386-38166
3031 break;
executed 1386 times by 1 test: break;
Executed by:
  • Self test
1386
3032-
3033 /* Execute the body of the arithmetic for command. */-
3034 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 38166 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 38166 times by 1 test
Evaluated by:
  • Self test
0-38166
3035 body_status = execute_command (arith_for_command->action);-
3036 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 38166 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 38166 times by 1 test
Evaluated by:
  • Self test
0-38166
3037-
3038 /* Handle any `break' or `continue' commands executed by the body. */-
3039 if (breaking)
breakingDescription
TRUEevaluated 1012 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 37154 times by 1 test
Evaluated by:
  • Self test
1012-37154
3040 {-
3041 breaking--;-
3042 break;
executed 1012 times by 1 test: break;
Executed by:
  • Self test
1012
3043 }-
3044-
3045 if (continuing)
continuingDescription
TRUEevaluated 404 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 36750 times by 1 test
Evaluated by:
  • Self test
404-36750
3046 {-
3047 continuing--;-
3048 if (continuing)
continuingDescription
TRUEnever evaluated
FALSEevaluated 404 times by 1 test
Evaluated by:
  • Self test
0-404
3049 break;
never executed: break;
0
3050 }
executed 404 times by 1 test: end of block
Executed by:
  • Self test
404
3051-
3052 /* Evaluate the step expression. */-
3053 line_number = arith_lineno;-
3054 expresult = eval_arith_for_expr (arith_for_command->step, &expok);-
3055 line_number = save_lineno;-
3056-
3057 if (expok == 0)
expok == 0Description
TRUEnever evaluated
FALSEevaluated 37154 times by 1 test
Evaluated by:
  • Self test
0-37154
3058 {-
3059 body_status = EXECUTION_FAILURE;-
3060 break;
never executed: break;
0
3061 }-
3062 }
executed 37154 times by 1 test: end of block
Executed by:
  • Self test
37154
3063-
3064 loop_level--;-
3065 line_number = save_lineno;-
3066-
3067 return (body_status);
executed 2398 times by 1 test: return (body_status);
Executed by:
  • Self test
2398
3068}-
3069#endif-
3070-
3071#if defined (SELECT_COMMAND)-
3072static int LINES, COLS, tabsize;-
3073-
3074#define RP_SPACE ") "-
3075#define RP_SPACE_LEN 2-
3076-
3077/* XXX - does not handle numbers > 1000000 at all. */-
3078#define NUMBER_LEN(s) \-
3079((s < 10) ? 1 \-
3080 : ((s < 100) ? 2 \-
3081 : ((s < 1000) ? 3 \-
3082 : ((s < 10000) ? 4 \-
3083 : ((s < 100000) ? 5 \-
3084 : 6)))))-
3085-
3086static int-
3087displen (s)-
3088 const char *s;-
3089{-
3090#if defined (HANDLE_MULTIBYTE)-
3091 wchar_t *wcstr;-
3092 size_t slen;-
3093 int wclen;-
3094-
3095 wcstr = 0;-
3096 slen = mbstowcs (wcstr, s, 0);-
3097 if (slen == -1)
slen == -1Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
3098 slen = 0;
never executed: slen = 0;
0
3099 wcstr = (wchar_t *)xmalloc (sizeof (wchar_t) * (slen + 1));-
3100 mbstowcs (wcstr, s, slen + 1);-
3101 wclen = wcswidth (wcstr, slen);-
3102 free (wcstr);-
3103 return (wclen < 0 ? STRLEN(s) : wclen);
executed 12 times by 1 test: return (wclen < 0 ? (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0) : wclen);
Executed by:
  • Self test
12
3104#else-
3105 return (STRLEN (s));-
3106#endif-
3107}-
3108-
3109static int-
3110print_index_and_element (len, ind, list)-
3111 int len, ind;-
3112 WORD_LIST *list;-
3113{-
3114 register WORD_LIST *l;-
3115 register int i;-
3116-
3117 if (list == 0)
list == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3118 return (0);
never executed: return (0);
0
3119 for (i = ind, l = list; l && --i; l = l->next)
lDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
--iDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3120 ;
never executed: ;
0
3121 if (l == 0) /* don't think this can happen */
l == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3122 return (0);
never executed: return (0);
0
3123 fprintf (stderr, "%*d%s%s", len, ind, RP_SPACE, l->word->word);-
3124 return (displen (l->word->word));
executed 6 times by 1 test: return (displen (l->word->word));
Executed by:
  • Self test
6
3125}-
3126-
3127static void-
3128indent (from, to)-
3129 int from, to;-
3130{-
3131 while (from < to)
from < toDescription
TRUEnever evaluated
FALSEnever evaluated
0
3132 {-
3133 if ((to / tabsize) > (from / tabsize))
(to / tabsize)...rom / tabsize)Description
TRUEnever evaluated
FALSEnever evaluated
0
3134 {-
3135 putc ('\t', stderr);-
3136 from += tabsize - from % tabsize;-
3137 }
never executed: end of block
0
3138 else-
3139 {-
3140 putc (' ', stderr);-
3141 from++;-
3142 }
never executed: end of block
0
3143 }-
3144}
never executed: end of block
0
3145-
3146static void-
3147print_select_list (list, list_len, max_elem_len, indices_len)-
3148 WORD_LIST *list;-
3149 int list_len, max_elem_len, indices_len;-
3150{-
3151 int ind, row, elem_len, pos, cols, rows;-
3152 int first_column_indices_len, other_indices_len;-
3153-
3154 if (list == 0)
list == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3155 {-
3156 putc ('\n', stderr);-
3157 return;
never executed: return;
0
3158 }-
3159-
3160 cols = max_elem_len ? COLS / max_elem_len : 1;
max_elem_lenDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3161 if (cols == 0)
cols == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3162 cols = 1;
never executed: cols = 1;
0
3163 rows = list_len ? list_len / cols + (list_len % cols != 0) : 1;
list_lenDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3164 cols = list_len ? list_len / rows + (list_len % rows != 0) : 1;
list_lenDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3165-
3166 if (rows == 1)
rows == 1Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3167 {-
3168 rows = cols;-
3169 cols = 1;-
3170 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
3171-
3172 first_column_indices_len = NUMBER_LEN (rows);
(rows < 10)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(rows < 100)Description
TRUEnever evaluated
FALSEnever evaluated
(rows < 1000)Description
TRUEnever evaluated
FALSEnever evaluated
(rows < 10000)Description
TRUEnever evaluated
FALSEnever evaluated
(rows < 100000)Description
TRUEnever evaluated
FALSEnever evaluated
0-6
3173 other_indices_len = indices_len;-
3174-
3175 for (row = 0; row < rows; row++)
row < rowsDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
6
3176 {-
3177 ind = row;-
3178 pos = 0;-
3179 while (1)-
3180 {-
3181 indices_len = (pos == 0) ? first_column_indices_len : other_indices_len;
(pos == 0)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3182 elem_len = print_index_and_element (indices_len, ind + 1, list);-
3183 elem_len += indices_len + RP_SPACE_LEN;-
3184 ind += rows;-
3185 if (ind >= list_len)
ind >= list_lenDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3186 break;
executed 6 times by 1 test: break;
Executed by:
  • Self test
6
3187 indent (pos + elem_len, pos + max_elem_len);-
3188 pos += max_elem_len;-
3189 }
never executed: end of block
0
3190 putc ('\n', stderr);-
3191 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
3192}
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
3193-
3194/* Print the elements of LIST, one per line, preceded by an index from 1 to-
3195 LIST_LEN. Then display PROMPT and wait for the user to enter a number.-
3196 If the number is between 1 and LIST_LEN, return that selection. If EOF-
3197 is read, return a null string. If a blank line is entered, or an invalid-
3198 number is entered, the loop is executed again. */-
3199static char *-
3200select_query (list, list_len, prompt, print_menu)-
3201 WORD_LIST *list;-
3202 int list_len;-
3203 char *prompt;-
3204 int print_menu;-
3205{-
3206 int max_elem_len, indices_len, len;-
3207 intmax_t reply;-
3208 WORD_LIST *l;-
3209 char *repl_string, *t;-
3210-
3211 COLS = default_columns ();-
3212-
3213#if 0-
3214 t = get_string_value ("TABSIZE");-
3215 tabsize = (t && *t) ? atoi (t) : 8;-
3216 if (tabsize <= 0)-
3217 tabsize = 8;-
3218#else-
3219 tabsize = 8;-
3220#endif-
3221-
3222 max_elem_len = 0;-
3223 for (l = list; l; l = l->next)
lDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
6
3224 {-
3225 len = displen (l->word->word);-
3226 if (len > max_elem_len)
len > max_elem_lenDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3227 max_elem_len = len;
executed 6 times by 1 test: max_elem_len = len;
Executed by:
  • Self test
6
3228 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
3229 indices_len = NUMBER_LEN (list_len);
(list_len < 10)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(list_len < 100)Description
TRUEnever evaluated
FALSEnever evaluated
(list_len < 1000)Description
TRUEnever evaluated
FALSEnever evaluated
(list_len < 10000)Description
TRUEnever evaluated
FALSEnever evaluated
(list_len < 100000)Description
TRUEnever evaluated
FALSEnever evaluated
0-6
3230 max_elem_len += indices_len + RP_SPACE_LEN + 2;-
3231-
3232 while (1)-
3233 {-
3234 if (print_menu)
print_menuDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3235 print_select_list (list, list_len, max_elem_len, indices_len);
executed 6 times by 1 test: print_select_list (list, list_len, max_elem_len, indices_len);
Executed by:
  • Self test
6
3236 fprintf (stderr, "%s", prompt);-
3237 fflush (stderr);-
3238 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3239-
3240 if (read_builtin ((WORD_LIST *)NULL) != EXECUTION_SUCCESS)
read_builtin (...id *)0) ) != 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3241 {-
3242 putchar ('\n');-
3243 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
3244 }-
3245 repl_string = get_string_value ("REPLY");-
3246 if (repl_string == 0)
repl_string == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3247 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
3248 if (*repl_string == 0)
*repl_string == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3249 {-
3250 print_menu = 1;-
3251 continue;
never executed: continue;
0
3252 }-
3253 if (legal_number (repl_string, &reply) == 0)
legal_number (..., &reply) == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3254 return "";
never executed: return "";
0
3255 if (reply < 1 || reply > list_len)
reply < 1Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
reply > list_lenDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3256 return "";
never executed: return "";
0
3257-
3258 for (l = list; l && --reply; l = l->next)
lDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
--replyDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3259 ;
never executed: ;
0
3260 return (l->word->word); /* XXX - can't be null? */
executed 6 times by 1 test: return (l->word->word);
Executed by:
  • Self test
6
3261 }-
3262}
never executed: end of block
0
3263-
3264/* Execute a SELECT command. The syntax is:-
3265 SELECT word IN list DO command_list DONE-
3266 Only `break' or `return' in command_list will terminate-
3267 the command. */-
3268static int-
3269execute_select_command (select_command)-
3270 SELECT_COM *select_command;-
3271{-
3272 WORD_LIST *releaser, *list;-
3273 SHELL_VAR *v;-
3274 char *identifier, *ps3_prompt, *selection;-
3275 int retval, list_len, show_menu, save_line_number;-
3276-
3277 if (check_identifier (select_command->name, 1) == 0)
check_identifi...>name, 1) == 0Description
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
0-9
3278 return (EXECUTION_FAILURE);
never executed: return (1);
0
3279-
3280 save_line_number = line_number;-
3281 line_number = select_command->line;-
3282-
3283 command_string_index = 0;-
3284 print_select_command_head (select_command);-
3285-
3286 if (echo_command_at_execute)
echo_command_at_executeDescription
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
0-9
3287 xtrace_print_select_command_head (select_command);
never executed: xtrace_print_select_command_head (select_command);
0
3288-
3289#if 0-
3290 if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))-
3291#else-
3292 if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
signal_in_progress ( 65 ) == 0Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
running_trap == 0Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-9
3293#endif-
3294 {-
3295 FREE (the_printed_command_except_trap);
executed 9 times by 1 test: sh_xfree((the_printed_command_except_trap), "execute_cmd.c", 3295);
Executed by:
  • Self test
the_printed_co...nd_except_trapDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-9
3296 the_printed_command_except_trap = savestring (the_printed_command);-
3297 }
executed 9 times by 1 test: end of block
Executed by:
  • Self test
9
3298-
3299 retval = run_debug_trap ();-
3300#if defined (DEBUGGER)-
3301 /* In debugging mode, if the DEBUG trap returns a non-zero status, we-
3302 skip the command. */-
3303 if (debugging_mode && retval != EXECUTION_SUCCESS)
debugging_modeDescription
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
retval != 0Description
TRUEnever evaluated
FALSEnever evaluated
0-9
3304 return (EXECUTION_SUCCESS);
never executed: return (0);
0
3305#endif-
3306-
3307 loop_level++;-
3308 identifier = select_command->name->word;-
3309-
3310 /* command and arithmetic substitution, parameter and variable expansion,-
3311 word splitting, pathname expansion, and quote removal. */-
3312 list = releaser = expand_words_no_vars (select_command->map_list);-
3313 list_len = list_length (list);-
3314 if (list == 0 || list_len == 0)
list == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
list_len == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3315 {-
3316 if (list)
listDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
3317 dispose_words (list);
never executed: dispose_words (list);
0
3318 line_number = save_line_number;-
3319 return (EXECUTION_SUCCESS);
executed 3 times by 1 test: return (0);
Executed by:
  • Self test
3
3320 }-
3321-
3322 begin_unwind_frame ("select");-
3323 add_unwind_protect (dispose_words, releaser);-
3324-
3325 if (select_command->flags & CMD_IGNORE_RETURN)
select_command->flags & 0x08Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3326 select_command->action->flags |= CMD_IGNORE_RETURN;
never executed: select_command->action->flags |= 0x08;
0
3327-
3328 retval = EXECUTION_SUCCESS;-
3329 show_menu = 1;-
3330-
3331 while (1)-
3332 {-
3333 line_number = select_command->line;-
3334 ps3_prompt = get_string_value ("PS3");-
3335 if (ps3_prompt == 0)
ps3_prompt == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6
3336 ps3_prompt = "#? ";
executed 6 times by 1 test: ps3_prompt = "#? ";
Executed by:
  • Self test
6
3337-
3338 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3339 selection = select_query (list, list_len, ps3_prompt, show_menu);-
3340 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3341 if (selection == 0)
selection == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-6
3342 {-
3343 /* select_query returns EXECUTION_FAILURE if the read builtin-
3344 fails, so we want to return failure in this case. */-
3345 retval = EXECUTION_FAILURE;-
3346 break;
never executed: break;
0
3347 }-
3348-
3349 v = bind_variable (identifier, selection, 0);-
3350 if (v == 0 || readonly_p (v) || noassign_p (v))
v == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
((((v)->attrib... (0x0000002)))Description
TRUEnever evaluated
FALSEnever evaluated
((((v)->attrib... (0x0004000)))Description
TRUEnever evaluated
FALSEnever evaluated
0-6
3351 {-
3352 if (v && readonly_p (v) && interactive_shell == 0 && posixly_correct)
vDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
((((v)->attrib... (0x0000002)))Description
TRUEnever evaluated
FALSEnever evaluated
interactive_shell == 0Description
TRUEnever evaluated
FALSEnever evaluated
posixly_correctDescription
TRUEnever evaluated
FALSEnever evaluated
0-6
3353 {-
3354 last_command_exit_value = EXECUTION_FAILURE;-
3355 jump_to_top_level (FORCE_EOF);-
3356 }
never executed: end of block
0
3357 else-
3358 {-
3359 dispose_words (releaser);-
3360 discard_unwind_frame ("select");-
3361 loop_level--;-
3362 line_number = save_line_number;-
3363 return (EXECUTION_FAILURE);
executed 6 times by 1 test: return (1);
Executed by:
  • Self test
6
3364 }-
3365 }-
3366-
3367 retval = execute_command (select_command->action);-
3368-
3369 REAP ();
never executed: reap_dead_jobs ();
job_control == 0Description
TRUEnever evaluated
FALSEnever evaluated
interactive_shell == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3370 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEnever evaluated
interrupt_stateDescription
TRUEnever evaluated
FALSEnever evaluated
0
3371-
3372 if (breaking)
breakingDescription
TRUEnever evaluated
FALSEnever evaluated
0
3373 {-
3374 breaking--;-
3375 break;
never executed: break;
0
3376 }-
3377-
3378 if (continuing)
continuingDescription
TRUEnever evaluated
FALSEnever evaluated
0
3379 {-
3380 continuing--;-
3381 if (continuing)
continuingDescription
TRUEnever evaluated
FALSEnever evaluated
0
3382 break;
never executed: break;
0
3383 }
never executed: end of block
0
3384-
3385#if defined (KSH_COMPATIBLE_SELECT)-
3386 show_menu = 0;-
3387 selection = get_string_value ("REPLY");-
3388 if (selection && *selection == '\0')
selectionDescription
TRUEnever evaluated
FALSEnever evaluated
*selection == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
3389 show_menu = 1;
never executed: show_menu = 1;
0
3390#endif-
3391 }
never executed: end of block
0
3392-
3393 loop_level--;-
3394 line_number = save_line_number;-
3395-
3396 dispose_words (releaser);-
3397 discard_unwind_frame ("select");-
3398 return (retval);
never executed: return (retval);
0
3399}-
3400#endif /* SELECT_COMMAND */-
3401-
3402/* Execute a CASE command. The syntax is: CASE word_desc IN pattern_list ESAC.-
3403 The pattern_list is a linked list of pattern clauses; each clause contains-
3404 some patterns to compare word_desc against, and an associated command to-
3405 execute. */-
3406static int-
3407execute_case_command (case_command)-
3408 CASE_COM *case_command;-
3409{-
3410 register WORD_LIST *list;-
3411 WORD_LIST *wlist, *es;-
3412 PATTERN_LIST *clauses;-
3413 char *word, *pattern;-
3414 int retval, match, ignore_return, save_line_number, qflags;-
3415-
3416 save_line_number = line_number;-
3417 line_number = case_command->line;-
3418-
3419 command_string_index = 0;-
3420 print_case_command_head (case_command);-
3421-
3422 if (echo_command_at_execute)
echo_command_at_executeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 36947170 times by 1 test
Evaluated by:
  • Self test
1-36947170
3423 xtrace_print_case_command_head (case_command);
executed 1 time by 1 test: xtrace_print_case_command_head (case_command);
Executed by:
  • Self test
1
3424-
3425#if 0-
3426 if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))-
3427#else-
3428 if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
signal_in_progress ( 65 ) == 0Description
TRUEevaluated 36947171 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
running_trap == 0Description
TRUEevaluated 36947171 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-36947171
3429#endif-
3430 {-
3431 FREE (the_printed_command_except_trap);
executed 36947167 times by 1 test: sh_xfree((the_printed_command_except_trap), "execute_cmd.c", 3431);
Executed by:
  • Self test
the_printed_co...nd_except_trapDescription
TRUEevaluated 36947167 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
4-36947167
3432 the_printed_command_except_trap = savestring (the_printed_command);-
3433 }
executed 36947171 times by 1 test: end of block
Executed by:
  • Self test
36947171
3434-
3435 retval = run_debug_trap();-
3436#if defined (DEBUGGER)-
3437 /* In debugging mode, if the DEBUG trap returns a non-zero status, we-
3438 skip the command. */-
3439 if (debugging_mode && retval != EXECUTION_SUCCESS)
debugging_modeDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 36947169 times by 1 test
Evaluated by:
  • Self test
retval != 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-36947169
3440 {-
3441 line_number = save_line_number;-
3442 return (EXECUTION_SUCCESS);
never executed: return (0);
0
3443 }-
3444#endif-
3445-
3446 wlist = expand_word_unsplit (case_command->word, 0);-
3447 word = wlist ? string_list (wlist) : savestring ("");
wlistDescription
TRUEevaluated 33569440 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3377723 times by 1 test
Evaluated by:
  • Self test
3377723-33569440
3448 dispose_words (wlist);-
3449-
3450 retval = EXECUTION_SUCCESS;-
3451 ignore_return = case_command->flags & CMD_IGNORE_RETURN;-
3452-
3453 begin_unwind_frame ("case");-
3454 add_unwind_protect (xfree, word);-
3455-
3456#define EXIT_CASE() goto exit_case_command-
3457-
3458 for (clauses = case_command->clauses; clauses; clauses = clauses->next)
clausesDescription
TRUEevaluated 46492281 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9260214 times by 1 test
Evaluated by:
  • Self test
9260214-46492281
3459 {-
3460 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 46492281 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 46492281 times by 1 test
Evaluated by:
  • Self test
0-46492281
3461 for (list = clauses->patterns; list; list = list->next)
listDescription
TRUEevaluated 46853983 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 18805330 times by 1 test
Evaluated by:
  • Self test
18805330-46853983
3462 {-
3463 es = expand_word_leave_quoted (list->word, 0);-
3464-
3465 if (es && es->word && es->word->word && *(es->word->word))
esDescription
TRUEevaluated 46853982 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
es->wordDescription
TRUEevaluated 46853982 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
es->word->wordDescription
TRUEevaluated 46853982 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
*(es->word->word)Description
TRUEevaluated 46853982 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-46853982
3466 {-
3467 qflags = QGLOB_CVTNULL;-
3468 /* We left CTLESC in place quoting CTLESC after the call to-
3469 expand_word_leave_quoted; tell quote_string_for_globbing to-
3470 remove those here */-
3471 if ((list->word->flags & W_QUOTED) == 0)
(list->word->f...0x000002) == 0Description
TRUEevaluated 27022088 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 19831894 times by 1 test
Evaluated by:
  • Self test
19831894-27022088
3472 qflags |= QGLOB_CTLESC;
executed 27022088 times by 1 test: qflags |= 0x08;
Executed by:
  • Self test
27022088
3473 pattern = quote_string_for_globbing (es->word->word, qflags);-
3474 }
executed 46853982 times by 1 test: end of block
Executed by:
  • Self test
46853982
3475 else-
3476 {-
3477 pattern = (char *)xmalloc (1);-
3478 pattern[0] = '\0';-
3479 }
never executed: end of block
0
3480-
3481 /* Since the pattern does not undergo quote removal (as per-
3482 Posix.2, section 3.9.4.3), the strmatch () call must be able-
3483 to recognize backslashes as escape characters. */-
3484 match = strmatch (pattern, word, FNMATCH_EXTFLAG|FNMATCH_IGNCASE) != FNM_NOMATCH;-
3485 free (pattern);-
3486-
3487 dispose_words (es);-
3488-
3489 if (match)
matchDescription
TRUEevaluated 27686950 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 19167032 times by 1 test
Evaluated by:
  • Self test
19167032-27686950
3490 {-
3491 do-
3492 {-
3493 if (clauses->action && ignore_return)
clauses->actionDescription
TRUEevaluated 24313526 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3373427 times by 1 test
Evaluated by:
  • Self test
ignore_returnDescription
TRUEnever evaluated
FALSEevaluated 24313526 times by 1 test
Evaluated by:
  • Self test
0-24313526
3494 clauses->action->flags |= CMD_IGNORE_RETURN;
never executed: clauses->action->flags |= 0x08;
0
3495 retval = execute_command (clauses->action);-
3496 }
executed 27680091 times by 1 test: end of block
Executed by:
  • Self test
27680091
3497 while ((clauses->flags & CASEPAT_FALLTHROUGH) && (clauses = clauses->next));
(clauses->flags & 0x01)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 27680087 times by 1 test
Evaluated by:
  • Self test
(clauses = clauses->next)Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-27680087
3498 if (clauses == 0 || (clauses->flags & CASEPAT_TESTNEXT) == 0)
clauses == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 27680087 times by 1 test
Evaluated by:
  • Self test
(clauses->flags & 0x02) == 0Description
TRUEevaluated 27680085 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
1-27680087
3499 EXIT_CASE ();
executed 27680086 times by 1 test: goto exit_case_command;
Executed by:
  • Self test
27680086
3500 else-
3501 break;
executed 2 times by 1 test: break;
Executed by:
  • Self test
2
3502 }-
3503-
3504 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 19167032 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 19167032 times by 1 test
Evaluated by:
  • Self test
0-19167032
3505 }
executed 19167032 times by 1 test: end of block
Executed by:
  • Self test
19167032
3506 }
executed 18805332 times by 1 test: end of block
Executed by:
  • Self test
18805332
3507-
3508exit_case_command:
code before this statement executed 9260214 times by 1 test: exit_case_command:
Executed by:
  • Self test
9260214
3509 free (word);-
3510 discard_unwind_frame ("case");-
3511 line_number = save_line_number;-
3512 return (retval);
executed 36940300 times by 1 test: return (retval);
Executed by:
  • Self test
36940300
3513}-
3514-
3515#define CMD_WHILE 0-
3516#define CMD_UNTIL 1-
3517-
3518/* The WHILE command. Syntax: WHILE test DO action; DONE.-
3519 Repeatedly execute action while executing test produces-
3520 EXECUTION_SUCCESS. */-
3521static int-
3522execute_while_command (while_command)-
3523 WHILE_COM *while_command;-
3524{-
3525 return (execute_while_or_until (while_command, CMD_WHILE));
executed 3891252 times by 1 test: return (execute_while_or_until (while_command, 0));
Executed by:
  • Self test
3891252
3526}-
3527-
3528/* UNTIL is just like WHILE except that the test result is negated. */-
3529static int-
3530execute_until_command (while_command)-
3531 WHILE_COM *while_command;-
3532{-
3533 return (execute_while_or_until (while_command, CMD_UNTIL));
executed 12 times by 1 test: return (execute_while_or_until (while_command, 1));
Executed by:
  • Self test
12
3534}-
3535-
3536/* The body for both while and until. The only difference between the-
3537 two is that the test value is treated differently. TYPE is-
3538 CMD_WHILE or CMD_UNTIL. The return value for both commands should-
3539 be EXECUTION_SUCCESS if no commands in the body are executed, and-
3540 the status of the last command executed in the body otherwise. */-
3541static int-
3542execute_while_or_until (while_command, type)-
3543 WHILE_COM *while_command;-
3544 int type;-
3545{-
3546 int return_value, body_status;-
3547-
3548 body_status = EXECUTION_SUCCESS;-
3549 loop_level++;-
3550-
3551 while_command->test->flags |= CMD_IGNORE_RETURN;-
3552 if (while_command->flags & CMD_IGNORE_RETURN)
while_command->flags & 0x08Description
TRUEnever evaluated
FALSEevaluated 3891264 times by 1 test
Evaluated by:
  • Self test
0-3891264
3553 while_command->action->flags |= CMD_IGNORE_RETURN;
never executed: while_command->action->flags |= 0x08;
0
3554-
3555 while (1)-
3556 {-
3557 return_value = execute_command (while_command->test);-
3558 REAP ();
executed 13823981 times by 1 test: reap_dead_jobs ();
Executed by:
  • Self test
job_control == 0Description
TRUEevaluated 13823981 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
interactive_shell == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-13823981
3559-
3560 /* Need to handle `break' in the test when we would break out of the-
3561 loop. The job control code will set `breaking' to loop_level-
3562 when a job in a loop is stopped with SIGTSTP. If the stopped job-
3563 is in the loop test, `breaking' will not be reset unless we do-
3564 this, and the shell will cease to execute commands. The same holds-
3565 true for `continue'. */-
3566 if (type == CMD_WHILE && return_value != EXECUTION_SUCCESS)
type == 0Description
TRUEevaluated 13823961 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 20 times by 1 test
Evaluated by:
  • Self test
return_value != 0Description
TRUEevaluated 660707 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13163254 times by 1 test
Evaluated by:
  • Self test
20-13823961
3567 {-
3568 if (breaking)
breakingDescription
TRUEnever evaluated
FALSEevaluated 660707 times by 1 test
Evaluated by:
  • Self test
0-660707
3569 breaking--;
never executed: breaking--;
0
3570 if (continuing)
continuingDescription
TRUEnever evaluated
FALSEevaluated 660707 times by 1 test
Evaluated by:
  • Self test
0-660707
3571 continuing--;
never executed: continuing--;
0
3572 break;
executed 660707 times by 1 test: break;
Executed by:
  • Self test
660707
3573 }-
3574 if (type == CMD_UNTIL && return_value == EXECUTION_SUCCESS)
type == 1Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13163254 times by 1 test
Evaluated by:
  • Self test
return_value == 0Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
9-13163254
3575 {-
3576 if (breaking)
breakingDescription
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
0-9
3577 breaking--;
never executed: breaking--;
0
3578 if (continuing)
continuingDescription
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
0-9
3579 continuing--;
never executed: continuing--;
0
3580 break;
executed 9 times by 1 test: break;
Executed by:
  • Self test
9
3581 }-
3582-
3583 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 13163265 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 13163265 times by 1 test
Evaluated by:
  • Self test
0-13163265
3584 body_status = execute_command (while_command->action);-
3585 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 13161896 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 13161896 times by 1 test
Evaluated by:
  • Self test
0-13161896
3586-
3587 if (breaking)
breakingDescription
TRUEevaluated 3229179 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9932717 times by 1 test
Evaluated by:
  • Self test
3229179-9932717
3588 {-
3589 breaking--;-
3590 break;
executed 3229179 times by 1 test: break;
Executed by:
  • Self test
3229179
3591 }-
3592-
3593 if (continuing)
continuingDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9932714 times by 1 test
Evaluated by:
  • Self test
3-9932714
3594 {-
3595 continuing--;-
3596 if (continuing)
continuingDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
3597 break;
never executed: break;
0
3598 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
3599 }
executed 9932717 times by 1 test: end of block
Executed by:
  • Self test
9932717
3600 loop_level--;-
3601-
3602 return (body_status);
executed 3889895 times by 1 test: return (body_status);
Executed by:
  • Self test
3889895
3603}-
3604-
3605/* IF test THEN command [ELSE command].-
3606 IF also allows ELIF in the place of ELSE IF, but-
3607 the parser makes *that* stupidity transparent. */-
3608static int-
3609execute_if_command (if_command)-
3610 IF_COM *if_command;-
3611{-
3612 int return_value, save_line_number;-
3613-
3614 save_line_number = line_number;-
3615 if_command->test->flags |= CMD_IGNORE_RETURN;-
3616 return_value = execute_command (if_command->test);-
3617 line_number = save_line_number;-
3618-
3619 if (return_value == EXECUTION_SUCCESS)
return_value == 0Description
TRUEevaluated 2981 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5255 times by 1 test
Evaluated by:
  • Self test
2981-5255
3620 {-
3621 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 2981 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 2981 times by 1 test
Evaluated by:
  • Self test
0-2981
3622-
3623 if (if_command->true_case && (if_command->flags & CMD_IGNORE_RETURN))
if_command->true_caseDescription
TRUEevaluated 2981 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(if_command->flags & 0x08)Description
TRUEnever evaluated
FALSEevaluated 2981 times by 1 test
Evaluated by:
  • Self test
0-2981
3624 if_command->true_case->flags |= CMD_IGNORE_RETURN;
never executed: if_command->true_case->flags |= 0x08;
0
3625-
3626 return (execute_command (if_command->true_case));
executed 2981 times by 1 test: return (execute_command (if_command->true_case));
Executed by:
  • Self test
2981
3627 }-
3628 else-
3629 {-
3630 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 5255 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 5255 times by 1 test
Evaluated by:
  • Self test
0-5255
3631-
3632 if (if_command->false_case && (if_command->flags & CMD_IGNORE_RETURN))
if_command->false_caseDescription
TRUEevaluated 75 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5180 times by 1 test
Evaluated by:
  • Self test
(if_command->flags & 0x08)Description
TRUEnever evaluated
FALSEevaluated 75 times by 1 test
Evaluated by:
  • Self test
0-5180
3633 if_command->false_case->flags |= CMD_IGNORE_RETURN;
never executed: if_command->false_case->flags |= 0x08;
0
3634-
3635 return (execute_command (if_command->false_case));
executed 5255 times by 1 test: return (execute_command (if_command->false_case));
Executed by:
  • Self test
5255
3636 }-
3637}-
3638-
3639#if defined (DPAREN_ARITHMETIC)-
3640static int-
3641execute_arith_command (arith_command)-
3642 ARITH_COM *arith_command;-
3643{-
3644 int expok, save_line_number, retval;-
3645 intmax_t expresult;-
3646 WORD_LIST *new;-
3647 char *exp;-
3648-
3649 expresult = 0;-
3650-
3651 save_line_number = line_number;-
3652 this_command_name = "(("; /* )) */-
3653 line_number_for_err_trap = line_number = arith_command->line;-
3654 /* If we're in a function, update the line number information. */-
3655 if (variable_context && interactive_shell && sourcelevel == 0)
variable_contextDescription
TRUEevaluated 6461580 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 14438 times by 1 test
Evaluated by:
  • Self test
interactive_shellDescription
TRUEnever evaluated
FALSEevaluated 6461580 times by 1 test
Evaluated by:
  • Self test
sourcelevel == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-6461580
3656 {-
3657 /* line numbers in a function start at 1 */-
3658 line_number -= function_line_number - 1;-
3659 if (line_number <= 0)
line_number <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3660 line_number = 1;
never executed: line_number = 1;
0
3661 }
never executed: end of block
0
3662-
3663 command_string_index = 0;-
3664 print_arith_command (arith_command->exp);-
3665-
3666 if (signal_in_progress (DEBUG_TRAP) == 0)
signal_in_progress ( 65 ) == 0Description
TRUEevaluated 6476018 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6476018
3667 {-
3668 FREE (the_printed_command_except_trap);
executed 6476017 times by 1 test: sh_xfree((the_printed_command_except_trap), "execute_cmd.c", 3668);
Executed by:
  • Self test
the_printed_co...nd_except_trapDescription
TRUEevaluated 6476017 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-6476017
3669 the_printed_command_except_trap = savestring (the_printed_command);-
3670 }
executed 6476018 times by 1 test: end of block
Executed by:
  • Self test
6476018
3671-
3672 /* Run the debug trap before each arithmetic command, but do it after we-
3673 update the line number information and before we expand the various-
3674 words in the expression. */-
3675 retval = run_debug_trap ();-
3676#if defined (DEBUGGER)-
3677 /* In debugging mode, if the DEBUG trap returns a non-zero status, we-
3678 skip the command. */-
3679 if (debugging_mode && retval != EXECUTION_SUCCESS)
debugging_modeDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6476014 times by 1 test
Evaluated by:
  • Self test
retval != 0Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
0-6476014
3680 {-
3681 line_number = save_line_number;-
3682 return (EXECUTION_SUCCESS);
never executed: return (0);
0
3683 }-
3684#endif-
3685-
3686 new = expand_words_no_vars (arith_command->exp);-
3687-
3688 /* If we're tracing, make a new word list with `((' at the front and `))'-
3689 at the back and print it. */-
3690 if (echo_command_at_execute)
echo_command_at_executeDescription
TRUEnever evaluated
FALSEevaluated 6476018 times by 1 test
Evaluated by:
  • Self test
0-6476018
3691 xtrace_print_arith_cmd (new);
never executed: xtrace_print_arith_cmd (new);
0
3692-
3693 if (new)
newDescription
TRUEevaluated 6476011 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
7-6476011
3694 {-
3695 exp = new->next ? string_list (new) : new->word->word;
new->nextDescription
TRUEnever evaluated
FALSEevaluated 6476011 times by 1 test
Evaluated by:
  • Self test
0-6476011
3696 expresult = evalexp (exp, EXP_EXPANDED, &expok);-
3697 line_number = save_line_number;-
3698 if (exp != new->word->word)
exp != new->word->wordDescription
TRUEnever evaluated
FALSEevaluated 6476010 times by 1 test
Evaluated by:
  • Self test
0-6476010
3699 free (exp);
never executed: sh_xfree((exp), "execute_cmd.c", 3699);
0
3700 dispose_words (new);-
3701 }
executed 6476010 times by 1 test: end of block
Executed by:
  • Self test
6476010
3702 else-
3703 {-
3704 expresult = 0;-
3705 expok = 1;-
3706 }
executed 7 times by 1 test: end of block
Executed by:
  • Self test
7
3707-
3708 if (expok == 0)
expok == 0Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6476005 times by 1 test
Evaluated by:
  • Self test
12-6476005
3709 return (EXECUTION_FAILURE);
executed 12 times by 1 test: return (1);
Executed by:
  • Self test
12
3710-
3711 return (expresult == 0 ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
executed 6476005 times by 1 test: return (expresult == 0 ? 1 : 0);
Executed by:
  • Self test
6476005
3712}-
3713#endif /* DPAREN_ARITHMETIC */-
3714-
3715#if defined (COND_COMMAND)-
3716-
3717static char * const nullstr = "";-
3718-
3719/* XXX - can COND ever be NULL when this is called? */-
3720static int-
3721execute_cond_node (cond)-
3722 COND_COM *cond;-
3723{-
3724 int result, invert, patmatch, rmatch, mflags, ignore;-
3725 char *arg1, *arg2;-
3726#if 0-
3727 char *t1, *t2;-
3728#endif-
3729-
3730 invert = (cond->flags & CMD_INVERT_RETURN);-
3731 ignore = (cond->flags & CMD_IGNORE_RETURN);-
3732 if (ignore)
ignoreDescription
TRUEevaluated 998 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 168 times by 1 test
Evaluated by:
  • Self test
168-998
3733 {-
3734 if (cond->left)
cond->leftDescription
TRUEevaluated 998 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-998
3735 cond->left->flags |= CMD_IGNORE_RETURN;
executed 998 times by 1 test: cond->left->flags |= 0x08;
Executed by:
  • Self test
998
3736 if (cond->right)
cond->rightDescription
TRUEevaluated 763 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 235 times by 1 test
Evaluated by:
  • Self test
235-763
3737 cond->right->flags |= CMD_IGNORE_RETURN;
executed 763 times by 1 test: cond->right->flags |= 0x08;
Executed by:
  • Self test
763
3738 }
executed 998 times by 1 test: end of block
Executed by:
  • Self test
998
3739 -
3740 if (cond->type == COND_EXPR)
cond->type == 6Description
TRUEevaluated 141 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1025 times by 1 test
Evaluated by:
  • Self test
141-1025
3741 result = execute_cond_node (cond->left);
executed 141 times by 1 test: result = execute_cond_node (cond->left);
Executed by:
  • Self test
141
3742 else if (cond->type == COND_OR)
cond->type == 2Description
TRUEevaluated 77 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 948 times by 1 test
Evaluated by:
  • Self test
77-948
3743 {-
3744 result = execute_cond_node (cond->left);-
3745 if (result != EXECUTION_SUCCESS)
result != 0Description
TRUEevaluated 72 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
5-72
3746 result = execute_cond_node (cond->right);
executed 72 times by 1 test: result = execute_cond_node (cond->right);
Executed by:
  • Self test
72
3747 }
executed 77 times by 1 test: end of block
Executed by:
  • Self test
77
3748 else if (cond->type == COND_AND)
cond->type == 1Description
TRUEevaluated 158 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 790 times by 1 test
Evaluated by:
  • Self test
158-790
3749 {-
3750 result = execute_cond_node (cond->left);-
3751 if (result == EXECUTION_SUCCESS)
result == 0Description
TRUEevaluated 88 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 70 times by 1 test
Evaluated by:
  • Self test
70-88
3752 result = execute_cond_node (cond->right);
executed 88 times by 1 test: result = execute_cond_node (cond->right);
Executed by:
  • Self test
88
3753 }
executed 158 times by 1 test: end of block
Executed by:
  • Self test
158
3754 else if (cond->type == COND_UNARY)
cond->type == 3Description
TRUEevaluated 120 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 670 times by 1 test
Evaluated by:
  • Self test
120-670
3755 {-
3756 if (ignore)
ignoreDescription
TRUEevaluated 97 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 23 times by 1 test
Evaluated by:
  • Self test
23-97
3757 comsub_ignore_return++;
executed 97 times by 1 test: comsub_ignore_return++;
Executed by:
  • Self test
97
3758 arg1 = cond_expand_word (cond->left->op, 0);-
3759 if (ignore)
ignoreDescription
TRUEevaluated 97 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 23 times by 1 test
Evaluated by:
  • Self test
23-97
3760 comsub_ignore_return--;
executed 97 times by 1 test: comsub_ignore_return--;
Executed by:
  • Self test
97
3761 if (arg1 == 0)
arg1 == 0Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 111 times by 1 test
Evaluated by:
  • Self test
9-111
3762 arg1 = nullstr;
executed 9 times by 1 test: arg1 = nullstr;
Executed by:
  • Self test
9
3763 if (echo_command_at_execute)
echo_command_at_executeDescription
TRUEnever evaluated
FALSEevaluated 120 times by 1 test
Evaluated by:
  • Self test
0-120
3764 xtrace_print_cond_term (cond->type, invert, cond->op, arg1, (char *)NULL);
never executed: xtrace_print_cond_term (cond->type, invert, cond->op, arg1, (char *) ((void *)0) );
0
3765 result = unary_test (cond->op->word, arg1) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
unary_test (co...p->word, arg1)Description
TRUEevaluated 100 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 20 times by 1 test
Evaluated by:
  • Self test
20-100
3766 if (arg1 != nullstr)
arg1 != nullstrDescription
TRUEevaluated 111 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
9-111
3767 free (arg1);
executed 111 times by 1 test: sh_xfree((arg1), "execute_cmd.c", 3767);
Executed by:
  • Self test
111
3768 }
executed 120 times by 1 test: end of block
Executed by:
  • Self test
120
3769 else if (cond->type == COND_BINARY)
cond->type == 4Description
TRUEevaluated 670 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-670
3770 {-
3771 rmatch = 0;-
3772 patmatch = (((cond->op->word[1] == '=') && (cond->op->word[2] == '\0') &&
(cond->op->word[1] == '=')Description
TRUEevaluated 104 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 566 times by 1 test
Evaluated by:
  • Self test
(cond->op->word[2] == '\0')Description
TRUEevaluated 104 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-566
3773 (cond->op->word[0] == '!' || cond->op->word[0] == '=')) ||
cond->op->word[0] == '!'Description
TRUEevaluated 31 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 73 times by 1 test
Evaluated by:
  • Self test
cond->op->word[0] == '='Description
TRUEevaluated 73 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-73
3774 (cond->op->word[0] == '=' && cond->op->word[1] == '\0'));
cond->op->word[0] == '='Description
TRUEevaluated 407 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 159 times by 1 test
Evaluated by:
  • Self test
cond->op->word[1] == '\0'Description
TRUEevaluated 318 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 89 times by 1 test
Evaluated by:
  • Self test
89-407
3775#if defined (COND_REGEXP)-
3776 rmatch = (cond->op->word[0] == '=' && cond->op->word[1] == '~' &&
cond->op->word[0] == '='Description
TRUEevaluated 480 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 190 times by 1 test
Evaluated by:
  • Self test
cond->op->word[1] == '~'Description
TRUEevaluated 89 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 391 times by 1 test
Evaluated by:
  • Self test
89-480
3777 cond->op->word[2] == '\0');
cond->op->word[2] == '\0'Description
TRUEevaluated 89 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-89
3778#endif-
3779-
3780 if (ignore)
ignoreDescription
TRUEevaluated 541 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 129 times by 1 test
Evaluated by:
  • Self test
129-541
3781 comsub_ignore_return++;
executed 541 times by 1 test: comsub_ignore_return++;
Executed by:
  • Self test
541
3782 arg1 = cond_expand_word (cond->left->op, 0);-
3783 if (ignore)
ignoreDescription
TRUEevaluated 541 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 129 times by 1 test
Evaluated by:
  • Self test
129-541
3784 comsub_ignore_return--;
executed 541 times by 1 test: comsub_ignore_return--;
Executed by:
  • Self test
541
3785 if (arg1 == 0)
arg1 == 0Description
TRUEevaluated 80 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 590 times by 1 test
Evaluated by:
  • Self test
80-590
3786 arg1 = nullstr;
executed 80 times by 1 test: arg1 = nullstr;
Executed by:
  • Self test
80
3787 if (ignore)
ignoreDescription
TRUEevaluated 541 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 129 times by 1 test
Evaluated by:
  • Self test
129-541
3788 comsub_ignore_return++;
executed 541 times by 1 test: comsub_ignore_return++;
Executed by:
  • Self test
541
3789 arg2 = cond_expand_word (cond->right->op,-
3790 (rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0));-
3791 if (ignore)
ignoreDescription
TRUEevaluated 540 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 129 times by 1 test
Evaluated by:
  • Self test
129-540
3792 comsub_ignore_return--;
executed 540 times by 1 test: comsub_ignore_return--;
Executed by:
  • Self test
540
3793 if (arg2 == 0)
arg2 == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 666 times by 1 test
Evaluated by:
  • Self test
3-666
3794 arg2 = nullstr;
executed 3 times by 1 test: arg2 = nullstr;
Executed by:
  • Self test
3
3795-
3796 if (echo_command_at_execute)
echo_command_at_executeDescription
TRUEnever evaluated
FALSEevaluated 669 times by 1 test
Evaluated by:
  • Self test
0-669
3797 xtrace_print_cond_term (cond->type, invert, cond->op, arg1, arg2);
never executed: xtrace_print_cond_term (cond->type, invert, cond->op, arg1, arg2);
0
3798-
3799#if defined (COND_REGEXP)-
3800 if (rmatch)
rmatchDescription
TRUEevaluated 89 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 580 times by 1 test
Evaluated by:
  • Self test
89-580
3801 {-
3802 mflags = SHMAT_PWARN;-
3803#if defined (ARRAY_VARS)-
3804 mflags |= SHMAT_SUBEXP;-
3805#endif-
3806-
3807#if 0-
3808 t1 = strescape(arg1);-
3809 t2 = strescape(arg2);-
3810 itrace("execute_cond_node: sh_regmatch on `%s' and `%s'", t1, t2);-
3811 free(t1);-
3812 free(t2);-
3813#endif-
3814-
3815 result = sh_regmatch (arg1, arg2, mflags);-
3816 }
executed 89 times by 1 test: end of block
Executed by:
  • Self test
89
3817 else-
3818#endif /* COND_REGEXP */-
3819 {-
3820 int oe;-
3821 oe = extended_glob;-
3822 extended_glob = 1;-
3823 result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP|TEST_LOCALE)
binary_test (c...x01|0x02|0x04)Description
TRUEevaluated 198 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 382 times by 1 test
Evaluated by:
  • Self test
198-382
3824 ? EXECUTION_SUCCESS-
3825 : EXECUTION_FAILURE;-
3826 extended_glob = oe;-
3827 }
executed 580 times by 1 test: end of block
Executed by:
  • Self test
580
3828 if (arg1 != nullstr)
arg1 != nullstrDescription
TRUEevaluated 589 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 80 times by 1 test
Evaluated by:
  • Self test
80-589
3829 free (arg1);
executed 589 times by 1 test: sh_xfree((arg1), "execute_cmd.c", 3829);
Executed by:
  • Self test
589
3830 if (arg2 != nullstr)
arg2 != nullstrDescription
TRUEevaluated 666 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
3-666
3831 free (arg2);
executed 666 times by 1 test: sh_xfree((arg2), "execute_cmd.c", 3831);
Executed by:
  • Self test
666
3832 }
executed 669 times by 1 test: end of block
Executed by:
  • Self test
669
3833 else-
3834 {-
3835 command_error ("execute_cond_node", CMDERR_BADTYPE, cond->type, 0);-
3836 jump_to_top_level (DISCARD);-
3837 result = EXECUTION_FAILURE;-
3838 }
never executed: end of block
0
3839-
3840 if (invert)
invertDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1163 times by 1 test
Evaluated by:
  • Self test
2-1163
3841 result = (result == EXECUTION_SUCCESS) ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
executed 2 times by 1 test: result = (result == 0) ? 1 : 0;
Executed by:
  • Self test
(result == 0)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
3842-
3843 return result;
executed 1165 times by 1 test: return result;
Executed by:
  • Self test
1165
3844}-
3845-
3846static int-
3847execute_cond_command (cond_command)-
3848 COND_COM *cond_command;-
3849{-
3850 int retval, save_line_number;-
3851-
3852 save_line_number = line_number;-
3853-
3854 this_command_name = "[[";-
3855 line_number_for_err_trap = line_number = cond_command->line;-
3856 /* If we're in a function, update the line number information. */-
3857 if (variable_context && interactive_shell && sourcelevel == 0)
variable_contextDescription
TRUEevaluated 34 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 596 times by 1 test
Evaluated by:
  • Self test
interactive_shellDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 28 times by 1 test
Evaluated by:
  • Self test
sourcelevel == 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
0-596
3858 {-
3859 /* line numbers in a function start at 1 */-
3860 line_number -= function_line_number - 1;-
3861 if (line_number <= 0)
line_number <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3862 line_number = 1;
never executed: line_number = 1;
0
3863 }
never executed: end of block
0
3864 command_string_index = 0;-
3865 print_cond_command (cond_command);-
3866-
3867 if (signal_in_progress (DEBUG_TRAP) == 0)
signal_in_progress ( 65 ) == 0Description
TRUEevaluated 625 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
5-625
3868 {-
3869 FREE (the_printed_command_except_trap);
executed 623 times by 1 test: sh_xfree((the_printed_command_except_trap), "execute_cmd.c", 3869);
Executed by:
  • Self test
the_printed_co...nd_except_trapDescription
TRUEevaluated 623 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-623
3870 the_printed_command_except_trap = savestring (the_printed_command);-
3871 }
executed 625 times by 1 test: end of block
Executed by:
  • Self test
625
3872-
3873 /* Run the debug trap before each conditional command, but do it after we-
3874 update the line number information. */-
3875 retval = run_debug_trap ();-
3876#if defined (DEBUGGER)-
3877 /* In debugging mode, if the DEBUG trap returns a non-zero status, we-
3878 skip the command. */-
3879 if (debugging_mode && retval != EXECUTION_SUCCESS)
debugging_modeDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 625 times by 1 test
Evaluated by:
  • Self test
retval != 0Description
TRUEnever evaluated
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
0-625
3880 {-
3881 line_number = save_line_number;-
3882 return (EXECUTION_SUCCESS);
never executed: return (0);
0
3883 }-
3884#endif-
3885-
3886#if 0-
3887 debug_print_cond_command (cond_command);-
3888#endif-
3889-
3890 last_command_exit_value = retval = execute_cond_node (cond_command);-
3891 line_number = save_line_number;-
3892 return (retval);
executed 629 times by 1 test: return (retval);
Executed by:
  • Self test
629
3893}-
3894#endif /* COND_COMMAND */-
3895-
3896static void-
3897bind_lastarg (arg)-
3898 char *arg;-
3899{-
3900 SHELL_VAR *var;-
3901-
3902 if (arg == 0)
arg == 0Description
TRUEevaluated 29984529 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34714906 times by 1 test
Evaluated by:
  • Self test
29984529-34714906
3903 arg = "";
executed 29984529 times by 1 test: arg = "";
Executed by:
  • Self test
29984529
3904 var = bind_variable ("_", arg, 0);-
3905 if (var)
varDescription
TRUEevaluated 64699435 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-64699435
3906 VUNSETATTR (var, att_exported);
executed 64699435 times by 1 test: ((var)->attributes &= ~(0x0000001));
Executed by:
  • Self test
64699435
3907}
executed 64699435 times by 1 test: end of block
Executed by:
  • Self test
64699435
3908-
3909/* Execute a null command. Fork a subshell if the command uses pipes or is-
3910 to be run asynchronously. This handles all the side effects that are-
3911 supposed to take place. */-
3912static int-
3913execute_null_command (redirects, pipe_in, pipe_out, async)-
3914 REDIRECT *redirects;-
3915 int pipe_in, pipe_out, async;-
3916{-
3917 int r;-
3918 int forcefork;-
3919 REDIRECT *rd;-
3920-
3921 for (forcefork = 0, rd = redirects; rd; rd = rd->next)
rdDescription
TRUEevaluated 46 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 29961057 times by 1 test
Evaluated by:
  • Self test
46-29961057
3922 {-
3923 forcefork += rd->rflags & REDIR_VARASSIGN;-
3924 /* Safety */-
3925 forcefork += (rd->redirector.dest == 0 || fd_is_bash_input (rd->redirector.dest)) && (INPUT_REDIRECT (rd->instruction) || TRANSLATE_REDIRECT (rd->instruction) || rd->instruction == r_close_this);
rd->redirector.dest == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 44 times by 1 test
Evaluated by:
  • Self test
fd_is_bash_inp...director.dest)Description
TRUEnever evaluated
FALSEevaluated 44 times by 1 test
Evaluated by:
  • Self test
rd->instructio...nput_directionDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
rd->instructio...puta_directionDescription
TRUEnever evaluated
FALSEnever evaluated
rd->instructio...r_input_outputDescription
TRUEnever evaluated
FALSEnever evaluated
rd->instructio...ing_input_wordDescription
TRUEnever evaluated
FALSEnever evaluated
rd->instructio...ng_output_wordDescription
TRUEnever evaluated
FALSEnever evaluated
rd->instructio...ove_input_wordDescription
TRUEnever evaluated
FALSEnever evaluated
rd->instructio...ve_output_wordDescription
TRUEnever evaluated
FALSEnever evaluated
rd->instructio...= r_close_thisDescription
TRUEnever evaluated
FALSEnever evaluated
0-44
3926 }
executed 46 times by 1 test: end of block
Executed by:
  • Self test
46
3927-
3928 if (forcefork || pipe_in != NO_PIPE || pipe_out != NO_PIPE || async)
forceforkDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 29961053 times by 1 test
Evaluated by:
  • Self test
pipe_in != -1Description
TRUEnever evaluated
FALSEevaluated 29961053 times by 1 test
Evaluated by:
  • Self test
pipe_out != -1Description
TRUEnever evaluated
FALSEevaluated 29961053 times by 1 test
Evaluated by:
  • Self test
asyncDescription
TRUEnever evaluated
FALSEevaluated 29961053 times by 1 test
Evaluated by:
  • Self test
0-29961053
3929 {-
3930 /* We have a null command, but we really want a subshell to take-
3931 care of it. Just fork, do piping and redirections, and exit. */-
3932 if (make_child ((char *)NULL, async) == 0)
make_child ((c... , async) == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2
3933 {-
3934 /* Cancel traps, in trap.c. */-
3935 restore_original_signals (); /* XXX */-
3936-
3937 do_piping (pipe_in, pipe_out);-
3938-
3939#if defined (COPROCESS_SUPPORT)-
3940 coproc_closeall ();-
3941#endif-
3942-
3943 interactive = 0; /* XXX */-
3944-
3945 subshell_environment = 0;-
3946 if (async)
asyncDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
3947 subshell_environment |= SUBSHELL_ASYNC;
never executed: subshell_environment |= 0x01;
0
3948 if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
pipe_in != -1Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
pipe_out != -1Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
3949 subshell_environment |= SUBSHELL_PIPE;
never executed: subshell_environment |= 0x10;
0
3950-
3951 if (do_redirections (redirects, RX_ACTIVE) == 0)
do_redirection...ts, 0x01) == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
3952 exit (EXECUTION_SUCCESS);
executed 2 times by 1 test: exit (0);
Executed by:
  • Self test
2
3953 else-
3954 exit (EXECUTION_FAILURE);
never executed: exit (1);
0
3955 }-
3956 else-
3957 {-
3958 close_pipes (pipe_in, pipe_out);-
3959#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)-
3960 if (pipe_out == NO_PIPE)
pipe_out == -1Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
3961 unlink_fifo_list ();
executed 2 times by 1 test: unlink_fifo_list ();
Executed by:
  • Self test
2
3962#endif-
3963 return (EXECUTION_SUCCESS);
executed 2 times by 1 test: return (0);
Executed by:
  • Self test
2
3964 }-
3965 }-
3966 else-
3967 {-
3968 /* Even if there aren't any command names, pretend to do the-
3969 redirections that are specified. The user expects the side-
3970 effects to take place. If the redirections fail, then return-
3971 failure. Otherwise, if a command substitution took place while-
3972 expanding the command or a redirection, return the value of that-
3973 substitution. Otherwise, return EXECUTION_SUCCESS. */-
3974-
3975 r = do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE);-
3976 cleanup_redirects (redirection_undo_list);-
3977 redirection_undo_list = (REDIRECT *)NULL;-
3978-
3979 if (r != 0)
r != 0Description
TRUEnever evaluated
FALSEevaluated 29961053 times by 1 test
Evaluated by:
  • Self test
0-29961053
3980 return (EXECUTION_FAILURE);
never executed: return (1);
0
3981 else if (last_command_subst_pid != NO_PID)
last_command_s...d != (pid_t)-1Description
TRUEevaluated 3230744 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 26730309 times by 1 test
Evaluated by:
  • Self test
3230744-26730309
3982 return (last_command_exit_value);
executed 3230744 times by 1 test: return (last_command_exit_value);
Executed by:
  • Self test
3230744
3983 else-
3984 return (EXECUTION_SUCCESS);
executed 26730309 times by 1 test: return (0);
Executed by:
  • Self test
26730309
3985 }-
3986}-
3987-
3988/* This is a hack to suppress word splitting for assignment statements-
3989 given as arguments to builtins with the ASSIGNMENT_BUILTIN flag set. */-
3990static void-
3991fix_assignment_words (words)-
3992 WORD_LIST *words;-
3993{-
3994 WORD_LIST *w, *wcmd;-
3995 struct builtin *b;-
3996 int assoc, global, array, integer;-
3997-
3998 if (words == 0)
words == 0Description
TRUEevaluated 28 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64686671 times by 1 test
Evaluated by:
  • Self test
28-64686671
3999 return;
executed 28 times by 1 test: return;
Executed by:
  • Self test
28
4000-
4001 b = 0;-
4002 assoc = global = array = integer = 0;-
4003-
4004 /* Skip over assignment statements preceding a command name */-
4005 wcmd = words;-
4006 for (wcmd = words; wcmd; wcmd = wcmd->next)
wcmdDescription
TRUEevaluated 71149194 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 29963585 times by 1 test
Evaluated by:
  • Self test
29963585-71149194
4007 if ((wcmd->word->flags & W_ASSIGNMENT) == 0)
(wcmd->word->f...0x000004) == 0Description
TRUEevaluated 34723086 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 36426108 times by 1 test
Evaluated by:
  • Self test
34723086-36426108
4008 break;
executed 34723086 times by 1 test: break;
Executed by:
  • Self test
34723086
4009 /* Posix (post-2008) says that `command' doesn't change whether-
4010 or not the builtin it shadows is a `declaration command', even-
4011 though it removes other special builtin properties. In Posix-
4012 mode, we skip over one or more instances of `command' and-
4013 deal with the next word as the assignment builtin. */-
4014 while (posixly_correct && wcmd && wcmd->word && wcmd->word->word && STREQ (wcmd->word->word, "command"))
never executed: __result = (((const unsigned char *) (const char *) ( wcmd->word->word ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "command" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
posixly_correctDescription
TRUEevaluated 817 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64685855 times by 1 test
Evaluated by:
  • Self test
wcmdDescription
TRUEevaluated 448 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 369 times by 1 test
Evaluated by:
  • Self test
wcmd->wordDescription
TRUEevaluated 448 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
wcmd->word->wordDescription
TRUEevaluated 448 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(wcmd->word->w...("command")[0]Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 443 times by 1 test
Evaluated by:
  • Self test
__extension__ ... )))); }) == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 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-64685855
4015 wcmd = wcmd->next;
executed 1 time by 1 test: wcmd = wcmd->next;
Executed by:
  • Self test
1
4016-
4017 for (w = wcmd; w; w = w->next)
wDescription
TRUEevaluated 50930186 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64679869 times by 1 test
Evaluated by:
  • Self test
50930186-64679869
4018 if (w->word->flags & W_ASSIGNMENT)
w->word->flags & 0x000004Description
TRUEevaluated 5579 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50924607 times by 1 test
Evaluated by:
  • Self test
5579-50924607
4019 {-
4020 /* Lazy builtin lookup, only do it if we find an assignment */-
4021 if (b == 0)
b == 0Description
TRUEevaluated 5353 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 226 times by 1 test
Evaluated by:
  • Self test
226-5353
4022 {-
4023 b = builtin_address_internal (wcmd->word->word, 0);-
4024 if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
b == 0Description
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5339 times by 1 test
Evaluated by:
  • Self test
(b->flags & 0x10) == 0Description
TRUEevaluated 4368 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 971 times by 1 test
Evaluated by:
  • Self test
14-5339
4025 return;
executed 4382 times by 1 test: return;
Executed by:
  • Self test
4382
4026 else if (b && (b->flags & ASSIGNMENT_BUILTIN))
bDescription
TRUEevaluated 971 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(b->flags & 0x10)Description
TRUEevaluated 971 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-971
4027 wcmd->word->flags |= W_ASSNBLTIN;
executed 971 times by 1 test: wcmd->word->flags |= 0x010000;
Executed by:
  • Self test
971
4028 }
executed 971 times by 1 test: end of block
Executed by:
  • Self test
971
4029 w->word->flags |= (W_NOSPLIT|W_NOGLOB|W_TILDEEXP|W_ASSIGNARG);-
4030#if defined (ARRAY_VARS)-
4031 if (assoc)
assocDescription
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1173 times by 1 test
Evaluated by:
  • Self test
24-1173
4032 w->word->flags |= W_ASSIGNASSOC;
executed 24 times by 1 test: w->word->flags |= 0x400000;
Executed by:
  • Self test
24
4033 if (array)
arrayDescription
TRUEevaluated 124 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1073 times by 1 test
Evaluated by:
  • Self test
124-1073
4034 w->word->flags |= W_ASSIGNARRAY;
executed 124 times by 1 test: w->word->flags |= 0x800000;
Executed by:
  • Self test
124
4035#endif-
4036 if (global)
globalDescription
TRUEevaluated 21 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1176 times by 1 test
Evaluated by:
  • Self test
21-1176
4037 w->word->flags |= W_ASSNGLOBAL;
executed 21 times by 1 test: w->word->flags |= 0x2000000;
Executed by:
  • Self test
21
4038-
4039 /* If we have an assignment builtin that does not create local variables,-
4040 make sure we create global variables even if we internally call-
4041 `declare'. The CHKLOCAL flag means to set attributes or values on-
4042 an existing local variable */-
4043 if (b && ((b->flags & (ASSIGNMENT_BUILTIN|LOCALVAR_BUILTIN)) == ASSIGNMENT_BUILTIN))
bDescription
TRUEevaluated 1197 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
((b->flags & (...x40)) == 0x10)Description
TRUEevaluated 318 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 879 times by 1 test
Evaluated by:
  • Self test
0-1197
4044 w->word->flags |= W_ASSNGLOBAL|W_CHKLOCAL;
executed 318 times by 1 test: w->word->flags |= 0x2000000|0x10000000;
Executed by:
  • Self test
318
4045 }
executed 1197 times by 1 test: end of block
Executed by:
  • Self test
1197
4046#if defined (ARRAY_VARS)-
4047 /* Note that we saw an associative array option to a builtin that takes-
4048 assignment statements. This is a bit of a kludge. */-
4049 else if (w->word->word[0] == '-' && (strpbrk (w->word->word+1, "Aag") != 0))
w->word->word[0] == '-'Description
TRUEevaluated 2015671 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 48908936 times by 1 test
Evaluated by:
  • Self test
( __builtin_st... "Aag" ) != 0)Description
TRUEevaluated 2789 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2012882 times by 1 test
Evaluated by:
  • Self test
2789-48908936
4050#else-
4051 else if (w->word->word[0] == '-' && strchr (w->word->word+1, 'g'))-
4052#endif-
4053 {-
4054 if (b == 0)
b == 0Description
TRUEevaluated 2780 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
9-2780
4055 {-
4056 b = builtin_address_internal (wcmd->word->word, 0);-
4057 if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
b == 0Description
TRUEevaluated 2296 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 484 times by 1 test
Evaluated by:
  • Self test
(b->flags & 0x10) == 0Description
TRUEevaluated 124 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 360 times by 1 test
Evaluated by:
  • Self test
124-2296
4058 return;
executed 2420 times by 1 test: return;
Executed by:
  • Self test
2420
4059 else if (b && (b->flags & ASSIGNMENT_BUILTIN))
bDescription
TRUEevaluated 360 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(b->flags & 0x10)Description
TRUEevaluated 360 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-360
4060 wcmd->word->flags |= W_ASSNBLTIN;
executed 360 times by 1 test: wcmd->word->flags |= 0x010000;
Executed by:
  • Self test
360
4061 }
executed 360 times by 1 test: end of block
Executed by:
  • Self test
360
4062 if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'A'))
(wcmd->word->flags & 0x010000)Description
TRUEevaluated 369 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(__extension__...rd+1 , 'A' )))Description
TRUEevaluated 118 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 251 times by 1 test
Evaluated by:
  • Self test
__builtin_constant_p ( 'A' )Description
TRUEevaluated 369 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
!__builtin_con...word->word+1 )Description
TRUEevaluated 369 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
( 'A' ) == '\0'Description
TRUEnever evaluated
FALSEevaluated 369 times by 1 test
Evaluated by:
  • Self test
0-369
4063 assoc = 1;
executed 118 times by 1 test: assoc = 1;
Executed by:
  • Self test
118
4064 else if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'a'))
(wcmd->word->flags & 0x010000)Description
TRUEevaluated 251 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(__extension__...rd+1 , 'a' )))Description
TRUEevaluated 236 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
__builtin_constant_p ( 'a' )Description
TRUEevaluated 251 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
!__builtin_con...word->word+1 )Description
TRUEevaluated 251 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
( 'a' ) == '\0'Description
TRUEnever evaluated
FALSEevaluated 251 times by 1 test
Evaluated by:
  • Self test
0-251
4065 array = 1;
executed 236 times by 1 test: array = 1;
Executed by:
  • Self test
236
4066 if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'g'))
(wcmd->word->flags & 0x010000)Description
TRUEevaluated 369 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(__extension__...rd+1 , 'g' )))Description
TRUEevaluated 23 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 346 times by 1 test
Evaluated by:
  • Self test
__builtin_constant_p ( 'g' )Description
TRUEevaluated 369 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
!__builtin_con...word->word+1 )Description
TRUEevaluated 369 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
( 'g' ) == '\0'Description
TRUEnever evaluated
FALSEevaluated 369 times by 1 test
Evaluated by:
  • Self test
0-369
4067 global = 1;
executed 23 times by 1 test: global = 1;
Executed by:
  • Self test
23
4068 }
executed 369 times by 1 test: end of block
Executed by:
  • Self test
369
4069}
executed 64679869 times by 1 test: end of block
Executed by:
  • Self test
64679869
4070-
4071/* Return 1 if the file found by searching $PATH for PATHNAME, defaulting-
4072 to PATHNAME, is a directory. Used by the autocd code below. */-
4073static int-
4074is_dirname (pathname)-
4075 char *pathname;-
4076{-
4077 char *temp;-
4078 int ret;-
4079-
4080 temp = search_for_command (pathname, 0);-
4081 ret = temp ? file_isdir (temp) : file_isdir (pathname);
tempDescription
TRUEnever evaluated
FALSEnever evaluated
0
4082 free (temp);-
4083 return ret;
never executed: return ret;
0
4084}-
4085-
4086/* The meaty part of all the executions. We have to start hacking the-
4087 real execution of commands here. Fork a process, set things up,-
4088 execute the command. */-
4089static int-
4090execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)-
4091 SIMPLE_COM *simple_command;-
4092 int pipe_in, pipe_out, async;-
4093 struct fd_bitmap *fds_to_close;-
4094{-
4095 WORD_LIST *words, *lastword;-
4096 char *command_line, *lastarg, *temp;-
4097 int first_word_quoted, result, builtin_is_special, already_forked, dofork;-
4098 pid_t old_last_async_pid;-
4099 sh_builtin_func_t *builtin;-
4100 SHELL_VAR *func;-
4101 volatile int old_builtin, old_command_builtin;-
4102-
4103 result = EXECUTION_SUCCESS;-
4104 special_builtin_failed = builtin_is_special = 0;-
4105 command_line = (char *)0;-
4106-
4107 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 64710245 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 64710245 times by 1 test
Evaluated by:
  • Self test
0-64710245
4108-
4109 /* If we're in a function, update the line number information. */-
4110 if (variable_context && interactive_shell && sourcelevel == 0)
variable_contextDescription
TRUEevaluated 59256649 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5453596 times by 1 test
Evaluated by:
  • Self test
interactive_shellDescription
TRUEevaluated 641 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 59256008 times by 1 test
Evaluated by:
  • Self test
sourcelevel == 0Description
TRUEnever evaluated
FALSEevaluated 641 times by 1 test
Evaluated by:
  • Self test
0-59256649
4111 {-
4112 /* line numbers in a function start at 1 */-
4113 line_number -= function_line_number - 1;-
4114 if (line_number <= 0)
line_number <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
4115 line_number = 1;
never executed: line_number = 1;
0
4116 }
never executed: end of block
0
4117-
4118 /* Remember what this command line looks like at invocation. */-
4119 command_string_index = 0;-
4120 print_simple_command (simple_command);-
4121-
4122#if 0-
4123 if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))-
4124#else-
4125 if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
signal_in_progress ( 65 ) == 0Description
TRUEevaluated 64704505 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5740 times by 1 test
Evaluated by:
  • Self test
running_trap == 0Description
TRUEevaluated 64704339 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 166 times by 1 test
Evaluated by:
  • Self test
166-64704505
4126#endif-
4127 {-
4128 FREE (the_printed_command_except_trap);
executed 64699140 times by 1 test: sh_xfree((the_printed_command_except_trap), "execute_cmd.c", 4128);
Executed by:
  • Self test
the_printed_co...nd_except_trapDescription
TRUEevaluated 64699140 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5199 times by 1 test
Evaluated by:
  • Self test
5199-64699140
4129 the_printed_command_except_trap = the_printed_command ? savestring (the_printed_command) : (char *)0;
the_printed_commandDescription
TRUEevaluated 64704339 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-64704339
4130 }
executed 64704339 times by 1 test: end of block
Executed by:
  • Self test
64704339
4131-
4132 /* Run the debug trap before each simple command, but do it after we-
4133 update the line number information. */-
4134 result = run_debug_trap ();-
4135#if defined (DEBUGGER)-
4136 /* In debugging mode, if the DEBUG trap returns a non-zero status, we-
4137 skip the command. */-
4138 if (debugging_mode && result != EXECUTION_SUCCESS)
debugging_modeDescription
TRUEevaluated 7576 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64702669 times by 1 test
Evaluated by:
  • Self test
result != 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7575 times by 1 test
Evaluated by:
  • Self test
1-64702669
4139 return (EXECUTION_SUCCESS);
executed 1 time by 1 test: return (0);
Executed by:
  • Self test
1
4140#endif-
4141-
4142 first_word_quoted =-
4143 simple_command->words ? (simple_command->words->word->flags & W_QUOTED) : 0;
simple_command->wordsDescription
TRUEevaluated 64710193 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 51 times by 1 test
Evaluated by:
  • Self test
51-64710193
4144-
4145 last_command_subst_pid = NO_PID;-
4146 old_last_async_pid = last_asynchronous_pid;-
4147-
4148 already_forked = 0;-
4149-
4150 /* If we're in a pipeline or run in the background, set DOFORK so we-
4151 make the child early, before word expansion. This keeps assignment-
4152 statements from affecting the parent shell's environment when they-
4153 should not. */-
4154 dofork = pipe_in != NO_PIPE || pipe_out != NO_PIPE || async;
pipe_in != -1Description
TRUEevaluated 10885 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64699359 times by 1 test
Evaluated by:
  • Self test
pipe_out != -1Description
TRUEevaluated 13569 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64685790 times by 1 test
Evaluated by:
  • Self test
asyncDescription
TRUEevaluated 153 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64685637 times by 1 test
Evaluated by:
  • Self test
153-64699359
4155-
4156 /* Something like `%2 &' should restart job 2 in the background, not cause-
4157 the shell to fork here. */-
4158 if (dofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE &&
doforkDescription
TRUEevaluated 24607 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64685637 times by 1 test
Evaluated by:
  • Self test
pipe_in == -1Description
TRUEevaluated 13722 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10885 times by 1 test
Evaluated by:
  • Self test
pipe_out == -1Description
TRUEevaluated 153 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13569 times by 1 test
Evaluated by:
  • Self test
153-64685637
4159 simple_command->words && simple_command->words->word &&
simple_command->wordsDescription
TRUEevaluated 141 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
simple_command->words->wordDescription
TRUEevaluated 141 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-141
4160 simple_command->words->word->word &&
simple_command...ds->word->wordDescription
TRUEevaluated 141 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-141
4161 (simple_command->words->word->word[0] == '%'))
(simple_comman...ord[0] == '%')Description
TRUEnever evaluated
FALSEevaluated 141 times by 1 test
Evaluated by:
  • Self test
0-141
4162 dofork = 0;
never executed: dofork = 0;
0
4163-
4164 if (dofork)
doforkDescription
TRUEevaluated 24607 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 64685637 times by 1 test
Evaluated by:
  • Self test
24607-64685637
4165 {-
4166 char *p;-
4167-
4168 /* Do this now, because execute_disk_command will do it anyway in the-
4169 vast majority of cases. */-
4170 maybe_make_export_env ();-
4171-
4172 /* Don't let a DEBUG trap overwrite the command string to be saved with-
4173 the process/job associated with this child. */-
4174 if (make_child (p = savestring (the_printed_command_except_trap), async) == 0)
make_child (p ...), async) == 0Description
TRUEevaluated 1129 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 23478 times by 1 test
Evaluated by:
  • Self test
1129-23478
4175 {-
4176 already_forked = 1;-
4177 simple_command->flags |= CMD_NO_FORK;-
4178-
4179 subshell_environment = SUBSHELL_FORK; /* XXX */-
4180 if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
pipe_in != -1Description
TRUEevaluated 122 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1007 times by 1 test
Evaluated by:
  • Self test
pipe_out != -1Description
TRUEevaluated 1000 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
7-1007
4181 subshell_environment |= SUBSHELL_PIPE;
executed 1122 times by 1 test: subshell_environment |= 0x10;
Executed by:
  • Self test
1122
4182 if (async)
asyncDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1119 times by 1 test
Evaluated by:
  • Self test
10-1119
4183 subshell_environment |= SUBSHELL_ASYNC;
executed 10 times by 1 test: subshell_environment |= 0x01;
Executed by:
  • Self test
10
4184-
4185 /* We need to do this before piping to handle some really-
4186 pathological cases where one of the pipe file descriptors-
4187 is < 2. */-
4188 if (fds_to_close)
fds_to_closeDescription
TRUEevaluated 1129 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1129
4189 close_fd_bitmap (fds_to_close);
executed 1129 times by 1 test: close_fd_bitmap (fds_to_close);
Executed by:
  • Self test
1129
4190-
4191 /* If we fork because of an input pipe, note input pipe for later to-
4192 inhibit async commands from redirecting stdin from /dev/null */-
4193 stdin_redir |= pipe_in != NO_PIPE;-
4194-
4195 do_piping (pipe_in, pipe_out);-
4196 pipe_in = pipe_out = NO_PIPE;-
4197#if defined (COPROCESS_SUPPORT)-
4198 coproc_closeall ();-
4199#endif-
4200-
4201 last_asynchronous_pid = old_last_async_pid;-
4202-
4203 CHECK_SIGTERM;
never executed: termsig_handler ( 15 );
sigterm_receivedDescription
TRUEnever evaluated
FALSEevaluated 1129 times by 1 test
Evaluated by:
  • Self test
0-1129
4204-
4205 if (async)
asyncDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1119 times by 1 test
Evaluated by:
  • Self test
10-1119
4206 subshell_level++; /* not for pipes yet */
executed 10 times by 1 test: subshell_level++;
Executed by:
  • Self test
10
4207-
4208#if defined (JOB_CONTROL)-
4209 FREE (p); /* child doesn't use pointer */
executed 1129 times by 1 test: sh_xfree((p), "execute_cmd.c", 4209);
Executed by:
  • Self test
pDescription
TRUEevaluated 1129 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1129
4210#endif-
4211 }
executed 1129 times by 1 test: end of block
Executed by:
  • Self test
1129
4212 else-
4213 {-
4214 /* Don't let simple commands that aren't the last command in a-
4215 pipeline change $? for the rest of the pipeline (or at all). */-
4216 if (pipe_out != NO_PIPE)
pipe_out != -1Description
TRUEevaluated 12834 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10644 times by 1 test
Evaluated by:
  • Self test
10644-12834
4217 result = last_command_exit_value;
executed 12834 times by 1 test: result = last_command_exit_value;
Executed by:
  • Self test
12834
4218 close_pipes (pipe_in, pipe_out);-
4219#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)-
4220#if 0-
4221 /* Close /dev/fd file descriptors in the parent after forking the-
4222 last child in a (possibly one-element) pipeline. Defer this-
4223 until any running shell function completes. */-
4224 if (pipe_out == NO_PIPE && variable_context == 0) /* XXX */-
4225 unlink_fifo_list (); /* XXX */-
4226#endif-
4227#endif-
4228 command_line = (char *)NULL; /* don't free this. */-
4229 bind_lastarg ((char *)NULL);-
4230 return (result);
executed 23478 times by 1 test: return (result);
Executed by:
  • Self test
23478
4231 }-
4232 }-
4233-
4234 QUIT; /* XXX */
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 64686766 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 64686766 times by 1 test
Evaluated by:
  • Self test
0-64686766
4235-
4236 /* If we are re-running this as the result of executing the `command'-
4237 builtin, do not expand the command words a second time. */-
4238 if ((simple_command->flags & CMD_INHIBIT_EXPANSION) == 0)
(simple_comman...s & 0x20) == 0Description
TRUEevaluated 64686699 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 67 times by 1 test
Evaluated by:
  • Self test
67-64686699
4239 {-
4240 current_fds_to_close = fds_to_close;-
4241 fix_assignment_words (simple_command->words);-
4242 /* Pass the ignore return flag down to command substitutions */-
4243 if (simple_command->flags & CMD_IGNORE_RETURN) /* XXX */
simple_command->flags & 0x08Description
TRUEevaluated 13832323 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50854376 times by 1 test
Evaluated by:
  • Self test
13832323-50854376
4244 comsub_ignore_return++;
executed 13832323 times by 1 test: comsub_ignore_return++;
Executed by:
  • Self test
13832323
4245 words = expand_words (simple_command->words);-
4246 if (simple_command->flags & CMD_IGNORE_RETURN)
simple_command->flags & 0x08Description
TRUEevaluated 13832312 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50851225 times by 1 test
Evaluated by:
  • Self test
13832312-50851225
4247 comsub_ignore_return--;
executed 13832312 times by 1 test: comsub_ignore_return--;
Executed by:
  • Self test
13832312
4248 current_fds_to_close = (struct fd_bitmap *)NULL;-
4249 }
executed 64683537 times by 1 test: end of block
Executed by:
  • Self test
64683537
4250 else-
4251 words = copy_word_list (simple_command->words);
executed 67 times by 1 test: words = copy_word_list (simple_command->words);
Executed by:
  • Self test
67
4252-
4253 /* It is possible for WORDS not to have anything left in it.-
4254 Perhaps all the words consisted of `$foo', and there was-
4255 no variable `$foo'. */-
4256 if (words == 0)
words == 0Description
TRUEevaluated 29961057 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34722547 times by 1 test
Evaluated by:
  • Self test
29961057-34722547
4257 {-
4258 this_command_name = 0;-
4259 result = execute_null_command (simple_command->redirects,-
4260 pipe_in, pipe_out,-
4261 already_forked ? 0 : async);-
4262 if (already_forked)
already_forkedDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 29961051 times by 1 test
Evaluated by:
  • Self test
4-29961051
4263 sh_exit (result);
executed 4 times by 1 test: sh_exit (result);
Executed by:
  • Self test
4
4264 else-
4265 {-
4266 bind_lastarg ((char *)NULL);-
4267 set_pipestatus_from_exit (result);-
4268 return (result);
executed 29961051 times by 1 test: return (result);
Executed by:
  • Self test
29961051
4269 }-
4270 }-
4271-
4272 lastarg = (char *)NULL;-
4273-
4274 begin_unwind_frame ("simple-command");-
4275-
4276 if (echo_command_at_execute)
echo_command_at_executeDescription
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34722523 times by 1 test
Evaluated by:
  • Self test
24-34722523
4277 xtrace_print_word_list (words, 1);
executed 24 times by 1 test: xtrace_print_word_list (words, 1);
Executed by:
  • Self test
24
4278-
4279 builtin = (sh_builtin_func_t *)NULL;-
4280 func = (SHELL_VAR *)NULL;-
4281 if ((simple_command->flags & CMD_NO_FUNCTIONS) == 0)
(simple_comman...s & 0x10) == 0Description
TRUEevaluated 34722480 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 67 times by 1 test
Evaluated by:
  • Self test
67-34722480
4282 {-
4283 /* Posix.2 says special builtins are found before functions. We-
4284 don't set builtin_is_special anywhere other than here, because-
4285 this path is followed only when the `command' builtin is *not*-
4286 being used, and we don't want to exit the shell if a special-
4287 builtin executed with `command builtin' fails. `command' is not-
4288 a special builtin. */-
4289 if (posixly_correct)
posixly_correctDescription
TRUEevaluated 410 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34722070 times by 1 test
Evaluated by:
  • Self test
410-34722070
4290 {-
4291 builtin = find_special_builtin (words->word->word);-
4292 if (builtin)
builtinDescription
TRUEevaluated 113 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 297 times by 1 test
Evaluated by:
  • Self test
113-297
4293 builtin_is_special = 1;
executed 113 times by 1 test: builtin_is_special = 1;
Executed by:
  • Self test
113
4294 }
executed 410 times by 1 test: end of block
Executed by:
  • Self test
410
4295 if (builtin == 0)
builtin == 0Description
TRUEevaluated 34722367 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 113 times by 1 test
Evaluated by:
  • Self test
113-34722367
4296 func = find_function (words->word->word);
executed 34722367 times by 1 test: func = find_function (words->word->word);
Executed by:
  • Self test
34722367
4297 }
executed 34722480 times by 1 test: end of block
Executed by:
  • Self test
34722480
4298-
4299 /* In POSIX mode, assignment errors in the temporary environment cause a-
4300 non-interactive shell to exit. */-
4301 if (posixly_correct && builtin_is_special && interactive_shell == 0 && tempenv_assign_error)
posixly_correctDescription
TRUEevaluated 411 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34722136 times by 1 test
Evaluated by:
  • Self test
builtin_is_specialDescription
TRUEevaluated 113 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 298 times by 1 test
Evaluated by:
  • Self test
interactive_shell == 0Description
TRUEevaluated 113 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
tempenv_assign_errorDescription
TRUEnever evaluated
FALSEevaluated 113 times by 1 test
Evaluated by:
  • Self test
0-34722136
4302 {-
4303 last_command_exit_value = EXECUTION_FAILURE;-
4304 jump_to_top_level (ERREXIT);-
4305 }
never executed: end of block
0
4306 tempenv_assign_error = 0; /* don't care about this any more */-
4307-
4308 add_unwind_protect (dispose_words, words);-
4309 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 34722547 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 34722547 times by 1 test
Evaluated by:
  • Self test
0-34722547
4310-
4311 /* Bind the last word in this command to "$_" after execution. */-
4312 for (lastword = words; lastword->next; lastword = lastword->next)
lastword->nextDescription
TRUEevaluated 21622997 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34722547 times by 1 test
Evaluated by:
  • Self test
21622997-34722547
4313 ;
executed 21622997 times by 1 test: ;
Executed by:
  • Self test
21622997
4314 lastarg = lastword->word->word;-
4315-
4316#if defined (JOB_CONTROL)-
4317 /* Is this command a job control related thing? */-
4318 if (words->word->word[0] == '%' && already_forked == 0)
words->word->word[0] == '%'Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34722544 times by 1 test
Evaluated by:
  • Self test
already_forked == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-34722544
4319 {-
4320 this_command_name = async ? "bg" : "fg";
asyncDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
4321 last_shell_builtin = this_shell_builtin;-
4322 this_shell_builtin = builtin_address (this_command_name);-
4323 result = (*this_shell_builtin) (words);-
4324 goto return_result;
executed 3 times by 1 test: goto return_result;
Executed by:
  • Self test
3
4325 }-
4326-
4327 /* One other possibililty. The user may want to resume an existing job.-
4328 If they do, find out whether this word is a candidate for a running-
4329 job. */-
4330 if (job_control && already_forked == 0 && async == 0 &&
job_controlDescription
TRUEevaluated 197 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34722347 times by 1 test
Evaluated by:
  • Self test
already_forked == 0Description
TRUEevaluated 195 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
async == 0Description
TRUEevaluated 195 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-34722347
4331 !first_word_quoted &&
!first_word_quotedDescription
TRUEevaluated 195 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-195
4332 !words->next &&
!words->nextDescription
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177 times by 1 test
Evaluated by:
  • Self test
18-177
4333 words->word->word[0] &&
words->word->word[0]Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-18
4334 !simple_command->redirects &&
!simple_command->redirectsDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
5-13
4335 pipe_in == NO_PIPE &&
pipe_in == -1Description
TRUEevaluated 13 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-13
4336 pipe_out == NO_PIPE &&
pipe_out == -1Description
TRUEevaluated 13 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-13
4337 (temp = get_string_value ("auto_resume")))
(temp = get_st...auto_resume"))Description
TRUEnever evaluated
FALSEevaluated 13 times by 1 test
Evaluated by:
  • Self test
0-13
4338 {-
4339 int job, jflags, started_status;-
4340-
4341 jflags = JM_STOPPED|JM_FIRSTMATCH;-
4342 if (STREQ (temp, "exact"))
never executed: __result = (((const unsigned char *) (const char *) ( temp ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "exact" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(temp)[0] == ("exact")[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
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
4343 jflags |= JM_EXACT;
never executed: jflags |= 0x04;
0
4344 else if (STREQ (temp, "substring"))
never executed: __result = (((const unsigned char *) (const char *) ( temp ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "substring" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(temp)[0] == ("substring")[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
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
4345 jflags |= JM_SUBSTRING;
never executed: jflags |= 0x02;
0
4346 else-
4347 jflags |= JM_PREFIX;
never executed: jflags |= 0x01;
0
4348 job = get_job_by_name (words->word->word, jflags);-
4349 if (job != NO_JOB)
job != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
4350 {-
4351 run_unwind_frame ("simple-command");-
4352 this_command_name = "fg";-
4353 last_shell_builtin = this_shell_builtin;-
4354 this_shell_builtin = builtin_address ("fg");-
4355-
4356 started_status = start_job (job, 1);-
4357 return ((started_status < 0) ? EXECUTION_FAILURE : started_status);
never executed: return ((started_status < 0) ? 1 : started_status);
0
4358 }-
4359 }
never executed: end of block
0
4360#endif /* JOB_CONTROL */-
4361-
4362run_builtin:
code before this statement executed 34722544 times by 1 test: run_builtin:
Executed by:
  • Self test
34722544
4363 /* Remember the name of this command globally. */-
4364 this_command_name = words->word->word;-
4365-
4366 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 34722544 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 34722544 times by 1 test
Evaluated by:
  • Self test
0-34722544
4367-
4368 /* This command could be a shell builtin or a user-defined function.-
4369 We have already found special builtins by this time, so we do not-
4370 set builtin_is_special. If this is a function or builtin, and we-
4371 have pipes, then fork a subshell in here. Otherwise, just execute-
4372 the command directly. */-
4373 if (func == 0 && builtin == 0)
func == 0Description
TRUEevaluated 33082069 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1640475 times by 1 test
Evaluated by:
  • Self test
builtin == 0Description
TRUEevaluated 33081956 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 113 times by 1 test
Evaluated by:
  • Self test
113-33082069
4374 builtin = find_shell_builtin (this_command_name);
executed 33081956 times by 1 test: builtin = find_shell_builtin (this_command_name);
Executed by:
  • Self test
33081956
4375-
4376 last_shell_builtin = this_shell_builtin;-
4377 this_shell_builtin = builtin;-
4378-
4379 if (builtin || func)
builtinDescription
TRUEevaluated 33054261 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1668283 times by 1 test
Evaluated by:
  • Self test
funcDescription
TRUEevaluated 1640475 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 27808 times by 1 test
Evaluated by:
  • Self test
27808-33054261
4380 {-
4381 if (builtin)
builtinDescription
TRUEevaluated 33054261 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1640475 times by 1 test
Evaluated by:
  • Self test
1640475-33054261
4382 {-
4383 old_builtin = executing_builtin;-
4384 old_command_builtin = executing_command_builtin;-
4385 unwind_protect_int (executing_builtin); /* modified in execute_builtin */-
4386 unwind_protect_int (executing_command_builtin); /* ditto */-
4387 }
executed 33054261 times by 1 test: end of block
Executed by:
  • Self test
33054261
4388 if (already_forked)
already_forkedDescription
TRUEevaluated 1121 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34693615 times by 1 test
Evaluated by:
  • Self test
1121-34693615
4389 {-
4390 /* reset_terminating_signals (); */ /* XXX */-
4391 /* Reset the signal handlers in the child, but don't free the-
4392 trap strings. Set a flag noting that we have to free the-
4393 trap strings if we run trap to change a signal disposition. */-
4394 reset_signal_handlers ();-
4395 subshell_environment |= SUBSHELL_RESETTRAP;-
4396-
4397 if (async)
asyncDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1114 times by 1 test
Evaluated by:
  • Self test
7-1114
4398 {-
4399 if ((simple_command->flags & CMD_STDIN_REDIR) &&
(simple_comman...flags & 0x400)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
3-4
4400 pipe_in == NO_PIPE &&
pipe_in == -1Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-4
4401 (stdin_redirects (simple_command->redirects) == 0))
(stdin_redirec...directs) == 0)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-4
4402 async_redirect_stdin ();
executed 4 times by 1 test: async_redirect_stdin ();
Executed by:
  • Self test
4
4403 setup_async_signals ();-
4404 }
executed 7 times by 1 test: end of block
Executed by:
  • Self test
7
4405-
4406 if (async == 0)
async == 0Description
TRUEevaluated 1114 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
7-1114
4407 subshell_level++;
executed 1114 times by 1 test: subshell_level++;
Executed by:
  • Self test
1114
4408 execute_subshell_builtin_or_function-
4409 (words, simple_command->redirects, builtin, func,-
4410 pipe_in, pipe_out, async, fds_to_close,-
4411 simple_command->flags);-
4412 subshell_level--;-
4413 }
never executed: end of block
0
4414 else-
4415 {-
4416 result = execute_builtin_or_function-
4417 (words, builtin, func, simple_command->redirects, fds_to_close,-
4418 simple_command->flags);-
4419 if (builtin)
builtinDescription
TRUEevaluated 33051025 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1636122 times by 1 test
Evaluated by:
  • Self test
1636122-33051025
4420 {-
4421 if (result > EX_SHERRBASE)
result > 256Description
TRUEevaluated 242 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33050783 times by 1 test
Evaluated by:
  • Self test
242-33050783
4422 {-
4423 switch (result)-
4424 {-
4425 case EX_REDIRFAIL:
executed 104 times by 1 test: case 259:
Executed by:
  • Self test
104
4426 case EX_BADASSIGN:
executed 57 times by 1 test: case 260:
Executed by:
  • Self test
57
4427 case EX_EXPFAIL:
never executed: case 261:
0
4428 /* These errors cause non-interactive posix mode shells to exit */-
4429 if (posixly_correct && builtin_is_special && interactive_shell == 0)
posixly_correctDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 160 times by 1 test
Evaluated by:
  • Self test
builtin_is_specialDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
interactive_shell == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-160
4430 {-
4431 last_command_exit_value = EXECUTION_FAILURE;-
4432 jump_to_top_level (ERREXIT);-
4433 }
never executed: end of block
0
4434 break;
executed 160 times by 1 test: break;
Executed by:
  • Self test
160
4435 case EX_DISKFALLBACK:
never executed: case 262:
0
4436 /* XXX - experimental */-
4437 executing_builtin = old_builtin;-
4438 executing_command_builtin = old_command_builtin;-
4439 builtin = 0;-
4440 /* XXX - redirections will have to be performed again */-
4441 goto execute_from_filesystem;
never executed: goto execute_from_filesystem;
0
4442 }-
4443 result = builtin_status (result);-
4444 if (builtin_is_special)
builtin_is_specialDescription
TRUEnever evaluated
FALSEevaluated 241 times by 1 test
Evaluated by:
  • Self test
0-241
4445 special_builtin_failed = 1; /* XXX - take command builtin into account? */
never executed: special_builtin_failed = 1;
0
4446 }
executed 241 times by 1 test: end of block
Executed by:
  • Self test
241
4447 /* In POSIX mode, if there are assignment statements preceding-
4448 a special builtin, they persist after the builtin-
4449 completes. */-
4450 if (posixly_correct && builtin_is_special && temporary_env)
posixly_correctDescription
TRUEevaluated 427 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33050597 times by 1 test
Evaluated by:
  • Self test
builtin_is_specialDescription
TRUEevaluated 79 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 348 times by 1 test
Evaluated by:
  • Self test
temporary_envDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 71 times by 1 test
Evaluated by:
  • Self test
8-33050597
4451 merge_temporary_env ();
executed 8 times by 1 test: merge_temporary_env ();
Executed by:
  • Self test
8
4452 }
executed 33051024 times by 1 test: end of block
Executed by:
  • Self test
33051024
4453 else /* function */-
4454 {-
4455 if (result == EX_USAGE)
result == 258Description
TRUEnever evaluated
FALSEevaluated 1636122 times by 1 test
Evaluated by:
  • Self test
0-1636122
4456 result = EX_BADUSAGE;
never executed: result = 2;
0
4457 else if (result > EX_SHERRBASE)
result > 256Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1636121 times by 1 test
Evaluated by:
  • Self test
1-1636121
4458 result = EXECUTION_FAILURE;
executed 1 time by 1 test: result = 1;
Executed by:
  • Self test
1
4459 }
executed 1636122 times by 1 test: end of block
Executed by:
  • Self test
1636122
4460-
4461 set_pipestatus_from_exit (result);-
4462-
4463 goto return_result;
executed 34687146 times by 1 test: goto return_result;
Executed by:
  • Self test
34687146
4464 }-
4465 }-
4466-
4467 if (autocd && interactive && words->word && is_dirname (words->word->word))
autocdDescription
TRUEnever evaluated
FALSEevaluated 27808 times by 1 test
Evaluated by:
  • Self test
interactiveDescription
TRUEnever evaluated
FALSEnever evaluated
words->wordDescription
TRUEnever evaluated
FALSEnever evaluated
is_dirname (words->word->word)Description
TRUEnever evaluated
FALSEnever evaluated
0-27808
4468 {-
4469 words = make_word_list (make_word ("--"), words);-
4470 words = make_word_list (make_word ("cd"), words);-
4471 xtrace_print_word_list (words, 0);-
4472 func = find_function ("cd");-
4473 goto run_builtin;
never executed: goto run_builtin;
0
4474 }-
4475-
4476execute_from_filesystem:
code before this statement executed 27808 times by 1 test: execute_from_filesystem:
Executed by:
  • Self test
27808
4477 if (command_line == 0)
command_line == 0Description
TRUEevaluated 27808 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-27808
4478 command_line = savestring (the_printed_command_except_trap ? the_printed_command_except_trap : "");
executed 27808 times by 1 test: command_line = (char *)strcpy (sh_xmalloc((1 + strlen (the_printed_command_except_trap ? the_printed_command_except_trap : "")), "execute_cmd.c", 4478), (the_printed_command_except_trap ? the_printed_command_except_trap : ""));
Executed by:
  • Self test
27808
4479-
4480#if defined (PROCESS_SUBSTITUTION)-
4481 /* The old code did not test already_forked and only did this if-
4482 subshell_environment&SUBSHELL_COMSUB != 0 (comsubs and procsubs). Other-
4483 uses of the no-fork optimization left FIFOs in $TMPDIR */-
4484 if (already_forked == 0 && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0)
already_forked == 0Description
TRUEevaluated 27808 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(simple_command->flags & 0x40)Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 27798 times by 1 test
Evaluated by:
  • Self test
fifos_pending() > 0Description
TRUEnever evaluated
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
0-27808
4485 simple_command->flags &= ~CMD_NO_FORK;
never executed: simple_command->flags &= ~0x40;
0
4486#endif-
4487 result = execute_disk_command (words, simple_command->redirects, command_line,-
4488 pipe_in, pipe_out, async, fds_to_close,-
4489 simple_command->flags);-
4490-
4491 return_result:
code before this statement executed 27757 times by 1 test: return_result:
Executed by:
  • Self test
27757
4492 bind_lastarg (lastarg);-
4493 FREE (command_line);
executed 27757 times by 1 test: sh_xfree((command_line), "execute_cmd.c", 4493);
Executed by:
  • Self test
command_lineDescription
TRUEevaluated 27757 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34687149 times by 1 test
Evaluated by:
  • Self test
27757-34687149
4494 dispose_words (words);-
4495 if (builtin)
builtinDescription
TRUEevaluated 33051024 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1663882 times by 1 test
Evaluated by:
  • Self test
1663882-33051024
4496 {-
4497 executing_builtin = old_builtin;-
4498 executing_command_builtin = old_command_builtin;-
4499 }
executed 33051024 times by 1 test: end of block
Executed by:
  • Self test
33051024
4500 discard_unwind_frame ("simple-command");-
4501 this_command_name = (char *)NULL; /* points to freed memory now */-
4502 return (result);
executed 34714906 times by 1 test: return (result);
Executed by:
  • Self test
34714906
4503}-
4504-
4505/* Translate the special builtin exit statuses. We don't really need a-
4506 function for this; it's a placeholder for future work. */-
4507static int-
4508builtin_status (result)-
4509 int result;-
4510{-
4511 int r;-
4512-
4513 switch (result)-
4514 {-
4515 case EX_USAGE:
executed 81 times by 1 test: case 258:
Executed by:
  • Self test
81
4516 r = EX_BADUSAGE;-
4517 break;
executed 81 times by 1 test: break;
Executed by:
  • Self test
81
4518 case EX_REDIRFAIL:
executed 103 times by 1 test: case 259:
Executed by:
  • Self test
103
4519 case EX_BADSYNTAX:
never executed: case 257:
0
4520 case EX_BADASSIGN:
executed 57 times by 1 test: case 260:
Executed by:
  • Self test
57
4521 case EX_EXPFAIL:
never executed: case 261:
0
4522 r = EXECUTION_FAILURE;-
4523 break;
executed 160 times by 1 test: break;
Executed by:
  • Self test
160
4524 default:
never executed: default:
0
4525 r = EXECUTION_SUCCESS;-
4526 break;
never executed: break;
0
4527 }-
4528 return (r);
executed 241 times by 1 test: return (r);
Executed by:
  • Self test
241
4529}-
4530-
4531static int-
4532execute_builtin (builtin, words, flags, subshell)-
4533 sh_builtin_func_t *builtin;-
4534 WORD_LIST *words;-
4535 int flags, subshell;-
4536{-
4537 int result, eval_unwind, ignexit_flag;-
4538 int isbltinenv, should_keep;-
4539 char *error_trap;-
4540-
4541 error_trap = 0;-
4542 should_keep = 0;-
4543-
4544 /* The eval builtin calls parse_and_execute, which does not know about-
4545 the setting of flags, and always calls the execution functions with-
4546 flags that will exit the shell on an error if -e is set. If the-
4547 eval builtin is being called, and we're supposed to ignore the exit-
4548 value of the command, we turn the -e flag off ourselves and disable-
4549 the ERR trap, then restore them when the command completes. This is-
4550 also a problem (as below) for the command and source/. builtins. */-
4551 if (subshell == 0 && (flags & CMD_IGNORE_RETURN) &&
subshell == 0Description
TRUEevaluated 33053117 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1024 times by 1 test
Evaluated by:
  • Self test
(flags & 0x08)Description
TRUEevaluated 13828587 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 19224530 times by 1 test
Evaluated by:
  • Self test
1024-33053117
4552 (builtin == eval_builtin || builtin == command_builtin || builtin == source_builtin))
builtin == eval_builtinDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13828580 times by 1 test
Evaluated by:
  • Self test
builtin == command_builtinDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13828570 times by 1 test
Evaluated by:
  • Self test
builtin == source_builtinDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13828568 times by 1 test
Evaluated by:
  • Self test
2-13828580
4553 {-
4554 begin_unwind_frame ("eval_builtin");-
4555 unwind_protect_int (exit_immediately_on_error);-
4556 unwind_protect_int (builtin_ignoring_errexit);-
4557 error_trap = TRAP_STRING (ERROR_TRAP);
signal_is_trapped ( 65 +1)Description
TRUEnever evaluated
FALSEevaluated 19 times by 1 test
Evaluated by:
  • Self test
signal_is_igno... ( 65 +1) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-19
4558 if (error_trap)
error_trapDescription
TRUEnever evaluated
FALSEevaluated 19 times by 1 test
Evaluated by:
  • Self test
0-19
4559 {-
4560 error_trap = savestring (error_trap);-
4561 add_unwind_protect (xfree, error_trap);-
4562 add_unwind_protect (set_error_trap, error_trap);-
4563 restore_default_signal (ERROR_TRAP);-
4564 }
never executed: end of block
0
4565 exit_immediately_on_error = 0;-
4566 ignexit_flag = builtin_ignoring_errexit;-
4567 builtin_ignoring_errexit = 1;-
4568 eval_unwind = 1;-
4569 }
executed 19 times by 1 test: end of block
Executed by:
  • Self test
19
4570 else-
4571 eval_unwind = 0;
executed 33054122 times by 1 test: eval_unwind = 0;
Executed by:
  • Self test
33054122
4572-
4573 /* The temporary environment for a builtin is supposed to apply to-
4574 all commands executed by that builtin. Currently, this is a-
4575 problem only with the `unset', `source' and `eval' builtins.-
4576 `mapfile' is a special case because it uses evalstring (same as-
4577 eval or source) to run its callbacks. */-
4578 /* SHOULD_KEEP is for the pop_scope call below; it only matters when-
4579 posixly_correct is set, but we should propagate the temporary environment-
4580 to the enclosing environment only for special builtins. */-
4581 isbltinenv = (builtin == source_builtin || builtin == eval_builtin || builtin == unset_builtin || builtin == mapfile_builtin);
builtin == source_builtinDescription
TRUEevaluated 1405 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33052736 times by 1 test
Evaluated by:
  • Self test
builtin == eval_builtinDescription
TRUEevaluated 13184 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33039552 times by 1 test
Evaluated by:
  • Self test
builtin == unset_builtinDescription
TRUEevaluated 12389 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33027163 times by 1 test
Evaluated by:
  • Self test
builtin == mapfile_builtinDescription
TRUEevaluated 25 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33027138 times by 1 test
Evaluated by:
  • Self test
25-33052736
4582 should_keep = isbltinenv && builtin != mapfile_builtin;
isbltinenvDescription
TRUEevaluated 27003 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33027138 times by 1 test
Evaluated by:
  • Self test
builtin != mapfile_builtinDescription
TRUEevaluated 26978 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 25 times by 1 test
Evaluated by:
  • Self test
25-33027138
4583#if defined (HISTORY) && defined (READLINE)-
4584 if (builtin == fc_builtin || builtin == read_builtin)
builtin == fc_builtinDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33054124 times by 1 test
Evaluated by:
  • Self test
builtin == read_builtinDescription
TRUEevaluated 1322724 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31731400 times by 1 test
Evaluated by:
  • Self test
17-33054124
4585 {-
4586 isbltinenv = 1;-
4587 should_keep = 0;-
4588 }
executed 1322741 times by 1 test: end of block
Executed by:
  • Self test
1322741
4589#endif-
4590-
4591 if (isbltinenv)
isbltinenvDescription
TRUEevaluated 1349744 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31704397 times by 1 test
Evaluated by:
  • Self test
1349744-31704397
4592 {-
4593 if (subshell == 0)
subshell == 0Description
TRUEevaluated 1349740 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
4-1349740
4594 begin_unwind_frame ("builtin_env");
executed 1349740 times by 1 test: begin_unwind_frame ("builtin_env");
Executed by:
  • Self test
1349740
4595-
4596 if (temporary_env)
temporary_envDescription
TRUEevaluated 102 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1349642 times by 1 test
Evaluated by:
  • Self test
102-1349642
4597 {-
4598 push_scope (VC_BLTNENV, temporary_env);-
4599 if (flags & CMD_COMMAND_BUILTIN)
flags & 0x0800Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 94 times by 1 test
Evaluated by:
  • Self test
8-94
4600 should_keep = 0;
executed 8 times by 1 test: should_keep = 0;
Executed by:
  • Self test
8
4601 if (subshell == 0)
subshell == 0Description
TRUEevaluated 102 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-102
4602 add_unwind_protect (pop_scope, should_keep ? "1" : 0);
executed 102 times by 1 test: add_unwind_protect (pop_scope, should_keep ? "1" : 0);
Executed by:
  • Self test
102
4603 temporary_env = (HASH_TABLE *)NULL; -
4604 }
executed 102 times by 1 test: end of block
Executed by:
  • Self test
102
4605 }
executed 1349744 times by 1 test: end of block
Executed by:
  • Self test
1349744
4606-
4607 if (subshell == 0 && builtin == eval_builtin)
subshell == 0Description
TRUEevaluated 33053117 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1024 times by 1 test
Evaluated by:
  • Self test
builtin == eval_builtinDescription
TRUEevaluated 13184 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33039933 times by 1 test
Evaluated by:
  • Self test
1024-33053117
4608 {-
4609 if (evalnest_max > 0 && evalnest >= evalnest_max)
evalnest_max > 0Description
TRUEnever evaluated
FALSEevaluated 13184 times by 1 test
Evaluated by:
  • Self test
evalnest >= evalnest_maxDescription
TRUEnever evaluated
FALSEnever evaluated
0-13184
4610 {-
4611 internal_error (_("eval: maximum eval nesting level exceeded (%d)"), evalnest);-
4612 evalnest = 0;-
4613 jump_to_top_level (DISCARD);-
4614 }
never executed: end of block
0
4615 unwind_protect_int (evalnest);-
4616 /* The test for subshell == 0 above doesn't make a difference */-
4617 evalnest++; /* execute_subshell_builtin_or_function sets this to 0 */-
4618 }
executed 13184 times by 1 test: end of block
Executed by:
  • Self test
13184
4619 else if (subshell == 0 && builtin == source_builtin)
subshell == 0Description
TRUEevaluated 33039933 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1024 times by 1 test
Evaluated by:
  • Self test
builtin == source_builtinDescription
TRUEevaluated 1403 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33038530 times by 1 test
Evaluated by:
  • Self test
1024-33039933
4620 {-
4621 if (sourcenest_max > 0 && sourcenest >= sourcenest_max)
sourcenest_max > 0Description
TRUEnever evaluated
FALSEevaluated 1403 times by 1 test
Evaluated by:
  • Self test
sourcenest >= sourcenest_maxDescription
TRUEnever evaluated
FALSEnever evaluated
0-1403
4622 {-
4623 internal_error (_("%s: maximum source nesting level exceeded (%d)"), this_command_name, sourcenest);-
4624 sourcenest = 0;-
4625 jump_to_top_level (DISCARD);-
4626 }
never executed: end of block
0
4627 unwind_protect_int (sourcenest);-
4628 /* The test for subshell == 0 above doesn't make a difference */-
4629 sourcenest++; /* execute_subshell_builtin_or_function sets this to 0 */-
4630 }
executed 1403 times by 1 test: end of block
Executed by:
  • Self test
1403
4631-
4632 /* `return' does a longjmp() back to a saved environment in execute_function.-
4633 If a variable assignment list preceded the command, and the shell is-
4634 running in POSIX mode, we need to merge that into the shell_variables-
4635 table, since `return' is a POSIX special builtin. */-
4636 if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
posixly_correctDescription
TRUEevaluated 371 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33053770 times by 1 test
Evaluated by:
  • Self test
subshell == 0Description
TRUEevaluated 370 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
builtin == return_builtinDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 364 times by 1 test
Evaluated by:
  • Self test
temporary_envDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
1-33053770
4637 {-
4638 begin_unwind_frame ("return_temp_env");-
4639 add_unwind_protect (merge_temporary_env, (char *)NULL);-
4640 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
4641-
4642 executing_builtin++;-
4643 executing_command_builtin |= builtin == command_builtin;-
4644 result = ((*builtin) (words->next));-
4645-
4646 /* This shouldn't happen, but in case `return' comes back instead of-
4647 longjmp'ing, we need to unwind. */-
4648 if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
posixly_correctDescription
TRUEevaluated 428 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33051510 times by 1 test
Evaluated by:
  • Self test
subshell == 0Description
TRUEevaluated 427 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
builtin == return_builtinDescription
TRUEnever evaluated
FALSEevaluated 427 times by 1 test
Evaluated by:
  • Self test
temporary_envDescription
TRUEnever evaluated
FALSEnever evaluated
0-33051510
4649 discard_unwind_frame ("return_temp_env");
never executed: discard_unwind_frame ("return_temp_env");
0
4650-
4651 if (subshell == 0 && isbltinenv)
subshell == 0Description
TRUEevaluated 33050921 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1017 times by 1 test
Evaluated by:
  • Self test
isbltinenvDescription
TRUEevaluated 1349718 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31701203 times by 1 test
Evaluated by:
  • Self test
1017-33050921
4652 run_unwind_frame ("builtin_env");
executed 1349718 times by 1 test: run_unwind_frame ("builtin_env");
Executed by:
  • Self test
1349718
4653-
4654 if (eval_unwind)
eval_unwindDescription
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33051920 times by 1 test
Evaluated by:
  • Self test
18-33051920
4655 {-
4656 builtin_ignoring_errexit = ignexit_flag;-
4657 exit_immediately_on_error = builtin_ignoring_errexit ? 0 : errexit_flag;
builtin_ignoring_errexitDescription
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
4658 if (error_trap)
error_trapDescription
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
4659 {-
4660 set_error_trap (error_trap);-
4661 free (error_trap);-
4662 }
never executed: end of block
0
4663 discard_unwind_frame ("eval_builtin");-
4664 }
executed 18 times by 1 test: end of block
Executed by:
  • Self test
18
4665-
4666 return (result);
executed 33051938 times by 1 test: return (result);
Executed by:
  • Self test
33051938
4667}-
4668-
4669static void-
4670maybe_restore_getopt_state (gs)-
4671 sh_getopt_state_t *gs;-
4672{-
4673 /* If we have a local copy of OPTIND and it's at the right (current)-
4674 context, then we restore getopt's internal state. If not, we just-
4675 let it go. We know there is a local OPTIND if gs->gs_flags & 1.-
4676 This is set below in execute_function() before the context is run. */-
4677 if (gs->gs_flags & 1)
gs->gs_flags & 1Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1636133 times by 1 test
Evaluated by:
  • Self test
3-1636133
4678 sh_getopt_restore_istate (gs);
executed 3 times by 1 test: sh_getopt_restore_istate (gs);
Executed by:
  • Self test
3
4679 else-
4680 free (gs);
executed 1636133 times by 1 test: sh_xfree((gs), "execute_cmd.c", 4680);
Executed by:
  • Self test
1636133
4681}-
4682-
4683#if defined (ARRAY_VARS)-
4684void-
4685restore_funcarray_state (fa)-
4686 struct func_array_state *fa;-
4687{-
4688 SHELL_VAR *nfv;-
4689 ARRAY *funcname_a;-
4690-
4691 array_pop (fa->source_a);-
4692 array_pop (fa->lineno_a);-
4693-
4694 GET_ARRAY_FROM_VAR ("FUNCNAME", nfv, funcname_a);-
4695 if (nfv == fa->funcname_v)
nfv == fa->funcname_vDescription
TRUEevaluated 1637582 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1637582
4696 array_pop (funcname_a);
executed 1637582 times by 1 test: end of block
Executed by:
  • Self test
1637582
4697-
4698 free (fa);-
4699}
executed 1637582 times by 1 test: end of block
Executed by:
  • Self test
1637582
4700#endif-
4701-
4702static int-
4703execute_function (var, words, flags, fds_to_close, async, subshell)-
4704 SHELL_VAR *var;-
4705 WORD_LIST *words;-
4706 int flags;-
4707 struct fd_bitmap *fds_to_close;-
4708 int async, subshell;-
4709{-
4710 int return_val, result;-
4711 COMMAND *tc, *fc, *save_current;-
4712 char *debug_trap, *error_trap, *return_trap;-
4713#if defined (ARRAY_VARS)-
4714 SHELL_VAR *funcname_v, *bash_source_v, *bash_lineno_v;-
4715 ARRAY *funcname_a;-
4716 volatile ARRAY *bash_source_a;-
4717 volatile ARRAY *bash_lineno_a;-
4718 struct func_array_state *fa;-
4719#endif-
4720 FUNCTION_DEF *shell_fn;-
4721 char *sfile, *t;-
4722 sh_getopt_state_t *gs;-
4723 SHELL_VAR *gv;-
4724-
4725 USE_VAR(fc);-
4726-
4727 if (funcnest_max > 0 && funcnest >= funcnest_max)
funcnest_max > 0Description
TRUEevaluated 223 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1640251 times by 1 test
Evaluated by:
  • Self test
funcnest >= funcnest_maxDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 220 times by 1 test
Evaluated by:
  • Self test
3-1640251
4728 {-
4729 internal_error (_("%s: maximum function nesting level exceeded (%d)"), var->name, funcnest);-
4730 funcnest = 0; /* XXX - should we reset it somewhere else? */-
4731 jump_to_top_level (DISCARD);-
4732 }
never executed: end of block
0
4733-
4734#if defined (ARRAY_VARS)-
4735 GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v, funcname_a);-
4736 GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);-
4737 GET_ARRAY_FROM_VAR ("BASH_LINENO", bash_lineno_v, bash_lineno_a);-
4738#endif-
4739-
4740 tc = (COMMAND *)copy_command (function_cell (var));-
4741 if (tc && (flags & CMD_IGNORE_RETURN))
tcDescription
TRUEevaluated 1640471 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(flags & 0x08)Description
TRUEevaluated 3623 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1636848 times by 1 test
Evaluated by:
  • Self test
0-1640471
4742 tc->flags |= CMD_IGNORE_RETURN;
executed 3623 times by 1 test: tc->flags |= 0x08;
Executed by:
  • Self test
3623
4743-
4744 gs = sh_getopt_save_istate ();-
4745 if (subshell == 0)
subshell == 0Description
TRUEevaluated 1640374 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 97 times by 1 test
Evaluated by:
  • Self test
97-1640374
4746 {-
4747 begin_unwind_frame ("function_calling");-
4748 push_context (var->name, subshell, temporary_env);-
4749 /* This has to be before the pop_context(), because the unwinding of-
4750 local variables may cause the restore of a local declaration of-
4751 OPTIND to force a getopts state reset. */-
4752 add_unwind_protect (maybe_restore_getopt_state, gs);-
4753 add_unwind_protect (pop_context, (char *)NULL);-
4754 unwind_protect_int (line_number);-
4755 unwind_protect_int (line_number_for_err_trap);-
4756 unwind_protect_int (function_line_number);-
4757 unwind_protect_int (return_catch_flag);-
4758 unwind_protect_jmp_buf (return_catch);-
4759 add_unwind_protect (dispose_command, (char *)tc);-
4760 unwind_protect_pointer (this_shell_function);-
4761 unwind_protect_int (funcnest);-
4762 unwind_protect_int (loop_level);-
4763 }
executed 1640374 times by 1 test: end of block
Executed by:
  • Self test
1640374
4764 else-
4765 push_context (var->name, subshell, temporary_env); /* don't unwind-protect for subshells */
executed 97 times by 1 test: push_context (var->name, subshell, temporary_env);
Executed by:
  • Self test
97
4766-
4767 temporary_env = (HASH_TABLE *)NULL;-
4768-
4769 this_shell_function = var;-
4770 make_funcname_visible (1);-
4771-
4772 debug_trap = TRAP_STRING(DEBUG_TRAP);
signal_is_trapped ( 65 )Description
TRUEevaluated 2111 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1638360 times by 1 test
Evaluated by:
  • Self test
signal_is_ignored ( 65 ) == 0Description
TRUEevaluated 2111 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1638360
4773 error_trap = TRAP_STRING(ERROR_TRAP);
signal_is_trapped ( 65 +1)Description
TRUEnever evaluated
FALSEevaluated 1640471 times by 1 test
Evaluated by:
  • Self test
signal_is_igno... ( 65 +1) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-1640471
4774 return_trap = TRAP_STRING(RETURN_TRAP);
signal_is_trapped ( 65 +2)Description
TRUEevaluated 2081 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1638390 times by 1 test
Evaluated by:
  • Self test
signal_is_igno... ( 65 +2) == 0Description
TRUEevaluated 2081 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1638390
4775 -
4776 /* The order of the unwind protects for debug_trap, error_trap and-
4777 return_trap is important here! unwind-protect commands are run-
4778 in reverse order of registration. If this causes problems, take-
4779 out the xfree unwind-protect calls and live with the small memory leak. */-
4780-
4781 /* function_trace_mode != 0 means that all functions inherit the DEBUG trap.-
4782 if the function has the trace attribute set, it inherits the DEBUG trap */-
4783 if (debug_trap && ((trace_p (var) == 0) && function_trace_mode == 0))
debug_trapDescription
TRUEevaluated 2111 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1638360 times by 1 test
Evaluated by:
  • Self test
(((((var)->att...00080))) == 0)Description
TRUEevaluated 2105 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
function_trace_mode == 0Description
TRUEevaluated 114 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1991 times by 1 test
Evaluated by:
  • Self test
6-1638360
4784 {-
4785 if (subshell == 0)
subshell == 0Description
TRUEevaluated 114 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-114
4786 {-
4787 debug_trap = savestring (debug_trap);-
4788 add_unwind_protect (xfree, debug_trap);-
4789 add_unwind_protect (maybe_set_debug_trap, debug_trap);-
4790 }
executed 114 times by 1 test: end of block
Executed by:
  • Self test
114
4791 restore_default_signal (DEBUG_TRAP);-
4792 }
executed 114 times by 1 test: end of block
Executed by:
  • Self test
114
4793-
4794 /* error_trace_mode != 0 means that functions inherit the ERR trap. */-
4795 if (error_trap && error_trace_mode == 0)
error_trapDescription
TRUEnever evaluated
FALSEevaluated 1640471 times by 1 test
Evaluated by:
  • Self test
error_trace_mode == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-1640471
4796 {-
4797 if (subshell == 0)
subshell == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
4798 {-
4799 error_trap = savestring (error_trap);-
4800 add_unwind_protect (xfree, error_trap);-
4801 add_unwind_protect (maybe_set_error_trap, error_trap);-
4802 }
never executed: end of block
0
4803 restore_default_signal (ERROR_TRAP);-
4804 }
never executed: end of block
0
4805-
4806 /* Shell functions inherit the RETURN trap if function tracing is on-
4807 globally or on individually for this function. */-
4808#if 0-
4809 if (return_trap && ((trace_p (var) == 0) && function_trace_mode == 0))-
4810#else-
4811 if (return_trap && (signal_in_progress (DEBUG_TRAP) || ((trace_p (var) == 0) && function_trace_mode == 0)))
return_trapDescription
TRUEevaluated 2081 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1638390 times by 1 test
Evaluated by:
  • Self test
signal_in_progress ( 65 )Description
TRUEevaluated 1865 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 216 times by 1 test
Evaluated by:
  • Self test
(((((var)->att...00080))) == 0)Description
TRUEevaluated 216 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
function_trace_mode == 0Description
TRUEevaluated 31 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 185 times by 1 test
Evaluated by:
  • Self test
0-1638390
4812#endif-
4813 {-
4814 if (subshell == 0)
subshell == 0Description
TRUEevaluated 1896 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1896
4815 {-
4816 return_trap = savestring (return_trap);-
4817 add_unwind_protect (xfree, return_trap);-
4818 add_unwind_protect (maybe_set_return_trap, return_trap);-
4819 }
executed 1896 times by 1 test: end of block
Executed by:
  • Self test
1896
4820 restore_default_signal (RETURN_TRAP);-
4821 }
executed 1896 times by 1 test: end of block
Executed by:
  • Self test
1896
4822 -
4823 funcnest++;-
4824#if defined (ARRAY_VARS)-
4825 /* This is quite similar to the code in shell.c and elsewhere. */-
4826 shell_fn = find_function_def (this_shell_function->name);-
4827 sfile = shell_fn ? shell_fn->source_file : "";
shell_fnDescription
TRUEevaluated 1640471 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1640471
4828 array_push ((ARRAY *)funcname_a, this_shell_function->name);-
4829-
4830 array_push ((ARRAY *)bash_source_a, sfile);-
4831 t = itos (executing_line_number ());-
4832 array_push ((ARRAY *)bash_lineno_a, t);-
4833 free (t);-
4834#endif-
4835-
4836#if defined (ARRAY_VARS)-
4837 fa = (struct func_array_state *)xmalloc (sizeof (struct func_array_state));-
4838 fa->source_a = (ARRAY *)bash_source_a;-
4839 fa->source_v = bash_source_v;-
4840 fa->lineno_a = (ARRAY *)bash_lineno_a;-
4841 fa->lineno_v = bash_lineno_v;-
4842 fa->funcname_a = (ARRAY *)funcname_a;-
4843 fa->funcname_v = funcname_v;-
4844 if (subshell == 0)
subshell == 0Description
TRUEevaluated 1640374 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 97 times by 1 test
Evaluated by:
  • Self test
97-1640374
4845 add_unwind_protect (restore_funcarray_state, fa);
executed 1640374 times by 1 test: add_unwind_protect (restore_funcarray_state, fa);
Executed by:
  • Self test
1640374
4846#endif-
4847-
4848 /* The temporary environment for a function is supposed to apply to-
4849 all commands executed within the function body. */-
4850-
4851 /* Initialize BASH_ARGC and BASH_ARGV before we blow away the positional-
4852 parameters */-
4853 if (debugging_mode || shell_compatibility_level <= 44)
debugging_modeDescription
TRUEevaluated 2127 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1638344 times by 1 test
Evaluated by:
  • Self test
shell_compatib...ty_level <= 44Description
TRUEnever evaluated
FALSEevaluated 1638344 times by 1 test
Evaluated by:
  • Self test
0-1638344
4854 init_bash_argv ();
executed 2127 times by 1 test: init_bash_argv ();
Executed by:
  • Self test
2127
4855-
4856 remember_args (words->next, 1);-
4857-
4858 /* Update BASH_ARGV and BASH_ARGC */-
4859 if (debugging_mode)
debugging_modeDescription
TRUEevaluated 2127 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1638344 times by 1 test
Evaluated by:
  • Self test
2127-1638344
4860 {-
4861 push_args (words->next);-
4862 if (subshell == 0)
subshell == 0Description
TRUEevaluated 2127 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2127
4863 add_unwind_protect (pop_args, 0);
executed 2127 times by 1 test: add_unwind_protect (pop_args, 0);
Executed by:
  • Self test
2127
4864 }
executed 2127 times by 1 test: end of block
Executed by:
  • Self test
2127
4865-
4866 /* Number of the line on which the function body starts. */-
4867 line_number = function_line_number = tc->line;-
4868-
4869#if defined (JOB_CONTROL)-
4870 if (subshell)
subshellDescription
TRUEevaluated 97 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1640374 times by 1 test
Evaluated by:
  • Self test
97-1640374
4871 stop_pipeline (async, (COMMAND *)NULL);
executed 97 times by 1 test: stop_pipeline (async, (COMMAND *) ((void *)0) );
Executed by:
  • Self test
97
4872#endif-
4873-
4874 if (shell_compatibility_level > 43)
shell_compatibility_level > 43Description
TRUEevaluated 1640471 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1640471
4875 loop_level = 0;
executed 1640471 times by 1 test: loop_level = 0;
Executed by:
  • Self test
1640471
4876-
4877 fc = tc;-
4878-
4879 from_return_trap = 0;-
4880-
4881 return_catch_flag++;-
4882 return_val = setjmp_nosigs (return_catch);-
4883-
4884 if (return_val)
return_valDescription
TRUEevaluated 2077 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1640471 times by 1 test
Evaluated by:
  • Self test
2077-1640471
4885 {-
4886 result = return_catch_value;-
4887 /* Run the RETURN trap in the function's context. */-
4888 save_current = currently_executing_command;-
4889 if (from_return_trap == 0)
from_return_trap == 0Description
TRUEevaluated 2077 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2077
4890 run_return_trap ();
executed 2077 times by 1 test: run_return_trap ();
Executed by:
  • Self test
2077
4891 currently_executing_command = save_current;-
4892 }
executed 2077 times by 1 test: end of block
Executed by:
  • Self test
2077
4893 else-
4894 {-
4895 /* Run the debug trap here so we can trap at the start of a function's-
4896 execution rather than the execution of the body's first command. */-
4897 showing_function_line = 1;-
4898 save_current = currently_executing_command;-
4899 result = run_debug_trap ();-
4900#if defined (DEBUGGER)-
4901 /* In debugging mode, if the DEBUG trap returns a non-zero status, we-
4902 skip the command. */-
4903 if (debugging_mode == 0 || result == EXECUTION_SUCCESS)
debugging_mode == 0Description
TRUEevaluated 1638344 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2127 times by 1 test
Evaluated by:
  • Self test
result == 0Description
TRUEevaluated 2127 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1638344
4904 {-
4905 showing_function_line = 0;-
4906 currently_executing_command = save_current;-
4907 result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);-
4908-
4909 /* Run the RETURN trap in the function's context */-
4910 save_current = currently_executing_command;-
4911 run_return_trap ();-
4912 currently_executing_command = save_current;-
4913 }
executed 1634141 times by 1 test: end of block
Executed by:
  • Self test
1634141
4914#else-
4915 result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);-
4916-
4917 save_current = currently_executing_command;-
4918 run_return_trap ();-
4919 currently_executing_command = save_current;-
4920#endif-
4921 showing_function_line = 0;-
4922 }
executed 1634141 times by 1 test: end of block
Executed by:
  • Self test
1634141
4923-
4924 /* If we have a local copy of OPTIND, note it in the saved getopts state. */-
4925 gv = find_variable ("OPTIND");-
4926 if (gv && gv->context == variable_context)
gvDescription
TRUEevaluated 1636218 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
gv->context ==...riable_contextDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1636215 times by 1 test
Evaluated by:
  • Self test
0-1636218
4927 gs->gs_flags |= 1;
executed 3 times by 1 test: gs->gs_flags |= 1;
Executed by:
  • Self test
3
4928-
4929 if (subshell == 0)
subshell == 0Description
TRUEevaluated 1636121 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 97 times by 1 test
Evaluated by:
  • Self test
97-1636121
4930 run_unwind_frame ("function_calling");
executed 1636121 times by 1 test: run_unwind_frame ("function_calling");
Executed by:
  • Self test
1636121
4931#if defined (ARRAY_VARS)-
4932 else-
4933 {-
4934 restore_funcarray_state (fa);-
4935 /* Restore BASH_ARGC and BASH_ARGV */-
4936 if (debugging_mode)
debugging_modeDescription
TRUEnever evaluated
FALSEevaluated 97 times by 1 test
Evaluated by:
  • Self test
0-97
4937 pop_args ();
never executed: pop_args ();
0
4938 }
executed 97 times by 1 test: end of block
Executed by:
  • Self test
97
4939#endif-
4940-
4941 if (variable_context == 0 || this_shell_function == 0)
variable_context == 0Description
TRUEevaluated 1623688 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12530 times by 1 test
Evaluated by:
  • Self test
this_shell_function == 0Description
TRUEnever evaluated
FALSEevaluated 12530 times by 1 test
Evaluated by:
  • Self test
0-1623688
4942 {-
4943 make_funcname_visible (0);-
4944#if defined (PROCESS_SUBSTITUTION)-
4945 unlink_fifo_list ();-
4946#endif-
4947 }
executed 1623688 times by 1 test: end of block
Executed by:
  • Self test
1623688
4948-
4949 return (result);
executed 1636218 times by 1 test: return (result);
Executed by:
  • Self test
1636218
4950}-
4951-
4952/* A convenience routine for use by other parts of the shell to execute-
4953 a particular shell function. */-
4954int-
4955execute_shell_function (var, words)-
4956 SHELL_VAR *var;-
4957 WORD_LIST *words;-
4958{-
4959 int ret;-
4960 struct fd_bitmap *bitmap;-
4961-
4962 bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);-
4963 begin_unwind_frame ("execute-shell-function");-
4964 add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);-
4965 -
4966 ret = execute_function (var, words, 0, bitmap, 0, 0);-
4967-
4968 dispose_fd_bitmap (bitmap);-
4969 discard_unwind_frame ("execute-shell-function");-
4970-
4971 return ret;
never executed: return ret;
0
4972}-
4973-
4974/* Execute a shell builtin or function in a subshell environment. This-
4975 routine does not return; it only calls exit(). If BUILTIN is non-null,-
4976 it points to a function to call to execute a shell builtin; otherwise-
4977 VAR points at the body of a function to execute. WORDS is the arguments-
4978 to the command, REDIRECTS specifies redirections to perform before the-
4979 command is executed. */-
4980static void-
4981execute_subshell_builtin_or_function (words, redirects, builtin, var,-
4982 pipe_in, pipe_out, async, fds_to_close,-
4983 flags)-
4984 WORD_LIST *words;-
4985 REDIRECT *redirects;-
4986 sh_builtin_func_t *builtin;-
4987 SHELL_VAR *var;-
4988 int pipe_in, pipe_out, async;-
4989 struct fd_bitmap *fds_to_close;-
4990 int flags;-
4991{-
4992 int result, r, funcvalue;-
4993#if defined (JOB_CONTROL)-
4994 int jobs_hack;-
4995-
4996 jobs_hack = (builtin == jobs_builtin) &&
(builtin == jobs_builtin)Description
TRUEnever evaluated
FALSEevaluated 1121 times by 1 test
Evaluated by:
  • Self test
0-1121
4997 ((subshell_environment & SUBSHELL_ASYNC) == 0 || pipe_out != NO_PIPE);
(subshell_envi...t & 0x01) == 0Description
TRUEnever evaluated
FALSEnever evaluated
pipe_out != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
4998#endif-
4999-
5000 /* A subshell is neither a login shell nor interactive. */-
5001 login_shell = interactive = 0;-
5002 if (builtin == eval_builtin)
builtin == eval_builtinDescription
TRUEnever evaluated
FALSEevaluated 1121 times by 1 test
Evaluated by:
  • Self test
0-1121
5003 evalnest = 0;
never executed: evalnest = 0;
0
5004 else if (builtin == source_builtin)
builtin == source_builtinDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1119 times by 1 test
Evaluated by:
  • Self test
2-1119
5005 sourcenest = 0;
executed 2 times by 1 test: sourcenest = 0;
Executed by:
  • Self test
2
5006-
5007 if (async)
asyncDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1114 times by 1 test
Evaluated by:
  • Self test
7-1114
5008 subshell_environment |= SUBSHELL_ASYNC;
executed 7 times by 1 test: subshell_environment |= 0x01;
Executed by:
  • Self test
7
5009 if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
pipe_in != -1Description
TRUEnever evaluated
FALSEevaluated 1121 times by 1 test
Evaluated by:
  • Self test
pipe_out != -1Description
TRUEnever evaluated
FALSEevaluated 1121 times by 1 test
Evaluated by:
  • Self test
0-1121
5010 subshell_environment |= SUBSHELL_PIPE;
never executed: subshell_environment |= 0x10;
0
5011-
5012 maybe_make_export_env (); /* XXX - is this needed? */-
5013-
5014#if defined (JOB_CONTROL)-
5015 /* Eradicate all traces of job control after we fork the subshell, so-
5016 all jobs begun by this subshell are in the same process group as-
5017 the shell itself. */-
5018-
5019 /* Allow the output of `jobs' to be piped. */-
5020 if (jobs_hack)
jobs_hackDescription
TRUEnever evaluated
FALSEevaluated 1121 times by 1 test
Evaluated by:
  • Self test
0-1121
5021 kill_current_pipeline ();
never executed: kill_current_pipeline ();
0
5022 else-
5023 without_job_control ();
executed 1121 times by 1 test: without_job_control ();
Executed by:
  • Self test
1121
5024-
5025 set_sigchld_handler ();-
5026#else-
5027 without_job_control ();-
5028#endif /* JOB_CONTROL */-
5029-
5030 set_sigint_handler ();-
5031-
5032 if (fds_to_close)
fds_to_closeDescription
TRUEevaluated 1121 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1121
5033 close_fd_bitmap (fds_to_close);
executed 1121 times by 1 test: close_fd_bitmap (fds_to_close);
Executed by:
  • Self test
1121
5034-
5035 do_piping (pipe_in, pipe_out);-
5036-
5037 if (do_redirections (redirects, RX_ACTIVE) != 0)
do_redirection...ts, 0x01) != 0Description
TRUEnever evaluated
FALSEevaluated 1121 times by 1 test
Evaluated by:
  • Self test
0-1121
5038 exit (EXECUTION_FAILURE);
never executed: exit (1);
0
5039-
5040 if (builtin)
builtinDescription
TRUEevaluated 1024 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 97 times by 1 test
Evaluated by:
  • Self test
97-1024
5041 {-
5042 /* Give builtins a place to jump back to on failure,-
5043 so we don't go back up to main(). */-
5044 result = setjmp_nosigs (top_level);-
5045-
5046 /* Give the return builtin a place to jump to when executed in a subshell-
5047 or pipeline */-
5048 funcvalue = 0;-
5049 if (return_catch_flag && builtin == return_builtin)
return_catch_flagDescription
TRUEevaluated 834 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 196 times by 1 test
Evaluated by:
  • Self test
builtin == return_builtinDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 833 times by 1 test
Evaluated by:
  • Self test
1-834
5050 funcvalue = setjmp_nosigs (return_catch);
executed 1 time by 1 test: funcvalue = __sigsetjmp ( (return_catch) , 0 ) ;
Executed by:
  • Self test
1
5051-
5052 if (result == EXITPROG)
result == 3Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1025 times by 1 test
Evaluated by:
  • Self test
6-1025
5053 exit (last_command_exit_value);
executed 6 times by 1 test: exit (last_command_exit_value);
Executed by:
  • Self test
6
5054 else if (result)
resultDescription
TRUEnever evaluated
FALSEevaluated 1025 times by 1 test
Evaluated by:
  • Self test
0-1025
5055 exit (EXECUTION_FAILURE);
never executed: exit (1);
0
5056 else if (funcvalue)
funcvalueDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1024 times by 1 test
Evaluated by:
  • Self test
1-1024
5057 exit (return_catch_value);
executed 1 time by 1 test: exit (return_catch_value);
Executed by:
  • Self test
1
5058 else-
5059 {-
5060 r = execute_builtin (builtin, words, flags, 1);-
5061 fflush (stdout);-
5062 if (r == EX_USAGE)
r == 258Description
TRUEnever evaluated
FALSEevaluated 1017 times by 1 test
Evaluated by:
  • Self test
0-1017
5063 r = EX_BADUSAGE;
never executed: r = 2;
0
5064 /* XXX - experimental */-
5065 else if (r == EX_DISKFALLBACK)
r == 262Description
TRUEnever evaluated
FALSEevaluated 1017 times by 1 test
Evaluated by:
  • Self test
0-1017
5066 {-
5067 char *command_line;-
5068-
5069 command_line = savestring (the_printed_command_except_trap ? the_printed_command_except_trap : "");-
5070 r = execute_disk_command (words, (REDIRECT *)0, command_line,-
5071 -1, -1, async, (struct fd_bitmap *)0, flags|CMD_NO_FORK);-
5072 }
never executed: end of block
0
5073 sh_exit (r);-
5074 }
never executed: end of block
0
5075 }-
5076 else-
5077 {-
5078 r = execute_function (var, words, flags, fds_to_close, async, 1);-
5079 fflush (stdout);-
5080 sh_exit (r);-
5081 }
never executed: end of block
0
5082}-
5083-
5084/* Execute a builtin or function in the current shell context. If BUILTIN-
5085 is non-null, it is the builtin command to execute, otherwise VAR points-
5086 to the body of a function. WORDS are the command's arguments, REDIRECTS-
5087 are the redirections to perform. FDS_TO_CLOSE is the usual bitmap of-
5088 file descriptors to close.-
5089-
5090 If BUILTIN is exec_builtin, the redirections specified in REDIRECTS are-
5091 not undone before this function returns. */-
5092static int-
5093execute_builtin_or_function (words, builtin, var, redirects,-
5094 fds_to_close, flags)-
5095 WORD_LIST *words;-
5096 sh_builtin_func_t *builtin;-
5097 SHELL_VAR *var;-
5098 REDIRECT *redirects;-
5099 struct fd_bitmap *fds_to_close;-
5100 int flags;-
5101{-
5102 int result;-
5103 REDIRECT *saved_undo_list;-
5104#if defined (PROCESS_SUBSTITUTION)-
5105 int ofifo, nfifo, osize;-
5106 char *ofifo_list;-
5107#endif-
5108-
5109#if defined (PROCESS_SUBSTITUTION)-
5110 begin_unwind_frame ("saved_fifos");-
5111 /* If we return, we longjmp and don't get a chance to restore the old-
5112 fifo list, so we add an unwind protect to free it */-
5113 ofifo = num_fifos ();-
5114 ofifo_list = copy_fifo_list (&osize);-
5115 if (ofifo_list)
ofifo_listDescription
TRUEevaluated 1994575 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 32699040 times by 1 test
Evaluated by:
  • Self test
1994575-32699040
5116 add_unwind_protect (xfree, ofifo_list);
executed 1994575 times by 1 test: add_unwind_protect (xfree, ofifo_list);
Executed by:
  • Self test
1994575
5117#endif-
5118-
5119 if (do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
do_redirection...x01|0x02) != 0Description
TRUEevaluated 105 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34693494 times by 1 test
Evaluated by:
  • Self test
105-34693494
5120 {-
5121 undo_partial_redirects ();-
5122 dispose_exec_redirects ();-
5123#if defined (PROCESS_SUBSTITUTION)-
5124 free (ofifo_list);-
5125#endif-
5126 return (EX_REDIRFAIL); /* was EXECUTION_FAILURE */
executed 105 times by 1 test: return (259);
Executed by:
  • Self test
105
5127 }-
5128-
5129 saved_undo_list = redirection_undo_list;-
5130-
5131 /* Calling the "exec" builtin changes redirections forever. */-
5132 if (builtin == exec_builtin)
builtin == exec_builtinDescription
TRUEevaluated 266 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34693228 times by 1 test
Evaluated by:
  • Self test
266-34693228
5133 {-
5134 dispose_redirects (saved_undo_list);-
5135 saved_undo_list = exec_redirection_undo_list;-
5136 exec_redirection_undo_list = (REDIRECT *)NULL;-
5137 }
executed 266 times by 1 test: end of block
Executed by:
  • Self test
266
5138 else-
5139 dispose_exec_redirects ();
executed 34693228 times by 1 test: dispose_exec_redirects ();
Executed by:
  • Self test
34693228
5140-
5141 if (saved_undo_list)
saved_undo_listDescription
TRUEevaluated 5551 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34687943 times by 1 test
Evaluated by:
  • Self test
5551-34687943
5142 {-
5143 begin_unwind_frame ("saved-redirects");-
5144 add_unwind_protect (cleanup_redirects, (char *)saved_undo_list);-
5145 }
executed 5551 times by 1 test: end of block
Executed by:
  • Self test
5551
5146-
5147 redirection_undo_list = (REDIRECT *)NULL;-
5148-
5149 if (builtin)
builtinDescription
TRUEevaluated 33053117 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1640377 times by 1 test
Evaluated by:
  • Self test
1640377-33053117
5150 result = execute_builtin (builtin, words, flags, 0);
executed 33053117 times by 1 test: result = execute_builtin (builtin, words, flags, 0);
Executed by:
  • Self test
33053117
5151 else-
5152 result = execute_function (var, words, flags, fds_to_close, 0, 0);
executed 1640377 times by 1 test: result = execute_function (var, words, flags, fds_to_close, 0, 0);
Executed by:
  • Self test
1640377
5153-
5154 /* We do this before undoing the effects of any redirections. */-
5155 fflush (stdout);-
5156 fpurge (stdout);-
5157 if (ferror (stdout))
ferror ( stdout )Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34687041 times by 1 test
Evaluated by:
  • Self test
1-34687041
5158 clearerr (stdout);
executed 1 time by 1 test: clearerr ( stdout );
Executed by:
  • Self test
1
5159-
5160 /* If we are executing the `command' builtin, but this_shell_builtin is-
5161 set to `exec_builtin', we know that we have something like-
5162 `command exec [redirection]', since otherwise `exec' would have-
5163 overwritten the shell and we wouldn't get here. In this case, we-
5164 want to behave as if the `command' builtin had not been specified-
5165 and preserve the redirections. */-
5166 if (builtin == command_builtin && this_shell_builtin == exec_builtin)
builtin == command_builtinDescription
TRUEevaluated 109 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34686933 times by 1 test
Evaluated by:
  • Self test
this_shell_bui...= exec_builtinDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 107 times by 1 test
Evaluated by:
  • Self test
2-34686933
5167 {-
5168 int discard;-
5169-
5170 discard = 0;-
5171 if (saved_undo_list)
saved_undo_listDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1
5172 {-
5173 dispose_redirects (saved_undo_list);-
5174 discard = 1;-
5175 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
5176 redirection_undo_list = exec_redirection_undo_list;-
5177 saved_undo_list = exec_redirection_undo_list = (REDIRECT *)NULL; -
5178 if (discard)
discardDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1
5179 discard_unwind_frame ("saved-redirects");
executed 1 time by 1 test: discard_unwind_frame ("saved-redirects");
Executed by:
  • Self test
1
5180 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
5181-
5182 if (saved_undo_list)
saved_undo_listDescription
TRUEevaluated 5542 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34681500 times by 1 test
Evaluated by:
  • Self test
5542-34681500
5183 {-
5184 redirection_undo_list = saved_undo_list;-
5185 discard_unwind_frame ("saved-redirects");-
5186 }
executed 5542 times by 1 test: end of block
Executed by:
  • Self test
5542
5187-
5188 undo_partial_redirects ();-
5189-
5190#if defined (PROCESS_SUBSTITUTION)-
5191 /* Close any FIFOs created by this builtin or function. */-
5192 nfifo = num_fifos ();-
5193 if (nfifo > ofifo)
nfifo > ofifoDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34687033 times by 1 test
Evaluated by:
  • Self test
9-34687033
5194 close_new_fifos (ofifo_list, osize);
executed 9 times by 1 test: close_new_fifos (ofifo_list, osize);
Executed by:
  • Self test
9
5195 if (ofifo_list)
ofifo_listDescription
TRUEevaluated 1994565 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 32692477 times by 1 test
Evaluated by:
  • Self test
1994565-32692477
5196 free (ofifo_list);
executed 1994565 times by 1 test: sh_xfree((ofifo_list), "execute_cmd.c", 5196);
Executed by:
  • Self test
1994565
5197 discard_unwind_frame ("saved_fifos");-
5198#endif-
5199-
5200 return (result);
executed 34687042 times by 1 test: return (result);
Executed by:
  • Self test
34687042
5201}-
5202-
5203void-
5204setup_async_signals ()-
5205{-
5206#if defined (__BEOS__)-
5207 set_signal_handler (SIGHUP, SIG_IGN); /* they want csh-like behavior */-
5208#endif-
5209-
5210#if defined (JOB_CONTROL)-
5211 if (job_control == 0)
job_control == 0Description
TRUEevaluated 1409 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-1409
5212#endif-
5213 {-
5214 /* Make sure we get the original signal dispositions now so we don't-
5215 confuse the trap builtin later if the subshell tries to use it to-
5216 reset SIGINT/SIGQUIT. Don't call set_signal_ignored; that sets-
5217 the value of original_signals to SIG_IGN. Posix interpretation 751. */-
5218 get_original_signal (SIGINT);-
5219 set_signal_handler (SIGINT, SIG_IGN);-
5220-
5221 get_original_signal (SIGQUIT);-
5222 set_signal_handler (SIGQUIT, SIG_IGN);-
5223 }
executed 1409 times by 1 test: end of block
Executed by:
  • Self test
1409
5224}
executed 1411 times by 1 test: end of block
Executed by:
  • Self test
1411
5225-
5226/* Execute a simple command that is hopefully defined in a disk file-
5227 somewhere.-
5228-
5229 1) fork ()-
5230 2) connect pipes-
5231 3) look up the command-
5232 4) do redirections-
5233 5) execve ()-
5234 6) If the execve failed, see if the file has executable mode set.-
5235 If so, and it isn't a directory, then execute its contents as-
5236 a shell script.-
5237-
5238 Note that the filename hashing stuff has to take place up here,-
5239 in the parent. This is probably why the Bourne style shells-
5240 don't handle it, since that would require them to go through-
5241 this gnarly hair, for no good reason.-
5242-
5243 NOTE: callers expect this to fork or exit(). */-
5244-
5245/* Name of a shell function to call when a command name is not found. */-
5246#ifndef NOTFOUND_HOOK-
5247# define NOTFOUND_HOOK "command_not_found_handle"-
5248#endif-
5249-
5250static int-
5251execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,-
5252 async, fds_to_close, cmdflags)-
5253 WORD_LIST *words;-
5254 REDIRECT *redirects;-
5255 char *command_line;-
5256 int pipe_in, pipe_out, async;-
5257 struct fd_bitmap *fds_to_close;-
5258 int cmdflags;-
5259{-
5260 char *pathname, *command, **args, *p;-
5261 int nofork, stdpath, result;-
5262 pid_t pid;-
5263 SHELL_VAR *hookf;-
5264 WORD_LIST *wl;-
5265-
5266 stdpath = (cmdflags & CMD_STDPATH); /* use command -p path */-
5267 nofork = (cmdflags & CMD_NO_FORK); /* Don't fork, just exec, if no pipes */-
5268 pathname = words->word->word;-
5269-
5270 p = 0;-
5271 result = EXECUTION_SUCCESS;-
5272#if defined (RESTRICTED_SHELL)-
5273 command = (char *)NULL;-
5274 if (restricted && mbschr (pathname, '/'))
restrictedDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 27806 times by 1 test
Evaluated by:
  • Self test
mbschr (pathname, '/')Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-27806
5275 {-
5276 internal_error (_("%s: restricted: cannot specify `/' in command names"),-
5277 pathname);-
5278 result = last_command_exit_value = EXECUTION_FAILURE;-
5279-
5280 /* If we're not going to fork below, we must already be in a child-
5281 process or a context in which it's safe to call exit(2). */-
5282 if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
noforkDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
pipe_in == -1Description
TRUEnever evaluated
FALSEnever evaluated
pipe_out == -1Description
TRUEnever evaluated
FALSEnever evaluated
0-1
5283 exit (last_command_exit_value);
never executed: exit (last_command_exit_value);
0
5284 else-
5285 goto parent_return;
executed 1 time by 1 test: goto parent_return;
Executed by:
  • Self test
1
5286 }-
5287#endif /* RESTRICTED_SHELL */-
5288-
5289 command = search_for_command (pathname, CMDSRCH_HASH|(stdpath ? CMDSRCH_STDPATH : 0));-
5290 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 27807 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 27807 times by 1 test
Evaluated by:
  • Self test
0-27807
5291-
5292 if (command)
commandDescription
TRUEevaluated 27754 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 53 times by 1 test
Evaluated by:
  • Self test
53-27754
5293 {-
5294 /* If we're optimizing out the fork (implicit `exec'), decrement the-
5295 shell level like `exec' would do. */-
5296 if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
noforkDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 27753 times by 1 test
Evaluated by:
  • Self test
pipe_in == -1Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
pipe_out == -1Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-27753
5297 adjust_shell_level (-1);
executed 1 time by 1 test: adjust_shell_level (-1);
Executed by:
  • Self test
1
5298-
5299 maybe_make_export_env ();-
5300 put_command_name_into_env (command);-
5301 }
executed 27754 times by 1 test: end of block
Executed by:
  • Self test
27754
5302-
5303 /* We have to make the child before we check for the non-existence-
5304 of COMMAND, since we want the error messages to be redirected. */-
5305 /* If we can get away without forking and there are no pipes to deal with,-
5306 don't bother to fork, just directly exec the command. */-
5307 if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
noforkDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 27797 times by 1 test
Evaluated by:
  • Self test
pipe_in == -1Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
pipe_out == -1Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-27797
5308 pid = 0;
executed 10 times by 1 test: pid = 0;
Executed by:
  • Self test
10
5309 else-
5310 pid = make_child (p = savestring (command_line), async);
executed 27797 times by 1 test: pid = make_child (p = (char *)strcpy (sh_xmalloc((1 + strlen (command_line)), "execute_cmd.c", 5310), (command_line)), async);
Executed by:
  • Self test
27797
5311-
5312 if (pid == 0)
pid == 0Description
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 27756 times by 1 test
Evaluated by:
  • Self test
51-27756
5313 {-
5314 int old_interactive;-
5315-
5316 reset_terminating_signals (); /* XXX */-
5317 /* Cancel traps, in trap.c. */-
5318 restore_original_signals ();-
5319-
5320 CHECK_SIGTERM;
never executed: termsig_handler ( 15 );
sigterm_receivedDescription
TRUEnever evaluated
FALSEevaluated 51 times by 1 test
Evaluated by:
  • Self test
0-51
5321-
5322#if defined (JOB_CONTROL)-
5323 FREE (p);
executed 41 times by 1 test: sh_xfree((p), "execute_cmd.c", 5323);
Executed by:
  • Self test
pDescription
TRUEevaluated 41 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
10-41
5324#endif-
5325-
5326 /* restore_original_signals may have undone the work done-
5327 by make_child to ensure that SIGINT and SIGQUIT are ignored-
5328 in asynchronous children. */-
5329 if (async)
asyncDescription
TRUEnever evaluated
FALSEevaluated 51 times by 1 test
Evaluated by:
  • Self test
0-51
5330 {-
5331 if ((cmdflags & CMD_STDIN_REDIR) &&
(cmdflags & 0x400)Description
TRUEnever evaluated
FALSEnever evaluated
0
5332 pipe_in == NO_PIPE &&
pipe_in == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
5333 (stdin_redirects (redirects) == 0))
(stdin_redirec...directs) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
5334 async_redirect_stdin ();
never executed: async_redirect_stdin ();
0
5335 setup_async_signals ();-
5336 }
never executed: end of block
0
5337-
5338 /* This functionality is now provided by close-on-exec of the-
5339 file descriptors manipulated by redirection and piping.-
5340 Some file descriptors still need to be closed in all children-
5341 because of the way bash does pipes; fds_to_close is a-
5342 bitmap of all such file descriptors. */-
5343 if (fds_to_close)
fds_to_closeDescription
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-51
5344 close_fd_bitmap (fds_to_close);
executed 51 times by 1 test: close_fd_bitmap (fds_to_close);
Executed by:
  • Self test
51
5345-
5346 do_piping (pipe_in, pipe_out);-
5347-
5348 old_interactive = interactive;-
5349 if (async)
asyncDescription
TRUEnever evaluated
FALSEevaluated 51 times by 1 test
Evaluated by:
  • Self test
0-51
5350 interactive = 0;
never executed: interactive = 0;
0
5351-
5352 subshell_environment |= SUBSHELL_FORK; /* XXX - was just = */-
5353-
5354 if (redirects && (do_redirections (redirects, RX_ACTIVE) != 0))
redirectsDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 36 times by 1 test
Evaluated by:
  • Self test
(do_redirectio...s, 0x01) != 0)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
3-36
5355 {-
5356#if defined (PROCESS_SUBSTITUTION)-
5357 /* Try to remove named pipes that may have been created as the-
5358 result of redirections. */-
5359 unlink_fifo_list ();-
5360#endif /* PROCESS_SUBSTITUTION */-
5361 exit (EXECUTION_FAILURE);
executed 8 times by 1 test: exit (1);
Executed by:
  • Self test
8
5362 }-
5363-
5364 if (async)
asyncDescription
TRUEnever evaluated
FALSEevaluated 39 times by 1 test
Evaluated by:
  • Self test
0-39
5365 interactive = old_interactive;
never executed: interactive = old_interactive;
0
5366-
5367 if (command == 0)
command == 0Description
TRUEevaluated 21 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
18-21
5368 {-
5369 hookf = find_function (NOTFOUND_HOOK);-
5370 if (hookf == 0)
hookf == 0Description
TRUEevaluated 21 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-21
5371 {-
5372 /* Make sure filenames are displayed using printable characters */-
5373 pathname = printable_filename (pathname, 0);-
5374 internal_error (_("%s: command not found"), pathname);-
5375 exit (EX_NOTFOUND); /* Posix.2 says the exit status is 127 */
executed 21 times by 1 test: exit (127);
Executed by:
  • Self test
21
5376 }-
5377-
5378#if defined (JOB_CONTROL)-
5379 /* May need to reinitialize more of the job control state here. */-
5380 kill_current_pipeline ();-
5381#endif-
5382-
5383 wl = make_word_list (make_word (NOTFOUND_HOOK), words);-
5384 exit (execute_shell_function (hookf, wl));
never executed: exit (execute_shell_function (hookf, wl));
0
5385 }-
5386-
5387 CHECK_SIGTERM;
never executed: termsig_handler ( 15 );
sigterm_receivedDescription
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-18
5388-
5389 /* Execve expects the command name to be in args[0]. So we-
5390 leave it there, in the same format that the user used to-
5391 type it in. */-
5392 args = strvec_from_word_list (words, 0, 0, (int *)NULL);-
5393 exit (shell_execve (command, args, export_env));
executed 18 times by 1 test: exit (shell_execve (command, args, export_env));
Executed by:
  • Self test
18
5394 }-
5395 else-
5396 {-
5397parent_return:-
5398 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 27757 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 27757 times by 1 test
Evaluated by:
  • Self test
0-27757
5399-
5400 /* Make sure that the pipes are closed in the parent. */-
5401 close_pipes (pipe_in, pipe_out);-
5402#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)-
5403#if 0-
5404 if (variable_context == 0)-
5405 unlink_fifo_list ();-
5406#endif-
5407#endif-
5408 FREE (command);
executed 27724 times by 1 test: sh_xfree((command), "execute_cmd.c", 5408);
Executed by:
  • Self test
commandDescription
TRUEevaluated 27724 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 33 times by 1 test
Evaluated by:
  • Self test
33-27724
5409 return (result);
executed 27757 times by 1 test: return (result);
Executed by:
  • Self test
27757
5410 }-
5411}-
5412-
5413/* CPP defines to decide whether a particular index into the #! line-
5414 corresponds to a valid interpreter name or argument character, or-
5415 whitespace. The MSDOS define is to allow \r to be treated the same-
5416 as \n. */-
5417-
5418#if !defined (MSDOS)-
5419# define STRINGCHAR(ind) \-
5420 (ind < sample_len && !whitespace (sample[ind]) && sample[ind] != '\n')-
5421# define WHITECHAR(ind) \-
5422 (ind < sample_len && whitespace (sample[ind]))-
5423#else /* MSDOS */-
5424# define STRINGCHAR(ind) \-
5425 (ind < sample_len && !whitespace (sample[ind]) && sample[ind] != '\n' && sample[ind] != '\r')-
5426# define WHITECHAR(ind) \-
5427 (ind < sample_len && whitespace (sample[ind]))-
5428#endif /* MSDOS */-
5429-
5430static char *-
5431getinterp (sample, sample_len, endp)-
5432 char *sample;-
5433 int sample_len, *endp;-
5434{-
5435 register int i;-
5436 char *execname;-
5437 int start;-
5438-
5439 /* Find the name of the interpreter to exec. */-
5440 for (i = 2; i < sample_len && whitespace (sample[i]); i++)
i < sample_lenDescription
TRUEnever evaluated
FALSEnever evaluated
((sample[i]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((sample[i]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
5441 ;
never executed: ;
0
5442-
5443 for (start = i; STRINGCHAR(i); i++)
i < sample_lenDescription
TRUEnever evaluated
FALSEnever evaluated
((sample[i]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((sample[i]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
sample[i] != '\n'Description
TRUEnever evaluated
FALSEnever evaluated
0
5444 ;
never executed: ;
0
5445-
5446 execname = substring (sample, start, i);-
5447-
5448 if (endp)
endpDescription
TRUEnever evaluated
FALSEnever evaluated
0
5449 *endp = i;
never executed: *endp = i;
0
5450 return execname;
never executed: return execname;
0
5451}-
5452-
5453#if !defined (HAVE_HASH_BANG_EXEC)-
5454/* If the operating system on which we're running does not handle-
5455 the #! executable format, then help out. SAMPLE is the text read-
5456 from the file, SAMPLE_LEN characters. COMMAND is the name of-
5457 the script; it and ARGS, the arguments given by the user, will-
5458 become arguments to the specified interpreter. ENV is the environment-
5459 to pass to the interpreter.-
5460-
5461 The word immediately following the #! is the interpreter to execute.-
5462 A single argument to the interpreter is allowed. */-
5463-
5464static int-
5465execute_shell_script (sample, sample_len, command, args, env)-
5466 char *sample;-
5467 int sample_len;-
5468 char *command;-
5469 char **args, **env;-
5470{-
5471 char *execname, *firstarg;-
5472 int i, start, size_increment, larry;-
5473-
5474 /* Find the name of the interpreter to exec. */-
5475 execname = getinterp (sample, sample_len, &i);-
5476 size_increment = 1;-
5477-
5478 /* Now the argument, if any. */-
5479 for (firstarg = (char *)NULL, start = i; WHITECHAR(i); i++)-
5480 ;-
5481-
5482 /* If there is more text on the line, then it is an argument for the-
5483 interpreter. */-
5484-
5485 if (STRINGCHAR(i)) -
5486 {-
5487 for (start = i; STRINGCHAR(i); i++)-
5488 ;-
5489 firstarg = substring ((char *)sample, start, i);-
5490 size_increment = 2;-
5491 }-
5492-
5493 larry = strvec_len (args) + size_increment;-
5494 args = strvec_resize (args, larry + 1);-
5495-
5496 for (i = larry - 1; i; i--)-
5497 args[i] = args[i - size_increment];-
5498-
5499 args[0] = execname;-
5500 if (firstarg)-
5501 {-
5502 args[1] = firstarg;-
5503 args[2] = command;-
5504 }-
5505 else-
5506 args[1] = command;-
5507-
5508 args[larry] = (char *)NULL;-
5509-
5510 return (shell_execve (execname, args, env));-
5511}-
5512#undef STRINGCHAR-
5513#undef WHITECHAR-
5514-
5515#endif /* !HAVE_HASH_BANG_EXEC */-
5516-
5517static void-
5518initialize_subshell ()-
5519{-
5520#if defined (ALIAS)-
5521 /* Forget about any aliases that we knew of. We are in a subshell. */-
5522 delete_all_aliases ();-
5523#endif /* ALIAS */-
5524-
5525#if defined (HISTORY)-
5526 /* Forget about the history lines we have read. This is a non-interactive-
5527 subshell. */-
5528 history_lines_this_session = 0;-
5529#endif-
5530-
5531 /* Forget about the way job control was working. We are in a subshell. */-
5532 without_job_control ();-
5533-
5534#if defined (JOB_CONTROL)-
5535 set_sigchld_handler ();-
5536 init_job_stats ();-
5537#endif /* JOB_CONTROL */-
5538-
5539 /* Reset the values of the shell flags and options. */-
5540 reset_shell_flags ();-
5541 reset_shell_options ();-
5542 reset_shopt_options ();-
5543-
5544 /* Zero out builtin_env, since this could be a shell script run from a-
5545 sourced file with a temporary environment supplied to the `source/.'-
5546 builtin. Such variables are not supposed to be exported (empirical-
5547 testing with sh and ksh). Just throw it away; don't worry about a-
5548 memory leak. */-
5549 if (vc_isbltnenv (shell_variables))
(((shell_varia... & 0x08) != 0)Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
0-15
5550 shell_variables = shell_variables->down;
never executed: shell_variables = shell_variables->down;
0
5551-
5552 clear_unwind_protect_list (0);-
5553 /* XXX -- are there other things we should be resetting here? */-
5554 parse_and_execute_level = 0; /* nothing left to restore it */-
5555-
5556 /* We're no longer inside a shell function. */-
5557 variable_context = return_catch_flag = funcnest = evalnest = sourcenest = 0;-
5558-
5559 executing_list = 0; /* XXX */-
5560-
5561 /* If we're not interactive, close the file descriptor from which we're-
5562 reading the current shell script. */-
5563 if (interactive_shell == 0)
interactive_shell == 0Description
TRUEevaluated 15 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-15
5564 unset_bash_input (0);
executed 15 times by 1 test: unset_bash_input (0);
Executed by:
  • Self test
15
5565}
executed 15 times by 1 test: end of block
Executed by:
  • Self test
15
5566-
5567#if defined (HAVE_SETOSTYPE) && defined (_POSIX_SOURCE)-
5568# define SETOSTYPE(x) __setostype(x)-
5569#else-
5570# define SETOSTYPE(x)-
5571#endif-
5572-
5573#define HASH_BANG_BUFSIZ 128-
5574-
5575#define READ_SAMPLE_BUF(file, buf, len) \-
5576 do \-
5577 { \-
5578 fd = open(file, O_RDONLY); \-
5579 if (fd >= 0) \-
5580 { \-
5581 len = read (fd, buf, HASH_BANG_BUFSIZ); \-
5582 close (fd); \-
5583 } \-
5584 else \-
5585 len = -1; \-
5586 } \-
5587 while (0)-
5588 -
5589/* Call execve (), handling interpreting shell scripts, and handling-
5590 exec failures. */-
5591int-
5592shell_execve (command, args, env)-
5593 char *command;-
5594 char **args, **env;-
5595{-
5596 int larray, i, fd;-
5597 char sample[HASH_BANG_BUFSIZ];-
5598 int sample_len;-
5599-
5600 SETOSTYPE (0); /* Some systems use for USG/POSIX semantics */-
5601 execve (command, args, env);-
5602 i = errno; /* error from execve() */-
5603 CHECK_TERMSIG;
never executed: termsig_handler (terminating_signal);
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 20 times by 1 test
Evaluated by:
  • Self test
0-20
5604 SETOSTYPE (1);-
5605-
5606 /* If we get to this point, then start checking out the file.-
5607 Maybe it is something we can hack ourselves. */-
5608 if (i != ENOEXEC)
i != 8Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
5-15
5609 {-
5610 /* make sure this is set correctly for file_error/report_error */-
5611 last_command_exit_value = (i == ENOENT) ? EX_NOTFOUND : EX_NOEXEC; /* XXX Posix.2 says that exit status is 126 */
(i == 2 )Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-4
5612 if (file_isdir (command))
file_isdir (command)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
1-4
5613#if defined (EISDIR)-
5614 internal_error (_("%s: %s"), command, strerror (EISDIR));
executed 1 time by 1 test: internal_error ( dcgettext (((void *)0), "%s: %s" , 5) , command, strerror ( 21 ));
Executed by:
  • Self test
1
5615#else-
5616 internal_error (_("%s: is a directory"), command);-
5617#endif-
5618 else if (executable_file (command) == 0)
executable_file (command) == 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-4
5619 {-
5620 errno = i;-
5621 file_error (command);-
5622 }
executed 4 times by 1 test: end of block
Executed by:
  • Self test
4
5623 /* errors not involving the path argument to execve. */-
5624 else if (i == E2BIG || i == ENOMEM)
i == 7Description
TRUEnever evaluated
FALSEnever evaluated
i == 12Description
TRUEnever evaluated
FALSEnever evaluated
0
5625 {-
5626 errno = i;-
5627 file_error (command);-
5628 }
never executed: end of block
0
5629 else-
5630 {-
5631 /* The file has the execute bits set, but the kernel refuses to-
5632 run it for some reason. See why. */-
5633#if defined (HAVE_HASH_BANG_EXEC)-
5634 READ_SAMPLE_BUF (command, sample, sample_len);
never executed: end of block
never executed: sample_len = -1;
fd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
5635 if (sample_len > 0)
sample_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
5636 sample[sample_len - 1] = '\0';
never executed: sample[sample_len - 1] = '\0';
0
5637 if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
sample_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
sample[0] == '#'Description
TRUEnever evaluated
FALSEnever evaluated
sample[1] == '!'Description
TRUEnever evaluated
FALSEnever evaluated
0
5638 {-
5639 char *interp;-
5640 int ilen;-
5641-
5642 interp = getinterp (sample, sample_len, (int *)NULL);-
5643 ilen = strlen (interp);-
5644 errno = i;-
5645 if (interp[ilen - 1] == '\r')
interp[ilen - 1] == '\r'Description
TRUEnever evaluated
FALSEnever evaluated
0
5646 {-
5647 interp = xrealloc (interp, ilen + 2);-
5648 interp[ilen - 1] = '^';-
5649 interp[ilen] = 'M';-
5650 interp[ilen + 1] = '\0';-
5651 }
never executed: end of block
0
5652 sys_error (_("%s: %s: bad interpreter"), command, interp ? interp : "");-
5653 FREE (interp);
never executed: sh_xfree((interp), "execute_cmd.c", 5653);
interpDescription
TRUEnever evaluated
FALSEnever evaluated
0
5654 return (EX_NOEXEC);
never executed: return (126);
0
5655 }-
5656#endif-
5657 errno = i;-
5658 file_error (command);-
5659 }
never executed: end of block
0
5660 return (last_command_exit_value);
executed 5 times by 1 test: return (last_command_exit_value);
Executed by:
  • Self test
5
5661 }-
5662-
5663 /* This file is executable.-
5664 If it begins with #!, then help out people with losing operating-
5665 systems. Otherwise, check to see if it is a binary file by seeing-
5666 if the contents of the first line (or up to 80 characters) are in the-
5667 ASCII set. If it's a text file, execute the contents as shell commands,-
5668 otherwise return 126 (EX_BINARY_FILE). */-
5669 READ_SAMPLE_BUF (command, sample, sample_len);
executed 15 times by 1 test: end of block
Executed by:
  • Self test
never executed: sample_len = -1;
fd >= 0Description
TRUEevaluated 15 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-15
5670-
5671 if (sample_len == 0)
sample_len == 0Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
0-15
5672 return (EXECUTION_SUCCESS);
never executed: return (0);
0
5673-
5674 /* Is this supposed to be an executable script?-
5675 If so, the format of the line is "#! interpreter [argument]".-
5676 A single argument is allowed. The BSD kernel restricts-
5677 the length of the entire line to 32 characters (32 bytes-
5678 being the size of the BSD exec header), but we allow 80-
5679 characters. */-
5680 if (sample_len > 0)
sample_len > 0Description
TRUEevaluated 15 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-15
5681 {-
5682#if !defined (HAVE_HASH_BANG_EXEC)-
5683 if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')-
5684 return (execute_shell_script (sample, sample_len, command, args, env));-
5685 else-
5686#endif-
5687 if (check_binary_file (sample, sample_len))
check_binary_f...e, sample_len)Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
0-15
5688 {-
5689 internal_error (_("%s: cannot execute binary file: %s"), command, strerror (i));-
5690 errno = i;-
5691 return (EX_BINARY_FILE);
never executed: return (126);
0
5692 }-
5693 }
executed 15 times by 1 test: end of block
Executed by:
  • Self test
15
5694-
5695 /* We have committed to attempting to execute the contents of this file-
5696 as shell commands. */-
5697-
5698 reset_parser ();-
5699 initialize_subshell ();-
5700-
5701 set_sigint_handler ();-
5702-
5703 /* Insert the name of this shell into the argument list. */-
5704 larray = strvec_len (args) + 1;-
5705 args = strvec_resize (args, larray + 1);-
5706-
5707 for (i = larray - 1; i; i--)
iDescription
TRUEevaluated 28 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
15-28
5708 args[i] = args[i - 1];
executed 28 times by 1 test: args[i] = args[i - 1];
Executed by:
  • Self test
28
5709-
5710 args[0] = shell_name;-
5711 args[1] = command;-
5712 args[larray] = (char *)NULL;-
5713-
5714 if (args[0][0] == '-')
args[0][0] == '-'Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
0-15
5715 args[0]++;
never executed: args[0]++;
0
5716-
5717#if defined (RESTRICTED_SHELL)-
5718 if (restricted)
restrictedDescription
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
0-15
5719 change_flag ('r', FLAG_OFF);
never executed: change_flag ('r', '+');
0
5720#endif-
5721-
5722 if (subshell_argv)
subshell_argvDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 14 times by 1 test
Evaluated by:
  • Self test
1-14
5723 {-
5724 /* Can't free subshell_argv[0]; that is shell_name. */-
5725 for (i = 1; i < subshell_argc; i++)
i < subshell_argcDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1
5726 free (subshell_argv[i]);
executed 1 time by 1 test: sh_xfree((subshell_argv[i]), "execute_cmd.c", 5726);
Executed by:
  • Self test
1
5727 free (subshell_argv);-
5728 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
5729-
5730 dispose_command (currently_executing_command); /* XXX */-
5731 currently_executing_command = (COMMAND *)NULL;-
5732-
5733 subshell_argc = larray;-
5734 subshell_argv = args;-
5735 subshell_envp = env;-
5736-
5737 unbind_args (); /* remove the positional parameters */-
5738-
5739#if defined (PROCESS_SUBSTITUTION)-
5740 clear_fifo_list (); /* pipe fds are what they are now */-
5741#endif-
5742-
5743 sh_longjmp (subshell_top_level, 1);-
5744 /*NOTREACHED*/-
5745}
never executed: end of block
0
5746-
5747static int-
5748execute_intern_function (name, funcdef)-
5749 WORD_DESC *name;-
5750 FUNCTION_DEF *funcdef;-
5751{-
5752 SHELL_VAR *var;-
5753 char *t;-
5754-
5755 if (check_identifier (name, posixly_correct) == 0)
check_identifi..._correct) == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11159 times by 1 test
Evaluated by:
  • Self test
1-11159
5756 {-
5757 if (posixly_correct && interactive_shell == 0)
posixly_correctDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
interactive_shell == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1
5758 {-
5759 last_command_exit_value = EX_BADUSAGE;-
5760 jump_to_top_level (ERREXIT);-
5761 }
never executed: end of block
0
5762 return (EXECUTION_FAILURE);
never executed: return (1);
0
5763 }-
5764-
5765 if (strchr (name->word, CTLESC)) /* WHY? */
(__extension__...d , '\001' )))Description
TRUEnever evaluated
FALSEevaluated 11159 times by 1 test
Evaluated by:
  • Self test
__builtin_cons...t_p ( '\001' )Description
TRUEevaluated 11159 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
!__builtin_con...( name->word )Description
TRUEevaluated 11159 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
( '\001' ) == '\0'Description
TRUEnever evaluated
FALSEevaluated 11159 times by 1 test
Evaluated by:
  • Self test
0-11159
5766 {-
5767 t = dequote_escapes (name->word);-
5768 free (name->word);-
5769 name->word = t;-
5770 }
never executed: end of block
0
5771-
5772 /* Posix interpretation 383 */-
5773 if (posixly_correct && find_special_builtin (name->word))
posixly_correctDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11156 times by 1 test
Evaluated by:
  • Self test
find_special_b...n (name->word)Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-11156
5774 {-
5775 internal_error (_("`%s': is a special builtin"), name->word);-
5776 last_command_exit_value = EX_BADUSAGE;-
5777 jump_to_top_level (interactive_shell ? DISCARD : ERREXIT);-
5778 }
never executed: end of block
0
5779-
5780 var = find_function (name->word);-
5781 if (var && (readonly_p (var) || noassign_p (var)))
varDescription
TRUEevaluated 1185 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9974 times by 1 test
Evaluated by:
  • Self test
((((var)->attr... (0x0000002)))Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1180 times by 1 test
Evaluated by:
  • Self test
((((var)->attr... (0x0004000)))Description
TRUEnever evaluated
FALSEevaluated 1180 times by 1 test
Evaluated by:
  • Self test
0-9974
5782 {-
5783 if (readonly_p (var))
((((var)->attr... (0x0000002)))Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5
5784 internal_error (_("%s: readonly function"), var->name);
executed 5 times by 1 test: internal_error ( dcgettext (((void *)0), "%s: readonly function" , 5) , var->name);
Executed by:
  • Self test
5
5785 return (EXECUTION_FAILURE);
executed 5 times by 1 test: return (1);
Executed by:
  • Self test
5
5786 }-
5787-
5788#if defined (DEBUGGER)-
5789 bind_function_def (name->word, funcdef, 1);-
5790#endif-
5791-
5792 bind_function (name->word, funcdef->command);-
5793 return (EXECUTION_SUCCESS);
executed 11154 times by 1 test: return (0);
Executed by:
  • Self test
11154
5794}-
5795-
5796#if defined (INCLUDE_UNUSED)-
5797#if defined (PROCESS_SUBSTITUTION)-
5798void-
5799close_all_files ()-
5800{-
5801 register int i, fd_table_size;-
5802-
5803 fd_table_size = getdtablesize ();-
5804 if (fd_table_size > 256) /* clamp to a reasonable value */-
5805 fd_table_size = 256;-
5806-
5807 for (i = 3; i < fd_table_size; i++)-
5808 close (i);-
5809}-
5810#endif /* PROCESS_SUBSTITUTION */-
5811#endif-
5812-
5813static void-
5814close_pipes (in, out)-
5815 int in, out;-
5816{-
5817 if (in >= 0)
in >= 0Description
TRUEevaluated 12274 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 43729 times by 1 test
Evaluated by:
  • Self test
12274-43729
5818 close (in);
executed 12274 times by 1 test: close (in);
Executed by:
  • Self test
12274
5819 if (out >= 0)
out >= 0Description
TRUEevaluated 13369 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 42634 times by 1 test
Evaluated by:
  • Self test
13369-42634
5820 close (out);
executed 13369 times by 1 test: close (out);
Executed by:
  • Self test
13369
5821}
executed 56003 times by 1 test: end of block
Executed by:
  • Self test
56003
5822-
5823static void-
5824dup_error (oldd, newd)-
5825 int oldd, newd;-
5826{-
5827 sys_error (_("cannot duplicate fd %d to fd %d"), oldd, newd);-
5828}
never executed: end of block
0
5829-
5830/* Redirect input and output to be from and to the specified pipes.-
5831 NO_PIPE and REDIRECT_BOTH are handled correctly. */-
5832static void-
5833do_piping (pipe_in, pipe_out)-
5834 int pipe_in, pipe_out;-
5835{-
5836 if (pipe_in != NO_PIPE)
pipe_in != -1Description
TRUEevaluated 1103 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2478 times by 1 test
Evaluated by:
  • Self test
1103-2478
5837 {-
5838 if (dup2 (pipe_in, 0) < 0)
dup2 (pipe_in, 0) < 0Description
TRUEnever evaluated
FALSEevaluated 1103 times by 1 test
Evaluated by:
  • Self test
0-1103
5839 dup_error (pipe_in, 0);
never executed: dup_error (pipe_in, 0);
0
5840 if (pipe_in > 0)
pipe_in > 0Description
TRUEevaluated 1103 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1103
5841 close (pipe_in);
executed 1103 times by 1 test: close (pipe_in);
Executed by:
  • Self test
1103
5842#ifdef __CYGWIN__-
5843 /* Let stdio know the fd may have changed from text to binary mode. */-
5844 freopen (NULL, "r", stdin);-
5845#endif /* __CYGWIN__ */-
5846 }
executed 1103 times by 1 test: end of block
Executed by:
  • Self test
1103
5847 if (pipe_out != NO_PIPE)
pipe_out != -1Description
TRUEevaluated 1034 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2547 times by 1 test
Evaluated by:
  • Self test
1034-2547
5848 {-
5849 if (pipe_out != REDIRECT_BOTH)
pipe_out != -2Description
TRUEevaluated 1034 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1034
5850 {-
5851 if (dup2 (pipe_out, 1) < 0)
dup2 (pipe_out, 1) < 0Description
TRUEnever evaluated
FALSEevaluated 1034 times by 1 test
Evaluated by:
  • Self test
0-1034
5852 dup_error (pipe_out, 1);
never executed: dup_error (pipe_out, 1);
0
5853 if (pipe_out == 0 || pipe_out > 1)
pipe_out == 0Description
TRUEnever evaluated
FALSEevaluated 1034 times by 1 test
Evaluated by:
  • Self test
pipe_out > 1Description
TRUEevaluated 1034 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1034
5854 close (pipe_out);
executed 1034 times by 1 test: close (pipe_out);
Executed by:
  • Self test
1034
5855 }
executed 1034 times by 1 test: end of block
Executed by:
  • Self test
1034
5856 else-
5857 {-
5858 if (dup2 (1, 2) < 0)
dup2 (1, 2) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
5859 dup_error (1, 2);
never executed: dup_error (1, 2);
0
5860 }
never executed: end of block
0
5861#ifdef __CYGWIN__-
5862 /* Let stdio know the fd may have changed from text to binary mode, and-
5863 make sure to preserve stdout line buffering. */-
5864 freopen (NULL, "w", stdout);-
5865 sh_setlinebuf (stdout);-
5866#endif /* __CYGWIN__ */-
5867 }-
5868}
executed 3581 times by 1 test: end of block
Executed by:
  • Self test
3581
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2