Bash-4.3 distribution sources and documentation
[platform/upstream/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 }