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