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