ash: [PARSER] Add FAKEEOFMARK for expandstr
[oweals/busybox.git] / shell / hush.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * A prototype Bourne shell grammar parser.
4  * Intended to follow the original Thompson and Ritchie
5  * "small and simple is beautiful" philosophy, which
6  * incidentally is a good match to today's BusyBox.
7  *
8  * Copyright (C) 2000,2001  Larry Doolittle <larry@doolittle.boa.org>
9  * Copyright (C) 2008,2009  Denys Vlasenko <vda.linux@googlemail.com>
10  *
11  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
12  *
13  * Credits:
14  *      The parser routines proper are all original material, first
15  *      written Dec 2000 and Jan 2001 by Larry Doolittle.  The
16  *      execution engine, the builtins, and much of the underlying
17  *      support has been adapted from busybox-0.49pre's lash, which is
18  *      Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
19  *      written by Erik Andersen <andersen@codepoet.org>.  That, in turn,
20  *      is based in part on ladsh.c, by Michael K. Johnson and Erik W.
21  *      Troan, which they placed in the public domain.  I don't know
22  *      how much of the Johnson/Troan code has survived the repeated
23  *      rewrites.
24  *
25  * Other credits:
26  *      o_addchr derived from similar w_addchar function in glibc-2.2.
27  *      parse_redirect, redirect_opt_num, and big chunks of main
28  *      and many builtins derived from contributions by Erik Andersen.
29  *      Miscellaneous bugfixes from Matt Kraai.
30  *
31  * There are two big (and related) architecture differences between
32  * this parser and the lash parser.  One is that this version is
33  * actually designed from the ground up to understand nearly all
34  * of the Bourne grammar.  The second, consequential change is that
35  * the parser and input reader have been turned inside out.  Now,
36  * the parser is in control, and asks for input as needed.  The old
37  * way had the input reader in control, and it asked for parsing to
38  * take place as needed.  The new way makes it much easier to properly
39  * handle the recursion implicit in the various substitutions, especially
40  * across continuation lines.
41  *
42  * TODOs:
43  *      grep for "TODO" and fix (some of them are easy)
44  *      make complex ${var%...} constructs support optional
45  *      make here documents optional
46  *      special variables (done: PWD, PPID, RANDOM)
47  *      follow IFS rules more precisely, including update semantics
48  *      tilde expansion
49  *      aliases
50  *      builtins mandated by standards we don't support:
51  *          [un]alias, command, fc, getopts, times:
52  *          command -v CMD: print "/path/to/CMD"
53  *              prints "CMD" for builtins
54  *              prints "alias ALIAS='EXPANSION'" for aliases
55  *              prints nothing and sets $? to 1 if not found
56  *          command -V CMD: print "CMD is /path/CMD|a shell builtin|etc"
57  *          command [-p] CMD: run CMD, even if a function CMD also exists
58  *              (can use this to override standalone shell as well)
59  *              -p: use default $PATH
60  *          command BLTIN: disables special-ness (e.g. errors do not abort)
61  *          getopts: getopt() for shells
62  *          times: print getrusage(SELF/CHILDREN).ru_utime/ru_stime
63  *          fc -l[nr] [BEG] [END]: list range of commands in history
64  *          fc [-e EDITOR] [BEG] [END]: edit/rerun range of commands
65  *          fc -s [PAT=REP] [CMD]: rerun CMD, replacing PAT with REP
66  *
67  * Bash compat TODO:
68  *      redirection of stdout+stderr: &> and >&
69  *      reserved words: function select
70  *      advanced test: [[ ]]
71  *      process substitution: <(list) and >(list)
72  *      =~: regex operator
73  *      let EXPR [EXPR...]
74  *          Each EXPR is an arithmetic expression (ARITHMETIC EVALUATION)
75  *          If the last arg evaluates to 0, let returns 1; 0 otherwise.
76  *          NB: let `echo 'a=a + 1'` - error (IOW: multi-word expansion is used)
77  *      ((EXPR))
78  *          The EXPR is evaluated according to ARITHMETIC EVALUATION.
79  *          This is exactly equivalent to let "EXPR".
80  *      $[EXPR]: synonym for $((EXPR))
81  *      indirect expansion: ${!VAR}
82  *      substring op on @: ${@:n:m}
83  *
84  * Won't do:
85  *      Some builtins mandated by standards:
86  *          newgrp [GRP]: not a builtin in bash but a suid binary
87  *              which spawns a new shell with new group ID
88  *      In bash, export builtin is special, its arguments are assignments
89  *          and therefore expansion of them should be "one-word" expansion:
90  *              $ export i=`echo 'a  b'` # export has one arg: "i=a  b"
91  *          compare with:
92  *              $ ls i=`echo 'a  b'`     # ls has two args: "i=a" and "b"
93  *              ls: cannot access i=a: No such file or directory
94  *              ls: cannot access b: No such file or directory
95  *          Note1: same applies to local builtin.
96  *          Note2: bash 3.2.33(1) does this only if export word itself
97  *          is not quoted:
98  *              $ export i=`echo 'aaa  bbb'`; echo "$i"
99  *              aaa  bbb
100  *              $ "export" i=`echo 'aaa  bbb'`; echo "$i"
101  *              aaa
102  */
103 //config:config HUSH
104 //config:       bool "hush (64 kb)"
105 //config:       default y
106 //config:       help
107 //config:       hush is a small shell. It handles the normal flow control
108 //config:       constructs such as if/then/elif/else/fi, for/in/do/done, while loops,
109 //config:       case/esac. Redirections, here documents, $((arithmetic))
110 //config:       and functions are supported.
111 //config:
112 //config:       It will compile and work on no-mmu systems.
113 //config:
114 //config:       It does not handle select, aliases, tilde expansion,
115 //config:       &>file and >&file redirection of stdout+stderr.
116 //config:
117 //config:config HUSH_BASH_COMPAT
118 //config:       bool "bash-compatible extensions"
119 //config:       default y
120 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
121 //config:
122 //config:config HUSH_BRACE_EXPANSION
123 //config:       bool "Brace expansion"
124 //config:       default y
125 //config:       depends on HUSH_BASH_COMPAT
126 //config:       help
127 //config:       Enable {abc,def} extension.
128 //config:
129 //config:config HUSH_INTERACTIVE
130 //config:       bool "Interactive mode"
131 //config:       default y
132 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
133 //config:       help
134 //config:       Enable interactive mode (prompt and command editing).
135 //config:       Without this, hush simply reads and executes commands
136 //config:       from stdin just like a shell script from a file.
137 //config:       No prompt, no PS1/PS2 magic shell variables.
138 //config:
139 //config:config HUSH_SAVEHISTORY
140 //config:       bool "Save command history to .hush_history"
141 //config:       default y
142 //config:       depends on HUSH_INTERACTIVE && FEATURE_EDITING_SAVEHISTORY
143 //config:
144 //config:config HUSH_JOB
145 //config:       bool "Job control"
146 //config:       default y
147 //config:       depends on HUSH_INTERACTIVE
148 //config:       help
149 //config:       Enable job control: Ctrl-Z backgrounds, Ctrl-C interrupts current
150 //config:       command (not entire shell), fg/bg builtins work. Without this option,
151 //config:       "cmd &" still works by simply spawning a process and immediately
152 //config:       prompting for next command (or executing next command in a script),
153 //config:       but no separate process group is formed.
154 //config:
155 //config:config HUSH_TICK
156 //config:       bool "Support process substitution"
157 //config:       default y
158 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
159 //config:       help
160 //config:       Enable `command` and $(command).
161 //config:
162 //config:config HUSH_IF
163 //config:       bool "Support if/then/elif/else/fi"
164 //config:       default y
165 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
166 //config:
167 //config:config HUSH_LOOPS
168 //config:       bool "Support for, while and until loops"
169 //config:       default y
170 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
171 //config:
172 //config:config HUSH_CASE
173 //config:       bool "Support case ... esac statement"
174 //config:       default y
175 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
176 //config:       help
177 //config:       Enable case ... esac statement. +400 bytes.
178 //config:
179 //config:config HUSH_FUNCTIONS
180 //config:       bool "Support funcname() { commands; } syntax"
181 //config:       default y
182 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
183 //config:       help
184 //config:       Enable support for shell functions. +800 bytes.
185 //config:
186 //config:config HUSH_LOCAL
187 //config:       bool "local builtin"
188 //config:       default y
189 //config:       depends on HUSH_FUNCTIONS
190 //config:       help
191 //config:       Enable support for local variables in functions.
192 //config:
193 //config:config HUSH_RANDOM_SUPPORT
194 //config:       bool "Pseudorandom generator and $RANDOM variable"
195 //config:       default y
196 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
197 //config:       help
198 //config:       Enable pseudorandom generator and dynamic variable "$RANDOM".
199 //config:       Each read of "$RANDOM" will generate a new pseudorandom value.
200 //config:
201 //config:config HUSH_MODE_X
202 //config:       bool "Support 'hush -x' option and 'set -x' command"
203 //config:       default y
204 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
205 //config:       help
206 //config:       This instructs hush to print commands before execution.
207 //config:       Adds ~300 bytes.
208 //config:
209 //config:config HUSH_ECHO
210 //config:       bool "echo builtin"
211 //config:       default y
212 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
213 //config:
214 //config:config HUSH_PRINTF
215 //config:       bool "printf builtin"
216 //config:       default y
217 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
218 //config:
219 //config:config HUSH_TEST
220 //config:       bool "test builtin"
221 //config:       default y
222 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
223 //config:
224 //config:config HUSH_HELP
225 //config:       bool "help builtin"
226 //config:       default y
227 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
228 //config:
229 //config:config HUSH_EXPORT
230 //config:       bool "export builtin"
231 //config:       default y
232 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
233 //config:
234 //config:config HUSH_EXPORT_N
235 //config:       bool "Support 'export -n' option"
236 //config:       default y
237 //config:       depends on HUSH_EXPORT
238 //config:       help
239 //config:       export -n unexports variables. It is a bash extension.
240 //config:
241 //config:config HUSH_READONLY
242 //config:       bool "readonly builtin"
243 //config:       default y
244 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
245 //config:       help
246 //config:       Enable support for read-only variables.
247 //config:
248 //config:config HUSH_KILL
249 //config:       bool "kill builtin (supports kill %jobspec)"
250 //config:       default y
251 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
252 //config:
253 //config:config HUSH_WAIT
254 //config:       bool "wait builtin"
255 //config:       default y
256 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
257 //config:
258 //config:config HUSH_TRAP
259 //config:       bool "trap builtin"
260 //config:       default y
261 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
262 //config:
263 //config:config HUSH_TYPE
264 //config:       bool "type builtin"
265 //config:       default y
266 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
267 //config:
268 //config:config HUSH_READ
269 //config:       bool "read builtin"
270 //config:       default y
271 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
272 //config:
273 //config:config HUSH_SET
274 //config:       bool "set builtin"
275 //config:       default y
276 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
277 //config:
278 //config:config HUSH_UNSET
279 //config:       bool "unset builtin"
280 //config:       default y
281 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
282 //config:
283 //config:config HUSH_ULIMIT
284 //config:       bool "ulimit builtin"
285 //config:       default y
286 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
287 //config:
288 //config:config HUSH_UMASK
289 //config:       bool "umask builtin"
290 //config:       default y
291 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
292 //config:
293 //config:config HUSH_MEMLEAK
294 //config:       bool "memleak builtin (debugging)"
295 //config:       default n
296 //config:       depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
297
298 //applet:IF_HUSH(APPLET(hush, BB_DIR_BIN, BB_SUID_DROP))
299 //                       APPLET_ODDNAME:name  main  location    suid_type     help
300 //applet:IF_SH_IS_HUSH(  APPLET_ODDNAME(sh,   hush, BB_DIR_BIN, BB_SUID_DROP, hush))
301 //applet:IF_BASH_IS_HUSH(APPLET_ODDNAME(bash, hush, BB_DIR_BIN, BB_SUID_DROP, hush))
302
303 //kbuild:lib-$(CONFIG_HUSH) += hush.o match.o shell_common.o
304 //kbuild:lib-$(CONFIG_SH_IS_HUSH) += hush.o match.o shell_common.o
305 //kbuild:lib-$(CONFIG_BASH_IS_HUSH) += hush.o match.o shell_common.o
306 //kbuild:lib-$(CONFIG_HUSH_RANDOM_SUPPORT) += random.o
307
308 /* -i (interactive) and -s (read stdin) are also accepted,
309  * but currently do nothing, therefore aren't shown in help.
310  * NOMMU-specific options are not meant to be used by users,
311  * therefore we don't show them either.
312  */
313 //usage:#define hush_trivial_usage
314 //usage:        "[-enxl] [-c 'SCRIPT' [ARG0 [ARGS]] / FILE [ARGS]]"
315 //usage:#define hush_full_usage "\n\n"
316 //usage:        "Unix shell interpreter"
317
318 #if !(defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \
319         || defined(__APPLE__) \
320     )
321 # include <malloc.h>   /* for malloc_trim */
322 #endif
323 #include <glob.h>
324 /* #include <dmalloc.h> */
325 #if ENABLE_HUSH_CASE
326 # include <fnmatch.h>
327 #endif
328 #include <sys/utsname.h> /* for setting $HOSTNAME */
329
330 #include "busybox.h"  /* for APPLET_IS_NOFORK/NOEXEC */
331 #include "unicode.h"
332 #include "shell_common.h"
333 #include "math.h"
334 #include "match.h"
335 #if ENABLE_HUSH_RANDOM_SUPPORT
336 # include "random.h"
337 #else
338 # define CLEAR_RANDOM_T(rnd) ((void)0)
339 #endif
340 #ifndef F_DUPFD_CLOEXEC
341 # define F_DUPFD_CLOEXEC F_DUPFD
342 #endif
343 #ifndef PIPE_BUF
344 # define PIPE_BUF 4096  /* amount of buffering in a pipe */
345 #endif
346
347
348 /* So far, all bash compat is controlled by one config option */
349 /* Separate defines document which part of code implements what */
350 #define BASH_PATTERN_SUBST ENABLE_HUSH_BASH_COMPAT
351 #define BASH_SUBSTR        ENABLE_HUSH_BASH_COMPAT
352 #define BASH_SOURCE        ENABLE_HUSH_BASH_COMPAT
353 #define BASH_HOSTNAME_VAR  ENABLE_HUSH_BASH_COMPAT
354 #define BASH_TEST2         (ENABLE_HUSH_BASH_COMPAT && ENABLE_HUSH_TEST)
355
356
357 /* Build knobs */
358 #define LEAK_HUNTING 0
359 #define BUILD_AS_NOMMU 0
360 /* Enable/disable sanity checks. Ok to enable in production,
361  * only adds a bit of bloat. Set to >1 to get non-production level verbosity.
362  * Keeping 1 for now even in released versions.
363  */
364 #define HUSH_DEBUG 1
365 /* Slightly bigger (+200 bytes), but faster hush.
366  * So far it only enables a trick with counting SIGCHLDs and forks,
367  * which allows us to do fewer waitpid's.
368  * (we can detect a case where neither forks were done nor SIGCHLDs happened
369  * and therefore waitpid will return the same result as last time)
370  */
371 #define ENABLE_HUSH_FAST 0
372 /* TODO: implement simplified code for users which do not need ${var%...} ops
373  * So far ${var%...} ops are always enabled:
374  */
375 #define ENABLE_HUSH_DOLLAR_OPS 1
376
377
378 #if BUILD_AS_NOMMU
379 # undef BB_MMU
380 # undef USE_FOR_NOMMU
381 # undef USE_FOR_MMU
382 # define BB_MMU 0
383 # define USE_FOR_NOMMU(...) __VA_ARGS__
384 # define USE_FOR_MMU(...)
385 #endif
386
387 #include "NUM_APPLETS.h"
388 #if NUM_APPLETS == 1
389 /* STANDALONE does not make sense, and won't compile */
390 # undef CONFIG_FEATURE_SH_STANDALONE
391 # undef ENABLE_FEATURE_SH_STANDALONE
392 # undef IF_FEATURE_SH_STANDALONE
393 # undef IF_NOT_FEATURE_SH_STANDALONE
394 # define ENABLE_FEATURE_SH_STANDALONE 0
395 # define IF_FEATURE_SH_STANDALONE(...)
396 # define IF_NOT_FEATURE_SH_STANDALONE(...) __VA_ARGS__
397 #endif
398
399 #if !ENABLE_HUSH_INTERACTIVE
400 # undef ENABLE_FEATURE_EDITING
401 # define ENABLE_FEATURE_EDITING 0
402 # undef ENABLE_FEATURE_EDITING_FANCY_PROMPT
403 # define ENABLE_FEATURE_EDITING_FANCY_PROMPT 0
404 # undef ENABLE_FEATURE_EDITING_SAVE_ON_EXIT
405 # define ENABLE_FEATURE_EDITING_SAVE_ON_EXIT 0
406 #endif
407
408 /* Do we support ANY keywords? */
409 #if ENABLE_HUSH_IF || ENABLE_HUSH_LOOPS || ENABLE_HUSH_CASE
410 # define HAS_KEYWORDS 1
411 # define IF_HAS_KEYWORDS(...) __VA_ARGS__
412 # define IF_HAS_NO_KEYWORDS(...)
413 #else
414 # define HAS_KEYWORDS 0
415 # define IF_HAS_KEYWORDS(...)
416 # define IF_HAS_NO_KEYWORDS(...) __VA_ARGS__
417 #endif
418
419 /* If you comment out one of these below, it will be #defined later
420  * to perform debug printfs to stderr: */
421 #define debug_printf(...)        do {} while (0)
422 /* Finer-grained debug switches */
423 #define debug_printf_parse(...)  do {} while (0)
424 #define debug_print_tree(a, b)   do {} while (0)
425 #define debug_printf_exec(...)   do {} while (0)
426 #define debug_printf_env(...)    do {} while (0)
427 #define debug_printf_jobs(...)   do {} while (0)
428 #define debug_printf_expand(...) do {} while (0)
429 #define debug_printf_varexp(...) do {} while (0)
430 #define debug_printf_glob(...)   do {} while (0)
431 #define debug_printf_redir(...)  do {} while (0)
432 #define debug_printf_list(...)   do {} while (0)
433 #define debug_printf_subst(...)  do {} while (0)
434 #define debug_printf_clean(...)  do {} while (0)
435
436 #define ERR_PTR ((void*)(long)1)
437
438 #define JOB_STATUS_FORMAT    "[%u] %-22s %.40s\n"
439
440 #define _SPECIAL_VARS_STR     "_*@$!?#"
441 #define SPECIAL_VARS_STR     ("_*@$!?#" + 1)
442 #define NUMERIC_SPECVARS_STR ("_*@$!?#" + 3)
443 #if BASH_PATTERN_SUBST
444 /* Support / and // replace ops */
445 /* Note that // is stored as \ in "encoded" string representation */
446 # define VAR_ENCODED_SUBST_OPS      "\\/%#:-=+?"
447 # define VAR_SUBST_OPS             ("\\/%#:-=+?" + 1)
448 # define MINUS_PLUS_EQUAL_QUESTION ("\\/%#:-=+?" + 5)
449 #else
450 # define VAR_ENCODED_SUBST_OPS      "%#:-=+?"
451 # define VAR_SUBST_OPS              "%#:-=+?"
452 # define MINUS_PLUS_EQUAL_QUESTION ("%#:-=+?" + 3)
453 #endif
454
455 #define SPECIAL_VAR_SYMBOL   3
456
457 struct variable;
458
459 static const char hush_version_str[] ALIGN1 = "HUSH_VERSION="BB_VER;
460
461 /* This supports saving pointers malloced in vfork child,
462  * to be freed in the parent.
463  */
464 #if !BB_MMU
465 typedef struct nommu_save_t {
466         char **new_env;
467         struct variable *old_vars;
468         char **argv;
469         char **argv_from_re_execing;
470 } nommu_save_t;
471 #endif
472
473 enum {
474         RES_NONE  = 0,
475 #if ENABLE_HUSH_IF
476         RES_IF    ,
477         RES_THEN  ,
478         RES_ELIF  ,
479         RES_ELSE  ,
480         RES_FI    ,
481 #endif
482 #if ENABLE_HUSH_LOOPS
483         RES_FOR   ,
484         RES_WHILE ,
485         RES_UNTIL ,
486         RES_DO    ,
487         RES_DONE  ,
488 #endif
489 #if ENABLE_HUSH_LOOPS || ENABLE_HUSH_CASE
490         RES_IN    ,
491 #endif
492 #if ENABLE_HUSH_CASE
493         RES_CASE  ,
494         /* three pseudo-keywords support contrived "case" syntax: */
495         RES_CASE_IN,   /* "case ... IN", turns into RES_MATCH when IN is observed */
496         RES_MATCH ,    /* "word)" */
497         RES_CASE_BODY, /* "this command is inside CASE" */
498         RES_ESAC  ,
499 #endif
500         RES_XXXX  ,
501         RES_SNTX
502 };
503
504 typedef struct o_string {
505         char *data;
506         int length; /* position where data is appended */
507         int maxlen;
508         int o_expflags;
509         /* At least some part of the string was inside '' or "",
510          * possibly empty one: word"", wo''rd etc. */
511         smallint has_quoted_part;
512         smallint has_empty_slot;
513         smallint o_assignment; /* 0:maybe, 1:yes, 2:no */
514 } o_string;
515 enum {
516         EXP_FLAG_SINGLEWORD     = 0x80, /* must be 0x80 */
517         EXP_FLAG_GLOB           = 0x2,
518         /* Protect newly added chars against globbing
519          * by prepending \ to *, ?, [, \ */
520         EXP_FLAG_ESC_GLOB_CHARS = 0x1,
521 };
522 enum {
523         MAYBE_ASSIGNMENT      = 0,
524         DEFINITELY_ASSIGNMENT = 1,
525         NOT_ASSIGNMENT        = 2,
526         /* Not an assignment, but next word may be: "if v=xyz cmd;" */
527         WORD_IS_KEYWORD       = 3,
528 };
529 /* Used for initialization: o_string foo = NULL_O_STRING; */
530 #define NULL_O_STRING { NULL }
531
532 #ifndef debug_printf_parse
533 static const char *const assignment_flag[] = {
534         "MAYBE_ASSIGNMENT",
535         "DEFINITELY_ASSIGNMENT",
536         "NOT_ASSIGNMENT",
537         "WORD_IS_KEYWORD",
538 };
539 #endif
540
541 typedef struct in_str {
542         const char *p;
543 #if ENABLE_HUSH_INTERACTIVE
544         smallint promptmode; /* 0: PS1, 1: PS2 */
545 #endif
546         int peek_buf[2];
547         int last_char;
548         FILE *file;
549 } in_str;
550
551 /* The descrip member of this structure is only used to make
552  * debugging output pretty */
553 static const struct {
554         int mode;
555         signed char default_fd;
556         char descrip[3];
557 } redir_table[] = {
558         { O_RDONLY,                  0, "<"  },
559         { O_CREAT|O_TRUNC|O_WRONLY,  1, ">"  },
560         { O_CREAT|O_APPEND|O_WRONLY, 1, ">>" },
561         { O_CREAT|O_RDWR,            1, "<>" },
562         { O_RDONLY,                  0, "<<" },
563 /* Should not be needed. Bogus default_fd helps in debugging */
564 /*      { O_RDONLY,                 77, "<<" }, */
565 };
566
567 struct redir_struct {
568         struct redir_struct *next;
569         char *rd_filename;          /* filename */
570         int rd_fd;                  /* fd to redirect */
571         /* fd to redirect to, or -3 if rd_fd is to be closed (n>&-) */
572         int rd_dup;
573         smallint rd_type;           /* (enum redir_type) */
574         /* note: for heredocs, rd_filename contains heredoc delimiter,
575          * and subsequently heredoc itself; and rd_dup is a bitmask:
576          * bit 0: do we need to trim leading tabs?
577          * bit 1: is heredoc quoted (<<'delim' syntax) ?
578          */
579 };
580 typedef enum redir_type {
581         REDIRECT_INPUT     = 0,
582         REDIRECT_OVERWRITE = 1,
583         REDIRECT_APPEND    = 2,
584         REDIRECT_IO        = 3,
585         REDIRECT_HEREDOC   = 4,
586         REDIRECT_HEREDOC2  = 5, /* REDIRECT_HEREDOC after heredoc is loaded */
587
588         REDIRFD_CLOSE      = -3,
589         REDIRFD_SYNTAX_ERR = -2,
590         REDIRFD_TO_FILE    = -1,
591         /* otherwise, rd_fd is redirected to rd_dup */
592
593         HEREDOC_SKIPTABS = 1,
594         HEREDOC_QUOTED   = 2,
595 } redir_type;
596
597
598 struct command {
599         pid_t pid;                  /* 0 if exited */
600         int assignment_cnt;         /* how many argv[i] are assignments? */
601         smallint cmd_type;          /* CMD_xxx */
602 #define CMD_NORMAL   0
603 #define CMD_SUBSHELL 1
604 #if BASH_TEST2
605 /* used for "[[ EXPR ]]" */
606 # define CMD_SINGLEWORD_NOGLOB 2
607 #endif
608 #if ENABLE_HUSH_FUNCTIONS
609 # define CMD_FUNCDEF 3
610 #endif
611
612         smalluint cmd_exitcode;
613         /* if non-NULL, this "command" is { list }, ( list ), or a compound statement */
614         struct pipe *group;
615 #if !BB_MMU
616         char *group_as_string;
617 #endif
618 #if ENABLE_HUSH_FUNCTIONS
619         struct function *child_func;
620 /* This field is used to prevent a bug here:
621  * while...do f1() {a;}; f1; f1() {b;}; f1; done
622  * When we execute "f1() {a;}" cmd, we create new function and clear
623  * cmd->group, cmd->group_as_string, cmd->argv[0].
624  * When we execute "f1() {b;}", we notice that f1 exists,
625  * and that its "parent cmd" struct is still "alive",
626  * we put those fields back into cmd->xxx
627  * (struct function has ->parent_cmd ptr to facilitate that).
628  * When we loop back, we can execute "f1() {a;}" again and set f1 correctly.
629  * Without this trick, loop would execute a;b;b;b;...
630  * instead of correct sequence a;b;a;b;...
631  * When command is freed, it severs the link
632  * (sets ->child_func->parent_cmd to NULL).
633  */
634 #endif
635         char **argv;                /* command name and arguments */
636 /* argv vector may contain variable references (^Cvar^C, ^C0^C etc)
637  * and on execution these are substituted with their values.
638  * Substitution can make _several_ words out of one argv[n]!
639  * Example: argv[0]=='.^C*^C.' here: echo .$*.
640  * References of the form ^C`cmd arg^C are `cmd arg` substitutions.
641  */
642         struct redir_struct *redirects; /* I/O redirections */
643 };
644 /* Is there anything in this command at all? */
645 #define IS_NULL_CMD(cmd) \
646         (!(cmd)->group && !(cmd)->argv && !(cmd)->redirects)
647
648 struct pipe {
649         struct pipe *next;
650         int num_cmds;               /* total number of commands in pipe */
651         int alive_cmds;             /* number of commands running (not exited) */
652         int stopped_cmds;           /* number of commands alive, but stopped */
653 #if ENABLE_HUSH_JOB
654         unsigned jobid;             /* job number */
655         pid_t pgrp;                 /* process group ID for the job */
656         char *cmdtext;              /* name of job */
657 #endif
658         struct command *cmds;       /* array of commands in pipe */
659         smallint followup;          /* PIPE_BG, PIPE_SEQ, PIPE_OR, PIPE_AND */
660         IF_HAS_KEYWORDS(smallint pi_inverted;) /* "! cmd | cmd" */
661         IF_HAS_KEYWORDS(smallint res_word;) /* needed for if, for, while, until... */
662 };
663 typedef enum pipe_style {
664         PIPE_SEQ = 0,
665         PIPE_AND = 1,
666         PIPE_OR  = 2,
667         PIPE_BG  = 3,
668 } pipe_style;
669 /* Is there anything in this pipe at all? */
670 #define IS_NULL_PIPE(pi) \
671         ((pi)->num_cmds == 0 IF_HAS_KEYWORDS( && (pi)->res_word == RES_NONE))
672
673 /* This holds pointers to the various results of parsing */
674 struct parse_context {
675         /* linked list of pipes */
676         struct pipe *list_head;
677         /* last pipe (being constructed right now) */
678         struct pipe *pipe;
679         /* last command in pipe (being constructed right now) */
680         struct command *command;
681         /* last redirect in command->redirects list */
682         struct redir_struct *pending_redirect;
683 #if !BB_MMU
684         o_string as_string;
685 #endif
686 #if HAS_KEYWORDS
687         smallint ctx_res_w;
688         smallint ctx_inverted; /* "! cmd | cmd" */
689 #if ENABLE_HUSH_CASE
690         smallint ctx_dsemicolon; /* ";;" seen */
691 #endif
692         /* bitmask of FLAG_xxx, for figuring out valid reserved words */
693         int old_flag;
694         /* group we are enclosed in:
695          * example: "if pipe1; pipe2; then pipe3; fi"
696          * when we see "if" or "then", we malloc and copy current context,
697          * and make ->stack point to it. then we parse pipeN.
698          * when closing "then" / fi" / whatever is found,
699          * we move list_head into ->stack->command->group,
700          * copy ->stack into current context, and delete ->stack.
701          * (parsing of { list } and ( list ) doesn't use this method)
702          */
703         struct parse_context *stack;
704 #endif
705 };
706
707 /* On program start, environ points to initial environment.
708  * putenv adds new pointers into it, unsetenv removes them.
709  * Neither of these (de)allocates the strings.
710  * setenv allocates new strings in malloc space and does putenv,
711  * and thus setenv is unusable (leaky) for shell's purposes */
712 #define setenv(...) setenv_is_leaky_dont_use()
713 struct variable {
714         struct variable *next;
715         char *varstr;        /* points to "name=" portion */
716 #if ENABLE_HUSH_LOCAL
717         unsigned func_nest_level;
718 #endif
719         int max_len;         /* if > 0, name is part of initial env; else name is malloced */
720         smallint flg_export; /* putenv should be done on this var */
721         smallint flg_read_only;
722 };
723
724 enum {
725         BC_BREAK = 1,
726         BC_CONTINUE = 2,
727 };
728
729 #if ENABLE_HUSH_FUNCTIONS
730 struct function {
731         struct function *next;
732         char *name;
733         struct command *parent_cmd;
734         struct pipe *body;
735 # if !BB_MMU
736         char *body_as_string;
737 # endif
738 };
739 #endif
740
741
742 /* set -/+o OPT support. (TODO: make it optional)
743  * bash supports the following opts:
744  * allexport       off
745  * braceexpand     on
746  * emacs           on
747  * errexit         off
748  * errtrace        off
749  * functrace       off
750  * hashall         on
751  * histexpand      off
752  * history         on
753  * ignoreeof       off
754  * interactive-comments    on
755  * keyword         off
756  * monitor         on
757  * noclobber       off
758  * noexec          off
759  * noglob          off
760  * nolog           off
761  * notify          off
762  * nounset         off
763  * onecmd          off
764  * physical        off
765  * pipefail        off
766  * posix           off
767  * privileged      off
768  * verbose         off
769  * vi              off
770  * xtrace          off
771  */
772 static const char o_opt_strings[] ALIGN1 =
773         "pipefail\0"
774         "noexec\0"
775         "errexit\0"
776 #if ENABLE_HUSH_MODE_X
777         "xtrace\0"
778 #endif
779         ;
780 enum {
781         OPT_O_PIPEFAIL,
782         OPT_O_NOEXEC,
783         OPT_O_ERREXIT,
784 #if ENABLE_HUSH_MODE_X
785         OPT_O_XTRACE,
786 #endif
787         NUM_OPT_O
788 };
789
790
791 struct FILE_list {
792         struct FILE_list *next;
793         FILE *fp;
794         int fd;
795 };
796
797
798 /* "Globals" within this file */
799 /* Sorted roughly by size (smaller offsets == smaller code) */
800 struct globals {
801         /* interactive_fd != 0 means we are an interactive shell.
802          * If we are, then saved_tty_pgrp can also be != 0, meaning
803          * that controlling tty is available. With saved_tty_pgrp == 0,
804          * job control still works, but terminal signals
805          * (^C, ^Z, ^Y, ^\) won't work at all, and background
806          * process groups can only be created with "cmd &".
807          * With saved_tty_pgrp != 0, hush will use tcsetpgrp()
808          * to give tty to the foreground process group,
809          * and will take it back when the group is stopped (^Z)
810          * or killed (^C).
811          */
812 #if ENABLE_HUSH_INTERACTIVE
813         /* 'interactive_fd' is a fd# open to ctty, if we have one
814          * _AND_ if we decided to act interactively */
815         int interactive_fd;
816         const char *PS1;
817         const char *PS2;
818 # define G_interactive_fd (G.interactive_fd)
819 #else
820 # define G_interactive_fd 0
821 #endif
822 #if ENABLE_FEATURE_EDITING
823         line_input_t *line_input_state;
824 #endif
825         pid_t root_pid;
826         pid_t root_ppid;
827         pid_t last_bg_pid;
828 #if ENABLE_HUSH_RANDOM_SUPPORT
829         random_t random_gen;
830 #endif
831 #if ENABLE_HUSH_JOB
832         int run_list_level;
833         unsigned last_jobid;
834         pid_t saved_tty_pgrp;
835         struct pipe *job_list;
836 # define G_saved_tty_pgrp (G.saved_tty_pgrp)
837 #else
838 # define G_saved_tty_pgrp 0
839 #endif
840         /* How deeply are we in context where "set -e" is ignored */
841         int errexit_depth;
842         /* "set -e" rules (do we follow them correctly?):
843          * Exit if pipe, list, or compound command exits with a non-zero status.
844          * Shell does not exit if failed command is part of condition in
845          * if/while, part of && or || list except the last command, any command
846          * in a pipe but the last, or if the command's return value is being
847          * inverted with !. If a compound command other than a subshell returns a
848          * non-zero status because a command failed while -e was being ignored, the
849          * shell does not exit. A trap on ERR, if set, is executed before the shell
850          * exits [ERR is a bashism].
851          *
852          * If a compound command or function executes in a context where -e is
853          * ignored, none of the commands executed within are affected by the -e
854          * setting. If a compound command or function sets -e while executing in a
855          * context where -e is ignored, that setting does not have any effect until
856          * the compound command or the command containing the function call completes.
857          */
858
859         char o_opt[NUM_OPT_O];
860 #if ENABLE_HUSH_MODE_X
861 # define G_x_mode (G.o_opt[OPT_O_XTRACE])
862 #else
863 # define G_x_mode 0
864 #endif
865         smallint flag_SIGINT;
866 #if ENABLE_HUSH_LOOPS
867         smallint flag_break_continue;
868 #endif
869 #if ENABLE_HUSH_FUNCTIONS
870         /* 0: outside of a function (or sourced file)
871          * -1: inside of a function, ok to use return builtin
872          * 1: return is invoked, skip all till end of func
873          */
874         smallint flag_return_in_progress;
875 # define G_flag_return_in_progress (G.flag_return_in_progress)
876 #else
877 # define G_flag_return_in_progress 0
878 #endif
879         smallint exiting; /* used to prevent EXIT trap recursion */
880         /* These four support $?, $#, and $1 */
881         smalluint last_exitcode;
882         smalluint last_bg_pid_exitcode;
883 #if ENABLE_HUSH_SET
884         /* are global_argv and global_argv[1..n] malloced? (note: not [0]) */
885         smalluint global_args_malloced;
886 # define G_global_args_malloced (G.global_args_malloced)
887 #else
888 # define G_global_args_malloced 0
889 #endif
890         /* how many non-NULL argv's we have. NB: $# + 1 */
891         int global_argc;
892         char **global_argv;
893 #if !BB_MMU
894         char *argv0_for_re_execing;
895 #endif
896 #if ENABLE_HUSH_LOOPS
897         unsigned depth_break_continue;
898         unsigned depth_of_loop;
899 #endif
900         const char *ifs;
901         const char *cwd;
902         struct variable *top_var;
903         char **expanded_assignments;
904 #if ENABLE_HUSH_FUNCTIONS
905         struct function *top_func;
906 # if ENABLE_HUSH_LOCAL
907         struct variable **shadowed_vars_pp;
908         unsigned func_nest_level;
909 # endif
910 #endif
911         /* Signal and trap handling */
912 #if ENABLE_HUSH_FAST
913         unsigned count_SIGCHLD;
914         unsigned handled_SIGCHLD;
915         smallint we_have_children;
916 #endif
917         struct FILE_list *FILE_list;
918         /* Which signals have non-DFL handler (even with no traps set)?
919          * Set at the start to:
920          * (SIGQUIT + maybe SPECIAL_INTERACTIVE_SIGS + maybe SPECIAL_JOBSTOP_SIGS)
921          * SPECIAL_INTERACTIVE_SIGS are cleared after fork.
922          * The rest is cleared right before execv syscalls.
923          * Other than these two times, never modified.
924          */
925         unsigned special_sig_mask;
926 #if ENABLE_HUSH_JOB
927         unsigned fatal_sig_mask;
928 # define G_fatal_sig_mask (G.fatal_sig_mask)
929 #else
930 # define G_fatal_sig_mask 0
931 #endif
932 #if ENABLE_HUSH_TRAP
933         char **traps; /* char *traps[NSIG] */
934 # define G_traps G.traps
935 #else
936 # define G_traps ((char**)NULL)
937 #endif
938         sigset_t pending_set;
939 #if ENABLE_HUSH_MEMLEAK
940         unsigned long memleak_value;
941 #endif
942 #if HUSH_DEBUG
943         int debug_indent;
944 #endif
945         struct sigaction sa;
946 #if ENABLE_FEATURE_EDITING
947         char user_input_buf[CONFIG_FEATURE_EDITING_MAX_LEN];
948 #endif
949 };
950 #define G (*ptr_to_globals)
951 /* Not #defining name to G.name - this quickly gets unwieldy
952  * (too many defines). Also, I actually prefer to see when a variable
953  * is global, thus "G." prefix is a useful hint */
954 #define INIT_G() do { \
955         SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
956         /* memset(&G.sa, 0, sizeof(G.sa)); */  \
957         sigfillset(&G.sa.sa_mask); \
958         G.sa.sa_flags = SA_RESTART; \
959 } while (0)
960
961
962 /* Function prototypes for builtins */
963 static int builtin_cd(char **argv) FAST_FUNC;
964 #if ENABLE_HUSH_ECHO
965 static int builtin_echo(char **argv) FAST_FUNC;
966 #endif
967 static int builtin_eval(char **argv) FAST_FUNC;
968 static int builtin_exec(char **argv) FAST_FUNC;
969 static int builtin_exit(char **argv) FAST_FUNC;
970 #if ENABLE_HUSH_EXPORT
971 static int builtin_export(char **argv) FAST_FUNC;
972 #endif
973 #if ENABLE_HUSH_READONLY
974 static int builtin_readonly(char **argv) FAST_FUNC;
975 #endif
976 #if ENABLE_HUSH_JOB
977 static int builtin_fg_bg(char **argv) FAST_FUNC;
978 static int builtin_jobs(char **argv) FAST_FUNC;
979 #endif
980 #if ENABLE_HUSH_HELP
981 static int builtin_help(char **argv) FAST_FUNC;
982 #endif
983 #if MAX_HISTORY && ENABLE_FEATURE_EDITING
984 static int builtin_history(char **argv) FAST_FUNC;
985 #endif
986 #if ENABLE_HUSH_LOCAL
987 static int builtin_local(char **argv) FAST_FUNC;
988 #endif
989 #if ENABLE_HUSH_MEMLEAK
990 static int builtin_memleak(char **argv) FAST_FUNC;
991 #endif
992 #if ENABLE_HUSH_PRINTF
993 static int builtin_printf(char **argv) FAST_FUNC;
994 #endif
995 static int builtin_pwd(char **argv) FAST_FUNC;
996 #if ENABLE_HUSH_READ
997 static int builtin_read(char **argv) FAST_FUNC;
998 #endif
999 #if ENABLE_HUSH_SET
1000 static int builtin_set(char **argv) FAST_FUNC;
1001 #endif
1002 static int builtin_shift(char **argv) FAST_FUNC;
1003 static int builtin_source(char **argv) FAST_FUNC;
1004 #if ENABLE_HUSH_TEST || BASH_TEST2
1005 static int builtin_test(char **argv) FAST_FUNC;
1006 #endif
1007 #if ENABLE_HUSH_TRAP
1008 static int builtin_trap(char **argv) FAST_FUNC;
1009 #endif
1010 #if ENABLE_HUSH_TYPE
1011 static int builtin_type(char **argv) FAST_FUNC;
1012 #endif
1013 static int builtin_true(char **argv) FAST_FUNC;
1014 #if ENABLE_HUSH_UMASK
1015 static int builtin_umask(char **argv) FAST_FUNC;
1016 #endif
1017 #if ENABLE_HUSH_UNSET
1018 static int builtin_unset(char **argv) FAST_FUNC;
1019 #endif
1020 #if ENABLE_HUSH_KILL
1021 static int builtin_kill(char **argv) FAST_FUNC;
1022 #endif
1023 #if ENABLE_HUSH_WAIT
1024 static int builtin_wait(char **argv) FAST_FUNC;
1025 #endif
1026 #if ENABLE_HUSH_LOOPS
1027 static int builtin_break(char **argv) FAST_FUNC;
1028 static int builtin_continue(char **argv) FAST_FUNC;
1029 #endif
1030 #if ENABLE_HUSH_FUNCTIONS
1031 static int builtin_return(char **argv) FAST_FUNC;
1032 #endif
1033
1034 /* Table of built-in functions.  They can be forked or not, depending on
1035  * context: within pipes, they fork.  As simple commands, they do not.
1036  * When used in non-forking context, they can change global variables
1037  * in the parent shell process.  If forked, of course they cannot.
1038  * For example, 'unset foo | whatever' will parse and run, but foo will
1039  * still be set at the end. */
1040 struct built_in_command {
1041         const char *b_cmd;
1042         int (*b_function)(char **argv) FAST_FUNC;
1043 #if ENABLE_HUSH_HELP
1044         const char *b_descr;
1045 # define BLTIN(cmd, func, help) { cmd, func, help }
1046 #else
1047 # define BLTIN(cmd, func, help) { cmd, func }
1048 #endif
1049 };
1050
1051 static const struct built_in_command bltins1[] = {
1052         BLTIN("."        , builtin_source  , "Run commands in file"),
1053         BLTIN(":"        , builtin_true    , NULL),
1054 #if ENABLE_HUSH_JOB
1055         BLTIN("bg"       , builtin_fg_bg   , "Resume job in background"),
1056 #endif
1057 #if ENABLE_HUSH_LOOPS
1058         BLTIN("break"    , builtin_break   , "Exit loop"),
1059 #endif
1060         BLTIN("cd"       , builtin_cd      , "Change directory"),
1061 #if ENABLE_HUSH_LOOPS
1062         BLTIN("continue" , builtin_continue, "Start new loop iteration"),
1063 #endif
1064         BLTIN("eval"     , builtin_eval    , "Construct and run shell command"),
1065         BLTIN("exec"     , builtin_exec    , "Execute command, don't return to shell"),
1066         BLTIN("exit"     , builtin_exit    , NULL),
1067 #if ENABLE_HUSH_EXPORT
1068         BLTIN("export"   , builtin_export  , "Set environment variables"),
1069 #endif
1070 #if ENABLE_HUSH_JOB
1071         BLTIN("fg"       , builtin_fg_bg   , "Bring job to foreground"),
1072 #endif
1073 #if ENABLE_HUSH_HELP
1074         BLTIN("help"     , builtin_help    , NULL),
1075 #endif
1076 #if MAX_HISTORY && ENABLE_FEATURE_EDITING
1077         BLTIN("history"  , builtin_history , "Show history"),
1078 #endif
1079 #if ENABLE_HUSH_JOB
1080         BLTIN("jobs"     , builtin_jobs    , "List jobs"),
1081 #endif
1082 #if ENABLE_HUSH_KILL
1083         BLTIN("kill"     , builtin_kill    , "Send signals to processes"),
1084 #endif
1085 #if ENABLE_HUSH_LOCAL
1086         BLTIN("local"    , builtin_local   , "Set local variables"),
1087 #endif
1088 #if ENABLE_HUSH_MEMLEAK
1089         BLTIN("memleak"  , builtin_memleak , NULL),
1090 #endif
1091 #if ENABLE_HUSH_READ
1092         BLTIN("read"     , builtin_read    , "Input into variable"),
1093 #endif
1094 #if ENABLE_HUSH_READONLY
1095         BLTIN("readonly" , builtin_readonly, "Make variables read-only"),
1096 #endif
1097 #if ENABLE_HUSH_FUNCTIONS
1098         BLTIN("return"   , builtin_return  , "Return from function"),
1099 #endif
1100 #if ENABLE_HUSH_SET
1101         BLTIN("set"      , builtin_set     , "Set positional parameters"),
1102 #endif
1103         BLTIN("shift"    , builtin_shift   , "Shift positional parameters"),
1104 #if BASH_SOURCE
1105         BLTIN("source"   , builtin_source  , NULL),
1106 #endif
1107 #if ENABLE_HUSH_TRAP
1108         BLTIN("trap"     , builtin_trap    , "Trap signals"),
1109 #endif
1110         BLTIN("true"     , builtin_true    , NULL),
1111 #if ENABLE_HUSH_TYPE
1112         BLTIN("type"     , builtin_type    , "Show command type"),
1113 #endif
1114 #if ENABLE_HUSH_ULIMIT
1115         BLTIN("ulimit"   , shell_builtin_ulimit, "Control resource limits"),
1116 #endif
1117 #if ENABLE_HUSH_UMASK
1118         BLTIN("umask"    , builtin_umask   , "Set file creation mask"),
1119 #endif
1120 #if ENABLE_HUSH_UNSET
1121         BLTIN("unset"    , builtin_unset   , "Unset variables"),
1122 #endif
1123 #if ENABLE_HUSH_WAIT
1124         BLTIN("wait"     , builtin_wait    , "Wait for process to finish"),
1125 #endif
1126 };
1127 /* These builtins won't be used if we are on NOMMU and need to re-exec
1128  * (it's cheaper to run an external program in this case):
1129  */
1130 static const struct built_in_command bltins2[] = {
1131 #if ENABLE_HUSH_TEST
1132         BLTIN("["        , builtin_test    , NULL),
1133 #endif
1134 #if BASH_TEST2
1135         BLTIN("[["       , builtin_test    , NULL),
1136 #endif
1137 #if ENABLE_HUSH_ECHO
1138         BLTIN("echo"     , builtin_echo    , NULL),
1139 #endif
1140 #if ENABLE_HUSH_PRINTF
1141         BLTIN("printf"   , builtin_printf  , NULL),
1142 #endif
1143         BLTIN("pwd"      , builtin_pwd     , NULL),
1144 #if ENABLE_HUSH_TEST
1145         BLTIN("test"     , builtin_test    , NULL),
1146 #endif
1147 };
1148
1149
1150 /* Debug printouts.
1151  */
1152 #if HUSH_DEBUG
1153 /* prevent disasters with G.debug_indent < 0 */
1154 # define indent() fdprintf(2, "%*s", (G.debug_indent * 2) & 0xff, "")
1155 # define debug_enter() (G.debug_indent++)
1156 # define debug_leave() (G.debug_indent--)
1157 #else
1158 # define indent()      ((void)0)
1159 # define debug_enter() ((void)0)
1160 # define debug_leave() ((void)0)
1161 #endif
1162
1163 #ifndef debug_printf
1164 # define debug_printf(...) (indent(), fdprintf(2, __VA_ARGS__))
1165 #endif
1166
1167 #ifndef debug_printf_parse
1168 # define debug_printf_parse(...) (indent(), fdprintf(2, __VA_ARGS__))
1169 #endif
1170
1171 #ifndef debug_printf_exec
1172 #define debug_printf_exec(...) (indent(), fdprintf(2, __VA_ARGS__))
1173 #endif
1174
1175 #ifndef debug_printf_env
1176 # define debug_printf_env(...) (indent(), fdprintf(2, __VA_ARGS__))
1177 #endif
1178
1179 #ifndef debug_printf_jobs
1180 # define debug_printf_jobs(...) (indent(), fdprintf(2, __VA_ARGS__))
1181 # define DEBUG_JOBS 1
1182 #else
1183 # define DEBUG_JOBS 0
1184 #endif
1185
1186 #ifndef debug_printf_expand
1187 # define debug_printf_expand(...) (indent(), fdprintf(2, __VA_ARGS__))
1188 # define DEBUG_EXPAND 1
1189 #else
1190 # define DEBUG_EXPAND 0
1191 #endif
1192
1193 #ifndef debug_printf_varexp
1194 # define debug_printf_varexp(...) (indent(), fdprintf(2, __VA_ARGS__))
1195 #endif
1196
1197 #ifndef debug_printf_glob
1198 # define debug_printf_glob(...) (indent(), fdprintf(2, __VA_ARGS__))
1199 # define DEBUG_GLOB 1
1200 #else
1201 # define DEBUG_GLOB 0
1202 #endif
1203
1204 #ifndef debug_printf_redir
1205 # define debug_printf_redir(...) (indent(), fdprintf(2, __VA_ARGS__))
1206 #endif
1207
1208 #ifndef debug_printf_list
1209 # define debug_printf_list(...) (indent(), fdprintf(2, __VA_ARGS__))
1210 #endif
1211
1212 #ifndef debug_printf_subst
1213 # define debug_printf_subst(...) (indent(), fdprintf(2, __VA_ARGS__))
1214 #endif
1215
1216 #ifndef debug_printf_clean
1217 # define debug_printf_clean(...) (indent(), fdprintf(2, __VA_ARGS__))
1218 # define DEBUG_CLEAN 1
1219 #else
1220 # define DEBUG_CLEAN 0
1221 #endif
1222
1223 #if DEBUG_EXPAND
1224 static void debug_print_strings(const char *prefix, char **vv)
1225 {
1226         indent();
1227         fdprintf(2, "%s:\n", prefix);
1228         while (*vv)
1229                 fdprintf(2, " '%s'\n", *vv++);
1230 }
1231 #else
1232 # define debug_print_strings(prefix, vv) ((void)0)
1233 #endif
1234
1235
1236 /* Leak hunting. Use hush_leaktool.sh for post-processing.
1237  */
1238 #if LEAK_HUNTING
1239 static void *xxmalloc(int lineno, size_t size)
1240 {
1241         void *ptr = xmalloc((size + 0xff) & ~0xff);
1242         fdprintf(2, "line %d: malloc %p\n", lineno, ptr);
1243         return ptr;
1244 }
1245 static void *xxrealloc(int lineno, void *ptr, size_t size)
1246 {
1247         ptr = xrealloc(ptr, (size + 0xff) & ~0xff);
1248         fdprintf(2, "line %d: realloc %p\n", lineno, ptr);
1249         return ptr;
1250 }
1251 static char *xxstrdup(int lineno, const char *str)
1252 {
1253         char *ptr = xstrdup(str);
1254         fdprintf(2, "line %d: strdup %p\n", lineno, ptr);
1255         return ptr;
1256 }
1257 static void xxfree(void *ptr)
1258 {
1259         fdprintf(2, "free %p\n", ptr);
1260         free(ptr);
1261 }
1262 # define xmalloc(s)     xxmalloc(__LINE__, s)
1263 # define xrealloc(p, s) xxrealloc(__LINE__, p, s)
1264 # define xstrdup(s)     xxstrdup(__LINE__, s)
1265 # define free(p)        xxfree(p)
1266 #endif
1267
1268
1269 /* Syntax and runtime errors. They always abort scripts.
1270  * In interactive use they usually discard unparsed and/or unexecuted commands
1271  * and return to the prompt.
1272  * HUSH_DEBUG >= 2 prints line number in this file where it was detected.
1273  */
1274 #if HUSH_DEBUG < 2
1275 # define die_if_script(lineno, ...)             die_if_script(__VA_ARGS__)
1276 # define syntax_error(lineno, msg)              syntax_error(msg)
1277 # define syntax_error_at(lineno, msg)           syntax_error_at(msg)
1278 # define syntax_error_unterm_ch(lineno, ch)     syntax_error_unterm_ch(ch)
1279 # define syntax_error_unterm_str(lineno, s)     syntax_error_unterm_str(s)
1280 # define syntax_error_unexpected_ch(lineno, ch) syntax_error_unexpected_ch(ch)
1281 #endif
1282
1283 static void die_if_script(unsigned lineno, const char *fmt, ...)
1284 {
1285         va_list p;
1286
1287 #if HUSH_DEBUG >= 2
1288         bb_error_msg("hush.c:%u", lineno);
1289 #endif
1290         va_start(p, fmt);
1291         bb_verror_msg(fmt, p, NULL);
1292         va_end(p);
1293         if (!G_interactive_fd)
1294                 xfunc_die();
1295 }
1296
1297 static void syntax_error(unsigned lineno UNUSED_PARAM, const char *msg)
1298 {
1299         if (msg)
1300                 bb_error_msg("syntax error: %s", msg);
1301         else
1302                 bb_error_msg("syntax error");
1303 }
1304
1305 static void syntax_error_at(unsigned lineno UNUSED_PARAM, const char *msg)
1306 {
1307         bb_error_msg("syntax error at '%s'", msg);
1308 }
1309
1310 static void syntax_error_unterm_str(unsigned lineno UNUSED_PARAM, const char *s)
1311 {
1312         bb_error_msg("syntax error: unterminated %s", s);
1313 }
1314
1315 static void syntax_error_unterm_ch(unsigned lineno, char ch)
1316 {
1317         char msg[2] = { ch, '\0' };
1318         syntax_error_unterm_str(lineno, msg);
1319 }
1320
1321 static void syntax_error_unexpected_ch(unsigned lineno UNUSED_PARAM, int ch)
1322 {
1323         char msg[2];
1324         msg[0] = ch;
1325         msg[1] = '\0';
1326 #if HUSH_DEBUG >= 2
1327         bb_error_msg("hush.c:%u", lineno);
1328 #endif
1329         bb_error_msg("syntax error: unexpected %s", ch == EOF ? "EOF" : msg);
1330 }
1331
1332 #if HUSH_DEBUG < 2
1333 # undef die_if_script
1334 # undef syntax_error
1335 # undef syntax_error_at
1336 # undef syntax_error_unterm_ch
1337 # undef syntax_error_unterm_str
1338 # undef syntax_error_unexpected_ch
1339 #else
1340 # define die_if_script(...)             die_if_script(__LINE__, __VA_ARGS__)
1341 # define syntax_error(msg)              syntax_error(__LINE__, msg)
1342 # define syntax_error_at(msg)           syntax_error_at(__LINE__, msg)
1343 # define syntax_error_unterm_ch(ch)     syntax_error_unterm_ch(__LINE__, ch)
1344 # define syntax_error_unterm_str(s)     syntax_error_unterm_str(__LINE__, s)
1345 # define syntax_error_unexpected_ch(ch) syntax_error_unexpected_ch(__LINE__, ch)
1346 #endif
1347
1348
1349 #if ENABLE_HUSH_INTERACTIVE
1350 static void cmdedit_update_prompt(void);
1351 #else
1352 # define cmdedit_update_prompt() ((void)0)
1353 #endif
1354
1355
1356 /* Utility functions
1357  */
1358 /* Replace each \x with x in place, return ptr past NUL. */
1359 static char *unbackslash(char *src)
1360 {
1361         char *dst = src = strchrnul(src, '\\');
1362         while (1) {
1363                 if (*src == '\\')
1364                         src++;
1365                 if ((*dst++ = *src++) == '\0')
1366                         break;
1367         }
1368         return dst;
1369 }
1370
1371 static char **add_strings_to_strings(char **strings, char **add, int need_to_dup)
1372 {
1373         int i;
1374         unsigned count1;
1375         unsigned count2;
1376         char **v;
1377
1378         v = strings;
1379         count1 = 0;
1380         if (v) {
1381                 while (*v) {
1382                         count1++;
1383                         v++;
1384                 }
1385         }
1386         count2 = 0;
1387         v = add;
1388         while (*v) {
1389                 count2++;
1390                 v++;
1391         }
1392         v = xrealloc(strings, (count1 + count2 + 1) * sizeof(char*));
1393         v[count1 + count2] = NULL;
1394         i = count2;
1395         while (--i >= 0)
1396                 v[count1 + i] = (need_to_dup ? xstrdup(add[i]) : add[i]);
1397         return v;
1398 }
1399 #if LEAK_HUNTING
1400 static char **xx_add_strings_to_strings(int lineno, char **strings, char **add, int need_to_dup)
1401 {
1402         char **ptr = add_strings_to_strings(strings, add, need_to_dup);
1403         fdprintf(2, "line %d: add_strings_to_strings %p\n", lineno, ptr);
1404         return ptr;
1405 }
1406 #define add_strings_to_strings(strings, add, need_to_dup) \
1407         xx_add_strings_to_strings(__LINE__, strings, add, need_to_dup)
1408 #endif
1409
1410 /* Note: takes ownership of "add" ptr (it is not strdup'ed) */
1411 static char **add_string_to_strings(char **strings, char *add)
1412 {
1413         char *v[2];
1414         v[0] = add;
1415         v[1] = NULL;
1416         return add_strings_to_strings(strings, v, /*dup:*/ 0);
1417 }
1418 #if LEAK_HUNTING
1419 static char **xx_add_string_to_strings(int lineno, char **strings, char *add)
1420 {
1421         char **ptr = add_string_to_strings(strings, add);
1422         fdprintf(2, "line %d: add_string_to_strings %p\n", lineno, ptr);
1423         return ptr;
1424 }
1425 #define add_string_to_strings(strings, add) \
1426         xx_add_string_to_strings(__LINE__, strings, add)
1427 #endif
1428
1429 static void free_strings(char **strings)
1430 {
1431         char **v;
1432
1433         if (!strings)
1434                 return;
1435         v = strings;
1436         while (*v) {
1437                 free(*v);
1438                 v++;
1439         }
1440         free(strings);
1441 }
1442
1443 static int fcntl_F_DUPFD(int fd, int avoid_fd)
1444 {
1445         int newfd;
1446  repeat:
1447         newfd = fcntl(fd, F_DUPFD, avoid_fd + 1);
1448         if (newfd < 0) {
1449                 if (errno == EBUSY)
1450                         goto repeat;
1451                 if (errno == EINTR)
1452                         goto repeat;
1453         }
1454         return newfd;
1455 }
1456
1457 static int xdup_and_close(int fd, int F_DUPFD_maybe_CLOEXEC, int avoid_fd)
1458 {
1459         int newfd;
1460  repeat:
1461         newfd = fcntl(fd, F_DUPFD_maybe_CLOEXEC, avoid_fd + 1);
1462         if (newfd < 0) {
1463                 if (errno == EBUSY)
1464                         goto repeat;
1465                 if (errno == EINTR)
1466                         goto repeat;
1467                 /* fd was not open? */
1468                 if (errno == EBADF)
1469                         return fd;
1470                 xfunc_die();
1471         }
1472         close(fd);
1473         return newfd;
1474 }
1475
1476
1477 /* Manipulating the list of open FILEs */
1478 static FILE *remember_FILE(FILE *fp)
1479 {
1480         if (fp) {
1481                 struct FILE_list *n = xmalloc(sizeof(*n));
1482                 n->next = G.FILE_list;
1483                 G.FILE_list = n;
1484                 n->fp = fp;
1485                 n->fd = fileno(fp);
1486                 close_on_exec_on(n->fd);
1487         }
1488         return fp;
1489 }
1490 static void fclose_and_forget(FILE *fp)
1491 {
1492         struct FILE_list **pp = &G.FILE_list;
1493         while (*pp) {
1494                 struct FILE_list *cur = *pp;
1495                 if (cur->fp == fp) {
1496                         *pp = cur->next;
1497                         free(cur);
1498                         break;
1499                 }
1500                 pp = &cur->next;
1501         }
1502         fclose(fp);
1503 }
1504 static int save_FILEs_on_redirect(int fd, int avoid_fd)
1505 {
1506         struct FILE_list *fl = G.FILE_list;
1507         while (fl) {
1508                 if (fd == fl->fd) {
1509                         /* We use it only on script files, they are all CLOEXEC */
1510                         fl->fd = xdup_and_close(fd, F_DUPFD_CLOEXEC, avoid_fd);
1511                         debug_printf_redir("redirect_fd %d: matches a script fd, moving it to %d\n", fd, fl->fd);
1512                         return 1;
1513                 }
1514                 fl = fl->next;
1515         }
1516         return 0;
1517 }
1518 static void restore_redirected_FILEs(void)
1519 {
1520         struct FILE_list *fl = G.FILE_list;
1521         while (fl) {
1522                 int should_be = fileno(fl->fp);
1523                 if (fl->fd != should_be) {
1524                         debug_printf_redir("restoring script fd from %d to %d\n", fl->fd, should_be);
1525                         xmove_fd(fl->fd, should_be);
1526                         fl->fd = should_be;
1527                 }
1528                 fl = fl->next;
1529         }
1530 }
1531 #if ENABLE_FEATURE_SH_STANDALONE && BB_MMU
1532 static void close_all_FILE_list(void)
1533 {
1534         struct FILE_list *fl = G.FILE_list;
1535         while (fl) {
1536                 /* fclose would also free FILE object.
1537                  * It is disastrous if we share memory with a vforked parent.
1538                  * I'm not sure we never come here after vfork.
1539                  * Therefore just close fd, nothing more.
1540                  */
1541                 /*fclose(fl->fp); - unsafe */
1542                 close(fl->fd);
1543                 fl = fl->next;
1544         }
1545 }
1546 #endif
1547
1548
1549 /* Helpers for setting new $n and restoring them back
1550  */
1551 typedef struct save_arg_t {
1552         char *sv_argv0;
1553         char **sv_g_argv;
1554         int sv_g_argc;
1555         IF_HUSH_SET(smallint sv_g_malloced;)
1556 } save_arg_t;
1557
1558 static void save_and_replace_G_args(save_arg_t *sv, char **argv)
1559 {
1560         sv->sv_argv0 = argv[0];
1561         sv->sv_g_argv = G.global_argv;
1562         sv->sv_g_argc = G.global_argc;
1563         IF_HUSH_SET(sv->sv_g_malloced = G.global_args_malloced;)
1564
1565         argv[0] = G.global_argv[0]; /* retain $0 */
1566         G.global_argv = argv;
1567         IF_HUSH_SET(G.global_args_malloced = 0;)
1568
1569         G.global_argc = 1 + string_array_len(argv + 1);
1570 }
1571
1572 static void restore_G_args(save_arg_t *sv, char **argv)
1573 {
1574 #if ENABLE_HUSH_SET
1575         if (G.global_args_malloced) {
1576                 /* someone ran "set -- arg1 arg2 ...", undo */
1577                 char **pp = G.global_argv;
1578                 while (*++pp) /* note: does not free $0 */
1579                         free(*pp);
1580                 free(G.global_argv);
1581         }
1582 #endif
1583         argv[0] = sv->sv_argv0;
1584         G.global_argv = sv->sv_g_argv;
1585         G.global_argc = sv->sv_g_argc;
1586         IF_HUSH_SET(G.global_args_malloced = sv->sv_g_malloced;)
1587 }
1588
1589
1590 /* Basic theory of signal handling in shell
1591  * ========================================
1592  * This does not describe what hush does, rather, it is current understanding
1593  * what it _should_ do. If it doesn't, it's a bug.
1594  * http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#trap
1595  *
1596  * Signals are handled only after each pipe ("cmd | cmd | cmd" thing)
1597  * is finished or backgrounded. It is the same in interactive and
1598  * non-interactive shells, and is the same regardless of whether
1599  * a user trap handler is installed or a shell special one is in effect.
1600  * ^C or ^Z from keyboard seems to execute "at once" because it usually
1601  * backgrounds (i.e. stops) or kills all members of currently running
1602  * pipe.
1603  *
1604  * Wait builtin is interruptible by signals for which user trap is set
1605  * or by SIGINT in interactive shell.
1606  *
1607  * Trap handlers will execute even within trap handlers. (right?)
1608  *
1609  * User trap handlers are forgotten when subshell ("(cmd)") is entered,
1610  * except for handlers set to '' (empty string).
1611  *
1612  * If job control is off, backgrounded commands ("cmd &")
1613  * have SIGINT, SIGQUIT set to SIG_IGN.
1614  *
1615  * Commands which are run in command substitution ("`cmd`")
1616  * have SIGTTIN, SIGTTOU, SIGTSTP set to SIG_IGN.
1617  *
1618  * Ordinary commands have signals set to SIG_IGN/DFL as inherited
1619  * by the shell from its parent.
1620  *
1621  * Signals which differ from SIG_DFL action
1622  * (note: child (i.e., [v]forked) shell is not an interactive shell):
1623  *
1624  * SIGQUIT: ignore
1625  * SIGTERM (interactive): ignore
1626  * SIGHUP (interactive):
1627  *    send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit
1628  * SIGTTIN, SIGTTOU, SIGTSTP (if job control is on): ignore
1629  *    Note that ^Z is handled not by trapping SIGTSTP, but by seeing
1630  *    that all pipe members are stopped. Try this in bash:
1631  *    while :; do :; done - ^Z does not background it
1632  *    (while :; do :; done) - ^Z backgrounds it
1633  * SIGINT (interactive): wait for last pipe, ignore the rest
1634  *    of the command line, show prompt. NB: ^C does not send SIGINT
1635  *    to interactive shell while shell is waiting for a pipe,
1636  *    since shell is bg'ed (is not in foreground process group).
1637  *    Example 1: this waits 5 sec, but does not execute ls:
1638  *    "echo $$; sleep 5; ls -l" + "kill -INT <pid>"
1639  *    Example 2: this does not wait and does not execute ls:
1640  *    "echo $$; sleep 5 & wait; ls -l" + "kill -INT <pid>"
1641  *    Example 3: this does not wait 5 sec, but executes ls:
1642  *    "sleep 5; ls -l" + press ^C
1643  *    Example 4: this does not wait and does not execute ls:
1644  *    "sleep 5 & wait; ls -l" + press ^C
1645  *
1646  * (What happens to signals which are IGN on shell start?)
1647  * (What happens with signal mask on shell start?)
1648  *
1649  * Old implementation
1650  * ==================
1651  * We use in-kernel pending signal mask to determine which signals were sent.
1652  * We block all signals which we don't want to take action immediately,
1653  * i.e. we block all signals which need to have special handling as described
1654  * above, and all signals which have traps set.
1655  * After each pipe execution, we extract any pending signals via sigtimedwait()
1656  * and act on them.
1657  *
1658  * unsigned special_sig_mask: a mask of such "special" signals
1659  * sigset_t blocked_set:  current blocked signal set
1660  *
1661  * "trap - SIGxxx":
1662  *    clear bit in blocked_set unless it is also in special_sig_mask
1663  * "trap 'cmd' SIGxxx":
1664  *    set bit in blocked_set (even if 'cmd' is '')
1665  * after [v]fork, if we plan to be a shell:
1666  *    unblock signals with special interactive handling
1667  *    (child shell is not interactive),
1668  *    unset all traps except '' (note: regardless of child shell's type - {}, (), etc)
1669  * after [v]fork, if we plan to exec:
1670  *    POSIX says fork clears pending signal mask in child - no need to clear it.
1671  *    Restore blocked signal set to one inherited by shell just prior to exec.
1672  *
1673  * Note: as a result, we do not use signal handlers much. The only uses
1674  * are to count SIGCHLDs
1675  * and to restore tty pgrp on signal-induced exit.
1676  *
1677  * Note 2 (compat):
1678  * Standard says "When a subshell is entered, traps that are not being ignored
1679  * are set to the default actions". bash interprets it so that traps which
1680  * are set to '' (ignore) are NOT reset to defaults. We do the same.
1681  *
1682  * Problem: the above approach makes it unwieldy to catch signals while
1683  * we are in read builtin, or while we read commands from stdin:
1684  * masked signals are not visible!
1685  *
1686  * New implementation
1687  * ==================
1688  * We record each signal we are interested in by installing signal handler
1689  * for them - a bit like emulating kernel pending signal mask in userspace.
1690  * We are interested in: signals which need to have special handling
1691  * as described above, and all signals which have traps set.
1692  * Signals are recorded in pending_set.
1693  * After each pipe execution, we extract any pending signals
1694  * and act on them.
1695  *
1696  * unsigned special_sig_mask: a mask of shell-special signals.
1697  * unsigned fatal_sig_mask: a mask of signals on which we restore tty pgrp.
1698  * char *traps[sig] if trap for sig is set (even if it's '').
1699  * sigset_t pending_set: set of sigs we received.
1700  *
1701  * "trap - SIGxxx":
1702  *    if sig is in special_sig_mask, set handler back to:
1703  *        record_pending_signo, or to IGN if it's a tty stop signal
1704  *    if sig is in fatal_sig_mask, set handler back to sigexit.
1705  *    else: set handler back to SIG_DFL
1706  * "trap 'cmd' SIGxxx":
1707  *    set handler to record_pending_signo.
1708  * "trap '' SIGxxx":
1709  *    set handler to SIG_IGN.
1710  * after [v]fork, if we plan to be a shell:
1711  *    set signals with special interactive handling to SIG_DFL
1712  *    (because child shell is not interactive),
1713  *    unset all traps except '' (note: regardless of child shell's type - {}, (), etc)
1714  * after [v]fork, if we plan to exec:
1715  *    POSIX says fork clears pending signal mask in child - no need to clear it.
1716  *
1717  * To make wait builtin interruptible, we handle SIGCHLD as special signal,
1718  * otherwise (if we leave it SIG_DFL) sigsuspend in wait builtin will not wake up on it.
1719  *
1720  * Note (compat):
1721  * Standard says "When a subshell is entered, traps that are not being ignored
1722  * are set to the default actions". bash interprets it so that traps which
1723  * are set to '' (ignore) are NOT reset to defaults. We do the same.
1724  */
1725 enum {
1726         SPECIAL_INTERACTIVE_SIGS = 0
1727                 | (1 << SIGTERM)
1728                 | (1 << SIGINT)
1729                 | (1 << SIGHUP)
1730                 ,
1731         SPECIAL_JOBSTOP_SIGS = 0
1732 #if ENABLE_HUSH_JOB
1733                 | (1 << SIGTTIN)
1734                 | (1 << SIGTTOU)
1735                 | (1 << SIGTSTP)
1736 #endif
1737                 ,
1738 };
1739
1740 static void record_pending_signo(int sig)
1741 {
1742         sigaddset(&G.pending_set, sig);
1743 #if ENABLE_HUSH_FAST
1744         if (sig == SIGCHLD) {
1745                 G.count_SIGCHLD++;
1746 //bb_error_msg("[%d] SIGCHLD_handler: G.count_SIGCHLD:%d G.handled_SIGCHLD:%d", getpid(), G.count_SIGCHLD, G.handled_SIGCHLD);
1747         }
1748 #endif
1749 }
1750
1751 static sighandler_t install_sighandler(int sig, sighandler_t handler)
1752 {
1753         struct sigaction old_sa;
1754
1755         /* We could use signal() to install handlers... almost:
1756          * except that we need to mask ALL signals while handlers run.
1757          * I saw signal nesting in strace, race window isn't small.
1758          * SA_RESTART is also needed, but in Linux, signal()
1759          * sets SA_RESTART too.
1760          */
1761         /* memset(&G.sa, 0, sizeof(G.sa)); - already done */
1762         /* sigfillset(&G.sa.sa_mask);      - already done */
1763         /* G.sa.sa_flags = SA_RESTART;     - already done */
1764         G.sa.sa_handler = handler;
1765         sigaction(sig, &G.sa, &old_sa);
1766         return old_sa.sa_handler;
1767 }
1768
1769 static void hush_exit(int exitcode) NORETURN;
1770
1771 static void restore_ttypgrp_and__exit(void) NORETURN;
1772 static void restore_ttypgrp_and__exit(void)
1773 {
1774         /* xfunc has failed! die die die */
1775         /* no EXIT traps, this is an escape hatch! */
1776         G.exiting = 1;
1777         hush_exit(xfunc_error_retval);
1778 }
1779
1780 #if ENABLE_HUSH_JOB
1781
1782 /* Needed only on some libc:
1783  * It was observed that on exit(), fgetc'ed buffered data
1784  * gets "unwound" via lseek(fd, -NUM, SEEK_CUR).
1785  * With the net effect that even after fork(), not vfork(),
1786  * exit() in NOEXECed applet in "sh SCRIPT":
1787  *      noexec_applet_here
1788  *      echo END_OF_SCRIPT
1789  * lseeks fd in input FILE object from EOF to "e" in "echo END_OF_SCRIPT".
1790  * This makes "echo END_OF_SCRIPT" executed twice.
1791  * Similar problems can be seen with die_if_script() -> xfunc_die()
1792  * and in `cmd` handling.
1793  * If set as die_func(), this makes xfunc_die() exit via _exit(), not exit():
1794  */
1795 static void fflush_and__exit(void) NORETURN;
1796 static void fflush_and__exit(void)
1797 {
1798         fflush_all();
1799         _exit(xfunc_error_retval);
1800 }
1801
1802 /* After [v]fork, in child: do not restore tty pgrp on xfunc death */
1803 # define disable_restore_tty_pgrp_on_exit() (die_func = fflush_and__exit)
1804 /* After [v]fork, in parent: restore tty pgrp on xfunc death */
1805 # define enable_restore_tty_pgrp_on_exit()  (die_func = restore_ttypgrp_and__exit)
1806
1807 /* Restores tty foreground process group, and exits.
1808  * May be called as signal handler for fatal signal
1809  * (will resend signal to itself, producing correct exit state)
1810  * or called directly with -EXITCODE.
1811  * We also call it if xfunc is exiting.
1812  */
1813 static void sigexit(int sig) NORETURN;
1814 static void sigexit(int sig)
1815 {
1816         /* Careful: we can end up here after [v]fork. Do not restore
1817          * tty pgrp then, only top-level shell process does that */
1818         if (G_saved_tty_pgrp && getpid() == G.root_pid) {
1819                 /* Disable all signals: job control, SIGPIPE, etc.
1820                  * Mostly paranoid measure, to prevent infinite SIGTTOU.
1821                  */
1822                 sigprocmask_allsigs(SIG_BLOCK);
1823                 tcsetpgrp(G_interactive_fd, G_saved_tty_pgrp);
1824         }
1825
1826         /* Not a signal, just exit */
1827         if (sig <= 0)
1828                 _exit(- sig);
1829
1830         kill_myself_with_sig(sig); /* does not return */
1831 }
1832 #else
1833
1834 # define disable_restore_tty_pgrp_on_exit() ((void)0)
1835 # define enable_restore_tty_pgrp_on_exit()  ((void)0)
1836
1837 #endif
1838
1839 static sighandler_t pick_sighandler(unsigned sig)
1840 {
1841         sighandler_t handler = SIG_DFL;
1842         if (sig < sizeof(unsigned)*8) {
1843                 unsigned sigmask = (1 << sig);
1844
1845 #if ENABLE_HUSH_JOB
1846                 /* is sig fatal? */
1847                 if (G_fatal_sig_mask & sigmask)
1848                         handler = sigexit;
1849                 else
1850 #endif
1851                 /* sig has special handling? */
1852                 if (G.special_sig_mask & sigmask) {
1853                         handler = record_pending_signo;
1854                         /* TTIN/TTOU/TSTP can't be set to record_pending_signo
1855                          * in order to ignore them: they will be raised
1856                          * in an endless loop when we try to do some
1857                          * terminal ioctls! We do have to _ignore_ these.
1858                          */
1859                         if (SPECIAL_JOBSTOP_SIGS & sigmask)
1860                                 handler = SIG_IGN;
1861                 }
1862         }
1863         return handler;
1864 }
1865
1866 /* Restores tty foreground process group, and exits. */
1867 static void hush_exit(int exitcode)
1868 {
1869 #if ENABLE_FEATURE_EDITING_SAVE_ON_EXIT
1870         save_history(G.line_input_state);
1871 #endif
1872
1873         fflush_all();
1874         if (G.exiting <= 0 && G_traps && G_traps[0] && G_traps[0][0]) {
1875                 char *argv[3];
1876                 /* argv[0] is unused */
1877                 argv[1] = G_traps[0];
1878                 argv[2] = NULL;
1879                 G.exiting = 1; /* prevent EXIT trap recursion */
1880                 /* Note: G_traps[0] is not cleared!
1881                  * "trap" will still show it, if executed
1882                  * in the handler */
1883                 builtin_eval(argv);
1884         }
1885
1886 #if ENABLE_FEATURE_CLEAN_UP
1887         {
1888                 struct variable *cur_var;
1889                 if (G.cwd != bb_msg_unknown)
1890                         free((char*)G.cwd);
1891                 cur_var = G.top_var;
1892                 while (cur_var) {
1893                         struct variable *tmp = cur_var;
1894                         if (!cur_var->max_len)
1895                                 free(cur_var->varstr);
1896                         cur_var = cur_var->next;
1897                         free(tmp);
1898                 }
1899         }
1900 #endif
1901
1902         fflush_all();
1903 #if ENABLE_HUSH_JOB
1904         sigexit(- (exitcode & 0xff));
1905 #else
1906         _exit(exitcode);
1907 #endif
1908 }
1909
1910
1911 //TODO: return a mask of ALL handled sigs?
1912 static int check_and_run_traps(void)
1913 {
1914         int last_sig = 0;
1915
1916         while (1) {
1917                 int sig;
1918
1919                 if (sigisemptyset(&G.pending_set))
1920                         break;
1921                 sig = 0;
1922                 do {
1923                         sig++;
1924                         if (sigismember(&G.pending_set, sig)) {
1925                                 sigdelset(&G.pending_set, sig);
1926                                 goto got_sig;
1927                         }
1928                 } while (sig < NSIG);
1929                 break;
1930  got_sig:
1931                 if (G_traps && G_traps[sig]) {
1932                         debug_printf_exec("%s: sig:%d handler:'%s'\n", __func__, sig, G.traps[sig]);
1933                         if (G_traps[sig][0]) {
1934                                 /* We have user-defined handler */
1935                                 smalluint save_rcode;
1936                                 char *argv[3];
1937                                 /* argv[0] is unused */
1938                                 argv[1] = G_traps[sig];
1939                                 argv[2] = NULL;
1940                                 save_rcode = G.last_exitcode;
1941                                 builtin_eval(argv);
1942 //FIXME: shouldn't it be set to 128 + sig instead?
1943                                 G.last_exitcode = save_rcode;
1944                                 last_sig = sig;
1945                         } /* else: "" trap, ignoring signal */
1946                         continue;
1947                 }
1948                 /* not a trap: special action */
1949                 switch (sig) {
1950                 case SIGINT:
1951                         debug_printf_exec("%s: sig:%d default SIGINT handler\n", __func__, sig);
1952                         G.flag_SIGINT = 1;
1953                         last_sig = sig;
1954                         break;
1955 #if ENABLE_HUSH_JOB
1956                 case SIGHUP: {
1957                         struct pipe *job;
1958                         debug_printf_exec("%s: sig:%d default SIGHUP handler\n", __func__, sig);
1959                         /* bash is observed to signal whole process groups,
1960                          * not individual processes */
1961                         for (job = G.job_list; job; job = job->next) {
1962                                 if (job->pgrp <= 0)
1963                                         continue;
1964                                 debug_printf_exec("HUPing pgrp %d\n", job->pgrp);
1965                                 if (kill(- job->pgrp, SIGHUP) == 0)
1966                                         kill(- job->pgrp, SIGCONT);
1967                         }
1968                         sigexit(SIGHUP);
1969                 }
1970 #endif
1971 #if ENABLE_HUSH_FAST
1972                 case SIGCHLD:
1973                         debug_printf_exec("%s: sig:%d default SIGCHLD handler\n", __func__, sig);
1974                         G.count_SIGCHLD++;
1975 //bb_error_msg("[%d] check_and_run_traps: G.count_SIGCHLD:%d G.handled_SIGCHLD:%d", getpid(), G.count_SIGCHLD, G.handled_SIGCHLD);
1976                         /* Note:
1977                          * We don't do 'last_sig = sig' here -> NOT returning this sig.
1978                          * This simplifies wait builtin a bit.
1979                          */
1980                         break;
1981 #endif
1982                 default: /* ignored: */
1983                         debug_printf_exec("%s: sig:%d default handling is to ignore\n", __func__, sig);
1984                         /* SIGTERM, SIGQUIT, SIGTTIN, SIGTTOU, SIGTSTP */
1985                         /* Note:
1986                          * We don't do 'last_sig = sig' here -> NOT returning this sig.
1987                          * Example: wait is not interrupted by TERM
1988                          * in interactive shell, because TERM is ignored.
1989                          */
1990                         break;
1991                 }
1992         }
1993         return last_sig;
1994 }
1995
1996
1997 static const char *get_cwd(int force)
1998 {
1999         if (force || G.cwd == NULL) {
2000                 /* xrealloc_getcwd_or_warn(arg) calls free(arg),
2001                  * we must not try to free(bb_msg_unknown) */
2002                 if (G.cwd == bb_msg_unknown)
2003                         G.cwd = NULL;
2004                 G.cwd = xrealloc_getcwd_or_warn((char *)G.cwd);
2005                 if (!G.cwd)
2006                         G.cwd = bb_msg_unknown;
2007         }
2008         return G.cwd;
2009 }
2010
2011
2012 /*
2013  * Shell and environment variable support
2014  */
2015 static struct variable **get_ptr_to_local_var(const char *name, unsigned len)
2016 {
2017         struct variable **pp;
2018         struct variable *cur;
2019
2020         pp = &G.top_var;
2021         while ((cur = *pp) != NULL) {
2022                 if (strncmp(cur->varstr, name, len) == 0 && cur->varstr[len] == '=')
2023                         return pp;
2024                 pp = &cur->next;
2025         }
2026         return NULL;
2027 }
2028
2029 static const char* FAST_FUNC get_local_var_value(const char *name)
2030 {
2031         struct variable **vpp;
2032         unsigned len = strlen(name);
2033
2034         if (G.expanded_assignments) {
2035                 char **cpp = G.expanded_assignments;
2036                 while (*cpp) {
2037                         char *cp = *cpp;
2038                         if (strncmp(cp, name, len) == 0 && cp[len] == '=')
2039                                 return cp + len + 1;
2040                         cpp++;
2041                 }
2042         }
2043
2044         vpp = get_ptr_to_local_var(name, len);
2045         if (vpp)
2046                 return (*vpp)->varstr + len + 1;
2047
2048         if (strcmp(name, "PPID") == 0)
2049                 return utoa(G.root_ppid);
2050         // bash compat: UID? EUID?
2051 #if ENABLE_HUSH_RANDOM_SUPPORT
2052         if (strcmp(name, "RANDOM") == 0)
2053                 return utoa(next_random(&G.random_gen));
2054 #endif
2055         return NULL;
2056 }
2057
2058 /* str holds "NAME=VAL" and is expected to be malloced.
2059  * We take ownership of it.
2060  */
2061 #define SETFLAG_EXPORT   (1 << 0)
2062 #define SETFLAG_UNEXPORT (1 << 1)
2063 #define SETFLAG_MAKE_RO  (1 << 2)
2064 #define SETFLAG_LOCAL_SHIFT    3
2065 static int set_local_var(char *str, unsigned flags)
2066 {
2067         struct variable **var_pp;
2068         struct variable *cur;
2069         char *free_me = NULL;
2070         char *eq_sign;
2071         int name_len;
2072         IF_HUSH_LOCAL(unsigned local_lvl = (flags >> SETFLAG_LOCAL_SHIFT);)
2073
2074         eq_sign = strchr(str, '=');
2075         if (!eq_sign) { /* not expected to ever happen? */
2076                 free(str);
2077                 return -1;
2078         }
2079
2080         name_len = eq_sign - str + 1; /* including '=' */
2081         var_pp = &G.top_var;
2082         while ((cur = *var_pp) != NULL) {
2083                 if (strncmp(cur->varstr, str, name_len) != 0) {
2084                         var_pp = &cur->next;
2085                         continue;
2086                 }
2087
2088                 /* We found an existing var with this name */
2089                 if (cur->flg_read_only) {
2090                         bb_error_msg("%s: readonly variable", str);
2091                         free(str);
2092 //NOTE: in bash, assignment in "export READONLY_VAR=Z" fails, and sets $?=1,
2093 //but export per se succeeds (does put the var in env). We don't mimic that.
2094                         return -1;
2095                 }
2096                 if (flags & SETFLAG_UNEXPORT) { // && cur->flg_export ?
2097                         debug_printf_env("%s: unsetenv '%s'\n", __func__, str);
2098                         *eq_sign = '\0';
2099                         unsetenv(str);
2100                         *eq_sign = '=';
2101                 }
2102 #if ENABLE_HUSH_LOCAL
2103                 if (cur->func_nest_level < local_lvl) {
2104                         /* New variable is declared as local,
2105                          * and existing one is global, or local
2106                          * from enclosing function.
2107                          * Remove and save old one: */
2108                         *var_pp = cur->next;
2109                         cur->next = *G.shadowed_vars_pp;
2110                         *G.shadowed_vars_pp = cur;
2111                         /* bash 3.2.33(1) and exported vars:
2112                          * # export z=z
2113                          * # f() { local z=a; env | grep ^z; }
2114                          * # f
2115                          * z=a
2116                          * # env | grep ^z
2117                          * z=z
2118                          */
2119                         if (cur->flg_export)
2120                                 flags |= SETFLAG_EXPORT;
2121                         break;
2122                 }
2123 #endif
2124                 if (strcmp(cur->varstr + name_len, eq_sign + 1) == 0) {
2125  free_and_exp:
2126                         free(str);
2127                         goto exp;
2128                 }
2129                 if (cur->max_len != 0) {
2130                         if (cur->max_len >= strlen(str)) {
2131                                 /* This one is from startup env, reuse space */
2132                                 strcpy(cur->varstr, str);
2133                                 goto free_and_exp;
2134                         }
2135                         /* Can't reuse */
2136                         cur->max_len = 0;
2137                         goto set_str_and_exp;
2138                 }
2139                 /* max_len == 0 signifies "malloced" var, which we can
2140                  * (and have to) free. But we can't free(cur->varstr) here:
2141                  * if cur->flg_export is 1, it is in the environment.
2142                  * We should either unsetenv+free, or wait until putenv,
2143                  * then putenv(new)+free(old).
2144                  */
2145                 free_me = cur->varstr;
2146                 goto set_str_and_exp;
2147         }
2148
2149         /* Not found - create new variable struct */
2150         cur = xzalloc(sizeof(*cur));
2151         IF_HUSH_LOCAL(cur->func_nest_level = local_lvl;)
2152         cur->next = *var_pp;
2153         *var_pp = cur;
2154
2155  set_str_and_exp:
2156         cur->varstr = str;
2157  exp:
2158 #if !BB_MMU || ENABLE_HUSH_READONLY
2159         if (flags & SETFLAG_MAKE_RO) {
2160                 cur->flg_read_only = 1;
2161         }
2162 #endif
2163         if (flags & SETFLAG_EXPORT)
2164                 cur->flg_export = 1;
2165         if (name_len == 4 && cur->varstr[0] == 'P' && cur->varstr[1] == 'S')
2166                 cmdedit_update_prompt();
2167         if (cur->flg_export) {
2168                 if (flags & SETFLAG_UNEXPORT) {
2169                         cur->flg_export = 0;
2170                         /* unsetenv was already done */
2171                 } else {
2172                         int i;
2173                         debug_printf_env("%s: putenv '%s'\n", __func__, cur->varstr);
2174                         i = putenv(cur->varstr);
2175                         /* only now we can free old exported malloced string */
2176                         free(free_me);
2177                         return i;
2178                 }
2179         }
2180         free(free_me);
2181         return 0;
2182 }
2183
2184 /* Used at startup and after each cd */
2185 static void set_pwd_var(unsigned flag)
2186 {
2187         set_local_var(xasprintf("PWD=%s", get_cwd(/*force:*/ 1)), flag);
2188 }
2189
2190 static int unset_local_var_len(const char *name, int name_len)
2191 {
2192         struct variable *cur;
2193         struct variable **var_pp;
2194
2195         if (!name)
2196                 return EXIT_SUCCESS;
2197         var_pp = &G.top_var;
2198         while ((cur = *var_pp) != NULL) {
2199                 if (strncmp(cur->varstr, name, name_len) == 0 && cur->varstr[name_len] == '=') {
2200                         if (cur->flg_read_only) {
2201                                 bb_error_msg("%s: readonly variable", name);
2202                                 return EXIT_FAILURE;
2203                         }
2204                         *var_pp = cur->next;
2205                         debug_printf_env("%s: unsetenv '%s'\n", __func__, cur->varstr);
2206                         bb_unsetenv(cur->varstr);
2207                         if (name_len == 3 && cur->varstr[0] == 'P' && cur->varstr[1] == 'S')
2208                                 cmdedit_update_prompt();
2209                         if (!cur->max_len)
2210                                 free(cur->varstr);
2211                         free(cur);
2212                         return EXIT_SUCCESS;
2213                 }
2214                 var_pp = &cur->next;
2215         }
2216         return EXIT_SUCCESS;
2217 }
2218
2219 #if ENABLE_HUSH_UNSET
2220 static int unset_local_var(const char *name)
2221 {
2222         return unset_local_var_len(name, strlen(name));
2223 }
2224 #endif
2225
2226 static void unset_vars(char **strings)
2227 {
2228         char **v;
2229
2230         if (!strings)
2231                 return;
2232         v = strings;
2233         while (*v) {
2234                 const char *eq = strchrnul(*v, '=');
2235                 unset_local_var_len(*v, (int)(eq - *v));
2236                 v++;
2237         }
2238         free(strings);
2239 }
2240
2241 #if BASH_HOSTNAME_VAR || ENABLE_FEATURE_SH_MATH || ENABLE_HUSH_READ
2242 static void FAST_FUNC set_local_var_from_halves(const char *name, const char *val)
2243 {
2244         char *var = xasprintf("%s=%s", name, val);
2245         set_local_var(var, /*flag:*/ 0);
2246 }
2247 #endif
2248
2249
2250 /*
2251  * Helpers for "var1=val1 var2=val2 cmd" feature
2252  */
2253 static void add_vars(struct variable *var)
2254 {
2255         struct variable *next;
2256
2257         while (var) {
2258                 next = var->next;
2259                 var->next = G.top_var;
2260                 G.top_var = var;
2261                 if (var->flg_export) {
2262                         debug_printf_env("%s: restoring exported '%s'\n", __func__, var->varstr);
2263                         putenv(var->varstr);
2264                 } else {
2265                         debug_printf_env("%s: restoring variable '%s'\n", __func__, var->varstr);
2266                 }
2267                 var = next;
2268         }
2269 }
2270
2271 static struct variable *set_vars_and_save_old(char **strings)
2272 {
2273         char **s;
2274         struct variable *old = NULL;
2275
2276         if (!strings)
2277                 return old;
2278         s = strings;
2279         while (*s) {
2280                 struct variable *var_p;
2281                 struct variable **var_pp;
2282                 char *eq;
2283
2284                 eq = strchr(*s, '=');
2285                 if (eq) {
2286                         var_pp = get_ptr_to_local_var(*s, eq - *s);
2287                         if (var_pp) {
2288                                 var_p = *var_pp;
2289                                 if (var_p->flg_read_only) {
2290                                         char **p;
2291                                         bb_error_msg("%s: readonly variable", *s);
2292                                         /*
2293                                          * "VAR=V BLTIN" unsets VARs after BLTIN completes.
2294                                          * If VAR is readonly, leaving it in the list
2295                                          * after asssignment error (msg above)
2296                                          * causes doubled error message later, on unset.
2297                                          */
2298                                         debug_printf_env("removing/freeing '%s' element\n", *s);
2299                                         free(*s);
2300                                         p = s;
2301                                         do { *p = p[1]; p++; } while (*p);
2302                                         goto next;
2303                                 }
2304                                 /* Remove variable from global linked list */
2305                                 debug_printf_env("%s: removing '%s'\n", __func__, var_p->varstr);
2306                                 *var_pp = var_p->next;
2307                                 /* Add it to returned list */
2308                                 var_p->next = old;
2309                                 old = var_p;
2310                         }
2311                         set_local_var(*s, SETFLAG_EXPORT);
2312                 }
2313  next:
2314                 s++;
2315         }
2316         return old;
2317 }
2318
2319
2320 /*
2321  * Unicode helper
2322  */
2323 static void reinit_unicode_for_hush(void)
2324 {
2325         /* Unicode support should be activated even if LANG is set
2326          * _during_ shell execution, not only if it was set when
2327          * shell was started. Therefore, re-check LANG every time:
2328          */
2329         if (ENABLE_FEATURE_CHECK_UNICODE_IN_ENV
2330          || ENABLE_UNICODE_USING_LOCALE
2331         ) {
2332                 const char *s = get_local_var_value("LC_ALL");
2333                 if (!s) s = get_local_var_value("LC_CTYPE");
2334                 if (!s) s = get_local_var_value("LANG");
2335                 reinit_unicode(s);
2336         }
2337 }
2338
2339 /*
2340  * in_str support (strings, and "strings" read from files).
2341  */
2342
2343 #if ENABLE_HUSH_INTERACTIVE
2344 /* To test correct lineedit/interactive behavior, type from command line:
2345  *      echo $P\
2346  *      \
2347  *      AT\
2348  *      H\
2349  *      \
2350  * It exercises a lot of corner cases.
2351  */
2352 static void cmdedit_update_prompt(void)
2353 {
2354         if (ENABLE_FEATURE_EDITING_FANCY_PROMPT) {
2355                 G.PS1 = get_local_var_value("PS1");
2356                 if (G.PS1 == NULL)
2357                         G.PS1 = "\\w \\$ ";
2358                 G.PS2 = get_local_var_value("PS2");
2359         } else {
2360                 G.PS1 = NULL;
2361         }
2362         if (G.PS2 == NULL)
2363                 G.PS2 = "> ";
2364 }
2365 static const char *setup_prompt_string(int promptmode)
2366 {
2367         const char *prompt_str;
2368         debug_printf("setup_prompt_string %d ", promptmode);
2369         if (!ENABLE_FEATURE_EDITING_FANCY_PROMPT) {
2370                 /* Set up the prompt */
2371                 if (promptmode == 0) { /* PS1 */
2372                         free((char*)G.PS1);
2373                         /* bash uses $PWD value, even if it is set by user.
2374                          * It uses current dir only if PWD is unset.
2375                          * We always use current dir. */
2376                         G.PS1 = xasprintf("%s %c ", get_cwd(0), (geteuid() != 0) ? '$' : '#');
2377                         prompt_str = G.PS1;
2378                 } else
2379                         prompt_str = G.PS2;
2380         } else
2381                 prompt_str = (promptmode == 0) ? G.PS1 : G.PS2;
2382         debug_printf("prompt_str '%s'\n", prompt_str);
2383         return prompt_str;
2384 }
2385 static int get_user_input(struct in_str *i)
2386 {
2387         int r;
2388         const char *prompt_str;
2389
2390         prompt_str = setup_prompt_string(i->promptmode);
2391 # if ENABLE_FEATURE_EDITING
2392         for (;;) {
2393                 reinit_unicode_for_hush();
2394                 if (G.flag_SIGINT) {
2395                         /* There was ^C'ed, make it look prettier: */
2396                         bb_putchar('\n');
2397                         G.flag_SIGINT = 0;
2398                 }
2399                 /* buglet: SIGINT will not make new prompt to appear _at once_,
2400                  * only after <Enter>. (^C works immediately) */
2401                 r = read_line_input(G.line_input_state, prompt_str,
2402                                 G.user_input_buf, CONFIG_FEATURE_EDITING_MAX_LEN-1,
2403                                 /*timeout*/ -1
2404                 );
2405                 /* read_line_input intercepts ^C, "convert" it to SIGINT */
2406                 if (r == 0) {
2407                         write(STDOUT_FILENO, "^C", 2);
2408                         raise(SIGINT);
2409                 }
2410                 check_and_run_traps();
2411                 if (r != 0 && !G.flag_SIGINT)
2412                         break;
2413                 /* ^C or SIGINT: repeat */
2414                 G.last_exitcode = 128 + SIGINT;
2415         }
2416         if (r < 0) {
2417                 /* EOF/error detected */
2418                 i->p = NULL;
2419                 i->peek_buf[0] = r = EOF;
2420                 return r;
2421         }
2422         i->p = G.user_input_buf;
2423         return (unsigned char)*i->p++;
2424 # else
2425         for (;;) {
2426                 G.flag_SIGINT = 0;
2427                 if (i->last_char == '\0' || i->last_char == '\n') {
2428                         /* Why check_and_run_traps here? Try this interactively:
2429                          * $ trap 'echo INT' INT; (sleep 2; kill -INT $$) &
2430                          * $ <[enter], repeatedly...>
2431                          * Without check_and_run_traps, handler never runs.
2432                          */
2433                         check_and_run_traps();
2434                         fputs(prompt_str, stdout);
2435                 }
2436                 fflush_all();
2437 //FIXME: here ^C or SIGINT will have effect only after <Enter>
2438                 r = fgetc(i->file);
2439                 /* In !ENABLE_FEATURE_EDITING we don't use read_line_input,
2440                  * no ^C masking happens during fgetc, no special code for ^C:
2441                  * it generates SIGINT as usual.
2442                  */
2443                 check_and_run_traps();
2444                 if (G.flag_SIGINT)
2445                         G.last_exitcode = 128 + SIGINT;
2446                 if (r != '\0')
2447                         break;
2448         }
2449         return r;
2450 # endif
2451 }
2452 /* This is the magic location that prints prompts
2453  * and gets data back from the user */
2454 static int fgetc_interactive(struct in_str *i)
2455 {
2456         int ch;
2457         /* If it's interactive stdin, get new line. */
2458         if (G_interactive_fd && i->file == stdin) {
2459                 /* Returns first char (or EOF), the rest is in i->p[] */
2460                 ch = get_user_input(i);
2461                 i->promptmode = 1; /* PS2 */
2462         } else {
2463                 /* Not stdin: script file, sourced file, etc */
2464                 do ch = fgetc(i->file); while (ch == '\0');
2465         }
2466         return ch;
2467 }
2468 #else
2469 static inline int fgetc_interactive(struct in_str *i)
2470 {
2471         int ch;
2472         do ch = fgetc(i->file); while (ch == '\0');
2473         return ch;
2474 }
2475 #endif  /* INTERACTIVE */
2476
2477 static int i_getch(struct in_str *i)
2478 {
2479         int ch;
2480
2481         if (!i->file) {
2482                 /* string-based in_str */
2483                 ch = (unsigned char)*i->p;
2484                 if (ch != '\0') {
2485                         i->p++;
2486                         i->last_char = ch;
2487                         return ch;
2488                 }
2489                 return EOF;
2490         }
2491
2492         /* FILE-based in_str */
2493
2494 #if ENABLE_FEATURE_EDITING
2495         /* This can be stdin, check line editing char[] buffer */
2496         if (i->p && *i->p != '\0') {
2497                 ch = (unsigned char)*i->p++;
2498                 goto out;
2499         }
2500 #endif
2501         /* peek_buf[] is an int array, not char. Can contain EOF. */
2502         ch = i->peek_buf[0];
2503         if (ch != 0) {
2504                 int ch2 = i->peek_buf[1];
2505                 i->peek_buf[0] = ch2;
2506                 if (ch2 == 0) /* very likely, avoid redundant write */
2507                         goto out;
2508                 i->peek_buf[1] = 0;
2509                 goto out;
2510         }
2511
2512         ch = fgetc_interactive(i);
2513  out:
2514         debug_printf("file_get: got '%c' %d\n", ch, ch);
2515         i->last_char = ch;
2516         return ch;
2517 }
2518
2519 static int i_peek(struct in_str *i)
2520 {
2521         int ch;
2522
2523         if (!i->file) {
2524                 /* string-based in_str */
2525                 /* Doesn't report EOF on NUL. None of the callers care. */
2526                 return (unsigned char)*i->p;
2527         }
2528
2529         /* FILE-based in_str */
2530
2531 #if ENABLE_FEATURE_EDITING && ENABLE_HUSH_INTERACTIVE
2532         /* This can be stdin, check line editing char[] buffer */
2533         if (i->p && *i->p != '\0')
2534                 return (unsigned char)*i->p;
2535 #endif
2536         /* peek_buf[] is an int array, not char. Can contain EOF. */
2537         ch = i->peek_buf[0];
2538         if (ch != 0)
2539                 return ch;
2540
2541         /* Need to get a new char */
2542         ch = fgetc_interactive(i);
2543         debug_printf("file_peek: got '%c' %d\n", ch, ch);
2544
2545         /* Save it by either rolling back line editing buffer, or in i->peek_buf[0] */
2546 #if ENABLE_FEATURE_EDITING && ENABLE_HUSH_INTERACTIVE
2547         if (i->p) {
2548                 i->p -= 1;
2549                 return ch;
2550         }
2551 #endif
2552         i->peek_buf[0] = ch;
2553         /*i->peek_buf[1] = 0; - already is */
2554         return ch;
2555 }
2556
2557 /* Only ever called if i_peek() was called, and did not return EOF.
2558  * IOW: we know the previous peek saw an ordinary char, not EOF, not NUL,
2559  * not end-of-line. Therefore we never need to read a new editing line here.
2560  */
2561 static int i_peek2(struct in_str *i)
2562 {
2563         int ch;
2564
2565         /* There are two cases when i->p[] buffer exists.
2566          * (1) it's a string in_str.
2567          * (2) It's a file, and we have a saved line editing buffer.
2568          * In both cases, we know that i->p[0] exists and not NUL, and
2569          * the peek2 result is in i->p[1].
2570          */
2571         if (i->p)
2572                 return (unsigned char)i->p[1];
2573
2574         /* Now we know it is a file-based in_str. */
2575
2576         /* peek_buf[] is an int array, not char. Can contain EOF. */
2577         /* Is there 2nd char? */
2578         ch = i->peek_buf[1];
2579         if (ch == 0) {
2580                 /* We did not read it yet, get it now */
2581                 do ch = fgetc(i->file); while (ch == '\0');
2582                 i->peek_buf[1] = ch;
2583         }
2584
2585         debug_printf("file_peek2: got '%c' %d\n", ch, ch);
2586         return ch;
2587 }
2588
2589 static void setup_file_in_str(struct in_str *i, FILE *f)
2590 {
2591         memset(i, 0, sizeof(*i));
2592         /* i->promptmode = 0; - PS1 (memset did it) */
2593         i->file = f;
2594         /* i->p = NULL; */
2595 }
2596
2597 static void setup_string_in_str(struct in_str *i, const char *s)
2598 {
2599         memset(i, 0, sizeof(*i));
2600         /* i->promptmode = 0; - PS1 (memset did it) */
2601         /*i->file = NULL */;
2602         i->p = s;
2603 }
2604
2605
2606 /*
2607  * o_string support
2608  */
2609 #define B_CHUNK  (32 * sizeof(char*))
2610
2611 static void o_reset_to_empty_unquoted(o_string *o)
2612 {
2613         o->length = 0;
2614         o->has_quoted_part = 0;
2615         if (o->data)
2616                 o->data[0] = '\0';
2617 }
2618
2619 static void o_free(o_string *o)
2620 {
2621         free(o->data);
2622         memset(o, 0, sizeof(*o));
2623 }
2624
2625 static ALWAYS_INLINE void o_free_unsafe(o_string *o)
2626 {
2627         free(o->data);
2628 }
2629
2630 static void o_grow_by(o_string *o, int len)
2631 {
2632         if (o->length + len > o->maxlen) {
2633                 o->maxlen += (2 * len) | (B_CHUNK-1);
2634                 o->data = xrealloc(o->data, 1 + o->maxlen);
2635         }
2636 }
2637
2638 static void o_addchr(o_string *o, int ch)
2639 {
2640         debug_printf("o_addchr: '%c' o->length=%d o=%p\n", ch, o->length, o);
2641         if (o->length < o->maxlen) {
2642                 /* likely. avoid o_grow_by() call */
2643  add:
2644                 o->data[o->length] = ch;
2645                 o->length++;
2646                 o->data[o->length] = '\0';
2647                 return;
2648         }
2649         o_grow_by(o, 1);
2650         goto add;
2651 }
2652
2653 #if 0
2654 /* Valid only if we know o_string is not empty */
2655 static void o_delchr(o_string *o)
2656 {
2657         o->length--;
2658         o->data[o->length] = '\0';
2659 }
2660 #endif
2661
2662 static void o_addblock(o_string *o, const char *str, int len)
2663 {
2664         o_grow_by(o, len);
2665         ((char*)mempcpy(&o->data[o->length], str, len))[0] = '\0';
2666         o->length += len;
2667 }
2668
2669 static void o_addstr(o_string *o, const char *str)
2670 {
2671         o_addblock(o, str, strlen(str));
2672 }
2673
2674 #if !BB_MMU
2675 static void nommu_addchr(o_string *o, int ch)
2676 {
2677         if (o)
2678                 o_addchr(o, ch);
2679 }
2680 #else
2681 # define nommu_addchr(o, str) ((void)0)
2682 #endif
2683
2684 static void o_addstr_with_NUL(o_string *o, const char *str)
2685 {
2686         o_addblock(o, str, strlen(str) + 1);
2687 }
2688
2689 /*
2690  * HUSH_BRACE_EXPANSION code needs corresponding quoting on variable expansion side.
2691  * Currently, "v='{q,w}'; echo $v" erroneously expands braces in $v.
2692  * Apparently, on unquoted $v bash still does globbing
2693  * ("v='*.txt'; echo $v" prints all .txt files),
2694  * but NOT brace expansion! Thus, there should be TWO independent
2695  * quoting mechanisms on $v expansion side: one protects
2696  * $v from brace expansion, and other additionally protects "$v" against globbing.
2697  * We have only second one.
2698  */
2699
2700 #if ENABLE_HUSH_BRACE_EXPANSION
2701 # define MAYBE_BRACES "{}"
2702 #else
2703 # define MAYBE_BRACES ""
2704 #endif
2705
2706 /* My analysis of quoting semantics tells me that state information
2707  * is associated with a destination, not a source.
2708  */
2709 static void o_addqchr(o_string *o, int ch)
2710 {
2711         int sz = 1;
2712         char *found = strchr("*?[\\" MAYBE_BRACES, ch);
2713         if (found)
2714                 sz++;
2715         o_grow_by(o, sz);
2716         if (found) {
2717                 o->data[o->length] = '\\';
2718                 o->length++;
2719         }
2720         o->data[o->length] = ch;
2721         o->length++;
2722         o->data[o->length] = '\0';
2723 }
2724
2725 static void o_addQchr(o_string *o, int ch)
2726 {
2727         int sz = 1;
2728         if ((o->o_expflags & EXP_FLAG_ESC_GLOB_CHARS)
2729          && strchr("*?[\\" MAYBE_BRACES, ch)
2730         ) {
2731                 sz++;
2732                 o->data[o->length] = '\\';
2733                 o->length++;
2734         }
2735         o_grow_by(o, sz);
2736         o->data[o->length] = ch;
2737         o->length++;
2738         o->data[o->length] = '\0';
2739 }
2740
2741 static void o_addqblock(o_string *o, const char *str, int len)
2742 {
2743         while (len) {
2744                 char ch;
2745                 int sz;
2746                 int ordinary_cnt = strcspn(str, "*?[\\" MAYBE_BRACES);
2747                 if (ordinary_cnt > len) /* paranoia */
2748                         ordinary_cnt = len;
2749                 o_addblock(o, str, ordinary_cnt);
2750                 if (ordinary_cnt == len)
2751                         return; /* NUL is already added by o_addblock */
2752                 str += ordinary_cnt;
2753                 len -= ordinary_cnt + 1; /* we are processing + 1 char below */
2754
2755                 ch = *str++;
2756                 sz = 1;
2757                 if (ch) { /* it is necessarily one of "*?[\\" MAYBE_BRACES */
2758                         sz++;
2759                         o->data[o->length] = '\\';
2760                         o->length++;
2761                 }
2762                 o_grow_by(o, sz);
2763                 o->data[o->length] = ch;
2764                 o->length++;
2765         }
2766         o->data[o->length] = '\0';
2767 }
2768
2769 static void o_addQblock(o_string *o, const char *str, int len)
2770 {
2771         if (!(o->o_expflags & EXP_FLAG_ESC_GLOB_CHARS)) {
2772                 o_addblock(o, str, len);
2773                 return;
2774         }
2775         o_addqblock(o, str, len);
2776 }
2777
2778 static void o_addQstr(o_string *o, const char *str)
2779 {
2780         o_addQblock(o, str, strlen(str));
2781 }
2782
2783 /* A special kind of o_string for $VAR and `cmd` expansion.
2784  * It contains char* list[] at the beginning, which is grown in 16 element
2785  * increments. Actual string data starts at the next multiple of 16 * (char*).
2786  * list[i] contains an INDEX (int!) into this string data.
2787  * It means that if list[] needs to grow, data needs to be moved higher up
2788  * but list[i]'s need not be modified.
2789  * NB: remembering how many list[i]'s you have there is crucial.
2790  * o_finalize_list() operation post-processes this structure - calculates
2791  * and stores actual char* ptrs in list[]. Oh, it NULL terminates it as well.
2792  */
2793 #if DEBUG_EXPAND || DEBUG_GLOB
2794 static void debug_print_list(const char *prefix, o_string *o, int n)
2795 {
2796         char **list = (char**)o->data;
2797         int string_start = ((n + 0xf) & ~0xf) * sizeof(list[0]);
2798         int i = 0;
2799
2800         indent();
2801         fdprintf(2, "%s: list:%p n:%d string_start:%d length:%d maxlen:%d glob:%d quoted:%d escape:%d\n",
2802                         prefix, list, n, string_start, o->length, o->maxlen,
2803                         !!(o->o_expflags & EXP_FLAG_GLOB),
2804                         o->has_quoted_part,
2805                         !!(o->o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
2806         while (i < n) {
2807                 indent();
2808                 fdprintf(2, " list[%d]=%d '%s' %p\n", i, (int)(uintptr_t)list[i],
2809                                 o->data + (int)(uintptr_t)list[i] + string_start,
2810                                 o->data + (int)(uintptr_t)list[i] + string_start);
2811                 i++;
2812         }
2813         if (n) {
2814                 const char *p = o->data + (int)(uintptr_t)list[n - 1] + string_start;
2815                 indent();
2816                 fdprintf(2, " total_sz:%ld\n", (long)((p + strlen(p) + 1) - o->data));
2817         }
2818 }
2819 #else
2820 # define debug_print_list(prefix, o, n) ((void)0)
2821 #endif
2822
2823 /* n = o_save_ptr_helper(str, n) "starts new string" by storing an index value
2824  * in list[n] so that it points past last stored byte so far.
2825  * It returns n+1. */
2826 static int o_save_ptr_helper(o_string *o, int n)
2827 {
2828         char **list = (char**)o->data;
2829         int string_start;
2830         int string_len;
2831
2832         if (!o->has_empty_slot) {
2833                 string_start = ((n + 0xf) & ~0xf) * sizeof(list[0]);
2834                 string_len = o->length - string_start;
2835                 if (!(n & 0xf)) { /* 0, 0x10, 0x20...? */
2836                         debug_printf_list("list[%d]=%d string_start=%d (growing)\n", n, string_len, string_start);
2837                         /* list[n] points to string_start, make space for 16 more pointers */
2838                         o->maxlen += 0x10 * sizeof(list[0]);
2839                         o->data = xrealloc(o->data, o->maxlen + 1);
2840                         list = (char**)o->data;
2841                         memmove(list + n + 0x10, list + n, string_len);
2842                         o->length += 0x10 * sizeof(list[0]);
2843                 } else {
2844                         debug_printf_list("list[%d]=%d string_start=%d\n",
2845                                         n, string_len, string_start);
2846                 }
2847         } else {
2848                 /* We have empty slot at list[n], reuse without growth */
2849                 string_start = ((n+1 + 0xf) & ~0xf) * sizeof(list[0]); /* NB: n+1! */
2850                 string_len = o->length - string_start;
2851                 debug_printf_list("list[%d]=%d string_start=%d (empty slot)\n",
2852                                 n, string_len, string_start);
2853                 o->has_empty_slot = 0;
2854         }
2855         o->has_quoted_part = 0;
2856         list[n] = (char*)(uintptr_t)string_len;
2857         return n + 1;
2858 }
2859
2860 /* "What was our last o_save_ptr'ed position (byte offset relative o->data)?" */
2861 static int o_get_last_ptr(o_string *o, int n)
2862 {
2863         char **list = (char**)o->data;
2864         int string_start = ((n + 0xf) & ~0xf) * sizeof(list[0]);
2865
2866         return ((int)(uintptr_t)list[n-1]) + string_start;
2867 }
2868
2869 #if ENABLE_HUSH_BRACE_EXPANSION
2870 /* There in a GNU extension, GLOB_BRACE, but it is not usable:
2871  * first, it processes even {a} (no commas), second,
2872  * I didn't manage to make it return strings when they don't match
2873  * existing files. Need to re-implement it.
2874  */
2875
2876 /* Helper */
2877 static int glob_needed(const char *s)
2878 {
2879         while (*s) {
2880                 if (*s == '\\') {
2881                         if (!s[1])
2882                                 return 0;
2883                         s += 2;
2884                         continue;
2885                 }
2886                 if (*s == '*' || *s == '[' || *s == '?' || *s == '{')
2887                         return 1;
2888                 s++;
2889         }
2890         return 0;
2891 }
2892 /* Return pointer to next closing brace or to comma */
2893 static const char *next_brace_sub(const char *cp)
2894 {
2895         unsigned depth = 0;
2896         cp++;
2897         while (*cp != '\0') {
2898                 if (*cp == '\\') {
2899                         if (*++cp == '\0')
2900                                 break;
2901                         cp++;
2902                         continue;
2903                 }
2904                 if ((*cp == '}' && depth-- == 0) || (*cp == ',' && depth == 0))
2905                         break;
2906                 if (*cp++ == '{')
2907                         depth++;
2908         }
2909
2910         return *cp != '\0' ? cp : NULL;
2911 }
2912 /* Recursive brace globber. Note: may garble pattern[]. */
2913 static int glob_brace(char *pattern, o_string *o, int n)
2914 {
2915         char *new_pattern_buf;
2916         const char *begin;
2917         const char *next;
2918         const char *rest;
2919         const char *p;
2920         size_t rest_len;
2921
2922         debug_printf_glob("glob_brace('%s')\n", pattern);
2923
2924         begin = pattern;
2925         while (1) {
2926                 if (*begin == '\0')
2927                         goto simple_glob;
2928                 if (*begin == '{') {
2929                         /* Find the first sub-pattern and at the same time
2930                          * find the rest after the closing brace */
2931                         next = next_brace_sub(begin);
2932                         if (next == NULL) {
2933                                 /* An illegal expression */
2934                                 goto simple_glob;
2935                         }
2936                         if (*next == '}') {
2937                                 /* "{abc}" with no commas - illegal
2938                                  * brace expr, disregard and skip it */
2939                                 begin = next + 1;
2940                                 continue;
2941                         }
2942                         break;
2943                 }
2944                 if (*begin == '\\' && begin[1] != '\0')
2945                         begin++;
2946                 begin++;
2947         }
2948         debug_printf_glob("begin:%s\n", begin);
2949         debug_printf_glob("next:%s\n", next);
2950
2951         /* Now find the end of the whole brace expression */
2952         rest = next;
2953         while (*rest != '}') {
2954                 rest = next_brace_sub(rest);
2955                 if (rest == NULL) {
2956                         /* An illegal expression */
2957                         goto simple_glob;
2958                 }
2959                 debug_printf_glob("rest:%s\n", rest);
2960         }
2961         rest_len = strlen(++rest) + 1;
2962
2963         /* We are sure the brace expression is well-formed */
2964
2965         /* Allocate working buffer large enough for our work */
2966         new_pattern_buf = xmalloc(strlen(pattern));
2967
2968         /* We have a brace expression.  BEGIN points to the opening {,
2969          * NEXT points past the terminator of the first element, and REST
2970          * points past the final }.  We will accumulate result names from
2971          * recursive runs for each brace alternative in the buffer using
2972          * GLOB_APPEND.  */
2973
2974         p = begin + 1;
2975         while (1) {
2976                 /* Construct the new glob expression */
2977                 memcpy(
2978                         mempcpy(
2979                                 mempcpy(new_pattern_buf,
2980                                         /* We know the prefix for all sub-patterns */
2981                                         pattern, begin - pattern),
2982                                 p, next - p),
2983                         rest, rest_len);
2984
2985                 /* Note: glob_brace() may garble new_pattern_buf[].
2986                  * That's why we re-copy prefix every time (1st memcpy above).
2987                  */
2988                 n = glob_brace(new_pattern_buf, o, n);
2989                 if (*next == '}') {
2990                         /* We saw the last entry */
2991                         break;
2992                 }
2993                 p = next + 1;
2994                 next = next_brace_sub(next);
2995         }
2996         free(new_pattern_buf);
2997         return n;
2998
2999  simple_glob:
3000         {
3001                 int gr;
3002                 glob_t globdata;
3003
3004                 memset(&globdata, 0, sizeof(globdata));
3005                 gr = glob(pattern, 0, NULL, &globdata);
3006                 debug_printf_glob("glob('%s'):%d\n", pattern, gr);
3007                 if (gr != 0) {
3008                         if (gr == GLOB_NOMATCH) {
3009                                 globfree(&globdata);
3010                                 /* NB: garbles parameter */
3011                                 unbackslash(pattern);
3012                                 o_addstr_with_NUL(o, pattern);
3013                                 debug_printf_glob("glob pattern '%s' is literal\n", pattern);
3014                                 return o_save_ptr_helper(o, n);
3015                         }
3016                         if (gr == GLOB_NOSPACE)
3017                                 bb_error_msg_and_die(bb_msg_memory_exhausted);
3018                         /* GLOB_ABORTED? Only happens with GLOB_ERR flag,
3019                          * but we didn't specify it. Paranoia again. */
3020                         bb_error_msg_and_die("glob error %d on '%s'", gr, pattern);
3021                 }
3022                 if (globdata.gl_pathv && globdata.gl_pathv[0]) {
3023                         char **argv = globdata.gl_pathv;
3024                         while (1) {
3025                                 o_addstr_with_NUL(o, *argv);
3026                                 n = o_save_ptr_helper(o, n);
3027                                 argv++;
3028                                 if (!*argv)
3029                                         break;
3030                         }
3031                 }
3032                 globfree(&globdata);
3033         }
3034         return n;
3035 }
3036 /* Performs globbing on last list[],
3037  * saving each result as a new list[].
3038  */
3039 static int perform_glob(o_string *o, int n)
3040 {
3041         char *pattern, *copy;
3042
3043         debug_printf_glob("start perform_glob: n:%d o->data:%p\n", n, o->data);
3044         if (!o->data)
3045                 return o_save_ptr_helper(o, n);
3046         pattern = o->data + o_get_last_ptr(o, n);
3047         debug_printf_glob("glob pattern '%s'\n", pattern);
3048         if (!glob_needed(pattern)) {
3049                 /* unbackslash last string in o in place, fix length */
3050                 o->length = unbackslash(pattern) - o->data;
3051                 debug_printf_glob("glob pattern '%s' is literal\n", pattern);
3052                 return o_save_ptr_helper(o, n);
3053         }
3054
3055         copy = xstrdup(pattern);
3056         /* "forget" pattern in o */
3057         o->length = pattern - o->data;
3058         n = glob_brace(copy, o, n);
3059         free(copy);
3060         if (DEBUG_GLOB)
3061                 debug_print_list("perform_glob returning", o, n);
3062         return n;
3063 }
3064
3065 #else /* !HUSH_BRACE_EXPANSION */
3066
3067 /* Helper */
3068 static int glob_needed(const char *s)
3069 {
3070         while (*s) {
3071                 if (*s == '\\') {
3072                         if (!s[1])
3073                                 return 0;
3074                         s += 2;
3075                         continue;
3076                 }
3077                 if (*s == '*' || *s == '[' || *s == '?')
3078                         return 1;
3079                 s++;
3080         }
3081         return 0;
3082 }
3083 /* Performs globbing on last list[],
3084  * saving each result as a new list[].
3085  */
3086 static int perform_glob(o_string *o, int n)
3087 {
3088         glob_t globdata;
3089         int gr;
3090         char *pattern;
3091
3092         debug_printf_glob("start perform_glob: n:%d o->data:%p\n", n, o->data);
3093         if (!o->data)
3094                 return o_save_ptr_helper(o, n);
3095         pattern = o->data + o_get_last_ptr(o, n);
3096         debug_printf_glob("glob pattern '%s'\n", pattern);
3097         if (!glob_needed(pattern)) {
3098  literal:
3099                 /* unbackslash last string in o in place, fix length */
3100                 o->length = unbackslash(pattern) - o->data;
3101                 debug_printf_glob("glob pattern '%s' is literal\n", pattern);
3102                 return o_save_ptr_helper(o, n);
3103         }
3104
3105         memset(&globdata, 0, sizeof(globdata));
3106         /* Can't use GLOB_NOCHECK: it does not unescape the string.
3107          * If we glob "*.\*" and don't find anything, we need
3108          * to fall back to using literal "*.*", but GLOB_NOCHECK
3109          * will return "*.\*"!
3110          */
3111         gr = glob(pattern, 0, NULL, &globdata);
3112         debug_printf_glob("glob('%s'):%d\n", pattern, gr);
3113         if (gr != 0) {
3114                 if (gr == GLOB_NOMATCH) {
3115                         globfree(&globdata);
3116                         goto literal;
3117                 }
3118                 if (gr == GLOB_NOSPACE)
3119                         bb_error_msg_and_die(bb_msg_memory_exhausted);
3120                 /* GLOB_ABORTED? Only happens with GLOB_ERR flag,
3121                  * but we didn't specify it. Paranoia again. */
3122                 bb_error_msg_and_die("glob error %d on '%s'", gr, pattern);
3123         }
3124         if (globdata.gl_pathv && globdata.gl_pathv[0]) {
3125                 char **argv = globdata.gl_pathv;
3126                 /* "forget" pattern in o */
3127                 o->length = pattern - o->data;
3128                 while (1) {
3129                         o_addstr_with_NUL(o, *argv);
3130                         n = o_save_ptr_helper(o, n);
3131                         argv++;
3132                         if (!*argv)
3133                                 break;
3134                 }
3135         }
3136         globfree(&globdata);
3137         if (DEBUG_GLOB)
3138                 debug_print_list("perform_glob returning", o, n);
3139         return n;
3140 }
3141
3142 #endif /* !HUSH_BRACE_EXPANSION */
3143
3144 /* If o->o_expflags & EXP_FLAG_GLOB, glob the string so far remembered.
3145  * Otherwise, just finish current list[] and start new */
3146 static int o_save_ptr(o_string *o, int n)
3147 {
3148         if (o->o_expflags & EXP_FLAG_GLOB) {
3149                 /* If o->has_empty_slot, list[n] was already globbed
3150                  * (if it was requested back then when it was filled)
3151                  * so don't do that again! */
3152                 if (!o->has_empty_slot)
3153                         return perform_glob(o, n); /* o_save_ptr_helper is inside */
3154         }
3155         return o_save_ptr_helper(o, n);
3156 }
3157
3158 /* "Please convert list[n] to real char* ptrs, and NULL terminate it." */
3159 static char **o_finalize_list(o_string *o, int n)
3160 {
3161         char **list;
3162         int string_start;
3163
3164         n = o_save_ptr(o, n); /* force growth for list[n] if necessary */
3165         if (DEBUG_EXPAND)
3166                 debug_print_list("finalized", o, n);
3167         debug_printf_expand("finalized n:%d\n", n);
3168         list = (char**)o->data;
3169         string_start = ((n + 0xf) & ~0xf) * sizeof(list[0]);
3170         list[--n] = NULL;
3171         while (n) {
3172                 n--;
3173                 list[n] = o->data + (int)(uintptr_t)list[n] + string_start;
3174         }
3175         return list;
3176 }
3177
3178 static void free_pipe_list(struct pipe *pi);
3179
3180 /* Returns pi->next - next pipe in the list */
3181 static struct pipe *free_pipe(struct pipe *pi)
3182 {
3183         struct pipe *next;
3184         int i;
3185
3186         debug_printf_clean("free_pipe (pid %d)\n", getpid());
3187         for (i = 0; i < pi->num_cmds; i++) {
3188                 struct command *command;
3189                 struct redir_struct *r, *rnext;
3190
3191                 command = &pi->cmds[i];
3192                 debug_printf_clean("  command %d:\n", i);
3193                 if (command->argv) {
3194                         if (DEBUG_CLEAN) {
3195                                 int a;
3196                                 char **p;
3197                                 for (a = 0, p = command->argv; *p; a++, p++) {
3198                                         debug_printf_clean("   argv[%d] = %s\n", a, *p);
3199                                 }
3200                         }
3201                         free_strings(command->argv);
3202                         //command->argv = NULL;
3203                 }
3204                 /* not "else if": on syntax error, we may have both! */
3205                 if (command->group) {
3206                         debug_printf_clean("   begin group (cmd_type:%d)\n",
3207                                         command->cmd_type);
3208                         free_pipe_list(command->group);
3209                         debug_printf_clean("   end group\n");
3210                         //command->group = NULL;
3211                 }
3212                 /* else is crucial here.
3213                  * If group != NULL, child_func is meaningless */
3214 #if ENABLE_HUSH_FUNCTIONS
3215                 else if (command->child_func) {
3216                         debug_printf_exec("cmd %p releases child func at %p\n", command, command->child_func);
3217                         command->child_func->parent_cmd = NULL;
3218                 }
3219 #endif
3220 #if !BB_MMU
3221                 free(command->group_as_string);
3222                 //command->group_as_string = NULL;
3223 #endif
3224                 for (r = command->redirects; r; r = rnext) {
3225                         debug_printf_clean("   redirect %d%s",
3226                                         r->rd_fd, redir_table[r->rd_type].descrip);
3227                         /* guard against the case >$FOO, where foo is unset or blank */
3228                         if (r->rd_filename) {
3229                                 debug_printf_clean(" fname:'%s'\n", r->rd_filename);
3230                                 free(r->rd_filename);
3231                                 //r->rd_filename = NULL;
3232                         }
3233                         debug_printf_clean(" rd_dup:%d\n", r->rd_dup);
3234                         rnext = r->next;
3235                         free(r);
3236                 }
3237                 //command->redirects = NULL;
3238         }
3239         free(pi->cmds);   /* children are an array, they get freed all at once */
3240         //pi->cmds = NULL;
3241 #if ENABLE_HUSH_JOB
3242         free(pi->cmdtext);
3243         //pi->cmdtext = NULL;
3244 #endif
3245
3246         next = pi->next;
3247         free(pi);
3248         return next;
3249 }
3250
3251 static void free_pipe_list(struct pipe *pi)
3252 {
3253         while (pi) {
3254 #if HAS_KEYWORDS
3255                 debug_printf_clean("pipe reserved word %d\n", pi->res_word);
3256 #endif
3257                 debug_printf_clean("pipe followup code %d\n", pi->followup);
3258                 pi = free_pipe(pi);
3259         }
3260 }
3261
3262
3263 /*** Parsing routines ***/
3264
3265 #ifndef debug_print_tree
3266 static void debug_print_tree(struct pipe *pi, int lvl)
3267 {
3268         static const char *const PIPE[] = {
3269                 [PIPE_SEQ] = "SEQ",
3270                 [PIPE_AND] = "AND",
3271                 [PIPE_OR ] = "OR" ,
3272                 [PIPE_BG ] = "BG" ,
3273         };
3274         static const char *RES[] = {
3275                 [RES_NONE ] = "NONE" ,
3276 # if ENABLE_HUSH_IF
3277                 [RES_IF   ] = "IF"   ,
3278                 [RES_THEN ] = "THEN" ,
3279                 [RES_ELIF ] = "ELIF" ,
3280                 [RES_ELSE ] = "ELSE" ,
3281                 [RES_FI   ] = "FI"   ,
3282 # endif
3283 # if ENABLE_HUSH_LOOPS
3284                 [RES_FOR  ] = "FOR"  ,
3285                 [RES_WHILE] = "WHILE",
3286                 [RES_UNTIL] = "UNTIL",
3287                 [RES_DO   ] = "DO"   ,
3288                 [RES_DONE ] = "DONE" ,
3289 # endif
3290 # if ENABLE_HUSH_LOOPS || ENABLE_HUSH_CASE
3291                 [RES_IN   ] = "IN"   ,
3292 # endif
3293 # if ENABLE_HUSH_CASE
3294                 [RES_CASE ] = "CASE" ,
3295                 [RES_CASE_IN ] = "CASE_IN" ,
3296                 [RES_MATCH] = "MATCH",
3297                 [RES_CASE_BODY] = "CASE_BODY",
3298                 [RES_ESAC ] = "ESAC" ,
3299 # endif
3300                 [RES_XXXX ] = "XXXX" ,
3301                 [RES_SNTX ] = "SNTX" ,
3302         };
3303         static const char *const CMDTYPE[] = {
3304                 "{}",
3305                 "()",
3306                 "[noglob]",
3307 # if ENABLE_HUSH_FUNCTIONS
3308                 "func()",
3309 # endif
3310         };
3311
3312         int pin, prn;
3313
3314         pin = 0;
3315         while (pi) {
3316                 fdprintf(2, "%*spipe %d res_word=%s followup=%d %s\n", lvl*2, "",
3317                                 pin, RES[pi->res_word], pi->followup, PIPE[pi->followup]);
3318                 prn = 0;
3319                 while (prn < pi->num_cmds) {
3320                         struct command *command = &pi->cmds[prn];
3321                         char **argv = command->argv;
3322
3323                         fdprintf(2, "%*s cmd %d assignment_cnt:%d",
3324                                         lvl*2, "", prn,
3325                                         command->assignment_cnt);
3326                         if (command->group) {
3327                                 fdprintf(2, " group %s: (argv=%p)%s%s\n",
3328                                                 CMDTYPE[command->cmd_type],
3329                                                 argv
3330 # if !BB_MMU
3331                                                 , " group_as_string:", command->group_as_string
3332 # else
3333                                                 , "", ""
3334 # endif
3335                                 );
3336                                 debug_print_tree(command->group, lvl+1);
3337                                 prn++;
3338                                 continue;
3339                         }
3340                         if (argv) while (*argv) {
3341                                 fdprintf(2, " '%s'", *argv);
3342                                 argv++;
3343                         }
3344                         fdprintf(2, "\n");
3345                         prn++;
3346                 }
3347                 pi = pi->next;
3348                 pin++;
3349         }
3350 }
3351 #endif /* debug_print_tree */
3352
3353 static struct pipe *new_pipe(void)
3354 {
3355         struct pipe *pi;
3356         pi = xzalloc(sizeof(struct pipe));
3357         /*pi->res_word = RES_NONE; - RES_NONE is 0 anyway */
3358         return pi;
3359 }
3360
3361 /* Command (member of a pipe) is complete, or we start a new pipe
3362  * if ctx->command is NULL.
3363  * No errors possible here.
3364  */
3365 static int done_command(struct parse_context *ctx)
3366 {
3367         /* The command is really already in the pipe structure, so
3368          * advance the pipe counter and make a new, null command. */
3369         struct pipe *pi = ctx->pipe;
3370         struct command *command = ctx->command;
3371
3372 #if 0   /* Instead we emit error message at run time */
3373         if (ctx->pending_redirect) {
3374                 /* For example, "cmd >" (no filename to redirect to) */
3375                 die_if_script("syntax error: %s", "invalid redirect");
3376                 ctx->pending_redirect = NULL;
3377         }
3378 #endif
3379
3380         if (command) {
3381                 if (IS_NULL_CMD(command)) {
3382                         debug_printf_parse("done_command: skipping null cmd, num_cmds=%d\n", pi->num_cmds);
3383                         goto clear_and_ret;
3384                 }
3385                 pi->num_cmds++;
3386                 debug_printf_parse("done_command: ++num_cmds=%d\n", pi->num_cmds);
3387                 //debug_print_tree(ctx->list_head, 20);
3388         } else {
3389                 debug_printf_parse("done_command: initializing, num_cmds=%d\n", pi->num_cmds);
3390         }
3391
3392         /* Only real trickiness here is that the uncommitted
3393          * command structure is not counted in pi->num_cmds. */
3394         pi->cmds = xrealloc(pi->cmds, sizeof(*pi->cmds) * (pi->num_cmds+1));
3395         ctx->command = command = &pi->cmds[pi->num_cmds];
3396  clear_and_ret:
3397         memset(command, 0, sizeof(*command));
3398         return pi->num_cmds; /* used only for 0/nonzero check */
3399 }
3400
3401 static void done_pipe(struct parse_context *ctx, pipe_style type)
3402 {
3403         int not_null;
3404
3405         debug_printf_parse("done_pipe entered, followup %d\n", type);
3406         /* Close previous command */
3407         not_null = done_command(ctx);
3408 #if HAS_KEYWORDS
3409         ctx->pipe->pi_inverted = ctx->ctx_inverted;
3410         ctx->ctx_inverted = 0;
3411         ctx->pipe->res_word = ctx->ctx_res_w;
3412 #endif
3413         if (type == PIPE_BG && ctx->list_head != ctx->pipe) {
3414                 /* Necessary since && and || have precedence over &:
3415                  * "cmd1 && cmd2 &" must spawn both cmds, not only cmd2,
3416                  * in a backgrounded subshell.
3417                  */
3418                 struct pipe *pi;
3419                 struct command *command;
3420
3421                 /* Is this actually this construct, all pipes end with && or ||? */
3422                 pi = ctx->list_head;
3423                 while (pi != ctx->pipe) {
3424                         if (pi->followup != PIPE_AND && pi->followup != PIPE_OR)
3425                                 goto no_conv;
3426                         pi = pi->next;
3427                 }
3428
3429                 debug_printf_parse("BG with more than one pipe, converting to { p1 &&...pN; } &\n");
3430                 pi->followup = PIPE_SEQ; /* close pN _not_ with "&"! */
3431                 pi = xzalloc(sizeof(*pi));
3432                 pi->followup = PIPE_BG;
3433                 pi->num_cmds = 1;
3434                 pi->cmds = xzalloc(sizeof(pi->cmds[0]));
3435                 command = &pi->cmds[0];
3436                 if (CMD_NORMAL != 0) /* "if xzalloc didn't do that already" */
3437                         command->cmd_type = CMD_NORMAL;
3438                 command->group = ctx->list_head;
3439 #if !BB_MMU
3440                 command->group_as_string = xstrndup(
3441                             ctx->as_string.data,
3442                             ctx->as_string.length - 1 /* do not copy last char, "&" */
3443                 );
3444 #endif
3445                 /* Replace all pipes in ctx with one newly created */
3446                 ctx->list_head = ctx->pipe = pi;
3447         } else {
3448  no_conv:
3449                 ctx->pipe->followup = type;
3450         }
3451
3452         /* Without this check, even just <enter> on command line generates
3453          * tree of three NOPs (!). Which is harmless but annoying.
3454          * IOW: it is safe to do it unconditionally. */
3455         if (not_null
3456 #if ENABLE_HUSH_IF
3457          || ctx->ctx_res_w == RES_FI
3458 #endif
3459 #if ENABLE_HUSH_LOOPS
3460          || ctx->ctx_res_w == RES_DONE
3461          || ctx->ctx_res_w == RES_FOR
3462          || ctx->ctx_res_w == RES_IN
3463 #endif
3464 #if ENABLE_HUSH_CASE
3465          || ctx->ctx_res_w == RES_ESAC
3466 #endif
3467         ) {
3468                 struct pipe *new_p;
3469                 debug_printf_parse("done_pipe: adding new pipe: "
3470                                 "not_null:%d ctx->ctx_res_w:%d\n",
3471                                 not_null, ctx->ctx_res_w);
3472                 new_p = new_pipe();
3473                 ctx->pipe->next = new_p;
3474                 ctx->pipe = new_p;
3475                 /* RES_THEN, RES_DO etc are "sticky" -
3476                  * they remain set for pipes inside if/while.
3477                  * This is used to control execution.
3478                  * RES_FOR and RES_IN are NOT sticky (needed to support
3479                  * cases where variable or value happens to match a keyword):
3480                  */
3481 #if ENABLE_HUSH_LOOPS
3482                 if (ctx->ctx_res_w == RES_FOR
3483                  || ctx->ctx_res_w == RES_IN)
3484                         ctx->ctx_res_w = RES_NONE;
3485 #endif
3486 #if ENABLE_HUSH_CASE
3487                 if (ctx->ctx_res_w == RES_MATCH)
3488                         ctx->ctx_res_w = RES_CASE_BODY;
3489                 if (ctx->ctx_res_w == RES_CASE)
3490                         ctx->ctx_res_w = RES_CASE_IN;
3491 #endif
3492                 ctx->command = NULL; /* trick done_command below */
3493                 /* Create the memory for command, roughly:
3494                  * ctx->pipe->cmds = new struct command;
3495                  * ctx->command = &ctx->pipe->cmds[0];
3496                  */
3497                 done_command(ctx);
3498                 //debug_print_tree(ctx->list_head, 10);
3499         }
3500         debug_printf_parse("done_pipe return\n");
3501 }
3502
3503 static void initialize_context(struct parse_context *ctx)
3504 {
3505         memset(ctx, 0, sizeof(*ctx));
3506         ctx->pipe = ctx->list_head = new_pipe();
3507         /* Create the memory for command, roughly:
3508          * ctx->pipe->cmds = new struct command;
3509          * ctx->command = &ctx->pipe->cmds[0];
3510          */
3511         done_command(ctx);
3512 }
3513
3514 /* If a reserved word is found and processed, parse context is modified
3515  * and 1 is returned.
3516  */
3517 #if HAS_KEYWORDS
3518 struct reserved_combo {
3519         char literal[6];
3520         unsigned char res;
3521         unsigned char assignment_flag;
3522         int flag;
3523 };
3524 enum {
3525         FLAG_END   = (1 << RES_NONE ),
3526 # if ENABLE_HUSH_IF
3527         FLAG_IF    = (1 << RES_IF   ),
3528         FLAG_THEN  = (1 << RES_THEN ),
3529         FLAG_ELIF  = (1 << RES_ELIF ),
3530         FLAG_ELSE  = (1 << RES_ELSE ),
3531         FLAG_FI    = (1 << RES_FI   ),
3532 # endif
3533 # if ENABLE_HUSH_LOOPS
3534         FLAG_FOR   = (1 << RES_FOR  ),
3535         FLAG_WHILE = (1 << RES_WHILE),
3536         FLAG_UNTIL = (1 << RES_UNTIL),
3537         FLAG_DO    = (1 << RES_DO   ),
3538         FLAG_DONE  = (1 << RES_DONE ),
3539         FLAG_IN    = (1 << RES_IN   ),
3540 # endif
3541 # if ENABLE_HUSH_CASE
3542         FLAG_MATCH = (1 << RES_MATCH),
3543         FLAG_ESAC  = (1 << RES_ESAC ),
3544 # endif
3545         FLAG_START = (1 << RES_XXXX ),
3546 };
3547
3548 static const struct reserved_combo* match_reserved_word(o_string *word)
3549 {
3550         /* Mostly a list of accepted follow-up reserved words.
3551          * FLAG_END means we are done with the sequence, and are ready
3552          * to turn the compound list into a command.
3553          * FLAG_START means the word must start a new compound list.
3554          */
3555         static const struct reserved_combo reserved_list[] = {
3556 # if ENABLE_HUSH_IF
3557                 { "!",     RES_NONE,  NOT_ASSIGNMENT  , 0 },
3558                 { "if",    RES_IF,    MAYBE_ASSIGNMENT, FLAG_THEN | FLAG_START },
3559                 { "then",  RES_THEN,  MAYBE_ASSIGNMENT, FLAG_ELIF | FLAG_ELSE | FLAG_FI },
3560                 { "elif",  RES_ELIF,  MAYBE_ASSIGNMENT, FLAG_THEN },
3561                 { "else",  RES_ELSE,  MAYBE_ASSIGNMENT, FLAG_FI   },
3562                 { "fi",    RES_FI,    NOT_ASSIGNMENT  , FLAG_END  },
3563 # endif
3564 # if ENABLE_HUSH_LOOPS
3565                 { "for",   RES_FOR,   NOT_ASSIGNMENT  , FLAG_IN | FLAG_DO | FLAG_START },
3566                 { "while", RES_WHILE, MAYBE_ASSIGNMENT, FLAG_DO | FLAG_START },
3567                 { "until", RES_UNTIL, MAYBE_ASSIGNMENT, FLAG_DO | FLAG_START },
3568                 { "in",    RES_IN,    NOT_ASSIGNMENT  , FLAG_DO   },
3569                 { "do",    RES_DO,    MAYBE_ASSIGNMENT, FLAG_DONE },
3570                 { "done",  RES_DONE,  NOT_ASSIGNMENT  , FLAG_END  },
3571 # endif
3572 # if ENABLE_HUSH_CASE
3573                 { "case",  RES_CASE,  NOT_ASSIGNMENT  , FLAG_MATCH | FLAG_START },
3574                 { "esac",  RES_ESAC,  NOT_ASSIGNMENT  , FLAG_END  },
3575 # endif
3576         };
3577         const struct reserved_combo *r;
3578
3579         for (r = reserved_list; r < reserved_list + ARRAY_SIZE(reserved_list); r++) {
3580                 if (strcmp(word->data, r->literal) == 0)
3581                         return r;
3582         }
3583         return NULL;
3584 }
3585 /* Return 0: not a keyword, 1: keyword
3586  */
3587 static int reserved_word(o_string *word, struct parse_context *ctx)
3588 {
3589 # if ENABLE_HUSH_CASE
3590         static const struct reserved_combo reserved_match = {
3591                 "",        RES_MATCH, NOT_ASSIGNMENT , FLAG_MATCH | FLAG_ESAC
3592         };
3593 # endif
3594         const struct reserved_combo *r;
3595
3596         if (word->has_quoted_part)
3597                 return 0;
3598         r = match_reserved_word(word);
3599         if (!r)
3600                 return 0;
3601
3602         debug_printf("found reserved word %s, res %d\n", r->literal, r->res);
3603 # if ENABLE_HUSH_CASE
3604         if (r->res == RES_IN && ctx->ctx_res_w == RES_CASE_IN) {
3605                 /* "case word IN ..." - IN part starts first MATCH part */
3606                 r = &reserved_match;
3607         } else
3608 # endif
3609         if (r->flag == 0) { /* '!' */
3610                 if (ctx->ctx_inverted) { /* bash doesn't accept '! ! true' */
3611                         syntax_error("! ! command");
3612                         ctx->ctx_res_w = RES_SNTX;
3613                 }
3614                 ctx->ctx_inverted = 1;
3615                 return 1;
3616         }
3617         if (r->flag & FLAG_START) {
3618                 struct parse_context *old;
3619
3620                 old = xmemdup(ctx, sizeof(*ctx));
3621                 debug_printf_parse("push stack %p\n", old);
3622                 initialize_context(ctx);
3623                 ctx->stack = old;
3624         } else if (/*ctx->ctx_res_w == RES_NONE ||*/ !(ctx->old_flag & (1 << r->res))) {
3625                 syntax_error_at(word->data);
3626                 ctx->ctx_res_w = RES_SNTX;
3627                 return 1;
3628         } else {
3629                 /* "{...} fi" is ok. "{...} if" is not
3630                  * Example:
3631                  * if { echo foo; } then { echo bar; } fi */
3632                 if (ctx->command->group)
3633                         done_pipe(ctx, PIPE_SEQ);
3634         }
3635
3636         ctx->ctx_res_w = r->res;
3637         ctx->old_flag = r->flag;
3638         word->o_assignment = r->assignment_flag;
3639         debug_printf_parse("word->o_assignment='%s'\n", assignment_flag[word->o_assignment]);
3640
3641         if (ctx->old_flag & FLAG_END) {
3642                 struct parse_context *old;
3643
3644                 done_pipe(ctx, PIPE_SEQ);
3645                 debug_printf_parse("pop stack %p\n", ctx->stack);
3646                 old = ctx->stack;
3647                 old->command->group = ctx->list_head;
3648                 old->command->cmd_type = CMD_NORMAL;
3649 # if !BB_MMU
3650                 /* At this point, the compound command's string is in
3651                  * ctx->as_string... except for the leading keyword!
3652                  * Consider this example: "echo a | if true; then echo a; fi"
3653                  * ctx->as_string will contain "true; then echo a; fi",
3654                  * with "if " remaining in old->as_string!
3655                  */
3656                 {
3657                         char *str;
3658                         int len = old->as_string.length;
3659                         /* Concatenate halves */
3660                         o_addstr(&old->as_string, ctx->as_string.data);
3661                         o_free_unsafe(&ctx->as_string);
3662                         /* Find where leading keyword starts in first half */
3663                         str = old->as_string.data + len;
3664                         if (str > old->as_string.data)
3665                                 str--; /* skip whitespace after keyword */
3666                         while (str > old->as_string.data && isalpha(str[-1]))
3667                                 str--;
3668                         /* Ugh, we're done with this horrid hack */
3669                         old->command->group_as_string = xstrdup(str);
3670                         debug_printf_parse("pop, remembering as:'%s'\n",
3671                                         old->command->group_as_string);
3672                 }
3673 # endif
3674                 *ctx = *old;   /* physical copy */
3675                 free(old);
3676         }
3677         return 1;
3678 }
3679 #endif /* HAS_KEYWORDS */
3680
3681 /* Word is complete, look at it and update parsing context.
3682  * Normal return is 0. Syntax errors return 1.
3683  * Note: on return, word is reset, but not o_free'd!
3684  */
3685 static int done_word(o_string *word, struct parse_context *ctx)
3686 {
3687         struct command *command = ctx->command;
3688
3689         debug_printf_parse("done_word entered: '%s' %p\n", word->data, command);
3690         if (word->length == 0 && !word->has_quoted_part) {
3691                 debug_printf_parse("done_word return 0: true null, ignored\n");
3692                 return 0;
3693         }
3694
3695         if (ctx->pending_redirect) {
3696                 /* We do not glob in e.g. >*.tmp case. bash seems to glob here
3697                  * only if run as "bash", not "sh" */
3698                 /* http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
3699                  * "2.7 Redirection
3700                  * ...the word that follows the redirection operator
3701                  * shall be subjected to tilde expansion, parameter expansion,
3702                  * command substitution, arithmetic expansion, and quote
3703                  * removal. Pathname expansion shall not be performed
3704                  * on the word by a non-interactive shell; an interactive
3705                  * shell may perform it, but shall do so only when
3706                  * the expansion would result in one word."
3707                  */
3708                 ctx->pending_redirect->rd_filename = xstrdup(word->data);
3709                 /* Cater for >\file case:
3710                  * >\a creates file a; >\\a, >"\a", >"\\a" create file \a
3711                  * Same with heredocs:
3712                  * for <<\H delim is H; <<\\H, <<"\H", <<"\\H" - \H
3713                  */
3714                 if (ctx->pending_redirect->rd_type == REDIRECT_HEREDOC) {
3715                         unbackslash(ctx->pending_redirect->rd_filename);
3716                         /* Is it <<"HEREDOC"? */
3717                         if (word->has_quoted_part) {
3718                                 ctx->pending_redirect->rd_dup |= HEREDOC_QUOTED;
3719                         }
3720                 }
3721                 debug_printf_parse("word stored in rd_filename: '%s'\n", word->data);
3722                 ctx->pending_redirect = NULL;
3723         } else {
3724 #if HAS_KEYWORDS
3725 # if ENABLE_HUSH_CASE
3726                 if (ctx->ctx_dsemicolon
3727                  && strcmp(word->data, "esac") != 0 /* not "... pattern) cmd;; esac" */
3728                 ) {
3729                         /* already done when ctx_dsemicolon was set to 1: */
3730                         /* ctx->ctx_res_w = RES_MATCH; */
3731                         ctx->ctx_dsemicolon = 0;
3732                 } else
3733 # endif
3734                 if (!command->argv /* if it's the first word... */
3735 # if ENABLE_HUSH_LOOPS
3736                  && ctx->ctx_res_w != RES_FOR /* ...not after FOR or IN */
3737                  && ctx->ctx_res_w != RES_IN
3738 # endif
3739 # if ENABLE_HUSH_CASE
3740                  && ctx->ctx_res_w != RES_CASE
3741 # endif
3742                 ) {
3743                         int reserved = reserved_word(word, ctx);
3744                         debug_printf_parse("checking for reserved-ness: %d\n", reserved);
3745                         if (reserved) {
3746                                 o_reset_to_empty_unquoted(word);
3747                                 debug_printf_parse("done_word return %d\n",
3748                                                 (ctx->ctx_res_w == RES_SNTX));
3749                                 return (ctx->ctx_res_w == RES_SNTX);
3750                         }
3751 # if BASH_TEST2
3752                         if (strcmp(word->data, "[[") == 0) {
3753                                 command->cmd_type = CMD_SINGLEWORD_NOGLOB;
3754                         }
3755                         /* fall through */
3756 # endif
3757                 }
3758 #endif
3759                 if (command->group) {
3760                         /* "{ echo foo; } echo bar" - bad */
3761                         syntax_error_at(word->data);
3762                         debug_printf_parse("done_word return 1: syntax error, "
3763                                         "groups and arglists don't mix\n");
3764                         return 1;
3765                 }
3766
3767                 /* If this word wasn't an assignment, next ones definitely
3768                  * can't be assignments. Even if they look like ones. */
3769                 if (word->o_assignment != DEFINITELY_ASSIGNMENT
3770                  && word->o_assignment != WORD_IS_KEYWORD
3771                 ) {
3772                         word->o_assignment = NOT_ASSIGNMENT;
3773                 } else {
3774                         if (word->o_assignment == DEFINITELY_ASSIGNMENT) {
3775                                 command->assignment_cnt++;
3776                                 debug_printf_parse("++assignment_cnt=%d\n", command->assignment_cnt);
3777                         }
3778                         debug_printf_parse("word->o_assignment was:'%s'\n", assignment_flag[word->o_assignment]);
3779                         word->o_assignment = MAYBE_ASSIGNMENT;
3780                 }
3781                 debug_printf_parse("word->o_assignment='%s'\n", assignment_flag[word->o_assignment]);
3782
3783                 if (word->has_quoted_part
3784                  /* optimization: and if it's ("" or '') or ($v... or `cmd`...): */
3785                  && (word->data[0] == '\0' || word->data[0] == SPECIAL_VAR_SYMBOL)
3786                  /* (otherwise it's known to be not empty and is already safe) */
3787                 ) {
3788                         /* exclude "$@" - it can expand to no word despite "" */
3789                         char *p = word->data;
3790                         while (p[0] == SPECIAL_VAR_SYMBOL
3791                             && (p[1] & 0x7f) == '@'
3792                             && p[2] == SPECIAL_VAR_SYMBOL
3793                         ) {
3794                                 p += 3;
3795                         }
3796                 }
3797                 command->argv = add_string_to_strings(command->argv, xstrdup(word->data));
3798                 debug_print_strings("word appended to argv", command->argv);
3799         }
3800
3801 #if ENABLE_HUSH_LOOPS
3802         if (ctx->ctx_res_w == RES_FOR) {
3803                 if (word->has_quoted_part
3804                  || !is_well_formed_var_name(command->argv[0], '\0')
3805                 ) {
3806                         /* bash says just "not a valid identifier" */
3807                         syntax_error("not a valid identifier in for");
3808                         return 1;
3809                 }
3810                 /* Force FOR to have just one word (variable name) */
3811                 /* NB: basically, this makes hush see "for v in ..."
3812                  * syntax as if it is "for v; in ...". FOR and IN become
3813                  * two pipe structs in parse tree. */
3814                 done_pipe(ctx, PIPE_SEQ);
3815         }
3816 #endif
3817 #if ENABLE_HUSH_CASE
3818         /* Force CASE to have just one word */
3819         if (ctx->ctx_res_w == RES_CASE) {
3820                 done_pipe(ctx, PIPE_SEQ);
3821         }
3822 #endif
3823
3824         o_reset_to_empty_unquoted(word);
3825
3826         debug_printf_parse("done_word return 0\n");
3827         return 0;
3828 }
3829
3830
3831 /* Peek ahead in the input to find out if we have a "&n" construct,
3832  * as in "2>&1", that represents duplicating a file descriptor.
3833  * Return:
3834  * REDIRFD_CLOSE if >&- "close fd" construct is seen,
3835  * REDIRFD_SYNTAX_ERR if syntax error,
3836  * REDIRFD_TO_FILE if no & was seen,
3837  * or the number found.
3838  */
3839 #if BB_MMU
3840 #define parse_redir_right_fd(as_string, input) \
3841         parse_redir_right_fd(input)
3842 #endif
3843 static int parse_redir_right_fd(o_string *as_string, struct in_str *input)
3844 {
3845         int ch, d, ok;
3846
3847         ch = i_peek(input);
3848         if (ch != '&')
3849                 return REDIRFD_TO_FILE;
3850
3851         ch = i_getch(input);  /* get the & */
3852         nommu_addchr(as_string, ch);
3853         ch = i_peek(input);
3854         if (ch == '-') {
3855                 ch = i_getch(input);
3856                 nommu_addchr(as_string, ch);
3857                 return REDIRFD_CLOSE;
3858         }
3859         d = 0;
3860         ok = 0;
3861         while (ch != EOF && isdigit(ch)) {
3862                 d = d*10 + (ch-'0');
3863                 ok = 1;
3864                 ch = i_getch(input);
3865                 nommu_addchr(as_string, ch);
3866                 ch = i_peek(input);
3867         }
3868         if (ok) return d;
3869
3870 //TODO: this is the place to catch ">&file" bashism (redirect both fd 1 and 2)
3871
3872         bb_error_msg("ambiguous redirect");
3873         return REDIRFD_SYNTAX_ERR;
3874 }
3875
3876 /* Return code is 0 normal, 1 if a syntax error is detected
3877  */
3878 static int parse_redirect(struct parse_context *ctx,
3879                 int fd,
3880                 redir_type style,
3881                 struct in_str *input)
3882 {
3883         struct command *command = ctx->command;
3884         struct redir_struct *redir;
3885         struct redir_struct **redirp;
3886         int dup_num;
3887
3888         dup_num = REDIRFD_TO_FILE;
3889         if (style != REDIRECT_HEREDOC) {
3890                 /* Check for a '>&1' type redirect */
3891                 dup_num = parse_redir_right_fd(&ctx->as_string, input);
3892                 if (dup_num == REDIRFD_SYNTAX_ERR)
3893                         return 1;
3894         } else {
3895                 int ch = i_peek(input);
3896                 dup_num = (ch == '-'); /* HEREDOC_SKIPTABS bit is 1 */
3897                 if (dup_num) { /* <<-... */
3898                         ch = i_getch(input);
3899                         nommu_addchr(&ctx->as_string, ch);
3900                         ch = i_peek(input);
3901                 }
3902         }
3903
3904         if (style == REDIRECT_OVERWRITE && dup_num == REDIRFD_TO_FILE) {
3905                 int ch = i_peek(input);
3906                 if (ch == '|') {
3907                         /* >|FILE redirect ("clobbering" >).
3908                          * Since we do not support "set -o noclobber" yet,
3909                          * >| and > are the same for now. Just eat |.
3910                          */
3911                         ch = i_getch(input);
3912                         nommu_addchr(&ctx->as_string, ch);
3913                 }
3914         }
3915
3916         /* Create a new redir_struct and append it to the linked list */
3917         redirp = &command->redirects;
3918         while ((redir = *redirp) != NULL) {
3919                 redirp = &(redir->next);
3920         }
3921         *redirp = redir = xzalloc(sizeof(*redir));
3922         /* redir->next = NULL; */
3923         /* redir->rd_filename = NULL; */
3924         redir->rd_type = style;
3925         redir->rd_fd = (fd == -1) ? redir_table[style].default_fd : fd;
3926
3927         debug_printf_parse("redirect type %d %s\n", redir->rd_fd,
3928                                 redir_table[style].descrip);
3929
3930         redir->rd_dup = dup_num;
3931         if (style != REDIRECT_HEREDOC && dup_num != REDIRFD_TO_FILE) {
3932                 /* Erik had a check here that the file descriptor in question
3933                  * is legit; I postpone that to "run time"
3934                  * A "-" representation of "close me" shows up as a -3 here */
3935                 debug_printf_parse("duplicating redirect '%d>&%d'\n",
3936                                 redir->rd_fd, redir->rd_dup);
3937         } else {
3938 #if 0           /* Instead we emit error message at run time */
3939                 if (ctx->pending_redirect) {
3940                         /* For example, "cmd > <file" */
3941                         die_if_script("syntax error: %s", "invalid redirect");
3942                 }
3943 #endif
3944                 /* Set ctx->pending_redirect, so we know what to do at the
3945                  * end of the next parsed word. */
3946                 ctx->pending_redirect = redir;
3947         }
3948         return 0;
3949 }
3950
3951 /* If a redirect is immediately preceded by a number, that number is
3952  * supposed to tell which file descriptor to redirect.  This routine
3953  * looks for such preceding numbers.  In an ideal world this routine
3954  * needs to handle all the following classes of redirects...
3955  *     echo 2>foo     # redirects fd  2 to file "foo", nothing passed to echo
3956  *     echo 49>foo    # redirects fd 49 to file "foo", nothing passed to echo
3957  *     echo -2>foo    # redirects fd  1 to file "foo",    "-2" passed to echo
3958  *     echo 49x>foo   # redirects fd  1 to file "foo",   "49x" passed to echo
3959  *
3960  * http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
3961  * "2.7 Redirection
3962  * ... If n is quoted, the number shall not be recognized as part of
3963  * the redirection expression. For example:
3964  * echo \2>a
3965  * writes the character 2 into file a"
3966  * We are getting it right by setting ->has_quoted_part on any \<char>
3967  *
3968  * A -1 return means no valid number was found,
3969  * the caller should use the appropriate default for this redirection.
3970  */
3971 static int redirect_opt_num(o_string *o)
3972 {
3973         int num;
3974
3975         if (o->data == NULL)
3976                 return -1;
3977         num = bb_strtou(o->data, NULL, 10);
3978         if (errno || num < 0)
3979                 return -1;
3980         o_reset_to_empty_unquoted(o);
3981         return num;
3982 }
3983
3984 #if BB_MMU
3985 #define fetch_till_str(as_string, input, word, skip_tabs) \
3986         fetch_till_str(input, word, skip_tabs)
3987 #endif
3988 static char *fetch_till_str(o_string *as_string,
3989                 struct in_str *input,
3990                 const char *word,
3991                 int heredoc_flags)
3992 {
3993         o_string heredoc = NULL_O_STRING;
3994         unsigned past_EOL;
3995         int prev = 0; /* not \ */
3996         int ch;
3997
3998         goto jump_in;
3999
4000         while (1) {
4001                 ch = i_getch(input);
4002                 if (ch != EOF)
4003                         nommu_addchr(as_string, ch);
4004                 if (ch == '\n' || ch == EOF) {
4005  check_heredoc_end:
4006                         if ((heredoc_flags & HEREDOC_QUOTED) || prev != '\\') {
4007                                 if (strcmp(heredoc.data + past_EOL, word) == 0) {
4008                                         heredoc.data[past_EOL] = '\0';
4009                                         debug_printf_parse("parsed heredoc '%s'\n", heredoc.data);
4010                                         return heredoc.data;
4011                                 }
4012                                 if (ch == '\n') {
4013                                         /* This is a new line.
4014                                          * Remember position and backslash-escaping status.
4015                                          */
4016                                         o_addchr(&heredoc, ch);
4017                                         prev = ch;
4018  jump_in:
4019                                         past_EOL = heredoc.length;
4020                                         /* Get 1st char of next line, possibly skipping leading tabs */
4021                                         do {
4022                                                 ch = i_getch(input);
4023                                                 if (ch != EOF)
4024                                                         nommu_addchr(as_string, ch);
4025                                         } while ((heredoc_flags & HEREDOC_SKIPTABS) && ch == '\t');
4026                                         /* If this immediately ended the line,
4027                                          * go back to end-of-line checks.
4028                                          */
4029                                         if (ch == '\n')
4030                                                 goto check_heredoc_end;
4031                                 }
4032                         }
4033                 }
4034                 if (ch == EOF) {
4035                         o_free_unsafe(&heredoc);
4036                         return NULL;
4037                 }
4038                 o_addchr(&heredoc, ch);
4039                 nommu_addchr(as_string, ch);
4040                 if (prev == '\\' && ch == '\\')
4041                         /* Correctly handle foo\\<eol> (not a line cont.) */
4042                         prev = 0; /* not \ */
4043                 else
4044                         prev = ch;
4045         }
4046 }
4047
4048 /* Look at entire parse tree for not-yet-loaded REDIRECT_HEREDOCs
4049  * and load them all. There should be exactly heredoc_cnt of them.
4050  */
4051 static int fetch_heredocs(int heredoc_cnt, struct parse_context *ctx, struct in_str *input)
4052 {
4053         struct pipe *pi = ctx->list_head;
4054
4055         while (pi && heredoc_cnt) {
4056                 int i;
4057                 struct command *cmd = pi->cmds;
4058
4059                 debug_printf_parse("fetch_heredocs: num_cmds:%d cmd argv0:'%s'\n",
4060                                 pi->num_cmds,
4061                                 cmd->argv ? cmd->argv[0] : "NONE");
4062                 for (i = 0; i < pi->num_cmds; i++) {
4063                         struct redir_struct *redir = cmd->redirects;
4064
4065                         debug_printf_parse("fetch_heredocs: %d cmd argv0:'%s'\n",
4066                                         i, cmd->argv ? cmd->argv[0] : "NONE");
4067                         while (redir) {
4068                                 if (redir->rd_type == REDIRECT_HEREDOC) {
4069                                         char *p;
4070
4071                                         redir->rd_type = REDIRECT_HEREDOC2;
4072                                         /* redir->rd_dup is (ab)used to indicate <<- */
4073                                         p = fetch_till_str(&ctx->as_string, input,
4074                                                         redir->rd_filename, redir->rd_dup);
4075                                         if (!p) {
4076                                                 syntax_error("unexpected EOF in here document");
4077                                                 return 1;
4078                                         }
4079                                         free(redir->rd_filename);
4080                                         redir->rd_filename = p;
4081                                         heredoc_cnt--;
4082                                 }
4083                                 redir = redir->next;
4084                         }
4085                         cmd++;
4086                 }
4087                 pi = pi->next;
4088         }
4089 #if 0
4090         /* Should be 0. If it isn't, it's a parse error */
4091         if (heredoc_cnt)
4092                 bb_error_msg_and_die("heredoc BUG 2");
4093 #endif
4094         return 0;
4095 }
4096
4097
4098 static int run_list(struct pipe *pi);
4099 #if BB_MMU
4100 #define parse_stream(pstring, input, end_trigger) \
4101         parse_stream(input, end_trigger)
4102 #endif
4103 static struct pipe *parse_stream(char **pstring,
4104                 struct in_str *input,
4105                 int end_trigger);
4106
4107
4108 #if !ENABLE_HUSH_FUNCTIONS
4109 #define parse_group(dest, ctx, input, ch) \
4110         parse_group(ctx, input, ch)
4111 #endif
4112 static int parse_group(o_string *dest, struct parse_context *ctx,
4113         struct in_str *input, int ch)
4114 {
4115         /* dest contains characters seen prior to ( or {.
4116          * Typically it's empty, but for function defs,
4117          * it contains function name (without '()'). */
4118         struct pipe *pipe_list;
4119         int endch;
4120         struct command *command = ctx->command;
4121
4122         debug_printf_parse("parse_group entered\n");
4123 #if ENABLE_HUSH_FUNCTIONS
4124         if (ch == '(' && !dest->has_quoted_part) {
4125                 if (dest->length)
4126                         if (done_word(dest, ctx))
4127                                 return 1;
4128                 if (!command->argv)
4129                         goto skip; /* (... */
4130                 if (command->argv[1]) { /* word word ... (... */
4131                         syntax_error_unexpected_ch('(');
4132                         return 1;
4133                 }
4134                 /* it is "word(..." or "word (..." */
4135                 do
4136                         ch = i_getch(input);
4137                 while (ch == ' ' || ch == '\t');
4138                 if (ch != ')') {
4139                         syntax_error_unexpected_ch(ch);
4140                         return 1;
4141                 }
4142                 nommu_addchr(&ctx->as_string, ch);
4143                 do
4144                         ch = i_getch(input);
4145                 while (ch == ' ' || ch == '\t' || ch == '\n');
4146                 if (ch != '{') {
4147                         syntax_error_unexpected_ch(ch);
4148                         return 1;
4149                 }
4150                 nommu_addchr(&ctx->as_string, ch);
4151                 command->cmd_type = CMD_FUNCDEF;
4152                 goto skip;
4153         }
4154 #endif
4155
4156 #if 0 /* Prevented by caller */
4157         if (command->argv /* word [word]{... */
4158          || dest->length /* word{... */
4159          || dest->has_quoted_part /* ""{... */
4160         ) {
4161                 syntax_error(NULL);
4162                 debug_printf_parse("parse_group return 1: "
4163                         "syntax error, groups and arglists don't mix\n");
4164                 return 1;
4165         }
4166 #endif
4167
4168 #if ENABLE_HUSH_FUNCTIONS
4169  skip:
4170 #endif
4171         endch = '}';
4172         if (ch == '(') {
4173                 endch = ')';
4174                 command->cmd_type = CMD_SUBSHELL;
4175         } else {
4176                 /* bash does not allow "{echo...", requires whitespace */
4177                 ch = i_peek(input);
4178                 if (ch != ' ' && ch != '\t' && ch != '\n'
4179                  && ch != '('   /* but "{(..." is allowed (without whitespace) */
4180                 ) {
4181                         syntax_error_unexpected_ch(ch);
4182                         return 1;
4183                 }
4184                 if (ch != '(') {
4185                         ch = i_getch(input);
4186                         nommu_addchr(&ctx->as_string, ch);
4187                 }
4188         }
4189
4190         {
4191 #if BB_MMU
4192 # define as_string NULL
4193 #else
4194                 char *as_string = NULL;
4195 #endif
4196                 pipe_list = parse_stream(&as_string, input, endch);
4197 #if !BB_MMU
4198                 if (as_string)
4199                         o_addstr(&ctx->as_string, as_string);
4200 #endif
4201                 /* empty ()/{} or parse error? */
4202                 if (!pipe_list || pipe_list == ERR_PTR) {
4203                         /* parse_stream already emitted error msg */
4204                         if (!BB_MMU)
4205                                 free(as_string);
4206                         debug_printf_parse("parse_group return 1: "
4207                                 "parse_stream returned %p\n", pipe_list);
4208                         return 1;
4209                 }
4210                 command->group = pipe_list;
4211 #if !BB_MMU
4212                 as_string[strlen(as_string) - 1] = '\0'; /* plink ')' or '}' */
4213                 command->group_as_string = as_string;
4214                 debug_printf_parse("end of group, remembering as:'%s'\n",
4215                                 command->group_as_string);
4216 #endif
4217 #undef as_string
4218         }
4219         debug_printf_parse("parse_group return 0\n");
4220         return 0;
4221         /* command remains "open", available for possible redirects */
4222 }
4223
4224 static int i_getch_and_eat_bkslash_nl(struct in_str *input)
4225 {
4226         for (;;) {
4227                 int ch, ch2;
4228
4229                 ch = i_getch(input);
4230                 if (ch != '\\')
4231                         return ch;
4232                 ch2 = i_peek(input);
4233                 if (ch2 != '\n')
4234                         return ch;
4235                 /* backslash+newline, skip it */
4236                 i_getch(input);
4237         }
4238 }
4239
4240 static int i_peek_and_eat_bkslash_nl(struct in_str *input)
4241 {
4242         for (;;) {
4243                 int ch, ch2;
4244
4245                 ch = i_peek(input);
4246                 if (ch != '\\')
4247                         return ch;
4248                 ch2 = i_peek2(input);
4249                 if (ch2 != '\n')
4250                         return ch;
4251                 /* backslash+newline, skip it */
4252                 i_getch(input);
4253                 i_getch(input);
4254         }
4255 }
4256
4257 #if ENABLE_HUSH_TICK || ENABLE_FEATURE_SH_MATH || ENABLE_HUSH_DOLLAR_OPS
4258 /* Subroutines for copying $(...) and `...` things */
4259 static int add_till_backquote(o_string *dest, struct in_str *input, int in_dquote);
4260 /* '...' */
4261 static int add_till_single_quote(o_string *dest, struct in_str *input)
4262 {
4263         while (1) {
4264                 int ch = i_getch(input);
4265                 if (ch == EOF) {
4266                         syntax_error_unterm_ch('\'');
4267                         return 0;
4268                 }
4269                 if (ch == '\'')
4270                         return 1;
4271                 o_addchr(dest, ch);
4272         }
4273 }
4274 /* "...\"...`..`...." - do we need to handle "...$(..)..." too? */
4275 static int add_till_double_quote(o_string *dest, struct in_str *input)
4276 {
4277         while (1) {
4278                 int ch = i_getch(input);
4279                 if (ch == EOF) {
4280                         syntax_error_unterm_ch('"');
4281                         return 0;
4282                 }
4283                 if (ch == '"')
4284                         return 1;
4285                 if (ch == '\\') {  /* \x. Copy both chars. */
4286                         o_addchr(dest, ch);
4287                         ch = i_getch(input);
4288                 }
4289                 o_addchr(dest, ch);
4290                 if (ch == '`') {
4291                         if (!add_till_backquote(dest, input, /*in_dquote:*/ 1))
4292                                 return 0;
4293                         o_addchr(dest, ch);
4294                         continue;
4295                 }
4296                 //if (ch == '$') ...
4297         }
4298 }
4299 /* Process `cmd` - copy contents until "`" is seen. Complicated by
4300  * \` quoting.
4301  * "Within the backquoted style of command substitution, backslash
4302  * shall retain its literal meaning, except when followed by: '$', '`', or '\'.
4303  * The search for the matching backquote shall be satisfied by the first
4304  * backquote found without a preceding backslash; during this search,
4305  * if a non-escaped backquote is encountered within a shell comment,
4306  * a here-document, an embedded command substitution of the $(command)
4307  * form, or a quoted string, undefined results occur. A single-quoted
4308  * or double-quoted string that begins, but does not end, within the
4309  * "`...`" sequence produces undefined results."
4310  * Example                               Output
4311  * echo `echo '\'TEST\`echo ZZ\`BEST`    \TESTZZBEST
4312  */
4313 static int add_till_backquote(o_string *dest, struct in_str *input, int in_dquote)
4314 {
4315         while (1) {
4316                 int ch = i_getch(input);
4317                 if (ch == '`')
4318                         return 1;
4319                 if (ch == '\\') {
4320                         /* \x. Copy both unless it is \`, \$, \\ and maybe \" */
4321                         ch = i_getch(input);
4322                         if (ch != '`'
4323                          && ch != '$'
4324                          && ch != '\\'
4325                          && (!in_dquote || ch != '"')
4326                         ) {
4327                                 o_addchr(dest, '\\');
4328                         }
4329                 }
4330                 if (ch == EOF) {
4331                         syntax_error_unterm_ch('`');
4332                         return 0;
4333                 }
4334                 o_addchr(dest, ch);
4335         }
4336 }
4337 /* Process $(cmd) - copy contents until ")" is seen. Complicated by
4338  * quoting and nested ()s.
4339  * "With the $(command) style of command substitution, all characters
4340  * following the open parenthesis to the matching closing parenthesis
4341  * constitute the command. Any valid shell script can be used for command,
4342  * except a script consisting solely of redirections which produces
4343  * unspecified results."
4344  * Example                              Output
4345  * echo $(echo '(TEST)' BEST)           (TEST) BEST
4346  * echo $(echo 'TEST)' BEST)            TEST) BEST
4347  * echo $(echo \(\(TEST\) BEST)         ((TEST) BEST
4348  *
4349  * Also adapted to eat ${var%...} and $((...)) constructs, since ... part
4350  * can contain arbitrary constructs, just like $(cmd).
4351  * In bash compat mode, it needs to also be able to stop on ':' or '/'
4352  * for ${var:N[:M]} and ${var/P[/R]} parsing.
4353  */
4354 #define DOUBLE_CLOSE_CHAR_FLAG 0x80
4355 static int add_till_closing_bracket(o_string *dest, struct in_str *input, unsigned end_ch)
4356 {
4357         int ch;
4358         char dbl = end_ch & DOUBLE_CLOSE_CHAR_FLAG;
4359 # if BASH_SUBSTR || BASH_PATTERN_SUBST
4360         char end_char2 = end_ch >> 8;
4361 # endif
4362         end_ch &= (DOUBLE_CLOSE_CHAR_FLAG - 1);
4363
4364         while (1) {
4365                 ch = i_getch(input);
4366                 if (ch == EOF) {
4367                         syntax_error_unterm_ch(end_ch);
4368                         return 0;
4369                 }
4370                 if (ch == end_ch
4371 # if BASH_SUBSTR || BASH_PATTERN_SUBST
4372                         || ch == end_char2
4373 # endif
4374                 ) {
4375                         if (!dbl)
4376                                 break;
4377                         /* we look for closing )) of $((EXPR)) */
4378                         if (i_peek_and_eat_bkslash_nl(input) == end_ch) {
4379                                 i_getch(input); /* eat second ')' */
4380                                 break;
4381                         }
4382                 }
4383                 o_addchr(dest, ch);
4384                 if (ch == '(' || ch == '{') {
4385                         ch = (ch == '(' ? ')' : '}');
4386                         if (!add_till_closing_bracket(dest, input, ch))
4387                                 return 0;
4388                         o_addchr(dest, ch);
4389                         continue;
4390                 }
4391                 if (ch == '\'') {
4392                         if (!add_till_single_quote(dest, input))
4393                                 return 0;
4394                         o_addchr(dest, ch);
4395                         continue;
4396                 }
4397                 if (ch == '"') {
4398                         if (!add_till_double_quote(dest, input))
4399                                 return 0;
4400                         o_addchr(dest, ch);
4401                         continue;
4402                 }
4403                 if (ch == '`') {
4404                         if (!add_till_backquote(dest, input, /*in_dquote:*/ 0))
4405                                 return 0;
4406                         o_addchr(dest, ch);
4407                         continue;
4408                 }
4409                 if (ch == '\\') {
4410                         /* \x. Copy verbatim. Important for  \(, \) */
4411                         ch = i_getch(input);
4412                         if (ch == EOF) {
4413                                 syntax_error_unterm_ch(')');
4414                                 return 0;
4415                         }
4416 #if 0
4417                         if (ch == '\n') {
4418                                 /* "backslash+newline", ignore both */
4419                                 o_delchr(dest); /* undo insertion of '\' */
4420                                 continue;
4421                         }
4422 #endif
4423                         o_addchr(dest, ch);
4424                         continue;
4425                 }
4426         }
4427         return ch;
4428 }
4429 #endif /* ENABLE_HUSH_TICK || ENABLE_FEATURE_SH_MATH || ENABLE_HUSH_DOLLAR_OPS */
4430
4431 /* Return code: 0 for OK, 1 for syntax error */
4432 #if BB_MMU
4433 #define parse_dollar(as_string, dest, input, quote_mask) \
4434         parse_dollar(dest, input, quote_mask)
4435 #define as_string NULL
4436 #endif
4437 static int parse_dollar(o_string *as_string,
4438                 o_string *dest,
4439                 struct in_str *input, unsigned char quote_mask)
4440 {
4441         int ch = i_peek_and_eat_bkslash_nl(input);  /* first character after the $ */
4442
4443         debug_printf_parse("parse_dollar entered: ch='%c'\n", ch);
4444         if (isalpha(ch)) {
4445                 ch = i_getch(input);
4446                 nommu_addchr(as_string, ch);
4447  make_var:
4448                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4449                 while (1) {
4450                         debug_printf_parse(": '%c'\n", ch);
4451                         o_addchr(dest, ch | quote_mask);
4452                         quote_mask = 0;
4453                         ch = i_peek_and_eat_bkslash_nl(input);
4454                         if (!isalnum(ch) && ch != '_') {
4455                                 /* End of variable name reached */
4456                                 break;
4457                         }
4458                         ch = i_getch(input);
4459                         nommu_addchr(as_string, ch);
4460                 }
4461                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4462         } else if (isdigit(ch)) {
4463  make_one_char_var:
4464                 ch = i_getch(input);
4465                 nommu_addchr(as_string, ch);
4466                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4467                 debug_printf_parse(": '%c'\n", ch);
4468                 o_addchr(dest, ch | quote_mask);
4469                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4470         } else switch (ch) {
4471         case '$': /* pid */
4472         case '!': /* last bg pid */
4473         case '?': /* last exit code */
4474         case '#': /* number of args */
4475         case '*': /* args */
4476         case '@': /* args */
4477                 goto make_one_char_var;
4478         case '{': {
4479                 char len_single_ch;
4480
4481                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4482
4483                 ch = i_getch(input); /* eat '{' */
4484                 nommu_addchr(as_string, ch);
4485
4486                 ch = i_getch_and_eat_bkslash_nl(input); /* first char after '{' */
4487                 /* It should be ${?}, or ${#var},
4488                  * or even ${?+subst} - operator acting on a special variable,
4489                  * or the beginning of variable name.
4490                  */
4491                 if (ch == EOF
4492                  || (!strchr(_SPECIAL_VARS_STR, ch) && !isalnum(ch)) /* not one of those */
4493                 ) {
4494  bad_dollar_syntax:
4495                         syntax_error_unterm_str("${name}");
4496                         debug_printf_parse("parse_dollar return 0: unterminated ${name}\n");
4497                         return 0;
4498                 }
4499                 nommu_addchr(as_string, ch);
4500                 len_single_ch = ch;
4501                 ch |= quote_mask;
4502
4503                 /* It's possible to just call add_till_closing_bracket() at this point.
4504                  * However, this regresses some of our testsuite cases
4505                  * which check invalid constructs like ${%}.
4506                  * Oh well... let's check that the var name part is fine... */
4507
4508                 while (1) {
4509                         unsigned pos;
4510
4511                         o_addchr(dest, ch);
4512                         debug_printf_parse(": '%c'\n", ch);
4513
4514                         ch = i_getch(input);
4515                         nommu_addchr(as_string, ch);
4516                         if (ch == '}')
4517                                 break;
4518
4519                         if (!isalnum(ch) && ch != '_') {
4520                                 unsigned end_ch;
4521                                 unsigned char last_ch;
4522                                 /* handle parameter expansions
4523                                  * http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02
4524                                  */
4525                                 if (!strchr(VAR_SUBST_OPS, ch)) { /* ${var<bad_char>... */
4526                                         if (len_single_ch != '#'
4527                                         /*|| !strchr(SPECIAL_VARS_STR, ch) - disallow errors like ${#+} ? */
4528                                          || i_peek(input) != '}'
4529                                         ) {
4530                                                 goto bad_dollar_syntax;
4531                                         }
4532                                         /* else: it's "length of C" ${#C} op,
4533                                          * where C is a single char
4534                                          * special var name, e.g. ${#!}.
4535                                          */
4536                                 }
4537                                 /* Eat everything until closing '}' (or ':') */
4538                                 end_ch = '}';
4539                                 if (BASH_SUBSTR
4540                                  && ch == ':'
4541                                  && !strchr(MINUS_PLUS_EQUAL_QUESTION, i_peek(input))
4542                                 ) {
4543                                         /* It's ${var:N[:M]} thing */
4544                                         end_ch = '}' * 0x100 + ':';
4545                                 }
4546                                 if (BASH_PATTERN_SUBST
4547                                  && ch == '/'
4548                                 ) {
4549                                         /* It's ${var/[/]pattern[/repl]} thing */
4550                                         if (i_peek(input) == '/') { /* ${var//pattern[/repl]}? */
4551                                                 i_getch(input);
4552                                                 nommu_addchr(as_string, '/');
4553                                                 ch = '\\';
4554                                         }
4555                                         end_ch = '}' * 0x100 + '/';
4556                                 }
4557                                 o_addchr(dest, ch);
4558  again:
4559                                 if (!BB_MMU)
4560                                         pos = dest->length;
4561 #if ENABLE_HUSH_DOLLAR_OPS
4562                                 last_ch = add_till_closing_bracket(dest, input, end_ch);
4563                                 if (last_ch == 0) /* error? */
4564                                         return 0;
4565 #else
4566 #error Simple code to only allow ${var} is not implemented
4567 #endif
4568                                 if (as_string) {
4569                                         o_addstr(as_string, dest->data + pos);
4570                                         o_addchr(as_string, last_ch);
4571                                 }
4572
4573                                 if ((BASH_SUBSTR || BASH_PATTERN_SUBST)
4574                                          && (end_ch & 0xff00)
4575                                 ) {
4576                                         /* close the first block: */
4577                                         o_addchr(dest, SPECIAL_VAR_SYMBOL);
4578                                         /* while parsing N from ${var:N[:M]}
4579                                          * or pattern from ${var/[/]pattern[/repl]} */
4580                                         if ((end_ch & 0xff) == last_ch) {
4581                                                 /* got ':' or '/'- parse the rest */
4582                                                 end_ch = '}';
4583                                                 goto again;
4584                                         }
4585                                         /* got '}' */
4586                                         if (BASH_SUBSTR && end_ch == '}' * 0x100 + ':') {
4587                                                 /* it's ${var:N} - emulate :999999999 */
4588                                                 o_addstr(dest, "999999999");
4589                                         } /* else: it's ${var/[/]pattern} */
4590                                 }
4591                                 break;
4592                         }
4593                         len_single_ch = 0; /* it can't be ${#C} op */
4594                 }
4595                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4596                 break;
4597         }
4598 #if ENABLE_FEATURE_SH_MATH || ENABLE_HUSH_TICK
4599         case '(': {
4600                 unsigned pos;
4601
4602                 ch = i_getch(input);
4603                 nommu_addchr(as_string, ch);
4604 # if ENABLE_FEATURE_SH_MATH
4605                 if (i_peek_and_eat_bkslash_nl(input) == '(') {
4606                         ch = i_getch(input);
4607                         nommu_addchr(as_string, ch);
4608                         o_addchr(dest, SPECIAL_VAR_SYMBOL);
4609                         o_addchr(dest, /*quote_mask |*/ '+');
4610                         if (!BB_MMU)
4611                                 pos = dest->length;
4612                         if (!add_till_closing_bracket(dest, input, ')' | DOUBLE_CLOSE_CHAR_FLAG))
4613                                 return 0; /* error */
4614                         if (as_string) {
4615                                 o_addstr(as_string, dest->data + pos);
4616                                 o_addchr(as_string, ')');
4617                                 o_addchr(as_string, ')');
4618                         }
4619                         o_addchr(dest, SPECIAL_VAR_SYMBOL);
4620                         break;
4621                 }
4622 # endif
4623 # if ENABLE_HUSH_TICK
4624                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4625                 o_addchr(dest, quote_mask | '`');
4626                 if (!BB_MMU)
4627                         pos = dest->length;
4628                 if (!add_till_closing_bracket(dest, input, ')'))
4629                         return 0; /* error */
4630                 if (as_string) {
4631                         o_addstr(as_string, dest->data + pos);
4632                         o_addchr(as_string, ')');
4633                 }
4634                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4635 # endif
4636                 break;
4637         }
4638 #endif
4639         case '_':
4640                 ch = i_getch(input);
4641                 nommu_addchr(as_string, ch);
4642                 ch = i_peek_and_eat_bkslash_nl(input);
4643                 if (isalnum(ch)) { /* it's $_name or $_123 */
4644                         ch = '_';
4645                         goto make_var;
4646                 }
4647                 /* else: it's $_ */
4648         /* TODO: $_ and $-: */
4649         /* $_ Shell or shell script name; or last argument of last command
4650          * (if last command wasn't a pipe; if it was, bash sets $_ to "");
4651          * but in command's env, set to full pathname used to invoke it */
4652         /* $- Option flags set by set builtin or shell options (-i etc) */
4653         default:
4654                 o_addQchr(dest, '$');
4655         }
4656         debug_printf_parse("parse_dollar return 1 (ok)\n");
4657         return 1;
4658 #undef as_string
4659 }
4660
4661 #if BB_MMU
4662 # if BASH_PATTERN_SUBST
4663 #define encode_string(as_string, dest, input, dquote_end, process_bkslash) \
4664         encode_string(dest, input, dquote_end, process_bkslash)
4665 # else
4666 /* only ${var/pattern/repl} (its pattern part) needs additional mode */
4667 #define encode_string(as_string, dest, input, dquote_end, process_bkslash) \
4668         encode_string(dest, input, dquote_end)
4669 # endif
4670 #define as_string NULL
4671
4672 #else /* !MMU */
4673
4674 # if BASH_PATTERN_SUBST
4675 /* all parameters are needed, no macro tricks */
4676 # else
4677 #define encode_string(as_string, dest, input, dquote_end, process_bkslash) \
4678         encode_string(as_string, dest, input, dquote_end)
4679 # endif
4680 #endif
4681 static int encode_string(o_string *as_string,
4682                 o_string *dest,
4683                 struct in_str *input,
4684                 int dquote_end,
4685                 int process_bkslash)
4686 {
4687 #if !BASH_PATTERN_SUBST
4688         const int process_bkslash = 1;
4689 #endif
4690         int ch;
4691         int next;
4692
4693  again:
4694         ch = i_getch(input);
4695         if (ch != EOF)
4696                 nommu_addchr(as_string, ch);
4697         if (ch == dquote_end) { /* may be only '"' or EOF */
4698                 debug_printf_parse("encode_string return 1 (ok)\n");
4699                 return 1;
4700         }
4701         /* note: can't move it above ch == dquote_end check! */
4702         if (ch == EOF) {
4703                 syntax_error_unterm_ch('"');
4704                 return 0; /* error */
4705         }
4706         next = '\0';
4707         if (ch != '\n') {
4708                 next = i_peek(input);
4709         }
4710         debug_printf_parse("\" ch=%c (%d) escape=%d\n",
4711                         ch, ch, !!(dest->o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
4712         if (process_bkslash && ch == '\\') {
4713                 if (next == EOF) {
4714                         syntax_error("\\<eof>");
4715                         xfunc_die();
4716                 }
4717                 /* bash:
4718                  * "The backslash retains its special meaning [in "..."]
4719                  * only when followed by one of the following characters:
4720                  * $, `, ", \, or <newline>.  A double quote may be quoted
4721                  * within double quotes by preceding it with a backslash."
4722                  * NB: in (unquoted) heredoc, above does not apply to ",
4723                  * therefore we check for it by "next == dquote_end" cond.
4724                  */
4725                 if (next == dquote_end || strchr("$`\\\n", next)) {
4726                         ch = i_getch(input); /* eat next */
4727                         if (ch == '\n')
4728                                 goto again; /* skip \<newline> */
4729                 } /* else: ch remains == '\\', and we double it below: */
4730                 o_addqchr(dest, ch); /* \c if c is a glob char, else just c */
4731                 nommu_addchr(as_string, ch);
4732                 goto again;
4733         }
4734         if (ch == '$') {
4735                 if (!parse_dollar(as_string, dest, input, /*quote_mask:*/ 0x80)) {
4736                         debug_printf_parse("encode_string return 0: "
4737                                         "parse_dollar returned 0 (error)\n");
4738                         return 0;
4739                 }
4740                 goto again;
4741         }
4742 #if ENABLE_HUSH_TICK
4743         if (ch == '`') {
4744                 //unsigned pos = dest->length;
4745                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4746                 o_addchr(dest, 0x80 | '`');
4747                 if (!add_till_backquote(dest, input, /*in_dquote:*/ dquote_end == '"'))
4748                         return 0; /* error */
4749                 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4750                 //debug_printf_subst("SUBST RES3 '%s'\n", dest->data + pos);
4751                 goto again;
4752         }
4753 #endif
4754         o_addQchr(dest, ch);
4755         goto again;
4756 #undef as_string
4757 }
4758
4759 /*
4760  * Scan input until EOF or end_trigger char.
4761  * Return a list of pipes to execute, or NULL on EOF
4762  * or if end_trigger character is met.
4763  * On syntax error, exit if shell is not interactive,
4764  * reset parsing machinery and start parsing anew,
4765  * or return ERR_PTR.
4766  */
4767 static struct pipe *parse_stream(char **pstring,
4768                 struct in_str *input,
4769                 int end_trigger)
4770 {
4771         struct parse_context ctx;
4772         o_string dest = NULL_O_STRING;
4773         int heredoc_cnt;
4774
4775         /* Single-quote triggers a bypass of the main loop until its mate is
4776          * found.  When recursing, quote state is passed in via dest->o_expflags.
4777          */
4778         debug_printf_parse("parse_stream entered, end_trigger='%c'\n",
4779                         end_trigger ? end_trigger : 'X');
4780         debug_enter();
4781
4782         /* If very first arg is "" or '', dest.data may end up NULL.
4783          * Preventing this: */
4784         o_addchr(&dest, '\0');
4785         dest.length = 0;
4786
4787         /* We used to separate words on $IFS here. This was wrong.
4788          * $IFS is used only for word splitting when $var is expanded,
4789          * here we should use blank chars as separators, not $IFS
4790          */
4791
4792         if (MAYBE_ASSIGNMENT != 0)
4793                 dest.o_assignment = MAYBE_ASSIGNMENT;
4794         initialize_context(&ctx);
4795         heredoc_cnt = 0;
4796         while (1) {
4797                 const char *is_blank;
4798                 const char *is_special;
4799                 int ch;
4800                 int next;
4801                 int redir_fd;
4802                 redir_type redir_style;
4803
4804                 ch = i_getch(input);
4805                 debug_printf_parse(": ch=%c (%d) escape=%d\n",
4806                                 ch, ch, !!(dest.o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
4807                 if (ch == EOF) {
4808                         struct pipe *pi;
4809
4810                         if (heredoc_cnt) {
4811                                 syntax_error_unterm_str("here document");
4812                                 goto parse_error;
4813                         }
4814                         if (end_trigger == ')') {
4815                                 syntax_error_unterm_ch('(');
4816                                 goto parse_error;
4817                         }
4818                         if (end_trigger == '}') {
4819                                 syntax_error_unterm_ch('{');
4820                                 goto parse_error;
4821                         }
4822
4823                         if (done_word(&dest, &ctx)) {
4824                                 goto parse_error;
4825                         }
4826                         o_free(&dest);
4827                         done_pipe(&ctx, PIPE_SEQ);
4828                         pi = ctx.list_head;
4829                         /* If we got nothing... */
4830                         /* (this makes bare "&" cmd a no-op.
4831                          * bash says: "syntax error near unexpected token '&'") */
4832                         if (pi->num_cmds == 0
4833                         IF_HAS_KEYWORDS(&& pi->res_word == RES_NONE)
4834                         ) {
4835                                 free_pipe_list(pi);
4836                                 pi = NULL;
4837                         }
4838 #if !BB_MMU
4839                         debug_printf_parse("as_string1 '%s'\n", ctx.as_string.data);
4840                         if (pstring)
4841                                 *pstring = ctx.as_string.data;
4842                         else
4843                                 o_free_unsafe(&ctx.as_string);
4844 #endif
4845                         debug_leave();
4846                         debug_printf_parse("parse_stream return %p\n", pi);
4847                         return pi;
4848                 }
4849                 nommu_addchr(&ctx.as_string, ch);
4850
4851                 next = '\0';
4852                 if (ch != '\n')
4853                         next = i_peek(input);
4854
4855                 is_special = "{}<>;&|()#'" /* special outside of "str" */
4856                                 "\\$\"" IF_HUSH_TICK("`"); /* always special */
4857                 /* Are { and } special here? */
4858                 if (ctx.command->argv /* word [word]{... - non-special */
4859                  || dest.length       /* word{... - non-special */
4860                  || dest.has_quoted_part     /* ""{... - non-special */
4861                  || (next != ';'             /* }; - special */
4862                     && next != ')'           /* }) - special */
4863                     && next != '('           /* {( - special */
4864                     && next != '&'           /* }& and }&& ... - special */
4865                     && next != '|'           /* }|| ... - special */
4866                     && !strchr(defifs, next) /* {word - non-special */
4867                     )
4868                 ) {
4869                         /* They are not special, skip "{}" */
4870                         is_special += 2;
4871                 }
4872                 is_special = strchr(is_special, ch);
4873                 is_blank = strchr(defifs, ch);
4874
4875                 if (!is_special && !is_blank) { /* ordinary char */
4876  ordinary_char:
4877                         o_addQchr(&dest, ch);
4878                         if ((dest.o_assignment == MAYBE_ASSIGNMENT
4879                             || dest.o_assignment == WORD_IS_KEYWORD)
4880                          && ch == '='
4881                          && is_well_formed_var_name(dest.data, '=')
4882                         ) {
4883                                 dest.o_assignment = DEFINITELY_ASSIGNMENT;
4884                                 debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
4885                         }
4886                         continue;
4887                 }
4888
4889                 if (is_blank) {
4890                         if (done_word(&dest, &ctx)) {
4891                                 goto parse_error;
4892                         }
4893                         if (ch == '\n') {
4894                                 /* Is this a case when newline is simply ignored?
4895                                  * Some examples:
4896                                  * "cmd | <newline> cmd ..."
4897                                  * "case ... in <newline> word) ..."
4898                                  */
4899                                 if (IS_NULL_CMD(ctx.command)
4900                                  && dest.length == 0 && !dest.has_quoted_part
4901                                 ) {
4902                                         /* This newline can be ignored. But...
4903                                          * Without check #1, interactive shell
4904                                          * ignores even bare <newline>,
4905                                          * and shows the continuation prompt:
4906                                          * ps1_prompt$ <enter>
4907                                          * ps2> _   <=== wrong, should be ps1
4908                                          * Without check #2, "cmd & <newline>"
4909                                          * is similarly mistreated.
4910                                          * (BTW, this makes "cmd & cmd"
4911                                          * and "cmd && cmd" non-orthogonal.
4912                                          * Really, ask yourself, why
4913                                          * "cmd && <newline>" doesn't start
4914                                          * cmd but waits for more input?
4915                                          * The only reason is that it might be
4916                                          * a "cmd1 && <nl> cmd2 &" construct,
4917                                          * cmd1 may need to run in BG).
4918                                          */
4919                                         struct pipe *pi = ctx.list_head;
4920                                         if (pi->num_cmds != 0       /* check #1 */
4921                                          && pi->followup != PIPE_BG /* check #2 */
4922                                         ) {
4923                                                 continue;
4924                                         }
4925                                 }
4926                                 /* Treat newline as a command separator. */
4927                                 done_pipe(&ctx, PIPE_SEQ);
4928                                 debug_printf_parse("heredoc_cnt:%d\n", heredoc_cnt);
4929                                 if (heredoc_cnt) {
4930                                         if (fetch_heredocs(heredoc_cnt, &ctx, input)) {
4931                                                 goto parse_error;
4932                                         }
4933                                         heredoc_cnt = 0;
4934                                 }
4935                                 dest.o_assignment = MAYBE_ASSIGNMENT;
4936                                 debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
4937                                 ch = ';';
4938                                 /* note: if (is_blank) continue;
4939                                  * will still trigger for us */
4940                         }
4941                 }
4942
4943                 /* "cmd}" or "cmd }..." without semicolon or &:
4944                  * } is an ordinary char in this case, even inside { cmd; }
4945                  * Pathological example: { ""}; } should exec "}" cmd
4946                  */
4947                 if (ch == '}') {
4948                         if (dest.length != 0 /* word} */
4949                          || dest.has_quoted_part    /* ""} */
4950                         ) {
4951                                 goto ordinary_char;
4952                         }
4953                         if (!IS_NULL_CMD(ctx.command)) { /* cmd } */
4954                                 /* Generally, there should be semicolon: "cmd; }"
4955                                  * However, bash allows to omit it if "cmd" is
4956                                  * a group. Examples:
4957                                  * { { echo 1; } }
4958                                  * {(echo 1)}
4959                                  * { echo 0 >&2 | { echo 1; } }
4960                                  * { while false; do :; done }
4961                                  * { case a in b) ;; esac }
4962                                  */
4963                                 if (ctx.command->group)
4964                                         goto term_group;
4965                                 goto ordinary_char;
4966                         }
4967                         if (!IS_NULL_PIPE(ctx.pipe)) /* cmd | } */
4968                                 /* Can't be an end of {cmd}, skip the check */
4969                                 goto skip_end_trigger;
4970                         /* else: } does terminate a group */
4971                 }
4972  term_group:
4973                 if (end_trigger && end_trigger == ch
4974                  && (ch != ';' || heredoc_cnt == 0)
4975 #if ENABLE_HUSH_CASE
4976                  && (ch != ')'
4977                     || ctx.ctx_res_w != RES_MATCH
4978                     || (!dest.has_quoted_part && strcmp(dest.data, "esac") == 0)
4979                     )
4980 #endif
4981                 ) {
4982                         if (heredoc_cnt) {
4983                                 /* This is technically valid:
4984                                  * { cat <<HERE; }; echo Ok
4985                                  * heredoc
4986                                  * heredoc
4987                                  * HERE
4988                                  * but we don't support this.
4989                                  * We require heredoc to be in enclosing {}/(),
4990                                  * if any.
4991                                  */
4992                                 syntax_error_unterm_str("here document");
4993                                 goto parse_error;
4994                         }
4995                         if (done_word(&dest, &ctx)) {
4996                                 goto parse_error;
4997                         }
4998                         done_pipe(&ctx, PIPE_SEQ);
4999                         dest.o_assignment = MAYBE_ASSIGNMENT;
5000                         debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
5001                         /* Do we sit outside of any if's, loops or case's? */
5002                         if (!HAS_KEYWORDS
5003                         IF_HAS_KEYWORDS(|| (ctx.ctx_res_w == RES_NONE && ctx.old_flag == 0))
5004                         ) {
5005                                 o_free(&dest);
5006 #if !BB_MMU
5007                                 debug_printf_parse("as_string2 '%s'\n", ctx.as_string.data);
5008                                 if (pstring)
5009                                         *pstring = ctx.as_string.data;
5010                                 else
5011                                         o_free_unsafe(&ctx.as_string);
5012 #endif
5013                                 debug_leave();
5014                                 debug_printf_parse("parse_stream return %p: "
5015                                                 "end_trigger char found\n",
5016                                                 ctx.list_head);
5017                                 return ctx.list_head;
5018                         }
5019                 }
5020  skip_end_trigger:
5021                 if (is_blank)
5022                         continue;
5023
5024                 /* Catch <, > before deciding whether this word is
5025                  * an assignment. a=1 2>z b=2: b=2 is still assignment */
5026                 switch (ch) {
5027                 case '>':
5028                         redir_fd = redirect_opt_num(&dest);
5029                         if (done_word(&dest, &ctx)) {
5030                                 goto parse_error;
5031                         }
5032                         redir_style = REDIRECT_OVERWRITE;
5033                         if (next == '>') {
5034                                 redir_style = REDIRECT_APPEND;
5035                                 ch = i_getch(input);
5036                                 nommu_addchr(&ctx.as_string, ch);
5037                         }
5038 #if 0
5039                         else if (next == '(') {
5040                                 syntax_error(">(process) not supported");
5041                                 goto parse_error;
5042                         }
5043 #endif
5044                         if (parse_redirect(&ctx, redir_fd, redir_style, input))
5045                                 goto parse_error;
5046                         continue; /* back to top of while (1) */
5047                 case '<':
5048                         redir_fd = redirect_opt_num(&dest);
5049                         if (done_word(&dest, &ctx)) {
5050                                 goto parse_error;
5051                         }
5052                         redir_style = REDIRECT_INPUT;
5053                         if (next == '<') {
5054                                 redir_style = REDIRECT_HEREDOC;
5055                                 heredoc_cnt++;
5056                                 debug_printf_parse("++heredoc_cnt=%d\n", heredoc_cnt);
5057                                 ch = i_getch(input);
5058                                 nommu_addchr(&ctx.as_string, ch);
5059                         } else if (next == '>') {
5060                                 redir_style = REDIRECT_IO;
5061                                 ch = i_getch(input);
5062                                 nommu_addchr(&ctx.as_string, ch);
5063                         }
5064 #if 0
5065                         else if (next == '(') {
5066                                 syntax_error("<(process) not supported");
5067                                 goto parse_error;
5068                         }
5069 #endif
5070                         if (parse_redirect(&ctx, redir_fd, redir_style, input))
5071                                 goto parse_error;
5072                         continue; /* back to top of while (1) */
5073                 case '#':
5074                         if (dest.length == 0 && !dest.has_quoted_part) {
5075                                 /* skip "#comment" */
5076                                 while (1) {
5077                                         ch = i_peek(input);
5078                                         if (ch == EOF || ch == '\n')
5079                                                 break;
5080                                         i_getch(input);
5081                                         /* note: we do not add it to &ctx.as_string */
5082                                 }
5083                                 nommu_addchr(&ctx.as_string, '\n');
5084                                 continue; /* back to top of while (1) */
5085                         }
5086                         break;
5087                 case '\\':
5088                         if (next == '\n') {
5089                                 /* It's "\<newline>" */
5090 #if !BB_MMU
5091                                 /* Remove trailing '\' from ctx.as_string */
5092                                 ctx.as_string.data[--ctx.as_string.length] = '\0';
5093 #endif
5094                                 ch = i_getch(input); /* eat it */
5095                                 continue; /* back to top of while (1) */
5096                         }
5097                         break;
5098                 }
5099
5100                 if (dest.o_assignment == MAYBE_ASSIGNMENT
5101                  /* check that we are not in word in "a=1 2>word b=1": */
5102                  && !ctx.pending_redirect
5103                 ) {
5104                         /* ch is a special char and thus this word
5105                          * cannot be an assignment */
5106                         dest.o_assignment = NOT_ASSIGNMENT;
5107                         debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
5108                 }
5109
5110                 /* Note: nommu_addchr(&ctx.as_string, ch) is already done */
5111
5112                 switch (ch) {
5113                 case '#': /* non-comment #: "echo a#b" etc */
5114                         o_addQchr(&dest, ch);
5115                         break;
5116                 case '\\':
5117                         if (next == EOF) {
5118                                 syntax_error("\\<eof>");
5119                                 xfunc_die();
5120                         }
5121                         ch = i_getch(input);
5122                         /* note: ch != '\n' (that case does not reach this place) */
5123                         o_addchr(&dest, '\\');
5124                         /*nommu_addchr(&ctx.as_string, '\\'); - already done */
5125                         o_addchr(&dest, ch);
5126                         nommu_addchr(&ctx.as_string, ch);
5127                         /* Example: echo Hello \2>file
5128                          * we need to know that word 2 is quoted */
5129                         dest.has_quoted_part = 1;
5130                         break;
5131                 case '$':
5132                         if (!parse_dollar(&ctx.as_string, &dest, input, /*quote_mask:*/ 0)) {
5133                                 debug_printf_parse("parse_stream parse error: "
5134                                         "parse_dollar returned 0 (error)\n");
5135                                 goto parse_error;
5136                         }
5137                         break;
5138                 case '\'':
5139                         dest.has_quoted_part = 1;
5140                         if (next == '\'' && !ctx.pending_redirect) {
5141  insert_empty_quoted_str_marker:
5142                                 nommu_addchr(&ctx.as_string, next);
5143                                 i_getch(input); /* eat second ' */
5144                                 o_addchr(&dest, SPECIAL_VAR_SYMBOL);
5145                                 o_addchr(&dest, SPECIAL_VAR_SYMBOL);
5146                         } else {
5147                                 while (1) {
5148                                         ch = i_getch(input);
5149                                         if (ch == EOF) {
5150                                                 syntax_error_unterm_ch('\'');
5151                                                 goto parse_error;
5152                                         }
5153                                         nommu_addchr(&ctx.as_string, ch);
5154                                         if (ch == '\'')
5155                                                 break;
5156                                         o_addqchr(&dest, ch);
5157                                 }
5158                         }
5159                         break;
5160                 case '"':
5161                         dest.has_quoted_part = 1;
5162                         if (next == '"' && !ctx.pending_redirect)
5163                                 goto insert_empty_quoted_str_marker;
5164                         if (dest.o_assignment == NOT_ASSIGNMENT)
5165                                 dest.o_expflags |= EXP_FLAG_ESC_GLOB_CHARS;
5166                         if (!encode_string(&ctx.as_string, &dest, input, '"', /*process_bkslash:*/ 1))
5167                                 goto parse_error;
5168                         dest.o_expflags &= ~EXP_FLAG_ESC_GLOB_CHARS;
5169                         break;
5170 #if ENABLE_HUSH_TICK
5171                 case '`': {
5172                         USE_FOR_NOMMU(unsigned pos;)
5173
5174                         o_addchr(&dest, SPECIAL_VAR_SYMBOL);
5175                         o_addchr(&dest, '`');
5176                         USE_FOR_NOMMU(pos = dest.length;)
5177                         if (!add_till_backquote(&dest, input, /*in_dquote:*/ 0))
5178                                 goto parse_error;
5179 # if !BB_MMU
5180                         o_addstr(&ctx.as_string, dest.data + pos);
5181                         o_addchr(&ctx.as_string, '`');
5182 # endif
5183                         o_addchr(&dest, SPECIAL_VAR_SYMBOL);
5184                         //debug_printf_subst("SUBST RES3 '%s'\n", dest.data + pos);
5185                         break;
5186                 }
5187 #endif
5188                 case ';':
5189 #if ENABLE_HUSH_CASE
5190  case_semi:
5191 #endif
5192                         if (done_word(&dest, &ctx)) {
5193                                 goto parse_error;
5194                         }
5195                         done_pipe(&ctx, PIPE_SEQ);
5196 #if ENABLE_HUSH_CASE
5197                         /* Eat multiple semicolons, detect
5198                          * whether it means something special */
5199                         while (1) {
5200                                 ch = i_peek(input);
5201                                 if (ch != ';')
5202                                         break;
5203                                 ch = i_getch(input);
5204                                 nommu_addchr(&ctx.as_string, ch);
5205                                 if (ctx.ctx_res_w == RES_CASE_BODY) {
5206                                         ctx.ctx_dsemicolon = 1;
5207                                         ctx.ctx_res_w = RES_MATCH;
5208                                         break;
5209                                 }
5210                         }
5211 #endif
5212  new_cmd:
5213                         /* We just finished a cmd. New one may start
5214                          * with an assignment */
5215                         dest.o_assignment = MAYBE_ASSIGNMENT;
5216                         debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
5217                         break;
5218                 case '&':
5219                         if (done_word(&dest, &ctx)) {
5220                                 goto parse_error;
5221                         }
5222                         if (next == '&') {
5223                                 ch = i_getch(input);
5224                                 nommu_addchr(&ctx.as_string, ch);
5225                                 done_pipe(&ctx, PIPE_AND);
5226                         } else {
5227                                 done_pipe(&ctx, PIPE_BG);
5228                         }
5229                         goto new_cmd;
5230                 case '|':
5231                         if (done_word(&dest, &ctx)) {
5232                                 goto parse_error;
5233                         }
5234 #if ENABLE_HUSH_CASE
5235                         if (ctx.ctx_res_w == RES_MATCH)
5236                                 break; /* we are in case's "word | word)" */
5237 #endif
5238                         if (next == '|') { /* || */
5239                                 ch = i_getch(input);
5240                                 nommu_addchr(&ctx.as_string, ch);
5241                                 done_pipe(&ctx, PIPE_OR);
5242                         } else {
5243                                 /* we could pick up a file descriptor choice here
5244                                  * with redirect_opt_num(), but bash doesn't do it.
5245                                  * "echo foo 2| cat" yields "foo 2". */
5246                                 done_command(&ctx);
5247                         }
5248                         goto new_cmd;
5249                 case '(':
5250 #if ENABLE_HUSH_CASE
5251                         /* "case... in [(]word)..." - skip '(' */
5252                         if (ctx.ctx_res_w == RES_MATCH
5253                          && ctx.command->argv == NULL /* not (word|(... */
5254                          && dest.length == 0 /* not word(... */
5255                          && dest.has_quoted_part == 0 /* not ""(... */
5256                         ) {
5257                                 continue;
5258                         }
5259 #endif
5260                 case '{':
5261                         if (parse_group(&dest, &ctx, input, ch) != 0) {
5262                                 goto parse_error;
5263                         }
5264                         goto new_cmd;
5265                 case ')':
5266 #if ENABLE_HUSH_CASE
5267                         if (ctx.ctx_res_w == RES_MATCH)
5268                                 goto case_semi;
5269 #endif
5270                 case '}':
5271                         /* proper use of this character is caught by end_trigger:
5272                          * if we see {, we call parse_group(..., end_trigger='}')
5273                          * and it will match } earlier (not here). */
5274                         syntax_error_unexpected_ch(ch);
5275                         G.last_exitcode = 2;
5276                         goto parse_error2;
5277                 default:
5278                         if (HUSH_DEBUG)
5279                                 bb_error_msg_and_die("BUG: unexpected %c\n", ch);
5280                 }
5281         } /* while (1) */
5282
5283  parse_error:
5284         G.last_exitcode = 1;
5285  parse_error2:
5286         {
5287                 struct parse_context *pctx;
5288                 IF_HAS_KEYWORDS(struct parse_context *p2;)
5289
5290                 /* Clean up allocated tree.
5291                  * Sample for finding leaks on syntax error recovery path.
5292                  * Run it from interactive shell, watch pmap `pidof hush`.
5293                  * while if false; then false; fi; do break; fi
5294                  * Samples to catch leaks at execution:
5295                  * while if (true | { true;}); then echo ok; fi; do break; done
5296                  * while if (true | { true;}); then echo ok; fi; do (if echo ok; break; then :; fi) | cat; break; done
5297                  */
5298                 pctx = &ctx;
5299                 do {
5300                         /* Update pipe/command counts,
5301                          * otherwise freeing may miss some */
5302                         done_pipe(pctx, PIPE_SEQ);
5303                         debug_printf_clean("freeing list %p from ctx %p\n",
5304                                         pctx->list_head, pctx);
5305                         debug_print_tree(pctx->list_head, 0);
5306                         free_pipe_list(pctx->list_head);
5307                         debug_printf_clean("freed list %p\n", pctx->list_head);
5308 #if !BB_MMU
5309                         o_free_unsafe(&pctx->as_string);
5310 #endif
5311                         IF_HAS_KEYWORDS(p2 = pctx->stack;)
5312                         if (pctx != &ctx) {
5313                                 free(pctx);
5314                         }
5315                         IF_HAS_KEYWORDS(pctx = p2;)
5316                 } while (HAS_KEYWORDS && pctx);
5317
5318                 o_free(&dest);
5319 #if !BB_MMU
5320                 if (pstring)
5321                         *pstring = NULL;
5322 #endif
5323                 debug_leave();
5324                 return ERR_PTR;
5325         }
5326 }
5327
5328
5329 /*** Execution routines ***/
5330
5331 /* Expansion can recurse, need forward decls: */
5332 #if !BASH_PATTERN_SUBST && !ENABLE_HUSH_CASE
5333 /* only ${var/pattern/repl} (its pattern part) needs additional mode */
5334 #define expand_string_to_string(str, do_unbackslash) \
5335         expand_string_to_string(str)
5336 #endif
5337 static char *expand_string_to_string(const char *str, int do_unbackslash);
5338 #if ENABLE_HUSH_TICK
5339 static int process_command_subs(o_string *dest, const char *s);
5340 #endif
5341
5342 /* expand_strvec_to_strvec() takes a list of strings, expands
5343  * all variable references within and returns a pointer to
5344  * a list of expanded strings, possibly with larger number
5345  * of strings. (Think VAR="a b"; echo $VAR).
5346  * This new list is allocated as a single malloc block.
5347  * NULL-terminated list of char* pointers is at the beginning of it,
5348  * followed by strings themselves.
5349  * Caller can deallocate entire list by single free(list). */
5350
5351 /* A horde of its helpers come first: */
5352
5353 static void o_addblock_duplicate_backslash(o_string *o, const char *str, int len)
5354 {
5355         while (--len >= 0) {
5356                 char c = *str++;
5357
5358 #if ENABLE_HUSH_BRACE_EXPANSION
5359                 if (c == '{' || c == '}') {
5360                         /* { -> \{, } -> \} */
5361                         o_addchr(o, '\\');
5362                         /* And now we want to add { or } and continue:
5363                          *  o_addchr(o, c);
5364                          *  continue;
5365                          * luckily, just falling through achieves this.
5366                          */
5367                 }
5368 #endif
5369                 o_addchr(o, c);
5370                 if (c == '\\') {
5371                         /* \z -> \\\z; \<eol> -> \\<eol> */
5372                         o_addchr(o, '\\');
5373                         if (len) {
5374                                 len--;
5375                                 o_addchr(o, '\\');
5376                                 o_addchr(o, *str++);
5377                         }
5378                 }
5379         }
5380 }
5381
5382 /* Store given string, finalizing the word and starting new one whenever
5383  * we encounter IFS char(s). This is used for expanding variable values.
5384  * End-of-string does NOT finalize word: think about 'echo -$VAR-'.
5385  * Return in *ended_with_ifs:
5386  * 1 - ended with IFS char, else 0 (this includes case of empty str).
5387  */
5388 static int expand_on_ifs(int *ended_with_ifs, o_string *output, int n, const char *str)
5389 {
5390         int last_is_ifs = 0;
5391
5392         while (1) {
5393                 int word_len;
5394
5395                 if (!*str)  /* EOL - do not finalize word */
5396                         break;
5397                 word_len = strcspn(str, G.ifs);
5398                 if (word_len) {
5399                         /* We have WORD_LEN leading non-IFS chars */
5400                         if (!(output->o_expflags & EXP_FLAG_GLOB)) {
5401                                 o_addblock(output, str, word_len);
5402                         } else {
5403                                 /* Protect backslashes against globbing up :)
5404                                  * Example: "v='\*'; echo b$v" prints "b\*"
5405                                  * (and does not try to glob on "*")
5406                                  */
5407                                 o_addblock_duplicate_backslash(output, str, word_len);
5408                                 /*/ Why can't we do it easier? */
5409                                 /*o_addblock(output, str, word_len); - WRONG: "v='\*'; echo Z$v" prints "Z*" instead of "Z\*" */
5410                                 /*o_addqblock(output, str, word_len); - WRONG: "v='*'; echo Z$v" prints "Z*" instead of Z* files */
5411                         }
5412                         last_is_ifs = 0;
5413                         str += word_len;
5414                         if (!*str)  /* EOL - do not finalize word */
5415                                 break;
5416                 }
5417
5418                 /* We know str here points to at least one IFS char */
5419                 last_is_ifs = 1;
5420                 str += strspn(str, G.ifs); /* skip IFS chars */
5421                 if (!*str)  /* EOL - do not finalize word */
5422                         break;
5423
5424                 /* Start new word... but not always! */
5425                 /* Case "v=' a'; echo ''$v": we do need to finalize empty word: */
5426                 if (output->has_quoted_part
5427                 /* Case "v=' a'; echo $v":
5428                  * here nothing precedes the space in $v expansion,
5429                  * therefore we should not finish the word
5430                  * (IOW: if there *is* word to finalize, only then do it):
5431                  */
5432                  || (n > 0 && output->data[output->length - 1])
5433                 ) {
5434                         o_addchr(output, '\0');
5435                         debug_print_list("expand_on_ifs", output, n);
5436                         n = o_save_ptr(output, n);
5437                 }
5438         }
5439
5440         if (ended_with_ifs)
5441                 *ended_with_ifs = last_is_ifs;
5442         debug_print_list("expand_on_ifs[1]", output, n);
5443         return n;
5444 }
5445
5446 /* Helper to expand $((...)) and heredoc body. These act as if
5447  * they are in double quotes, with the exception that they are not :).
5448  * Just the rules are similar: "expand only $var and `cmd`"
5449  *
5450  * Returns malloced string.
5451  * As an optimization, we return NULL if expansion is not needed.
5452  */
5453 #if !BASH_PATTERN_SUBST
5454 /* only ${var/pattern/repl} (its pattern part) needs additional mode */
5455 #define encode_then_expand_string(str, process_bkslash, do_unbackslash) \
5456         encode_then_expand_string(str)
5457 #endif
5458 static char *encode_then_expand_string(const char *str, int process_bkslash, int do_unbackslash)
5459 {
5460 #if !BASH_PATTERN_SUBST
5461         const int do_unbackslash = 1;
5462 #endif
5463         char *exp_str;
5464         struct in_str input;
5465         o_string dest = NULL_O_STRING;
5466
5467         if (!strchr(str, '$')
5468          && !strchr(str, '\\')
5469 #if ENABLE_HUSH_TICK
5470          && !strchr(str, '`')
5471 #endif
5472         ) {
5473                 return NULL;
5474         }
5475
5476         /* We need to expand. Example:
5477          * echo $(($a + `echo 1`)) $((1 + $((2)) ))
5478          */
5479         setup_string_in_str(&input, str);
5480         encode_string(NULL, &dest, &input, EOF, process_bkslash);
5481 //TODO: error check (encode_string returns 0 on error)?
5482         //bb_error_msg("'%s' -> '%s'", str, dest.data);
5483         exp_str = expand_string_to_string(dest.data, /*unbackslash:*/ do_unbackslash);
5484         //bb_error_msg("'%s' -> '%s'", dest.data, exp_str);
5485         o_free_unsafe(&dest);
5486         return exp_str;
5487 }
5488
5489 #if ENABLE_FEATURE_SH_MATH
5490 static arith_t expand_and_evaluate_arith(const char *arg, const char **errmsg_p)
5491 {
5492         arith_state_t math_state;
5493         arith_t res;
5494         char *exp_str;
5495
5496         math_state.lookupvar = get_local_var_value;
5497         math_state.setvar = set_local_var_from_halves;
5498         //math_state.endofname = endofname;
5499         exp_str = encode_then_expand_string(arg, /*process_bkslash:*/ 1, /*unbackslash:*/ 1);
5500         res = arith(&math_state, exp_str ? exp_str : arg);
5501         free(exp_str);
5502         if (errmsg_p)
5503                 *errmsg_p = math_state.errmsg;
5504         if (math_state.errmsg)
5505                 die_if_script(math_state.errmsg);
5506         return res;
5507 }
5508 #endif
5509
5510 #if BASH_PATTERN_SUBST
5511 /* ${var/[/]pattern[/repl]} helpers */
5512 static char *strstr_pattern(char *val, const char *pattern, int *size)
5513 {
5514         while (1) {
5515                 char *end = scan_and_match(val, pattern, SCAN_MOVE_FROM_RIGHT + SCAN_MATCH_LEFT_HALF);
5516                 debug_printf_varexp("val:'%s' pattern:'%s' end:'%s'\n", val, pattern, end);
5517                 if (end) {
5518                         *size = end - val;
5519                         return val;
5520                 }
5521                 if (*val == '\0')
5522                         return NULL;
5523                 /* Optimization: if "*pat" did not match the start of "string",
5524                  * we know that "tring", "ring" etc will not match too:
5525                  */
5526                 if (pattern[0] == '*')
5527                         return NULL;
5528                 val++;
5529         }
5530 }
5531 static char *replace_pattern(char *val, const char *pattern, const char *repl, char exp_op)
5532 {
5533         char *result = NULL;
5534         unsigned res_len = 0;
5535         unsigned repl_len = strlen(repl);
5536
5537         while (1) {
5538                 int size;
5539                 char *s = strstr_pattern(val, pattern, &size);
5540                 if (!s)
5541                         break;
5542
5543                 result = xrealloc(result, res_len + (s - val) + repl_len + 1);
5544                 strcpy(mempcpy(result + res_len, val, s - val), repl);
5545                 res_len += (s - val) + repl_len;
5546                 debug_printf_varexp("val:'%s' s:'%s' result:'%s'\n", val, s, result);
5547
5548                 val = s + size;
5549                 if (exp_op == '/')
5550                         break;
5551         }
5552         if (*val && result) {
5553                 result = xrealloc(result, res_len + strlen(val) + 1);
5554                 strcpy(result + res_len, val);
5555                 debug_printf_varexp("val:'%s' result:'%s'\n", val, result);
5556         }
5557         debug_printf_varexp("result:'%s'\n", result);
5558         return result;
5559 }
5560 #endif /* BASH_PATTERN_SUBST */
5561
5562 /* Helper:
5563  * Handles <SPECIAL_VAR_SYMBOL>varname...<SPECIAL_VAR_SYMBOL> construct.
5564  */
5565 static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, char **pp)
5566 {
5567         const char *val = NULL;
5568         char *to_be_freed = NULL;
5569         char *p = *pp;
5570         char *var;
5571         char first_char;
5572         char exp_op;
5573         char exp_save = exp_save; /* for compiler */
5574         char *exp_saveptr; /* points to expansion operator */
5575         char *exp_word = exp_word; /* for compiler */
5576         char arg0;
5577
5578         *p = '\0'; /* replace trailing SPECIAL_VAR_SYMBOL */
5579         var = arg;
5580         exp_saveptr = arg[1] ? strchr(VAR_ENCODED_SUBST_OPS, arg[1]) : NULL;
5581         arg0 = arg[0];
5582         first_char = arg[0] = arg0 & 0x7f;
5583         exp_op = 0;
5584
5585         if (first_char == '#' && arg[1] /* ${#...} but not ${#} */
5586          && (!exp_saveptr               /* and ( not(${#<op_char>...}) */
5587             || (arg[2] == '\0' && strchr(SPECIAL_VARS_STR, arg[1])) /* or ${#C} "len of $C" ) */
5588             )           /* NB: skipping ^^^specvar check mishandles ${#::2} */
5589         ) {
5590                 /* It must be length operator: ${#var} */
5591                 var++;
5592                 exp_op = 'L';
5593         } else {
5594                 /* Maybe handle parameter expansion */
5595                 if (exp_saveptr /* if 2nd char is one of expansion operators */
5596                  && strchr(NUMERIC_SPECVARS_STR, first_char) /* 1st char is special variable */
5597                 ) {
5598                         /* ${?:0}, ${#[:]%0} etc */
5599                         exp_saveptr = var + 1;
5600                 } else {
5601                         /* ${?}, ${var}, ${var:0}, ${var[:]%0} etc */
5602                         exp_saveptr = var+1 + strcspn(var+1, VAR_ENCODED_SUBST_OPS);
5603                 }
5604                 exp_op = exp_save = *exp_saveptr;
5605                 if (exp_op) {
5606                         exp_word = exp_saveptr + 1;
5607                         if (exp_op == ':') {
5608                                 exp_op = *exp_word++;
5609 //TODO: try ${var:} and ${var:bogus} in non-bash config
5610                                 if (BASH_SUBSTR
5611                                  && (!exp_op || !strchr(MINUS_PLUS_EQUAL_QUESTION, exp_op))
5612                                 ) {
5613                                         /* oops... it's ${var:N[:M]}, not ${var:?xxx} or some such */
5614                                         exp_op = ':';
5615                                         exp_word--;
5616                                 }
5617                         }
5618                         *exp_saveptr = '\0';
5619                 } /* else: it's not an expansion op, but bare ${var} */
5620         }
5621
5622         /* Look up the variable in question */
5623         if (isdigit(var[0])) {
5624                 /* parse_dollar should have vetted var for us */
5625                 int n = xatoi_positive(var);
5626                 if (n < G.global_argc)
5627                         val = G.global_argv[n];
5628                 /* else val remains NULL: $N with too big N */
5629         } else {
5630                 switch (var[0]) {
5631                 case '$': /* pid */
5632                         val = utoa(G.root_pid);
5633                         break;
5634                 case '!': /* bg pid */
5635                         val = G.last_bg_pid ? utoa(G.last_bg_pid) : "";
5636                         break;
5637                 case '?': /* exitcode */
5638                         val = utoa(G.last_exitcode);
5639                         break;
5640                 case '#': /* argc */
5641                         val = utoa(G.global_argc ? G.global_argc-1 : 0);
5642                         break;
5643                 default:
5644                         val = get_local_var_value(var);
5645                 }
5646         }
5647
5648         /* Handle any expansions */
5649         if (exp_op == 'L') {
5650                 reinit_unicode_for_hush();
5651                 debug_printf_expand("expand: length(%s)=", val);
5652                 val = utoa(val ? unicode_strlen(val) : 0);
5653                 debug_printf_expand("%s\n", val);
5654         } else if (exp_op) {
5655                 if (exp_op == '%' || exp_op == '#') {
5656                         /* Standard-mandated substring removal ops:
5657                          * ${parameter%word} - remove smallest suffix pattern
5658                          * ${parameter%%word} - remove largest suffix pattern
5659                          * ${parameter#word} - remove smallest prefix pattern
5660                          * ${parameter##word} - remove largest prefix pattern
5661                          *
5662                          * Word is expanded to produce a glob pattern.
5663                          * Then var's value is matched to it and matching part removed.
5664                          */
5665                         if (val && val[0]) {
5666                                 char *t;
5667                                 char *exp_exp_word;
5668                                 char *loc;
5669                                 unsigned scan_flags = pick_scan(exp_op, *exp_word);
5670                                 if (exp_op == *exp_word)  /* ## or %% */
5671                                         exp_word++;
5672                                 exp_exp_word = encode_then_expand_string(exp_word, /*process_bkslash:*/ 1, /*unbackslash:*/ 1);
5673                                 if (exp_exp_word)
5674                                         exp_word = exp_exp_word;
5675                                 /* HACK ALERT. We depend here on the fact that
5676                                  * G.global_argv and results of utoa and get_local_var_value
5677                                  * are actually in writable memory:
5678                                  * scan_and_match momentarily stores NULs there. */
5679                                 t = (char*)val;
5680                                 loc = scan_and_match(t, exp_word, scan_flags);
5681                                 //bb_error_msg("op:%c str:'%s' pat:'%s' res:'%s'",
5682                                 //              exp_op, t, exp_word, loc);
5683                                 free(exp_exp_word);
5684                                 if (loc) { /* match was found */
5685                                         if (scan_flags & SCAN_MATCH_LEFT_HALF) /* #[#] */
5686                                                 val = loc; /* take right part */
5687                                         else /* %[%] */
5688                                                 val = to_be_freed = xstrndup(val, loc - val); /* left */
5689                                 }
5690                         }
5691                 }
5692 #if BASH_PATTERN_SUBST
5693                 else if (exp_op == '/' || exp_op == '\\') {
5694                         /* It's ${var/[/]pattern[/repl]} thing.
5695                          * Note that in encoded form it has TWO parts:
5696                          * var/pattern<SPECIAL_VAR_SYMBOL>repl<SPECIAL_VAR_SYMBOL>
5697                          * and if // is used, it is encoded as \:
5698                          * var\pattern<SPECIAL_VAR_SYMBOL>repl<SPECIAL_VAR_SYMBOL>
5699                          */
5700                         /* Empty variable always gives nothing: */
5701                         // "v=''; echo ${v/*/w}" prints "", not "w"
5702                         if (val && val[0]) {
5703                                 /* pattern uses non-standard expansion.
5704                                  * repl should be unbackslashed and globbed
5705                                  * by the usual expansion rules:
5706                                  * >az; >bz;
5707                                  * v='a bz'; echo "${v/a*z/a*z}" prints "a*z"
5708                                  * v='a bz'; echo "${v/a*z/\z}"  prints "\z"
5709                                  * v='a bz'; echo ${v/a*z/a*z}   prints "az"
5710                                  * v='a bz'; echo ${v/a*z/\z}    prints "z"
5711                                  * (note that a*z _pattern_ is never globbed!)
5712                                  */
5713                                 char *pattern, *repl, *t;
5714                                 pattern = encode_then_expand_string(exp_word, /*process_bkslash:*/ 0, /*unbackslash:*/ 0);
5715                                 if (!pattern)
5716                                         pattern = xstrdup(exp_word);
5717                                 debug_printf_varexp("pattern:'%s'->'%s'\n", exp_word, pattern);
5718                                 *p++ = SPECIAL_VAR_SYMBOL;
5719                                 exp_word = p;
5720                                 p = strchr(p, SPECIAL_VAR_SYMBOL);
5721                                 *p = '\0';
5722                                 repl = encode_then_expand_string(exp_word, /*process_bkslash:*/ arg0 & 0x80, /*unbackslash:*/ 1);
5723                                 debug_printf_varexp("repl:'%s'->'%s'\n", exp_word, repl);
5724                                 /* HACK ALERT. We depend here on the fact that
5725                                  * G.global_argv and results of utoa and get_local_var_value
5726                                  * are actually in writable memory:
5727                                  * replace_pattern momentarily stores NULs there. */
5728                                 t = (char*)val;
5729                                 to_be_freed = replace_pattern(t,
5730                                                 pattern,
5731                                                 (repl ? repl : exp_word),
5732                                                 exp_op);
5733                                 if (to_be_freed) /* at least one replace happened */
5734                                         val = to_be_freed;
5735                                 free(pattern);
5736                                 free(repl);
5737                         }
5738                 }
5739 #endif /* BASH_PATTERN_SUBST */
5740                 else if (exp_op == ':') {
5741 #if BASH_SUBSTR && ENABLE_FEATURE_SH_MATH
5742                         /* It's ${var:N[:M]} bashism.
5743                          * Note that in encoded form it has TWO parts:
5744                          * var:N<SPECIAL_VAR_SYMBOL>M<SPECIAL_VAR_SYMBOL>
5745                          */
5746                         arith_t beg, len;
5747                         const char *errmsg;
5748
5749                         beg = expand_and_evaluate_arith(exp_word, &errmsg);
5750                         if (errmsg)
5751                                 goto arith_err;
5752                         debug_printf_varexp("beg:'%s'=%lld\n", exp_word, (long long)beg);
5753                         *p++ = SPECIAL_VAR_SYMBOL;
5754                         exp_word = p;
5755                         p = strchr(p, SPECIAL_VAR_SYMBOL);
5756                         *p = '\0';
5757                         len = expand_and_evaluate_arith(exp_word, &errmsg);
5758                         if (errmsg)
5759                                 goto arith_err;
5760                         debug_printf_varexp("len:'%s'=%lld\n", exp_word, (long long)len);
5761                         if (beg < 0) {
5762                                 /* negative beg counts from the end */
5763                                 beg = (arith_t)strlen(val) + beg;
5764                                 if (beg < 0) /* ${v: -999999} is "" */
5765                                         beg = len = 0;
5766                         }
5767                         debug_printf_varexp("from val:'%s'\n", val);
5768                         if (len < 0) {
5769                                 /* in bash, len=-n means strlen()-n */
5770                                 len = (arith_t)strlen(val) - beg + len;
5771                                 if (len < 0) /* bash compat */
5772                                         die_if_script("%s: substring expression < 0", var);
5773                         }
5774                         if (len <= 0 || !val || beg >= strlen(val)) {
5775  arith_err:
5776                                 val = NULL;
5777                         } else {
5778                                 /* Paranoia. What if user entered 9999999999999
5779                                  * which fits in arith_t but not int? */
5780                                 if (len >= INT_MAX)
5781                                         len = INT_MAX;
5782                                 val = to_be_freed = xstrndup(val + beg, len);
5783                         }
5784                         debug_printf_varexp("val:'%s'\n", val);
5785 #else /* not (HUSH_SUBSTR_EXPANSION && FEATURE_SH_MATH) */
5786                         die_if_script("malformed ${%s:...}", var);
5787                         val = NULL;
5788 #endif
5789                 } else { /* one of "-=+?" */
5790                         /* Standard-mandated substitution ops:
5791                          * ${var?word} - indicate error if unset
5792                          *      If var is unset, word (or a message indicating it is unset
5793                          *      if word is null) is written to standard error
5794                          *      and the shell exits with a non-zero exit status.
5795                          *      Otherwise, the value of var is substituted.
5796                          * ${var-word} - use default value
5797                          *      If var is unset, word is substituted.
5798                          * ${var=word} - assign and use default value
5799                          *      If var is unset, word is assigned to var.
5800                          *      In all cases, final value of var is substituted.
5801                          * ${var+word} - use alternative value
5802                          *      If var is unset, null is substituted.
5803                          *      Otherwise, word is substituted.
5804                          *
5805                          * Word is subjected to tilde expansion, parameter expansion,
5806                          * command substitution, and arithmetic expansion.
5807                          * If word is not needed, it is not expanded.
5808                          *
5809                          * Colon forms (${var:-word}, ${var:=word} etc) do the same,
5810                          * but also treat null var as if it is unset.
5811                          */
5812                         int use_word = (!val || ((exp_save == ':') && !val[0]));
5813                         if (exp_op == '+')
5814                                 use_word = !use_word;
5815                         debug_printf_expand("expand: op:%c (null:%s) test:%i\n", exp_op,
5816                                         (exp_save == ':') ? "true" : "false", use_word);
5817                         if (use_word) {
5818                                 to_be_freed = encode_then_expand_string(exp_word, /*process_bkslash:*/ 1, /*unbackslash:*/ 1);
5819                                 if (to_be_freed)
5820                                         exp_word = to_be_freed;
5821                                 if (exp_op == '?') {
5822                                         /* mimic bash message */
5823                                         die_if_script("%s: %s",
5824                                                 var,
5825                                                 exp_word[0]
5826                                                 ? exp_word
5827                                                 : "parameter null or not set"
5828                                                 /* ash has more specific messages, a-la: */
5829                                                 /*: (exp_save == ':' ? "parameter null or not set" : "parameter not set")*/
5830                                         );
5831 //TODO: how interactive bash aborts expansion mid-command?
5832                                 } else {
5833                                         val = exp_word;
5834                                 }
5835
5836                                 if (exp_op == '=') {
5837                                         /* ${var=[word]} or ${var:=[word]} */
5838                                         if (isdigit(var[0]) || var[0] == '#') {
5839                                                 /* mimic bash message */
5840                                                 die_if_script("$%s: cannot assign in this way", var);
5841                                                 val = NULL;
5842                                         } else {
5843                                                 char *new_var = xasprintf("%s=%s", var, val);
5844                                                 set_local_var(new_var, /*flag:*/ 0);
5845                                         }
5846                                 }
5847                         }
5848                 } /* one of "-=+?" */
5849
5850                 *exp_saveptr = exp_save;
5851         } /* if (exp_op) */
5852
5853         arg[0] = arg0;
5854
5855         *pp = p;
5856         *to_be_freed_pp = to_be_freed;
5857         return val;
5858 }
5859
5860 /* Expand all variable references in given string, adding words to list[]
5861  * at n, n+1,... positions. Return updated n (so that list[n] is next one
5862  * to be filled). This routine is extremely tricky: has to deal with
5863  * variables/parameters with whitespace, $* and $@, and constructs like
5864  * 'echo -$*-'. If you play here, you must run testsuite afterwards! */
5865 static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg)
5866 {
5867         /* output->o_expflags & EXP_FLAG_SINGLEWORD (0x80) if we are in
5868          * expansion of right-hand side of assignment == 1-element expand.
5869          */
5870         char cant_be_null = 0; /* only bit 0x80 matters */
5871         int ended_in_ifs = 0;  /* did last unquoted expansion end with IFS chars? */
5872         char *p;
5873
5874         debug_printf_expand("expand_vars_to_list: arg:'%s' singleword:%x\n", arg,
5875                         !!(output->o_expflags & EXP_FLAG_SINGLEWORD));
5876         debug_print_list("expand_vars_to_list", output, n);
5877         n = o_save_ptr(output, n);
5878         debug_print_list("expand_vars_to_list[0]", output, n);
5879
5880         while ((p = strchr(arg, SPECIAL_VAR_SYMBOL)) != NULL) {
5881                 char first_ch;
5882                 char *to_be_freed = NULL;
5883                 const char *val = NULL;
5884 #if ENABLE_HUSH_TICK
5885                 o_string subst_result = NULL_O_STRING;
5886 #endif
5887 #if ENABLE_FEATURE_SH_MATH
5888                 char arith_buf[sizeof(arith_t)*3 + 2];
5889 #endif
5890
5891                 if (ended_in_ifs) {
5892                         o_addchr(output, '\0');
5893                         n = o_save_ptr(output, n);
5894                         ended_in_ifs = 0;
5895                 }
5896
5897                 o_addblock(output, arg, p - arg);
5898                 debug_print_list("expand_vars_to_list[1]", output, n);
5899                 arg = ++p;
5900                 p = strchr(p, SPECIAL_VAR_SYMBOL);
5901
5902                 /* Fetch special var name (if it is indeed one of them)
5903                  * and quote bit, force the bit on if singleword expansion -
5904                  * important for not getting v=$@ expand to many words. */
5905                 first_ch = arg[0] | (output->o_expflags & EXP_FLAG_SINGLEWORD);
5906
5907                 /* Is this variable quoted and thus expansion can't be null?
5908                  * "$@" is special. Even if quoted, it can still
5909                  * expand to nothing (not even an empty string),
5910                  * thus it is excluded. */
5911                 if ((first_ch & 0x7f) != '@')
5912                         cant_be_null |= first_ch;
5913
5914                 switch (first_ch & 0x7f) {
5915                 /* Highest bit in first_ch indicates that var is double-quoted */
5916                 case '*':
5917                 case '@': {
5918                         int i;
5919                         if (!G.global_argv[1])
5920                                 break;
5921                         i = 1;
5922                         cant_be_null |= first_ch; /* do it for "$@" _now_, when we know it's not empty */
5923                         if (!(first_ch & 0x80)) { /* unquoted $* or $@ */
5924                                 while (G.global_argv[i]) {
5925                                         n = expand_on_ifs(NULL, output, n, G.global_argv[i]);
5926                                         debug_printf_expand("expand_vars_to_list: argv %d (last %d)\n", i, G.global_argc - 1);
5927                                         if (G.global_argv[i++][0] && G.global_argv[i]) {
5928                                                 /* this argv[] is not empty and not last:
5929                                                  * put terminating NUL, start new word */
5930                                                 o_addchr(output, '\0');
5931                                                 debug_print_list("expand_vars_to_list[2]", output, n);
5932                                                 n = o_save_ptr(output, n);
5933                                                 debug_print_list("expand_vars_to_list[3]", output, n);
5934                                         }
5935                                 }
5936                         } else
5937                         /* If EXP_FLAG_SINGLEWORD, we handle assignment 'a=....$@.....'
5938                          * and in this case should treat it like '$*' - see 'else...' below */
5939                         if (first_ch == ('@'|0x80)  /* quoted $@ */
5940                          && !(output->o_expflags & EXP_FLAG_SINGLEWORD) /* not v="$@" case */
5941                         ) {
5942                                 while (1) {
5943                                         o_addQstr(output, G.global_argv[i]);
5944                                         if (++i >= G.global_argc)
5945                                                 break;
5946                                         o_addchr(output, '\0');
5947                                         debug_print_list("expand_vars_to_list[4]", output, n);
5948                                         n = o_save_ptr(output, n);
5949                                 }
5950                         } else { /* quoted $* (or v="$@" case): add as one word */
5951                                 while (1) {
5952                                         o_addQstr(output, G.global_argv[i]);
5953                                         if (!G.global_argv[++i])
5954                                                 break;
5955                                         if (G.ifs[0])
5956                                                 o_addchr(output, G.ifs[0]);
5957                                 }
5958                                 output->has_quoted_part = 1;
5959                         }
5960                         break;
5961                 }
5962                 case SPECIAL_VAR_SYMBOL: /* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_SYMBOL> */
5963                         /* "Empty variable", used to make "" etc to not disappear */
5964                         output->has_quoted_part = 1;
5965                         arg++;
5966                         cant_be_null = 0x80;
5967                         break;
5968 #if ENABLE_HUSH_TICK
5969                 case '`': /* <SPECIAL_VAR_SYMBOL>`cmd<SPECIAL_VAR_SYMBOL> */
5970                         *p = '\0'; /* replace trailing <SPECIAL_VAR_SYMBOL> */
5971                         arg++;
5972                         /* Can't just stuff it into output o_string,
5973                          * expanded result may need to be globbed
5974                          * and $IFS-split */
5975                         debug_printf_subst("SUBST '%s' first_ch %x\n", arg, first_ch);
5976                         G.last_exitcode = process_command_subs(&subst_result, arg);
5977                         debug_printf_subst("SUBST RES:%d '%s'\n", G.last_exitcode, subst_result.data);
5978                         val = subst_result.data;
5979                         goto store_val;
5980 #endif
5981 #if ENABLE_FEATURE_SH_MATH
5982                 case '+': { /* <SPECIAL_VAR_SYMBOL>+cmd<SPECIAL_VAR_SYMBOL> */
5983                         arith_t res;
5984
5985                         arg++; /* skip '+' */
5986                         *p = '\0'; /* replace trailing <SPECIAL_VAR_SYMBOL> */
5987                         debug_printf_subst("ARITH '%s' first_ch %x\n", arg, first_ch);
5988                         res = expand_and_evaluate_arith(arg, NULL);
5989                         debug_printf_subst("ARITH RES '"ARITH_FMT"'\n", res);
5990                         sprintf(arith_buf, ARITH_FMT, res);
5991                         val = arith_buf;
5992                         break;
5993                 }
5994 #endif
5995                 default:
5996                         val = expand_one_var(&to_be_freed, arg, &p);
5997  IF_HUSH_TICK(store_val:)
5998                         if (!(first_ch & 0x80)) { /* unquoted $VAR */
5999                                 debug_printf_expand("unquoted '%s', output->o_escape:%d\n", val,
6000                                                 !!(output->o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
6001                                 if (val && val[0]) {
6002                                         n = expand_on_ifs(&ended_in_ifs, output, n, val);
6003                                         val = NULL;
6004                                 }
6005                         } else { /* quoted $VAR, val will be appended below */
6006                                 output->has_quoted_part = 1;
6007                                 debug_printf_expand("quoted '%s', output->o_escape:%d\n", val,
6008                                                 !!(output->o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
6009                         }
6010                         break;
6011                 } /* switch (char after <SPECIAL_VAR_SYMBOL>) */
6012
6013                 if (val && val[0]) {
6014                         o_addQstr(output, val);
6015                 }
6016                 free(to_be_freed);
6017
6018                 /* Restore NULL'ed SPECIAL_VAR_SYMBOL.
6019                  * Do the check to avoid writing to a const string. */
6020                 if (*p != SPECIAL_VAR_SYMBOL)
6021                         *p = SPECIAL_VAR_SYMBOL;
6022
6023 #if ENABLE_HUSH_TICK
6024                 o_free(&subst_result);
6025 #endif
6026                 arg = ++p;
6027         } /* end of "while (SPECIAL_VAR_SYMBOL is found) ..." */
6028
6029         if (arg[0]) {
6030                 if (ended_in_ifs) {
6031                         o_addchr(output, '\0');
6032                         n = o_save_ptr(output, n);
6033                 }
6034                 debug_print_list("expand_vars_to_list[a]", output, n);
6035                 /* this part is literal, and it was already pre-quoted
6036                  * if needed (much earlier), do not use o_addQstr here! */
6037                 o_addstr_with_NUL(output, arg);
6038                 debug_print_list("expand_vars_to_list[b]", output, n);
6039         } else if (output->length == o_get_last_ptr(output, n) /* expansion is empty */
6040          && !(cant_be_null & 0x80) /* and all vars were not quoted. */
6041         ) {
6042                 n--;
6043                 /* allow to reuse list[n] later without re-growth */
6044                 output->has_empty_slot = 1;
6045         } else {
6046                 o_addchr(output, '\0');
6047         }
6048
6049         return n;
6050 }
6051
6052 static char **expand_variables(char **argv, unsigned expflags)
6053 {
6054         int n;
6055         char **list;
6056         o_string output = NULL_O_STRING;
6057
6058         output.o_expflags = expflags;
6059
6060         n = 0;
6061         while (*argv) {
6062                 n = expand_vars_to_list(&output, n, *argv);
6063                 argv++;
6064         }
6065         debug_print_list("expand_variables", &output, n);
6066
6067         /* output.data (malloced in one block) gets returned in "list" */
6068         list = o_finalize_list(&output, n);
6069         debug_print_strings("expand_variables[1]", list);
6070         return list;
6071 }
6072
6073 static char **expand_strvec_to_strvec(char **argv)
6074 {
6075         return expand_variables(argv, EXP_FLAG_GLOB | EXP_FLAG_ESC_GLOB_CHARS);
6076 }
6077
6078 #if BASH_TEST2
6079 static char **expand_strvec_to_strvec_singleword_noglob(char **argv)
6080 {
6081         return expand_variables(argv, EXP_FLAG_SINGLEWORD);
6082 }
6083 #endif
6084
6085 /* Used for expansion of right hand of assignments,
6086  * $((...)), heredocs, variable espansion parts.
6087  *
6088  * NB: should NOT do globbing!
6089  * "export v=/bin/c*; env | grep ^v=" outputs "v=/bin/c*"
6090  */
6091 static char *expand_string_to_string(const char *str, int do_unbackslash)
6092 {
6093 #if !BASH_PATTERN_SUBST && !ENABLE_HUSH_CASE
6094         const int do_unbackslash = 1;
6095 #endif
6096         char *argv[2], **list;
6097
6098         debug_printf_expand("string_to_string<='%s'\n", str);
6099         /* This is generally an optimization, but it also
6100          * handles "", which otherwise trips over !list[0] check below.
6101          * (is this ever happens that we actually get str="" here?)
6102          */
6103         if (!strchr(str, SPECIAL_VAR_SYMBOL) && !strchr(str, '\\')) {
6104                 //TODO: Can use on strings with \ too, just unbackslash() them?
6105                 debug_printf_expand("string_to_string(fast)=>'%s'\n", str);
6106                 return xstrdup(str);
6107         }
6108
6109         argv[0] = (char*)str;
6110         argv[1] = NULL;
6111         list = expand_variables(argv, do_unbackslash
6112                         ? EXP_FLAG_ESC_GLOB_CHARS | EXP_FLAG_SINGLEWORD
6113                         : EXP_FLAG_SINGLEWORD
6114         );
6115         if (HUSH_DEBUG)
6116                 if (!list[0] || list[1])
6117                         bb_error_msg_and_die("BUG in varexp2");
6118         /* actually, just move string 2*sizeof(char*) bytes back */
6119         overlapping_strcpy((char*)list, list[0]);
6120         if (do_unbackslash)
6121                 unbackslash((char*)list);
6122         debug_printf_expand("string_to_string=>'%s'\n", (char*)list);
6123         return (char*)list;
6124 }
6125
6126 /* Used for "eval" builtin and case string */
6127 static char* expand_strvec_to_string(char **argv)
6128 {
6129         char **list;
6130
6131         list = expand_variables(argv, EXP_FLAG_SINGLEWORD);
6132         /* Convert all NULs to spaces */
6133         if (list[0]) {
6134                 int n = 1;
6135                 while (list[n]) {
6136                         if (HUSH_DEBUG)
6137                                 if (list[n-1] + strlen(list[n-1]) + 1 != list[n])
6138                                         bb_error_msg_and_die("BUG in varexp3");
6139                         /* bash uses ' ' regardless of $IFS contents */
6140                         list[n][-1] = ' ';
6141                         n++;
6142                 }
6143         }
6144         overlapping_strcpy((char*)list, list[0] ? list[0] : "");
6145         debug_printf_expand("strvec_to_string='%s'\n", (char*)list);
6146         return (char*)list;
6147 }
6148
6149 static char **expand_assignments(char **argv, int count)
6150 {
6151         int i;
6152         char **p;
6153
6154         G.expanded_assignments = p = NULL;
6155         /* Expand assignments into one string each */
6156         for (i = 0; i < count; i++) {
6157                 G.expanded_assignments = p = add_string_to_strings(p, expand_string_to_string(argv[i], /*unbackslash:*/ 1));
6158         }
6159         G.expanded_assignments = NULL;
6160         return p;
6161 }
6162
6163
6164 static void switch_off_special_sigs(unsigned mask)
6165 {
6166         unsigned sig = 0;
6167         while ((mask >>= 1) != 0) {
6168                 sig++;
6169                 if (!(mask & 1))
6170                         continue;
6171 #if ENABLE_HUSH_TRAP
6172                 if (G_traps) {
6173                         if (G_traps[sig] && !G_traps[sig][0])
6174                                 /* trap is '', has to remain SIG_IGN */
6175                                 continue;
6176                         free(G_traps[sig]);
6177                         G_traps[sig] = NULL;
6178                 }
6179 #endif
6180                 /* We are here only if no trap or trap was not '' */
6181                 install_sighandler(sig, SIG_DFL);
6182         }
6183 }
6184
6185 #if BB_MMU
6186 /* never called */
6187 void re_execute_shell(char ***to_free, const char *s,
6188                 char *g_argv0, char **g_argv,
6189                 char **builtin_argv) NORETURN;
6190
6191 static void reset_traps_to_defaults(void)
6192 {
6193         /* This function is always called in a child shell
6194          * after fork (not vfork, NOMMU doesn't use this function).
6195          */
6196         IF_HUSH_TRAP(unsigned sig;)
6197         unsigned mask;
6198
6199         /* Child shells are not interactive.
6200          * SIGTTIN/SIGTTOU/SIGTSTP should not have special handling.
6201          * Testcase: (while :; do :; done) + ^Z should background.
6202          * Same goes for SIGTERM, SIGHUP, SIGINT.
6203          */
6204         mask = (G.special_sig_mask & SPECIAL_INTERACTIVE_SIGS) | G_fatal_sig_mask;
6205         if (!G_traps && !mask)
6206                 return; /* already no traps and no special sigs */
6207
6208         /* Switch off special sigs */
6209         switch_off_special_sigs(mask);
6210 # if ENABLE_HUSH_JOB
6211         G_fatal_sig_mask = 0;
6212 # endif
6213         G.special_sig_mask &= ~SPECIAL_INTERACTIVE_SIGS;
6214         /* SIGQUIT,SIGCHLD and maybe SPECIAL_JOBSTOP_SIGS
6215          * remain set in G.special_sig_mask */
6216
6217 # if ENABLE_HUSH_TRAP
6218         if (!G_traps)
6219                 return;
6220
6221         /* Reset all sigs to default except ones with empty traps */
6222         for (sig = 0; sig < NSIG; sig++) {
6223                 if (!G_traps[sig])
6224                         continue; /* no trap: nothing to do */
6225                 if (!G_traps[sig][0])
6226                         continue; /* empty trap: has to remain SIG_IGN */
6227                 /* sig has non-empty trap, reset it: */
6228                 free(G_traps[sig]);
6229                 G_traps[sig] = NULL;
6230                 /* There is no signal for trap 0 (EXIT) */
6231                 if (sig == 0)
6232                         continue;
6233                 install_sighandler(sig, pick_sighandler(sig));
6234         }
6235 # endif
6236 }
6237
6238 #else /* !BB_MMU */
6239
6240 static void re_execute_shell(char ***to_free, const char *s,
6241                 char *g_argv0, char **g_argv,
6242                 char **builtin_argv) NORETURN;
6243 static void re_execute_shell(char ***to_free, const char *s,
6244                 char *g_argv0, char **g_argv,
6245                 char **builtin_argv)
6246 {
6247 # define NOMMU_HACK_FMT ("-$%x:%x:%x:%x:%x:%llx" IF_HUSH_LOOPS(":%x"))
6248         /* delims + 2 * (number of bytes in printed hex numbers) */
6249         char param_buf[sizeof(NOMMU_HACK_FMT) + 2 * (sizeof(int)*6 + sizeof(long long)*1)];
6250         char *heredoc_argv[4];
6251         struct variable *cur;
6252 # if ENABLE_HUSH_FUNCTIONS
6253         struct function *funcp;
6254 # endif
6255         char **argv, **pp;
6256         unsigned cnt;
6257         unsigned long long empty_trap_mask;
6258
6259         if (!g_argv0) { /* heredoc */
6260                 argv = heredoc_argv;
6261                 argv[0] = (char *) G.argv0_for_re_execing;
6262                 argv[1] = (char *) "-<";
6263                 argv[2] = (char *) s;
6264                 argv[3] = NULL;
6265                 pp = &argv[3]; /* used as pointer to empty environment */
6266                 goto do_exec;
6267         }
6268
6269         cnt = 0;
6270         pp = builtin_argv;
6271         if (pp) while (*pp++)
6272                 cnt++;
6273
6274         empty_trap_mask = 0;
6275         if (G_traps) {
6276                 int sig;
6277                 for (sig = 1; sig < NSIG; sig++) {
6278                         if (G_traps[sig] && !G_traps[sig][0])
6279                                 empty_trap_mask |= 1LL << sig;
6280                 }
6281         }
6282
6283         sprintf(param_buf, NOMMU_HACK_FMT
6284                         , (unsigned) G.root_pid
6285                         , (unsigned) G.root_ppid
6286                         , (unsigned) G.last_bg_pid
6287                         , (unsigned) G.last_exitcode
6288                         , cnt
6289                         , empty_trap_mask
6290                         IF_HUSH_LOOPS(, G.depth_of_loop)
6291                         );
6292 # undef NOMMU_HACK_FMT
6293         /* 1:hush 2:-$<pid>:<pid>:<exitcode>:<etc...> <vars...> <funcs...>
6294          * 3:-c 4:<cmd> 5:<arg0> <argN...> 6:NULL
6295          */
6296         cnt += 6;
6297         for (cur = G.top_var; cur; cur = cur->next) {
6298                 if (!cur->flg_export || cur->flg_read_only)
6299                         cnt += 2;
6300         }
6301 # if ENABLE_HUSH_FUNCTIONS
6302         for (funcp = G.top_func; funcp; funcp = funcp->next)
6303                 cnt += 3;
6304 # endif
6305         pp = g_argv;
6306         while (*pp++)
6307                 cnt++;
6308         *to_free = argv = pp = xzalloc(sizeof(argv[0]) * cnt);
6309         *pp++ = (char *) G.argv0_for_re_execing;
6310         *pp++ = param_buf;
6311         for (cur = G.top_var; cur; cur = cur->next) {
6312                 if (strcmp(cur->varstr, hush_version_str) == 0)
6313                         continue;
6314                 if (cur->flg_read_only) {
6315                         *pp++ = (char *) "-R";
6316                         *pp++ = cur->varstr;
6317                 } else if (!cur->flg_export) {
6318                         *pp++ = (char *) "-V";
6319                         *pp++ = cur->varstr;
6320                 }
6321         }
6322 # if ENABLE_HUSH_FUNCTIONS
6323         for (funcp = G.top_func; funcp; funcp = funcp->next) {
6324                 *pp++ = (char *) "-F";
6325                 *pp++ = funcp->name;
6326                 *pp++ = funcp->body_as_string;
6327         }
6328 # endif
6329         /* We can pass activated traps here. Say, -Tnn:trap_string
6330          *
6331          * However, POSIX says that subshells reset signals with traps
6332          * to SIG_DFL.
6333          * I tested bash-3.2 and it not only does that with true subshells
6334          * of the form ( list ), but with any forked children shells.
6335          * I set trap "echo W" WINCH; and then tried:
6336          *
6337          * { echo 1; sleep 20; echo 2; } &
6338          * while true; do echo 1; sleep 20; echo 2; break; done &
6339          * true | { echo 1; sleep 20; echo 2; } | cat
6340          *
6341          * In all these cases sending SIGWINCH to the child shell
6342          * did not run the trap. If I add trap "echo V" WINCH;
6343          * _inside_ group (just before echo 1), it works.
6344          *
6345          * I conclude it means we don't need to pass active traps here.
6346          */
6347         *pp++ = (char *) "-c";
6348         *pp++ = (char *) s;
6349         if (builtin_argv) {
6350                 while (*++builtin_argv)
6351                         *pp++ = *builtin_argv;
6352                 *pp++ = (char *) "";
6353         }
6354         *pp++ = g_argv0;
6355         while (*g_argv)
6356                 *pp++ = *g_argv++;
6357         /* *pp = NULL; - is already there */
6358         pp = environ;
6359
6360  do_exec:
6361         debug_printf_exec("re_execute_shell pid:%d cmd:'%s'\n", getpid(), s);
6362         /* Don't propagate SIG_IGN to the child */
6363         if (SPECIAL_JOBSTOP_SIGS != 0)
6364                 switch_off_special_sigs(G.special_sig_mask & SPECIAL_JOBSTOP_SIGS);
6365         execve(bb_busybox_exec_path, argv, pp);
6366         /* Fallback. Useful for init=/bin/hush usage etc */
6367         if (argv[0][0] == '/')
6368                 execve(argv[0], argv, pp);
6369         xfunc_error_retval = 127;
6370         bb_error_msg_and_die("can't re-execute the shell");
6371 }
6372 #endif  /* !BB_MMU */
6373
6374
6375 static int run_and_free_list(struct pipe *pi);
6376
6377 /* Executing from string: eval, sh -c '...'
6378  *          or from file: /etc/profile, . file, sh <script>, sh (intereactive)
6379  * end_trigger controls how often we stop parsing
6380  * NUL: parse all, execute, return
6381  * ';': parse till ';' or newline, execute, repeat till EOF
6382  */
6383 static void parse_and_run_stream(struct in_str *inp, int end_trigger)
6384 {
6385         /* Why we need empty flag?
6386          * An obscure corner case "false; ``; echo $?":
6387          * empty command in `` should still set $? to 0.
6388          * But we can't just set $? to 0 at the start,
6389          * this breaks "false; echo `echo $?`" case.
6390          */
6391         bool empty = 1;
6392         while (1) {
6393                 struct pipe *pipe_list;
6394
6395 #if ENABLE_HUSH_INTERACTIVE
6396                 if (end_trigger == ';')
6397                         inp->promptmode = 0; /* PS1 */
6398 #endif
6399                 pipe_list = parse_stream(NULL, inp, end_trigger);
6400                 if (!pipe_list || pipe_list == ERR_PTR) { /* EOF/error */
6401                         /* If we are in "big" script
6402                          * (not in `cmd` or something similar)...
6403                          */
6404                         if (pipe_list == ERR_PTR && end_trigger == ';') {
6405                                 /* Discard cached input (rest of line) */
6406                                 int ch = inp->last_char;
6407                                 while (ch != EOF && ch != '\n') {
6408                                         //bb_error_msg("Discarded:'%c'", ch);
6409                                         ch = i_getch(inp);
6410                                 }
6411                                 /* Force prompt */
6412                                 inp->p = NULL;
6413                                 /* This stream isn't empty */
6414                                 empty = 0;
6415                                 continue;
6416                         }
6417                         if (!pipe_list && empty)
6418                                 G.last_exitcode = 0;
6419                         break;
6420                 }
6421                 debug_print_tree(pipe_list, 0);
6422                 debug_printf_exec("parse_and_run_stream: run_and_free_list\n");
6423                 run_and_free_list(pipe_list);
6424                 empty = 0;
6425                 if (G_flag_return_in_progress == 1)
6426                         break;
6427         }
6428 }
6429
6430 static void parse_and_run_string(const char *s)
6431 {
6432         struct in_str input;
6433         setup_string_in_str(&input, s);
6434         parse_and_run_stream(&input, '\0');
6435 }
6436
6437 static void parse_and_run_file(FILE *f)
6438 {
6439         struct in_str input;
6440         setup_file_in_str(&input, f);
6441         parse_and_run_stream(&input, ';');
6442 }
6443
6444 #if ENABLE_HUSH_TICK
6445 static FILE *generate_stream_from_string(const char *s, pid_t *pid_p)
6446 {
6447         pid_t pid;
6448         int channel[2];
6449 # if !BB_MMU
6450         char **to_free = NULL;
6451 # endif
6452
6453         xpipe(channel);
6454         pid = BB_MMU ? xfork() : xvfork();
6455         if (pid == 0) { /* child */
6456                 disable_restore_tty_pgrp_on_exit();
6457                 /* Process substitution is not considered to be usual
6458                  * 'command execution'.
6459                  * SUSv3 says ctrl-Z should be ignored, ctrl-C should not.
6460                  */
6461                 bb_signals(0
6462                         + (1 << SIGTSTP)
6463                         + (1 << SIGTTIN)
6464                         + (1 << SIGTTOU)
6465                         , SIG_IGN);
6466                 CLEAR_RANDOM_T(&G.random_gen); /* or else $RANDOM repeats in child */
6467                 close(channel[0]); /* NB: close _first_, then move fd! */
6468                 xmove_fd(channel[1], 1);
6469                 /* Prevent it from trying to handle ctrl-z etc */
6470                 IF_HUSH_JOB(G.run_list_level = 1;)
6471 # if ENABLE_HUSH_TRAP
6472                 /* Awful hack for `trap` or $(trap).
6473                  *
6474                  * http://www.opengroup.org/onlinepubs/009695399/utilities/trap.html
6475                  * contains an example where "trap" is executed in a subshell:
6476                  *
6477                  * save_traps=$(trap)
6478                  * ...
6479                  * eval "$save_traps"
6480                  *
6481                  * Standard does not say that "trap" in subshell shall print
6482                  * parent shell's traps. It only says that its output
6483                  * must have suitable form, but then, in the above example
6484                  * (which is not supposed to be normative), it implies that.
6485                  *
6486                  * bash (and probably other shell) does implement it
6487                  * (traps are reset to defaults, but "trap" still shows them),
6488                  * but as a result, "trap" logic is hopelessly messed up:
6489                  *
6490                  * # trap
6491                  * trap -- 'echo Ho' SIGWINCH  <--- we have a handler
6492                  * # (trap)        <--- trap is in subshell - no output (correct, traps are reset)
6493                  * # true | trap   <--- trap is in subshell - no output (ditto)
6494                  * # echo `true | trap`    <--- in subshell - output (but traps are reset!)
6495                  * trap -- 'echo Ho' SIGWINCH
6496                  * # echo `(trap)`         <--- in subshell in subshell - output
6497                  * trap -- 'echo Ho' SIGWINCH
6498                  * # echo `true | (trap)`  <--- in subshell in subshell in subshell - output!
6499                  * trap -- 'echo Ho' SIGWINCH
6500                  *
6501                  * The rules when to forget and when to not forget traps
6502                  * get really complex and nonsensical.
6503                  *
6504                  * Our solution: ONLY bare $(trap) or `trap` is special.
6505                  */
6506                 s = skip_whitespace(s);
6507                 if (is_prefixed_with(s, "trap")
6508                  && skip_whitespace(s + 4)[0] == '\0'
6509                 ) {
6510                         static const char *const argv[] = { NULL, NULL };
6511                         builtin_trap((char**)argv);
6512                         fflush_all(); /* important */
6513                         _exit(0);
6514                 }
6515 # endif
6516 # if BB_MMU
6517                 reset_traps_to_defaults();
6518                 parse_and_run_string(s);
6519                 _exit(G.last_exitcode);
6520 # else
6521         /* We re-execute after vfork on NOMMU. This makes this script safe:
6522          * yes "0123456789012345678901234567890" | dd bs=32 count=64k >BIG
6523          * huge=`cat BIG` # was blocking here forever
6524          * echo OK
6525          */
6526                 re_execute_shell(&to_free,
6527                                 s,
6528                                 G.global_argv[0],
6529                                 G.global_argv + 1,
6530                                 NULL);
6531 # endif
6532         }
6533
6534         /* parent */
6535         *pid_p = pid;
6536 # if ENABLE_HUSH_FAST
6537         G.count_SIGCHLD++;
6538 //bb_error_msg("[%d] fork in generate_stream_from_string:"
6539 //              " G.count_SIGCHLD:%d G.handled_SIGCHLD:%d",
6540 //              getpid(), G.count_SIGCHLD, G.handled_SIGCHLD);
6541 # endif
6542         enable_restore_tty_pgrp_on_exit();
6543 # if !BB_MMU
6544         free(to_free);
6545 # endif
6546         close(channel[1]);
6547         return remember_FILE(xfdopen_for_read(channel[0]));
6548 }
6549
6550 /* Return code is exit status of the process that is run. */
6551 static int process_command_subs(o_string *dest, const char *s)
6552 {
6553         FILE *fp;
6554         struct in_str pipe_str;
6555         pid_t pid;
6556         int status, ch, eol_cnt;
6557
6558         fp = generate_stream_from_string(s, &pid);
6559
6560         /* Now send results of command back into original context */
6561         setup_file_in_str(&pipe_str, fp);
6562         eol_cnt = 0;
6563         while ((ch = i_getch(&pipe_str)) != EOF) {
6564                 if (ch == '\n') {
6565                         eol_cnt++;
6566                         continue;
6567                 }
6568                 while (eol_cnt) {
6569                         o_addchr(dest, '\n');
6570                         eol_cnt--;
6571                 }
6572                 o_addQchr(dest, ch);
6573         }
6574
6575         debug_printf("done reading from `cmd` pipe, closing it\n");
6576         fclose_and_forget(fp);
6577         /* We need to extract exitcode. Test case
6578          * "true; echo `sleep 1; false` $?"
6579          * should print 1 */
6580         safe_waitpid(pid, &status, 0);
6581         debug_printf("child exited. returning its exitcode:%d\n", WEXITSTATUS(status));
6582         return WEXITSTATUS(status);
6583 }
6584 #endif /* ENABLE_HUSH_TICK */
6585
6586
6587 static void setup_heredoc(struct redir_struct *redir)
6588 {
6589         struct fd_pair pair;
6590         pid_t pid;
6591         int len, written;
6592         /* the _body_ of heredoc (misleading field name) */
6593         const char *heredoc = redir->rd_filename;
6594         char *expanded;
6595 #if !BB_MMU
6596         char **to_free;
6597 #endif
6598
6599         expanded = NULL;
6600         if (!(redir->rd_dup & HEREDOC_QUOTED)) {
6601                 expanded = encode_then_expand_string(heredoc, /*process_bkslash:*/ 1, /*unbackslash:*/ 1);
6602                 if (expanded)
6603                         heredoc = expanded;
6604         }
6605         len = strlen(heredoc);
6606
6607         close(redir->rd_fd); /* often saves dup2+close in xmove_fd */
6608         xpiped_pair(pair);
6609         xmove_fd(pair.rd, redir->rd_fd);
6610
6611         /* Try writing without forking. Newer kernels have
6612          * dynamically growing pipes. Must use non-blocking write! */
6613         ndelay_on(pair.wr);
6614         while (1) {
6615                 written = write(pair.wr, heredoc, len);
6616                 if (written <= 0)
6617                         break;
6618                 len -= written;
6619                 if (len == 0) {
6620                         close(pair.wr);
6621                         free(expanded);
6622                         return;
6623                 }
6624                 heredoc += written;
6625         }
6626         ndelay_off(pair.wr);
6627
6628         /* Okay, pipe buffer was not big enough */
6629         /* Note: we must not create a stray child (bastard? :)
6630          * for the unsuspecting parent process. Child creates a grandchild
6631          * and exits before parent execs the process which consumes heredoc
6632          * (that exec happens after we return from this function) */
6633 #if !BB_MMU
6634         to_free = NULL;
6635 #endif
6636         pid = xvfork();
6637         if (pid == 0) {
6638                 /* child */
6639                 disable_restore_tty_pgrp_on_exit();
6640                 pid = BB_MMU ? xfork() : xvfork();
6641                 if (pid != 0)
6642                         _exit(0);
6643                 /* grandchild */
6644                 close(redir->rd_fd); /* read side of the pipe */
6645 #if BB_MMU
6646                 full_write(pair.wr, heredoc, len); /* may loop or block */
6647                 _exit(0);
6648 #else
6649                 /* Delegate blocking writes to another process */
6650                 xmove_fd(pair.wr, STDOUT_FILENO);
6651                 re_execute_shell(&to_free, heredoc, NULL, NULL, NULL);
6652 #endif
6653         }
6654         /* parent */
6655 #if ENABLE_HUSH_FAST
6656         G.count_SIGCHLD++;
6657 //bb_error_msg("[%d] fork in setup_heredoc: G.count_SIGCHLD:%d G.handled_SIGCHLD:%d", getpid(), G.count_SIGCHLD, G.handled_SIGCHLD);
6658 #endif
6659         enable_restore_tty_pgrp_on_exit();
6660 #if !BB_MMU
6661         free(to_free);
6662 #endif
6663         close(pair.wr);
6664         free(expanded);
6665         wait(NULL); /* wait till child has died */
6666 }
6667
6668 struct squirrel {
6669         int orig_fd;
6670         int moved_to;
6671         /* moved_to = n: fd was moved to n; restore back to orig_fd after redir */
6672         /* moved_to = -1: fd was opened by redirect; close orig_fd after redir */
6673 };
6674
6675 static struct squirrel *append_squirrel(struct squirrel *sq, int i, int orig, int moved)
6676 {
6677         sq = xrealloc(sq, (i + 2) * sizeof(sq[0]));
6678         sq[i].orig_fd = orig;
6679         sq[i].moved_to = moved;
6680         sq[i+1].orig_fd = -1; /* end marker */
6681         return sq;
6682 }
6683
6684 static struct squirrel *add_squirrel(struct squirrel *sq, int fd, int avoid_fd)
6685 {
6686         int moved_to;
6687         int i = 0;
6688
6689         if (sq) while (sq[i].orig_fd >= 0) {
6690                 /* If we collide with an already moved fd... */
6691                 if (fd == sq[i].moved_to) {
6692                         sq[i].moved_to = fcntl_F_DUPFD(sq[i].moved_to, avoid_fd);
6693                         debug_printf_redir("redirect_fd %d: already busy, moving to %d\n", fd, sq[i].moved_to);
6694                         if (sq[i].moved_to < 0) /* what? */
6695                                 xfunc_die();
6696                         return sq;
6697                 }
6698                 if (fd == sq[i].orig_fd) {
6699                         /* Example: echo Hello >/dev/null 1>&2 */
6700                         debug_printf_redir("redirect_fd %d: already moved\n", fd);
6701                         return sq;
6702                 }
6703                 i++;
6704         }
6705
6706         /* If this fd is open, we move and remember it; if it's closed, moved_to = -1 */
6707         moved_to = fcntl_F_DUPFD(fd, avoid_fd);
6708         debug_printf_redir("redirect_fd %d: previous fd is moved to %d (-1 if it was closed)\n", fd, moved_to);
6709         if (moved_to < 0 && errno != EBADF)
6710                 xfunc_die();
6711         return append_squirrel(sq, i, fd, moved_to);
6712 }
6713
6714 /* fd: redirect wants this fd to be used (e.g. 3>file).
6715  * Move all conflicting internally used fds,
6716  * and remember them so that we can restore them later.
6717  */
6718 static int save_fds_on_redirect(int fd, int avoid_fd, struct squirrel **sqp)
6719 {
6720         if (avoid_fd < 9) /* the important case here is that it can be -1 */
6721                 avoid_fd = 9;
6722
6723 #if ENABLE_HUSH_INTERACTIVE
6724         if (fd != 0 && fd == G.interactive_fd) {
6725                 G.interactive_fd = xdup_and_close(G.interactive_fd, F_DUPFD_CLOEXEC, avoid_fd);
6726                 debug_printf_redir("redirect_fd %d: matches interactive_fd, moving it to %d\n", fd, G.interactive_fd);
6727                 return 1; /* "we closed fd" */
6728         }
6729 #endif
6730         /* Are we called from setup_redirects(squirrel==NULL)? Two cases:
6731          * (1) Redirect in a forked child. No need to save FILEs' fds,
6732          * we aren't going to use them anymore, ok to trash.
6733          * (2) "exec 3>FILE". Bummer. We can save script FILEs' fds,
6734          * but how are we doing to restore them?
6735          * "fileno(fd) = new_fd" can't be done.
6736          */
6737         if (!sqp)
6738                 return 0;
6739
6740         /* If this one of script's fds? */
6741         if (save_FILEs_on_redirect(fd, avoid_fd))
6742                 return 1; /* yes. "we closed fd" */
6743
6744         /* Check whether it collides with any open fds (e.g. stdio), save fds as needed */
6745         *sqp = add_squirrel(*sqp, fd, avoid_fd);
6746         return 0; /* "we did not close fd" */
6747 }
6748
6749 static void restore_redirects(struct squirrel *sq)
6750 {
6751
6752         if (sq) {
6753                 int i = 0;
6754                 while (sq[i].orig_fd >= 0) {
6755                         if (sq[i].moved_to >= 0) {
6756                                 /* We simply die on error */
6757                                 debug_printf_redir("restoring redirected fd from %d to %d\n", sq[i].moved_to, sq[i].orig_fd);
6758                                 xmove_fd(sq[i].moved_to, sq[i].orig_fd);
6759                         } else {
6760                                 /* cmd1 9>FILE; cmd2_should_see_fd9_closed */
6761                                 debug_printf_redir("restoring redirected fd %d: closing it\n", sq[i].orig_fd);
6762                                 close(sq[i].orig_fd);
6763                         }
6764                         i++;
6765                 }
6766                 free(sq);
6767         }
6768
6769         /* If moved, G.interactive_fd stays on new fd, not restoring it */
6770
6771         restore_redirected_FILEs();
6772 }
6773
6774 /* squirrel != NULL means we squirrel away copies of stdin, stdout,
6775  * and stderr if they are redirected. */
6776 static int setup_redirects(struct command *prog, struct squirrel **sqp)
6777 {
6778         int openfd, mode;
6779         struct redir_struct *redir;
6780
6781         for (redir = prog->redirects; redir; redir = redir->next) {
6782                 if (redir->rd_type == REDIRECT_HEREDOC2) {
6783                         /* "rd_fd<<HERE" case */
6784                         save_fds_on_redirect(redir->rd_fd, /*avoid:*/ 0, sqp);
6785                         /* for REDIRECT_HEREDOC2, rd_filename holds _contents_
6786                          * of the heredoc */
6787                         debug_printf_parse("set heredoc '%s'\n",
6788                                         redir->rd_filename);
6789                         setup_heredoc(redir);
6790                         continue;
6791                 }
6792
6793                 if (redir->rd_dup == REDIRFD_TO_FILE) {
6794                         /* "rd_fd<*>file" case (<*> is <,>,>>,<>) */
6795                         char *p;
6796                         if (redir->rd_filename == NULL) {
6797                                 /*
6798                                  * Examples:
6799                                  * "cmd >" (no filename)
6800                                  * "cmd > <file" (2nd redirect starts too early)
6801                                  */
6802                                 die_if_script("syntax error: %s", "invalid redirect");
6803                                 continue;
6804                         }
6805                         mode = redir_table[redir->rd_type].mode;
6806                         p = expand_string_to_string(redir->rd_filename, /*unbackslash:*/ 1);
6807                         openfd = open_or_warn(p, mode);
6808                         free(p);
6809                         if (openfd < 0) {
6810                                 /* Error message from open_or_warn can be lost
6811                                  * if stderr has been redirected, but bash
6812                                  * and ash both lose it as well
6813                                  * (though zsh doesn't!)
6814                                  */
6815                                 return 1;
6816                         }
6817                         if (openfd == redir->rd_fd && sqp) {
6818                                 /* open() gave us precisely the fd we wanted.
6819                                  * This means that this fd was not busy
6820                                  * (not opened to anywhere).
6821                                  * Remember to close it on restore:
6822                                  */
6823                                 struct squirrel *sq = *sqp;
6824                                 int i = 0;
6825                                 if (sq) while (sq[i].orig_fd >= 0)
6826                                         i++;
6827                                 *sqp = append_squirrel(sq, i, openfd, -1); /* -1 = "it was closed" */
6828                                 debug_printf_redir("redir to previously closed fd %d\n", openfd);
6829                         }
6830                 } else {
6831                         /* "rd_fd<*>rd_dup" or "rd_fd<*>-" cases */
6832                         openfd = redir->rd_dup;
6833                 }
6834
6835                 if (openfd != redir->rd_fd) {
6836                         int closed = save_fds_on_redirect(redir->rd_fd, /*avoid:*/ openfd, sqp);
6837                         if (openfd == REDIRFD_CLOSE) {
6838                                 /* "rd_fd >&-" means "close me" */
6839                                 if (!closed) {
6840                                         /* ^^^ optimization: saving may already
6841                                          * have closed it. If not... */
6842                                         close(redir->rd_fd);
6843                                 }
6844                         } else {
6845                                 xdup2(openfd, redir->rd_fd);
6846                                 if (redir->rd_dup == REDIRFD_TO_FILE)
6847                                         /* "rd_fd > FILE" */
6848                                         close(openfd);
6849                                 /* else: "rd_fd > rd_dup" */
6850                         }
6851                 }
6852         }
6853         return 0;
6854 }
6855
6856 static char *find_in_path(const char *arg)
6857 {
6858         char *ret = NULL;
6859         const char *PATH = get_local_var_value("PATH");
6860
6861         if (!PATH)
6862                 return NULL;
6863
6864         while (1) {
6865                 const char *end = strchrnul(PATH, ':');
6866                 int sz = end - PATH; /* must be int! */
6867
6868                 free(ret);
6869                 if (sz != 0) {
6870                         ret = xasprintf("%.*s/%s", sz, PATH, arg);
6871                 } else {
6872                         /* We have xxx::yyyy in $PATH,
6873                          * it means "use current dir" */
6874                         ret = xstrdup(arg);
6875                 }
6876                 if (access(ret, F_OK) == 0)
6877                         break;
6878
6879                 if (*end == '\0') {
6880                         free(ret);
6881                         return NULL;
6882                 }
6883                 PATH = end + 1;
6884         }
6885
6886         return ret;
6887 }
6888
6889 static const struct built_in_command *find_builtin_helper(const char *name,
6890                 const struct built_in_command *x,
6891                 const struct built_in_command *end)
6892 {
6893         while (x != end) {
6894                 if (strcmp(name, x->b_cmd) != 0) {
6895                         x++;
6896                         continue;
6897                 }
6898                 debug_printf_exec("found builtin '%s'\n", name);
6899                 return x;
6900         }
6901         return NULL;
6902 }
6903 static const struct built_in_command *find_builtin1(const char *name)
6904 {
6905         return find_builtin_helper(name, bltins1, &bltins1[ARRAY_SIZE(bltins1)]);
6906 }
6907 static const struct built_in_command *find_builtin(const char *name)
6908 {
6909         const struct built_in_command *x = find_builtin1(name);
6910         if (x)
6911                 return x;
6912         return find_builtin_helper(name, bltins2, &bltins2[ARRAY_SIZE(bltins2)]);
6913 }
6914
6915 #if ENABLE_HUSH_FUNCTIONS
6916 static struct function **find_function_slot(const char *name)
6917 {
6918         struct function **funcpp = &G.top_func;
6919         while (*funcpp) {
6920                 if (strcmp(name, (*funcpp)->name) == 0) {
6921                         break;
6922                 }
6923                 funcpp = &(*funcpp)->next;
6924         }
6925         return funcpp;
6926 }
6927
6928 static const struct function *find_function(const char *name)
6929 {
6930         const struct function *funcp = *find_function_slot(name);
6931         if (funcp)
6932                 debug_printf_exec("found function '%s'\n", name);
6933         return funcp;
6934 }
6935
6936 /* Note: takes ownership on name ptr */
6937 static struct function *new_function(char *name)
6938 {
6939         struct function **funcpp = find_function_slot(name);
6940         struct function *funcp = *funcpp;
6941
6942         if (funcp != NULL) {
6943                 struct command *cmd = funcp->parent_cmd;
6944                 debug_printf_exec("func %p parent_cmd %p\n", funcp, cmd);
6945                 if (!cmd) {
6946                         debug_printf_exec("freeing & replacing function '%s'\n", funcp->name);
6947                         free(funcp->name);
6948                         /* Note: if !funcp->body, do not free body_as_string!
6949                          * This is a special case of "-F name body" function:
6950                          * body_as_string was not malloced! */
6951                         if (funcp->body) {
6952                                 free_pipe_list(funcp->body);
6953 # if !BB_MMU
6954                                 free(funcp->body_as_string);
6955 # endif
6956                         }
6957                 } else {
6958                         debug_printf_exec("reinserting in tree & replacing function '%s'\n", funcp->name);
6959                         cmd->argv[0] = funcp->name;
6960                         cmd->group = funcp->body;
6961 # if !BB_MMU
6962                         cmd->group_as_string = funcp->body_as_string;
6963 # endif
6964                 }
6965         } else {
6966                 debug_printf_exec("remembering new function '%s'\n", name);
6967                 funcp = *funcpp = xzalloc(sizeof(*funcp));
6968                 /*funcp->next = NULL;*/
6969         }
6970
6971         funcp->name = name;
6972         return funcp;
6973 }
6974
6975 # if ENABLE_HUSH_UNSET
6976 static void unset_func(const char *name)
6977 {
6978         struct function **funcpp = find_function_slot(name);
6979         struct function *funcp = *funcpp;
6980
6981         if (funcp != NULL) {
6982                 debug_printf_exec("freeing function '%s'\n", funcp->name);
6983                 *funcpp = funcp->next;
6984                 /* funcp is unlinked now, deleting it.
6985                  * Note: if !funcp->body, the function was created by
6986                  * "-F name body", do not free ->body_as_string
6987                  * and ->name as they were not malloced. */
6988                 if (funcp->body) {
6989                         free_pipe_list(funcp->body);
6990                         free(funcp->name);
6991 #  if !BB_MMU
6992                         free(funcp->body_as_string);
6993 #  endif
6994                 }
6995                 free(funcp);
6996         }
6997 }
6998 # endif
6999
7000 # if BB_MMU
7001 #define exec_function(to_free, funcp, argv) \
7002         exec_function(funcp, argv)
7003 # endif
7004 static void exec_function(char ***to_free,
7005                 const struct function *funcp,
7006                 char **argv) NORETURN;
7007 static void exec_function(char ***to_free,
7008                 const struct function *funcp,
7009                 char **argv)
7010 {
7011 # if BB_MMU
7012         int n;
7013
7014         argv[0] = G.global_argv[0];
7015         G.global_argv = argv;
7016         G.global_argc = n = 1 + string_array_len(argv + 1);
7017         /* On MMU, funcp->body is always non-NULL */
7018         n = run_list(funcp->body);
7019         fflush_all();
7020         _exit(n);
7021 # else
7022         re_execute_shell(to_free,
7023                         funcp->body_as_string,
7024                         G.global_argv[0],
7025                         argv + 1,
7026                         NULL);
7027 # endif
7028 }
7029
7030 static int run_function(const struct function *funcp, char **argv)
7031 {
7032         int rc;
7033         save_arg_t sv;
7034         smallint sv_flg;
7035
7036         save_and_replace_G_args(&sv, argv);
7037
7038         /* "we are in function, ok to use return" */
7039         sv_flg = G_flag_return_in_progress;
7040         G_flag_return_in_progress = -1;
7041 # if ENABLE_HUSH_LOCAL
7042         G.func_nest_level++;
7043 # endif
7044
7045         /* On MMU, funcp->body is always non-NULL */
7046 # if !BB_MMU
7047         if (!funcp->body) {
7048                 /* Function defined by -F */
7049                 parse_and_run_string(funcp->body_as_string);
7050                 rc = G.last_exitcode;
7051         } else
7052 # endif
7053         {
7054                 rc = run_list(funcp->body);
7055         }
7056
7057 # if ENABLE_HUSH_LOCAL
7058         {
7059                 struct variable *var;
7060                 struct variable **var_pp;
7061
7062                 var_pp = &G.top_var;
7063                 while ((var = *var_pp) != NULL) {
7064                         if (var->func_nest_level < G.func_nest_level) {
7065                                 var_pp = &var->next;
7066                                 continue;
7067                         }
7068                         /* Unexport */
7069                         if (var->flg_export)
7070                                 bb_unsetenv(var->varstr);
7071                         /* Remove from global list */
7072                         *var_pp = var->next;
7073                         /* Free */
7074                         if (!var->max_len)
7075                                 free(var->varstr);
7076                         free(var);
7077                 }
7078                 G.func_nest_level--;
7079         }
7080 # endif
7081         G_flag_return_in_progress = sv_flg;
7082
7083         restore_G_args(&sv, argv);
7084
7085         return rc;
7086 }
7087 #endif /* ENABLE_HUSH_FUNCTIONS */
7088
7089
7090 #if BB_MMU
7091 #define exec_builtin(to_free, x, argv) \
7092         exec_builtin(x, argv)
7093 #else
7094 #define exec_builtin(to_free, x, argv) \
7095         exec_builtin(to_free, argv)
7096 #endif
7097 static void exec_builtin(char ***to_free,
7098                 const struct built_in_command *x,
7099                 char **argv) NORETURN;
7100 static void exec_builtin(char ***to_free,
7101                 const struct built_in_command *x,
7102                 char **argv)
7103 {
7104 #if BB_MMU
7105         int rcode;
7106         fflush_all();
7107         rcode = x->b_function(argv);
7108         fflush_all();
7109         _exit(rcode);
7110 #else
7111         fflush_all();
7112         /* On NOMMU, we must never block!
7113          * Example: { sleep 99 | read line; } & echo Ok
7114          */
7115         re_execute_shell(to_free,
7116                         argv[0],
7117                         G.global_argv[0],
7118                         G.global_argv + 1,
7119                         argv);
7120 #endif
7121 }
7122
7123
7124 static void execvp_or_die(char **argv) NORETURN;
7125 static void execvp_or_die(char **argv)
7126 {
7127         int e;
7128         debug_printf_exec("execing '%s'\n", argv[0]);
7129         /* Don't propagate SIG_IGN to the child */
7130         if (SPECIAL_JOBSTOP_SIGS != 0)
7131                 switch_off_special_sigs(G.special_sig_mask & SPECIAL_JOBSTOP_SIGS);
7132         execvp(argv[0], argv);
7133         e = 2;
7134         if (errno == EACCES) e = 126;
7135         if (errno == ENOENT) e = 127;
7136         bb_perror_msg("can't execute '%s'", argv[0]);
7137         _exit(e);
7138 }
7139
7140 #if ENABLE_HUSH_MODE_X
7141 static void dump_cmd_in_x_mode(char **argv)
7142 {
7143         if (G_x_mode && argv) {
7144                 /* We want to output the line in one write op */
7145                 char *buf, *p;
7146                 int len;
7147                 int n;
7148
7149                 len = 3;
7150                 n = 0;
7151                 while (argv[n])
7152                         len += strlen(argv[n++]) + 1;
7153                 buf = xmalloc(len);
7154                 buf[0] = '+';
7155                 p = buf + 1;
7156                 n = 0;
7157                 while (argv[n])
7158                         p += sprintf(p, " %s", argv[n++]);
7159                 *p++ = '\n';
7160                 *p = '\0';
7161                 fputs(buf, stderr);
7162                 free(buf);
7163         }
7164 }
7165 #else
7166 # define dump_cmd_in_x_mode(argv) ((void)0)
7167 #endif
7168
7169 #if BB_MMU
7170 #define pseudo_exec_argv(nommu_save, argv, assignment_cnt, argv_expanded) \
7171         pseudo_exec_argv(argv, assignment_cnt, argv_expanded)
7172 #define pseudo_exec(nommu_save, command, argv_expanded) \
7173         pseudo_exec(command, argv_expanded)
7174 #endif
7175
7176 /* Called after [v]fork() in run_pipe, or from builtin_exec.
7177  * Never returns.
7178  * Don't exit() here.  If you don't exec, use _exit instead.
7179  * The at_exit handlers apparently confuse the calling process,
7180  * in particular stdin handling. Not sure why? -- because of vfork! (vda)
7181  */
7182 static void pseudo_exec_argv(nommu_save_t *nommu_save,
7183                 char **argv, int assignment_cnt,
7184                 char **argv_expanded) NORETURN;
7185 static NOINLINE void pseudo_exec_argv(nommu_save_t *nommu_save,
7186                 char **argv, int assignment_cnt,
7187                 char **argv_expanded)
7188 {
7189         char **new_env;
7190
7191         new_env = expand_assignments(argv, assignment_cnt);
7192         dump_cmd_in_x_mode(new_env);
7193
7194         if (!argv[assignment_cnt]) {
7195                 /* Case when we are here: ... | var=val | ...
7196                  * (note that we do not exit early, i.e., do not optimize out
7197                  * expand_assignments(): think about ... | var=`sleep 1` | ...
7198                  */
7199                 free_strings(new_env);
7200                 _exit(EXIT_SUCCESS);
7201         }
7202
7203 #if BB_MMU
7204         set_vars_and_save_old(new_env);
7205         free(new_env); /* optional */
7206         /* we can also destroy set_vars_and_save_old's return value,
7207          * to save memory */
7208 #else
7209         nommu_save->new_env = new_env;
7210         nommu_save->old_vars = set_vars_and_save_old(new_env);
7211 #endif
7212
7213         if (argv_expanded) {
7214                 argv = argv_expanded;
7215         } else {
7216                 argv = expand_strvec_to_strvec(argv + assignment_cnt);
7217 #if !BB_MMU
7218                 nommu_save->argv = argv;
7219 #endif
7220         }
7221         dump_cmd_in_x_mode(argv);
7222
7223 #if ENABLE_FEATURE_SH_STANDALONE || BB_MMU
7224         if (strchr(argv[0], '/') != NULL)
7225                 goto skip;
7226 #endif
7227
7228         /* Check if the command matches any of the builtins.
7229          * Depending on context, this might be redundant.  But it's
7230          * easier to waste a few CPU cycles than it is to figure out
7231          * if this is one of those cases.
7232          */
7233         {
7234                 /* On NOMMU, it is more expensive to re-execute shell
7235                  * just in order to run echo or test builtin.
7236                  * It's better to skip it here and run corresponding
7237                  * non-builtin later. */
7238                 const struct built_in_command *x;
7239                 x = BB_MMU ? find_builtin(argv[0]) : find_builtin1(argv[0]);
7240                 if (x) {
7241                         exec_builtin(&nommu_save->argv_from_re_execing, x, argv);
7242                 }
7243         }
7244 #if ENABLE_HUSH_FUNCTIONS
7245         /* Check if the command matches any functions */
7246         {
7247                 const struct function *funcp = find_function(argv[0]);
7248                 if (funcp) {
7249                         exec_function(&nommu_save->argv_from_re_execing, funcp, argv);
7250                 }
7251         }
7252 #endif
7253
7254 #if ENABLE_FEATURE_SH_STANDALONE
7255         /* Check if the command matches any busybox applets */
7256         {
7257                 int a = find_applet_by_name(argv[0]);
7258                 if (a >= 0) {
7259 # if BB_MMU /* see above why on NOMMU it is not allowed */
7260                         if (APPLET_IS_NOEXEC(a)) {
7261                                 /* Do not leak open fds from opened script files etc */
7262                                 close_all_FILE_list();
7263                                 debug_printf_exec("running applet '%s'\n", argv[0]);
7264                                 run_applet_no_and_exit(a, argv[0], argv);
7265                         }
7266 # endif
7267                         /* Re-exec ourselves */
7268                         debug_printf_exec("re-execing applet '%s'\n", argv[0]);
7269                         /* Don't propagate SIG_IGN to the child */
7270                         if (SPECIAL_JOBSTOP_SIGS != 0)
7271                                 switch_off_special_sigs(G.special_sig_mask & SPECIAL_JOBSTOP_SIGS);
7272                         execv(bb_busybox_exec_path, argv);
7273                         /* If they called chroot or otherwise made the binary no longer
7274                          * executable, fall through */
7275                 }
7276         }
7277 #endif
7278
7279 #if ENABLE_FEATURE_SH_STANDALONE || BB_MMU
7280  skip:
7281 #endif
7282         execvp_or_die(argv);
7283 }
7284
7285 /* Called after [v]fork() in run_pipe
7286  */
7287 static void pseudo_exec(nommu_save_t *nommu_save,
7288                 struct command *command,
7289                 char **argv_expanded) NORETURN;
7290 static void pseudo_exec(nommu_save_t *nommu_save,
7291                 struct command *command,
7292                 char **argv_expanded)
7293 {
7294         if (command->argv) {
7295                 pseudo_exec_argv(nommu_save, command->argv,
7296                                 command->assignment_cnt, argv_expanded);
7297         }
7298
7299         if (command->group) {
7300                 /* Cases when we are here:
7301                  * ( list )
7302                  * { list } &
7303                  * ... | ( list ) | ...
7304                  * ... | { list } | ...
7305                  */
7306 #if BB_MMU
7307                 int rcode;
7308                 debug_printf_exec("pseudo_exec: run_list\n");
7309                 reset_traps_to_defaults();
7310                 rcode = run_list(command->group);
7311                 /* OK to leak memory by not calling free_pipe_list,
7312                  * since this process is about to exit */
7313                 _exit(rcode);
7314 #else
7315                 re_execute_shell(&nommu_save->argv_from_re_execing,
7316                                 command->group_as_string,
7317                                 G.global_argv[0],
7318                                 G.global_argv + 1,
7319                                 NULL);
7320 #endif
7321         }
7322
7323         /* Case when we are here: ... | >file */
7324         debug_printf_exec("pseudo_exec'ed null command\n");
7325         _exit(EXIT_SUCCESS);
7326 }
7327
7328 #if ENABLE_HUSH_JOB
7329 static const char *get_cmdtext(struct pipe *pi)
7330 {
7331         char **argv;
7332         char *p;
7333         int len;
7334
7335         /* This is subtle. ->cmdtext is created only on first backgrounding.
7336          * (Think "cat, <ctrl-z>, fg, <ctrl-z>, fg, <ctrl-z>...." here...)
7337          * On subsequent bg argv is trashed, but we won't use it */
7338         if (pi->cmdtext)
7339                 return pi->cmdtext;
7340
7341         argv = pi->cmds[0].argv;
7342         if (!argv) {
7343                 pi->cmdtext = xzalloc(1);
7344                 return pi->cmdtext;
7345         }
7346         len = 0;
7347         do {
7348                 len += strlen(*argv) + 1;
7349         } while (*++argv);
7350         p = xmalloc(len);
7351         pi->cmdtext = p;
7352         argv = pi->cmds[0].argv;
7353         do {
7354                 p = stpcpy(p, *argv);
7355                 *p++ = ' ';
7356         } while (*++argv);
7357         p[-1] = '\0';
7358         return pi->cmdtext;
7359 }
7360
7361 static void remove_job_from_table(struct pipe *pi)
7362 {
7363         struct pipe *prev_pipe;
7364
7365         if (pi == G.job_list) {
7366                 G.job_list = pi->next;
7367         } else {
7368                 prev_pipe = G.job_list;
7369                 while (prev_pipe->next != pi)
7370                         prev_pipe = prev_pipe->next;
7371                 prev_pipe->next = pi->next;
7372         }
7373         G.last_jobid = 0;
7374         if (G.job_list)
7375                 G.last_jobid = G.job_list->jobid;
7376 }
7377
7378 static void delete_finished_job(struct pipe *pi)
7379 {
7380         remove_job_from_table(pi);
7381         free_pipe(pi);
7382 }
7383
7384 static void clean_up_last_dead_job(void)
7385 {
7386         if (G.job_list && !G.job_list->alive_cmds)
7387                 delete_finished_job(G.job_list);
7388 }
7389
7390 static void insert_job_into_table(struct pipe *pi)
7391 {
7392         struct pipe *job, **jobp;
7393         int i;
7394
7395         clean_up_last_dead_job();
7396
7397         /* Find the end of the list, and find next job ID to use */
7398         i = 0;
7399         jobp = &G.job_list;
7400         while ((job = *jobp) != NULL) {
7401                 if (job->jobid > i)
7402                         i = job->jobid;
7403                 jobp = &job->next;
7404         }
7405         pi->jobid = i + 1;
7406
7407         /* Create a new job struct at the end */
7408         job = *jobp = xmemdup(pi, sizeof(*pi));
7409         job->next = NULL;
7410         job->cmds = xzalloc(sizeof(pi->cmds[0]) * pi->num_cmds);
7411         /* Cannot copy entire pi->cmds[] vector! This causes double frees */
7412         for (i = 0; i < pi->num_cmds; i++) {
7413                 job->cmds[i].pid = pi->cmds[i].pid;
7414                 /* all other fields are not used and stay zero */
7415         }
7416         job->cmdtext = xstrdup(get_cmdtext(pi));
7417
7418         if (G_interactive_fd)
7419                 printf("[%u] %u %s\n", job->jobid, (unsigned)job->cmds[0].pid, job->cmdtext);
7420         G.last_jobid = job->jobid;
7421 }
7422 #endif /* JOB */
7423
7424 static int job_exited_or_stopped(struct pipe *pi)
7425 {
7426         int rcode, i;
7427
7428         if (pi->alive_cmds != pi->stopped_cmds)
7429                 return -1;
7430
7431         /* All processes in fg pipe have exited or stopped */
7432         rcode = 0;
7433         i = pi->num_cmds;
7434         while (--i >= 0) {
7435                 rcode = pi->cmds[i].cmd_exitcode;
7436                 /* usually last process gives overall exitstatus,
7437                  * but with "set -o pipefail", last *failed* process does */
7438                 if (G.o_opt[OPT_O_PIPEFAIL] == 0 || rcode != 0)
7439                         break;
7440         }
7441         IF_HAS_KEYWORDS(if (pi->pi_inverted) rcode = !rcode;)
7442         return rcode;
7443 }
7444
7445 static int process_wait_result(struct pipe *fg_pipe, pid_t childpid, int status)
7446 {
7447 #if ENABLE_HUSH_JOB
7448         struct pipe *pi;
7449 #endif
7450         int i, dead;
7451
7452         dead = WIFEXITED(status) || WIFSIGNALED(status);
7453
7454 #if DEBUG_JOBS
7455         if (WIFSTOPPED(status))
7456                 debug_printf_jobs("pid %d stopped by sig %d (exitcode %d)\n",
7457                                 childpid, WSTOPSIG(status), WEXITSTATUS(status));
7458         if (WIFSIGNALED(status))
7459                 debug_printf_jobs("pid %d killed by sig %d (exitcode %d)\n",
7460                                 childpid, WTERMSIG(status), WEXITSTATUS(status));
7461         if (WIFEXITED(status))
7462                 debug_printf_jobs("pid %d exited, exitcode %d\n",
7463                                 childpid, WEXITSTATUS(status));
7464 #endif
7465         /* Were we asked to wait for a fg pipe? */
7466         if (fg_pipe) {
7467                 i = fg_pipe->num_cmds;
7468
7469                 while (--i >= 0) {
7470                         int rcode;
7471
7472                         debug_printf_jobs("check pid %d\n", fg_pipe->cmds[i].pid);
7473                         if (fg_pipe->cmds[i].pid != childpid)
7474                                 continue;
7475                         if (dead) {
7476                                 int ex;
7477                                 fg_pipe->cmds[i].pid = 0;
7478                                 fg_pipe->alive_cmds--;
7479                                 ex = WEXITSTATUS(status);
7480                                 /* bash prints killer signal's name for *last*
7481                                  * process in pipe (prints just newline for SIGINT/SIGPIPE).
7482                                  * Mimic this. Example: "sleep 5" + (^\ or kill -QUIT)
7483                                  */
7484                                 if (WIFSIGNALED(status)) {
7485                                         int sig = WTERMSIG(status);
7486                                         if (i == fg_pipe->num_cmds-1)
7487                                                 /* TODO: use strsignal() instead for bash compat? but that's bloat... */
7488                                                 puts(sig == SIGINT || sig == SIGPIPE ? "" : get_signame(sig));
7489                                         /* TODO: if (WCOREDUMP(status)) + " (core dumped)"; */
7490                                         /* TODO: MIPS has 128 sigs (1..128), what if sig==128 here?
7491                                          * Maybe we need to use sig | 128? */
7492                                         ex = sig + 128;
7493                                 }
7494                                 fg_pipe->cmds[i].cmd_exitcode = ex;
7495                         } else {
7496                                 fg_pipe->stopped_cmds++;
7497                         }
7498                         debug_printf_jobs("fg_pipe: alive_cmds %d stopped_cmds %d\n",
7499                                         fg_pipe->alive_cmds, fg_pipe->stopped_cmds);
7500                         rcode = job_exited_or_stopped(fg_pipe);
7501                         if (rcode >= 0) {
7502 /* Note: *non-interactive* bash does not continue if all processes in fg pipe
7503  * are stopped. Testcase: "cat | cat" in a script (not on command line!)
7504  * and "killall -STOP cat" */
7505                                 if (G_interactive_fd) {
7506 #if ENABLE_HUSH_JOB
7507                                         if (fg_pipe->alive_cmds != 0)
7508                                                 insert_job_into_table(fg_pipe);
7509 #endif
7510                                         return rcode;
7511                                 }
7512                                 if (fg_pipe->alive_cmds == 0)
7513                                         return rcode;
7514                         }
7515                         /* There are still running processes in the fg_pipe */
7516                         return -1;
7517                 }
7518                 /* It wasn't in fg_pipe, look for process in bg pipes */
7519         }
7520
7521 #if ENABLE_HUSH_JOB
7522         /* We were asked to wait for bg or orphaned children */
7523         /* No need to remember exitcode in this case */
7524         for (pi = G.job_list; pi; pi = pi->next) {
7525                 for (i = 0; i < pi->num_cmds; i++) {
7526                         if (pi->cmds[i].pid == childpid)
7527                                 goto found_pi_and_prognum;
7528                 }
7529         }
7530         /* Happens when shell is used as init process (init=/bin/sh) */
7531         debug_printf("checkjobs: pid %d was not in our list!\n", childpid);
7532         return -1; /* this wasn't a process from fg_pipe */
7533
7534  found_pi_and_prognum:
7535         if (dead) {
7536                 /* child exited */
7537                 int rcode = WEXITSTATUS(status);
7538                 if (WIFSIGNALED(status))
7539                         rcode = 128 + WTERMSIG(status);
7540                 pi->cmds[i].cmd_exitcode = rcode;
7541                 if (G.last_bg_pid == pi->cmds[i].pid)
7542                         G.last_bg_pid_exitcode = rcode;
7543                 pi->cmds[i].pid = 0;
7544                 pi->alive_cmds--;
7545                 if (!pi->alive_cmds) {
7546                         if (G_interactive_fd) {
7547                                 printf(JOB_STATUS_FORMAT, pi->jobid,
7548                                                 "Done", pi->cmdtext);
7549                                 delete_finished_job(pi);
7550                         } else {
7551 /*
7552  * bash deletes finished jobs from job table only in interactive mode,
7553  * after "jobs" cmd, or if pid of a new process matches one of the old ones
7554  * (see cleanup_dead_jobs(), delete_old_job(), J_NOTIFIED in bash source).
7555  * Testcase script: "(exit 3) & sleep 1; wait %1; echo $?" prints 3 in bash.
7556  * We only retain one "dead" job, if it's the single job on the list.
7557  * This covers most of real-world scenarios where this is useful.
7558  */
7559                                 if (pi != G.job_list)
7560                                         delete_finished_job(pi);
7561                         }
7562                 }
7563         } else {
7564                 /* child stopped */
7565                 pi->stopped_cmds++;
7566         }
7567 #endif
7568         return -1; /* this wasn't a process from fg_pipe */
7569 }
7570
7571 /* Check to see if any processes have exited -- if they have,
7572  * figure out why and see if a job has completed.
7573  *
7574  * If non-NULL fg_pipe: wait for its completion or stop.
7575  * Return its exitcode or zero if stopped.
7576  *
7577  * Alternatively (fg_pipe == NULL, waitfor_pid != 0):
7578  * waitpid(WNOHANG), if waitfor_pid exits or stops, return exitcode+1,
7579  * else return <0 if waitpid errors out (e.g. ECHILD: nothing to wait for)
7580  * or 0 if no children changed status.
7581  *
7582  * Alternatively (fg_pipe == NULL, waitfor_pid == 0),
7583  * return <0 if waitpid errors out (e.g. ECHILD: nothing to wait for)
7584  * or 0 if no children changed status.
7585  */
7586 static int checkjobs(struct pipe *fg_pipe, pid_t waitfor_pid)
7587 {
7588         int attributes;
7589         int status;
7590         int rcode = 0;
7591
7592         debug_printf_jobs("checkjobs %p\n", fg_pipe);
7593
7594         attributes = WUNTRACED;
7595         if (fg_pipe == NULL)
7596                 attributes |= WNOHANG;
7597
7598         errno = 0;
7599 #if ENABLE_HUSH_FAST
7600         if (G.handled_SIGCHLD == G.count_SIGCHLD) {
7601 //bb_error_msg("[%d] checkjobs: G.count_SIGCHLD:%d G.handled_SIGCHLD:%d children?:%d fg_pipe:%p",
7602 //getpid(), G.count_SIGCHLD, G.handled_SIGCHLD, G.we_have_children, fg_pipe);
7603                 /* There was neither fork nor SIGCHLD since last waitpid */
7604                 /* Avoid doing waitpid syscall if possible */
7605                 if (!G.we_have_children) {
7606                         errno = ECHILD;
7607                         return -1;
7608                 }
7609                 if (fg_pipe == NULL) { /* is WNOHANG set? */
7610                         /* We have children, but they did not exit
7611                          * or stop yet (we saw no SIGCHLD) */
7612                         return 0;
7613                 }
7614                 /* else: !WNOHANG, waitpid will block, can't short-circuit */
7615         }
7616 #endif
7617
7618 /* Do we do this right?
7619  * bash-3.00# sleep 20 | false
7620  * <ctrl-Z pressed>
7621  * [3]+  Stopped          sleep 20 | false
7622  * bash-3.00# echo $?
7623  * 1   <========== bg pipe is not fully done, but exitcode is already known!
7624  * [hush 1.14.0: yes we do it right]
7625  */
7626         while (1) {
7627                 pid_t childpid;
7628 #if ENABLE_HUSH_FAST
7629                 int i;
7630                 i = G.count_SIGCHLD;
7631 #endif
7632                 childpid = waitpid(-1, &status, attributes);
7633                 if (childpid <= 0) {
7634                         if (childpid && errno != ECHILD)
7635                                 bb_perror_msg("waitpid");
7636 #if ENABLE_HUSH_FAST
7637                         else { /* Until next SIGCHLD, waitpid's are useless */
7638                                 G.we_have_children = (childpid == 0);
7639                                 G.handled_SIGCHLD = i;
7640 //bb_error_msg("[%d] checkjobs: waitpid returned <= 0, G.count_SIGCHLD:%d G.handled_SIGCHLD:%d", getpid(), G.count_SIGCHLD, G.handled_SIGCHLD);
7641                         }
7642 #endif
7643                         /* ECHILD (no children), or 0 (no change in children status) */
7644                         rcode = childpid;
7645                         break;
7646                 }
7647                 rcode = process_wait_result(fg_pipe, childpid, status);
7648                 if (rcode >= 0) {
7649                         /* fg_pipe exited or stopped */
7650                         break;
7651                 }
7652                 if (childpid == waitfor_pid) {
7653                         debug_printf_exec("childpid==waitfor_pid:%d status:0x%08x\n", childpid, status);
7654                         rcode = WEXITSTATUS(status);
7655                         if (WIFSIGNALED(status))
7656                                 rcode = 128 + WTERMSIG(status);
7657                         if (WIFSTOPPED(status))
7658                                 /* bash: "cmd & wait $!" and cmd stops: $? = 128 + stopsig */
7659                                 rcode = 128 + WSTOPSIG(status);
7660                         rcode++;
7661                         break; /* "wait PID" called us, give it exitcode+1 */
7662                 }
7663                 /* This wasn't one of our processes, or */
7664                 /* fg_pipe still has running processes, do waitpid again */
7665         } /* while (waitpid succeeds)... */
7666
7667         return rcode;
7668 }
7669
7670 #if ENABLE_HUSH_JOB
7671 static int checkjobs_and_fg_shell(struct pipe *fg_pipe)
7672 {
7673         pid_t p;
7674         int rcode = checkjobs(fg_pipe, 0 /*(no pid to wait for)*/);
7675         if (G_saved_tty_pgrp) {
7676                 /* Job finished, move the shell to the foreground */
7677                 p = getpgrp(); /* our process group id */
7678                 debug_printf_jobs("fg'ing ourself: getpgrp()=%d\n", (int)p);
7679                 tcsetpgrp(G_interactive_fd, p);
7680         }
7681         return rcode;
7682 }
7683 #endif
7684
7685 /* Start all the jobs, but don't wait for anything to finish.
7686  * See checkjobs().
7687  *
7688  * Return code is normally -1, when the caller has to wait for children
7689  * to finish to determine the exit status of the pipe.  If the pipe
7690  * is a simple builtin command, however, the action is done by the
7691  * time run_pipe returns, and the exit code is provided as the
7692  * return value.
7693  *
7694  * Returns -1 only if started some children. IOW: we have to
7695  * mask out retvals of builtins etc with 0xff!
7696  *
7697  * The only case when we do not need to [v]fork is when the pipe
7698  * is single, non-backgrounded, non-subshell command. Examples:
7699  * cmd ; ...   { list } ; ...
7700  * cmd && ...  { list } && ...
7701  * cmd || ...  { list } || ...
7702  * If it is, then we can run cmd as a builtin, NOFORK,
7703  * or (if SH_STANDALONE) an applet, and we can run the { list }
7704  * with run_list. If it isn't one of these, we fork and exec cmd.
7705  *
7706  * Cases when we must fork:
7707  * non-single:   cmd | cmd
7708  * backgrounded: cmd &     { list } &
7709  * subshell:     ( list ) [&]
7710  */
7711 #if !ENABLE_HUSH_MODE_X
7712 #define redirect_and_varexp_helper(new_env_p, old_vars_p, command, squirrel, argv_expanded) \
7713         redirect_and_varexp_helper(new_env_p, old_vars_p, command, squirrel)
7714 #endif
7715 static int redirect_and_varexp_helper(char ***new_env_p,
7716                 struct variable **old_vars_p,
7717                 struct command *command,
7718                 struct squirrel **sqp,
7719                 char **argv_expanded)
7720 {
7721         /* setup_redirects acts on file descriptors, not FILEs.
7722          * This is perfect for work that comes after exec().
7723          * Is it really safe for inline use?  Experimentally,
7724          * things seem to work. */
7725         int rcode = setup_redirects(command, sqp);
7726         if (rcode == 0) {
7727                 char **new_env = expand_assignments(command->argv, command->assignment_cnt);
7728                 *new_env_p = new_env;
7729                 dump_cmd_in_x_mode(new_env);
7730                 dump_cmd_in_x_mode(argv_expanded);
7731                 if (old_vars_p)
7732                         *old_vars_p = set_vars_and_save_old(new_env);
7733         }
7734         return rcode;
7735 }
7736 static NOINLINE int run_pipe(struct pipe *pi)
7737 {
7738         static const char *const null_ptr = NULL;
7739
7740         int cmd_no;
7741         int next_infd;
7742         struct command *command;
7743         char **argv_expanded;
7744         char **argv;
7745         struct squirrel *squirrel = NULL;
7746         int rcode;
7747
7748         debug_printf_exec("run_pipe start: members:%d\n", pi->num_cmds);
7749         debug_enter();
7750
7751         /* Testcase: set -- q w e; (IFS='' echo "$*"; IFS=''; echo "$*"); echo "$*"
7752          * Result should be 3 lines: q w e, qwe, q w e
7753          */
7754         G.ifs = get_local_var_value("IFS");
7755         if (!G.ifs)
7756                 G.ifs = defifs;
7757
7758         IF_HUSH_JOB(pi->pgrp = -1;)
7759         pi->stopped_cmds = 0;
7760         command = &pi->cmds[0];
7761         argv_expanded = NULL;
7762
7763         if (pi->num_cmds != 1
7764          || pi->followup == PIPE_BG
7765          || command->cmd_type == CMD_SUBSHELL
7766         ) {
7767                 goto must_fork;
7768         }
7769
7770         pi->alive_cmds = 1;
7771
7772         debug_printf_exec(": group:%p argv:'%s'\n",
7773                 command->group, command->argv ? command->argv[0] : "NONE");
7774
7775         if (command->group) {
7776 #if ENABLE_HUSH_FUNCTIONS
7777                 if (command->cmd_type == CMD_FUNCDEF) {
7778                         /* "executing" func () { list } */
7779                         struct function *funcp;
7780
7781                         funcp = new_function(command->argv[0]);
7782                         /* funcp->name is already set to argv[0] */
7783                         funcp->body = command->group;
7784 # if !BB_MMU
7785                         funcp->body_as_string = command->group_as_string;
7786                         command->group_as_string = NULL;
7787 # endif
7788                         command->group = NULL;
7789                         command->argv[0] = NULL;
7790                         debug_printf_exec("cmd %p has child func at %p\n", command, funcp);
7791                         funcp->parent_cmd = command;
7792                         command->child_func = funcp;
7793
7794                         debug_printf_exec("run_pipe: return EXIT_SUCCESS\n");
7795                         debug_leave();
7796                         return EXIT_SUCCESS;
7797                 }
7798 #endif
7799                 /* { list } */
7800                 debug_printf("non-subshell group\n");
7801                 rcode = 1; /* exitcode if redir failed */
7802                 if (setup_redirects(command, &squirrel) == 0) {
7803                         debug_printf_exec(": run_list\n");
7804                         rcode = run_list(command->group) & 0xff;
7805                 }
7806                 restore_redirects(squirrel);
7807                 IF_HAS_KEYWORDS(if (pi->pi_inverted) rcode = !rcode;)
7808                 debug_leave();
7809                 debug_printf_exec("run_pipe: return %d\n", rcode);
7810                 return rcode;
7811         }
7812
7813         argv = command->argv ? command->argv : (char **) &null_ptr;
7814         {
7815                 const struct built_in_command *x;
7816 #if ENABLE_HUSH_FUNCTIONS
7817                 const struct function *funcp;
7818 #else
7819                 enum { funcp = 0 };
7820 #endif
7821                 char **new_env = NULL;
7822                 struct variable *old_vars = NULL;
7823
7824                 if (argv[command->assignment_cnt] == NULL) {
7825                         /* Assignments, but no command */
7826                         /* Ensure redirects take effect (that is, create files).
7827                          * Try "a=t >file" */
7828 #if 0 /* A few cases in testsuite fail with this code. FIXME */
7829                         rcode = redirect_and_varexp_helper(&new_env, /*old_vars:*/ NULL, command, &squirrel, /*argv_expanded:*/ NULL);
7830                         /* Set shell variables */
7831                         if (new_env) {
7832                                 argv = new_env;
7833                                 while (*argv) {
7834                                         if (set_local_var(*argv, /*flag:*/ 0)) {
7835                                                 /* assignment to readonly var / putenv error? */
7836                                                 rcode = 1;
7837                                         }
7838                                         argv++;
7839                                 }
7840                         }
7841                         /* Redirect error sets $? to 1. Otherwise,
7842                          * if evaluating assignment value set $?, retain it.
7843                          * Try "false; q=`exit 2`; echo $?" - should print 2: */
7844                         if (rcode == 0)
7845                                 rcode = G.last_exitcode;
7846                         /* Exit, _skipping_ variable restoring code: */
7847                         goto clean_up_and_ret0;
7848
7849 #else /* Older, bigger, but more correct code */
7850
7851                         rcode = setup_redirects(command, &squirrel);
7852                         restore_redirects(squirrel);
7853                         /* Set shell variables */
7854                         if (G_x_mode)
7855                                 bb_putchar_stderr('+');
7856                         while (*argv) {
7857                                 char *p = expand_string_to_string(*argv, /*unbackslash:*/ 1);
7858                                 if (G_x_mode)
7859                                         fprintf(stderr, " %s", p);
7860                                 debug_printf_exec("set shell var:'%s'->'%s'\n",
7861                                                 *argv, p);
7862                                 if (set_local_var(p, /*flag:*/ 0)) {
7863                                         /* assignment to readonly var / putenv error? */
7864                                         rcode = 1;
7865                                 }
7866                                 argv++;
7867                         }
7868                         if (G_x_mode)
7869                                 bb_putchar_stderr('\n');
7870                         /* Redirect error sets $? to 1. Otherwise,
7871                          * if evaluating assignment value set $?, retain it.
7872                          * Try "false; q=`exit 2`; echo $?" - should print 2: */
7873                         if (rcode == 0)
7874                                 rcode = G.last_exitcode;
7875                         IF_HAS_KEYWORDS(if (pi->pi_inverted) rcode = !rcode;)
7876                         debug_leave();
7877                         debug_printf_exec("run_pipe: return %d\n", rcode);
7878                         return rcode;
7879 #endif
7880                 }
7881
7882                 /* Expand the rest into (possibly) many strings each */
7883 #if BASH_TEST2
7884                 if (command->cmd_type == CMD_SINGLEWORD_NOGLOB) {
7885                         argv_expanded = expand_strvec_to_strvec_singleword_noglob(argv + command->assignment_cnt);
7886                 } else
7887 #endif
7888                 {
7889                         argv_expanded = expand_strvec_to_strvec(argv + command->assignment_cnt);
7890                 }
7891
7892                 /* if someone gives us an empty string: `cmd with empty output` */
7893                 if (!argv_expanded[0]) {
7894                         free(argv_expanded);
7895                         debug_leave();
7896                         return G.last_exitcode;
7897                 }
7898
7899                 x = find_builtin(argv_expanded[0]);
7900 #if ENABLE_HUSH_FUNCTIONS
7901                 funcp = NULL;
7902                 if (!x)
7903                         funcp = find_function(argv_expanded[0]);
7904 #endif
7905                 if (x || funcp) {
7906                         if (!funcp) {
7907                                 if (x->b_function == builtin_exec && argv_expanded[1] == NULL) {
7908                                         debug_printf("exec with redirects only\n");
7909                                         rcode = setup_redirects(command, NULL);
7910                                         /* rcode=1 can be if redir file can't be opened */
7911                                         goto clean_up_and_ret1;
7912                                 }
7913                         }
7914                         rcode = redirect_and_varexp_helper(&new_env, &old_vars, command, &squirrel, argv_expanded);
7915                         if (rcode == 0) {
7916                                 if (!funcp) {
7917                                         debug_printf_exec(": builtin '%s' '%s'...\n",
7918                                                 x->b_cmd, argv_expanded[1]);
7919                                         fflush_all();
7920                                         rcode = x->b_function(argv_expanded) & 0xff;
7921                                         fflush_all();
7922                                 }
7923 #if ENABLE_HUSH_FUNCTIONS
7924                                 else {
7925 # if ENABLE_HUSH_LOCAL
7926                                         struct variable **sv;
7927                                         sv = G.shadowed_vars_pp;
7928                                         G.shadowed_vars_pp = &old_vars;
7929 # endif
7930                                         debug_printf_exec(": function '%s' '%s'...\n",
7931                                                 funcp->name, argv_expanded[1]);
7932                                         rcode = run_function(funcp, argv_expanded) & 0xff;
7933 # if ENABLE_HUSH_LOCAL
7934                                         G.shadowed_vars_pp = sv;
7935 # endif
7936                                 }
7937 #endif
7938                         }
7939  clean_up_and_ret:
7940                         unset_vars(new_env);
7941                         add_vars(old_vars);
7942 /* clean_up_and_ret0: */
7943                         restore_redirects(squirrel);
7944  clean_up_and_ret1:
7945                         free(argv_expanded);
7946                         IF_HAS_KEYWORDS(if (pi->pi_inverted) rcode = !rcode;)
7947                         debug_leave();
7948                         debug_printf_exec("run_pipe return %d\n", rcode);
7949                         return rcode;
7950                 }
7951
7952                 if (ENABLE_FEATURE_SH_NOFORK) {
7953                         int n = find_applet_by_name(argv_expanded[0]);
7954                         if (n >= 0 && APPLET_IS_NOFORK(n)) {
7955                                 rcode = redirect_and_varexp_helper(&new_env, &old_vars, command, &squirrel, argv_expanded);
7956                                 if (rcode == 0) {
7957                                         debug_printf_exec(": run_nofork_applet '%s' '%s'...\n",
7958                                                 argv_expanded[0], argv_expanded[1]);
7959                                         rcode = run_nofork_applet(n, argv_expanded);
7960                                 }
7961                                 goto clean_up_and_ret;
7962                         }
7963                 }
7964                 /* It is neither builtin nor applet. We must fork. */
7965         }
7966
7967  must_fork:
7968         /* NB: argv_expanded may already be created, and that
7969          * might include `cmd` runs! Do not rerun it! We *must*
7970          * use argv_expanded if it's non-NULL */
7971
7972         /* Going to fork a child per each pipe member */
7973         pi->alive_cmds = 0;
7974         next_infd = 0;
7975
7976         cmd_no = 0;
7977         while (cmd_no < pi->num_cmds) {
7978                 struct fd_pair pipefds;
7979 #if !BB_MMU
7980                 volatile nommu_save_t nommu_save;
7981                 nommu_save.new_env = NULL;
7982                 nommu_save.old_vars = NULL;
7983                 nommu_save.argv = NULL;
7984                 nommu_save.argv_from_re_execing = NULL;
7985 #endif
7986                 command = &pi->cmds[cmd_no];
7987                 cmd_no++;
7988                 if (command->argv) {
7989                         debug_printf_exec(": pipe member '%s' '%s'...\n",
7990                                         command->argv[0], command->argv[1]);
7991                 } else {
7992                         debug_printf_exec(": pipe member with no argv\n");
7993                 }
7994
7995                 /* pipes are inserted between pairs of commands */
7996                 pipefds.rd = 0;
7997                 pipefds.wr = 1;
7998                 if (cmd_no < pi->num_cmds)
7999                         xpiped_pair(pipefds);
8000
8001                 command->pid = BB_MMU ? fork() : vfork();
8002                 if (!command->pid) { /* child */
8003 #if ENABLE_HUSH_JOB
8004                         disable_restore_tty_pgrp_on_exit();
8005                         CLEAR_RANDOM_T(&G.random_gen); /* or else $RANDOM repeats in child */
8006
8007                         /* Every child adds itself to new process group
8008                          * with pgid == pid_of_first_child_in_pipe */
8009                         if (G.run_list_level == 1 && G_interactive_fd) {
8010                                 pid_t pgrp;
8011                                 pgrp = pi->pgrp;
8012                                 if (pgrp < 0) /* true for 1st process only */
8013                                         pgrp = getpid();
8014                                 if (setpgid(0, pgrp) == 0
8015                                  && pi->followup != PIPE_BG
8016                                  && G_saved_tty_pgrp /* we have ctty */
8017                                 ) {
8018                                         /* We do it in *every* child, not just first,
8019                                          * to avoid races */
8020                                         tcsetpgrp(G_interactive_fd, pgrp);
8021                                 }
8022                         }
8023 #endif
8024                         if (pi->alive_cmds == 0 && pi->followup == PIPE_BG) {
8025                                 /* 1st cmd in backgrounded pipe
8026                                  * should have its stdin /dev/null'ed */
8027                                 close(0);
8028                                 if (open(bb_dev_null, O_RDONLY))
8029                                         xopen("/", O_RDONLY);
8030                         } else {
8031                                 xmove_fd(next_infd, 0);
8032                         }
8033                         xmove_fd(pipefds.wr, 1);
8034                         if (pipefds.rd > 1)
8035                                 close(pipefds.rd);
8036                         /* Like bash, explicit redirects override pipes,
8037                          * and the pipe fd (fd#1) is available for dup'ing:
8038                          * "cmd1 2>&1 | cmd2": fd#1 is duped to fd#2, thus stderr
8039                          * of cmd1 goes into pipe.
8040                          */
8041                         if (setup_redirects(command, NULL)) {
8042                                 /* Happens when redir file can't be opened:
8043                                  * $ hush -c 'echo FOO >&2 | echo BAR 3>/qwe/rty; echo BAZ'
8044                                  * FOO
8045                                  * hush: can't open '/qwe/rty': No such file or directory
8046                                  * BAZ
8047                                  * (echo BAR is not executed, it hits _exit(1) below)
8048                                  */
8049                                 _exit(1);
8050                         }
8051
8052                         /* Stores to nommu_save list of env vars putenv'ed
8053                          * (NOMMU, on MMU we don't need that) */
8054                         /* cast away volatility... */
8055                         pseudo_exec((nommu_save_t*) &nommu_save, command, argv_expanded);
8056                         /* pseudo_exec() does not return */
8057                 }
8058
8059                 /* parent or error */
8060 #if ENABLE_HUSH_FAST
8061                 G.count_SIGCHLD++;
8062 //bb_error_msg("[%d] fork in run_pipe: G.count_SIGCHLD:%d G.handled_SIGCHLD:%d", getpid(), G.count_SIGCHLD, G.handled_SIGCHLD);
8063 #endif
8064                 enable_restore_tty_pgrp_on_exit();
8065 #if !BB_MMU
8066                 /* Clean up after vforked child */
8067                 free(nommu_save.argv);
8068                 free(nommu_save.argv_from_re_execing);
8069                 unset_vars(nommu_save.new_env);
8070                 add_vars(nommu_save.old_vars);
8071 #endif
8072                 free(argv_expanded);
8073                 argv_expanded = NULL;
8074                 if (command->pid < 0) { /* [v]fork failed */
8075                         /* Clearly indicate, was it fork or vfork */
8076                         bb_perror_msg(BB_MMU ? "vfork"+1 : "vfork");
8077                 } else {
8078                         pi->alive_cmds++;
8079 #if ENABLE_HUSH_JOB
8080                         /* Second and next children need to know pid of first one */
8081                         if (pi->pgrp < 0)
8082                                 pi->pgrp = command->pid;
8083 #endif
8084                 }
8085
8086                 if (cmd_no > 1)
8087                         close(next_infd);
8088                 if (cmd_no < pi->num_cmds)
8089                         close(pipefds.wr);
8090                 /* Pass read (output) pipe end to next iteration */
8091                 next_infd = pipefds.rd;
8092         }
8093
8094         if (!pi->alive_cmds) {
8095                 debug_leave();
8096                 debug_printf_exec("run_pipe return 1 (all forks failed, no children)\n");
8097                 return 1;
8098         }
8099
8100         debug_leave();
8101         debug_printf_exec("run_pipe return -1 (%u children started)\n", pi->alive_cmds);
8102         return -1;
8103 }
8104
8105 /* NB: called by pseudo_exec, and therefore must not modify any
8106  * global data until exec/_exit (we can be a child after vfork!) */
8107 static int run_list(struct pipe *pi)
8108 {
8109 #if ENABLE_HUSH_CASE
8110         char *case_word = NULL;
8111 #endif
8112 #if ENABLE_HUSH_LOOPS
8113         struct pipe *loop_top = NULL;
8114         char **for_lcur = NULL;
8115         char **for_list = NULL;
8116 #endif
8117         smallint last_followup;
8118         smalluint rcode;
8119 #if ENABLE_HUSH_IF || ENABLE_HUSH_CASE
8120         smalluint cond_code = 0;
8121 #else
8122         enum { cond_code = 0 };
8123 #endif
8124 #if HAS_KEYWORDS
8125         smallint rword;      /* RES_foo */
8126         smallint last_rword; /* ditto */
8127 #endif
8128
8129         debug_printf_exec("run_list start lvl %d\n", G.run_list_level);
8130         debug_enter();
8131
8132 #if ENABLE_HUSH_LOOPS
8133         /* Check syntax for "for" */
8134         {
8135                 struct pipe *cpipe;
8136                 for (cpipe = pi; cpipe; cpipe = cpipe->next) {
8137                         if (cpipe->res_word != RES_FOR && cpipe->res_word != RES_IN)
8138                                 continue;
8139                         /* current word is FOR or IN (BOLD in comments below) */
8140                         if (cpipe->next == NULL) {
8141                                 syntax_error("malformed for");
8142                                 debug_leave();
8143                                 debug_printf_exec("run_list lvl %d return 1\n", G.run_list_level);
8144                                 return 1;
8145                         }
8146                         /* "FOR v; do ..." and "for v IN a b; do..." are ok */
8147                         if (cpipe->next->res_word == RES_DO)
8148                                 continue;
8149                         /* next word is not "do". It must be "in" then ("FOR v in ...") */
8150                         if (cpipe->res_word == RES_IN /* "for v IN a b; not_do..."? */
8151                          || cpipe->next->res_word != RES_IN /* FOR v not_do_and_not_in..."? */
8152                         ) {
8153                                 syntax_error("malformed for");
8154                                 debug_leave();
8155                                 debug_printf_exec("run_list lvl %d return 1\n", G.run_list_level);
8156                                 return 1;
8157                         }
8158                 }
8159         }
8160 #endif
8161
8162         /* Past this point, all code paths should jump to ret: label
8163          * in order to return, no direct "return" statements please.
8164          * This helps to ensure that no memory is leaked. */
8165
8166 #if ENABLE_HUSH_JOB
8167         G.run_list_level++;
8168 #endif
8169
8170 #if HAS_KEYWORDS
8171         rword = RES_NONE;
8172         last_rword = RES_XXXX;
8173 #endif
8174         last_followup = PIPE_SEQ;
8175         rcode = G.last_exitcode;
8176
8177         /* Go through list of pipes, (maybe) executing them. */
8178         for (; pi; pi = IF_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) {
8179                 int r;
8180                 int sv_errexit_depth;
8181
8182                 if (G.flag_SIGINT)
8183                         break;
8184                 if (G_flag_return_in_progress == 1)
8185                         break;
8186
8187                 IF_HAS_KEYWORDS(rword = pi->res_word;)
8188                 debug_printf_exec(": rword=%d cond_code=%d last_rword=%d\n",
8189                                 rword, cond_code, last_rword);
8190
8191                 sv_errexit_depth = G.errexit_depth;
8192                 if (IF_HAS_KEYWORDS(rword == RES_IF || rword == RES_ELIF ||)
8193                     pi->followup != PIPE_SEQ
8194                 ) {
8195                         G.errexit_depth++;
8196                 }
8197 #if ENABLE_HUSH_LOOPS
8198                 if ((rword == RES_WHILE || rword == RES_UNTIL || rword == RES_FOR)
8199                  && loop_top == NULL /* avoid bumping G.depth_of_loop twice */
8200                 ) {
8201                         /* start of a loop: remember where loop starts */
8202                         loop_top = pi;
8203                         G.depth_of_loop++;
8204                 }
8205 #endif
8206                 /* Still in the same "if...", "then..." or "do..." branch? */
8207                 if (IF_HAS_KEYWORDS(rword == last_rword &&) 1) {
8208                         if ((rcode == 0 && last_followup == PIPE_OR)
8209                          || (rcode != 0 && last_followup == PIPE_AND)
8210                         ) {
8211                                 /* It is "<true> || CMD" or "<false> && CMD"
8212                                  * and we should not execute CMD */
8213                                 debug_printf_exec("skipped cmd because of || or &&\n");
8214                                 last_followup = pi->followup;
8215                                 goto dont_check_jobs_but_continue;
8216                         }
8217                 }
8218                 last_followup = pi->followup;
8219                 IF_HAS_KEYWORDS(last_rword = rword;)
8220 #if ENABLE_HUSH_IF
8221                 if (cond_code) {
8222                         if (rword == RES_THEN) {
8223                                 /* if false; then ... fi has exitcode 0! */
8224                                 G.last_exitcode = rcode = EXIT_SUCCESS;
8225                                 /* "if <false> THEN cmd": skip cmd */
8226                                 continue;
8227                         }
8228                 } else {
8229                         if (rword == RES_ELSE || rword == RES_ELIF) {
8230                                 /* "if <true> then ... ELSE/ELIF cmd":
8231                                  * skip cmd and all following ones */
8232                                 break;
8233                         }
8234                 }
8235 #endif
8236 #if ENABLE_HUSH_LOOPS
8237                 if (rword == RES_FOR) { /* && pi->num_cmds - always == 1 */
8238                         if (!for_lcur) {
8239                                 /* first loop through for */
8240
8241                                 static const char encoded_dollar_at[] ALIGN1 = {
8242                                         SPECIAL_VAR_SYMBOL, '@' | 0x80, SPECIAL_VAR_SYMBOL, '\0'
8243                                 }; /* encoded representation of "$@" */
8244                                 static const char *const encoded_dollar_at_argv[] = {
8245                                         encoded_dollar_at, NULL
8246                                 }; /* argv list with one element: "$@" */
8247                                 char **vals;
8248
8249                                 vals = (char**)encoded_dollar_at_argv;
8250                                 if (pi->next->res_word == RES_IN) {
8251                                         /* if no variable values after "in" we skip "for" */
8252                                         if (!pi->next->cmds[0].argv) {
8253                                                 G.last_exitcode = rcode = EXIT_SUCCESS;
8254                                                 debug_printf_exec(": null FOR: exitcode EXIT_SUCCESS\n");
8255                                                 break;
8256                                         }
8257                                         vals = pi->next->cmds[0].argv;
8258                                 } /* else: "for var; do..." -> assume "$@" list */
8259                                 /* create list of variable values */
8260                                 debug_print_strings("for_list made from", vals);
8261                                 for_list = expand_strvec_to_strvec(vals);
8262                                 for_lcur = for_list;
8263                                 debug_print_strings("for_list", for_list);
8264                         }
8265                         if (!*for_lcur) {
8266                                 /* "for" loop is over, clean up */
8267                                 free(for_list);
8268                                 for_list = NULL;
8269                                 for_lcur = NULL;
8270                                 break;
8271                         }
8272                         /* Insert next value from for_lcur */
8273                         /* note: *for_lcur already has quotes removed, $var expanded, etc */
8274                         set_local_var(xasprintf("%s=%s", pi->cmds[0].argv[0], *for_lcur++), /*flag:*/ 0);
8275                         continue;
8276                 }
8277                 if (rword == RES_IN) {
8278                         continue; /* "for v IN list;..." - "in" has no cmds anyway */
8279                 }
8280                 if (rword == RES_DONE) {
8281                         continue; /* "done" has no cmds too */
8282                 }
8283 #endif
8284 #if ENABLE_HUSH_CASE
8285                 if (rword == RES_CASE) {
8286                         debug_printf_exec("CASE cond_code:%d\n", cond_code);
8287                         case_word = expand_strvec_to_string(pi->cmds->argv);
8288                         unbackslash(case_word);
8289                         continue;
8290                 }
8291                 if (rword == RES_MATCH) {
8292                         char **argv;
8293
8294                         debug_printf_exec("MATCH cond_code:%d\n", cond_code);
8295                         if (!case_word) /* "case ... matched_word) ... WORD)": we executed selected branch, stop */
8296                                 break;
8297                         /* all prev words didn't match, does this one match? */
8298                         argv = pi->cmds->argv;
8299                         while (*argv) {
8300                                 char *pattern = expand_string_to_string(*argv, /*unbackslash:*/ 0);
8301                                 /* TODO: which FNM_xxx flags to use? */
8302                                 cond_code = (fnmatch(pattern, case_word, /*flags:*/ 0) != 0);
8303                                 debug_printf_exec("fnmatch(pattern:'%s',str:'%s'):%d\n", pattern, case_word, cond_code);
8304                                 free(pattern);
8305                                 if (cond_code == 0) { /* match! we will execute this branch */
8306                                         free(case_word);
8307                                         case_word = NULL; /* make future "word)" stop */
8308                                         break;
8309                                 }
8310                                 argv++;
8311                         }
8312                         continue;
8313                 }
8314                 if (rword == RES_CASE_BODY) { /* inside of a case branch */
8315                         debug_printf_exec("CASE_BODY cond_code:%d\n", cond_code);
8316                         if (cond_code != 0)
8317                                 continue; /* not matched yet, skip this pipe */
8318                 }
8319                 if (rword == RES_ESAC) {
8320                         debug_printf_exec("ESAC cond_code:%d\n", cond_code);
8321                         if (case_word) {
8322                                 /* "case" did not match anything: still set $? (to 0) */
8323                                 G.last_exitcode = rcode = EXIT_SUCCESS;
8324                         }
8325                 }
8326 #endif
8327                 /* Just pressing <enter> in shell should check for jobs.
8328                  * OTOH, in non-interactive shell this is useless
8329                  * and only leads to extra job checks */
8330                 if (pi->num_cmds == 0) {
8331                         if (G_interactive_fd)
8332                                 goto check_jobs_and_continue;
8333                         continue;
8334                 }
8335
8336                 /* After analyzing all keywords and conditions, we decided
8337                  * to execute this pipe. NB: have to do checkjobs(NULL)
8338                  * after run_pipe to collect any background children,
8339                  * even if list execution is to be stopped. */
8340                 debug_printf_exec(": run_pipe with %d members\n", pi->num_cmds);
8341 #if ENABLE_HUSH_LOOPS
8342                 G.flag_break_continue = 0;
8343 #endif
8344                 rcode = r = run_pipe(pi); /* NB: rcode is a smalluint, r is int */
8345                 if (r != -1) {
8346                         /* We ran a builtin, function, or group.
8347                          * rcode is already known
8348                          * and we don't need to wait for anything. */
8349                         debug_printf_exec(": builtin/func exitcode %d\n", rcode);
8350                         G.last_exitcode = rcode;
8351                         check_and_run_traps();
8352 #if ENABLE_HUSH_LOOPS
8353                         /* Was it "break" or "continue"? */
8354                         if (G.flag_break_continue) {
8355                                 smallint fbc = G.flag_break_continue;
8356                                 /* We might fall into outer *loop*,
8357                                  * don't want to break it too */
8358                                 if (loop_top) {
8359                                         G.depth_break_continue--;
8360                                         if (G.depth_break_continue == 0)
8361                                                 G.flag_break_continue = 0;
8362                                         /* else: e.g. "continue 2" should *break* once, *then* continue */
8363                                 } /* else: "while... do... { we are here (innermost list is not a loop!) };...done" */
8364                                 if (G.depth_break_continue != 0 || fbc == BC_BREAK) {
8365                                         checkjobs(NULL, 0 /*(no pid to wait for)*/);
8366                                         break;
8367                                 }
8368                                 /* "continue": simulate end of loop */
8369                                 rword = RES_DONE;
8370                                 continue;
8371                         }
8372 #endif
8373                         if (G_flag_return_in_progress == 1) {
8374                                 checkjobs(NULL, 0 /*(no pid to wait for)*/);
8375                                 break;
8376                         }
8377                 } else if (pi->followup == PIPE_BG) {
8378                         /* What does bash do with attempts to background builtins? */
8379                         /* even bash 3.2 doesn't do that well with nested bg:
8380                          * try "{ { sleep 10; echo DEEP; } & echo HERE; } &".
8381                          * I'm NOT treating inner &'s as jobs */
8382 #if ENABLE_HUSH_JOB
8383                         if (G.run_list_level == 1)
8384                                 insert_job_into_table(pi);
8385 #endif
8386                         /* Last command's pid goes to $! */
8387                         G.last_bg_pid = pi->cmds[pi->num_cmds - 1].pid;
8388                         G.last_bg_pid_exitcode = 0;
8389                         debug_printf_exec(": cmd&: exitcode EXIT_SUCCESS\n");
8390 /* Check pi->pi_inverted? "! sleep 1 & echo $?": bash says 1. dash and ash says 0 */
8391                         rcode = EXIT_SUCCESS;
8392                         goto check_traps;
8393                 } else {
8394 #if ENABLE_HUSH_JOB
8395                         if (G.run_list_level == 1 && G_interactive_fd) {
8396                                 /* Waits for completion, then fg's main shell */
8397                                 rcode = checkjobs_and_fg_shell(pi);
8398                                 debug_printf_exec(": checkjobs_and_fg_shell exitcode %d\n", rcode);
8399                                 goto check_traps;
8400                         }
8401 #endif
8402                         /* This one just waits for completion */
8403                         rcode = checkjobs(pi, 0 /*(no pid to wait for)*/);
8404                         debug_printf_exec(": checkjobs exitcode %d\n", rcode);
8405  check_traps:
8406                         G.last_exitcode = rcode;
8407                         check_and_run_traps();
8408                 }
8409
8410                 /* Handle "set -e" */
8411                 if (rcode != 0 && G.o_opt[OPT_O_ERREXIT]) {
8412                         debug_printf_exec("ERREXIT:1 errexit_depth:%d\n", G.errexit_depth);
8413                         if (G.errexit_depth == 0)
8414                                 hush_exit(rcode);
8415                 }
8416                 G.errexit_depth = sv_errexit_depth;
8417
8418                 /* Analyze how result affects subsequent commands */
8419 #if ENABLE_HUSH_IF
8420                 if (rword == RES_IF || rword == RES_ELIF)
8421                         cond_code = rcode;
8422 #endif
8423  check_jobs_and_continue:
8424                 checkjobs(NULL, 0 /*(no pid to wait for)*/);
8425  dont_check_jobs_but_continue: ;
8426 #if ENABLE_HUSH_LOOPS
8427                 /* Beware of "while false; true; do ..."! */
8428                 if (pi->next
8429                  && (pi->next->res_word == RES_DO || pi->next->res_word == RES_DONE)
8430                  /* check for RES_DONE is needed for "while ...; do \n done" case */
8431                 ) {
8432                         if (rword == RES_WHILE) {
8433                                 if (rcode) {
8434                                         /* "while false; do...done" - exitcode 0 */
8435                                         G.last_exitcode = rcode = EXIT_SUCCESS;
8436                                         debug_printf_exec(": while expr is false: breaking (exitcode:EXIT_SUCCESS)\n");
8437                                         break;
8438                                 }
8439                         }
8440                         if (rword == RES_UNTIL) {
8441                                 if (!rcode) {
8442                                         debug_printf_exec(": until expr is true: breaking\n");
8443                                         break;
8444                                 }
8445                         }
8446                 }
8447 #endif
8448         } /* for (pi) */
8449
8450 #if ENABLE_HUSH_JOB
8451         G.run_list_level--;
8452 #endif
8453 #if ENABLE_HUSH_LOOPS
8454         if (loop_top)
8455                 G.depth_of_loop--;
8456         free(for_list);
8457 #endif
8458 #if ENABLE_HUSH_CASE
8459         free(case_word);
8460 #endif
8461         debug_leave();
8462         debug_printf_exec("run_list lvl %d return %d\n", G.run_list_level + 1, rcode);
8463         return rcode;
8464 }
8465
8466 /* Select which version we will use */
8467 static int run_and_free_list(struct pipe *pi)
8468 {
8469         int rcode = 0;
8470         debug_printf_exec("run_and_free_list entered\n");
8471         if (!G.o_opt[OPT_O_NOEXEC]) {
8472                 debug_printf_exec(": run_list: 1st pipe with %d cmds\n", pi->num_cmds);
8473                 rcode = run_list(pi);
8474         }
8475         /* free_pipe_list has the side effect of clearing memory.
8476          * In the long run that function can be merged with run_list,
8477          * but doing that now would hobble the debugging effort. */
8478         free_pipe_list(pi);
8479         debug_printf_exec("run_and_free_list return %d\n", rcode);
8480         return rcode;
8481 }
8482
8483
8484 static void install_sighandlers(unsigned mask)
8485 {
8486         sighandler_t old_handler;
8487         unsigned sig = 0;
8488         while ((mask >>= 1) != 0) {
8489                 sig++;
8490                 if (!(mask & 1))
8491                         continue;
8492                 old_handler = install_sighandler(sig, pick_sighandler(sig));
8493                 /* POSIX allows shell to re-enable SIGCHLD
8494                  * even if it was SIG_IGN on entry.
8495                  * Therefore we skip IGN check for it:
8496                  */
8497                 if (sig == SIGCHLD)
8498                         continue;
8499                 if (old_handler == SIG_IGN) {
8500                         /* oops... restore back to IGN, and record this fact */
8501                         install_sighandler(sig, old_handler);
8502 #if ENABLE_HUSH_TRAP
8503                         if (!G_traps)
8504                                 G_traps = xzalloc(sizeof(G_traps[0]) * NSIG);
8505                         free(G_traps[sig]);
8506                         G_traps[sig] = xzalloc(1); /* == xstrdup(""); */
8507 #endif
8508                 }
8509         }
8510 }
8511
8512 /* Called a few times only (or even once if "sh -c") */
8513 static void install_special_sighandlers(void)
8514 {
8515         unsigned mask;
8516
8517         /* Which signals are shell-special? */
8518         mask = (1 << SIGQUIT) | (1 << SIGCHLD);
8519         if (G_interactive_fd) {
8520                 mask |= SPECIAL_INTERACTIVE_SIGS;
8521                 if (G_saved_tty_pgrp) /* we have ctty, job control sigs work */
8522                         mask |= SPECIAL_JOBSTOP_SIGS;
8523         }
8524         /* Careful, do not re-install handlers we already installed */
8525         if (G.special_sig_mask != mask) {
8526                 unsigned diff = mask & ~G.special_sig_mask;
8527                 G.special_sig_mask = mask;
8528                 install_sighandlers(diff);
8529         }
8530 }
8531
8532 #if ENABLE_HUSH_JOB
8533 /* helper */
8534 /* Set handlers to restore tty pgrp and exit */
8535 static void install_fatal_sighandlers(void)
8536 {
8537         unsigned mask;
8538
8539         /* We will restore tty pgrp on these signals */
8540         mask = 0
8541                 /*+ (1 << SIGILL ) * HUSH_DEBUG*/
8542                 /*+ (1 << SIGFPE ) * HUSH_DEBUG*/
8543                 + (1 << SIGBUS ) * HUSH_DEBUG
8544                 + (1 << SIGSEGV) * HUSH_DEBUG
8545                 /*+ (1 << SIGTRAP) * HUSH_DEBUG*/
8546                 + (1 << SIGABRT)
8547         /* bash 3.2 seems to handle these just like 'fatal' ones */
8548                 + (1 << SIGPIPE)
8549                 + (1 << SIGALRM)
8550         /* if we are interactive, SIGHUP, SIGTERM and SIGINT are special sigs.
8551          * if we aren't interactive... but in this case
8552          * we never want to restore pgrp on exit, and this fn is not called
8553          */
8554                 /*+ (1 << SIGHUP )*/
8555                 /*+ (1 << SIGTERM)*/
8556                 /*+ (1 << SIGINT )*/
8557         ;
8558         G_fatal_sig_mask = mask;
8559
8560         install_sighandlers(mask);
8561 }
8562 #endif
8563
8564 static int set_mode(int state, char mode, const char *o_opt)
8565 {
8566         int idx;
8567         switch (mode) {
8568         case 'n':
8569                 G.o_opt[OPT_O_NOEXEC] = state;
8570                 break;
8571         case 'x':
8572                 IF_HUSH_MODE_X(G_x_mode = state;)
8573                 break;
8574         case 'o':
8575                 if (!o_opt) {
8576                         /* "set -+o" without parameter.
8577                          * in bash, set -o produces this output:
8578                          *  pipefail        off
8579                          * and set +o:
8580                          *  set +o pipefail
8581                          * We always use the second form.
8582                          */
8583                         const char *p = o_opt_strings;
8584                         idx = 0;
8585                         while (*p) {
8586                                 printf("set %co %s\n", (G.o_opt[idx] ? '-' : '+'), p);
8587                                 idx++;
8588                                 p += strlen(p) + 1;
8589                         }
8590                         break;
8591                 }
8592                 idx = index_in_strings(o_opt_strings, o_opt);
8593                 if (idx >= 0) {
8594                         G.o_opt[idx] = state;
8595                         break;
8596                 }
8597         case 'e':
8598                 G.o_opt[OPT_O_ERREXIT] = state;
8599                 break;
8600         default:
8601                 return EXIT_FAILURE;
8602         }
8603         return EXIT_SUCCESS;
8604 }
8605
8606 int hush_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
8607 int hush_main(int argc, char **argv)
8608 {
8609         enum {
8610                 OPT_login = (1 << 0),
8611         };
8612         unsigned flags;
8613         int opt;
8614         unsigned builtin_argc;
8615         char **e;
8616         struct variable *cur_var;
8617         struct variable *shell_ver;
8618
8619         INIT_G();
8620         if (EXIT_SUCCESS != 0) /* if EXIT_SUCCESS == 0, it is already done */
8621                 G.last_exitcode = EXIT_SUCCESS;
8622
8623 #if ENABLE_HUSH_FAST
8624         G.count_SIGCHLD++; /* ensure it is != G.handled_SIGCHLD */
8625 #endif
8626 #if !BB_MMU
8627         G.argv0_for_re_execing = argv[0];
8628 #endif
8629         /* Deal with HUSH_VERSION */
8630         shell_ver = xzalloc(sizeof(*shell_ver));
8631         shell_ver->flg_export = 1;
8632         shell_ver->flg_read_only = 1;
8633         /* Code which handles ${var<op>...} needs writable values for all variables,
8634          * therefore we xstrdup: */
8635         shell_ver->varstr = xstrdup(hush_version_str);
8636         /* Create shell local variables from the values
8637          * currently living in the environment */
8638         debug_printf_env("unsetenv '%s'\n", "HUSH_VERSION");
8639         unsetenv("HUSH_VERSION"); /* in case it exists in initial env */
8640         G.top_var = shell_ver;
8641         cur_var = G.top_var;
8642         e = environ;
8643         if (e) while (*e) {
8644                 char *value = strchr(*e, '=');
8645                 if (value) { /* paranoia */
8646                         cur_var->next = xzalloc(sizeof(*cur_var));
8647                         cur_var = cur_var->next;
8648                         cur_var->varstr = *e;
8649                         cur_var->max_len = strlen(*e);
8650                         cur_var->flg_export = 1;
8651                 }
8652                 e++;
8653         }
8654         /* (Re)insert HUSH_VERSION into env (AFTER we scanned the env!) */
8655         debug_printf_env("putenv '%s'\n", shell_ver->varstr);
8656         putenv(shell_ver->varstr);
8657
8658         /* Export PWD */
8659         set_pwd_var(SETFLAG_EXPORT);
8660
8661 #if BASH_HOSTNAME_VAR
8662         /* Set (but not export) HOSTNAME unless already set */
8663         if (!get_local_var_value("HOSTNAME")) {
8664                 struct utsname uts;
8665                 uname(&uts);
8666                 set_local_var_from_halves("HOSTNAME", uts.nodename);
8667         }
8668         /* bash also exports SHLVL and _,
8669          * and sets (but doesn't export) the following variables:
8670          * BASH=/bin/bash
8671          * BASH_VERSINFO=([0]="3" [1]="2" [2]="0" [3]="1" [4]="release" [5]="i386-pc-linux-gnu")
8672          * BASH_VERSION='3.2.0(1)-release'
8673          * HOSTTYPE=i386
8674          * MACHTYPE=i386-pc-linux-gnu
8675          * OSTYPE=linux-gnu
8676          * PPID=<NNNNN> - we also do it elsewhere
8677          * EUID=<NNNNN>
8678          * UID=<NNNNN>
8679          * GROUPS=()
8680          * LINES=<NNN>
8681          * COLUMNS=<NNN>
8682          * BASH_ARGC=()
8683          * BASH_ARGV=()
8684          * BASH_LINENO=()
8685          * BASH_SOURCE=()
8686          * DIRSTACK=()
8687          * PIPESTATUS=([0]="0")
8688          * HISTFILE=/<xxx>/.bash_history
8689          * HISTFILESIZE=500
8690          * HISTSIZE=500
8691          * MAILCHECK=60
8692          * PATH=/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin:.
8693          * SHELL=/bin/bash
8694          * SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
8695          * TERM=dumb
8696          * OPTERR=1
8697          * OPTIND=1
8698          * IFS=$' \t\n'
8699          * PS1='\s-\v\$ '
8700          * PS2='> '
8701          * PS4='+ '
8702          */
8703 #endif
8704
8705 #if ENABLE_FEATURE_EDITING
8706         G.line_input_state = new_line_input_t(FOR_SHELL);
8707 #endif
8708
8709         /* Initialize some more globals to non-zero values */
8710         cmdedit_update_prompt();
8711
8712         die_func = restore_ttypgrp_and__exit;
8713
8714         /* Shell is non-interactive at first. We need to call
8715          * install_special_sighandlers() if we are going to execute "sh <script>",
8716          * "sh -c <cmds>" or login shell's /etc/profile and friends.
8717          * If we later decide that we are interactive, we run install_special_sighandlers()
8718          * in order to intercept (more) signals.
8719          */
8720
8721         /* Parse options */
8722         /* http://www.opengroup.org/onlinepubs/9699919799/utilities/sh.html */
8723         flags = (argv[0] && argv[0][0] == '-') ? OPT_login : 0;
8724         builtin_argc = 0;
8725         while (1) {
8726                 opt = getopt(argc, argv, "+c:exinsl"
8727 #if !BB_MMU
8728                                 "<:$:R:V:"
8729 # if ENABLE_HUSH_FUNCTIONS
8730                                 "F:"
8731 # endif
8732 #endif
8733                 );
8734                 if (opt <= 0)
8735                         break;
8736                 switch (opt) {
8737                 case 'c':
8738                         /* Possibilities:
8739                          * sh ... -c 'script'
8740                          * sh ... -c 'script' ARG0 [ARG1...]
8741                          * On NOMMU, if builtin_argc != 0,
8742                          * sh ... -c 'builtin' BARGV... "" ARG0 [ARG1...]
8743                          * "" needs to be replaced with NULL
8744                          * and BARGV vector fed to builtin function.
8745                          * Note: the form without ARG0 never happens:
8746                          * sh ... -c 'builtin' BARGV... ""
8747                          */
8748                         if (!G.root_pid) {
8749                                 G.root_pid = getpid();
8750                                 G.root_ppid = getppid();
8751                         }
8752                         G.global_argv = argv + optind;
8753                         G.global_argc = argc - optind;
8754                         if (builtin_argc) {
8755                                 /* -c 'builtin' [BARGV...] "" ARG0 [ARG1...] */
8756                                 const struct built_in_command *x;
8757
8758                                 install_special_sighandlers();
8759                                 x = find_builtin(optarg);
8760                                 if (x) { /* paranoia */
8761                                         G.global_argc -= builtin_argc; /* skip [BARGV...] "" */
8762                                         G.global_argv += builtin_argc;
8763                                         G.global_argv[-1] = NULL; /* replace "" */
8764                                         fflush_all();
8765                                         G.last_exitcode = x->b_function(argv + optind - 1);
8766                                 }
8767                                 goto final_return;
8768                         }
8769                         if (!G.global_argv[0]) {
8770                                 /* -c 'script' (no params): prevent empty $0 */
8771                                 G.global_argv--; /* points to argv[i] of 'script' */
8772                                 G.global_argv[0] = argv[0];
8773                                 G.global_argc++;
8774                         } /* else -c 'script' ARG0 [ARG1...]: $0 is ARG0 */
8775                         install_special_sighandlers();
8776                         parse_and_run_string(optarg);
8777                         goto final_return;
8778                 case 'i':
8779                         /* Well, we cannot just declare interactiveness,
8780                          * we have to have some stuff (ctty, etc) */
8781                         /* G_interactive_fd++; */
8782                         break;
8783                 case 's':
8784                         /* "-s" means "read from stdin", but this is how we always
8785                          * operate, so simply do nothing here. */
8786                         break;
8787                 case 'l':
8788                         flags |= OPT_login;
8789                         break;
8790 #if !BB_MMU
8791                 case '<': /* "big heredoc" support */
8792                         full_write1_str(optarg);
8793                         _exit(0);
8794                 case '$': {
8795                         unsigned long long empty_trap_mask;
8796
8797                         G.root_pid = bb_strtou(optarg, &optarg, 16);
8798                         optarg++;
8799                         G.root_ppid = bb_strtou(optarg, &optarg, 16);
8800                         optarg++;
8801                         G.last_bg_pid = bb_strtou(optarg, &optarg, 16);
8802                         optarg++;
8803                         G.last_exitcode = bb_strtou(optarg, &optarg, 16);
8804                         optarg++;
8805                         builtin_argc = bb_strtou(optarg, &optarg, 16);
8806                         optarg++;
8807                         empty_trap_mask = bb_strtoull(optarg, &optarg, 16);
8808                         if (empty_trap_mask != 0) {
8809                                 IF_HUSH_TRAP(int sig;)
8810                                 install_special_sighandlers();
8811 # if ENABLE_HUSH_TRAP
8812                                 G_traps = xzalloc(sizeof(G_traps[0]) * NSIG);
8813                                 for (sig = 1; sig < NSIG; sig++) {
8814                                         if (empty_trap_mask & (1LL << sig)) {
8815                                                 G_traps[sig] = xzalloc(1); /* == xstrdup(""); */
8816                                                 install_sighandler(sig, SIG_IGN);
8817                                         }
8818                                 }
8819 # endif
8820                         }
8821 # if ENABLE_HUSH_LOOPS
8822                         optarg++;
8823                         G.depth_of_loop = bb_strtou(optarg, &optarg, 16);
8824 # endif
8825                         break;
8826                 }
8827                 case 'R':
8828                 case 'V':
8829                         set_local_var(xstrdup(optarg), opt == 'R' ? SETFLAG_MAKE_RO : 0);
8830                         break;
8831 # if ENABLE_HUSH_FUNCTIONS
8832                 case 'F': {
8833                         struct function *funcp = new_function(optarg);
8834                         /* funcp->name is already set to optarg */
8835                         /* funcp->body is set to NULL. It's a special case. */
8836                         funcp->body_as_string = argv[optind];
8837                         optind++;
8838                         break;
8839                 }
8840 # endif
8841 #endif
8842                 case 'n':
8843                 case 'x':
8844                 case 'e':
8845                         if (set_mode(1, opt, NULL) == 0) /* no error */
8846                                 break;
8847                 default:
8848 #ifndef BB_VER
8849                         fprintf(stderr, "Usage: sh [FILE]...\n"
8850                                         "   or: sh -c command [args]...\n\n");
8851                         exit(EXIT_FAILURE);
8852 #else
8853                         bb_show_usage();
8854 #endif
8855                 }
8856         } /* option parsing loop */
8857
8858         /* Skip options. Try "hush -l": $1 should not be "-l"! */
8859         G.global_argc = argc - (optind - 1);
8860         G.global_argv = argv + (optind - 1);
8861         G.global_argv[0] = argv[0];
8862
8863         if (!G.root_pid) {
8864                 G.root_pid = getpid();
8865                 G.root_ppid = getppid();
8866         }
8867
8868         /* If we are login shell... */
8869         if (flags & OPT_login) {
8870                 FILE *input;
8871                 debug_printf("sourcing /etc/profile\n");
8872                 input = fopen_for_read("/etc/profile");
8873                 if (input != NULL) {
8874                         remember_FILE(input);
8875                         install_special_sighandlers();
8876                         parse_and_run_file(input);
8877                         fclose_and_forget(input);
8878                 }
8879                 /* bash: after sourcing /etc/profile,
8880                  * tries to source (in the given order):
8881                  * ~/.bash_profile, ~/.bash_login, ~/.profile,
8882                  * stopping on first found. --noprofile turns this off.
8883                  * bash also sources ~/.bash_logout on exit.
8884                  * If called as sh, skips .bash_XXX files.
8885                  */
8886         }
8887
8888         if (G.global_argv[1]) {
8889                 FILE *input;
8890                 /*
8891                  * "bash <script>" (which is never interactive (unless -i?))
8892                  * sources $BASH_ENV here (without scanning $PATH).
8893                  * If called as sh, does the same but with $ENV.
8894                  * Also NB, per POSIX, $ENV should undergo parameter expansion.
8895                  */
8896                 G.global_argc--;
8897                 G.global_argv++;
8898                 debug_printf("running script '%s'\n", G.global_argv[0]);
8899                 xfunc_error_retval = 127; /* for "hush /does/not/exist" case */
8900                 input = xfopen_for_read(G.global_argv[0]);
8901                 xfunc_error_retval = 1;
8902                 remember_FILE(input);
8903                 install_special_sighandlers();
8904                 parse_and_run_file(input);
8905 #if ENABLE_FEATURE_CLEAN_UP
8906                 fclose_and_forget(input);
8907 #endif
8908                 goto final_return;
8909         }
8910
8911         /* Up to here, shell was non-interactive. Now it may become one.
8912          * NB: don't forget to (re)run install_special_sighandlers() as needed.
8913          */
8914
8915         /* A shell is interactive if the '-i' flag was given,
8916          * or if all of the following conditions are met:
8917          *    no -c command
8918          *    no arguments remaining or the -s flag given
8919          *    standard input is a terminal
8920          *    standard output is a terminal
8921          * Refer to Posix.2, the description of the 'sh' utility.
8922          */
8923 #if ENABLE_HUSH_JOB
8924         if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) {
8925                 G_saved_tty_pgrp = tcgetpgrp(STDIN_FILENO);
8926                 debug_printf("saved_tty_pgrp:%d\n", G_saved_tty_pgrp);
8927                 if (G_saved_tty_pgrp < 0)
8928                         G_saved_tty_pgrp = 0;
8929
8930                 /* try to dup stdin to high fd#, >= 255 */
8931                 G_interactive_fd = fcntl_F_DUPFD(STDIN_FILENO, 254);
8932                 if (G_interactive_fd < 0) {
8933                         /* try to dup to any fd */
8934                         G_interactive_fd = dup(STDIN_FILENO);
8935                         if (G_interactive_fd < 0) {
8936                                 /* give up */
8937                                 G_interactive_fd = 0;
8938                                 G_saved_tty_pgrp = 0;
8939                         }
8940                 }
8941 // TODO: track & disallow any attempts of user
8942 // to (inadvertently) close/redirect G_interactive_fd
8943         }
8944         debug_printf("interactive_fd:%d\n", G_interactive_fd);
8945         if (G_interactive_fd) {
8946                 close_on_exec_on(G_interactive_fd);
8947
8948                 if (G_saved_tty_pgrp) {
8949                         /* If we were run as 'hush &', sleep until we are
8950                          * in the foreground (tty pgrp == our pgrp).
8951                          * If we get started under a job aware app (like bash),
8952                          * make sure we are now in charge so we don't fight over
8953                          * who gets the foreground */
8954                         while (1) {
8955                                 pid_t shell_pgrp = getpgrp();
8956                                 G_saved_tty_pgrp = tcgetpgrp(G_interactive_fd);
8957                                 if (G_saved_tty_pgrp == shell_pgrp)
8958                                         break;
8959                                 /* send TTIN to ourself (should stop us) */
8960                                 kill(- shell_pgrp, SIGTTIN);
8961                         }
8962                 }
8963
8964                 /* Install more signal handlers */
8965                 install_special_sighandlers();
8966
8967                 if (G_saved_tty_pgrp) {
8968                         /* Set other signals to restore saved_tty_pgrp */
8969                         install_fatal_sighandlers();
8970                         /* Put ourselves in our own process group
8971                          * (bash, too, does this only if ctty is available) */
8972                         bb_setpgrp(); /* is the same as setpgid(our_pid, our_pid); */
8973                         /* Grab control of the terminal */
8974                         tcsetpgrp(G_interactive_fd, getpid());
8975                 }
8976                 enable_restore_tty_pgrp_on_exit();
8977
8978 # if ENABLE_HUSH_SAVEHISTORY && MAX_HISTORY > 0
8979                 {
8980                         const char *hp = get_local_var_value("HISTFILE");
8981                         if (!hp) {
8982                                 hp = get_local_var_value("HOME");
8983                                 if (hp)
8984                                         hp = concat_path_file(hp, ".hush_history");
8985                         } else {
8986                                 hp = xstrdup(hp);
8987                         }
8988                         if (hp) {
8989                                 G.line_input_state->hist_file = hp;
8990                                 //set_local_var(xasprintf("HISTFILE=%s", ...));
8991                         }
8992 #  if ENABLE_FEATURE_SH_HISTFILESIZE
8993                         hp = get_local_var_value("HISTFILESIZE");
8994                         G.line_input_state->max_history = size_from_HISTFILESIZE(hp);
8995 #  endif
8996                 }
8997 # endif
8998         } else {
8999                 install_special_sighandlers();
9000         }
9001 #elif ENABLE_HUSH_INTERACTIVE
9002         /* No job control compiled in, only prompt/line editing */
9003         if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) {
9004                 G_interactive_fd = fcntl_F_DUPFD(STDIN_FILENO, 254);
9005                 if (G_interactive_fd < 0) {
9006                         /* try to dup to any fd */
9007                         G_interactive_fd = dup(STDIN_FILENO);
9008                         if (G_interactive_fd < 0)
9009                                 /* give up */
9010                                 G_interactive_fd = 0;
9011                 }
9012         }
9013         if (G_interactive_fd) {
9014                 close_on_exec_on(G_interactive_fd);
9015         }
9016         install_special_sighandlers();
9017 #else
9018         /* We have interactiveness code disabled */
9019         install_special_sighandlers();
9020 #endif
9021         /* bash:
9022          * if interactive but not a login shell, sources ~/.bashrc
9023          * (--norc turns this off, --rcfile <file> overrides)
9024          */
9025
9026         if (!ENABLE_FEATURE_SH_EXTRA_QUIET && G_interactive_fd) {
9027                 /* note: ash and hush share this string */
9028                 printf("\n\n%s %s\n"
9029                         IF_HUSH_HELP("Enter 'help' for a list of built-in commands.\n")
9030                         "\n",
9031                         bb_banner,
9032                         "hush - the humble shell"
9033                 );
9034         }
9035
9036         parse_and_run_file(stdin);
9037
9038  final_return:
9039         hush_exit(G.last_exitcode);
9040 }
9041
9042
9043 /*
9044  * Built-ins
9045  */
9046 static int FAST_FUNC builtin_true(char **argv UNUSED_PARAM)
9047 {
9048         return 0;
9049 }
9050
9051 #if ENABLE_HUSH_TEST || ENABLE_HUSH_ECHO || ENABLE_HUSH_PRINTF || ENABLE_HUSH_KILL
9052 static int run_applet_main(char **argv, int (*applet_main_func)(int argc, char **argv))
9053 {
9054         int argc = string_array_len(argv);
9055         return applet_main_func(argc, argv);
9056 }
9057 #endif
9058 #if ENABLE_HUSH_TEST || BASH_TEST2
9059 static int FAST_FUNC builtin_test(char **argv)
9060 {
9061         return run_applet_main(argv, test_main);
9062 }
9063 #endif
9064 #if ENABLE_HUSH_ECHO
9065 static int FAST_FUNC builtin_echo(char **argv)
9066 {
9067         return run_applet_main(argv, echo_main);
9068 }
9069 #endif
9070 #if ENABLE_HUSH_PRINTF
9071 static int FAST_FUNC builtin_printf(char **argv)
9072 {
9073         return run_applet_main(argv, printf_main);
9074 }
9075 #endif
9076
9077 #if ENABLE_HUSH_HELP
9078 static int FAST_FUNC builtin_help(char **argv UNUSED_PARAM)
9079 {
9080         const struct built_in_command *x;
9081
9082         printf(
9083                 "Built-in commands:\n"
9084                 "------------------\n");
9085         for (x = bltins1; x != &bltins1[ARRAY_SIZE(bltins1)]; x++) {
9086                 if (x->b_descr)
9087                         printf("%-10s%s\n", x->b_cmd, x->b_descr);
9088         }
9089         return EXIT_SUCCESS;
9090 }
9091 #endif
9092
9093 #if MAX_HISTORY && ENABLE_FEATURE_EDITING
9094 static int FAST_FUNC builtin_history(char **argv UNUSED_PARAM)
9095 {
9096         show_history(G.line_input_state);
9097         return EXIT_SUCCESS;
9098 }
9099 #endif
9100
9101 static char **skip_dash_dash(char **argv)
9102 {
9103         argv++;
9104         if (argv[0] && argv[0][0] == '-' && argv[0][1] == '-' && argv[0][2] == '\0')
9105                 argv++;
9106         return argv;
9107 }
9108
9109 static int FAST_FUNC builtin_cd(char **argv)
9110 {
9111         const char *newdir;
9112
9113         argv = skip_dash_dash(argv);
9114         newdir = argv[0];
9115         if (newdir == NULL) {
9116                 /* bash does nothing (exitcode 0) if HOME is ""; if it's unset,
9117                  * bash says "bash: cd: HOME not set" and does nothing
9118                  * (exitcode 1)
9119                  */
9120                 const char *home = get_local_var_value("HOME");
9121                 newdir = home ? home : "/";
9122         }
9123         if (chdir(newdir)) {
9124                 /* Mimic bash message exactly */
9125                 bb_perror_msg("cd: %s", newdir);
9126                 return EXIT_FAILURE;
9127         }
9128         /* Read current dir (get_cwd(1) is inside) and set PWD.
9129          * Note: do not enforce exporting. If PWD was unset or unexported,
9130          * set it again, but do not export. bash does the same.
9131          */
9132         set_pwd_var(/*flag:*/ 0);
9133         return EXIT_SUCCESS;
9134 }
9135
9136 static int FAST_FUNC builtin_pwd(char **argv UNUSED_PARAM)
9137 {
9138         puts(get_cwd(0));
9139         return EXIT_SUCCESS;
9140 }
9141
9142 static int FAST_FUNC builtin_eval(char **argv)
9143 {
9144         int rcode = EXIT_SUCCESS;
9145
9146         argv = skip_dash_dash(argv);
9147         if (*argv) {
9148                 char *str = expand_strvec_to_string(argv);
9149                 /* bash:
9150                  * eval "echo Hi; done" ("done" is syntax error):
9151                  * "echo Hi" will not execute too.
9152                  */
9153                 parse_and_run_string(str);
9154                 free(str);
9155                 rcode = G.last_exitcode;
9156         }
9157         return rcode;
9158 }
9159
9160 static int FAST_FUNC builtin_exec(char **argv)
9161 {
9162         argv = skip_dash_dash(argv);
9163         if (argv[0] == NULL)
9164                 return EXIT_SUCCESS; /* bash does this */
9165
9166         /* Careful: we can end up here after [v]fork. Do not restore
9167          * tty pgrp then, only top-level shell process does that */
9168         if (G_saved_tty_pgrp && getpid() == G.root_pid)
9169                 tcsetpgrp(G_interactive_fd, G_saved_tty_pgrp);
9170
9171         /* TODO: if exec fails, bash does NOT exit! We do.
9172          * We'll need to undo trap cleanup (it's inside execvp_or_die)
9173          * and tcsetpgrp, and this is inherently racy.
9174          */
9175         execvp_or_die(argv);
9176 }
9177
9178 static int FAST_FUNC builtin_exit(char **argv)
9179 {
9180         debug_printf_exec("%s()\n", __func__);
9181
9182         /* interactive bash:
9183          * # trap "echo EEE" EXIT
9184          * # exit
9185          * exit
9186          * There are stopped jobs.
9187          * (if there are _stopped_ jobs, running ones don't count)
9188          * # exit
9189          * exit
9190          * EEE (then bash exits)
9191          *
9192          * TODO: we can use G.exiting = -1 as indicator "last cmd was exit"
9193          */
9194
9195         /* note: EXIT trap is run by hush_exit */
9196         argv = skip_dash_dash(argv);
9197         if (argv[0] == NULL)
9198                 hush_exit(G.last_exitcode);
9199         /* mimic bash: exit 123abc == exit 255 + error msg */
9200         xfunc_error_retval = 255;
9201         /* bash: exit -2 == exit 254, no error msg */
9202         hush_exit(xatoi(argv[0]) & 0xff);
9203 }
9204
9205 #if ENABLE_HUSH_TYPE
9206 /* http://www.opengroup.org/onlinepubs/9699919799/utilities/type.html */
9207 static int FAST_FUNC builtin_type(char **argv)
9208 {
9209         int ret = EXIT_SUCCESS;
9210
9211         while (*++argv) {
9212                 const char *type;
9213                 char *path = NULL;
9214
9215                 if (0) {} /* make conditional compile easier below */
9216                 /*else if (find_alias(*argv))
9217                         type = "an alias";*/
9218 #if ENABLE_HUSH_FUNCTIONS
9219                 else if (find_function(*argv))
9220                         type = "a function";
9221 #endif
9222                 else if (find_builtin(*argv))
9223                         type = "a shell builtin";
9224                 else if ((path = find_in_path(*argv)) != NULL)
9225                         type = path;
9226                 else {
9227                         bb_error_msg("type: %s: not found", *argv);
9228                         ret = EXIT_FAILURE;
9229                         continue;
9230                 }
9231
9232                 printf("%s is %s\n", *argv, type);
9233                 free(path);
9234         }
9235
9236         return ret;
9237 }
9238 #endif
9239
9240 #if ENABLE_HUSH_READ
9241 /* Interruptibility of read builtin in bash
9242  * (tested on bash-4.2.8 by sending signals (not by ^C)):
9243  *
9244  * Empty trap makes read ignore corresponding signal, for any signal.
9245  *
9246  * SIGINT:
9247  * - terminates non-interactive shell;
9248  * - interrupts read in interactive shell;
9249  * if it has non-empty trap:
9250  * - executes trap and returns to command prompt in interactive shell;
9251  * - executes trap and returns to read in non-interactive shell;
9252  * SIGTERM:
9253  * - is ignored (does not interrupt) read in interactive shell;
9254  * - terminates non-interactive shell;
9255  * if it has non-empty trap:
9256  * - executes trap and returns to read;
9257  * SIGHUP:
9258  * - terminates shell (regardless of interactivity);
9259  * if it has non-empty trap:
9260  * - executes trap and returns to read;
9261  * SIGCHLD from children:
9262  * - does not interrupt read regardless of interactivity:
9263  *   try: sleep 1 & read x; echo $x
9264  */
9265 static int FAST_FUNC builtin_read(char **argv)
9266 {
9267         const char *r;
9268         char *opt_n = NULL;
9269         char *opt_p = NULL;
9270         char *opt_t = NULL;
9271         char *opt_u = NULL;
9272         const char *ifs;
9273         int read_flags;
9274
9275         /* "!": do not abort on errors.
9276          * Option string must start with "sr" to match BUILTIN_READ_xxx
9277          */
9278         read_flags = getopt32(argv, "!srn:p:t:u:", &opt_n, &opt_p, &opt_t, &opt_u);
9279         if (read_flags == (uint32_t)-1)
9280                 return EXIT_FAILURE;
9281         argv += optind;
9282         ifs = get_local_var_value("IFS"); /* can be NULL */
9283
9284  again:
9285         r = shell_builtin_read(set_local_var_from_halves,
9286                 argv,
9287                 ifs,
9288                 read_flags,
9289                 opt_n,
9290                 opt_p,
9291                 opt_t,
9292                 opt_u
9293         );
9294
9295         if ((uintptr_t)r == 1 && errno == EINTR) {
9296                 unsigned sig = check_and_run_traps();
9297                 if (sig != SIGINT)
9298                         goto again;
9299         }
9300
9301         if ((uintptr_t)r > 1) {
9302                 bb_error_msg("%s", r);
9303                 r = (char*)(uintptr_t)1;
9304         }
9305
9306         return (uintptr_t)r;
9307 }
9308 #endif
9309
9310 #if ENABLE_HUSH_UMASK
9311 static int FAST_FUNC builtin_umask(char **argv)
9312 {
9313         int rc;
9314         mode_t mask;
9315
9316         rc = 1;
9317         mask = umask(0);
9318         argv = skip_dash_dash(argv);
9319         if (argv[0]) {
9320                 mode_t old_mask = mask;
9321
9322                 /* numeric umasks are taken as-is */
9323                 /* symbolic umasks are inverted: "umask a=rx" calls umask(222) */
9324                 if (!isdigit(argv[0][0]))
9325                         mask ^= 0777;
9326                 mask = bb_parse_mode(argv[0], mask);
9327                 if (!isdigit(argv[0][0]))
9328                         mask ^= 0777;
9329                 if ((unsigned)mask > 0777) {
9330                         mask = old_mask;
9331                         /* bash messages:
9332                          * bash: umask: 'q': invalid symbolic mode operator
9333                          * bash: umask: 999: octal number out of range
9334                          */
9335                         bb_error_msg("%s: invalid mode '%s'", "umask", argv[0]);
9336                         rc = 0;
9337                 }
9338         } else {
9339                 /* Mimic bash */
9340                 printf("%04o\n", (unsigned) mask);
9341                 /* fall through and restore mask which we set to 0 */
9342         }
9343         umask(mask);
9344
9345         return !rc; /* rc != 0 - success */
9346 }
9347 #endif
9348
9349 #if ENABLE_HUSH_EXPORT || ENABLE_HUSH_TRAP
9350 static void print_escaped(const char *s)
9351 {
9352         if (*s == '\'')
9353                 goto squote;
9354         do {
9355                 const char *p = strchrnul(s, '\'');
9356                 /* print 'xxxx', possibly just '' */
9357                 printf("'%.*s'", (int)(p - s), s);
9358                 if (*p == '\0')
9359                         break;
9360                 s = p;
9361  squote:
9362                 /* s points to '; print "'''...'''" */
9363                 putchar('"');
9364                 do putchar('\''); while (*++s == '\'');
9365                 putchar('"');
9366         } while (*s);
9367 }
9368 #endif
9369
9370 #if ENABLE_HUSH_EXPORT || ENABLE_HUSH_LOCAL || ENABLE_HUSH_READONLY
9371 static int helper_export_local(char **argv, unsigned flags)
9372 {
9373         do {
9374                 char *name = *argv;
9375                 char *name_end = strchrnul(name, '=');
9376
9377                 /* So far we do not check that name is valid (TODO?) */
9378
9379                 if (*name_end == '\0') {
9380                         struct variable *var, **vpp;
9381
9382                         vpp = get_ptr_to_local_var(name, name_end - name);
9383                         var = vpp ? *vpp : NULL;
9384
9385                         if (flags & SETFLAG_UNEXPORT) {
9386                                 /* export -n NAME (without =VALUE) */
9387                                 if (var) {
9388                                         var->flg_export = 0;
9389                                         debug_printf_env("%s: unsetenv '%s'\n", __func__, name);
9390                                         unsetenv(name);
9391                                 } /* else: export -n NOT_EXISTING_VAR: no-op */
9392                                 continue;
9393                         }
9394                         if (flags & SETFLAG_EXPORT) {
9395                                 /* export NAME (without =VALUE) */
9396                                 if (var) {
9397                                         var->flg_export = 1;
9398                                         debug_printf_env("%s: putenv '%s'\n", __func__, var->varstr);
9399                                         putenv(var->varstr);
9400                                         continue;
9401                                 }
9402                         }
9403                         if (flags & SETFLAG_MAKE_RO) {
9404                                 /* readonly NAME (without =VALUE) */
9405                                 if (var) {
9406                                         var->flg_read_only = 1;
9407                                         continue;
9408                                 }
9409                         }
9410 # if ENABLE_HUSH_LOCAL
9411                         /* Is this "local" bltin? */
9412                         if (!(flags & (SETFLAG_EXPORT|SETFLAG_UNEXPORT|SETFLAG_MAKE_RO))) {
9413                                 unsigned lvl = flags >> SETFLAG_LOCAL_SHIFT;
9414                                 if (var && var->func_nest_level == lvl) {
9415                                         /* "local x=abc; ...; local x" - ignore second local decl */
9416                                         continue;
9417                                 }
9418                         }
9419 # endif
9420                         /* Exporting non-existing variable.
9421                          * bash does not put it in environment,
9422                          * but remembers that it is exported,
9423                          * and does put it in env when it is set later.
9424                          * We just set it to "" and export.
9425                          */
9426                         /* Or, it's "local NAME" (without =VALUE).
9427                          * bash sets the value to "".
9428                          */
9429                         /* Or, it's "readonly NAME" (without =VALUE).
9430                          * bash remembers NAME and disallows its creation
9431                          * in the future.
9432                          */
9433                         name = xasprintf("%s=", name);
9434                 } else {
9435                         /* (Un)exporting/making local NAME=VALUE */
9436                         name = xstrdup(name);
9437                 }
9438                 if (set_local_var(name, flags))
9439                         return EXIT_FAILURE;
9440         } while (*++argv);
9441         return EXIT_SUCCESS;
9442 }
9443 #endif
9444
9445 #if ENABLE_HUSH_EXPORT
9446 static int FAST_FUNC builtin_export(char **argv)
9447 {
9448         unsigned opt_unexport;
9449
9450 #if ENABLE_HUSH_EXPORT_N
9451         /* "!": do not abort on errors */
9452         opt_unexport = getopt32(argv, "!n");
9453         if (opt_unexport == (uint32_t)-1)
9454                 return EXIT_FAILURE;
9455         argv += optind;
9456 #else
9457         opt_unexport = 0;
9458         argv++;
9459 #endif
9460
9461         if (argv[0] == NULL) {
9462                 char **e = environ;
9463                 if (e) {
9464                         while (*e) {
9465 #if 0
9466                                 puts(*e++);
9467 #else
9468                                 /* ash emits: export VAR='VAL'
9469                                  * bash: declare -x VAR="VAL"
9470                                  * we follow ash example */
9471                                 const char *s = *e++;
9472                                 const char *p = strchr(s, '=');
9473
9474                                 if (!p) /* wtf? take next variable */
9475                                         continue;
9476                                 /* export var= */
9477                                 printf("export %.*s", (int)(p - s) + 1, s);
9478                                 print_escaped(p + 1);
9479                                 putchar('\n');
9480 #endif
9481                         }
9482                         /*fflush_all(); - done after each builtin anyway */
9483                 }
9484                 return EXIT_SUCCESS;
9485         }
9486
9487         return helper_export_local(argv, opt_unexport ? SETFLAG_UNEXPORT : SETFLAG_EXPORT);
9488 }
9489 #endif
9490
9491 #if ENABLE_HUSH_LOCAL
9492 static int FAST_FUNC builtin_local(char **argv)
9493 {
9494         if (G.func_nest_level == 0) {
9495                 bb_error_msg("%s: not in a function", argv[0]);
9496                 return EXIT_FAILURE; /* bash compat */
9497         }
9498         argv++;
9499         return helper_export_local(argv, G.func_nest_level << SETFLAG_LOCAL_SHIFT);
9500 }
9501 #endif
9502
9503 #if ENABLE_HUSH_READONLY
9504 static int FAST_FUNC builtin_readonly(char **argv)
9505 {
9506         argv++;
9507         if (*argv == NULL) {
9508                 /* bash: readonly [-p]: list all readonly VARs
9509                  * (-p has no effect in bash)
9510                  */
9511                 struct variable *e;
9512                 for (e = G.top_var; e; e = e->next) {
9513                         if (e->flg_read_only) {
9514 //TODO: quote value: readonly VAR='VAL'
9515                                 printf("readonly %s\n", e->varstr);
9516                         }
9517                 }
9518                 return EXIT_SUCCESS;
9519         }
9520         return helper_export_local(argv, SETFLAG_MAKE_RO);
9521 }
9522 #endif
9523
9524 #if ENABLE_HUSH_UNSET
9525 /* http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#unset */
9526 static int FAST_FUNC builtin_unset(char **argv)
9527 {
9528         int ret;
9529         unsigned opts;
9530
9531         /* "!": do not abort on errors */
9532         /* "+": stop at 1st non-option */
9533         opts = getopt32(argv, "!+vf");
9534         if (opts == (unsigned)-1)
9535                 return EXIT_FAILURE;
9536         if (opts == 3) {
9537                 bb_error_msg("unset: -v and -f are exclusive");
9538                 return EXIT_FAILURE;
9539         }
9540         argv += optind;
9541
9542         ret = EXIT_SUCCESS;
9543         while (*argv) {
9544                 if (!(opts & 2)) { /* not -f */
9545                         if (unset_local_var(*argv)) {
9546                                 /* unset <nonexistent_var> doesn't fail.
9547                                  * Error is when one tries to unset RO var.
9548                                  * Message was printed by unset_local_var. */
9549                                 ret = EXIT_FAILURE;
9550                         }
9551                 }
9552 # if ENABLE_HUSH_FUNCTIONS
9553                 else {
9554                         unset_func(*argv);
9555                 }
9556 # endif
9557                 argv++;
9558         }
9559         return ret;
9560 }
9561 #endif
9562
9563 #if ENABLE_HUSH_SET
9564 /* http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#set
9565  * built-in 'set' handler
9566  * SUSv3 says:
9567  * set [-abCefhmnuvx] [-o option] [argument...]
9568  * set [+abCefhmnuvx] [+o option] [argument...]
9569  * set -- [argument...]
9570  * set -o
9571  * set +o
9572  * Implementations shall support the options in both their hyphen and
9573  * plus-sign forms. These options can also be specified as options to sh.
9574  * Examples:
9575  * Write out all variables and their values: set
9576  * Set $1, $2, and $3 and set "$#" to 3: set c a b
9577  * Turn on the -x and -v options: set -xv
9578  * Unset all positional parameters: set --
9579  * Set $1 to the value of x, even if it begins with '-' or '+': set -- "$x"
9580  * Set the positional parameters to the expansion of x, even if x expands
9581  * with a leading '-' or '+': set -- $x
9582  *
9583  * So far, we only support "set -- [argument...]" and some of the short names.
9584  */
9585 static int FAST_FUNC builtin_set(char **argv)
9586 {
9587         int n;
9588         char **pp, **g_argv;
9589         char *arg = *++argv;
9590
9591         if (arg == NULL) {
9592                 struct variable *e;
9593                 for (e = G.top_var; e; e = e->next)
9594                         puts(e->varstr);
9595                 return EXIT_SUCCESS;
9596         }
9597
9598         do {
9599                 if (strcmp(arg, "--") == 0) {
9600                         ++argv;
9601                         goto set_argv;
9602                 }
9603                 if (arg[0] != '+' && arg[0] != '-')
9604                         break;
9605                 for (n = 1; arg[n]; ++n) {
9606                         if (set_mode((arg[0] == '-'), arg[n], argv[1]))
9607                                 goto error;
9608                         if (arg[n] == 'o' && argv[1])
9609                                 argv++;
9610                 }
9611         } while ((arg = *++argv) != NULL);
9612         /* Now argv[0] is 1st argument */
9613
9614         if (arg == NULL)
9615                 return EXIT_SUCCESS;
9616  set_argv:
9617
9618         /* NB: G.global_argv[0] ($0) is never freed/changed */
9619         g_argv = G.global_argv;
9620         if (G.global_args_malloced) {
9621                 pp = g_argv;
9622                 while (*++pp)
9623                         free(*pp);
9624                 g_argv[1] = NULL;
9625         } else {
9626                 G.global_args_malloced = 1;
9627                 pp = xzalloc(sizeof(pp[0]) * 2);
9628                 pp[0] = g_argv[0]; /* retain $0 */
9629                 g_argv = pp;
9630         }
9631         /* This realloc's G.global_argv */
9632         G.global_argv = pp = add_strings_to_strings(g_argv, argv, /*dup:*/ 1);
9633
9634         G.global_argc = 1 + string_array_len(pp + 1);
9635
9636         return EXIT_SUCCESS;
9637
9638         /* Nothing known, so abort */
9639  error:
9640         bb_error_msg("set: %s: invalid option", arg);
9641         return EXIT_FAILURE;
9642 }
9643 #endif
9644
9645 static int FAST_FUNC builtin_shift(char **argv)
9646 {
9647         int n = 1;
9648         argv = skip_dash_dash(argv);
9649         if (argv[0]) {
9650                 n = bb_strtou(argv[0], NULL, 10);
9651                 if (errno || n < 0) {
9652                         /* shared string with ash.c */
9653                         bb_error_msg("Illegal number: %s", argv[0]);
9654                         /*
9655                          * ash aborts in this case.
9656                          * bash prints error message and set $? to 1.
9657                          * Interestingly, for "shift 99999" bash does not
9658                          * print error message, but does set $? to 1
9659                          * (and does no shifting at all).
9660                          */
9661                 }
9662         }
9663         if (n >= 0 && n < G.global_argc) {
9664                 if (G_global_args_malloced) {
9665                         int m = 1;
9666                         while (m <= n)
9667                                 free(G.global_argv[m++]);
9668                 }
9669                 G.global_argc -= n;
9670                 memmove(&G.global_argv[1], &G.global_argv[n+1],
9671                                 G.global_argc * sizeof(G.global_argv[0]));
9672                 return EXIT_SUCCESS;
9673         }
9674         return EXIT_FAILURE;
9675 }
9676
9677 static int FAST_FUNC builtin_source(char **argv)
9678 {
9679         char *arg_path, *filename;
9680         FILE *input;
9681         save_arg_t sv;
9682         char *args_need_save;
9683 #if ENABLE_HUSH_FUNCTIONS
9684         smallint sv_flg;
9685 #endif
9686
9687         argv = skip_dash_dash(argv);
9688         filename = argv[0];
9689         if (!filename) {
9690                 /* bash says: "bash: .: filename argument required" */
9691                 return 2; /* bash compat */
9692         }
9693         arg_path = NULL;
9694         if (!strchr(filename, '/')) {
9695                 arg_path = find_in_path(filename);
9696                 if (arg_path)
9697                         filename = arg_path;
9698         }
9699         input = remember_FILE(fopen_or_warn(filename, "r"));
9700         free(arg_path);
9701         if (!input) {
9702                 /* bb_perror_msg("%s", *argv); - done by fopen_or_warn */
9703                 /* POSIX: non-interactive shell should abort here,
9704                  * not merely fail. So far no one complained :)
9705                  */
9706                 return EXIT_FAILURE;
9707         }
9708
9709 #if ENABLE_HUSH_FUNCTIONS
9710         sv_flg = G_flag_return_in_progress;
9711         /* "we are inside sourced file, ok to use return" */
9712         G_flag_return_in_progress = -1;
9713 #endif
9714         args_need_save = argv[1]; /* used as a boolean variable */
9715         if (args_need_save)
9716                 save_and_replace_G_args(&sv, argv);
9717
9718         /* "false; . ./empty_line; echo Zero:$?" should print 0 */
9719         G.last_exitcode = 0;
9720         parse_and_run_file(input);
9721         fclose_and_forget(input);
9722
9723         if (args_need_save) /* can't use argv[1] instead: "shift" can mangle it */
9724                 restore_G_args(&sv, argv);
9725 #if ENABLE_HUSH_FUNCTIONS
9726         G_flag_return_in_progress = sv_flg;
9727 #endif
9728
9729         return G.last_exitcode;
9730 }
9731
9732 #if ENABLE_HUSH_TRAP
9733 static int FAST_FUNC builtin_trap(char **argv)
9734 {
9735         int sig;
9736         char *new_cmd;
9737
9738         if (!G_traps)
9739                 G_traps = xzalloc(sizeof(G_traps[0]) * NSIG);
9740
9741         argv++;
9742         if (!*argv) {
9743                 int i;
9744                 /* No args: print all trapped */
9745                 for (i = 0; i < NSIG; ++i) {
9746                         if (G_traps[i]) {
9747                                 printf("trap -- ");
9748                                 print_escaped(G_traps[i]);
9749                                 /* note: bash adds "SIG", but only if invoked
9750                                  * as "bash". If called as "sh", or if set -o posix,
9751                                  * then it prints short signal names.
9752                                  * We are printing short names: */
9753                                 printf(" %s\n", get_signame(i));
9754                         }
9755                 }
9756                 /*fflush_all(); - done after each builtin anyway */
9757                 return EXIT_SUCCESS;
9758         }
9759
9760         new_cmd = NULL;
9761         /* If first arg is a number: reset all specified signals */
9762         sig = bb_strtou(*argv, NULL, 10);
9763         if (errno == 0) {
9764                 int ret;
9765  process_sig_list:
9766                 ret = EXIT_SUCCESS;
9767                 while (*argv) {
9768                         sighandler_t handler;
9769
9770                         sig = get_signum(*argv++);
9771                         if (sig < 0) {
9772                                 ret = EXIT_FAILURE;
9773                                 /* Mimic bash message exactly */
9774                                 bb_error_msg("trap: %s: invalid signal specification", argv[-1]);
9775                                 continue;
9776                         }
9777
9778                         free(G_traps[sig]);
9779                         G_traps[sig] = xstrdup(new_cmd);
9780
9781                         debug_printf("trap: setting SIG%s (%i) to '%s'\n",
9782                                 get_signame(sig), sig, G_traps[sig]);
9783
9784                         /* There is no signal for 0 (EXIT) */
9785                         if (sig == 0)
9786                                 continue;
9787
9788                         if (new_cmd)
9789                                 handler = (new_cmd[0] ? record_pending_signo : SIG_IGN);
9790                         else
9791                                 /* We are removing trap handler */
9792                                 handler = pick_sighandler(sig);
9793                         install_sighandler(sig, handler);
9794                 }
9795                 return ret;
9796         }
9797
9798         if (!argv[1]) { /* no second arg */
9799                 bb_error_msg("trap: invalid arguments");
9800                 return EXIT_FAILURE;
9801         }
9802
9803         /* First arg is "-": reset all specified to default */
9804         /* First arg is "--": skip it, the rest is "handler SIGs..." */
9805         /* Everything else: set arg as signal handler
9806          * (includes "" case, which ignores signal) */
9807         if (argv[0][0] == '-') {
9808                 if (argv[0][1] == '\0') { /* "-" */
9809                         /* new_cmd remains NULL: "reset these sigs" */
9810                         goto reset_traps;
9811                 }
9812                 if (argv[0][1] == '-' && argv[0][2] == '\0') { /* "--" */
9813                         argv++;
9814                 }
9815                 /* else: "-something", no special meaning */
9816         }
9817         new_cmd = *argv;
9818  reset_traps:
9819         argv++;
9820         goto process_sig_list;
9821 }
9822 #endif
9823
9824 #if ENABLE_HUSH_JOB
9825 static struct pipe *parse_jobspec(const char *str)
9826 {
9827         struct pipe *pi;
9828         unsigned jobnum;
9829
9830         if (sscanf(str, "%%%u", &jobnum) != 1) {
9831                 if (str[0] != '%'
9832                  || (str[1] != '%' && str[1] != '+' && str[1] != '\0')
9833                 ) {
9834                         bb_error_msg("bad argument '%s'", str);
9835                         return NULL;
9836                 }
9837                 /* It is "%%", "%+" or "%" - current job */
9838                 jobnum = G.last_jobid;
9839                 if (jobnum == 0) {
9840                         bb_error_msg("no current job");
9841                         return NULL;
9842                 }
9843         }
9844         for (pi = G.job_list; pi; pi = pi->next) {
9845                 if (pi->jobid == jobnum) {
9846                         return pi;
9847                 }
9848         }
9849         bb_error_msg("%u: no such job", jobnum);
9850         return NULL;
9851 }
9852
9853 static int FAST_FUNC builtin_jobs(char **argv UNUSED_PARAM)
9854 {
9855         struct pipe *job;
9856         const char *status_string;
9857
9858         checkjobs(NULL, 0 /*(no pid to wait for)*/);
9859         for (job = G.job_list; job; job = job->next) {
9860                 if (job->alive_cmds == job->stopped_cmds)
9861                         status_string = "Stopped";
9862                 else
9863                         status_string = "Running";
9864
9865                 printf(JOB_STATUS_FORMAT, job->jobid, status_string, job->cmdtext);
9866         }
9867
9868         clean_up_last_dead_job();
9869
9870         return EXIT_SUCCESS;
9871 }
9872
9873 /* built-in 'fg' and 'bg' handler */
9874 static int FAST_FUNC builtin_fg_bg(char **argv)
9875 {
9876         int i;
9877         struct pipe *pi;
9878
9879         if (!G_interactive_fd)
9880                 return EXIT_FAILURE;
9881
9882         /* If they gave us no args, assume they want the last backgrounded task */
9883         if (!argv[1]) {
9884                 for (pi = G.job_list; pi; pi = pi->next) {
9885                         if (pi->jobid == G.last_jobid) {
9886                                 goto found;
9887                         }
9888                 }
9889                 bb_error_msg("%s: no current job", argv[0]);
9890                 return EXIT_FAILURE;
9891         }
9892
9893         pi = parse_jobspec(argv[1]);
9894         if (!pi)
9895                 return EXIT_FAILURE;
9896  found:
9897         /* TODO: bash prints a string representation
9898          * of job being foregrounded (like "sleep 1 | cat") */
9899         if (argv[0][0] == 'f' && G_saved_tty_pgrp) {
9900                 /* Put the job into the foreground.  */
9901                 tcsetpgrp(G_interactive_fd, pi->pgrp);
9902         }
9903
9904         /* Restart the processes in the job */
9905         debug_printf_jobs("reviving %d procs, pgrp %d\n", pi->num_cmds, pi->pgrp);
9906         for (i = 0; i < pi->num_cmds; i++) {
9907                 debug_printf_jobs("reviving pid %d\n", pi->cmds[i].pid);
9908         }
9909         pi->stopped_cmds = 0;
9910
9911         i = kill(- pi->pgrp, SIGCONT);
9912         if (i < 0) {
9913                 if (errno == ESRCH) {
9914                         delete_finished_job(pi);
9915                         return EXIT_SUCCESS;
9916                 }
9917                 bb_perror_msg("kill (SIGCONT)");
9918         }
9919
9920         if (argv[0][0] == 'f') {
9921                 remove_job_from_table(pi); /* FG job shouldn't be in job table */
9922                 return checkjobs_and_fg_shell(pi);
9923         }
9924         return EXIT_SUCCESS;
9925 }
9926 #endif
9927
9928 #if ENABLE_HUSH_KILL
9929 static int FAST_FUNC builtin_kill(char **argv)
9930 {
9931         int ret = 0;
9932
9933 # if ENABLE_HUSH_JOB
9934         if (argv[1] && strcmp(argv[1], "-l") != 0) {
9935                 int i = 1;
9936
9937                 do {
9938                         struct pipe *pi;
9939                         char *dst;
9940                         int j, n;
9941
9942                         if (argv[i][0] != '%')
9943                                 continue;
9944                         /*
9945                          * "kill %N" - job kill
9946                          * Converting to pgrp / pid kill
9947                          */
9948                         pi = parse_jobspec(argv[i]);
9949                         if (!pi) {
9950                                 /* Eat bad jobspec */
9951                                 j = i;
9952                                 do {
9953                                         j++;
9954                                         argv[j - 1] = argv[j];
9955                                 } while (argv[j]);
9956                                 ret = 1;
9957                                 i--;
9958                                 continue;
9959                         }
9960                         /*
9961                          * In jobs started under job control, we signal
9962                          * entire process group by kill -PGRP_ID.
9963                          * This happens, f.e., in interactive shell.
9964                          *
9965                          * Otherwise, we signal each child via
9966                          * kill PID1 PID2 PID3.
9967                          * Testcases:
9968                          * sh -c 'sleep 1|sleep 1 & kill %1'
9969                          * sh -c 'true|sleep 2 & sleep 1; kill %1'
9970                          * sh -c 'true|sleep 1 & sleep 2; kill %1'
9971                          */
9972                         n = G_interactive_fd ? 1 : pi->num_cmds;
9973                         dst = alloca(n * sizeof(int)*4);
9974                         argv[i] = dst;
9975                         if (G_interactive_fd)
9976                                 dst += sprintf(dst, " -%u", (int)pi->pgrp);
9977                         else for (j = 0; j < n; j++) {
9978                                 struct command *cmd = &pi->cmds[j];
9979                                 /* Skip exited members of the job */
9980                                 if (cmd->pid == 0)
9981                                         continue;
9982                                 /*
9983                                  * kill_main has matching code to expect
9984                                  * leading space. Needed to not confuse
9985                                  * negative pids with "kill -SIGNAL_NO" syntax
9986                                  */
9987                                 dst += sprintf(dst, " %u", (int)cmd->pid);
9988                         }
9989                         *dst = '\0';
9990                 } while (argv[++i]);
9991         }
9992 # endif
9993
9994         if (argv[1] || ret == 0) {
9995                 ret = run_applet_main(argv, kill_main);
9996         }
9997         /* else: ret = 1, "kill %bad_jobspec" case */
9998         return ret;
9999 }
10000 #endif
10001
10002 #if ENABLE_HUSH_WAIT
10003 /* http://www.opengroup.org/onlinepubs/9699919799/utilities/wait.html */
10004 #if !ENABLE_HUSH_JOB
10005 # define wait_for_child_or_signal(pipe,pid) wait_for_child_or_signal(pid)
10006 #endif
10007 static int wait_for_child_or_signal(struct pipe *waitfor_pipe, pid_t waitfor_pid)
10008 {
10009         int ret = 0;
10010         for (;;) {
10011                 int sig;
10012                 sigset_t oldset;
10013
10014                 if (!sigisemptyset(&G.pending_set))
10015                         goto check_sig;
10016
10017                 /* waitpid is not interruptible by SA_RESTARTed
10018                  * signals which we use. Thus, this ugly dance:
10019                  */
10020
10021                 /* Make sure possible SIGCHLD is stored in kernel's
10022                  * pending signal mask before we call waitpid.
10023                  * Or else we may race with SIGCHLD, lose it,
10024                  * and get stuck in sigsuspend...
10025                  */
10026                 sigfillset(&oldset); /* block all signals, remember old set */
10027                 sigprocmask(SIG_SETMASK, &oldset, &oldset);
10028
10029                 if (!sigisemptyset(&G.pending_set)) {
10030                         /* Crap! we raced with some signal! */
10031                         goto restore;
10032                 }
10033
10034                 /*errno = 0; - checkjobs does this */
10035 /* Can't pass waitfor_pipe into checkjobs(): it won't be interruptible */
10036                 ret = checkjobs(NULL, waitfor_pid); /* waitpid(WNOHANG) inside */
10037                 debug_printf_exec("checkjobs:%d\n", ret);
10038 #if ENABLE_HUSH_JOB
10039                 if (waitfor_pipe) {
10040                         int rcode = job_exited_or_stopped(waitfor_pipe);
10041                         debug_printf_exec("job_exited_or_stopped:%d\n", rcode);
10042                         if (rcode >= 0) {
10043                                 ret = rcode;
10044                                 sigprocmask(SIG_SETMASK, &oldset, NULL);
10045                                 break;
10046                         }
10047                 }
10048 #endif
10049                 /* if ECHILD, there are no children (ret is -1 or 0) */
10050                 /* if ret == 0, no children changed state */
10051                 /* if ret != 0, it's exitcode+1 of exited waitfor_pid child */
10052                 if (errno == ECHILD || ret) {
10053                         ret--;
10054                         if (ret < 0) /* if ECHILD, may need to fix "ret" */
10055                                 ret = 0;
10056                         sigprocmask(SIG_SETMASK, &oldset, NULL);
10057                         break;
10058                 }
10059                 /* Wait for SIGCHLD or any other signal */
10060                 /* It is vitally important for sigsuspend that SIGCHLD has non-DFL handler! */
10061                 /* Note: sigsuspend invokes signal handler */
10062                 sigsuspend(&oldset);
10063  restore:
10064                 sigprocmask(SIG_SETMASK, &oldset, NULL);
10065  check_sig:
10066                 /* So, did we get a signal? */
10067                 sig = check_and_run_traps();
10068                 if (sig /*&& sig != SIGCHLD - always true */) {
10069                         ret = 128 + sig;
10070                         break;
10071                 }
10072                 /* SIGCHLD, or no signal, or ignored one, such as SIGQUIT. Repeat */
10073         }
10074         return ret;
10075 }
10076
10077 static int FAST_FUNC builtin_wait(char **argv)
10078 {
10079         int ret;
10080         int status;
10081
10082         argv = skip_dash_dash(argv);
10083         if (argv[0] == NULL) {
10084                 /* Don't care about wait results */
10085                 /* Note 1: must wait until there are no more children */
10086                 /* Note 2: must be interruptible */
10087                 /* Examples:
10088                  * $ sleep 3 & sleep 6 & wait
10089                  * [1] 30934 sleep 3
10090                  * [2] 30935 sleep 6
10091                  * [1] Done                   sleep 3
10092                  * [2] Done                   sleep 6
10093                  * $ sleep 3 & sleep 6 & wait
10094                  * [1] 30936 sleep 3
10095                  * [2] 30937 sleep 6
10096                  * [1] Done                   sleep 3
10097                  * ^C <-- after ~4 sec from keyboard
10098                  * $
10099                  */
10100                 return wait_for_child_or_signal(NULL, 0 /*(no job and no pid to wait for)*/);
10101         }
10102
10103         do {
10104                 pid_t pid = bb_strtou(*argv, NULL, 10);
10105                 if (errno || pid <= 0) {
10106 #if ENABLE_HUSH_JOB
10107                         if (argv[0][0] == '%') {
10108                                 struct pipe *wait_pipe;
10109                                 ret = 127; /* bash compat for bad jobspecs */
10110                                 wait_pipe = parse_jobspec(*argv);
10111                                 if (wait_pipe) {
10112                                         ret = job_exited_or_stopped(wait_pipe);
10113                                         if (ret < 0) {
10114                                                 ret = wait_for_child_or_signal(wait_pipe, 0);
10115                                         } else {
10116                                                 /* waiting on "last dead job" removes it */
10117                                                 clean_up_last_dead_job();
10118                                         }
10119                                 }
10120                                 /* else: parse_jobspec() already emitted error msg */
10121                                 continue;
10122                         }
10123 #endif
10124                         /* mimic bash message */
10125                         bb_error_msg("wait: '%s': not a pid or valid job spec", *argv);
10126                         ret = EXIT_FAILURE;
10127                         continue; /* bash checks all argv[] */
10128                 }
10129
10130                 /* Do we have such child? */
10131                 ret = waitpid(pid, &status, WNOHANG);
10132                 if (ret < 0) {
10133                         /* No */
10134                         ret = 127;
10135                         if (errno == ECHILD) {
10136                                 if (pid == G.last_bg_pid) {
10137                                         /* "wait $!" but last bg task has already exited. Try:
10138                                          * (sleep 1; exit 3) & sleep 2; echo $?; wait $!; echo $?
10139                                          * In bash it prints exitcode 0, then 3.
10140                                          * In dash, it is 127.
10141                                          */
10142                                         ret = G.last_bg_pid_exitcode;
10143                                 } else {
10144                                         /* Example: "wait 1". mimic bash message */
10145                                         bb_error_msg("wait: pid %d is not a child of this shell", (int)pid);
10146                                 }
10147                         } else {
10148                                 /* ??? */
10149                                 bb_perror_msg("wait %s", *argv);
10150                         }
10151                         continue; /* bash checks all argv[] */
10152                 }
10153                 if (ret == 0) {
10154                         /* Yes, and it still runs */
10155                         ret = wait_for_child_or_signal(NULL, pid);
10156                 } else {
10157                         /* Yes, and it just exited */
10158                         process_wait_result(NULL, pid, status);
10159                         ret = WEXITSTATUS(status);
10160                         if (WIFSIGNALED(status))
10161                                 ret = 128 + WTERMSIG(status);
10162                 }
10163         } while (*++argv);
10164
10165         return ret;
10166 }
10167 #endif
10168
10169 #if ENABLE_HUSH_LOOPS || ENABLE_HUSH_FUNCTIONS
10170 static unsigned parse_numeric_argv1(char **argv, unsigned def, unsigned def_min)
10171 {
10172         if (argv[1]) {
10173                 def = bb_strtou(argv[1], NULL, 10);
10174                 if (errno || def < def_min || argv[2]) {
10175                         bb_error_msg("%s: bad arguments", argv[0]);
10176                         def = UINT_MAX;
10177                 }
10178         }
10179         return def;
10180 }
10181 #endif
10182
10183 #if ENABLE_HUSH_LOOPS
10184 static int FAST_FUNC builtin_break(char **argv)
10185 {
10186         unsigned depth;
10187         if (G.depth_of_loop == 0) {
10188                 bb_error_msg("%s: only meaningful in a loop", argv[0]);
10189                 /* if we came from builtin_continue(), need to undo "= 1" */
10190                 G.flag_break_continue = 0;
10191                 return EXIT_SUCCESS; /* bash compat */
10192         }
10193         G.flag_break_continue++; /* BC_BREAK = 1, or BC_CONTINUE = 2 */
10194
10195         G.depth_break_continue = depth = parse_numeric_argv1(argv, 1, 1);
10196         if (depth == UINT_MAX)
10197                 G.flag_break_continue = BC_BREAK;
10198         if (G.depth_of_loop < depth)
10199                 G.depth_break_continue = G.depth_of_loop;
10200
10201         return EXIT_SUCCESS;
10202 }
10203
10204 static int FAST_FUNC builtin_continue(char **argv)
10205 {
10206         G.flag_break_continue = 1; /* BC_CONTINUE = 2 = 1+1 */
10207         return builtin_break(argv);
10208 }
10209 #endif
10210
10211 #if ENABLE_HUSH_FUNCTIONS
10212 static int FAST_FUNC builtin_return(char **argv)
10213 {
10214         int rc;
10215
10216         if (G_flag_return_in_progress != -1) {
10217                 bb_error_msg("%s: not in a function or sourced script", argv[0]);
10218                 return EXIT_FAILURE; /* bash compat */
10219         }
10220
10221         G_flag_return_in_progress = 1;
10222
10223         /* bash:
10224          * out of range: wraps around at 256, does not error out
10225          * non-numeric param:
10226          * f() { false; return qwe; }; f; echo $?
10227          * bash: return: qwe: numeric argument required  <== we do this
10228          * 255  <== we also do this
10229          */
10230         rc = parse_numeric_argv1(argv, G.last_exitcode, 0);
10231         return rc;
10232 }
10233 #endif
10234
10235 #if ENABLE_HUSH_MEMLEAK
10236 static int FAST_FUNC builtin_memleak(char **argv UNUSED_PARAM)
10237 {
10238         void *p;
10239         unsigned long l;
10240
10241 # ifdef M_TRIM_THRESHOLD
10242         /* Optional. Reduces probability of false positives */
10243         malloc_trim(0);
10244 # endif
10245         /* Crude attempt to find where "free memory" starts,
10246          * sans fragmentation. */
10247         p = malloc(240);
10248         l = (unsigned long)p;
10249         free(p);
10250         p = malloc(3400);
10251         if (l < (unsigned long)p) l = (unsigned long)p;
10252         free(p);
10253
10254
10255 # if 0  /* debug */
10256         {
10257                 struct mallinfo mi = mallinfo();
10258                 printf("top alloc:0x%lx malloced:%d+%d=%d\n", l,
10259                         mi.arena, mi.hblkhd, mi.arena + mi.hblkhd);
10260         }
10261 # endif
10262
10263         if (!G.memleak_value)
10264                 G.memleak_value = l;
10265
10266         l -= G.memleak_value;
10267         if ((long)l < 0)
10268                 l = 0;
10269         l /= 1024;
10270         if (l > 127)
10271                 l = 127;
10272
10273         /* Exitcode is "how many kilobytes we leaked since 1st call" */
10274         return l;
10275 }
10276 #endif