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