No specific user configuration
[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       /* If wait_for removes the job from the jobs table, use result of last
2413          command as pipeline's exit status as usual.  The jobs list can get
2414          frozen and unfrozen at inconvenient times if there are multiple pipelines
2415          running simultaneously. */
2416       if (INVALID_JOB (lastpipe_jid) == 0)
2417         exec_result = job_exit_status (lastpipe_jid);
2418       else if (pipefail_opt)
2419         exec_result = exec_result | lstdin;     /* XXX */
2420       /* otherwise we use exec_result */
2421         
2422 #endif
2423       unfreeze_jobs_list ();
2424     }
2425
2426   discard_unwind_frame ("lastpipe-exec");
2427
2428   return (exec_result);
2429 }
2430
2431 static int
2432 execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
2433      COMMAND *command;
2434      int asynchronous, pipe_in, pipe_out;
2435      struct fd_bitmap *fds_to_close;
2436 {
2437   COMMAND *tc, *second;
2438   int ignore_return, exec_result, was_error_trap, invert;
2439   volatile int save_line_number;
2440
2441   ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
2442
2443   switch (command->value.Connection->connector)
2444     {
2445     /* Do the first command asynchronously. */
2446     case '&':
2447       tc = command->value.Connection->first;
2448       if (tc == 0)
2449         return (EXECUTION_SUCCESS);
2450
2451       if (ignore_return)
2452         tc->flags |= CMD_IGNORE_RETURN;
2453       tc->flags |= CMD_AMPERSAND;
2454
2455       /* If this shell was compiled without job control support,
2456          if we are currently in a subshell via `( xxx )', or if job
2457          control is not active then the standard input for an
2458          asynchronous command is forced to /dev/null. */
2459 #if defined (JOB_CONTROL)
2460       if ((subshell_environment || !job_control) && !stdin_redir)
2461 #else
2462       if (!stdin_redir)
2463 #endif /* JOB_CONTROL */
2464         tc->flags |= CMD_STDIN_REDIR;
2465
2466       exec_result = execute_command_internal (tc, 1, pipe_in, pipe_out, fds_to_close);
2467       QUIT;
2468
2469       if (tc->flags & CMD_STDIN_REDIR)
2470         tc->flags &= ~CMD_STDIN_REDIR;
2471
2472       second = command->value.Connection->second;
2473       if (second)
2474         {
2475           if (ignore_return)
2476             second->flags |= CMD_IGNORE_RETURN;
2477
2478           exec_result = execute_command_internal (second, asynchronous, pipe_in, pipe_out, fds_to_close);
2479         }
2480
2481       break;
2482
2483     /* Just call execute command on both sides. */
2484     case ';':
2485       if (ignore_return)
2486         {
2487           if (command->value.Connection->first)
2488             command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
2489           if (command->value.Connection->second)
2490             command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
2491         }
2492       executing_list++;
2493       QUIT;
2494       execute_command (command->value.Connection->first);
2495       QUIT;
2496       exec_result = execute_command_internal (command->value.Connection->second,
2497                                       asynchronous, pipe_in, pipe_out,
2498                                       fds_to_close);
2499       executing_list--;
2500       break;
2501
2502     case '|':
2503       was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
2504       invert = (command->flags & CMD_INVERT_RETURN) != 0;
2505       ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
2506
2507       line_number_for_err_trap = line_number;
2508       exec_result = execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close);
2509
2510       if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
2511         {
2512           last_command_exit_value = exec_result;
2513           save_line_number = line_number;
2514           line_number = line_number_for_err_trap;
2515           run_error_trap ();
2516           line_number = save_line_number;
2517         }
2518
2519       if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
2520         {
2521           last_command_exit_value = exec_result;
2522           run_pending_traps ();
2523           jump_to_top_level (ERREXIT);
2524         }
2525
2526       break;
2527
2528     case AND_AND:
2529     case OR_OR:
2530       if (asynchronous)
2531         {
2532           /* If we have something like `a && b &' or `a || b &', run the
2533              && or || stuff in a subshell.  Force a subshell and just call
2534              execute_command_internal again.  Leave asynchronous on
2535              so that we get a report from the parent shell about the
2536              background job. */
2537           command->flags |= CMD_FORCE_SUBSHELL;
2538           exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);
2539           break;
2540         }
2541
2542       /* Execute the first command.  If the result of that is successful
2543          and the connector is AND_AND, or the result is not successful
2544          and the connector is OR_OR, then execute the second command,
2545          otherwise return. */
2546
2547       executing_list++;
2548       if (command->value.Connection->first)
2549         command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
2550
2551       exec_result = execute_command (command->value.Connection->first);
2552       QUIT;
2553       if (((command->value.Connection->connector == AND_AND) &&
2554            (exec_result == EXECUTION_SUCCESS)) ||
2555           ((command->value.Connection->connector == OR_OR) &&
2556            (exec_result != EXECUTION_SUCCESS)))
2557         {
2558           if (ignore_return && command->value.Connection->second)
2559             command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
2560
2561           exec_result = execute_command (command->value.Connection->second);
2562         }
2563       executing_list--;
2564       break;
2565
2566     default:
2567       command_error ("execute_connection", CMDERR_BADCONN, command->value.Connection->connector, 0);
2568       jump_to_top_level (DISCARD);
2569       exec_result = EXECUTION_FAILURE;
2570     }
2571
2572   return exec_result;
2573 }
2574
2575 #define REAP() \
2576   do \
2577     { \
2578       if (!interactive_shell) \
2579         reap_dead_jobs (); \
2580     } \
2581   while (0)
2582
2583 /* Execute a FOR command.  The syntax is: FOR word_desc IN word_list;
2584    DO command; DONE */
2585 static int
2586 execute_for_command (for_command)
2587      FOR_COM *for_command;
2588 {
2589   register WORD_LIST *releaser, *list;
2590   SHELL_VAR *v;
2591   char *identifier;
2592   int retval, save_line_number;
2593 #if 0
2594   SHELL_VAR *old_value = (SHELL_VAR *)NULL; /* Remember the old value of x. */
2595 #endif
2596
2597   save_line_number = line_number;
2598   if (check_identifier (for_command->name, 1) == 0)
2599     {
2600       if (posixly_correct && interactive_shell == 0)
2601         {
2602           last_command_exit_value = EX_BADUSAGE;
2603           jump_to_top_level (ERREXIT);
2604         }
2605       return (EXECUTION_FAILURE);
2606     }
2607
2608   loop_level++;
2609   identifier = for_command->name->word;
2610
2611   line_number = for_command->line;      /* for expansion error messages */
2612   list = releaser = expand_words_no_vars (for_command->map_list);
2613
2614   begin_unwind_frame ("for");
2615   add_unwind_protect (dispose_words, releaser);
2616
2617 #if 0
2618   if (lexical_scoping)
2619     {
2620       old_value = copy_variable (find_variable (identifier));
2621       if (old_value)
2622         add_unwind_protect (dispose_variable, old_value);
2623     }
2624 #endif
2625
2626   if (for_command->flags & CMD_IGNORE_RETURN)
2627     for_command->action->flags |= CMD_IGNORE_RETURN;
2628
2629   for (retval = EXECUTION_SUCCESS; list; list = list->next)
2630     {
2631       QUIT;
2632
2633       line_number = for_command->line;
2634
2635       /* Remember what this command looks like, for debugger. */
2636       command_string_index = 0;
2637       print_for_command_head (for_command);
2638
2639       if (echo_command_at_execute)
2640         xtrace_print_for_command_head (for_command);
2641
2642       /* Save this command unless it's a trap command and we're not running
2643          a debug trap. */
2644       if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
2645         {
2646           FREE (the_printed_command_except_trap);
2647           the_printed_command_except_trap = savestring (the_printed_command);
2648         }
2649
2650       retval = run_debug_trap ();
2651 #if defined (DEBUGGER)
2652       /* In debugging mode, if the DEBUG trap returns a non-zero status, we
2653          skip the command. */
2654       if (debugging_mode && retval != EXECUTION_SUCCESS)
2655         continue;
2656 #endif
2657
2658       this_command_name = (char *)NULL;
2659       /* XXX - special ksh93 for command index variable handling */
2660       v = find_variable_last_nameref (identifier);
2661       if (v && nameref_p (v))
2662         {
2663           v = bind_variable_value (v, list->word->word, 0);
2664         }
2665       else
2666         v = bind_variable (identifier, list->word->word, 0);
2667       if (readonly_p (v) || noassign_p (v))
2668         {
2669           line_number = save_line_number;
2670           if (readonly_p (v) && interactive_shell == 0 && posixly_correct)
2671             {
2672               last_command_exit_value = EXECUTION_FAILURE;
2673               jump_to_top_level (FORCE_EOF);
2674             }
2675           else
2676             {
2677               dispose_words (releaser);
2678               discard_unwind_frame ("for");
2679               loop_level--;
2680               return (EXECUTION_FAILURE);
2681             }
2682         }
2683       retval = execute_command (for_command->action);
2684       REAP ();
2685       QUIT;
2686
2687       if (breaking)
2688         {
2689           breaking--;
2690           break;
2691         }
2692
2693       if (continuing)
2694         {
2695           continuing--;
2696           if (continuing)
2697             break;
2698         }
2699     }
2700
2701   loop_level--;
2702   line_number = save_line_number;
2703
2704 #if 0
2705   if (lexical_scoping)
2706     {
2707       if (!old_value)
2708         unbind_variable (identifier);
2709       else
2710         {
2711           SHELL_VAR *new_value;
2712
2713           new_value = bind_variable (identifier, value_cell(old_value), 0);
2714           new_value->attributes = old_value->attributes;
2715           dispose_variable (old_value);
2716         }
2717     }
2718 #endif
2719
2720   dispose_words (releaser);
2721   discard_unwind_frame ("for");
2722   return (retval);
2723 }
2724
2725 #if defined (ARITH_FOR_COMMAND)
2726 /* Execute an arithmetic for command.  The syntax is
2727
2728         for (( init ; step ; test ))
2729         do
2730                 body
2731         done
2732
2733    The execution should be exactly equivalent to
2734
2735         eval \(\( init \)\)
2736         while eval \(\( test \)\) ; do
2737                 body;
2738                 eval \(\( step \)\)
2739         done
2740 */
2741 static intmax_t
2742 eval_arith_for_expr (l, okp)
2743      WORD_LIST *l;
2744      int *okp;
2745 {
2746   WORD_LIST *new;
2747   intmax_t expresult;
2748   int r;
2749
2750   new = expand_words_no_vars (l);
2751   if (new)
2752     {
2753       if (echo_command_at_execute)
2754         xtrace_print_arith_cmd (new);
2755       this_command_name = "((";         /* )) for expression error messages */
2756
2757       command_string_index = 0;
2758       print_arith_command (new);
2759       if (signal_in_progress (DEBUG_TRAP) == 0)
2760         {
2761           FREE (the_printed_command_except_trap);
2762           the_printed_command_except_trap = savestring (the_printed_command);
2763         }
2764
2765       r = run_debug_trap ();
2766       /* In debugging mode, if the DEBUG trap returns a non-zero status, we
2767          skip the command. */
2768 #if defined (DEBUGGER)
2769       if (debugging_mode == 0 || r == EXECUTION_SUCCESS)
2770         expresult = evalexp (new->word->word, okp);
2771       else
2772         {
2773           expresult = 0;
2774           if (okp)
2775             *okp = 1;
2776         }
2777 #else
2778       expresult = evalexp (new->word->word, okp);
2779 #endif
2780       dispose_words (new);
2781     }
2782   else
2783     {
2784       expresult = 0;
2785       if (okp)
2786         *okp = 1;
2787     }
2788   return (expresult);
2789 }
2790
2791 static int
2792 execute_arith_for_command (arith_for_command)
2793      ARITH_FOR_COM *arith_for_command;
2794 {
2795   intmax_t expresult;
2796   int expok, body_status, arith_lineno, save_lineno;
2797
2798   body_status = EXECUTION_SUCCESS;
2799   loop_level++;
2800   save_lineno = line_number;
2801
2802   if (arith_for_command->flags & CMD_IGNORE_RETURN)
2803     arith_for_command->action->flags |= CMD_IGNORE_RETURN;
2804
2805   this_command_name = "((";     /* )) for expression error messages */
2806
2807   /* save the starting line number of the command so we can reset
2808      line_number before executing each expression -- for $LINENO
2809      and the DEBUG trap. */
2810   line_number = arith_lineno = arith_for_command->line;
2811   if (variable_context && interactive_shell)
2812     line_number -= function_line_number;
2813
2814   /* Evaluate the initialization expression. */
2815   expresult = eval_arith_for_expr (arith_for_command->init, &expok);
2816   if (expok == 0)
2817     {
2818       line_number = save_lineno;
2819       return (EXECUTION_FAILURE);
2820     }
2821
2822   while (1)
2823     {
2824       /* Evaluate the test expression. */
2825       line_number = arith_lineno;
2826       expresult = eval_arith_for_expr (arith_for_command->test, &expok);
2827       line_number = save_lineno;
2828
2829       if (expok == 0)
2830         {
2831           body_status = EXECUTION_FAILURE;
2832           break;
2833         }
2834       REAP ();
2835       if (expresult == 0)
2836         break;
2837
2838       /* Execute the body of the arithmetic for command. */
2839       QUIT;
2840       body_status = execute_command (arith_for_command->action);
2841       QUIT;
2842
2843       /* Handle any `break' or `continue' commands executed by the body. */
2844       if (breaking)
2845         {
2846           breaking--;
2847           break;
2848         }
2849
2850       if (continuing)
2851         {
2852           continuing--;
2853           if (continuing)
2854             break;
2855         }
2856
2857       /* Evaluate the step expression. */
2858       line_number = arith_lineno;
2859       expresult = eval_arith_for_expr (arith_for_command->step, &expok);
2860       line_number = save_lineno;
2861
2862       if (expok == 0)
2863         {
2864           body_status = EXECUTION_FAILURE;
2865           break;
2866         }
2867     }
2868
2869   loop_level--;
2870   line_number = save_lineno;
2871
2872   return (body_status);
2873 }
2874 #endif
2875
2876 #if defined (SELECT_COMMAND)
2877 static int LINES, COLS, tabsize;
2878
2879 #define RP_SPACE ") "
2880 #define RP_SPACE_LEN 2
2881
2882 /* XXX - does not handle numbers > 1000000 at all. */
2883 #define NUMBER_LEN(s) \
2884 ((s < 10) ? 1 \
2885           : ((s < 100) ? 2 \
2886                       : ((s < 1000) ? 3 \
2887                                    : ((s < 10000) ? 4 \
2888                                                  : ((s < 100000) ? 5 \
2889                                                                 : 6)))))
2890
2891 static int
2892 displen (s)
2893      const char *s;
2894 {
2895 #if defined (HANDLE_MULTIBYTE)
2896   wchar_t *wcstr;
2897   size_t slen;
2898   int wclen;
2899
2900   wcstr = 0;
2901   slen = mbstowcs (wcstr, s, 0);
2902   if (slen == -1)
2903     slen = 0;
2904   wcstr = (wchar_t *)xmalloc (sizeof (wchar_t) * (slen + 1));
2905   mbstowcs (wcstr, s, slen + 1);
2906   wclen = wcswidth (wcstr, slen);
2907   free (wcstr);
2908   return (wclen < 0 ? STRLEN(s) : wclen);
2909 #else
2910   return (STRLEN (s));
2911 #endif
2912 }
2913
2914 static int
2915 print_index_and_element (len, ind, list)
2916       int len, ind;
2917       WORD_LIST *list;
2918 {
2919   register WORD_LIST *l;
2920   register int i;
2921
2922   if (list == 0)
2923     return (0);
2924   for (i = ind, l = list; l && --i; l = l->next)
2925     ;
2926   if (l == 0)           /* don't think this can happen */
2927     return (0);
2928   fprintf (stderr, "%*d%s%s", len, ind, RP_SPACE, l->word->word);
2929   return (displen (l->word->word));
2930 }
2931
2932 static void
2933 indent (from, to)
2934      int from, to;
2935 {
2936   while (from < to)
2937     {
2938       if ((to / tabsize) > (from / tabsize))
2939         {
2940           putc ('\t', stderr);
2941           from += tabsize - from % tabsize;
2942         }
2943       else
2944         {
2945           putc (' ', stderr);
2946           from++;
2947         }
2948     }
2949 }
2950
2951 static void
2952 print_select_list (list, list_len, max_elem_len, indices_len)
2953      WORD_LIST *list;
2954      int list_len, max_elem_len, indices_len;
2955 {
2956   int ind, row, elem_len, pos, cols, rows;
2957   int first_column_indices_len, other_indices_len;
2958
2959   if (list == 0)
2960     {
2961       putc ('\n', stderr);
2962       return;
2963     }
2964
2965   cols = max_elem_len ? COLS / max_elem_len : 1;
2966   if (cols == 0)
2967     cols = 1;
2968   rows = list_len ? list_len / cols + (list_len % cols != 0) : 1;
2969   cols = list_len ? list_len / rows + (list_len % rows != 0) : 1;
2970
2971   if (rows == 1)
2972     {
2973       rows = cols;
2974       cols = 1;
2975     }
2976
2977   first_column_indices_len = NUMBER_LEN (rows);
2978   other_indices_len = indices_len;
2979
2980   for (row = 0; row < rows; row++)
2981     {
2982       ind = row;
2983       pos = 0;
2984       while (1)
2985         {
2986           indices_len = (pos == 0) ? first_column_indices_len : other_indices_len;
2987           elem_len = print_index_and_element (indices_len, ind + 1, list);
2988           elem_len += indices_len + RP_SPACE_LEN;
2989           ind += rows;
2990           if (ind >= list_len)
2991             break;
2992           indent (pos + elem_len, pos + max_elem_len);
2993           pos += max_elem_len;
2994         }
2995       putc ('\n', stderr);
2996     }
2997 }
2998
2999 /* Print the elements of LIST, one per line, preceded by an index from 1 to
3000    LIST_LEN.  Then display PROMPT and wait for the user to enter a number.
3001    If the number is between 1 and LIST_LEN, return that selection.  If EOF
3002    is read, return a null string.  If a blank line is entered, or an invalid
3003    number is entered, the loop is executed again. */
3004 static char *
3005 select_query (list, list_len, prompt, print_menu)
3006      WORD_LIST *list;
3007      int list_len;
3008      char *prompt;
3009      int print_menu;
3010 {
3011   int max_elem_len, indices_len, len;
3012   intmax_t reply;
3013   WORD_LIST *l;
3014   char *repl_string, *t;
3015
3016 #if 0
3017   t = get_string_value ("LINES");
3018   LINES = (t && *t) ? atoi (t) : 24;
3019 #endif
3020   t = get_string_value ("COLUMNS");
3021   COLS =  (t && *t) ? atoi (t) : 80;
3022
3023 #if 0
3024   t = get_string_value ("TABSIZE");
3025   tabsize = (t && *t) ? atoi (t) : 8;
3026   if (tabsize <= 0)
3027     tabsize = 8;
3028 #else
3029   tabsize = 8;
3030 #endif
3031
3032   max_elem_len = 0;
3033   for (l = list; l; l = l->next)
3034     {
3035       len = displen (l->word->word);
3036       if (len > max_elem_len)
3037         max_elem_len = len;
3038     }
3039   indices_len = NUMBER_LEN (list_len);
3040   max_elem_len += indices_len + RP_SPACE_LEN + 2;
3041
3042   while (1)
3043     {
3044       if (print_menu)
3045         print_select_list (list, list_len, max_elem_len, indices_len);
3046       fprintf (stderr, "%s", prompt);
3047       fflush (stderr);
3048       QUIT;
3049
3050       if (read_builtin ((WORD_LIST *)NULL) != EXECUTION_SUCCESS)
3051         {
3052           putchar ('\n');
3053           return ((char *)NULL);
3054         }
3055       repl_string = get_string_value ("REPLY");
3056       if (*repl_string == 0)
3057         {
3058           print_menu = 1;
3059           continue;
3060         }
3061       if (legal_number (repl_string, &reply) == 0)
3062         return "";
3063       if (reply < 1 || reply > list_len)
3064         return "";
3065
3066       for (l = list; l && --reply; l = l->next)
3067         ;
3068       return (l->word->word);           /* XXX - can't be null? */
3069     }
3070 }
3071
3072 /* Execute a SELECT command.  The syntax is:
3073    SELECT word IN list DO command_list DONE
3074    Only `break' or `return' in command_list will terminate
3075    the command. */
3076 static int
3077 execute_select_command (select_command)
3078      SELECT_COM *select_command;
3079 {
3080   WORD_LIST *releaser, *list;
3081   SHELL_VAR *v;
3082   char *identifier, *ps3_prompt, *selection;
3083   int retval, list_len, show_menu, save_line_number;
3084
3085   if (check_identifier (select_command->name, 1) == 0)
3086     return (EXECUTION_FAILURE);
3087
3088   save_line_number = line_number;
3089   line_number = select_command->line;
3090
3091   command_string_index = 0;
3092   print_select_command_head (select_command);
3093
3094   if (echo_command_at_execute)
3095     xtrace_print_select_command_head (select_command);
3096
3097 #if 0
3098   if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
3099 #else
3100   if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
3101 #endif
3102     {
3103       FREE (the_printed_command_except_trap);
3104       the_printed_command_except_trap = savestring (the_printed_command);
3105     }
3106
3107   retval = run_debug_trap ();
3108 #if defined (DEBUGGER)
3109   /* In debugging mode, if the DEBUG trap returns a non-zero status, we
3110      skip the command. */
3111   if (debugging_mode && retval != EXECUTION_SUCCESS)
3112     return (EXECUTION_SUCCESS);
3113 #endif
3114
3115   loop_level++;
3116   identifier = select_command->name->word;
3117
3118   /* command and arithmetic substitution, parameter and variable expansion,
3119      word splitting, pathname expansion, and quote removal. */
3120   list = releaser = expand_words_no_vars (select_command->map_list);
3121   list_len = list_length (list);
3122   if (list == 0 || list_len == 0)
3123     {
3124       if (list)
3125         dispose_words (list);
3126       line_number = save_line_number;
3127       return (EXECUTION_SUCCESS);
3128     }
3129
3130   begin_unwind_frame ("select");
3131   add_unwind_protect (dispose_words, releaser);
3132
3133   if (select_command->flags & CMD_IGNORE_RETURN)
3134     select_command->action->flags |= CMD_IGNORE_RETURN;
3135
3136   retval = EXECUTION_SUCCESS;
3137   show_menu = 1;
3138
3139   while (1)
3140     {
3141       line_number = select_command->line;
3142       ps3_prompt = get_string_value ("PS3");
3143       if (ps3_prompt == 0)
3144         ps3_prompt = "#? ";
3145
3146       QUIT;
3147       selection = select_query (list, list_len, ps3_prompt, show_menu);
3148       QUIT;
3149       if (selection == 0)
3150         {
3151           /* select_query returns EXECUTION_FAILURE if the read builtin
3152              fails, so we want to return failure in this case. */
3153           retval = EXECUTION_FAILURE;
3154           break;
3155         }
3156
3157       v = bind_variable (identifier, selection, 0);
3158       if (readonly_p (v) || noassign_p (v))
3159         {
3160           if (readonly_p (v) && interactive_shell == 0 && posixly_correct)
3161             {
3162               last_command_exit_value = EXECUTION_FAILURE;
3163               jump_to_top_level (FORCE_EOF);
3164             }
3165           else
3166             {
3167               dispose_words (releaser);
3168               discard_unwind_frame ("select");
3169               loop_level--;
3170               line_number = save_line_number;
3171               return (EXECUTION_FAILURE);
3172             }
3173         }
3174
3175       retval = execute_command (select_command->action);
3176
3177       REAP ();
3178       QUIT;
3179
3180       if (breaking)
3181         {
3182           breaking--;
3183           break;
3184         }
3185
3186       if (continuing)
3187         {
3188           continuing--;
3189           if (continuing)
3190             break;
3191         }
3192
3193 #if defined (KSH_COMPATIBLE_SELECT)
3194       show_menu = 0;
3195       selection = get_string_value ("REPLY");
3196       if (selection && *selection == '\0')
3197         show_menu = 1;
3198 #endif
3199     }
3200
3201   loop_level--;
3202   line_number = save_line_number;
3203
3204   dispose_words (releaser);
3205   discard_unwind_frame ("select");
3206   return (retval);
3207 }
3208 #endif /* SELECT_COMMAND */
3209
3210 /* Execute a CASE command.  The syntax is: CASE word_desc IN pattern_list ESAC.
3211    The pattern_list is a linked list of pattern clauses; each clause contains
3212    some patterns to compare word_desc against, and an associated command to
3213    execute. */
3214 static int
3215 execute_case_command (case_command)
3216      CASE_COM *case_command;
3217 {
3218   register WORD_LIST *list;
3219   WORD_LIST *wlist, *es;
3220   PATTERN_LIST *clauses;
3221   char *word, *pattern;
3222   int retval, match, ignore_return, save_line_number;
3223
3224   save_line_number = line_number;
3225   line_number = case_command->line;
3226
3227   command_string_index = 0;
3228   print_case_command_head (case_command);
3229
3230   if (echo_command_at_execute)
3231     xtrace_print_case_command_head (case_command);
3232
3233 #if 0
3234   if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
3235 #else
3236   if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
3237 #endif
3238     {
3239       FREE (the_printed_command_except_trap);
3240       the_printed_command_except_trap = savestring (the_printed_command);
3241     }
3242
3243   retval = run_debug_trap();
3244 #if defined (DEBUGGER)
3245   /* In debugging mode, if the DEBUG trap returns a non-zero status, we
3246      skip the command. */
3247   if (debugging_mode && retval != EXECUTION_SUCCESS)
3248     {
3249       line_number = save_line_number;
3250       return (EXECUTION_SUCCESS);
3251     }
3252 #endif
3253
3254   wlist = expand_word_unsplit (case_command->word, 0);
3255   word = wlist ? string_list (wlist) : savestring ("");
3256   dispose_words (wlist);
3257
3258   retval = EXECUTION_SUCCESS;
3259   ignore_return = case_command->flags & CMD_IGNORE_RETURN;
3260
3261   begin_unwind_frame ("case");
3262   add_unwind_protect ((Function *)xfree, word);
3263
3264 #define EXIT_CASE()  goto exit_case_command
3265
3266   for (clauses = case_command->clauses; clauses; clauses = clauses->next)
3267     {
3268       QUIT;
3269       for (list = clauses->patterns; list; list = list->next)
3270         {
3271           es = expand_word_leave_quoted (list->word, 0);
3272
3273           if (es && es->word && es->word->word && *(es->word->word))
3274             pattern = quote_string_for_globbing (es->word->word, QGLOB_CVTNULL);
3275           else
3276             {
3277               pattern = (char *)xmalloc (1);
3278               pattern[0] = '\0';
3279             }
3280
3281           /* Since the pattern does not undergo quote removal (as per
3282              Posix.2, section 3.9.4.3), the strmatch () call must be able
3283              to recognize backslashes as escape characters. */
3284           match = strmatch (pattern, word, FNMATCH_EXTFLAG|FNMATCH_IGNCASE) != FNM_NOMATCH;
3285           free (pattern);
3286
3287           dispose_words (es);
3288
3289           if (match)
3290             {
3291               do
3292                 {
3293                   if (clauses->action && ignore_return)
3294                     clauses->action->flags |= CMD_IGNORE_RETURN;
3295                   retval = execute_command (clauses->action);
3296                 }
3297               while ((clauses->flags & CASEPAT_FALLTHROUGH) && (clauses = clauses->next));
3298               if (clauses == 0 || (clauses->flags & CASEPAT_TESTNEXT) == 0)
3299                 EXIT_CASE ();
3300               else
3301                 break;
3302             }
3303
3304           QUIT;
3305         }
3306     }
3307
3308 exit_case_command:
3309   free (word);
3310   discard_unwind_frame ("case");
3311   line_number = save_line_number;
3312   return (retval);
3313 }
3314
3315 #define CMD_WHILE 0
3316 #define CMD_UNTIL 1
3317
3318 /* The WHILE command.  Syntax: WHILE test DO action; DONE.
3319    Repeatedly execute action while executing test produces
3320    EXECUTION_SUCCESS. */
3321 static int
3322 execute_while_command (while_command)
3323      WHILE_COM *while_command;
3324 {
3325   return (execute_while_or_until (while_command, CMD_WHILE));
3326 }
3327
3328 /* UNTIL is just like WHILE except that the test result is negated. */
3329 static int
3330 execute_until_command (while_command)
3331      WHILE_COM *while_command;
3332 {
3333   return (execute_while_or_until (while_command, CMD_UNTIL));
3334 }
3335
3336 /* The body for both while and until.  The only difference between the
3337    two is that the test value is treated differently.  TYPE is
3338    CMD_WHILE or CMD_UNTIL.  The return value for both commands should
3339    be EXECUTION_SUCCESS if no commands in the body are executed, and
3340    the status of the last command executed in the body otherwise. */
3341 static int
3342 execute_while_or_until (while_command, type)
3343      WHILE_COM *while_command;
3344      int type;
3345 {
3346   int return_value, body_status;
3347
3348   body_status = EXECUTION_SUCCESS;
3349   loop_level++;
3350
3351   while_command->test->flags |= CMD_IGNORE_RETURN;
3352   if (while_command->flags & CMD_IGNORE_RETURN)
3353     while_command->action->flags |= CMD_IGNORE_RETURN;
3354
3355   while (1)
3356     {
3357       return_value = execute_command (while_command->test);
3358       REAP ();
3359
3360       /* Need to handle `break' in the test when we would break out of the
3361          loop.  The job control code will set `breaking' to loop_level
3362          when a job in a loop is stopped with SIGTSTP.  If the stopped job
3363          is in the loop test, `breaking' will not be reset unless we do
3364          this, and the shell will cease to execute commands. */
3365       if (type == CMD_WHILE && return_value != EXECUTION_SUCCESS)
3366         {
3367           if (breaking)
3368             breaking--;
3369           break;
3370         }
3371       if (type == CMD_UNTIL && return_value == EXECUTION_SUCCESS)
3372         {
3373           if (breaking)
3374             breaking--;
3375           break;
3376         }
3377
3378       QUIT;
3379       body_status = execute_command (while_command->action);
3380       QUIT;
3381
3382       if (breaking)
3383         {
3384           breaking--;
3385           break;
3386         }
3387
3388       if (continuing)
3389         {
3390           continuing--;
3391           if (continuing)
3392             break;
3393         }
3394     }
3395   loop_level--;
3396
3397   return (body_status);
3398 }
3399
3400 /* IF test THEN command [ELSE command].
3401    IF also allows ELIF in the place of ELSE IF, but
3402    the parser makes *that* stupidity transparent. */
3403 static int
3404 execute_if_command (if_command)
3405      IF_COM *if_command;
3406 {
3407   int return_value, save_line_number;
3408
3409   save_line_number = line_number;
3410   if_command->test->flags |= CMD_IGNORE_RETURN;
3411   return_value = execute_command (if_command->test);
3412   line_number = save_line_number;
3413
3414   if (return_value == EXECUTION_SUCCESS)
3415     {
3416       QUIT;
3417
3418       if (if_command->true_case && (if_command->flags & CMD_IGNORE_RETURN))
3419         if_command->true_case->flags |= CMD_IGNORE_RETURN;
3420
3421       return (execute_command (if_command->true_case));
3422     }
3423   else
3424     {
3425       QUIT;
3426
3427       if (if_command->false_case && (if_command->flags & CMD_IGNORE_RETURN))
3428         if_command->false_case->flags |= CMD_IGNORE_RETURN;
3429
3430       return (execute_command (if_command->false_case));
3431     }
3432 }
3433
3434 #if defined (DPAREN_ARITHMETIC)
3435 static int
3436 execute_arith_command (arith_command)
3437      ARITH_COM *arith_command;
3438 {
3439   int expok, save_line_number, retval;
3440   intmax_t expresult;
3441   WORD_LIST *new;
3442   char *exp;
3443
3444   expresult = 0;
3445
3446   save_line_number = line_number;
3447   this_command_name = "((";     /* )) */
3448   line_number = arith_command->line;
3449   /* If we're in a function, update the line number information. */
3450   if (variable_context && interactive_shell)
3451     line_number -= function_line_number;
3452
3453   command_string_index = 0;
3454   print_arith_command (arith_command->exp);
3455
3456   if (signal_in_progress (DEBUG_TRAP) == 0)
3457     {
3458       FREE (the_printed_command_except_trap);
3459       the_printed_command_except_trap = savestring (the_printed_command);
3460     }
3461
3462   /* Run the debug trap before each arithmetic command, but do it after we
3463      update the line number information and before we expand the various
3464      words in the expression. */
3465   retval = run_debug_trap ();
3466 #if defined (DEBUGGER)
3467   /* In debugging mode, if the DEBUG trap returns a non-zero status, we
3468      skip the command. */
3469   if (debugging_mode && retval != EXECUTION_SUCCESS)
3470     {
3471       line_number = save_line_number;
3472       return (EXECUTION_SUCCESS);
3473     }
3474 #endif
3475
3476   new = expand_words_no_vars (arith_command->exp);
3477
3478   /* If we're tracing, make a new word list with `((' at the front and `))'
3479      at the back and print it. */
3480   if (echo_command_at_execute)
3481     xtrace_print_arith_cmd (new);
3482
3483   if (new)
3484     {
3485       exp = new->next ? string_list (new) : new->word->word;
3486       expresult = evalexp (exp, &expok);
3487       line_number = save_line_number;
3488       if (exp != new->word->word)
3489         free (exp);
3490       dispose_words (new);
3491     }
3492   else
3493     {
3494       expresult = 0;
3495       expok = 1;
3496     }
3497
3498   if (expok == 0)
3499     return (EXECUTION_FAILURE);
3500
3501   return (expresult == 0 ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
3502 }
3503 #endif /* DPAREN_ARITHMETIC */
3504
3505 #if defined (COND_COMMAND)
3506
3507 static char * const nullstr = "";
3508
3509 /* XXX - can COND ever be NULL when this is called? */
3510 static int
3511 execute_cond_node (cond)
3512      COND_COM *cond;
3513 {
3514   int result, invert, patmatch, rmatch, mflags, ignore;
3515   char *arg1, *arg2;
3516 #if 0
3517   char *t1, *t2;
3518 #endif
3519
3520   invert = (cond->flags & CMD_INVERT_RETURN);
3521   ignore = (cond->flags & CMD_IGNORE_RETURN);
3522   if (ignore)
3523     {
3524       if (cond->left)
3525         cond->left->flags |= CMD_IGNORE_RETURN;
3526       if (cond->right)
3527         cond->right->flags |= CMD_IGNORE_RETURN;
3528     }
3529       
3530   if (cond->type == COND_EXPR)
3531     result = execute_cond_node (cond->left);
3532   else if (cond->type == COND_OR)
3533     {
3534       result = execute_cond_node (cond->left);
3535       if (result != EXECUTION_SUCCESS)
3536         result = execute_cond_node (cond->right);
3537     }
3538   else if (cond->type == COND_AND)
3539     {
3540       result = execute_cond_node (cond->left);
3541       if (result == EXECUTION_SUCCESS)
3542         result = execute_cond_node (cond->right);
3543     }
3544   else if (cond->type == COND_UNARY)
3545     {
3546       if (ignore)
3547         comsub_ignore_return++;
3548       arg1 = cond_expand_word (cond->left->op, 0);
3549       if (ignore)
3550         comsub_ignore_return--;
3551       if (arg1 == 0)
3552         arg1 = nullstr;
3553       if (echo_command_at_execute)
3554         xtrace_print_cond_term (cond->type, invert, cond->op, arg1, (char *)NULL);
3555       result = unary_test (cond->op->word, arg1) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
3556       if (arg1 != nullstr)
3557         free (arg1);
3558     }
3559   else if (cond->type == COND_BINARY)
3560     {
3561       rmatch = 0;
3562       patmatch = (((cond->op->word[1] == '=') && (cond->op->word[2] == '\0') &&
3563                    (cond->op->word[0] == '!' || cond->op->word[0] == '=')) ||
3564                   (cond->op->word[0] == '=' && cond->op->word[1] == '\0'));
3565 #if defined (COND_REGEXP)
3566       rmatch = (cond->op->word[0] == '=' && cond->op->word[1] == '~' &&
3567                 cond->op->word[2] == '\0');
3568 #endif
3569
3570       if (ignore)
3571         comsub_ignore_return++;
3572       arg1 = cond_expand_word (cond->left->op, 0);
3573       if (ignore)
3574         comsub_ignore_return--;
3575       if (arg1 == 0)
3576         arg1 = nullstr;
3577       if (ignore)
3578         comsub_ignore_return++;
3579       arg2 = cond_expand_word (cond->right->op,
3580                                (rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0));
3581       if (ignore)
3582         comsub_ignore_return--;
3583       if (arg2 == 0)
3584         arg2 = nullstr;
3585
3586       if (echo_command_at_execute)
3587         xtrace_print_cond_term (cond->type, invert, cond->op, arg1, arg2);
3588
3589 #if defined (COND_REGEXP)
3590       if (rmatch)
3591         {
3592           mflags = SHMAT_PWARN;
3593 #if defined (ARRAY_VARS)
3594           mflags |= SHMAT_SUBEXP;
3595 #endif
3596
3597 #if 0
3598           t1 = strescape(arg1);
3599           t2 = strescape(arg2);
3600           itrace("execute_cond_node: sh_regmatch on `%s' and `%s'", t1, t2);
3601           free(t1);
3602           free(t2);
3603 #endif
3604
3605           result = sh_regmatch (arg1, arg2, mflags);
3606         }
3607       else
3608 #endif /* COND_REGEXP */
3609         {
3610           int oe;
3611           oe = extended_glob;
3612           extended_glob = 1;
3613           result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP|TEST_LOCALE)
3614                                   ? EXECUTION_SUCCESS
3615                                   : EXECUTION_FAILURE;
3616           extended_glob = oe;
3617         }
3618       if (arg1 != nullstr)
3619         free (arg1);
3620       if (arg2 != nullstr)
3621         free (arg2);
3622     }
3623   else
3624     {
3625       command_error ("execute_cond_node", CMDERR_BADTYPE, cond->type, 0);
3626       jump_to_top_level (DISCARD);
3627       result = EXECUTION_FAILURE;
3628     }
3629
3630   if (invert)
3631     result = (result == EXECUTION_SUCCESS) ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
3632
3633   return result;
3634 }
3635
3636 static int
3637 execute_cond_command (cond_command)
3638      COND_COM *cond_command;
3639 {
3640   int retval, save_line_number;
3641
3642   retval = EXECUTION_SUCCESS;
3643   save_line_number = line_number;
3644
3645   this_command_name = "[[";
3646   line_number = cond_command->line;
3647   /* If we're in a function, update the line number information. */
3648   if (variable_context && interactive_shell)
3649     line_number -= function_line_number;
3650   command_string_index = 0;
3651   print_cond_command (cond_command);
3652
3653   if (signal_in_progress (DEBUG_TRAP) == 0)
3654     {
3655       FREE (the_printed_command_except_trap);
3656       the_printed_command_except_trap = savestring (the_printed_command);
3657     }
3658
3659   /* Run the debug trap before each conditional command, but do it after we
3660      update the line number information. */
3661   retval = run_debug_trap ();
3662 #if defined (DEBUGGER)
3663   /* In debugging mode, if the DEBUG trap returns a non-zero status, we
3664      skip the command. */
3665   if (debugging_mode && retval != EXECUTION_SUCCESS)
3666     {
3667       line_number = save_line_number;
3668       return (EXECUTION_SUCCESS);
3669     }
3670 #endif
3671
3672 #if 0
3673   debug_print_cond_command (cond_command);
3674 #endif
3675
3676   last_command_exit_value = retval = execute_cond_node (cond_command);
3677   line_number = save_line_number;
3678   return (retval);
3679 }
3680 #endif /* COND_COMMAND */
3681
3682 static void
3683 bind_lastarg (arg)
3684      char *arg;
3685 {
3686   SHELL_VAR *var;
3687
3688   if (arg == 0)
3689     arg = "";
3690   var = bind_variable ("_", arg, 0);
3691   VUNSETATTR (var, att_exported);
3692 }
3693
3694 /* Execute a null command.  Fork a subshell if the command uses pipes or is
3695    to be run asynchronously.  This handles all the side effects that are
3696    supposed to take place. */
3697 static int
3698 execute_null_command (redirects, pipe_in, pipe_out, async)
3699      REDIRECT *redirects;
3700      int pipe_in, pipe_out, async;
3701 {
3702   int r;
3703   int forcefork;
3704   REDIRECT *rd;
3705
3706   for (forcefork = 0, rd = redirects; rd; rd = rd->next)
3707     forcefork += rd->rflags & REDIR_VARASSIGN;
3708
3709   if (forcefork || pipe_in != NO_PIPE || pipe_out != NO_PIPE || async)
3710     {
3711       /* We have a null command, but we really want a subshell to take
3712          care of it.  Just fork, do piping and redirections, and exit. */
3713       if (make_child ((char *)NULL, async) == 0)
3714         {
3715           /* Cancel traps, in trap.c. */
3716           restore_original_signals ();          /* XXX */
3717
3718           do_piping (pipe_in, pipe_out);
3719
3720 #if defined (COPROCESS_SUPPORT)
3721           coproc_closeall ();
3722 #endif
3723
3724           subshell_environment = 0;
3725           if (async)
3726             subshell_environment |= SUBSHELL_ASYNC;
3727           if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
3728             subshell_environment |= SUBSHELL_PIPE;
3729
3730           if (do_redirections (redirects, RX_ACTIVE) == 0)
3731             exit (EXECUTION_SUCCESS);
3732           else
3733             exit (EXECUTION_FAILURE);
3734         }
3735       else
3736         {
3737           close_pipes (pipe_in, pipe_out);
3738 #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
3739           if (pipe_out == NO_PIPE)
3740             unlink_fifo_list ();
3741 #endif
3742           return (EXECUTION_SUCCESS);
3743         }
3744     }
3745   else
3746     {
3747       /* Even if there aren't any command names, pretend to do the
3748          redirections that are specified.  The user expects the side
3749          effects to take place.  If the redirections fail, then return
3750          failure.  Otherwise, if a command substitution took place while
3751          expanding the command or a redirection, return the value of that
3752          substitution.  Otherwise, return EXECUTION_SUCCESS. */
3753
3754       r = do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE);
3755       cleanup_redirects (redirection_undo_list);
3756       redirection_undo_list = (REDIRECT *)NULL;
3757
3758       if (r != 0)
3759         return (EXECUTION_FAILURE);
3760       else if (last_command_subst_pid != NO_PID)
3761         return (last_command_exit_value);
3762       else
3763         return (EXECUTION_SUCCESS);
3764     }
3765 }
3766
3767 /* This is a hack to suppress word splitting for assignment statements
3768    given as arguments to builtins with the ASSIGNMENT_BUILTIN flag set. */
3769 static void
3770 fix_assignment_words (words)
3771      WORD_LIST *words;
3772 {
3773   WORD_LIST *w, *wcmd;
3774   struct builtin *b;
3775   int assoc, global, array, integer;
3776
3777   if (words == 0)
3778     return;
3779
3780   b = 0;
3781   assoc = global = array = integer = 0;
3782
3783   /* Skip over assignment statements preceding a command name */
3784   wcmd = words;
3785   for (wcmd = words; wcmd; wcmd = wcmd->next)
3786     if ((wcmd->word->flags & W_ASSIGNMENT) == 0)
3787       break;
3788
3789   for (w = wcmd; w; w = w->next)
3790     if (w->word->flags & W_ASSIGNMENT)
3791       {
3792         if (b == 0)
3793           {
3794             /* Posix (post-2008) says that `command' doesn't change whether
3795                or not the builtin it shadows is a `declaration command', even
3796                though it removes other special builtin properties.  In Posix
3797                mode, we skip over one or more instances of `command' and
3798                deal with the next word as the assignment builtin. */
3799             while (posixly_correct && wcmd && wcmd->word && wcmd->word->word && STREQ (wcmd->word->word, "command"))
3800               wcmd = wcmd->next;
3801             b = builtin_address_internal (wcmd->word->word, 0);
3802             if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
3803               return;
3804             else if (b && (b->flags & ASSIGNMENT_BUILTIN))
3805               wcmd->word->flags |= W_ASSNBLTIN;
3806           }
3807         w->word->flags |= (W_NOSPLIT|W_NOGLOB|W_TILDEEXP|W_ASSIGNARG);
3808 #if defined (ARRAY_VARS)
3809         if (assoc)
3810           w->word->flags |= W_ASSIGNASSOC;
3811         if (array)
3812           w->word->flags |= W_ASSIGNARRAY;
3813 #endif
3814         if (global)
3815           w->word->flags |= W_ASSNGLOBAL;
3816         if (integer)
3817           w->word->flags |= W_ASSIGNINT;
3818       }
3819 #if defined (ARRAY_VARS)
3820     /* Note that we saw an associative array option to a builtin that takes
3821        assignment statements.  This is a bit of a kludge. */
3822     else if (w->word->word[0] == '-' && (strchr (w->word->word+1, 'A') || strchr (w->word->word+1, 'a') || strchr (w->word->word+1, 'g')))
3823 #else
3824     else if (w->word->word[0] == '-' && strchr (w->word->word+1, 'g'))
3825 #endif
3826       {
3827         if (b == 0)
3828           {
3829             while (posixly_correct && wcmd && wcmd->word && wcmd->word->word && STREQ (wcmd->word->word, "command"))
3830               wcmd = wcmd->next;
3831             b = builtin_address_internal (wcmd->word->word, 0);
3832             if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
3833               return;
3834             else if (b && (b->flags & ASSIGNMENT_BUILTIN))
3835               wcmd->word->flags |= W_ASSNBLTIN;
3836           }
3837         if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'A'))
3838           assoc = 1;
3839         else if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'a'))
3840           array = 1;
3841         if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'g'))
3842           global = 1;
3843         if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'i'))
3844           integer = 1;
3845       }
3846 }
3847
3848 /* Return 1 if the file found by searching $PATH for PATHNAME, defaulting
3849    to PATHNAME, is a directory.  Used by the autocd code below. */
3850 static int
3851 is_dirname (pathname)
3852      char *pathname;
3853 {
3854   char *temp;
3855   int ret;
3856
3857   temp = search_for_command (pathname, 0);
3858   ret = (temp ? file_isdir (temp) : file_isdir (pathname));
3859   free (temp);
3860   return ret;
3861 }
3862
3863 /* The meaty part of all the executions.  We have to start hacking the
3864    real execution of commands here.  Fork a process, set things up,
3865    execute the command. */
3866 static int
3867 execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
3868      SIMPLE_COM *simple_command;
3869      int pipe_in, pipe_out, async;
3870      struct fd_bitmap *fds_to_close;
3871 {
3872   WORD_LIST *words, *lastword;
3873   char *command_line, *lastarg, *temp;
3874   int first_word_quoted, result, builtin_is_special, already_forked, dofork;
3875   pid_t old_last_async_pid;
3876   sh_builtin_func_t *builtin;
3877   SHELL_VAR *func;
3878   volatile int old_builtin, old_command_builtin;
3879
3880   result = EXECUTION_SUCCESS;
3881   special_builtin_failed = builtin_is_special = 0;
3882   command_line = (char *)0;
3883
3884   QUIT;
3885
3886   /* If we're in a function, update the line number information. */
3887   if (variable_context && interactive_shell && sourcelevel == 0)
3888     line_number -= function_line_number;
3889
3890   /* Remember what this command line looks like at invocation. */
3891   command_string_index = 0;
3892   print_simple_command (simple_command);
3893
3894 #if 0
3895   if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
3896 #else
3897   if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
3898 #endif
3899     {
3900       FREE (the_printed_command_except_trap);
3901       the_printed_command_except_trap = the_printed_command ? savestring (the_printed_command) : (char *)0;
3902     }
3903
3904   /* Run the debug trap before each simple command, but do it after we
3905      update the line number information. */
3906   result = run_debug_trap ();
3907 #if defined (DEBUGGER)
3908   /* In debugging mode, if the DEBUG trap returns a non-zero status, we
3909      skip the command. */
3910   if (debugging_mode && result != EXECUTION_SUCCESS)
3911     return (EXECUTION_SUCCESS);
3912 #endif
3913
3914   first_word_quoted =
3915     simple_command->words ? (simple_command->words->word->flags & W_QUOTED) : 0;
3916
3917   last_command_subst_pid = NO_PID;
3918   old_last_async_pid = last_asynchronous_pid;
3919
3920   already_forked = dofork = 0;
3921
3922   /* If we're in a pipeline or run in the background, set DOFORK so we
3923      make the child early, before word expansion.  This keeps assignment
3924      statements from affecting the parent shell's environment when they
3925      should not. */
3926   dofork = pipe_in != NO_PIPE || pipe_out != NO_PIPE || async;
3927
3928   /* Something like `%2 &' should restart job 2 in the background, not cause
3929      the shell to fork here. */
3930   if (dofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE &&
3931         simple_command->words && simple_command->words->word &&
3932         simple_command->words->word->word &&
3933         (simple_command->words->word->word[0] == '%'))
3934     dofork = 0;
3935
3936   if (dofork)
3937     {
3938       /* Do this now, because execute_disk_command will do it anyway in the
3939          vast majority of cases. */
3940       maybe_make_export_env ();
3941
3942       /* Don't let a DEBUG trap overwrite the command string to be saved with
3943          the process/job associated with this child. */
3944       if (make_child (savestring (the_printed_command_except_trap), async) == 0)
3945         {
3946           already_forked = 1;
3947           simple_command->flags |= CMD_NO_FORK;
3948
3949           subshell_environment = SUBSHELL_FORK;
3950           if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
3951             subshell_environment |= SUBSHELL_PIPE;
3952           if (async)
3953             subshell_environment |= SUBSHELL_ASYNC;
3954
3955           /* We need to do this before piping to handle some really
3956              pathological cases where one of the pipe file descriptors
3957              is < 2. */
3958           if (fds_to_close)
3959             close_fd_bitmap (fds_to_close);
3960
3961           do_piping (pipe_in, pipe_out);
3962           pipe_in = pipe_out = NO_PIPE;
3963 #if defined (COPROCESS_SUPPORT)
3964           coproc_closeall ();
3965 #endif
3966
3967           last_asynchronous_pid = old_last_async_pid;
3968
3969           CHECK_SIGTERM;
3970         }
3971       else
3972         {
3973           /* Don't let simple commands that aren't the last command in a
3974              pipeline change $? for the rest of the pipeline (or at all). */
3975           if (pipe_out != NO_PIPE)
3976             result = last_command_exit_value;
3977           close_pipes (pipe_in, pipe_out);
3978 #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
3979           /* Close /dev/fd file descriptors in the parent after forking the
3980              last child in a (possibly one-element) pipeline.  Defer this
3981              until any running shell function completes. */
3982           if (pipe_out == NO_PIPE && variable_context == 0)     /* XXX */
3983             unlink_fifo_list ();                /* XXX */
3984 #endif
3985           command_line = (char *)NULL;      /* don't free this. */
3986           bind_lastarg ((char *)NULL);
3987           return (result);
3988         }
3989     }
3990
3991   /* If we are re-running this as the result of executing the `command'
3992      builtin, do not expand the command words a second time. */
3993   if ((simple_command->flags & CMD_INHIBIT_EXPANSION) == 0)
3994     {
3995       current_fds_to_close = fds_to_close;
3996       fix_assignment_words (simple_command->words);
3997       /* Pass the ignore return flag down to command substitutions */
3998       if (simple_command->flags & CMD_IGNORE_RETURN)    /* XXX */
3999         comsub_ignore_return++;
4000       words = expand_words (simple_command->words);
4001       if (simple_command->flags & CMD_IGNORE_RETURN)
4002         comsub_ignore_return--;
4003       current_fds_to_close = (struct fd_bitmap *)NULL;
4004     }
4005   else
4006     words = copy_word_list (simple_command->words);
4007
4008   /* It is possible for WORDS not to have anything left in it.
4009      Perhaps all the words consisted of `$foo', and there was
4010      no variable `$foo'. */
4011   if (words == 0)
4012     {
4013       this_command_name = 0;
4014       result = execute_null_command (simple_command->redirects,
4015                                      pipe_in, pipe_out,
4016                                      already_forked ? 0 : async);
4017       if (already_forked)
4018         exit (result);
4019       else
4020         {
4021           bind_lastarg ((char *)NULL);
4022           set_pipestatus_from_exit (result);
4023           return (result);
4024         }
4025     }
4026
4027   lastarg = (char *)NULL;
4028
4029   begin_unwind_frame ("simple-command");
4030
4031   if (echo_command_at_execute)
4032     xtrace_print_word_list (words, 1);
4033
4034   builtin = (sh_builtin_func_t *)NULL;
4035   func = (SHELL_VAR *)NULL;
4036   if ((simple_command->flags & CMD_NO_FUNCTIONS) == 0)
4037     {
4038       /* Posix.2 says special builtins are found before functions.  We
4039          don't set builtin_is_special anywhere other than here, because
4040          this path is followed only when the `command' builtin is *not*
4041          being used, and we don't want to exit the shell if a special
4042          builtin executed with `command builtin' fails.  `command' is not
4043          a special builtin. */
4044       if (posixly_correct)
4045         {
4046           builtin = find_special_builtin (words->word->word);
4047           if (builtin)
4048             builtin_is_special = 1;
4049         }
4050       if (builtin == 0)
4051         func = find_function (words->word->word);
4052     }
4053
4054   /* In POSIX mode, assignment errors in the temporary environment cause a
4055      non-interactive shell to exit. */
4056   if (posixly_correct && builtin_is_special && interactive_shell == 0 && tempenv_assign_error)
4057     {
4058       last_command_exit_value = EXECUTION_FAILURE;
4059       jump_to_top_level (ERREXIT);
4060     }
4061   tempenv_assign_error = 0;     /* don't care about this any more */
4062
4063   add_unwind_protect (dispose_words, words);
4064   QUIT;
4065
4066   /* Bind the last word in this command to "$_" after execution. */
4067   for (lastword = words; lastword->next; lastword = lastword->next)
4068     ;
4069   lastarg = lastword->word->word;
4070
4071 #if defined (JOB_CONTROL)
4072   /* Is this command a job control related thing? */
4073   if (words->word->word[0] == '%' && already_forked == 0)
4074     {
4075       this_command_name = async ? "bg" : "fg";
4076       last_shell_builtin = this_shell_builtin;
4077       this_shell_builtin = builtin_address (this_command_name);
4078       result = (*this_shell_builtin) (words);
4079       goto return_result;
4080     }
4081
4082   /* One other possibililty.  The user may want to resume an existing job.
4083      If they do, find out whether this word is a candidate for a running
4084      job. */
4085   if (job_control && already_forked == 0 && async == 0 &&
4086         !first_word_quoted &&
4087         !words->next &&
4088         words->word->word[0] &&
4089         !simple_command->redirects &&
4090         pipe_in == NO_PIPE &&
4091         pipe_out == NO_PIPE &&
4092         (temp = get_string_value ("auto_resume")))
4093     {
4094       int job, jflags, started_status;
4095
4096       jflags = JM_STOPPED|JM_FIRSTMATCH;
4097       if (STREQ (temp, "exact"))
4098         jflags |= JM_EXACT;
4099       else if (STREQ (temp, "substring"))
4100         jflags |= JM_SUBSTRING;
4101       else
4102         jflags |= JM_PREFIX;
4103       job = get_job_by_name (words->word->word, jflags);
4104       if (job != NO_JOB)
4105         {
4106           run_unwind_frame ("simple-command");
4107           this_command_name = "fg";
4108           last_shell_builtin = this_shell_builtin;
4109           this_shell_builtin = builtin_address ("fg");
4110
4111           started_status = start_job (job, 1);
4112           return ((started_status < 0) ? EXECUTION_FAILURE : started_status);
4113         }
4114     }
4115 #endif /* JOB_CONTROL */
4116
4117 run_builtin:
4118   /* Remember the name of this command globally. */
4119   this_command_name = words->word->word;
4120
4121   QUIT;
4122
4123   /* This command could be a shell builtin or a user-defined function.
4124      We have already found special builtins by this time, so we do not
4125      set builtin_is_special.  If this is a function or builtin, and we
4126      have pipes, then fork a subshell in here.  Otherwise, just execute
4127      the command directly. */
4128   if (func == 0 && builtin == 0)
4129     builtin = find_shell_builtin (this_command_name);
4130
4131   last_shell_builtin = this_shell_builtin;
4132   this_shell_builtin = builtin;
4133
4134   if (builtin || func)
4135     {
4136       if (builtin)
4137         {
4138           old_builtin = executing_builtin;
4139           old_command_builtin = executing_command_builtin;
4140           unwind_protect_int (executing_builtin);       /* modified in execute_builtin */
4141           unwind_protect_int (executing_command_builtin);       /* ditto */
4142         }
4143       if (already_forked)
4144         {
4145           /* reset_terminating_signals (); */   /* XXX */
4146           /* Reset the signal handlers in the child, but don't free the
4147              trap strings.  Set a flag noting that we have to free the
4148              trap strings if we run trap to change a signal disposition. */
4149           reset_signal_handlers ();
4150           subshell_environment |= SUBSHELL_RESETTRAP;
4151
4152           if (async)
4153             {
4154               if ((simple_command->flags & CMD_STDIN_REDIR) &&
4155                     pipe_in == NO_PIPE &&
4156                     (stdin_redirects (simple_command->redirects) == 0))
4157                 async_redirect_stdin ();
4158               setup_async_signals ();
4159             }
4160
4161           subshell_level++;
4162           execute_subshell_builtin_or_function
4163             (words, simple_command->redirects, builtin, func,
4164              pipe_in, pipe_out, async, fds_to_close,
4165              simple_command->flags);
4166           subshell_level--;
4167         }
4168       else
4169         {
4170           result = execute_builtin_or_function
4171             (words, builtin, func, simple_command->redirects, fds_to_close,
4172              simple_command->flags);
4173           if (builtin)
4174             {
4175               if (result > EX_SHERRBASE)
4176                 {
4177                   switch (result)
4178                     {
4179                     case EX_REDIRFAIL:
4180                     case EX_BADASSIGN:
4181                     case EX_EXPFAIL:
4182                       /* These errors cause non-interactive posix mode shells to exit */
4183                       if (posixly_correct && builtin_is_special && interactive_shell == 0)
4184                         {
4185                           last_command_exit_value = EXECUTION_FAILURE;
4186                           jump_to_top_level (ERREXIT);
4187                         }
4188                     }
4189                   result = builtin_status (result);
4190                   if (builtin_is_special)
4191                     special_builtin_failed = 1;
4192                 }
4193               /* In POSIX mode, if there are assignment statements preceding
4194                  a special builtin, they persist after the builtin
4195                  completes. */
4196               if (posixly_correct && builtin_is_special && temporary_env)
4197                 merge_temporary_env ();
4198             }
4199           else          /* function */
4200             {
4201               if (result == EX_USAGE)
4202                 result = EX_BADUSAGE;
4203               else if (result > EX_SHERRBASE)
4204                 result = EXECUTION_FAILURE;
4205             }
4206
4207           set_pipestatus_from_exit (result);
4208
4209           goto return_result;
4210         }
4211     }
4212
4213   if (autocd && interactive && words->word && is_dirname (words->word->word))
4214     {
4215       words = make_word_list (make_word ("cd"), words);
4216       xtrace_print_word_list (words, 0);
4217       goto run_builtin;
4218     }
4219
4220   if (command_line == 0)
4221     command_line = savestring (the_printed_command_except_trap ? the_printed_command_except_trap : "");
4222
4223 #if defined (PROCESS_SUBSTITUTION)
4224   if ((subshell_environment & SUBSHELL_COMSUB) && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0)
4225     simple_command->flags &= ~CMD_NO_FORK;
4226 #endif
4227
4228   result = execute_disk_command (words, simple_command->redirects, command_line,
4229                         pipe_in, pipe_out, async, fds_to_close,
4230                         simple_command->flags);
4231
4232  return_result:
4233   bind_lastarg (lastarg);
4234   FREE (command_line);
4235   dispose_words (words);
4236   if (builtin)
4237     {
4238       executing_builtin = old_builtin;
4239       executing_command_builtin = old_command_builtin;
4240     }
4241   discard_unwind_frame ("simple-command");
4242   this_command_name = (char *)NULL;     /* points to freed memory now */
4243   return (result);
4244 }
4245
4246 /* Translate the special builtin exit statuses.  We don't really need a
4247    function for this; it's a placeholder for future work. */
4248 static int
4249 builtin_status (result)
4250      int result;
4251 {
4252   int r;
4253
4254   switch (result)
4255     {
4256     case EX_USAGE:
4257       r = EX_BADUSAGE;
4258       break;
4259     case EX_REDIRFAIL:
4260     case EX_BADSYNTAX:
4261     case EX_BADASSIGN:
4262     case EX_EXPFAIL:
4263       r = EXECUTION_FAILURE;
4264       break;
4265     default:
4266       r = EXECUTION_SUCCESS;
4267       break;
4268     }
4269   return (r);
4270 }
4271
4272 static int
4273 execute_builtin (builtin, words, flags, subshell)
4274      sh_builtin_func_t *builtin;
4275      WORD_LIST *words;
4276      int flags, subshell;
4277 {
4278   int old_e_flag, result, eval_unwind;
4279   int isbltinenv;
4280   char *error_trap;
4281
4282   error_trap = 0;
4283   old_e_flag = exit_immediately_on_error;
4284   
4285   /* The eval builtin calls parse_and_execute, which does not know about
4286      the setting of flags, and always calls the execution functions with
4287      flags that will exit the shell on an error if -e is set.  If the
4288      eval builtin is being called, and we're supposed to ignore the exit
4289      value of the command, we turn the -e flag off ourselves and disable
4290      the ERR trap, then restore them when the command completes.  This is
4291      also a problem (as below) for the command and source/. builtins. */
4292   if (subshell == 0 && (flags & CMD_IGNORE_RETURN) &&
4293         (builtin == eval_builtin || builtin == command_builtin || builtin == source_builtin))
4294     {
4295       begin_unwind_frame ("eval_builtin");
4296       unwind_protect_int (exit_immediately_on_error);
4297       unwind_protect_int (builtin_ignoring_errexit);
4298       error_trap = TRAP_STRING (ERROR_TRAP);
4299       if (error_trap)
4300         {
4301           error_trap = savestring (error_trap);
4302           add_unwind_protect (xfree, error_trap);
4303           add_unwind_protect (set_error_trap, error_trap);
4304           restore_default_signal (ERROR_TRAP);
4305         }
4306       exit_immediately_on_error = 0;
4307       builtin_ignoring_errexit = 1;
4308       eval_unwind = 1;
4309     }
4310   else
4311     eval_unwind = 0;
4312
4313   /* The temporary environment for a builtin is supposed to apply to
4314      all commands executed by that builtin.  Currently, this is a
4315      problem only with the `unset', `source' and `eval' builtins.
4316      `mapfile' is a special case because it uses evalstring (same as
4317      eval or source) to run its callbacks. */
4318   isbltinenv = (builtin == source_builtin || builtin == eval_builtin || builtin == unset_builtin || builtin == mapfile_builtin);
4319
4320   if (isbltinenv)
4321     {
4322       if (subshell == 0)
4323         begin_unwind_frame ("builtin_env");
4324
4325       if (temporary_env)
4326         {
4327           push_scope (VC_BLTNENV, temporary_env);
4328           if (subshell == 0)
4329             add_unwind_protect (pop_scope, (flags & CMD_COMMAND_BUILTIN) ? 0 : "1");
4330           temporary_env = (HASH_TABLE *)NULL;     
4331         }
4332     }
4333
4334   /* `return' does a longjmp() back to a saved environment in execute_function.
4335      If a variable assignment list preceded the command, and the shell is
4336      running in POSIX mode, we need to merge that into the shell_variables
4337      table, since `return' is a POSIX special builtin. */
4338   if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
4339     {
4340       begin_unwind_frame ("return_temp_env");
4341       add_unwind_protect (merge_temporary_env, (char *)NULL);
4342     }
4343
4344   executing_builtin++;
4345   executing_command_builtin |= builtin == command_builtin;
4346   result = ((*builtin) (words->next));
4347
4348   /* This shouldn't happen, but in case `return' comes back instead of
4349      longjmp'ing, we need to unwind. */
4350   if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
4351     discard_unwind_frame ("return_temp_env");
4352
4353   if (subshell == 0 && isbltinenv)
4354     run_unwind_frame ("builtin_env");
4355
4356   if (eval_unwind)
4357     {
4358       exit_immediately_on_error = errexit_flag;
4359       builtin_ignoring_errexit = 0;
4360       if (error_trap)
4361         {
4362           set_error_trap (error_trap);
4363           xfree (error_trap);
4364         }
4365       discard_unwind_frame ("eval_builtin");
4366     }
4367
4368   return (result);
4369 }
4370
4371 static int
4372 execute_function (var, words, flags, fds_to_close, async, subshell)
4373      SHELL_VAR *var;
4374      WORD_LIST *words;
4375      int flags;
4376      struct fd_bitmap *fds_to_close;
4377      int async, subshell;
4378 {
4379   int return_val, result;
4380   COMMAND *tc, *fc, *save_current;
4381   char *debug_trap, *error_trap, *return_trap;
4382 #if defined (ARRAY_VARS)
4383   SHELL_VAR *funcname_v, *nfv, *bash_source_v, *bash_lineno_v;
4384   ARRAY *funcname_a;
4385   volatile ARRAY *bash_source_a;
4386   volatile ARRAY *bash_lineno_a;
4387 #endif
4388   FUNCTION_DEF *shell_fn;
4389   char *sfile, *t;
4390
4391   USE_VAR(fc);
4392
4393   if (funcnest_max > 0 && funcnest >= funcnest_max)
4394     {
4395       internal_error (_("%s: maximum function nesting level exceeded (%d)"), var->name, funcnest);
4396       funcnest = 0;     /* XXX - should we reset it somewhere else? */
4397       jump_to_top_level (DISCARD);
4398     }
4399
4400 #if defined (ARRAY_VARS)
4401   GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v, funcname_a);
4402   GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
4403   GET_ARRAY_FROM_VAR ("BASH_LINENO", bash_lineno_v, bash_lineno_a);
4404 #endif
4405
4406   tc = (COMMAND *)copy_command (function_cell (var));
4407   if (tc && (flags & CMD_IGNORE_RETURN))
4408     tc->flags |= CMD_IGNORE_RETURN;
4409
4410   if (subshell == 0)
4411     {
4412       begin_unwind_frame ("function_calling");
4413       push_context (var->name, subshell, temporary_env);
4414       add_unwind_protect (pop_context, (char *)NULL);
4415       unwind_protect_int (line_number);
4416       unwind_protect_int (return_catch_flag);
4417       unwind_protect_jmp_buf (return_catch);
4418       add_unwind_protect (dispose_command, (char *)tc);
4419       unwind_protect_pointer (this_shell_function);
4420       unwind_protect_int (loop_level);
4421       unwind_protect_int (funcnest);
4422     }
4423   else
4424     push_context (var->name, subshell, temporary_env);  /* don't unwind-protect for subshells */
4425
4426   temporary_env = (HASH_TABLE *)NULL;
4427
4428   this_shell_function = var;
4429   make_funcname_visible (1);
4430
4431   debug_trap = TRAP_STRING(DEBUG_TRAP);
4432   error_trap = TRAP_STRING(ERROR_TRAP);
4433   return_trap = TRAP_STRING(RETURN_TRAP);
4434   
4435   /* The order of the unwind protects for debug_trap, error_trap and
4436      return_trap is important here!  unwind-protect commands are run
4437      in reverse order of registration.  If this causes problems, take
4438      out the xfree unwind-protect calls and live with the small memory leak. */
4439
4440   /* function_trace_mode != 0 means that all functions inherit the DEBUG trap.
4441      if the function has the trace attribute set, it inherits the DEBUG trap */
4442   if (debug_trap && ((trace_p (var) == 0) && function_trace_mode == 0))
4443     {
4444       if (subshell == 0)
4445         {
4446           debug_trap = savestring (debug_trap);
4447           add_unwind_protect (xfree, debug_trap);
4448           add_unwind_protect (set_debug_trap, debug_trap);
4449         }
4450       restore_default_signal (DEBUG_TRAP);
4451     }
4452
4453   /* error_trace_mode != 0 means that functions inherit the ERR trap. */
4454   if (error_trap && error_trace_mode == 0)
4455     {
4456       if (subshell == 0)
4457         {
4458           error_trap = savestring (error_trap);
4459           add_unwind_protect (xfree, error_trap);
4460           add_unwind_protect (set_error_trap, error_trap);
4461         }
4462       restore_default_signal (ERROR_TRAP);
4463     }
4464
4465   /* Shell functions inherit the RETURN trap if function tracing is on
4466      globally or on individually for this function. */
4467 #if 0
4468   if (return_trap && ((trace_p (var) == 0) && function_trace_mode == 0))
4469 #else
4470   if (return_trap && (signal_in_progress (DEBUG_TRAP) || ((trace_p (var) == 0) && function_trace_mode == 0)))
4471 #endif
4472     {
4473       if (subshell == 0)
4474         {
4475           return_trap = savestring (return_trap);
4476           add_unwind_protect (xfree, return_trap);
4477           add_unwind_protect (set_return_trap, return_trap);
4478         }
4479       restore_default_signal (RETURN_TRAP);
4480     }
4481   
4482   funcnest++;
4483 #if defined (ARRAY_VARS)
4484   /* This is quite similar to the code in shell.c and elsewhere. */
4485   shell_fn = find_function_def (this_shell_function->name);
4486   sfile = shell_fn ? shell_fn->source_file : "";
4487   array_push ((ARRAY *)funcname_a, this_shell_function->name);
4488
4489   array_push ((ARRAY *)bash_source_a, sfile);
4490   t = itos (executing_line_number ());
4491   array_push ((ARRAY *)bash_lineno_a, t);
4492   free (t);
4493 #endif
4494
4495   /* The temporary environment for a function is supposed to apply to
4496      all commands executed within the function body. */
4497
4498   remember_args (words->next, 1);
4499
4500   /* Update BASH_ARGV and BASH_ARGC */
4501   if (debugging_mode)
4502     push_args (words->next);
4503
4504   /* Number of the line on which the function body starts. */
4505   line_number = function_line_number = tc->line;
4506
4507 #if defined (JOB_CONTROL)
4508   if (subshell)
4509     stop_pipeline (async, (COMMAND *)NULL);
4510 #endif
4511
4512   fc = tc;
4513
4514   return_catch_flag++;
4515   return_val = setjmp_nosigs (return_catch);
4516
4517   if (return_val)
4518     {
4519       result = return_catch_value;
4520       /* Run the RETURN trap in the function's context. */
4521       save_current = currently_executing_command;
4522       run_return_trap ();
4523       currently_executing_command = save_current;
4524     }
4525   else
4526     {
4527       /* Run the debug trap here so we can trap at the start of a function's
4528          execution rather than the execution of the body's first command. */
4529       showing_function_line = 1;
4530       save_current = currently_executing_command;
4531       result = run_debug_trap ();
4532 #if defined (DEBUGGER)
4533       /* In debugging mode, if the DEBUG trap returns a non-zero status, we
4534          skip the command. */
4535       if (debugging_mode == 0 || result == EXECUTION_SUCCESS)
4536         {
4537           showing_function_line = 0;
4538           currently_executing_command = save_current;
4539           result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);
4540
4541           /* Run the RETURN trap in the function's context */
4542           save_current = currently_executing_command;
4543           run_return_trap ();
4544           currently_executing_command = save_current;
4545         }
4546 #else
4547       result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);
4548
4549       save_current = currently_executing_command;
4550       run_return_trap ();
4551       currently_executing_command = save_current;
4552 #endif
4553       showing_function_line = 0;
4554     }
4555
4556   /* Restore BASH_ARGC and BASH_ARGV */
4557   if (debugging_mode)
4558     pop_args ();
4559
4560   if (subshell == 0)
4561     run_unwind_frame ("function_calling");
4562
4563 #if defined (ARRAY_VARS)
4564   /* These two variables cannot be unset, and cannot be affected by the
4565      function. */
4566   array_pop ((ARRAY *)bash_source_a);
4567   array_pop ((ARRAY *)bash_lineno_a);
4568
4569   /* FUNCNAME can be unset, and so can potentially be changed by the
4570      function. */
4571   GET_ARRAY_FROM_VAR ("FUNCNAME", nfv, funcname_a);
4572   if (nfv == funcname_v)
4573     array_pop (funcname_a);
4574 #endif
4575   
4576   if (variable_context == 0 || this_shell_function == 0)
4577     {
4578       make_funcname_visible (0);
4579 #if defined (PROCESS_SUBSTITUTION)
4580       unlink_fifo_list ();
4581 #endif
4582     }
4583   
4584   return (result);
4585 }
4586
4587 /* A convenience routine for use by other parts of the shell to execute
4588    a particular shell function. */
4589 int
4590 execute_shell_function (var, words)
4591      SHELL_VAR *var;
4592      WORD_LIST *words;
4593 {
4594   int ret;
4595   struct fd_bitmap *bitmap;
4596
4597   bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);
4598   begin_unwind_frame ("execute-shell-function");
4599   add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);
4600       
4601   ret = execute_function (var, words, 0, bitmap, 0, 0);
4602
4603   dispose_fd_bitmap (bitmap);
4604   discard_unwind_frame ("execute-shell-function");
4605
4606   return ret;
4607 }
4608
4609 /* Execute a shell builtin or function in a subshell environment.  This
4610    routine does not return; it only calls exit().  If BUILTIN is non-null,
4611    it points to a function to call to execute a shell builtin; otherwise
4612    VAR points at the body of a function to execute.  WORDS is the arguments
4613    to the command, REDIRECTS specifies redirections to perform before the
4614    command is executed. */
4615 static void
4616 execute_subshell_builtin_or_function (words, redirects, builtin, var,
4617                                       pipe_in, pipe_out, async, fds_to_close,
4618                                       flags)
4619      WORD_LIST *words;
4620      REDIRECT *redirects;
4621      sh_builtin_func_t *builtin;
4622      SHELL_VAR *var;
4623      int pipe_in, pipe_out, async;
4624      struct fd_bitmap *fds_to_close;
4625      int flags;
4626 {
4627   int result, r, funcvalue;
4628 #if defined (JOB_CONTROL)
4629   int jobs_hack;
4630
4631   jobs_hack = (builtin == jobs_builtin) &&
4632                 ((subshell_environment & SUBSHELL_ASYNC) == 0 || pipe_out != NO_PIPE);
4633 #endif
4634
4635   /* A subshell is neither a login shell nor interactive. */
4636   login_shell = interactive = 0;
4637
4638   if (async)
4639     subshell_environment |= SUBSHELL_ASYNC;
4640   if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
4641     subshell_environment |= SUBSHELL_PIPE;
4642
4643   maybe_make_export_env ();     /* XXX - is this needed? */
4644
4645 #if defined (JOB_CONTROL)
4646   /* Eradicate all traces of job control after we fork the subshell, so
4647      all jobs begun by this subshell are in the same process group as
4648      the shell itself. */
4649
4650   /* Allow the output of `jobs' to be piped. */
4651   if (jobs_hack)
4652     kill_current_pipeline ();
4653   else
4654     without_job_control ();
4655
4656   set_sigchld_handler ();
4657 #endif /* JOB_CONTROL */
4658
4659   set_sigint_handler ();
4660
4661   if (fds_to_close)
4662     close_fd_bitmap (fds_to_close);
4663
4664   do_piping (pipe_in, pipe_out);
4665
4666   if (do_redirections (redirects, RX_ACTIVE) != 0)
4667     exit (EXECUTION_FAILURE);
4668
4669   if (builtin)
4670     {
4671       /* Give builtins a place to jump back to on failure,
4672          so we don't go back up to main(). */
4673       result = setjmp_nosigs (top_level);
4674
4675       /* Give the return builtin a place to jump to when executed in a subshell
4676          or pipeline */
4677       funcvalue = 0;
4678       if (return_catch_flag && builtin == return_builtin)
4679         funcvalue = setjmp_nosigs (return_catch);
4680
4681       if (result == EXITPROG)
4682         exit (last_command_exit_value);
4683       else if (result)
4684         exit (EXECUTION_FAILURE);
4685       else if (funcvalue)
4686         exit (return_catch_value);
4687       else
4688         {
4689           r = execute_builtin (builtin, words, flags, 1);
4690           fflush (stdout);
4691           if (r == EX_USAGE)
4692             r = EX_BADUSAGE;
4693           exit (r);
4694         }
4695     }
4696   else
4697     {
4698       r = execute_function (var, words, flags, fds_to_close, async, 1);
4699       fflush (stdout);
4700       exit (r);
4701     }
4702 }
4703
4704 /* Execute a builtin or function in the current shell context.  If BUILTIN
4705    is non-null, it is the builtin command to execute, otherwise VAR points
4706    to the body of a function.  WORDS are the command's arguments, REDIRECTS
4707    are the redirections to perform.  FDS_TO_CLOSE is the usual bitmap of
4708    file descriptors to close.
4709
4710    If BUILTIN is exec_builtin, the redirections specified in REDIRECTS are
4711    not undone before this function returns. */
4712 static int
4713 execute_builtin_or_function (words, builtin, var, redirects,
4714                              fds_to_close, flags)
4715      WORD_LIST *words;
4716      sh_builtin_func_t *builtin;
4717      SHELL_VAR *var;
4718      REDIRECT *redirects;
4719      struct fd_bitmap *fds_to_close;
4720      int flags;
4721 {
4722   int result;
4723   REDIRECT *saved_undo_list;
4724 #if defined (PROCESS_SUBSTITUTION)
4725   int ofifo, nfifo, osize;
4726   char *ofifo_list;
4727 #endif
4728
4729
4730 #if defined (PROCESS_SUBSTITUTION)  
4731   ofifo = num_fifos ();
4732   ofifo_list = copy_fifo_list (&osize);
4733 #endif
4734
4735   if (do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
4736     {
4737       cleanup_redirects (redirection_undo_list);
4738       redirection_undo_list = (REDIRECT *)NULL;
4739       dispose_exec_redirects ();
4740 #if defined (PROCESS_SUBSTITUTION)
4741       free (ofifo_list);
4742 #endif
4743       return (EX_REDIRFAIL);    /* was EXECUTION_FAILURE */
4744     }
4745
4746   saved_undo_list = redirection_undo_list;
4747
4748   /* Calling the "exec" builtin changes redirections forever. */
4749   if (builtin == exec_builtin)
4750     {
4751       dispose_redirects (saved_undo_list);
4752       saved_undo_list = exec_redirection_undo_list;
4753       exec_redirection_undo_list = (REDIRECT *)NULL;
4754     }
4755   else
4756     dispose_exec_redirects ();
4757
4758   if (saved_undo_list)
4759     {
4760       begin_unwind_frame ("saved redirects");
4761       add_unwind_protect (cleanup_redirects, (char *)saved_undo_list);
4762     }
4763
4764   redirection_undo_list = (REDIRECT *)NULL;
4765
4766   if (builtin)
4767     result = execute_builtin (builtin, words, flags, 0);
4768   else
4769     result = execute_function (var, words, flags, fds_to_close, 0, 0);
4770
4771   /* We do this before undoing the effects of any redirections. */
4772   fflush (stdout);
4773   fpurge (stdout);
4774   if (ferror (stdout))
4775     clearerr (stdout);  
4776
4777   /* If we are executing the `command' builtin, but this_shell_builtin is
4778      set to `exec_builtin', we know that we have something like
4779      `command exec [redirection]', since otherwise `exec' would have
4780      overwritten the shell and we wouldn't get here.  In this case, we
4781      want to behave as if the `command' builtin had not been specified
4782      and preserve the redirections. */
4783   if (builtin == command_builtin && this_shell_builtin == exec_builtin)
4784     {
4785       int discard;
4786
4787       discard = 0;
4788       if (saved_undo_list)
4789         {
4790           dispose_redirects (saved_undo_list);
4791           discard = 1;
4792         }
4793       redirection_undo_list = exec_redirection_undo_list;
4794       saved_undo_list = exec_redirection_undo_list = (REDIRECT *)NULL;      
4795       if (discard)
4796         discard_unwind_frame ("saved redirects");
4797     }
4798
4799   if (saved_undo_list)
4800     {
4801       redirection_undo_list = saved_undo_list;
4802       discard_unwind_frame ("saved redirects");
4803     }
4804
4805   if (redirection_undo_list)
4806     {
4807       cleanup_redirects (redirection_undo_list);
4808       redirection_undo_list = (REDIRECT *)NULL;
4809     }
4810
4811 #if defined (PROCESS_SUBSTITUTION)
4812   /* Close any FIFOs created by this builtin or function. */
4813   nfifo = num_fifos ();
4814   if (nfifo > ofifo)
4815     close_new_fifos (ofifo_list, osize);
4816   free (ofifo_list);
4817 #endif
4818
4819   return (result);
4820 }
4821
4822 void
4823 setup_async_signals ()
4824 {
4825 #if defined (__BEOS__)
4826   set_signal_handler (SIGHUP, SIG_IGN); /* they want csh-like behavior */
4827 #endif
4828
4829 #if defined (JOB_CONTROL)
4830   if (job_control == 0)
4831 #endif
4832     {
4833       /* Make sure we get the original signal dispositions now so we don't
4834          confuse the trap builtin later if the subshell tries to use it to
4835          reset SIGINT/SIGQUIT.  Don't call set_signal_ignored; that sets
4836          the value of original_signals to SIG_IGN. Posix interpretation 751. */
4837       get_original_signal (SIGINT);
4838       set_signal_handler (SIGINT, SIG_IGN);
4839
4840       get_original_signal (SIGQUIT);
4841       set_signal_handler (SIGQUIT, SIG_IGN);
4842     }
4843 }
4844
4845 /* Execute a simple command that is hopefully defined in a disk file
4846    somewhere.
4847
4848    1) fork ()
4849    2) connect pipes
4850    3) look up the command
4851    4) do redirections
4852    5) execve ()
4853    6) If the execve failed, see if the file has executable mode set.
4854    If so, and it isn't a directory, then execute its contents as
4855    a shell script.
4856
4857    Note that the filename hashing stuff has to take place up here,
4858    in the parent.  This is probably why the Bourne style shells
4859    don't handle it, since that would require them to go through
4860    this gnarly hair, for no good reason.
4861
4862    NOTE: callers expect this to fork or exit(). */
4863
4864 /* Name of a shell function to call when a command name is not found. */
4865 #ifndef NOTFOUND_HOOK
4866 #  define NOTFOUND_HOOK "command_not_found_handle"
4867 #endif
4868
4869 static int
4870 execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
4871                       async, fds_to_close, cmdflags)
4872      WORD_LIST *words;
4873      REDIRECT *redirects;
4874      char *command_line;
4875      int pipe_in, pipe_out, async;
4876      struct fd_bitmap *fds_to_close;
4877      int cmdflags;
4878 {
4879   char *pathname, *command, **args;
4880   int nofork, result;
4881   pid_t pid;
4882   SHELL_VAR *hookf;
4883   WORD_LIST *wl;
4884
4885   nofork = (cmdflags & CMD_NO_FORK);  /* Don't fork, just exec, if no pipes */
4886   pathname = words->word->word;
4887
4888   result = EXECUTION_SUCCESS;
4889 #if defined (RESTRICTED_SHELL)
4890   command = (char *)NULL;
4891   if (restricted && mbschr (pathname, '/'))
4892     {
4893       internal_error (_("%s: restricted: cannot specify `/' in command names"),
4894                     pathname);
4895       result = last_command_exit_value = EXECUTION_FAILURE;
4896
4897       /* If we're not going to fork below, we must already be in a child
4898          process or a context in which it's safe to call exit(2).  */
4899       if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
4900         exit (last_command_exit_value);
4901       else
4902         goto parent_return;
4903     }
4904 #endif /* RESTRICTED_SHELL */
4905
4906   command = search_for_command (pathname, 1);
4907
4908   if (command)
4909     {
4910       maybe_make_export_env ();
4911       put_command_name_into_env (command);
4912     }
4913
4914   /* We have to make the child before we check for the non-existence
4915      of COMMAND, since we want the error messages to be redirected. */
4916   /* If we can get away without forking and there are no pipes to deal with,
4917      don't bother to fork, just directly exec the command. */
4918   if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
4919     pid = 0;
4920   else
4921     pid = make_child (savestring (command_line), async);
4922
4923   if (pid == 0)
4924     {
4925       int old_interactive;
4926
4927       reset_terminating_signals ();     /* XXX */
4928       /* Cancel traps, in trap.c. */
4929       restore_original_signals ();
4930
4931       CHECK_SIGTERM;
4932
4933       /* restore_original_signals may have undone the work done
4934          by make_child to ensure that SIGINT and SIGQUIT are ignored
4935          in asynchronous children. */
4936       if (async)
4937         {
4938           if ((cmdflags & CMD_STDIN_REDIR) &&
4939                 pipe_in == NO_PIPE &&
4940                 (stdin_redirects (redirects) == 0))
4941             async_redirect_stdin ();
4942           setup_async_signals ();
4943         }
4944
4945       /* This functionality is now provided by close-on-exec of the
4946          file descriptors manipulated by redirection and piping.
4947          Some file descriptors still need to be closed in all children
4948          because of the way bash does pipes; fds_to_close is a
4949          bitmap of all such file descriptors. */
4950       if (fds_to_close)
4951         close_fd_bitmap (fds_to_close);
4952
4953       do_piping (pipe_in, pipe_out);
4954
4955       old_interactive = interactive;
4956       if (async)
4957         interactive = 0;
4958
4959       subshell_environment = SUBSHELL_FORK;
4960
4961       if (redirects && (do_redirections (redirects, RX_ACTIVE) != 0))
4962         {
4963 #if defined (PROCESS_SUBSTITUTION)
4964           /* Try to remove named pipes that may have been created as the
4965              result of redirections. */
4966           unlink_fifo_list ();
4967 #endif /* PROCESS_SUBSTITUTION */
4968           exit (EXECUTION_FAILURE);
4969         }
4970
4971       if (async)
4972         interactive = old_interactive;
4973
4974       if (command == 0)
4975         {
4976           hookf = find_function (NOTFOUND_HOOK);
4977           if (hookf == 0)
4978             {
4979               /* Make sure filenames are displayed using printable characters */
4980               if (ansic_shouldquote (pathname))
4981                 pathname = ansic_quote (pathname, 0, NULL);
4982               internal_error (_("%s: command not found"), pathname);
4983               exit (EX_NOTFOUND);       /* Posix.2 says the exit status is 127 */
4984             }
4985
4986 #if defined (JOB_CONTROL)
4987           /* May need to reinitialize more of the job control state here. */
4988           kill_current_pipeline ();
4989 #endif
4990
4991           wl = make_word_list (make_word (NOTFOUND_HOOK), words);
4992           exit (execute_shell_function (hookf, wl));
4993         }
4994
4995       CHECK_SIGTERM;
4996
4997       /* Execve expects the command name to be in args[0].  So we
4998          leave it there, in the same format that the user used to
4999          type it in. */
5000       args = strvec_from_word_list (words, 0, 0, (int *)NULL);
5001       exit (shell_execve (command, args, export_env));
5002     }
5003   else
5004     {
5005 parent_return:
5006       QUIT;
5007
5008       /* Make sure that the pipes are closed in the parent. */
5009       close_pipes (pipe_in, pipe_out);
5010 #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
5011       if (variable_context == 0)
5012         unlink_fifo_list ();
5013 #endif
5014       FREE (command);
5015       return (result);
5016     }
5017 }
5018
5019 /* CPP defines to decide whether a particular index into the #! line
5020    corresponds to a valid interpreter name or argument character, or
5021    whitespace.  The MSDOS define is to allow \r to be treated the same
5022    as \n. */
5023
5024 #if !defined (MSDOS)
5025 #  define STRINGCHAR(ind) \
5026     (ind < sample_len && !whitespace (sample[ind]) && sample[ind] != '\n')
5027 #  define WHITECHAR(ind) \
5028     (ind < sample_len && whitespace (sample[ind]))
5029 #else   /* MSDOS */
5030 #  define STRINGCHAR(ind) \
5031     (ind < sample_len && !whitespace (sample[ind]) && sample[ind] != '\n' && sample[ind] != '\r')
5032 #  define WHITECHAR(ind) \
5033     (ind < sample_len && whitespace (sample[ind]))
5034 #endif  /* MSDOS */
5035
5036 static char *
5037 getinterp (sample, sample_len, endp)
5038      char *sample;
5039      int sample_len, *endp;
5040 {
5041   register int i;
5042   char *execname;
5043   int start;
5044
5045   /* Find the name of the interpreter to exec. */
5046   for (i = 2; i < sample_len && whitespace (sample[i]); i++)
5047     ;
5048
5049   for (start = i; STRINGCHAR(i); i++)
5050     ;
5051
5052   execname = substring (sample, start, i);
5053
5054   if (endp)
5055     *endp = i;
5056   return execname;
5057 }
5058
5059 #if !defined (HAVE_HASH_BANG_EXEC)
5060 /* If the operating system on which we're running does not handle
5061    the #! executable format, then help out.  SAMPLE is the text read
5062    from the file, SAMPLE_LEN characters.  COMMAND is the name of
5063    the script; it and ARGS, the arguments given by the user, will
5064    become arguments to the specified interpreter.  ENV is the environment
5065    to pass to the interpreter.
5066
5067    The word immediately following the #! is the interpreter to execute.
5068    A single argument to the interpreter is allowed. */
5069
5070 static int
5071 execute_shell_script (sample, sample_len, command, args, env)
5072      char *sample;
5073      int sample_len;
5074      char *command;
5075      char **args, **env;
5076 {
5077   char *execname, *firstarg;
5078   int i, start, size_increment, larry;
5079
5080   /* Find the name of the interpreter to exec. */
5081   execname = getinterp (sample, sample_len, &i);
5082   size_increment = 1;
5083
5084   /* Now the argument, if any. */
5085   for (firstarg = (char *)NULL, start = i; WHITECHAR(i); i++)
5086     ;
5087
5088   /* If there is more text on the line, then it is an argument for the
5089      interpreter. */
5090
5091   if (STRINGCHAR(i))  
5092     {
5093       for (start = i; STRINGCHAR(i); i++)
5094         ;
5095       firstarg = substring ((char *)sample, start, i);
5096       size_increment = 2;
5097     }
5098
5099   larry = strvec_len (args) + size_increment;
5100   args = strvec_resize (args, larry + 1);
5101
5102   for (i = larry - 1; i; i--)
5103     args[i] = args[i - size_increment];
5104
5105   args[0] = execname;
5106   if (firstarg)
5107     {
5108       args[1] = firstarg;
5109       args[2] = command;
5110     }
5111   else
5112     args[1] = command;
5113
5114   args[larry] = (char *)NULL;
5115
5116   return (shell_execve (execname, args, env));
5117 }
5118 #undef STRINGCHAR
5119 #undef WHITECHAR
5120
5121 #endif /* !HAVE_HASH_BANG_EXEC */
5122
5123 static void
5124 initialize_subshell ()
5125 {
5126 #if defined (ALIAS)
5127   /* Forget about any aliases that we knew of.  We are in a subshell. */
5128   delete_all_aliases ();
5129 #endif /* ALIAS */
5130
5131 #if defined (HISTORY)
5132   /* Forget about the history lines we have read.  This is a non-interactive
5133      subshell. */
5134   history_lines_this_session = 0;
5135 #endif
5136
5137 #if defined (JOB_CONTROL)
5138   /* Forget about the way job control was working. We are in a subshell. */
5139   without_job_control ();
5140   set_sigchld_handler ();
5141   init_job_stats ();
5142 #endif /* JOB_CONTROL */
5143
5144   /* Reset the values of the shell flags and options. */
5145   reset_shell_flags ();
5146   reset_shell_options ();
5147   reset_shopt_options ();
5148
5149   /* Zero out builtin_env, since this could be a shell script run from a
5150      sourced file with a temporary environment supplied to the `source/.'
5151      builtin.  Such variables are not supposed to be exported (empirical
5152      testing with sh and ksh).  Just throw it away; don't worry about a
5153      memory leak. */
5154   if (vc_isbltnenv (shell_variables))
5155     shell_variables = shell_variables->down;
5156
5157   clear_unwind_protect_list (0);
5158   /* XXX -- are there other things we should be resetting here? */
5159   parse_and_execute_level = 0;          /* nothing left to restore it */
5160
5161   /* We're no longer inside a shell function. */
5162   variable_context = return_catch_flag = funcnest = 0;
5163
5164   executing_list = 0;           /* XXX */
5165
5166   /* If we're not interactive, close the file descriptor from which we're
5167      reading the current shell script. */
5168   if (interactive_shell == 0)
5169     unset_bash_input (0);
5170 }
5171
5172 #if defined (HAVE_SETOSTYPE) && defined (_POSIX_SOURCE)
5173 #  define SETOSTYPE(x)  __setostype(x)
5174 #else
5175 #  define SETOSTYPE(x)
5176 #endif
5177
5178 #define READ_SAMPLE_BUF(file, buf, len) \
5179   do \
5180     { \
5181       fd = open(file, O_RDONLY); \
5182       if (fd >= 0) \
5183         { \
5184           len = read (fd, buf, 80); \
5185           close (fd); \
5186         } \
5187       else \
5188         len = -1; \
5189     } \
5190   while (0)
5191       
5192 /* Call execve (), handling interpreting shell scripts, and handling
5193    exec failures. */
5194 int
5195 shell_execve (command, args, env)
5196      char *command;
5197      char **args, **env;
5198 {
5199   int larray, i, fd;
5200   char sample[80];
5201   int sample_len;
5202
5203   SETOSTYPE (0);                /* Some systems use for USG/POSIX semantics */
5204   execve (command, args, env);
5205   i = errno;                    /* error from execve() */
5206   CHECK_TERMSIG;
5207   SETOSTYPE (1);
5208
5209   /* If we get to this point, then start checking out the file.
5210      Maybe it is something we can hack ourselves. */
5211   if (i != ENOEXEC)
5212     {
5213       if (file_isdir (command))
5214 #if defined (EISDIR)
5215         internal_error (_("%s: %s"), command, strerror (EISDIR));
5216 #else
5217         internal_error (_("%s: is a directory"), command);
5218 #endif
5219       else if (executable_file (command) == 0)
5220         {
5221           errno = i;
5222           file_error (command);
5223         }
5224       /* errors not involving the path argument to execve. */
5225       else if (i == E2BIG || i == ENOMEM)
5226         {
5227           errno = i;
5228           file_error (command);
5229         }
5230       else
5231         {
5232           /* The file has the execute bits set, but the kernel refuses to
5233              run it for some reason.  See why. */
5234 #if defined (HAVE_HASH_BANG_EXEC)
5235           READ_SAMPLE_BUF (command, sample, sample_len);
5236           sample[sample_len - 1] = '\0';
5237           if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
5238             {
5239               char *interp;
5240               int ilen;
5241
5242               interp = getinterp (sample, sample_len, (int *)NULL);
5243               ilen = strlen (interp);
5244               errno = i;
5245               if (interp[ilen - 1] == '\r')
5246                 {
5247                   interp = xrealloc (interp, ilen + 2);
5248                   interp[ilen - 1] = '^';
5249                   interp[ilen] = 'M';
5250                   interp[ilen + 1] = '\0';
5251                 }
5252               sys_error (_("%s: %s: bad interpreter"), command, interp ? interp : "");
5253               FREE (interp);
5254               return (EX_NOEXEC);
5255             }
5256 #endif
5257           errno = i;
5258           file_error (command);
5259         }
5260       return ((i == ENOENT) ? EX_NOTFOUND : EX_NOEXEC); /* XXX Posix.2 says that exit status is 126 */
5261     }
5262
5263   /* This file is executable.
5264      If it begins with #!, then help out people with losing operating
5265      systems.  Otherwise, check to see if it is a binary file by seeing
5266      if the contents of the first line (or up to 80 characters) are in the
5267      ASCII set.  If it's a text file, execute the contents as shell commands,
5268      otherwise return 126 (EX_BINARY_FILE). */
5269   READ_SAMPLE_BUF (command, sample, sample_len);
5270
5271   if (sample_len == 0)
5272     return (EXECUTION_SUCCESS);
5273
5274   /* Is this supposed to be an executable script?
5275      If so, the format of the line is "#! interpreter [argument]".
5276      A single argument is allowed.  The BSD kernel restricts
5277      the length of the entire line to 32 characters (32 bytes
5278      being the size of the BSD exec header), but we allow 80
5279      characters. */
5280   if (sample_len > 0)
5281     {
5282 #if !defined (HAVE_HASH_BANG_EXEC)
5283       if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
5284         return (execute_shell_script (sample, sample_len, command, args, env));
5285       else
5286 #endif
5287       if (check_binary_file (sample, sample_len))
5288         {
5289           internal_error (_("%s: cannot execute binary file: %s"), command, strerror (i));
5290           return (EX_BINARY_FILE);
5291         }
5292     }
5293
5294   /* We have committed to attempting to execute the contents of this file
5295      as shell commands. */
5296
5297   initialize_subshell ();
5298
5299   set_sigint_handler ();
5300
5301   /* Insert the name of this shell into the argument list. */
5302   larray = strvec_len (args) + 1;
5303   args = strvec_resize (args, larray + 1);
5304
5305   for (i = larray - 1; i; i--)
5306     args[i] = args[i - 1];
5307
5308   args[0] = shell_name;
5309   args[1] = command;
5310   args[larray] = (char *)NULL;
5311
5312   if (args[0][0] == '-')
5313     args[0]++;
5314
5315 #if defined (RESTRICTED_SHELL)
5316   if (restricted)
5317     change_flag ('r', FLAG_OFF);
5318 #endif
5319
5320   if (subshell_argv)
5321     {
5322       /* Can't free subshell_argv[0]; that is shell_name. */
5323       for (i = 1; i < subshell_argc; i++)
5324         free (subshell_argv[i]);
5325       free (subshell_argv);
5326     }
5327
5328   dispose_command (currently_executing_command);        /* XXX */
5329   currently_executing_command = (COMMAND *)NULL;
5330
5331   subshell_argc = larray;
5332   subshell_argv = args;
5333   subshell_envp = env;
5334
5335   unbind_args ();       /* remove the positional parameters */
5336
5337   longjmp (subshell_top_level, 1);
5338   /*NOTREACHED*/
5339 }
5340
5341 static int
5342 execute_intern_function (name, funcdef)
5343      WORD_DESC *name;
5344      FUNCTION_DEF *funcdef;
5345 {
5346   SHELL_VAR *var;
5347
5348   if (check_identifier (name, posixly_correct) == 0)
5349     {
5350       if (posixly_correct && interactive_shell == 0)
5351         {
5352           last_command_exit_value = EX_BADUSAGE;
5353           jump_to_top_level (ERREXIT);
5354         }
5355       return (EXECUTION_FAILURE);
5356     }
5357
5358   /* Posix interpretation 383 */
5359   if (posixly_correct && find_special_builtin (name->word))
5360     {
5361       internal_error (_("`%s': is a special builtin"), name->word);
5362       last_command_exit_value = EX_BADUSAGE;
5363       jump_to_top_level (ERREXIT);
5364     }
5365
5366   var = find_function (name->word);
5367   if (var && (readonly_p (var) || noassign_p (var)))
5368     {
5369       if (readonly_p (var))
5370         internal_error (_("%s: readonly function"), var->name);
5371       return (EXECUTION_FAILURE);
5372     }
5373
5374 #if defined (DEBUGGER)
5375   bind_function_def (name->word, funcdef);
5376 #endif
5377
5378   bind_function (name->word, funcdef->command);
5379   return (EXECUTION_SUCCESS);
5380 }
5381
5382 #if defined (INCLUDE_UNUSED)
5383 #if defined (PROCESS_SUBSTITUTION)
5384 void
5385 close_all_files ()
5386 {
5387   register int i, fd_table_size;
5388
5389   fd_table_size = getdtablesize ();
5390   if (fd_table_size > 256)      /* clamp to a reasonable value */
5391     fd_table_size = 256;
5392
5393   for (i = 3; i < fd_table_size; i++)
5394     close (i);
5395 }
5396 #endif /* PROCESS_SUBSTITUTION */
5397 #endif
5398
5399 static void
5400 close_pipes (in, out)
5401      int in, out;
5402 {
5403   if (in >= 0)
5404     close (in);
5405   if (out >= 0)
5406     close (out);
5407 }
5408
5409 static void
5410 dup_error (oldd, newd)
5411      int oldd, newd;
5412 {
5413   sys_error (_("cannot duplicate fd %d to fd %d"), oldd, newd);
5414 }
5415
5416 /* Redirect input and output to be from and to the specified pipes.
5417    NO_PIPE and REDIRECT_BOTH are handled correctly. */
5418 static void
5419 do_piping (pipe_in, pipe_out)
5420      int pipe_in, pipe_out;
5421 {
5422   if (pipe_in != NO_PIPE)
5423     {
5424       if (dup2 (pipe_in, 0) < 0)
5425         dup_error (pipe_in, 0);
5426       if (pipe_in > 0)
5427         close (pipe_in);
5428 #ifdef __CYGWIN__
5429       /* Let stdio know the fd may have changed from text to binary mode. */
5430       freopen (NULL, "r", stdin);
5431 #endif /* __CYGWIN__ */
5432     }
5433   if (pipe_out != NO_PIPE)
5434     {
5435       if (pipe_out != REDIRECT_BOTH)
5436         {
5437           if (dup2 (pipe_out, 1) < 0)
5438             dup_error (pipe_out, 1);
5439           if (pipe_out == 0 || pipe_out > 1)
5440             close (pipe_out);
5441         }
5442       else
5443         {
5444           if (dup2 (1, 2) < 0)
5445             dup_error (1, 2);
5446         }
5447 #ifdef __CYGWIN__
5448       /* Let stdio know the fd may have changed from text to binary mode, and
5449          make sure to preserve stdout line buffering. */
5450       freopen (NULL, "w", stdout);
5451       sh_setlinebuf (stdout);
5452 #endif /* __CYGWIN__ */
5453     }
5454 }