Imported from ../bash-2.05.tar.gz.
[platform/upstream/bash.git] / execute_cmd.c
1 /* execute_command.c -- Execute a COMMAND structure. */
2
3 /* Copyright (C) 1987,1991 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 it
8    under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2, or (at your option)
10    any later version.
11
12    Bash is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with Bash; see the file COPYING.  If not, write to the Free
19    Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
20 #include "config.h"
21
22 #if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
23   #pragma alloca
24 #endif /* _AIX && RISC6000 && !__GNUC__ */
25
26 #include <stdio.h>
27 #include <ctype.h>
28 #include "bashtypes.h"
29 #ifndef _MINIX
30 #  include <sys/file.h>
31 #endif
32 #include "filecntl.h"
33 #include "posixstat.h"
34 #include <signal.h>
35 #ifndef _MINIX
36 #  include <sys/param.h>
37 #endif
38
39 #if defined (HAVE_UNISTD_H)
40 #  include <unistd.h>
41 #endif
42
43 #if defined (HAVE_LIMITS_H)
44 #  include <limits.h>
45 #endif
46
47 #include "posixtime.h"
48
49 #if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)
50 #  include <sys/resource.h>
51 #endif
52
53 #if defined (HAVE_SYS_TIMES_H) && defined (HAVE_TIMES)
54 #  include <sys/times.h>
55 #endif
56
57 #include <errno.h>
58
59 #if !defined (errno)
60 extern int errno;
61 #endif
62
63 #include "bashansi.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/fnmatch.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 posixly_correct;
102 extern int executing, breaking, continuing, loop_level;
103 extern int interactive, interactive_shell, login_shell, expand_aliases;
104 extern int parse_and_execute_level, running_trap, trap_line_number;
105 extern int command_string_index, variable_context, line_number;
106 extern int dot_found_in_search;
107 extern int already_making_children;
108 extern char **temporary_env, **function_env, **builtin_env;
109 extern char *the_printed_command, *shell_name;
110 extern pid_t last_command_subst_pid;
111 extern Function *last_shell_builtin, *this_shell_builtin;
112 extern char **subshell_argv, **subshell_envp;
113 extern int subshell_argc;
114 extern char *glob_argv_flags;
115
116 extern int getdtablesize ();
117 extern int close ();
118
119 /* Static functions defined and used in this file. */
120 static void close_pipes (), do_piping (), bind_lastarg ();
121 static void cleanup_redirects ();
122
123 static int execute_for_command ();
124 #if defined (SELECT_COMMAND)
125 static int execute_select_command ();
126 #endif
127 #if defined (DPAREN_ARITHMETIC)
128 static int execute_arith_command ();
129 #endif
130 #if defined (COND_COMMAND)
131 static int execute_cond_command ();
132 #endif
133 #if defined (COMMAND_TIMING)
134 static int time_command ();
135 #endif
136 #if defined (ARITH_FOR_COMMAND)
137 static int execute_arith_for_command ();
138 #endif
139 static int execute_case_command ();
140 static int execute_while_command (), execute_until_command ();
141 static int execute_while_or_until ();
142 static int execute_if_command ();
143 static int execute_simple_command ();
144 static int execute_builtin (), execute_function ();
145 static int execute_builtin_or_function ();
146 static int builtin_status ();
147 static void execute_subshell_builtin_or_function ();
148 static void execute_disk_command ();
149 static int execute_connection ();
150 static int execute_intern_function ();
151
152 static int execute_in_subshell ();
153
154 /* The line number that the currently executing function starts on. */
155 static int function_line_number;
156
157 /* Set to 1 if fd 0 was the subject of redirection to a subshell.  Global
158    so that reader_loop can set it to zero before executing a command. */
159 int stdin_redir;
160
161 /* The name of the command that is currently being executed.
162    `test' needs this, for example. */
163 char *this_command_name;
164
165 static COMMAND *currently_executing_command;
166
167 struct stat SB;         /* used for debugging */
168
169 static int special_builtin_failed;
170
171 /* For catching RETURN in a function. */
172 int return_catch_flag;
173 int return_catch_value;
174 procenv_t return_catch;
175
176 /* The value returned by the last synchronous command. */
177 int last_command_exit_value;
178
179 /* The list of redirections to perform which will undo the redirections
180    that I made in the shell. */
181 REDIRECT *redirection_undo_list = (REDIRECT *)NULL;
182
183 /* The list of redirections to perform which will undo the internal
184    redirections performed by the `exec' builtin.  These are redirections
185    that must be undone even when exec discards redirection_undo_list. */
186 REDIRECT *exec_redirection_undo_list = (REDIRECT *)NULL;
187
188 /* Non-zero if we have just forked and are currently running in a subshell
189    environment. */
190 int subshell_environment;
191
192 /* Currently-executing shell function. */
193 SHELL_VAR *this_shell_function;
194
195 struct fd_bitmap *current_fds_to_close = (struct fd_bitmap *)NULL;
196
197 #define FD_BITMAP_DEFAULT_SIZE 32L
198
199 /* Functions to allocate and deallocate the structures used to pass
200    information from the shell to its children about file descriptors
201    to close. */
202 struct fd_bitmap *
203 new_fd_bitmap (size)
204      long size;
205 {
206   struct fd_bitmap *ret;
207
208   ret = (struct fd_bitmap *)xmalloc (sizeof (struct fd_bitmap));
209
210   ret->size = size;
211
212   if (size)
213     {
214       ret->bitmap = xmalloc (size);
215       bzero (ret->bitmap, size);
216     }
217   else
218     ret->bitmap = (char *)NULL;
219   return (ret);
220 }
221
222 void
223 dispose_fd_bitmap (fdbp)
224      struct fd_bitmap *fdbp;
225 {
226   FREE (fdbp->bitmap);
227   free (fdbp);
228 }
229
230 void
231 close_fd_bitmap (fdbp)
232      struct fd_bitmap *fdbp;
233 {
234   register int i;
235
236   if (fdbp)
237     {
238       for (i = 0; i < fdbp->size; i++)
239         if (fdbp->bitmap[i])
240           {
241             close (i);
242             fdbp->bitmap[i] = 0;
243           }
244     }
245 }
246
247 /* Return the line number of the currently executing command. */
248 int
249 executing_line_number ()
250 {
251   if (executing && variable_context == 0 && currently_executing_command &&
252        currently_executing_command->type == cm_simple)
253     return currently_executing_command->value.Simple->line;
254   else if (running_trap)
255     return trap_line_number;
256   else
257     return line_number;
258 }
259
260 /* Execute the command passed in COMMAND.  COMMAND is exactly what
261    read_command () places into GLOBAL_COMMAND.  See "command.h" for the
262    details of the command structure.
263
264    EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible
265    return values.  Executing a command with nothing in it returns
266    EXECUTION_SUCCESS. */
267 int
268 execute_command (command)
269      COMMAND *command;
270 {
271   struct fd_bitmap *bitmap;
272   int result;
273
274   current_fds_to_close = (struct fd_bitmap *)NULL;
275   bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);
276   begin_unwind_frame ("execute-command");
277   add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);
278
279   /* Just do the command, but not asynchronously. */
280   result = execute_command_internal (command, 0, NO_PIPE, NO_PIPE, bitmap);
281
282   dispose_fd_bitmap (bitmap);
283   discard_unwind_frame ("execute-command");
284
285 #if defined (PROCESS_SUBSTITUTION)
286   /* don't unlink fifos if we're in a shell function; wait until the function
287      returns. */
288   if (variable_context == 0)
289     unlink_fifo_list ();
290 #endif /* PROCESS_SUBSTITUTION */
291
292   return (result);
293 }
294
295 /* Return 1 if TYPE is a shell control structure type. */
296 static int
297 shell_control_structure (type)
298      enum command_type type;
299 {
300   switch (type)
301     {
302     case cm_for:
303 #if defined (ARITH_FOR_COMMAND)
304     case cm_arith_for:
305 #endif
306 #if defined (SELECT_COMMAND)
307     case cm_select:
308 #endif
309 #if defined (DPAREN_ARITHMETIC)
310     case cm_arith:
311 #endif
312 #if defined (COND_COMMAND)
313     case cm_cond:
314 #endif
315     case cm_case:
316     case cm_while:
317     case cm_until:
318     case cm_if:
319     case cm_group:
320       return (1);
321
322     default:
323       return (0);
324     }
325 }
326
327 /* A function to use to unwind_protect the redirection undo list
328    for loops. */
329 static void
330 cleanup_redirects (list)
331      REDIRECT *list;
332 {
333   do_redirections (list, 1, 0, 0);
334   dispose_redirects (list);
335 }
336
337 #if 0
338 /* Function to unwind_protect the redirections for functions and builtins. */
339 static void
340 cleanup_func_redirects (list)
341      REDIRECT *list;
342 {
343   do_redirections (list, 1, 0, 0);
344 }
345 #endif
346
347 void
348 dispose_exec_redirects ()
349 {
350   if (exec_redirection_undo_list)
351     {
352       dispose_redirects (exec_redirection_undo_list);
353       exec_redirection_undo_list = (REDIRECT *)NULL;
354     }
355 }
356
357 #if defined (JOB_CONTROL)
358 /* A function to restore the signal mask to its proper value when the shell
359    is interrupted or errors occur while creating a pipeline. */
360 static int
361 restore_signal_mask (set)
362      sigset_t set;
363 {
364   return (sigprocmask (SIG_SETMASK, &set, (sigset_t *)NULL));
365 }
366 #endif /* JOB_CONTROL */
367
368 /* A debugging function that can be called from gdb, for instance. */
369 void
370 open_files ()
371 {
372   register int i;
373   int f, fd_table_size;
374
375   fd_table_size = getdtablesize ();
376
377   fprintf (stderr, "pid %d open files:", (int)getpid ());
378   for (i = 3; i < fd_table_size; i++)
379     {
380       if ((f = fcntl (i, F_GETFD, 0)) != -1)
381         fprintf (stderr, " %d (%s)", i, f ? "close" : "open");
382     }
383   fprintf (stderr, "\n");
384 }
385
386 static void
387 async_redirect_stdin ()
388 {
389   int fd;
390
391   fd = open ("/dev/null", O_RDONLY);
392   if (fd > 0)
393     {
394       dup2 (fd, 0);
395       close (fd);
396     }
397   else if (fd < 0)
398     internal_error ("cannot redirect standard input from /dev/null: %s", strerror (errno));
399 }
400
401 #define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)
402
403 /* Execute the command passed in COMMAND, perhaps doing it asynchrounously.
404    COMMAND is exactly what read_command () places into GLOBAL_COMMAND.
405    ASYNCHROUNOUS, if non-zero, says to do this command in the background.
406    PIPE_IN and PIPE_OUT are file descriptors saying where input comes
407    from and where it goes.  They can have the value of NO_PIPE, which means
408    I/O is stdin/stdout.
409    FDS_TO_CLOSE is a list of file descriptors to close once the child has
410    been forked.  This list often contains the unusable sides of pipes, etc.
411
412    EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible
413    return values.  Executing a command with nothing in it returns
414    EXECUTION_SUCCESS. */
415 int
416 execute_command_internal (command, asynchronous, pipe_in, pipe_out,
417                           fds_to_close)
418      COMMAND *command;
419      int asynchronous;
420      int pipe_in, pipe_out;
421      struct fd_bitmap *fds_to_close;
422 {
423   int exec_result, invert, ignore_return, was_debug_trap;
424   REDIRECT *my_undo_list, *exec_undo_list;
425   volatile pid_t last_pid;
426
427   if (command == 0 || breaking || continuing || read_but_dont_execute)
428     return (EXECUTION_SUCCESS);
429
430   run_pending_traps ();
431
432   if (running_trap == 0)
433     currently_executing_command = command;
434
435   invert = (command->flags & CMD_INVERT_RETURN) != 0;
436
437   /* If we're inverting the return value and `set -e' has been executed,
438      we don't want a failing command to inadvertently cause the shell
439      to exit. */
440   if (exit_immediately_on_error && invert)      /* XXX */
441     command->flags |= CMD_IGNORE_RETURN;        /* XXX */
442
443   exec_result = EXECUTION_SUCCESS;
444
445   /* If a command was being explicitly run in a subshell, or if it is
446      a shell control-structure, and it has a pipe, then we do the command
447      in a subshell. */
448   if (command->type == cm_subshell && (command->flags & CMD_NO_FORK))
449     return (execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close));
450
451   if (command->type == cm_subshell ||
452       (command->flags & (CMD_WANT_SUBSHELL|CMD_FORCE_SUBSHELL)) ||
453       (shell_control_structure (command->type) &&
454        (pipe_out != NO_PIPE || pipe_in != NO_PIPE || asynchronous)))
455     {
456       pid_t paren_pid;
457
458       /* Fork a subshell, turn off the subshell bit, turn off job
459          control and call execute_command () on the command again. */
460       paren_pid = make_child (savestring (make_command_string (command)),
461                               asynchronous);
462       if (paren_pid == 0)
463         exit (execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close));
464         /* NOTREACHED */
465       else
466         {
467           close_pipes (pipe_in, pipe_out);
468
469 #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
470           unlink_fifo_list ();
471 #endif
472           /* If we are part of a pipeline, and not the end of the pipeline,
473              then we should simply return and let the last command in the
474              pipe be waited for.  If we are not in a pipeline, or are the
475              last command in the pipeline, then we wait for the subshell
476              and return its exit status as usual. */
477           if (pipe_out != NO_PIPE)
478             return (EXECUTION_SUCCESS);
479
480           stop_pipeline (asynchronous, (COMMAND *)NULL);
481
482           if (asynchronous == 0)
483             {
484               last_command_exit_value = wait_for (paren_pid);
485
486               /* If we have to, invert the return value. */
487               if (invert)
488                 exec_result = ((last_command_exit_value == EXECUTION_SUCCESS)
489                                 ? EXECUTION_FAILURE
490                                 : EXECUTION_SUCCESS);
491               else
492                 exec_result = last_command_exit_value;
493
494               return (last_command_exit_value = exec_result);
495             }
496           else
497             {
498               DESCRIBE_PID (paren_pid);
499
500               run_pending_traps ();
501
502               return (EXECUTION_SUCCESS);
503             }
504         }
505     }
506
507 #if defined (COMMAND_TIMING)
508   if (command->flags & CMD_TIME_PIPELINE)
509     {
510       if (asynchronous)
511         {
512           command->flags |= CMD_FORCE_SUBSHELL;
513           exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);
514         }
515       else
516         {
517           exec_result = time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close);
518           if (running_trap == 0)
519             currently_executing_command = (COMMAND *)NULL;
520         }
521       return (exec_result);
522     }
523 #endif /* COMMAND_TIMING */
524
525   if (shell_control_structure (command->type) && command->redirects)
526     stdin_redir = stdin_redirects (command->redirects);
527
528   /* Handle WHILE FOR CASE etc. with redirections.  (Also '&' input
529      redirection.)  */
530   if (do_redirections (command->redirects, 1, 1, 0) != 0)
531     {
532       cleanup_redirects (redirection_undo_list);
533       redirection_undo_list = (REDIRECT *)NULL;
534       dispose_exec_redirects ();
535       return (EXECUTION_FAILURE);
536     }
537
538   if (redirection_undo_list)
539     {
540       my_undo_list = (REDIRECT *)copy_redirects (redirection_undo_list);
541       dispose_redirects (redirection_undo_list);
542       redirection_undo_list = (REDIRECT *)NULL;
543     }
544   else
545     my_undo_list = (REDIRECT *)NULL;
546
547   if (exec_redirection_undo_list)
548     {
549       exec_undo_list = (REDIRECT *)copy_redirects (exec_redirection_undo_list);
550       dispose_redirects (exec_redirection_undo_list);
551       exec_redirection_undo_list = (REDIRECT *)NULL;
552     }
553   else
554     exec_undo_list = (REDIRECT *)NULL;
555
556   if (my_undo_list || exec_undo_list)
557     begin_unwind_frame ("loop_redirections");
558
559   if (my_undo_list)
560     add_unwind_protect ((Function *)cleanup_redirects, my_undo_list);
561
562   if (exec_undo_list)
563     add_unwind_protect ((Function *)dispose_redirects, exec_undo_list);
564
565   ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
566
567   QUIT;
568
569   switch (command->type)
570     {
571     case cm_simple:
572       {
573         /* We can't rely on this variable retaining its value across a
574            call to execute_simple_command if a longjmp occurs as the
575            result of a `return' builtin.  This is true for sure with gcc. */
576         last_pid = last_made_pid;
577         was_debug_trap = signal_is_trapped (DEBUG_TRAP) && signal_is_ignored (DEBUG_TRAP) == 0;
578
579         if (ignore_return && command->value.Simple)
580           command->value.Simple->flags |= CMD_IGNORE_RETURN;
581         if (command->flags & CMD_STDIN_REDIR)
582           command->value.Simple->flags |= CMD_STDIN_REDIR;
583         exec_result =
584           execute_simple_command (command->value.Simple, pipe_in, pipe_out,
585                                   asynchronous, fds_to_close);
586
587         /* The temporary environment should be used for only the simple
588            command immediately following its definition. */
589         dispose_used_env_vars ();
590
591 #if (defined (ultrix) && defined (mips)) || defined (C_ALLOCA)
592         /* Reclaim memory allocated with alloca () on machines which
593            may be using the alloca emulation code. */
594         (void) alloca (0);
595 #endif /* (ultrix && mips) || C_ALLOCA */
596
597         /* If we forked to do the command, then we must wait_for ()
598            the child. */
599
600         /* XXX - this is something to watch out for if there are problems
601            when the shell is compiled without job control. */
602         if (already_making_children && pipe_out == NO_PIPE &&
603             last_pid != last_made_pid)
604           {
605             stop_pipeline (asynchronous, (COMMAND *)NULL);
606
607             if (asynchronous)
608               {
609                 DESCRIBE_PID (last_made_pid);
610               }
611             else
612 #if !defined (JOB_CONTROL)
613               /* Do not wait for asynchronous processes started from
614                  startup files. */
615             if (last_made_pid != last_asynchronous_pid)
616 #endif
617             /* When executing a shell function that executes other
618                commands, this causes the last simple command in
619                the function to be waited for twice. */
620               exec_result = wait_for (last_made_pid);
621 #if defined (RECYCLES_PIDS)
622               /* LynxOS, for one, recycles pids very quickly -- so quickly
623                  that a new process may have the same pid as the last one
624                  created.  This has been reported to fix the problem. */
625               if (exec_result == 0)
626                 last_made_pid = NO_PID;
627 #endif
628           }
629       }
630
631       if (was_debug_trap)
632         {
633           last_command_exit_value = exec_result;
634           run_debug_trap ();
635         }
636
637       if (ignore_return == 0 && invert == 0 &&
638           ((posixly_correct && interactive == 0 && special_builtin_failed) ||
639            (exit_immediately_on_error && (exec_result != EXECUTION_SUCCESS))))
640         {
641           last_command_exit_value = exec_result;
642           run_pending_traps ();
643           jump_to_top_level (EXITPROG);
644         }
645
646       break;
647
648     case cm_for:
649       if (ignore_return)
650         command->value.For->flags |= CMD_IGNORE_RETURN;
651       exec_result = execute_for_command (command->value.For);
652       break;
653
654 #if defined (ARITH_FOR_COMMAND)
655     case cm_arith_for:
656       if (ignore_return)
657         command->value.ArithFor->flags |= CMD_IGNORE_RETURN;
658       exec_result = execute_arith_for_command (command->value.ArithFor);
659       break;
660 #endif
661
662 #if defined (SELECT_COMMAND)
663     case cm_select:
664       if (ignore_return)
665         command->value.Select->flags |= CMD_IGNORE_RETURN;
666       exec_result = execute_select_command (command->value.Select);
667       break;
668 #endif
669
670     case cm_case:
671       if (ignore_return)
672         command->value.Case->flags |= CMD_IGNORE_RETURN;
673       exec_result = execute_case_command (command->value.Case);
674       break;
675
676     case cm_while:
677       if (ignore_return)
678         command->value.While->flags |= CMD_IGNORE_RETURN;
679       exec_result = execute_while_command (command->value.While);
680       break;
681
682     case cm_until:
683       if (ignore_return)
684         command->value.While->flags |= CMD_IGNORE_RETURN;
685       exec_result = execute_until_command (command->value.While);
686       break;
687
688     case cm_if:
689       if (ignore_return)
690         command->value.If->flags |= CMD_IGNORE_RETURN;
691       exec_result = execute_if_command (command->value.If);
692       break;
693
694     case cm_group:
695
696       /* This code can be executed from either of two paths: an explicit
697          '{}' command, or via a function call.  If we are executed via a
698          function call, we have already taken care of the function being
699          executed in the background (down there in execute_simple_command ()),
700          and this command should *not* be marked as asynchronous.  If we
701          are executing a regular '{}' group command, and asynchronous == 1,
702          we must want to execute the whole command in the background, so we
703          need a subshell, and we want the stuff executed in that subshell
704          (this group command) to be executed in the foreground of that
705          subshell (i.e. there will not be *another* subshell forked).
706
707          What we do is to force a subshell if asynchronous, and then call
708          execute_command_internal again with asynchronous still set to 1,
709          but with the original group command, so the printed command will
710          look right.
711
712          The code above that handles forking off subshells will note that
713          both subshell and async are on, and turn off async in the child
714          after forking the subshell (but leave async set in the parent, so
715          the normal call to describe_pid is made).  This turning off
716          async is *crucial*; if it is not done, this will fall into an
717          infinite loop of executions through this spot in subshell after
718          subshell until the process limit is exhausted. */
719
720       if (asynchronous)
721         {
722           command->flags |= CMD_FORCE_SUBSHELL;
723           exec_result =
724             execute_command_internal (command, 1, pipe_in, pipe_out,
725                                       fds_to_close);
726         }
727       else
728         {
729           if (ignore_return && command->value.Group->command)
730             command->value.Group->command->flags |= CMD_IGNORE_RETURN;
731           exec_result =
732             execute_command_internal (command->value.Group->command,
733                                       asynchronous, pipe_in, pipe_out,
734                                       fds_to_close);
735         }
736       break;
737
738     case cm_connection:
739       exec_result = execute_connection (command, asynchronous,
740                                         pipe_in, pipe_out, fds_to_close);
741       break;
742
743 #if defined (DPAREN_ARITHMETIC)
744     case cm_arith:
745       if (ignore_return)
746         command->value.Arith->flags |= CMD_IGNORE_RETURN;
747       exec_result = execute_arith_command (command->value.Arith);
748       break;
749 #endif
750
751 #if defined (COND_COMMAND)
752     case cm_cond:
753       if (ignore_return)
754         command->value.Cond->flags |= CMD_IGNORE_RETURN;
755       exec_result = execute_cond_command (command->value.Cond);
756       break;
757 #endif
758     
759     case cm_function_def:
760       exec_result = execute_intern_function (command->value.Function_def->name,
761                                              command->value.Function_def->command);
762       break;
763
764     default:
765       command_error ("execute_command", CMDERR_BADTYPE, command->type, 0);
766     }
767
768   if (my_undo_list)
769     {
770       do_redirections (my_undo_list, 1, 0, 0);
771       dispose_redirects (my_undo_list);
772     }
773
774   if (exec_undo_list)
775     dispose_redirects (exec_undo_list);
776
777   if (my_undo_list || exec_undo_list)
778     discard_unwind_frame ("loop_redirections");
779
780   /* Invert the return value if we have to */
781   if (invert)
782     exec_result = (exec_result == EXECUTION_SUCCESS)
783                     ? EXECUTION_FAILURE
784                     : EXECUTION_SUCCESS;
785
786   last_command_exit_value = exec_result;
787   run_pending_traps ();
788   if (running_trap == 0)
789     currently_executing_command = (COMMAND *)NULL;
790   return (last_command_exit_value);
791 }
792
793 #if defined (COMMAND_TIMING)
794
795 #if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
796 extern struct timeval *difftimeval();
797 extern struct timeval *addtimeval();
798 extern int timeval_to_cpu();
799 #endif
800
801 #define POSIX_TIMEFORMAT "real %2R\nuser %2U\nsys %2S"
802 #define BASH_TIMEFORMAT  "\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS"
803
804 static int precs[] = { 0, 100, 10, 1 };
805
806 /* Expand one `%'-prefixed escape sequence from a time format string. */
807 static int
808 mkfmt (buf, prec, lng, sec, sec_fraction)
809      char *buf;
810      int prec, lng;
811      long sec;
812      int sec_fraction;
813 {
814   long min;
815   char abuf[16];
816   int ind, aind;
817
818   ind = 0;
819   abuf[15] = '\0';
820
821   /* If LNG is non-zero, we want to decompose SEC into minutes and seconds. */
822   if (lng)
823     {
824       min = sec / 60;
825       sec %= 60;
826       aind = 14;
827       do
828         abuf[aind--] = (min % 10) + '0';
829       while (min /= 10);
830       aind++;
831       while (abuf[aind])
832         buf[ind++] = abuf[aind++];
833       buf[ind++] = 'm';
834     }
835
836   /* Now add the seconds. */
837   aind = 14;
838   do
839     abuf[aind--] = (sec % 10) + '0';
840   while (sec /= 10);
841   aind++;
842   while (abuf[aind])
843     buf[ind++] = abuf[aind++];
844
845   /* We want to add a decimal point and PREC places after it if PREC is
846      nonzero.  PREC is not greater than 3.  SEC_FRACTION is between 0
847      and 999. */
848   if (prec != 0)
849     {
850       buf[ind++] = '.';
851       for (aind = 1; aind <= prec; aind++)
852         {
853           buf[ind++] = (sec_fraction / precs[aind]) + '0';
854           sec_fraction %= precs[aind];
855         }
856     }
857
858   if (lng)
859     buf[ind++] = 's';
860   buf[ind] = '\0';
861
862   return (ind);
863 }
864
865 /* Interpret the format string FORMAT, interpolating the following escape
866    sequences:
867                 %[prec][l][RUS]
868
869    where the optional `prec' is a precision, meaning the number of
870    characters after the decimal point, the optional `l' means to format
871    using minutes and seconds (MMmNN[.FF]s), like the `times' builtin',
872    and the last character is one of
873    
874                 R       number of seconds of `real' time
875                 U       number of seconds of `user' time
876                 S       number of seconds of `system' time
877
878    An occurrence of `%%' in the format string is translated to a `%'.  The
879    result is printed to FP, a pointer to a FILE.  The other variables are
880    the seconds and thousandths of a second of real, user, and system time,
881    resectively. */
882 static void
883 print_formatted_time (fp, format, rs, rsf, us, usf, ss, ssf, cpu)
884      FILE *fp;
885      char *format;
886      long rs, us, ss;
887      int rsf, usf, ssf, cpu;
888 {
889   int prec, lng, len;
890   char *str, *s, ts[32];
891   long sum;
892   int sum_frac;
893   int sindex, ssize;
894
895   len = strlen (format);
896   ssize = (len + 64) - (len % 64);
897   str = xmalloc (ssize);
898   sindex = 0;
899
900   for (s = format; *s; s++)
901     {
902       if (*s != '%' || s[1] == '\0')
903         {
904           RESIZE_MALLOCED_BUFFER (str, sindex, 1, ssize, 64);
905           str[sindex++] = *s;
906         }
907       else if (s[1] == '%')
908         {
909           s++;
910           RESIZE_MALLOCED_BUFFER (str, sindex, 1, ssize, 64);
911           str[sindex++] = *s;
912         }
913       else if (s[1] == 'P')
914         {
915           s++;
916           if (cpu > 10000)
917             cpu = 10000;
918           sum = cpu / 100;
919           sum_frac = (cpu % 100) * 10;
920           len = mkfmt (ts, 2, 0, sum, sum_frac);
921           RESIZE_MALLOCED_BUFFER (str, sindex, len, ssize, 64);
922           strcpy (str + sindex, ts);
923           sindex += len;
924         }
925       else
926         {
927           prec = 3;     /* default is three places past the decimal point. */
928           lng = 0;      /* default is to not use minutes or append `s' */
929           s++;
930           if (isdigit (*s))             /* `precision' */
931             {
932               prec = *s++ - '0';
933               if (prec > 3) prec = 3;
934             }
935           if (*s == 'l')                /* `length extender' */
936             {
937               lng = 1;
938               s++;
939             }
940           if (*s == 'R' || *s == 'E')
941             len = mkfmt (ts, prec, lng, rs, rsf);
942           else if (*s == 'U')
943             len = mkfmt (ts, prec, lng, us, usf);
944           else if (*s == 'S')
945             len = mkfmt (ts, prec, lng, ss, ssf);
946           else
947             {
948               internal_error ("bad format character in time format: %c", *s);
949               free (str);
950               return;
951             }
952           RESIZE_MALLOCED_BUFFER (str, sindex, len, ssize, 64);
953           strcpy (str + sindex, ts);
954           sindex += len;
955         }
956     }
957
958   str[sindex] = '\0';
959   fprintf (fp, "%s\n", str);
960   fflush (fp);
961
962   free (str);
963 }
964
965 static int
966 time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close)
967      COMMAND *command;
968      int asynchronous, pipe_in, pipe_out;
969      struct fd_bitmap *fds_to_close;
970 {
971   int rv, posix_time, old_flags;
972   long rs, us, ss;
973   int rsf, usf, ssf;
974   int cpu;
975   char *time_format;
976
977 #if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
978   struct timeval real, user, sys;
979   struct timeval before, after;
980   struct timezone dtz;
981   struct rusage selfb, selfa, kidsb, kidsa;     /* a = after, b = before */
982 #else
983 #  if defined (HAVE_TIMES)
984   clock_t tbefore, tafter, real, user, sys;
985   struct tms before, after;
986 #  endif
987 #endif
988
989 #if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
990   gettimeofday (&before, &dtz);
991   getrusage (RUSAGE_SELF, &selfb);
992   getrusage (RUSAGE_CHILDREN, &kidsb);
993 #else
994 #  if defined (HAVE_TIMES)
995   tbefore = times (&before);
996 #  endif
997 #endif
998
999   posix_time = (command->flags & CMD_TIME_POSIX);
1000
1001   old_flags = command->flags;
1002   command->flags &= ~(CMD_TIME_PIPELINE|CMD_TIME_POSIX);
1003   rv = execute_command_internal (command, asynchronous, pipe_in, pipe_out, fds_to_close);
1004   command->flags = old_flags;
1005
1006   rs = us = ss = 0L;
1007   rsf = usf = ssf = cpu = 0;
1008
1009 #if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
1010   gettimeofday (&after, &dtz);
1011   getrusage (RUSAGE_SELF, &selfa);
1012   getrusage (RUSAGE_CHILDREN, &kidsa);
1013
1014   difftimeval (&real, &before, &after);
1015   timeval_to_secs (&real, &rs, &rsf);
1016
1017   addtimeval (&user, difftimeval(&after, &selfb.ru_utime, &selfa.ru_utime),
1018                      difftimeval(&before, &kidsb.ru_utime, &kidsa.ru_utime));
1019   timeval_to_secs (&user, &us, &usf);
1020
1021   addtimeval (&sys, difftimeval(&after, &selfb.ru_stime, &selfa.ru_stime),
1022                     difftimeval(&before, &kidsb.ru_stime, &kidsa.ru_stime));
1023   timeval_to_secs (&sys, &ss, &ssf);
1024
1025   cpu = timeval_to_cpu (&real, &user, &sys);
1026 #else
1027 #  if defined (HAVE_TIMES)
1028   tafter = times (&after);
1029
1030   real = tafter - tbefore;
1031   clock_t_to_secs (real, &rs, &rsf);
1032
1033   user = (after.tms_utime - before.tms_utime) + (after.tms_cutime - before.tms_cutime);
1034   clock_t_to_secs (user, &us, &usf);
1035
1036   sys = (after.tms_stime - before.tms_stime) + (after.tms_cstime - before.tms_cstime);
1037   clock_t_to_secs (sys, &ss, &ssf);
1038
1039   cpu = (real == 0) ? 0 : ((user + sys) * 10000) / real;
1040
1041 #  else
1042   rs = us = ss = 0L;
1043   rsf = usf = ssf = cpu = 0;
1044 #  endif
1045 #endif
1046
1047   if (posix_time)
1048     time_format = POSIX_TIMEFORMAT;
1049   else if ((time_format = get_string_value ("TIMEFORMAT")) == 0)
1050     time_format = BASH_TIMEFORMAT;
1051
1052   if (time_format && *time_format)
1053     print_formatted_time (stderr, time_format, rs, rsf, us, usf, ss, ssf, cpu);
1054
1055   return rv;
1056 }
1057 #endif /* COMMAND_TIMING */
1058
1059 /* Execute a command that's supposed to be in a subshell.  This must be
1060    called after make_child and we must be running in the child process.
1061    The caller will return or exit() immediately with the value this returns. */
1062 static int
1063 execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
1064      COMMAND *command;
1065      int asynchronous;
1066      int pipe_in, pipe_out;
1067      struct fd_bitmap *fds_to_close;
1068 {
1069   int user_subshell, return_code, function_value, should_redir_stdin, invert;
1070   int ois;
1071   COMMAND *tcom;
1072
1073   should_redir_stdin = (asynchronous && (command->flags & CMD_STDIN_REDIR) &&
1074                           pipe_in == NO_PIPE &&
1075                           stdin_redirects (command->redirects) == 0);
1076
1077   invert = (command->flags & CMD_INVERT_RETURN) != 0;
1078   user_subshell = command->type == cm_subshell || ((command->flags & CMD_WANT_SUBSHELL) != 0);
1079
1080   command->flags &= ~(CMD_FORCE_SUBSHELL | CMD_WANT_SUBSHELL | CMD_INVERT_RETURN);
1081
1082   /* If a command is asynchronous in a subshell (like ( foo ) & or
1083      the special case of an asynchronous GROUP command where the
1084      the subshell bit is turned on down in case cm_group: below),
1085      turn off `asynchronous', so that two subshells aren't spawned.
1086
1087      This seems semantically correct to me.  For example,
1088      ( foo ) & seems to say ``do the command `foo' in a subshell
1089      environment, but don't wait for that subshell to finish'',
1090      and "{ foo ; bar ; } &" seems to me to be like functions or
1091      builtins in the background, which executed in a subshell
1092      environment.  I just don't see the need to fork two subshells. */
1093
1094   /* Don't fork again, we are already in a subshell.  A `doubly
1095      async' shell is not interactive, however. */
1096   if (asynchronous)
1097     {
1098 #if defined (JOB_CONTROL)
1099       /* If a construct like ( exec xxx yyy ) & is given while job
1100          control is active, we want to prevent exec from putting the
1101          subshell back into the original process group, carefully
1102          undoing all the work we just did in make_child. */
1103       original_pgrp = -1;
1104 #endif /* JOB_CONTROL */
1105       ois = interactive_shell;
1106       interactive_shell = 0;
1107       /* This test is to prevent alias expansion by interactive shells that
1108          run `(command) &' but to allow scripts that have enabled alias
1109          expansion with `shopt -s expand_alias' to continue to expand
1110          aliases. */
1111       if (ois != interactive_shell)
1112         expand_aliases = 0;
1113       asynchronous = 0;
1114     }
1115
1116   /* Subshells are neither login nor interactive. */
1117   login_shell = interactive = 0;
1118
1119   subshell_environment = user_subshell ? SUBSHELL_PAREN : SUBSHELL_ASYNC;
1120
1121   reset_terminating_signals ();         /* in sig.c */
1122   /* Cancel traps, in trap.c. */
1123   restore_original_signals ();
1124   if (asynchronous)
1125     setup_async_signals ();
1126
1127 #if defined (JOB_CONTROL)
1128   set_sigchld_handler ();
1129 #endif /* JOB_CONTROL */
1130
1131   set_sigint_handler ();
1132
1133 #if defined (JOB_CONTROL)
1134   /* Delete all traces that there were any jobs running.  This is
1135      only for subshells. */
1136   without_job_control ();
1137 #endif /* JOB_CONTROL */
1138
1139   if (fds_to_close)
1140     close_fd_bitmap (fds_to_close);
1141
1142   do_piping (pipe_in, pipe_out);
1143
1144   /* If this is a user subshell, set a flag if stdin was redirected.
1145      This is used later to decide whether to redirect fd 0 to
1146      /dev/null for async commands in the subshell.  This adds more
1147      sh compatibility, but I'm not sure it's the right thing to do. */
1148   if (user_subshell)
1149     {
1150       stdin_redir = stdin_redirects (command->redirects);
1151       restore_default_signal (0);
1152     }
1153
1154   /* If this is an asynchronous command (command &), we want to
1155      redirect the standard input from /dev/null in the absence of
1156      any specific redirection involving stdin. */
1157   if (should_redir_stdin && stdin_redir == 0)
1158     async_redirect_stdin ();
1159
1160   /* Do redirections, then dispose of them before recursive call. */
1161   if (command->redirects)
1162     {
1163       if (do_redirections (command->redirects, 1, 0, 0) != 0)
1164         exit (invert ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
1165
1166       dispose_redirects (command->redirects);
1167       command->redirects = (REDIRECT *)NULL;
1168     }
1169
1170   tcom = (command->type == cm_subshell) ? command->value.Subshell->command : command;
1171
1172   /* If this is a simple command, tell execute_disk_command that it
1173      might be able to get away without forking and simply exec.
1174      This means things like ( sleep 10 ) will only cause one fork.
1175      If we're timing the command or inverting its return value, however,
1176      we cannot do this optimization. */
1177   if (user_subshell && (tcom->type == cm_simple || tcom->type == cm_subshell) &&
1178       ((tcom->flags & CMD_TIME_PIPELINE) == 0) &&
1179       ((tcom->flags & CMD_INVERT_RETURN) == 0))
1180     {
1181       tcom->flags |= CMD_NO_FORK;
1182       if (tcom->type == cm_simple)
1183         tcom->value.Simple->flags |= CMD_NO_FORK;
1184     }
1185
1186   invert = (tcom->flags & CMD_INVERT_RETURN) != 0;
1187   tcom->flags &= ~CMD_INVERT_RETURN;
1188
1189   /* If we're inside a function while executing this subshell, we
1190      need to handle a possible `return'. */
1191   function_value = 0;
1192   if (return_catch_flag)
1193     function_value = setjmp (return_catch);
1194
1195   if (function_value)
1196     return_code = return_catch_value;
1197   else
1198     return_code = execute_command_internal
1199       (tcom, asynchronous, NO_PIPE, NO_PIPE, fds_to_close);
1200
1201   /* If we are asked to, invert the return value. */
1202   if (invert)
1203     return_code = (return_code == EXECUTION_SUCCESS) ? EXECUTION_FAILURE
1204                                                      : EXECUTION_SUCCESS;
1205
1206   /* If we were explicitly placed in a subshell with (), we need
1207      to do the `shell cleanup' things, such as running traps[0]. */
1208   if (user_subshell && signal_is_trapped (0))
1209     {
1210       last_command_exit_value = return_code;
1211       return_code = run_exit_trap ();
1212     }
1213
1214   return (return_code);
1215   /* NOTREACHED */
1216 }
1217
1218 static int
1219 execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close)
1220      COMMAND *command;
1221      int asynchronous, pipe_in, pipe_out;
1222      struct fd_bitmap *fds_to_close;
1223 {
1224   int prev, fildes[2], new_bitmap_size, dummyfd, ignore_return, exec_result;
1225   COMMAND *cmd;
1226   struct fd_bitmap *fd_bitmap;
1227
1228 #if defined (JOB_CONTROL)
1229   sigset_t set, oset;
1230   BLOCK_CHILD (set, oset);
1231 #endif /* JOB_CONTROL */
1232
1233   ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
1234
1235   prev = pipe_in;
1236   cmd = command;
1237
1238   while (cmd && cmd->type == cm_connection &&
1239          cmd->value.Connection && cmd->value.Connection->connector == '|')
1240     {
1241       /* Make a pipeline between the two commands. */
1242       if (pipe (fildes) < 0)
1243         {
1244           sys_error ("pipe error");
1245 #if defined (JOB_CONTROL)
1246           terminate_current_pipeline ();
1247           kill_current_pipeline ();
1248 #endif /* JOB_CONTROL */
1249           last_command_exit_value = EXECUTION_FAILURE;
1250           /* The unwind-protects installed below will take care
1251              of closing all of the open file descriptors. */
1252           throw_to_top_level ();
1253           return (EXECUTION_FAILURE);   /* XXX */
1254         }
1255
1256       /* Here is a problem: with the new file close-on-exec
1257          code, the read end of the pipe (fildes[0]) stays open
1258          in the first process, so that process will never get a
1259          SIGPIPE.  There is no way to signal the first process
1260          that it should close fildes[0] after forking, so it
1261          remains open.  No SIGPIPE is ever sent because there
1262          is still a file descriptor open for reading connected
1263          to the pipe.  We take care of that here.  This passes
1264          around a bitmap of file descriptors that must be
1265          closed after making a child process in execute_simple_command. */
1266
1267       /* We need fd_bitmap to be at least as big as fildes[0].
1268          If fildes[0] is less than fds_to_close->size, then
1269          use fds_to_close->size. */
1270       new_bitmap_size = (fildes[0] < fds_to_close->size)
1271                                 ? fds_to_close->size
1272                                 : fildes[0] + 8;
1273
1274       fd_bitmap = new_fd_bitmap (new_bitmap_size);
1275
1276       /* Now copy the old information into the new bitmap. */
1277       xbcopy ((char *)fds_to_close->bitmap, (char *)fd_bitmap->bitmap, fds_to_close->size);
1278
1279       /* And mark the pipe file descriptors to be closed. */
1280       fd_bitmap->bitmap[fildes[0]] = 1;
1281
1282       /* In case there are pipe or out-of-processes errors, we
1283          want all these file descriptors to be closed when
1284          unwind-protects are run, and the storage used for the
1285          bitmaps freed up. */
1286       begin_unwind_frame ("pipe-file-descriptors");
1287       add_unwind_protect (dispose_fd_bitmap, fd_bitmap);
1288       add_unwind_protect (close_fd_bitmap, fd_bitmap);
1289       if (prev >= 0)
1290         add_unwind_protect (close, prev);
1291       dummyfd = fildes[1];
1292       add_unwind_protect (close, dummyfd);
1293
1294 #if defined (JOB_CONTROL)
1295       add_unwind_protect (restore_signal_mask, oset);
1296 #endif /* JOB_CONTROL */
1297
1298       if (ignore_return && cmd->value.Connection->first)
1299         cmd->value.Connection->first->flags |= CMD_IGNORE_RETURN;
1300       execute_command_internal (cmd->value.Connection->first, asynchronous,
1301                                 prev, fildes[1], fd_bitmap);
1302
1303       if (prev >= 0)
1304         close (prev);
1305
1306       prev = fildes[0];
1307       close (fildes[1]);
1308
1309       dispose_fd_bitmap (fd_bitmap);
1310       discard_unwind_frame ("pipe-file-descriptors");
1311
1312       cmd = cmd->value.Connection->second;
1313     }
1314
1315   /* Now execute the rightmost command in the pipeline.  */
1316   if (ignore_return && cmd)
1317     cmd->flags |= CMD_IGNORE_RETURN;
1318   exec_result = execute_command_internal (cmd, asynchronous, prev, pipe_out, fds_to_close);
1319
1320   if (prev >= 0)
1321     close (prev);
1322
1323 #if defined (JOB_CONTROL)
1324   UNBLOCK_CHILD (oset);
1325 #endif
1326
1327   return (exec_result);
1328 }
1329
1330 static int
1331 execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
1332      COMMAND *command;
1333      int asynchronous, pipe_in, pipe_out;
1334      struct fd_bitmap *fds_to_close;
1335 {
1336 #if 0
1337   REDIRECT *tr, *tl;
1338 #endif
1339   REDIRECT *rp;
1340   COMMAND *tc, *second;
1341   int ignore_return, exec_result;
1342
1343   ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
1344
1345   switch (command->value.Connection->connector)
1346     {
1347     /* Do the first command asynchronously. */
1348     case '&':
1349       tc = command->value.Connection->first;
1350       if (tc == 0)
1351         return (EXECUTION_SUCCESS);
1352
1353       rp = tc->redirects;
1354
1355       if (ignore_return)
1356         tc->flags |= CMD_IGNORE_RETURN;
1357       tc->flags |= CMD_AMPERSAND;
1358
1359       /* If this shell was compiled without job control support, if
1360          the shell is not running interactively, if we are currently
1361          in a subshell via `( xxx )', or if job control is not active
1362          then the standard input for an asynchronous command is
1363          forced to /dev/null. */
1364 #if defined (JOB_CONTROL)
1365       if ((!interactive_shell || subshell_environment || !job_control) && !stdin_redir)
1366 #else
1367       if (!stdin_redir)
1368 #endif /* JOB_CONTROL */
1369         {
1370 #if 0
1371           rd.filename = make_bare_word ("/dev/null");
1372           tr = make_redirection (0, r_inputa_direction, rd);
1373           tr->next = tc->redirects;
1374           tc->redirects = tr;
1375 #endif
1376           tc->flags |= CMD_STDIN_REDIR;
1377         }
1378
1379       exec_result = execute_command_internal (tc, 1, pipe_in, pipe_out, fds_to_close);
1380
1381       if (tc->flags & CMD_STDIN_REDIR)
1382         {
1383 #if 0
1384           /* Remove the redirection we added above.  It matters,
1385              especially for loops, which call execute_command ()
1386              multiple times with the same command. */
1387           tr = tc->redirects;
1388           do
1389             {
1390               tl = tc->redirects;
1391               tc->redirects = tc->redirects->next;
1392             }
1393           while (tc->redirects && tc->redirects != rp);
1394
1395           tl->next = (REDIRECT *)NULL;
1396           dispose_redirects (tr);
1397 #endif
1398           tc->flags &= ~CMD_STDIN_REDIR;
1399         }
1400
1401       second = command->value.Connection->second;
1402       if (second)
1403         {
1404           if (ignore_return)
1405             second->flags |= CMD_IGNORE_RETURN;
1406
1407           exec_result = execute_command_internal (second, asynchronous, pipe_in, pipe_out, fds_to_close);
1408         }
1409
1410       break;
1411
1412     /* Just call execute command on both sides. */
1413     case ';':
1414       if (ignore_return)
1415         {
1416           if (command->value.Connection->first)
1417             command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
1418           if (command->value.Connection->second)
1419             command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
1420         }
1421       QUIT;
1422       execute_command (command->value.Connection->first);
1423       QUIT;
1424       exec_result = execute_command_internal (command->value.Connection->second,
1425                                       asynchronous, pipe_in, pipe_out,
1426                                       fds_to_close);
1427       break;
1428
1429     case '|':
1430       exec_result = execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close);
1431       break;
1432
1433     case AND_AND:
1434     case OR_OR:
1435       if (asynchronous)
1436         {
1437           /* If we have something like `a && b &' or `a || b &', run the
1438              && or || stuff in a subshell.  Force a subshell and just call
1439              execute_command_internal again.  Leave asynchronous on
1440              so that we get a report from the parent shell about the
1441              background job. */
1442           command->flags |= CMD_FORCE_SUBSHELL;
1443           exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);
1444           break;
1445         }
1446
1447       /* Execute the first command.  If the result of that is successful
1448          and the connector is AND_AND, or the result is not successful
1449          and the connector is OR_OR, then execute the second command,
1450          otherwise return. */
1451
1452       if (command->value.Connection->first)
1453         command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
1454
1455       exec_result = execute_command (command->value.Connection->first);
1456       QUIT;
1457       if (((command->value.Connection->connector == AND_AND) &&
1458            (exec_result == EXECUTION_SUCCESS)) ||
1459           ((command->value.Connection->connector == OR_OR) &&
1460            (exec_result != EXECUTION_SUCCESS)))
1461         {
1462           if (ignore_return && command->value.Connection->second)
1463             command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
1464
1465           exec_result = execute_command (command->value.Connection->second);
1466         }
1467       break;
1468
1469     default:
1470       command_error ("execute_connection", CMDERR_BADCONN, command->value.Connection->connector, 0);
1471       jump_to_top_level (DISCARD);
1472       exec_result = EXECUTION_FAILURE;
1473     }
1474
1475   return exec_result;
1476 }
1477
1478 #define REAP() \
1479   do \
1480     { \
1481       if (!interactive_shell) \
1482         reap_dead_jobs (); \
1483     } \
1484   while (0)
1485
1486 /* Execute a FOR command.  The syntax is: FOR word_desc IN word_list;
1487    DO command; DONE */
1488 static int
1489 execute_for_command (for_command)
1490      FOR_COM *for_command;
1491 {
1492   register WORD_LIST *releaser, *list;
1493   SHELL_VAR *v;
1494   char *identifier;
1495   int retval;
1496 #if 0
1497   SHELL_VAR *old_value = (SHELL_VAR *)NULL; /* Remember the old value of x. */
1498 #endif
1499
1500   if (check_identifier (for_command->name, 1) == 0)
1501     {
1502       if (posixly_correct && interactive_shell == 0)
1503         {
1504           last_command_exit_value = EX_USAGE;
1505           jump_to_top_level (EXITPROG);
1506         }
1507       return (EXECUTION_FAILURE);
1508     }
1509
1510   loop_level++;
1511   identifier = for_command->name->word;
1512
1513   list = releaser = expand_words_no_vars (for_command->map_list);
1514
1515   begin_unwind_frame ("for");
1516   add_unwind_protect (dispose_words, releaser);
1517
1518 #if 0
1519   if (lexical_scoping)
1520     {
1521       old_value = copy_variable (find_variable (identifier));
1522       if (old_value)
1523         add_unwind_protect (dispose_variable, old_value);
1524     }
1525 #endif
1526
1527   if (for_command->flags & CMD_IGNORE_RETURN)
1528     for_command->action->flags |= CMD_IGNORE_RETURN;
1529
1530   for (retval = EXECUTION_SUCCESS; list; list = list->next)
1531     {
1532       QUIT;
1533       this_command_name = (char *)NULL;
1534       v = bind_variable (identifier, list->word->word);
1535       if (readonly_p (v) || noassign_p (v))
1536         {
1537           if (readonly_p (v) && interactive_shell == 0 && posixly_correct)
1538             {
1539               last_command_exit_value = EXECUTION_FAILURE;
1540               jump_to_top_level (FORCE_EOF);
1541             }
1542           else
1543             {
1544               run_unwind_frame ("for");
1545               loop_level--;
1546               return (EXECUTION_FAILURE);
1547             }
1548         }
1549       retval = execute_command (for_command->action);
1550       REAP ();
1551       QUIT;
1552
1553       if (breaking)
1554         {
1555           breaking--;
1556           break;
1557         }
1558
1559       if (continuing)
1560         {
1561           continuing--;
1562           if (continuing)
1563             break;
1564         }
1565     }
1566
1567   loop_level--;
1568
1569 #if 0
1570   if (lexical_scoping)
1571     {
1572       if (!old_value)
1573         makunbound (identifier, shell_variables);
1574       else
1575         {
1576           SHELL_VAR *new_value;
1577
1578           new_value = bind_variable (identifier, value_cell(old_value));
1579           new_value->attributes = old_value->attributes;
1580           dispose_variable (old_value);
1581         }
1582     }
1583 #endif
1584
1585   dispose_words (releaser);
1586   discard_unwind_frame ("for");
1587   return (retval);
1588 }
1589
1590 #if defined (ARITH_FOR_COMMAND)
1591 /* Execute an arithmetic for command.  The syntax is
1592
1593         for (( init ; step ; test ))
1594         do
1595                 body
1596         done
1597
1598    The execution should be exactly equivalent to
1599
1600         eval \(\( init \)\)
1601         while eval \(\( test \)\) ; do
1602                 body;
1603                 eval \(\( step \)\)
1604         done
1605 */
1606 static long
1607 eval_arith_for_expr (l, okp)
1608      WORD_LIST *l;
1609      int *okp;
1610 {
1611   WORD_LIST *new;
1612   long expresult;
1613
1614   new = expand_words_no_vars (l);
1615   if (echo_command_at_execute)
1616     xtrace_print_arith_cmd (new);
1617   expresult = evalexp (new->word->word, okp);
1618   dispose_words (new);
1619   return (expresult);
1620 }
1621
1622 static int
1623 execute_arith_for_command (arith_for_command)
1624      ARITH_FOR_COM *arith_for_command;
1625 {
1626   long expresult;
1627   int expok, result, body_status;
1628
1629   body_status = EXECUTION_SUCCESS;
1630   loop_level++;
1631
1632   if (arith_for_command->flags & CMD_IGNORE_RETURN)
1633     arith_for_command->action->flags |= CMD_IGNORE_RETURN;
1634
1635   this_command_name = "((";     /* )) for expression error messages */
1636
1637   if (variable_context)
1638     line_number = arith_for_command->line - function_line_number;
1639
1640   /* Evaluate the initialization expression. */
1641   expresult = eval_arith_for_expr (arith_for_command->init, &expok);
1642   if (expok == 0)
1643     return (EXECUTION_FAILURE);
1644
1645   while (1)
1646     {
1647       /* Evaluate the test expression. */
1648       expresult = eval_arith_for_expr (arith_for_command->test, &expok);
1649       if (expok == 0)
1650         {
1651           body_status = EXECUTION_FAILURE;
1652           break;
1653         }
1654       REAP ();
1655       if (expresult == 0)
1656         break;
1657
1658       /* Execute the body of the arithmetic for command. */
1659       QUIT;
1660       body_status = execute_command (arith_for_command->action);
1661       QUIT;
1662
1663       /* Handle any `break' or `continue' commands executed by the body. */
1664       if (breaking)
1665         {
1666           breaking--;
1667           break;
1668         }
1669
1670       if (continuing)
1671         {
1672           continuing--;
1673           if (continuing)
1674             break;
1675         }
1676
1677       /* Evaluate the step expression. */
1678       expresult = eval_arith_for_expr (arith_for_command->step, &expok);
1679       if (expok == 0)
1680         {
1681           body_status = EXECUTION_FAILURE;
1682           break;
1683         }
1684     }
1685
1686   loop_level--;
1687   return (body_status);
1688 }
1689 #endif
1690
1691 #if defined (SELECT_COMMAND)
1692 static int LINES, COLS, tabsize;
1693
1694 #define RP_SPACE ") "
1695 #define RP_SPACE_LEN 2
1696
1697 /* XXX - does not handle numbers > 1000000 at all. */
1698 #define NUMBER_LEN(s) \
1699 ((s < 10) ? 1 \
1700           : ((s < 100) ? 2 \
1701                       : ((s < 1000) ? 3 \
1702                                    : ((s < 10000) ? 4 \
1703                                                  : ((s < 100000) ? 5 \
1704                                                                 : 6)))))
1705
1706 static int
1707 print_index_and_element (len, ind, list)
1708       int len, ind;
1709       WORD_LIST *list;
1710 {
1711   register WORD_LIST *l;
1712   register int i;
1713
1714   if (list == 0)
1715     return (0);
1716   for (i = ind, l = list; l && --i; l = l->next)
1717     ;
1718   fprintf (stderr, "%*d%s%s", len, ind, RP_SPACE, l->word->word);
1719   return (STRLEN (l->word->word));
1720 }
1721
1722 static void
1723 indent (from, to)
1724      int from, to;
1725 {
1726   while (from < to)
1727     {
1728       if ((to / tabsize) > (from / tabsize))
1729         {
1730           putc ('\t', stderr);
1731           from += tabsize - from % tabsize;
1732         }
1733       else
1734         {
1735           putc (' ', stderr);
1736           from++;
1737         }
1738     }
1739 }
1740
1741 static void
1742 print_select_list (list, list_len, max_elem_len, indices_len)
1743      WORD_LIST *list;
1744      int list_len, max_elem_len, indices_len;
1745 {
1746   int ind, row, elem_len, pos, cols, rows;
1747   int first_column_indices_len, other_indices_len;
1748
1749   if (list == 0)
1750     {
1751       putc ('\n', stderr);
1752       return;
1753     }
1754
1755   cols = max_elem_len ? COLS / max_elem_len : 1;
1756   if (cols == 0)
1757     cols = 1;
1758   rows = list_len ? list_len / cols + (list_len % cols != 0) : 1;
1759   cols = list_len ? list_len / rows + (list_len % rows != 0) : 1;
1760
1761   if (rows == 1)
1762     {
1763       rows = cols;
1764       cols = 1;
1765     }
1766
1767   first_column_indices_len = NUMBER_LEN (rows);
1768   other_indices_len = indices_len;
1769
1770   for (row = 0; row < rows; row++)
1771     {
1772       ind = row;
1773       pos = 0;
1774       while (1)
1775         {
1776           indices_len = (pos == 0) ? first_column_indices_len : other_indices_len;
1777           elem_len = print_index_and_element (indices_len, ind + 1, list);
1778           elem_len += indices_len + RP_SPACE_LEN;
1779           ind += rows;
1780           if (ind >= list_len)
1781             break;
1782           indent (pos + elem_len, pos + max_elem_len);
1783           pos += max_elem_len;
1784         }
1785       putc ('\n', stderr);
1786     }
1787 }
1788
1789 /* Print the elements of LIST, one per line, preceded by an index from 1 to
1790    LIST_LEN.  Then display PROMPT and wait for the user to enter a number.
1791    If the number is between 1 and LIST_LEN, return that selection.  If EOF
1792    is read, return a null string.  If a blank line is entered, or an invalid
1793    number is entered, the loop is executed again. */
1794 static char *
1795 select_query (list, list_len, prompt)
1796      WORD_LIST *list;
1797      int list_len;
1798      char *prompt;
1799 {
1800   int max_elem_len, indices_len, len;
1801   long reply;
1802   WORD_LIST *l;
1803   char *repl_string, *t;
1804
1805   t = get_string_value ("LINES");
1806   LINES = (t && *t) ? atoi (t) : 24;
1807   t = get_string_value ("COLUMNS");
1808   COLS =  (t && *t) ? atoi (t) : 80;
1809
1810 #if 0
1811   t = get_string_value ("TABSIZE");
1812   tabsize = (t && *t) ? atoi (t) : 8;
1813   if (tabsize <= 0)
1814     tabsize = 8;
1815 #else
1816   tabsize = 8;
1817 #endif
1818
1819   max_elem_len = 0;
1820   for (l = list; l; l = l->next)
1821     {
1822       len = STRLEN (l->word->word);
1823       if (len > max_elem_len)
1824         max_elem_len = len;
1825     }
1826   indices_len = NUMBER_LEN (list_len);
1827   max_elem_len += indices_len + RP_SPACE_LEN + 2;
1828
1829   while (1)
1830     {
1831       print_select_list (list, list_len, max_elem_len, indices_len);
1832       fprintf (stderr, "%s", prompt);
1833       fflush (stderr);
1834       QUIT;
1835
1836       if (read_builtin ((WORD_LIST *)NULL) == EXECUTION_FAILURE)
1837         {
1838           putchar ('\n');
1839           return ((char *)NULL);
1840         }
1841       repl_string = get_string_value ("REPLY");
1842       if (*repl_string == 0)
1843         continue;
1844       if (legal_number (repl_string, &reply) == 0)
1845         return "";
1846       if (reply < 1 || reply > list_len)
1847         return "";
1848
1849       for (l = list; l && --reply; l = l->next)
1850         ;
1851       return (l->word->word);
1852     }
1853 }
1854
1855 /* Execute a SELECT command.  The syntax is:
1856    SELECT word IN list DO command_list DONE
1857    Only `break' or `return' in command_list will terminate
1858    the command. */
1859 static int
1860 execute_select_command (select_command)
1861      SELECT_COM *select_command;
1862 {
1863   WORD_LIST *releaser, *list;
1864   SHELL_VAR *v;
1865   char *identifier, *ps3_prompt, *selection;
1866   int retval, list_len, return_val;
1867
1868   if (check_identifier (select_command->name, 1) == 0)
1869     return (EXECUTION_FAILURE);
1870
1871   loop_level++;
1872   identifier = select_command->name->word;
1873
1874   /* command and arithmetic substitution, parameter and variable expansion,
1875      word splitting, pathname expansion, and quote removal. */
1876   list = releaser = expand_words_no_vars (select_command->map_list);
1877   list_len = list_length (list);
1878   if (list == 0 || list_len == 0)
1879     {
1880       if (list)
1881         dispose_words (list);
1882       return (EXECUTION_SUCCESS);
1883     }
1884
1885   begin_unwind_frame ("select");
1886   add_unwind_protect (dispose_words, releaser);
1887
1888   if (select_command->flags & CMD_IGNORE_RETURN)
1889     select_command->action->flags |= CMD_IGNORE_RETURN;
1890
1891   retval = EXECUTION_SUCCESS;
1892
1893   unwind_protect_int (return_catch_flag);
1894   unwind_protect_jmp_buf (return_catch);
1895   return_catch_flag++;
1896
1897   while (1)
1898     {
1899       ps3_prompt = get_string_value ("PS3");
1900       if (ps3_prompt == 0)
1901         ps3_prompt = "#? ";
1902
1903       QUIT;
1904       selection = select_query (list, list_len, ps3_prompt);
1905       QUIT;
1906       if (selection == 0)
1907         break;
1908
1909       v = bind_variable (identifier, selection);
1910       if (readonly_p (v) || noassign_p (v))
1911         {
1912           if (readonly_p (v) && interactive_shell == 0 && posixly_correct)
1913             {
1914               last_command_exit_value = EXECUTION_FAILURE;
1915               jump_to_top_level (FORCE_EOF);
1916             }
1917           else
1918             {
1919               run_unwind_frame ("select");
1920               return (EXECUTION_FAILURE);
1921             }
1922         }
1923
1924       return_val = setjmp (return_catch);
1925
1926       if (return_val)
1927         {
1928           retval = return_catch_value;
1929           break;
1930         }
1931       else
1932         retval = execute_command (select_command->action);
1933
1934       REAP ();
1935       QUIT;
1936
1937       if (breaking)
1938         {
1939           breaking--;
1940           break;
1941         }
1942
1943       if (continuing)
1944         {
1945           continuing--;
1946           if (continuing)
1947             break;
1948         }
1949     }
1950
1951   loop_level--;
1952
1953   run_unwind_frame ("select");
1954   return (retval);
1955 }
1956 #endif /* SELECT_COMMAND */
1957
1958 /* Execute a CASE command.  The syntax is: CASE word_desc IN pattern_list ESAC.
1959    The pattern_list is a linked list of pattern clauses; each clause contains
1960    some patterns to compare word_desc against, and an associated command to
1961    execute. */
1962 static int
1963 execute_case_command (case_command)
1964      CASE_COM *case_command;
1965 {
1966   register WORD_LIST *list;
1967   WORD_LIST *wlist, *es;
1968   PATTERN_LIST *clauses;
1969   char *word, *pattern;
1970   int retval, match, ignore_return;
1971
1972   /* Posix.2 specifies that the WORD is tilde expanded. */
1973   if (member ('~', case_command->word->word))
1974     {
1975       word = bash_tilde_expand (case_command->word->word);
1976       free (case_command->word->word);
1977       case_command->word->word = word;
1978     }
1979
1980   wlist = expand_word_unsplit (case_command->word, 0);
1981   word = wlist ? string_list (wlist) : savestring ("");
1982   dispose_words (wlist);
1983
1984   retval = EXECUTION_SUCCESS;
1985   ignore_return = case_command->flags & CMD_IGNORE_RETURN;
1986
1987   begin_unwind_frame ("case");
1988   add_unwind_protect ((Function *)xfree, word);
1989
1990 #define EXIT_CASE()  goto exit_case_command
1991
1992   for (clauses = case_command->clauses; clauses; clauses = clauses->next)
1993     {
1994       QUIT;
1995       for (list = clauses->patterns; list; list = list->next)
1996         {
1997           /* Posix.2 specifies to tilde expand each member of the pattern
1998              list. */
1999           if (member ('~', list->word->word))
2000             {
2001               pattern = bash_tilde_expand (list->word->word);
2002               free (list->word->word);
2003               list->word->word = pattern;
2004             }
2005
2006           es = expand_word_leave_quoted (list->word, 0);
2007
2008           if (es && es->word && es->word->word && *(es->word->word))
2009             pattern = quote_string_for_globbing (es->word->word, QGLOB_CVTNULL);
2010           else
2011             {
2012               pattern = xmalloc (1);
2013               pattern[0] = '\0';
2014             }
2015
2016           /* Since the pattern does not undergo quote removal (as per
2017              Posix.2, section 3.9.4.3), the fnmatch () call must be able
2018              to recognize backslashes as escape characters. */
2019           match = fnmatch (pattern, word, FNMATCH_EXTFLAG) != FNM_NOMATCH;
2020           free (pattern);
2021
2022           dispose_words (es);
2023
2024           if (match)
2025             {
2026               if (clauses->action && ignore_return)
2027                 clauses->action->flags |= CMD_IGNORE_RETURN;
2028               retval = execute_command (clauses->action);
2029               EXIT_CASE ();
2030             }
2031
2032           QUIT;
2033         }
2034     }
2035
2036 exit_case_command:
2037   free (word);
2038   discard_unwind_frame ("case");
2039   return (retval);
2040 }
2041
2042 #define CMD_WHILE 0
2043 #define CMD_UNTIL 1
2044
2045 /* The WHILE command.  Syntax: WHILE test DO action; DONE.
2046    Repeatedly execute action while executing test produces
2047    EXECUTION_SUCCESS. */
2048 static int
2049 execute_while_command (while_command)
2050      WHILE_COM *while_command;
2051 {
2052   return (execute_while_or_until (while_command, CMD_WHILE));
2053 }
2054
2055 /* UNTIL is just like WHILE except that the test result is negated. */
2056 static int
2057 execute_until_command (while_command)
2058      WHILE_COM *while_command;
2059 {
2060   return (execute_while_or_until (while_command, CMD_UNTIL));
2061 }
2062
2063 /* The body for both while and until.  The only difference between the
2064    two is that the test value is treated differently.  TYPE is
2065    CMD_WHILE or CMD_UNTIL.  The return value for both commands should
2066    be EXECUTION_SUCCESS if no commands in the body are executed, and
2067    the status of the last command executed in the body otherwise. */
2068 static int
2069 execute_while_or_until (while_command, type)
2070      WHILE_COM *while_command;
2071      int type;
2072 {
2073   int return_value, body_status;
2074
2075   body_status = EXECUTION_SUCCESS;
2076   loop_level++;
2077
2078   while_command->test->flags |= CMD_IGNORE_RETURN;
2079   if (while_command->flags & CMD_IGNORE_RETURN)
2080     while_command->action->flags |= CMD_IGNORE_RETURN;
2081
2082   while (1)
2083     {
2084       return_value = execute_command (while_command->test);
2085       REAP ();
2086
2087       if (type == CMD_WHILE && return_value != EXECUTION_SUCCESS)
2088         break;
2089       if (type == CMD_UNTIL && return_value == EXECUTION_SUCCESS)
2090         break;
2091
2092       QUIT;
2093       body_status = execute_command (while_command->action);
2094       QUIT;
2095
2096       if (breaking)
2097         {
2098           breaking--;
2099           break;
2100         }
2101
2102       if (continuing)
2103         {
2104           continuing--;
2105           if (continuing)
2106             break;
2107         }
2108     }
2109   loop_level--;
2110
2111   return (body_status);
2112 }
2113
2114 /* IF test THEN command [ELSE command].
2115    IF also allows ELIF in the place of ELSE IF, but
2116    the parser makes *that* stupidity transparent. */
2117 static int
2118 execute_if_command (if_command)
2119      IF_COM *if_command;
2120 {
2121   int return_value;
2122
2123   if_command->test->flags |= CMD_IGNORE_RETURN;
2124   return_value = execute_command (if_command->test);
2125
2126   if (return_value == EXECUTION_SUCCESS)
2127     {
2128       QUIT;
2129
2130       if (if_command->true_case && (if_command->flags & CMD_IGNORE_RETURN))
2131         if_command->true_case->flags |= CMD_IGNORE_RETURN;
2132
2133       return (execute_command (if_command->true_case));
2134     }
2135   else
2136     {
2137       QUIT;
2138
2139       if (if_command->false_case && (if_command->flags & CMD_IGNORE_RETURN))
2140         if_command->false_case->flags |= CMD_IGNORE_RETURN;
2141
2142       return (execute_command (if_command->false_case));
2143     }
2144 }
2145
2146 #if defined (DPAREN_ARITHMETIC)
2147 static int
2148 execute_arith_command (arith_command)
2149      ARITH_COM *arith_command;
2150 {
2151   int result, expok, expresult;
2152   WORD_LIST *new, *p, *printit;
2153   WORD_DESC *w;
2154
2155   result = 0;
2156
2157   this_command_name = "((";     /* )) */
2158   /* If we're in a function, update the line number information. */
2159   if (variable_context)
2160     line_number = arith_command->line - function_line_number;
2161
2162   new = expand_words (arith_command->exp);
2163
2164   /* If we're tracing, make a new word list with `((' at the front and `))'
2165      at the back and print it. */
2166   if (echo_command_at_execute)
2167     xtrace_print_arith_cmd (new);
2168
2169   result = evalexp (new->word->word, &expok);
2170   dispose_words (new);
2171
2172   if (expok == 0)
2173     return (EXECUTION_FAILURE);
2174
2175   return (result == 0 ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
2176 }
2177 #endif /* DPAREN_ARITHMETIC */
2178
2179 #if defined (COND_COMMAND)
2180
2181 static char *nullstr = "";
2182
2183 static int
2184 execute_cond_node (cond)
2185      COND_COM *cond;
2186 {
2187   int result, invert, patmatch, flags;
2188   char *arg1, *arg2, *print2;
2189
2190   invert = (cond->flags & CMD_INVERT_RETURN);
2191
2192   if (cond->type == COND_EXPR)
2193     result = execute_cond_node (cond->left);
2194   else if (cond->type == COND_OR)
2195     {
2196       result = execute_cond_node (cond->left);
2197       if (result != EXECUTION_SUCCESS)
2198         result = execute_cond_node (cond->right);
2199     }
2200   else if (cond->type == COND_AND)
2201     {
2202       result = execute_cond_node (cond->left);
2203       if (result == EXECUTION_SUCCESS)
2204         result = execute_cond_node (cond->right);
2205     }
2206   else if (cond->type == COND_UNARY)
2207     {
2208       arg1 = cond_expand_word (cond->left->op, 0);
2209       if (arg1 == 0)
2210         arg1 = nullstr;
2211       if (echo_command_at_execute)
2212         xtrace_print_cond_term (cond->type, invert, cond->op, arg1, (char *)NULL);
2213       result = unary_test (cond->op->word, arg1) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
2214       if (arg1 != nullstr)
2215         free (arg1);
2216     }
2217   else if (cond->type == COND_BINARY)
2218     {
2219       patmatch = ((cond->op->word[1] == '=') && (cond->op->word[2] == '\0') &&
2220                   (cond->op->word[0] == '!' || cond->op->word[0] == '=') ||
2221                   (cond->op->word[0] == '=' && cond->op->word[1] == '\0'));
2222
2223       arg1 = cond_expand_word (cond->left->op, 0);
2224       if (arg1 == 0)
2225         arg1 = nullstr;
2226       arg2 = cond_expand_word (cond->right->op, patmatch);
2227       if (arg2 == 0)
2228         arg2 = nullstr;
2229
2230       if (echo_command_at_execute)
2231         xtrace_print_cond_term (cond->type, invert, cond->op, arg1, arg2);
2232
2233       result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP)
2234                                 ? EXECUTION_SUCCESS
2235                                 : EXECUTION_FAILURE;
2236       if (arg1 != nullstr)
2237         free (arg1);
2238       if (arg2 != nullstr)
2239         free (arg2);
2240     }
2241   else
2242     {
2243       command_error ("execute_cond_node", CMDERR_BADTYPE, cond->type, 0);
2244       jump_to_top_level (DISCARD);
2245       result = EXECUTION_FAILURE;
2246     }
2247
2248   if (invert)
2249     result = (result == EXECUTION_SUCCESS) ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
2250
2251   return result;
2252 }
2253
2254 static int
2255 execute_cond_command (cond_command)
2256      COND_COM *cond_command;
2257 {
2258   int result;
2259
2260   result = EXECUTION_SUCCESS;
2261
2262   this_command_name = "[[";
2263   /* If we're in a function, update the line number information. */
2264   if (variable_context)
2265     line_number = cond_command->line - function_line_number;
2266
2267 #if 0
2268   debug_print_cond_command (cond_command);
2269 #endif
2270   last_command_exit_value = result = execute_cond_node (cond_command);  
2271   return (result);
2272 }
2273 #endif /* COND_COMMAND */
2274
2275 static void
2276 bind_lastarg (arg)
2277      char *arg;
2278 {
2279   SHELL_VAR *var;
2280
2281   if (arg == 0)
2282     arg = "";
2283   var = bind_variable ("_", arg);
2284   VUNSETATTR (var, att_exported);
2285 }
2286
2287 /* Execute a null command.  Fork a subshell if the command uses pipes or is
2288    to be run asynchronously.  This handles all the side effects that are
2289    supposed to take place. */
2290 static int
2291 execute_null_command (redirects, pipe_in, pipe_out, async, old_last_command_subst_pid)
2292      REDIRECT *redirects;
2293      int pipe_in, pipe_out, async;
2294      pid_t old_last_command_subst_pid;
2295 {
2296   if (pipe_in != NO_PIPE || pipe_out != NO_PIPE || async)
2297     {
2298       /* We have a null command, but we really want a subshell to take
2299          care of it.  Just fork, do piping and redirections, and exit. */
2300       if (make_child ((char *)NULL, async) == 0)
2301         {
2302           /* Cancel traps, in trap.c. */
2303           restore_original_signals ();          /* XXX */
2304
2305           do_piping (pipe_in, pipe_out);
2306
2307           subshell_environment = SUBSHELL_ASYNC;
2308
2309           if (do_redirections (redirects, 1, 0, 0) == 0)
2310             exit (EXECUTION_SUCCESS);
2311           else
2312             exit (EXECUTION_FAILURE);
2313         }
2314       else
2315         {
2316           close_pipes (pipe_in, pipe_out);
2317 #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
2318           unlink_fifo_list ();
2319 #endif
2320           return (EXECUTION_SUCCESS);
2321         }
2322     }
2323   else
2324     {
2325       /* Even if there aren't any command names, pretend to do the
2326          redirections that are specified.  The user expects the side
2327          effects to take place.  If the redirections fail, then return
2328          failure.  Otherwise, if a command substitution took place while
2329          expanding the command or a redirection, return the value of that
2330          substitution.  Otherwise, return EXECUTION_SUCCESS. */
2331
2332       if (do_redirections (redirects, 0, 0, 0) != 0)
2333         return (EXECUTION_FAILURE);
2334       else if (old_last_command_subst_pid != last_command_subst_pid)
2335         return (last_command_exit_value);
2336       else
2337         return (EXECUTION_SUCCESS);
2338     }
2339 }
2340
2341 /* This is a hack to suppress word splitting for assignment statements
2342    given as arguments to builtins with the ASSIGNMENT_BUILTIN flag set. */
2343 static void
2344 fix_assignment_words (words)
2345      WORD_LIST *words;
2346 {
2347   WORD_LIST *w;
2348   struct builtin *b;
2349
2350   if (words == 0)
2351     return;
2352
2353   b = builtin_address_internal (words->word->word, 0);
2354   if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
2355     return;
2356
2357   for (w = words; w; w = w->next)
2358     if (w->word->flags & W_ASSIGNMENT)
2359       w->word->flags |= (W_NOSPLIT|W_NOGLOB);
2360 }
2361
2362 /* The meaty part of all the executions.  We have to start hacking the
2363    real execution of commands here.  Fork a process, set things up,
2364    execute the command. */
2365 static int
2366 execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
2367      SIMPLE_COM *simple_command;
2368      int pipe_in, pipe_out, async;
2369      struct fd_bitmap *fds_to_close;
2370 {
2371   WORD_LIST *words, *lastword;
2372   char *command_line, *lastarg, *temp;
2373   int first_word_quoted, result, builtin_is_special, already_forked, dofork;
2374   pid_t old_last_command_subst_pid, old_last_async_pid;
2375   Function *builtin;
2376   SHELL_VAR *func;
2377
2378   result = EXECUTION_SUCCESS;
2379   special_builtin_failed = builtin_is_special = 0;
2380   command_line = (char *)0;
2381
2382   /* If we're in a function, update the line number information. */
2383   if (variable_context)
2384     line_number = simple_command->line - function_line_number;
2385
2386   /* Remember what this command line looks like at invocation. */
2387   command_string_index = 0;
2388   print_simple_command (simple_command);
2389
2390   first_word_quoted =
2391     simple_command->words ? (simple_command->words->word->flags & W_QUOTED): 0;
2392
2393   old_last_command_subst_pid = last_command_subst_pid;
2394   old_last_async_pid = last_asynchronous_pid;
2395
2396   already_forked = dofork = 0;
2397
2398   /* If we're in a pipeline or run in the background, set DOFORK so we
2399      make the child early, before word expansion.  This keeps assignment
2400      statements from affecting the parent shell's environment when they
2401      should not. */
2402   dofork = pipe_in != NO_PIPE || pipe_out != NO_PIPE || async;
2403
2404   /* Something like `%2 &' should restart job 2 in the background, not cause
2405      the shell to fork here. */
2406   if (dofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE &&
2407         simple_command->words && simple_command->words->word &&
2408         simple_command->words->word->word &&
2409         (simple_command->words->word->word[0] == '%'))
2410     dofork = 0;
2411
2412   if (dofork)
2413     {
2414       /* XXX memory leak if expand_words() error causes a jump_to_top_level */
2415       command_line = savestring (the_printed_command);
2416
2417       /* Do this now, because execute_disk_command will do it anyway in the
2418          vast majority of cases. */
2419       maybe_make_export_env ();
2420
2421       if (make_child (command_line, async) == 0)
2422         {
2423           already_forked = 1;
2424           simple_command->flags |= CMD_NO_FORK;
2425
2426           subshell_environment = (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
2427                                         ? (SUBSHELL_PIPE|SUBSHELL_FORK)
2428                                         : (SUBSHELL_ASYNC|SUBSHELL_FORK);
2429
2430           /* We need to do this before piping to handle some really
2431              pathological cases where one of the pipe file descriptors
2432              is < 2. */
2433           if (fds_to_close)
2434             close_fd_bitmap (fds_to_close);
2435
2436           do_piping (pipe_in, pipe_out);
2437           pipe_in = pipe_out = -1;
2438
2439           last_asynchronous_pid = old_last_async_pid;
2440         }
2441       else
2442         {
2443           close_pipes (pipe_in, pipe_out);
2444 #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
2445           unlink_fifo_list ();
2446 #endif
2447           command_line = (char *)NULL;      /* don't free this. */
2448           bind_lastarg ((char *)NULL);
2449           return (result);
2450         }
2451     }
2452
2453   /* If we are re-running this as the result of executing the `command'
2454      builtin, do not expand the command words a second time. */
2455   if ((simple_command->flags & CMD_INHIBIT_EXPANSION) == 0)
2456     {
2457       current_fds_to_close = fds_to_close;
2458       fix_assignment_words (simple_command->words);
2459       words = expand_words (simple_command->words);
2460       current_fds_to_close = (struct fd_bitmap *)NULL;
2461     }
2462   else
2463     words = copy_word_list (simple_command->words);
2464
2465   /* It is possible for WORDS not to have anything left in it.
2466      Perhaps all the words consisted of `$foo', and there was
2467      no variable `$foo'. */
2468   if (words == 0)
2469     {
2470       result = execute_null_command (simple_command->redirects,
2471                                      pipe_in, pipe_out,
2472                                      already_forked ? 0 : async,
2473                                      old_last_command_subst_pid);
2474       if (already_forked)
2475         exit (result);
2476       else
2477         {
2478           bind_lastarg ((char *)NULL);
2479           set_pipestatus_from_exit (result);
2480           return (result);
2481         }
2482     }
2483
2484   lastarg = (char *)NULL;
2485
2486   begin_unwind_frame ("simple-command");
2487
2488   if (echo_command_at_execute)
2489     xtrace_print_word_list (words);
2490
2491   builtin = (Function *)NULL;
2492   func = (SHELL_VAR *)NULL;
2493   if ((simple_command->flags & CMD_NO_FUNCTIONS) == 0)
2494     {
2495       /* Posix.2 says special builtins are found before functions.  We
2496          don't set builtin_is_special anywhere other than here, because
2497          this path is followed only when the `command' builtin is *not*
2498          being used, and we don't want to exit the shell if a special
2499          builtin executed with `command builtin' fails.  `command' is not
2500          a special builtin. */
2501       if (posixly_correct)
2502         {
2503           builtin = find_special_builtin (words->word->word);
2504           if (builtin)
2505             builtin_is_special = 1;
2506         }
2507       if (builtin == 0)
2508         func = find_function (words->word->word);
2509     }
2510
2511   add_unwind_protect (dispose_words, words);
2512   QUIT;
2513
2514   /* Bind the last word in this command to "$_" after execution. */
2515   for (lastword = words; lastword->next; lastword = lastword->next)
2516     ;
2517   lastarg = lastword->word->word;
2518
2519 #if defined (JOB_CONTROL)
2520   /* Is this command a job control related thing? */
2521   if (words->word->word[0] == '%' && already_forked == 0)
2522     {
2523       this_command_name = async ? "bg" : "fg";
2524       last_shell_builtin = this_shell_builtin;
2525       this_shell_builtin = builtin_address (this_command_name);
2526       result = (*this_shell_builtin) (words);
2527       goto return_result;
2528     }
2529
2530   /* One other possiblilty.  The user may want to resume an existing job.
2531      If they do, find out whether this word is a candidate for a running
2532      job. */
2533   if (job_control && already_forked == 0 && async == 0 &&
2534         !first_word_quoted &&
2535         !words->next &&
2536         words->word->word[0] &&
2537         !simple_command->redirects &&
2538         pipe_in == NO_PIPE &&
2539         pipe_out == NO_PIPE &&
2540         (temp = get_string_value ("auto_resume")))
2541     {
2542       char *word;
2543       register int i;
2544       int wl, cl, exact, substring, match, started_status;
2545       register PROCESS *p;
2546
2547       word = words->word->word;
2548       exact = STREQ (temp, "exact");
2549       substring = STREQ (temp, "substring");
2550       wl = strlen (word);
2551       for (i = job_slots - 1; i > -1; i--)
2552         {
2553           if (jobs[i] == 0 || (JOBSTATE (i) != JSTOPPED))
2554             continue;
2555
2556           p = jobs[i]->pipe;
2557           do
2558             {
2559               if (exact)
2560                 {
2561                   cl = strlen (p->command);
2562                   match = STREQN (p->command, word, cl);
2563                 }
2564               else if (substring)
2565                 match = strindex (p->command, word) != (char *)0;
2566               else
2567                 match = STREQN (p->command, word, wl);
2568
2569               if (match == 0)
2570                 {
2571                   p = p->next;
2572                   continue;
2573                 }
2574
2575               run_unwind_frame ("simple-command");
2576               this_command_name = "fg";
2577               last_shell_builtin = this_shell_builtin;
2578               this_shell_builtin = builtin_address ("fg");
2579
2580               started_status = start_job (i, 1);
2581               return ((started_status < 0) ? EXECUTION_FAILURE : started_status);
2582             }
2583           while (p != jobs[i]->pipe);
2584         }
2585     }
2586 #endif /* JOB_CONTROL */
2587
2588   /* Remember the name of this command globally. */
2589   this_command_name = words->word->word;
2590
2591   QUIT;
2592
2593   /* This command could be a shell builtin or a user-defined function.
2594      We have already found special builtins by this time, so we do not
2595      set builtin_is_special.  If this is a function or builtin, and we
2596      have pipes, then fork a subshell in here.  Otherwise, just execute
2597      the command directly. */
2598   if (func == 0 && builtin == 0)
2599     builtin = find_shell_builtin (this_command_name);
2600
2601   last_shell_builtin = this_shell_builtin;
2602   this_shell_builtin = builtin;
2603
2604   if (builtin || func)
2605     {
2606       if (already_forked)
2607         {
2608           /* reset_terminating_signals (); */   /* XXX */
2609           /* Cancel traps, in trap.c. */
2610           restore_original_signals ();
2611
2612           if (async)
2613             {
2614               if ((simple_command->flags & CMD_STDIN_REDIR) &&
2615                     pipe_in == NO_PIPE &&
2616                     (stdin_redirects (simple_command->redirects) == 0))
2617                 async_redirect_stdin ();
2618               setup_async_signals ();
2619             }
2620
2621           execute_subshell_builtin_or_function
2622             (words, simple_command->redirects, builtin, func,
2623              pipe_in, pipe_out, async, fds_to_close,
2624              simple_command->flags);
2625         }
2626       else
2627         {
2628           result = execute_builtin_or_function
2629             (words, builtin, func, simple_command->redirects, fds_to_close,
2630              simple_command->flags);
2631           if (builtin)
2632             {
2633               if (result > EX_SHERRBASE)
2634                 {
2635                   result = builtin_status (result);
2636                   if (builtin_is_special)
2637                     special_builtin_failed = 1;
2638                 }
2639               /* In POSIX mode, if there are assignment statements preceding
2640                  a special builtin, they persist after the builtin
2641                  completes. */
2642               if (posixly_correct && builtin_is_special && temporary_env)
2643                 merge_temporary_env ();
2644             }
2645           else          /* function */
2646             {
2647               if (result == EX_USAGE)
2648                 result = EX_BADUSAGE;
2649               else if (result > EX_SHERRBASE)
2650                 result = EXECUTION_FAILURE;
2651             }
2652
2653           set_pipestatus_from_exit (result);
2654
2655           goto return_result;
2656         }
2657     }
2658
2659   if (command_line == 0)
2660     command_line = savestring (the_printed_command);
2661
2662   execute_disk_command (words, simple_command->redirects, command_line,
2663                         pipe_in, pipe_out, async, fds_to_close,
2664                         simple_command->flags);
2665
2666  return_result:
2667   bind_lastarg (lastarg);
2668   FREE (command_line);
2669   run_unwind_frame ("simple-command");
2670   return (result);
2671 }
2672
2673 /* Translate the special builtin exit statuses.  We don't really need a
2674    function for this; it's a placeholder for future work. */
2675 static int
2676 builtin_status (result)
2677      int result;
2678 {
2679   int r;
2680
2681   switch (result)
2682     {
2683     case EX_USAGE:
2684       r = EX_BADUSAGE;
2685       break;
2686     case EX_REDIRFAIL:
2687     case EX_BADSYNTAX:
2688     case EX_BADASSIGN:
2689     case EX_EXPFAIL:
2690       r = EXECUTION_FAILURE;
2691       break;
2692     default:
2693       r = EXECUTION_SUCCESS;
2694       break;
2695     }
2696   return (r);
2697 }
2698
2699 static int
2700 execute_builtin (builtin, words, flags, subshell)
2701      Function *builtin;
2702      WORD_LIST *words;
2703      int flags, subshell;
2704 {
2705   int old_e_flag, result, eval_unwind;
2706
2707   old_e_flag = exit_immediately_on_error;
2708   /* The eval builtin calls parse_and_execute, which does not know about
2709      the setting of flags, and always calls the execution functions with
2710      flags that will exit the shell on an error if -e is set.  If the
2711      eval builtin is being called, and we're supposed to ignore the exit
2712      value of the command, we turn the -e flag off ourselves, then
2713      restore it when the command completes. */
2714   if (subshell == 0 && builtin == eval_builtin && (flags & CMD_IGNORE_RETURN))
2715     {
2716       begin_unwind_frame ("eval_builtin");
2717       unwind_protect_int (exit_immediately_on_error);
2718       exit_immediately_on_error = 0;
2719       eval_unwind = 1;
2720     }
2721   else
2722     eval_unwind = 0;
2723
2724   /* The temporary environment for a builtin is supposed to apply to
2725      all commands executed by that builtin.  Currently, this is a
2726      problem only with the `source' and `eval' builtins. */
2727   if (builtin == source_builtin || builtin == eval_builtin)
2728     {
2729       if (subshell == 0)
2730         begin_unwind_frame ("builtin_env");
2731
2732       if (temporary_env)
2733         {
2734           builtin_env = copy_array (temporary_env);
2735           if (subshell == 0)
2736             add_unwind_protect (dispose_builtin_env, (char *)NULL);
2737           dispose_used_env_vars ();
2738         }
2739       /* Otherwise we inherit builtin_env from our caller. */
2740     }
2741
2742   /* `return' does a longjmp() back to a saved environment in execute_function.
2743      If a variable assignment list preceded the command, and the shell is
2744      running in POSIX mode, we need to merge that into the shell_variables
2745      table, since `return' is a POSIX special builtin. */
2746   if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
2747     {
2748       begin_unwind_frame ("return_temp_env");
2749       add_unwind_protect (merge_temporary_env, (char *)NULL);
2750     }
2751
2752   result = ((*builtin) (words->next));
2753
2754   /* This shouldn't happen, but in case `return' comes back instead of
2755      longjmp'ing, we need to unwind. */
2756   if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
2757     discard_unwind_frame ("return_temp_env");
2758
2759   if (subshell == 0 && (builtin == source_builtin || builtin == eval_builtin))
2760     {
2761       /* In POSIX mode, if any variable assignments precede the `.' or
2762          `eval' builtin, they persist after the builtin completes, since `.'
2763          and `eval' are special builtins. */
2764       if (posixly_correct && builtin_env)
2765         merge_builtin_env ();
2766
2767       run_unwind_frame ("builtin_env");
2768     }
2769
2770   if (eval_unwind)
2771     {
2772       exit_immediately_on_error += old_e_flag;
2773       discard_unwind_frame ("eval_builtin");
2774     }
2775
2776   return (result);
2777 }
2778
2779 static int
2780 execute_function (var, words, flags, fds_to_close, async, subshell)
2781      SHELL_VAR *var;
2782      WORD_LIST *words;
2783      int flags, subshell, async;
2784      struct fd_bitmap *fds_to_close;
2785 {
2786   int return_val, result;
2787   COMMAND *tc, *fc;
2788   char *debug_trap;
2789   SHELL_VAR *old_shell_function;
2790
2791   tc = (COMMAND *)copy_command (function_cell (var));
2792   if (tc && (flags & CMD_IGNORE_RETURN))
2793     tc->flags |= CMD_IGNORE_RETURN;
2794
2795   if (subshell == 0)
2796     {
2797       begin_unwind_frame ("function_calling");
2798       push_context ();
2799       add_unwind_protect (pop_context, (char *)NULL);
2800       unwind_protect_int (line_number);
2801       unwind_protect_int (return_catch_flag);
2802       unwind_protect_jmp_buf (return_catch);
2803       add_unwind_protect (dispose_command, (char *)tc);
2804       unwind_protect_pointer (this_shell_function);
2805       unwind_protect_int (loop_level);
2806     }
2807
2808   this_shell_function = var;
2809   make_funcname_visible (1);
2810
2811   debug_trap = (signal_is_trapped (DEBUG_TRAP) && signal_is_ignored (DEBUG_TRAP) == 0)
2812                         ? trap_list[DEBUG_TRAP]
2813                         : (char *)NULL;
2814   if (debug_trap)
2815     {
2816       if (subshell == 0)
2817         {
2818           debug_trap = savestring (debug_trap);
2819           /* XXX order is important here!  unwind-protect commands are run
2820              in reverse order of registering.  If this causes problems,
2821              take out the xfree unwind-protect and live with the small
2822              memory leak. */
2823           add_unwind_protect (xfree, debug_trap);
2824           add_unwind_protect (set_debug_trap, debug_trap);
2825         }
2826       restore_default_signal (DEBUG_TRAP);
2827     }
2828
2829   /* The temporary environment for a function is supposed to apply to
2830      all commands executed within the function body. */
2831   if (temporary_env)
2832     {
2833       function_env = copy_array (temporary_env);
2834       /* In POSIX mode, variable assignments preceding function names are
2835          supposed to persist in the environment after the function returns,
2836          as if a special builtin command had been executed. */
2837       if (subshell == 0)
2838         {
2839           if (posixly_correct)
2840             add_unwind_protect (merge_function_env, (char *)NULL);
2841           else
2842             add_unwind_protect (dispose_function_env, (char *)NULL);
2843         }
2844       dispose_used_env_vars ();
2845     }
2846     /* Otherwise, we inherit function_env from our caller. */
2847
2848   remember_args (words->next, 1);
2849
2850   /* Number of the line on which the function body starts. */
2851   line_number = function_line_number = tc->line;
2852
2853   if (subshell)
2854     {
2855 #if defined (JOB_CONTROL)
2856       stop_pipeline (async, (COMMAND *)NULL);
2857 #endif
2858       fc = (tc->type == cm_group) ? tc->value.Group->command : tc;
2859
2860       if (fc && (flags & CMD_IGNORE_RETURN))
2861         fc->flags |= CMD_IGNORE_RETURN;
2862
2863       variable_context++;
2864     }
2865   else
2866     fc = tc;
2867
2868   return_catch_flag++;
2869   return_val = setjmp (return_catch);
2870
2871   if (return_val)
2872     result = return_catch_value;
2873   else
2874     result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);
2875
2876   if (subshell == 0)
2877     run_unwind_frame ("function_calling");
2878
2879   if (variable_context == 0 || this_shell_function == 0)
2880     make_funcname_visible (0);
2881
2882   return (result);
2883 }
2884
2885 /* A convenience routine for use by other parts of the shell to execute
2886    a particular shell function. */
2887 int
2888 execute_shell_function (var, words)
2889      SHELL_VAR *var;
2890      WORD_LIST *words;
2891 {
2892   int ret;
2893   struct fd_bitmap *bitmap;
2894
2895   bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);
2896   begin_unwind_frame ("execute-shell-function");
2897   add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);
2898       
2899   ret = execute_function (var, words, 0, bitmap, 0, 0);
2900
2901   dispose_fd_bitmap (bitmap);
2902   discard_unwind_frame ("execute-shell-function");
2903
2904   return ret;
2905 }
2906
2907 /* Execute a shell builtin or function in a subshell environment.  This
2908    routine does not return; it only calls exit().  If BUILTIN is non-null,
2909    it points to a function to call to execute a shell builtin; otherwise
2910    VAR points at the body of a function to execute.  WORDS is the arguments
2911    to the command, REDIRECTS specifies redirections to perform before the
2912    command is executed. */
2913 static void
2914 execute_subshell_builtin_or_function (words, redirects, builtin, var,
2915                                       pipe_in, pipe_out, async, fds_to_close,
2916                                       flags)
2917      WORD_LIST *words;
2918      REDIRECT *redirects;
2919      Function *builtin;
2920      SHELL_VAR *var;
2921      int pipe_in, pipe_out, async;
2922      struct fd_bitmap *fds_to_close;
2923      int flags;
2924 {
2925   int result, r;
2926 #if defined (JOB_CONTROL)
2927   int jobs_hack;
2928
2929   jobs_hack = (builtin == jobs_builtin) &&
2930                 ((subshell_environment & SUBSHELL_ASYNC) == 0 || pipe_out != NO_PIPE);
2931 #endif
2932
2933   /* A subshell is neither a login shell nor interactive. */
2934   login_shell = interactive = 0;
2935
2936   subshell_environment = SUBSHELL_ASYNC;
2937
2938   maybe_make_export_env ();     /* XXX - is this needed? */
2939
2940 #if defined (JOB_CONTROL)
2941   /* Eradicate all traces of job control after we fork the subshell, so
2942      all jobs begun by this subshell are in the same process group as
2943      the shell itself. */
2944
2945   /* Allow the output of `jobs' to be piped. */
2946   if (jobs_hack)
2947     kill_current_pipeline ();
2948   else
2949     without_job_control ();
2950
2951   set_sigchld_handler ();
2952 #endif /* JOB_CONTROL */
2953
2954   set_sigint_handler ();
2955
2956   if (fds_to_close)
2957     close_fd_bitmap (fds_to_close);
2958
2959   do_piping (pipe_in, pipe_out);
2960
2961   if (do_redirections (redirects, 1, 0, 0) != 0)
2962     exit (EXECUTION_FAILURE);
2963
2964   if (builtin)
2965     {
2966       /* Give builtins a place to jump back to on failure,
2967          so we don't go back up to main(). */
2968       result = setjmp (top_level);
2969
2970       if (result == EXITPROG)
2971         exit (last_command_exit_value);
2972       else if (result)
2973         exit (EXECUTION_FAILURE);
2974       else
2975         {
2976           r = execute_builtin (builtin, words, flags, 1);
2977           if (r == EX_USAGE)
2978             r = EX_BADUSAGE;
2979           exit (r);
2980         }
2981     }
2982   else
2983     exit (execute_function (var, words, flags, fds_to_close, async, 1));
2984 }
2985
2986 /* Execute a builtin or function in the current shell context.  If BUILTIN
2987    is non-null, it is the builtin command to execute, otherwise VAR points
2988    to the body of a function.  WORDS are the command's arguments, REDIRECTS
2989    are the redirections to perform.  FDS_TO_CLOSE is the usual bitmap of
2990    file descriptors to close.
2991
2992    If BUILTIN is exec_builtin, the redirections specified in REDIRECTS are
2993    not undone before this function returns. */
2994 static int
2995 execute_builtin_or_function (words, builtin, var, redirects,
2996                              fds_to_close, flags)
2997      WORD_LIST *words;
2998      Function *builtin;
2999      SHELL_VAR *var;
3000      REDIRECT *redirects;
3001      struct fd_bitmap *fds_to_close;
3002      int flags;
3003 {
3004   int result;
3005   REDIRECT *saved_undo_list;
3006   Function *saved_this_shell_builtin;
3007
3008   if (do_redirections (redirects, 1, 1, 0) != 0)
3009     {
3010       cleanup_redirects (redirection_undo_list);
3011       redirection_undo_list = (REDIRECT *)NULL;
3012       dispose_exec_redirects ();
3013       return (EX_REDIRFAIL);    /* was EXECUTION_FAILURE */
3014     }
3015
3016   saved_this_shell_builtin = this_shell_builtin;
3017   saved_undo_list = redirection_undo_list;
3018
3019   /* Calling the "exec" builtin changes redirections forever. */
3020   if (builtin == exec_builtin)
3021     {
3022       dispose_redirects (saved_undo_list);
3023       saved_undo_list = exec_redirection_undo_list;
3024       exec_redirection_undo_list = (REDIRECT *)NULL;
3025     }
3026   else
3027     dispose_exec_redirects ();
3028
3029   if (saved_undo_list)
3030     {
3031       begin_unwind_frame ("saved redirects");
3032       add_unwind_protect (cleanup_redirects, (char *)saved_undo_list);
3033     }
3034
3035   redirection_undo_list = (REDIRECT *)NULL;
3036
3037   if (builtin)
3038     result = execute_builtin (builtin, words, flags, 0);
3039   else
3040     result = execute_function (var, words, flags, fds_to_close, 0, 0);
3041
3042   /* If we are executing the `command' builtin, but this_shell_builtin is
3043      set to `exec_builtin', we know that we have something like
3044      `command exec [redirection]', since otherwise `exec' would have
3045      overwritten the shell and we wouldn't get here.  In this case, we
3046      want to behave as if the `command' builtin had not been specified
3047      and preserve the redirections. */
3048   if (builtin == command_builtin && this_shell_builtin == exec_builtin)
3049     {
3050       if (saved_undo_list)
3051         dispose_redirects (saved_undo_list);
3052       redirection_undo_list = exec_redirection_undo_list;
3053       saved_undo_list = exec_redirection_undo_list = (REDIRECT *)NULL;      
3054       discard_unwind_frame ("saved_redirects");
3055     }
3056
3057   if (saved_undo_list)
3058     {
3059       redirection_undo_list = saved_undo_list;
3060       discard_unwind_frame ("saved redirects");
3061     }
3062
3063   if (redirection_undo_list)
3064     {
3065       cleanup_redirects (redirection_undo_list);
3066       redirection_undo_list = (REDIRECT *)NULL;
3067     }
3068
3069   return (result);
3070 }
3071
3072 void
3073 setup_async_signals ()
3074 {
3075 #if defined (__BEOS__)
3076   set_signal_handler (SIGHUP, SIG_IGN); /* they want csh-like behavior */
3077 #endif
3078
3079 #if defined (JOB_CONTROL)
3080   if (job_control == 0)
3081 #endif
3082     {
3083       set_signal_handler (SIGINT, SIG_IGN);
3084       set_signal_ignored (SIGINT);
3085       set_signal_handler (SIGQUIT, SIG_IGN);
3086       set_signal_ignored (SIGQUIT);
3087     }
3088 }
3089
3090 /* Execute a simple command that is hopefully defined in a disk file
3091    somewhere.
3092
3093    1) fork ()
3094    2) connect pipes
3095    3) look up the command
3096    4) do redirections
3097    5) execve ()
3098    6) If the execve failed, see if the file has executable mode set.
3099    If so, and it isn't a directory, then execute its contents as
3100    a shell script.
3101
3102    Note that the filename hashing stuff has to take place up here,
3103    in the parent.  This is probably why the Bourne style shells
3104    don't handle it, since that would require them to go through
3105    this gnarly hair, for no good reason.  */
3106 static void
3107 execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
3108                       async, fds_to_close, cmdflags)
3109      WORD_LIST *words;
3110      REDIRECT *redirects;
3111      char *command_line;
3112      int pipe_in, pipe_out, async;
3113      struct fd_bitmap *fds_to_close;
3114      int cmdflags;
3115 {
3116   char *pathname, *command, **args;
3117   int nofork;
3118   pid_t pid;
3119
3120   nofork = (cmdflags & CMD_NO_FORK);  /* Don't fork, just exec, if no pipes */
3121   pathname = words->word->word;
3122
3123 #if defined (RESTRICTED_SHELL)
3124   if (restricted && strchr (pathname, '/'))
3125     {
3126       internal_error ("%s: restricted: cannot specify `/' in command names",
3127                     pathname);
3128       last_command_exit_value = EXECUTION_FAILURE;
3129       return;
3130     }
3131 #endif /* RESTRICTED_SHELL */
3132
3133   command = search_for_command (pathname);
3134
3135   if (command)
3136     {
3137       maybe_make_export_env ();
3138       put_command_name_into_env (command);
3139     }
3140
3141   /* We have to make the child before we check for the non-existence
3142      of COMMAND, since we want the error messages to be redirected. */
3143   /* If we can get away without forking and there are no pipes to deal with,
3144      don't bother to fork, just directly exec the command. */
3145   if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
3146     pid = 0;
3147   else
3148     pid = make_child (savestring (command_line), async);
3149
3150   if (pid == 0)
3151     {
3152       int old_interactive;
3153
3154 #if 0
3155       /* This has been disabled for the time being. */
3156 #if !defined (ARG_MAX) || ARG_MAX >= 10240
3157       if (posixly_correct == 0)
3158         put_gnu_argv_flags_into_env ((int)getpid (), glob_argv_flags);
3159 #endif
3160 #endif
3161
3162       /* Cancel traps, in trap.c. */
3163       restore_original_signals ();
3164
3165       /* restore_original_signals may have undone the work done
3166          by make_child to ensure that SIGINT and SIGQUIT are ignored
3167          in asynchronous children. */
3168       if (async)
3169         {
3170           if ((cmdflags & CMD_STDIN_REDIR) &&
3171                 pipe_in == NO_PIPE &&
3172                 (stdin_redirects (redirects) == 0))
3173             async_redirect_stdin ();
3174           setup_async_signals ();
3175         }
3176
3177       /* This functionality is now provided by close-on-exec of the
3178          file descriptors manipulated by redirection and piping.
3179          Some file descriptors still need to be closed in all children
3180          because of the way bash does pipes; fds_to_close is a
3181          bitmap of all such file descriptors. */
3182       if (fds_to_close)
3183         close_fd_bitmap (fds_to_close);
3184
3185       do_piping (pipe_in, pipe_out);
3186
3187       if (async)
3188         {
3189           old_interactive = interactive;
3190           interactive = 0;
3191         }
3192
3193       subshell_environment = SUBSHELL_FORK;
3194
3195       if (redirects && (do_redirections (redirects, 1, 0, 0) != 0))
3196         {
3197 #if defined (PROCESS_SUBSTITUTION)
3198           /* Try to remove named pipes that may have been created as the
3199              result of redirections. */
3200           unlink_fifo_list ();
3201 #endif /* PROCESS_SUBSTITUTION */
3202           exit (EXECUTION_FAILURE);
3203         }
3204
3205       if (async)
3206         interactive = old_interactive;
3207
3208       if (command == 0)
3209         {
3210           internal_error ("%s: command not found", pathname);
3211           exit (EX_NOTFOUND);   /* Posix.2 says the exit status is 127 */
3212         }
3213
3214       /* Execve expects the command name to be in args[0].  So we
3215          leave it there, in the same format that the user used to
3216          type it in. */
3217       args = word_list_to_argv (words, 0, 0, (int *)NULL);
3218       exit (shell_execve (command, args, export_env));
3219     }
3220   else
3221     {
3222       /* Make sure that the pipes are closed in the parent. */
3223       close_pipes (pipe_in, pipe_out);
3224 #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
3225       unlink_fifo_list ();
3226 #endif
3227       FREE (command);
3228     }
3229 }
3230
3231 #if !defined (HAVE_HASH_BANG_EXEC)
3232 /* If the operating system on which we're running does not handle
3233    the #! executable format, then help out.  SAMPLE is the text read
3234    from the file, SAMPLE_LEN characters.  COMMAND is the name of
3235    the script; it and ARGS, the arguments given by the user, will
3236    become arguments to the specified interpreter.  ENV is the environment
3237    to pass to the interpreter.
3238
3239    The word immediately following the #! is the interpreter to execute.
3240    A single argument to the interpreter is allowed. */
3241
3242 /* CPP defines to decide whether a particular index into the #! line
3243    corresponds to a valid interpreter name or argument character, or
3244    whitespace.  The MSDOS define is to allow \r to be treated the same
3245    as \n. */
3246
3247 #if !defined (MSDOS)
3248 #  define STRINGCHAR(ind) \
3249     (!whitespace (sample[ind]) && sample[ind] != '\n' && ind < sample_len)
3250 #  define WHITECHAR(ind) \
3251     (whitespace (sample[ind]) && sample[ind] != '\n' && ind < sample_len)
3252 #else   /* MSDOS */
3253 #  define STRINGCHAR(ind) \
3254     (!whitespace (sample[ind]) && sample[ind] != '\n' && sample[ind] != '\r' && ind < sample_len)
3255 #  define WHITECHAR(ind) \
3256     (whitespace (sample[ind]) && sample[ind] != '\n' && sample[ind] != '\r' && ind < sample_len)
3257 #endif  /* MSDOS */
3258
3259 static int
3260 execute_shell_script (sample, sample_len, command, args, env)
3261      unsigned char *sample;
3262      int sample_len;
3263      char *command;
3264      char **args, **env;
3265 {
3266   register int i;
3267   char *execname, *firstarg;
3268   int start, size_increment, larry;
3269
3270   /* Find the name of the interpreter to exec. */
3271   for (i = 2; whitespace (sample[i]) && i < sample_len; i++)
3272     ;
3273
3274   for (start = i; STRINGCHAR(i); i++)
3275     ;
3276
3277   execname = substring ((char *)sample, start, i);
3278   size_increment = 1;
3279
3280   /* Now the argument, if any. */
3281   for (firstarg = (char *)NULL, start = i; WHITECHAR(i); i++)
3282     ;
3283
3284   /* If there is more text on the line, then it is an argument for the
3285      interpreter. */
3286
3287   if (STRINGCHAR(i))  
3288     {
3289       for (start = i; STRINGCHAR(i); i++)
3290         ;
3291       firstarg = substring ((char *)sample, start, i);
3292       size_increment = 2;
3293     }
3294
3295   larry = array_len (args) + size_increment;
3296
3297   args = (char **)xrealloc ((char *)args, (1 + larry) * sizeof (char *));
3298
3299   for (i = larry - 1; i; i--)
3300     args[i] = args[i - size_increment];
3301
3302   args[0] = execname;
3303   if (firstarg)
3304     {
3305       args[1] = firstarg;
3306       args[2] = command;
3307     }
3308   else
3309     args[1] = command;
3310
3311   args[larry] = (char *)NULL;
3312
3313   return (shell_execve (execname, args, env));
3314 }
3315 #undef STRINGCHAR
3316 #undef WHITECHAR
3317
3318 #endif /* !HAVE_HASH_BANG_EXEC */
3319
3320 static void
3321 initialize_subshell ()
3322 {
3323 #if defined (ALIAS)
3324   /* Forget about any aliases that we knew of.  We are in a subshell. */
3325   delete_all_aliases ();
3326 #endif /* ALIAS */
3327
3328 #if defined (HISTORY)
3329   /* Forget about the history lines we have read.  This is a non-interactive
3330      subshell. */
3331   history_lines_this_session = 0;
3332 #endif
3333
3334 #if defined (JOB_CONTROL)
3335   /* Forget about the way job control was working. We are in a subshell. */
3336   without_job_control ();
3337   set_sigchld_handler ();
3338 #endif /* JOB_CONTROL */
3339
3340   /* Reset the values of the shell flags and options. */
3341   reset_shell_flags ();
3342   reset_shell_options ();
3343   reset_shopt_options ();
3344
3345   /* Zero out builtin_env, since this could be a shell script run from a
3346      sourced file with a temporary environment supplied to the `source/.'
3347      builtin.  Such variables are not supposed to be exported (empirical
3348      testing with sh and ksh). */
3349   builtin_env = 0;
3350
3351   clear_unwind_protect_list (0);
3352
3353   /* We're no longer inside a shell function. */
3354   variable_context = return_catch_flag = 0;
3355
3356   /* If we're not interactive, close the file descriptor from which we're
3357      reading the current shell script. */
3358   if (interactive_shell == 0)
3359     unset_bash_input (1);
3360 }
3361
3362 #if defined (HAVE_SETOSTYPE) && defined (_POSIX_SOURCE)
3363 #  define SETOSTYPE(x)  __setostype(x)
3364 #else
3365 #  define SETOSTYPE(x)
3366 #endif
3367
3368 #define READ_SAMPLE_BUF(file, buf, len) \
3369   do \
3370     { \
3371       fd = open(file, O_RDONLY); \
3372       if (fd >= 0) \
3373         { \
3374           len = read (fd, (char *)buf, 80); \
3375           close (fd); \
3376         } \
3377       else \
3378         len = -1; \
3379     } \
3380   while (0)
3381       
3382 /* Call execve (), handling interpreting shell scripts, and handling
3383    exec failures. */
3384 int
3385 shell_execve (command, args, env)
3386      char *command;
3387      char **args, **env;
3388 {
3389   struct stat finfo;
3390   int larray, i, fd;
3391   unsigned char sample[80];
3392   int sample_len;
3393
3394   SETOSTYPE (0);                /* Some systems use for USG/POSIX semantics */
3395   execve (command, args, env);
3396   i = errno;                    /* error from execve() */
3397   SETOSTYPE (1);
3398
3399   /* If we get to this point, then start checking out the file.
3400      Maybe it is something we can hack ourselves. */
3401   if (i != ENOEXEC)
3402     {
3403       if ((stat (command, &finfo) == 0) && (S_ISDIR (finfo.st_mode)))
3404         internal_error ("%s: is a directory", command);
3405       else
3406         {
3407 #if defined (HAVE_HASH_BANG_EXEC)
3408           READ_SAMPLE_BUF (command, sample, sample_len);
3409           if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
3410             {
3411               errno = i;
3412               sys_error ("%s: bad interpreter", command);
3413               return (EX_NOEXEC);
3414             }
3415 #endif
3416           errno = i;
3417           file_error (command);
3418         }
3419       return ((i == ENOENT) ? EX_NOTFOUND : EX_NOEXEC); /* XXX Posix.2 says that exit status is 126 */
3420     }
3421
3422   /* This file is executable.
3423      If it begins with #!, then help out people with losing operating
3424      systems.  Otherwise, check to see if it is a binary file by seeing
3425      if the contents of the first line (or up to 80 characters) are in the
3426      ASCII set.  If it's a text file, execute the contents as shell commands,
3427      otherwise return 126 (EX_BINARY_FILE). */
3428   READ_SAMPLE_BUF (command, sample, sample_len);
3429
3430   if (sample_len == 0)
3431     return (EXECUTION_SUCCESS);
3432
3433   /* Is this supposed to be an executable script?
3434      If so, the format of the line is "#! interpreter [argument]".
3435      A single argument is allowed.  The BSD kernel restricts
3436      the length of the entire line to 32 characters (32 bytes
3437      being the size of the BSD exec header), but we allow 80
3438      characters. */
3439   if (sample_len > 0)
3440     {
3441 #if !defined (HAVE_HASH_BANG_EXEC)
3442       if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
3443         return (execute_shell_script (sample, sample_len, command, args, env));
3444       else
3445 #endif
3446       if (check_binary_file (sample, sample_len))
3447         {
3448           internal_error ("%s: cannot execute binary file", command);
3449           return (EX_BINARY_FILE);
3450         }
3451     }
3452
3453   /* We have committed to attempting to execute the contents of this file
3454      as shell commands. */
3455
3456   initialize_subshell ();
3457
3458   set_sigint_handler ();
3459
3460   /* Insert the name of this shell into the argument list. */
3461   larray = array_len (args) + 1;
3462   args = (char **)xrealloc ((char *)args, (1 + larray) * sizeof (char *));
3463
3464   for (i = larray - 1; i; i--)
3465     args[i] = args[i - 1];
3466
3467   args[0] = shell_name;
3468   args[1] = command;
3469   args[larray] = (char *)NULL;
3470
3471   if (args[0][0] == '-')
3472     args[0]++;
3473
3474 #if defined (RESTRICTED_SHELL)
3475   if (restricted)
3476     change_flag ('r', FLAG_OFF);
3477 #endif
3478
3479   if (subshell_argv)
3480     {
3481       /* Can't free subshell_argv[0]; that is shell_name. */
3482       for (i = 1; i < subshell_argc; i++)
3483         free (subshell_argv[i]);
3484       free (subshell_argv);
3485     }
3486
3487   dispose_command (currently_executing_command);        /* XXX */
3488   currently_executing_command = (COMMAND *)NULL;
3489
3490   subshell_argc = larray;
3491   subshell_argv = args;
3492   subshell_envp = env;
3493
3494   unbind_args ();       /* remove the positional parameters */
3495
3496   longjmp (subshell_top_level, 1);
3497 }
3498
3499 static int
3500 execute_intern_function (name, function)
3501      WORD_DESC *name;
3502      COMMAND *function;
3503 {
3504   SHELL_VAR *var;
3505
3506   if (check_identifier (name, posixly_correct) == 0)
3507     {
3508       if (posixly_correct && interactive_shell == 0)
3509         {
3510           last_command_exit_value = EX_USAGE;
3511           jump_to_top_level (EXITPROG);
3512         }
3513       return (EXECUTION_FAILURE);
3514     }
3515
3516   var = find_function (name->word);
3517   if (var && (readonly_p (var) || noassign_p (var)))
3518     {
3519       if (readonly_p (var))
3520         internal_error ("%s: readonly function", var->name);
3521       return (EXECUTION_FAILURE);
3522     }
3523
3524   bind_function (name->word, function);
3525   return (EXECUTION_SUCCESS);
3526 }
3527
3528 #if defined (INCLUDE_UNUSED)
3529 #if defined (PROCESS_SUBSTITUTION)
3530 void
3531 close_all_files ()
3532 {
3533   register int i, fd_table_size;
3534
3535   fd_table_size = getdtablesize ();
3536   if (fd_table_size > 256)      /* clamp to a reasonable value */
3537         fd_table_size = 256;
3538
3539   for (i = 3; i < fd_table_size; i++)
3540     close (i);
3541 }
3542 #endif /* PROCESS_SUBSTITUTION */
3543 #endif
3544
3545 static void
3546 close_pipes (in, out)
3547      int in, out;
3548 {
3549   if (in >= 0)
3550     close (in);
3551   if (out >= 0)
3552     close (out);
3553 }
3554
3555 /* Redirect input and output to be from and to the specified pipes.
3556    NO_PIPE and REDIRECT_BOTH are handled correctly. */
3557 static void
3558 do_piping (pipe_in, pipe_out)
3559      int pipe_in, pipe_out;
3560 {
3561   if (pipe_in != NO_PIPE)
3562     {
3563       if (dup2 (pipe_in, 0) < 0)
3564         sys_error ("cannot duplicate fd %d to fd 0", pipe_in);
3565       if (pipe_in > 0)
3566         close (pipe_in);
3567     }
3568   if (pipe_out != NO_PIPE)
3569     {
3570       if (pipe_out != REDIRECT_BOTH)
3571         {
3572           if (dup2 (pipe_out, 1) < 0)
3573             sys_error ("cannot duplicate fd %d to fd 1", pipe_out);
3574           if (pipe_out == 0 || pipe_out > 1)
3575             close (pipe_out);
3576         }
3577       else
3578         {
3579           if (dup2 (1, 2) < 0)
3580             sys_error ("cannot duplicate fd 1 to fd 2");
3581         }
3582     }
3583 }