08357ca77d5c26dea563c7df358ec2904afbc2c5
[oweals/busybox.git] / shell / hush.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * sh.c -- 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  *
10  * Credits:
11  *      The parser routines proper are all original material, first
12  *      written Dec 2000 and Jan 2001 by Larry Doolittle.  The
13  *      execution engine, the builtins, and much of the underlying
14  *      support has been adapted from busybox-0.49pre's lash, which is
15  *      Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
16  *      written by Erik Andersen <andersen@codepoet.org>.  That, in turn,
17  *      is based in part on ladsh.c, by Michael K. Johnson and Erik W.
18  *      Troan, which they placed in the public domain.  I don't know
19  *      how much of the Johnson/Troan code has survived the repeated
20  *      rewrites.
21  *
22  * Other credits:
23  *      b_addchr() derived from similar w_addchar function in glibc-2.2
24  *      setup_redirect(), redirect_opt_num(), and big chunks of main()
25  *      and many builtins derived from contributions by Erik Andersen
26  *      miscellaneous bugfixes from Matt Kraai
27  *
28  * There are two big (and related) architecture differences between
29  * this parser and the lash parser.  One is that this version is
30  * actually designed from the ground up to understand nearly all
31  * of the Bourne grammar.  The second, consequential change is that
32  * the parser and input reader have been turned inside out.  Now,
33  * the parser is in control, and asks for input as needed.  The old
34  * way had the input reader in control, and it asked for parsing to
35  * take place as needed.  The new way makes it much easier to properly
36  * handle the recursion implicit in the various substitutions, especially
37  * across continuation lines.
38  *
39  * Bash grammar not implemented: (how many of these were in original sh?)
40  *      $@ (those sure look like weird quoting rules)
41  *      $_
42  *      ! negation operator for pipes
43  *      &> and >& redirection of stdout+stderr
44  *      Brace Expansion
45  *      Tilde Expansion
46  *      fancy forms of Parameter Expansion
47  *      aliases
48  *      Arithmetic Expansion
49  *      <(list) and >(list) Process Substitution
50  *      reserved words: case, esac, select, function
51  *      Here Documents ( << word )
52  *      Functions
53  * Major bugs:
54  *      job handling woefully incomplete and buggy
55  *      reserved word execution woefully incomplete and buggy
56  * to-do:
57  *      port selected bugfixes from post-0.49 busybox lash - done?
58  *      finish implementing reserved words: for, while, until, do, done
59  *      change { and } from special chars to reserved words
60  *      builtins: break, continue, eval, return, set, trap, ulimit
61  *      test magic exec
62  *      handle children going into background
63  *      clean up recognition of null pipes
64  *      check setting of global_argc and global_argv
65  *      control-C handling, probably with longjmp
66  *      follow IFS rules more precisely, including update semantics
67  *      figure out what to do with backslash-newline
68  *      explain why we use signal instead of sigaction
69  *      propagate syntax errors, die on resource errors?
70  *      continuation lines, both explicit and implicit - done?
71  *      memory leak finding and plugging - done?
72  *      more testing, especially quoting rules and redirection
73  *      document how quoting rules not precisely followed for variable assignments
74  *      maybe change map[] to use 2-bit entries
75  *      (eventually) remove all the printf's
76  *
77  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
78  */
79
80 #include "busybox.h"
81 #include <glob.h>      /* glob, of course */
82 #include <getopt.h>    /* should be pretty obvious */
83
84 //#include <sys/wait.h>
85 //#include <signal.h>
86
87 /* #include <dmalloc.h> */
88 /* #define DEBUG_SHELL */
89
90
91 #define SPECIAL_VAR_SYMBOL 03
92 #define FLAG_EXIT_FROM_LOOP 1
93 #define FLAG_PARSE_SEMICOLON (1 << 1)           /* symbol ';' is special for parser */
94 #define FLAG_REPARSING           (1 << 2)               /* >=2nd pass */
95
96 typedef enum {
97         REDIRECT_INPUT     = 1,
98         REDIRECT_OVERWRITE = 2,
99         REDIRECT_APPEND    = 3,
100         REDIRECT_HEREIS    = 4,
101         REDIRECT_IO        = 5
102 } redir_type;
103
104 /* The descrip member of this structure is only used to make debugging
105  * output pretty */
106 static const struct {
107         int mode;
108         int default_fd;
109         const char *descrip;
110 } redir_table[] = {
111         { 0,                         0, "()" },
112         { O_RDONLY,                  0, "<"  },
113         { O_CREAT|O_TRUNC|O_WRONLY,  1, ">"  },
114         { O_CREAT|O_APPEND|O_WRONLY, 1, ">>" },
115         { O_RDONLY,                 -1, "<<" },
116         { O_RDWR,                    1, "<>" }
117 };
118
119 typedef enum {
120         PIPE_SEQ = 1,
121         PIPE_AND = 2,
122         PIPE_OR  = 3,
123         PIPE_BG  = 4,
124 } pipe_style;
125
126 /* might eventually control execution */
127 typedef enum {
128         RES_NONE  = 0,
129         RES_IF    = 1,
130         RES_THEN  = 2,
131         RES_ELIF  = 3,
132         RES_ELSE  = 4,
133         RES_FI    = 5,
134         RES_FOR   = 6,
135         RES_WHILE = 7,
136         RES_UNTIL = 8,
137         RES_DO    = 9,
138         RES_DONE  = 10,
139         RES_XXXX  = 11,
140         RES_IN    = 12,
141         RES_SNTX  = 13
142 } reserved_style;
143 #define FLAG_END   (1<<RES_NONE)
144 #define FLAG_IF    (1<<RES_IF)
145 #define FLAG_THEN  (1<<RES_THEN)
146 #define FLAG_ELIF  (1<<RES_ELIF)
147 #define FLAG_ELSE  (1<<RES_ELSE)
148 #define FLAG_FI    (1<<RES_FI)
149 #define FLAG_FOR   (1<<RES_FOR)
150 #define FLAG_WHILE (1<<RES_WHILE)
151 #define FLAG_UNTIL (1<<RES_UNTIL)
152 #define FLAG_DO    (1<<RES_DO)
153 #define FLAG_DONE  (1<<RES_DONE)
154 #define FLAG_IN    (1<<RES_IN)
155 #define FLAG_START (1<<RES_XXXX)
156
157 /* This holds pointers to the various results of parsing */
158 struct p_context {
159         struct child_prog *child;
160         struct pipe *list_head;
161         struct pipe *pipe;
162         struct redir_struct *pending_redirect;
163         reserved_style w;
164         int old_flag;               /* for figuring out valid reserved words */
165         struct p_context *stack;
166         int type;           /* define type of parser : ";$" common or special symbol */
167         /* How about quoting status? */
168 };
169
170 struct redir_struct {
171         redir_type type;            /* type of redirection */
172         int fd;                     /* file descriptor being redirected */
173         int dup;                    /* -1, or file descriptor being duplicated */
174         struct redir_struct *next;  /* pointer to the next redirect in the list */
175         glob_t word;                /* *word.gl_pathv is the filename */
176 };
177
178 struct child_prog {
179         pid_t pid;                  /* 0 if exited */
180         char **argv;                /* program name and arguments */
181         struct pipe *group;         /* if non-NULL, first in group or subshell */
182         int subshell;               /* flag, non-zero if group must be forked */
183         struct redir_struct *redirects; /* I/O redirections */
184         glob_t glob_result;         /* result of parameter globbing */
185         int is_stopped;             /* is the program currently running? */
186         struct pipe *family;        /* pointer back to the child's parent pipe */
187         int sp;                     /* number of SPECIAL_VAR_SYMBOL */
188         int type;
189 };
190
191 struct pipe {
192         int jobid;                  /* job number */
193         int num_progs;              /* total number of programs in job */
194         int running_progs;          /* number of programs running */
195         char *text;                 /* name of job */
196         char *cmdbuf;               /* buffer various argv's point into */
197         pid_t pgrp;                 /* process group ID for the job */
198         struct child_prog *progs;   /* array of commands in pipe */
199         struct pipe *next;          /* to track background commands */
200         int stopped_progs;          /* number of programs alive, but stopped */
201         int job_context;            /* bitmask defining current context */
202         pipe_style followup;        /* PIPE_BG, PIPE_SEQ, PIPE_OR, PIPE_AND */
203         reserved_style r_mode;      /* supports if, for, while, until */
204 };
205
206 struct close_me {
207         int fd;
208         struct close_me *next;
209 };
210
211 struct variables {
212         const char *name;
213         const char *value;
214         int flg_export;
215         int flg_read_only;
216         struct variables *next;
217 };
218
219 /* globals, connect us to the outside world
220  * the first three support $?, $#, and $1 */
221 static char **global_argv;
222 static int global_argc;
223 static int last_return_code;
224 extern char **environ; /* This is in <unistd.h>, but protected with __USE_GNU */
225
226 /* "globals" within this file */
227 static const char *ifs;
228 static unsigned char map[256];
229 static int fake_mode;
230 static int interactive;
231 static struct close_me *close_me_head;
232 static const char *cwd;
233 static struct pipe *job_list;
234 static unsigned last_bg_pid;
235 static int last_jobid;
236 static unsigned shell_terminal;
237 static const char *PS1;
238 static const char *PS2;
239 static struct variables shell_ver = { "HUSH_VERSION", "0.01", 1, 1, 0 };
240 static struct variables *top_vars = &shell_ver;
241
242
243 #define B_CHUNK (100)
244 #define B_NOSPAC 1
245
246 typedef struct {
247         char *data;
248         int length;
249         int maxlen;
250         int quote;
251         int nonnull;
252 } o_string;
253 #define NULL_O_STRING {NULL,0,0,0,0}
254 /* used for initialization:
255         o_string foo = NULL_O_STRING; */
256
257 /* I can almost use ordinary FILE *.  Is open_memstream() universally
258  * available?  Where is it documented? */
259 struct in_str {
260         const char *p;
261         char peek_buf[2];
262         int __promptme;
263         int promptmode;
264         FILE *file;
265         int (*get) (struct in_str *);
266         int (*peek) (struct in_str *);
267 };
268 #define b_getch(input) ((input)->get(input))
269 #define b_peek(input) ((input)->peek(input))
270
271 #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n"
272
273 struct built_in_command {
274         const char *cmd;                        /* name */
275         const char *descr;                      /* description */
276         int (*function) (struct child_prog *);  /* function ptr */
277 };
278
279 /* belongs in busybox.h */
280 static int max(int a, int b)
281 {
282         return (a > b) ? a : b;
283 }
284
285 /* This should be in utility.c */
286 #ifdef DEBUG_SHELL
287 static void debug_printf(const char *format, ...)
288 {
289         va_list args;
290         va_start(args, format);
291         vfprintf(stderr, format, args);
292         va_end(args);
293 }
294 /* broken, of course, but OK for testing */
295 static char *indenter(int i)
296 {
297         static char blanks[] = "                                    ";
298         return &blanks[sizeof(blanks)-i-1];
299 }
300 #else
301 #define debug_printf(...) do {} while (0)
302 #endif
303 #define final_printf debug_printf
304
305 static void __syntax(const char *file, int line)
306 {
307         bb_error_msg("syntax error %s:%d", file, line);
308 }
309 // NB: was __FILE__, but that produces full path sometimess, so...
310 #define syntax() __syntax("hush.c", __LINE__)
311
312 /* Index of subroutines: */
313 /*   function prototypes for builtins */
314 static int builtin_cd(struct child_prog *child);
315 static int builtin_env(struct child_prog *child);
316 static int builtin_eval(struct child_prog *child);
317 static int builtin_exec(struct child_prog *child);
318 static int builtin_exit(struct child_prog *child);
319 static int builtin_export(struct child_prog *child);
320 static int builtin_fg_bg(struct child_prog *child);
321 static int builtin_help(struct child_prog *child);
322 static int builtin_jobs(struct child_prog *child);
323 static int builtin_pwd(struct child_prog *child);
324 static int builtin_read(struct child_prog *child);
325 static int builtin_set(struct child_prog *child);
326 static int builtin_shift(struct child_prog *child);
327 static int builtin_source(struct child_prog *child);
328 static int builtin_umask(struct child_prog *child);
329 static int builtin_unset(struct child_prog *child);
330 static int builtin_not_written(struct child_prog *child);
331 /*   o_string manipulation: */
332 static int b_check_space(o_string *o, int len);
333 static int b_addchr(o_string *o, int ch);
334 static void b_reset(o_string *o);
335 static int b_addqchr(o_string *o, int ch, int quote);
336 static int b_adduint(o_string *o, unsigned i);
337 /*  in_str manipulations: */
338 static int static_get(struct in_str *i);
339 static int static_peek(struct in_str *i);
340 static int file_get(struct in_str *i);
341 static int file_peek(struct in_str *i);
342 static void setup_file_in_str(struct in_str *i, FILE *f);
343 static void setup_string_in_str(struct in_str *i, const char *s);
344 /*  close_me manipulations: */
345 static void mark_open(int fd);
346 static void mark_closed(int fd);
347 static void close_all(void);
348 /*  "run" the final data structures: */
349 static int free_pipe_list(struct pipe *head, int indent);
350 static int free_pipe(struct pipe *pi, int indent);
351 /*  really run the final data structures: */
352 static int setup_redirects(struct child_prog *prog, int squirrel[]);
353 static int run_list_real(struct pipe *pi);
354 static void pseudo_exec(struct child_prog *child) ATTRIBUTE_NORETURN;
355 static int run_pipe_real(struct pipe *pi);
356 /*   extended glob support: */
357 static int globhack(const char *src, int flags, glob_t *pglob);
358 static int glob_needed(const char *s);
359 static int xglob(o_string *dest, int flags, glob_t *pglob);
360 /*   variable assignment: */
361 static int is_assignment(const char *s);
362 /*   data structure manipulation: */
363 static int setup_redirect(struct p_context *ctx, int fd, redir_type style, struct in_str *input);
364 static void initialize_context(struct p_context *ctx);
365 static int done_word(o_string *dest, struct p_context *ctx);
366 static int done_command(struct p_context *ctx);
367 static int done_pipe(struct p_context *ctx, pipe_style type);
368 /*   primary string parsing: */
369 static int redirect_dup_num(struct in_str *input);
370 static int redirect_opt_num(o_string *o);
371 static int process_command_subs(o_string *dest, struct p_context *ctx, struct in_str *input, int subst_end);
372 static int parse_group(o_string *dest, struct p_context *ctx, struct in_str *input, int ch);
373 static const char *lookup_param(const char *src);
374 static char *make_string(char **inp);
375 static int handle_dollar(o_string *dest, struct p_context *ctx, struct in_str *input);
376 static int parse_string(o_string *dest, struct p_context *ctx, const char *src);
377 static int parse_stream(o_string *dest, struct p_context *ctx, struct in_str *input0, int end_trigger);
378 /*   setup: */
379 static int parse_stream_outer(struct in_str *inp, int flag);
380 static int parse_string_outer(const char *s, int flag);
381 static int parse_file_outer(FILE *f);
382 /*   job management: */
383 static int checkjobs(struct pipe* fg_pipe);
384 static void insert_bg_job(struct pipe *pi);
385 static void remove_bg_job(struct pipe *pi);
386 /*     local variable support */
387 static char **make_list_in(char **inp, char *name);
388 static char *insert_var_value(char *inp);
389 static const char *get_local_var(const char *var);
390 static void  unset_local_var(const char *name);
391 static int set_local_var(const char *s, int flg_export);
392
393 /* Table of built-in functions.  They can be forked or not, depending on
394  * context: within pipes, they fork.  As simple commands, they do not.
395  * When used in non-forking context, they can change global variables
396  * in the parent shell process.  If forked, of course they cannot.
397  * For example, 'unset foo | whatever' will parse and run, but foo will
398  * still be set at the end. */
399 static const struct built_in_command bltins[] = {
400         { "bg", "Resume a job in the background", builtin_fg_bg },
401         { "break", "Exit for, while or until loop", builtin_not_written },
402         { "cd", "Change working directory", builtin_cd },
403         { "continue", "Continue for, while or until loop", builtin_not_written },
404         { "env", "Print all environment variables", builtin_env },
405         { "eval", "Construct and run shell command", builtin_eval },
406         { "exec", "Exec command, replacing this shell with the exec'd process",
407                 builtin_exec },
408         { "exit", "Exit from shell()", builtin_exit },
409         { "export", "Set environment variable", builtin_export },
410         { "fg", "Bring job into the foreground", builtin_fg_bg },
411         { "jobs", "Lists the active jobs", builtin_jobs },
412         { "pwd", "Print current directory", builtin_pwd },
413         { "read", "Input environment variable", builtin_read },
414         { "return", "Return from a function", builtin_not_written },
415         { "set", "Set/unset shell local variables", builtin_set },
416         { "shift", "Shift positional parameters", builtin_shift },
417         { "trap", "Trap signals", builtin_not_written },
418         { "ulimit","Controls resource limits", builtin_not_written },
419         { "umask","Sets file creation mask", builtin_umask },
420         { "unset", "Unset environment variable", builtin_unset },
421         { ".", "Source-in and run commands in a file", builtin_source },
422         { "help", "List shell built-in commands", builtin_help },
423         { NULL, NULL, NULL }
424 };
425
426 static const char *set_cwd(void)
427 {
428         if (cwd == bb_msg_unknown)
429                 cwd = NULL;     /* xrealloc_getcwd_or_warn(arg) calls free(arg)! */
430         cwd = xrealloc_getcwd_or_warn((char *)cwd);
431         if (!cwd)
432                 cwd = bb_msg_unknown;
433         return cwd;
434 }
435
436 /* built-in 'eval' handler */
437 static int builtin_eval(struct child_prog *child)
438 {
439         char *str = NULL;
440         int rcode = EXIT_SUCCESS;
441
442         if (child->argv[1]) {
443                 str = make_string(child->argv + 1);
444                 parse_string_outer(str, FLAG_EXIT_FROM_LOOP |
445                                         FLAG_PARSE_SEMICOLON);
446                 free(str);
447                 rcode = last_return_code;
448         }
449         return rcode;
450 }
451
452 /* built-in 'cd <path>' handler */
453 static int builtin_cd(struct child_prog *child)
454 {
455         char *newdir;
456         if (child->argv[1] == NULL)
457                 newdir = getenv("HOME");
458         else
459                 newdir = child->argv[1];
460         if (chdir(newdir)) {
461                 printf("cd: %s: %s\n", newdir, strerror(errno));
462                 return EXIT_FAILURE;
463         }
464         set_cwd();
465         return EXIT_SUCCESS;
466 }
467
468 /* built-in 'env' handler */
469 static int builtin_env(struct child_prog *dummy ATTRIBUTE_UNUSED)
470 {
471         char **e = environ;
472         if (e == NULL)
473                 return EXIT_FAILURE;
474         while (*e) {
475                 puts(*e++);
476         }
477         return EXIT_SUCCESS;
478 }
479
480 /* built-in 'exec' handler */
481 static int builtin_exec(struct child_prog *child)
482 {
483         if (child->argv[1] == NULL)
484                 return EXIT_SUCCESS;   /* Really? */
485         child->argv++;
486         pseudo_exec(child);
487         /* never returns */
488 }
489
490 /* built-in 'exit' handler */
491 static int builtin_exit(struct child_prog *child)
492 {
493         if (child->argv[1] == NULL)
494                 exit(last_return_code);
495         exit(atoi(child->argv[1]));
496 }
497
498 /* built-in 'export VAR=value' handler */
499 static int builtin_export(struct child_prog *child)
500 {
501         int res = 0;
502         char *name = child->argv[1];
503
504         if (name == NULL) {
505                 return builtin_env(child);
506         }
507
508         name = strdup(name);
509
510         if (name) {
511                 const char *value = strchr(name, '=');
512
513                 if (!value) {
514                         char *tmp;
515                         /* They are exporting something without an =VALUE */
516
517                         value = get_local_var(name);
518                         if (value) {
519                                 size_t ln = strlen(name);
520
521                                 tmp = realloc(name, ln+strlen(value)+2);
522                                 if (tmp == NULL)
523                                         res = -1;
524                                 else {
525                                         sprintf(tmp+ln, "=%s", value);
526                                         name = tmp;
527                                 }
528                         } else {
529                                 /* bash does not return an error when trying to export
530                                  * an undefined variable.  Do likewise. */
531                                 res = 1;
532                         }
533                 }
534         }
535         if (res < 0)
536                 bb_perror_msg("export");
537         else if (res == 0)
538                 res = set_local_var(name, 1);
539         else
540                 res = 0;
541         free(name);
542         return res;
543 }
544
545 /* built-in 'fg' and 'bg' handler */
546 static int builtin_fg_bg(struct child_prog *child)
547 {
548         int i, jobnum;
549         struct pipe *pi;
550
551         if (!interactive)
552                 return EXIT_FAILURE;
553         /* If they gave us no args, assume they want the last backgrounded task */
554         if (!child->argv[1]) {
555                 for (pi = job_list; pi; pi = pi->next) {
556                         if (pi->jobid == last_jobid) {
557                                 goto found;
558                         }
559                 }
560                 bb_error_msg("%s: no current job", child->argv[0]);
561                 return EXIT_FAILURE;
562         }
563         if (sscanf(child->argv[1], "%%%d", &jobnum) != 1) {
564                 bb_error_msg("%s: bad argument '%s'", child->argv[0], child->argv[1]);
565                 return EXIT_FAILURE;
566         }
567         for (pi = job_list; pi; pi = pi->next) {
568                 if (pi->jobid == jobnum) {
569                         goto found;
570                 }
571         }
572         bb_error_msg("%s: %d: no such job", child->argv[0], jobnum);
573         return EXIT_FAILURE;
574  found:
575         if (*child->argv[0] == 'f') {
576                 /* Put the job into the foreground.  */
577                 tcsetpgrp(shell_terminal, pi->pgrp);
578         }
579
580         /* Restart the processes in the job */
581         for (i = 0; i < pi->num_progs; i++)
582                 pi->progs[i].is_stopped = 0;
583
584         i = kill(- pi->pgrp, SIGCONT);
585         if (i < 0) {
586                 if (errno == ESRCH) {
587                         remove_bg_job(pi);
588                 } else {
589                         bb_perror_msg("kill (SIGCONT)");
590                 }
591         }
592
593         pi->stopped_progs = 0;
594         return EXIT_SUCCESS;
595 }
596
597 /* built-in 'help' handler */
598 static int builtin_help(struct child_prog *dummy ATTRIBUTE_UNUSED)
599 {
600         const struct built_in_command *x;
601
602         printf("\nBuilt-in commands:\n");
603         printf("-------------------\n");
604         for (x = bltins; x->cmd; x++) {
605                 if (x->descr == NULL)
606                         continue;
607                 printf("%s\t%s\n", x->cmd, x->descr);
608         }
609         printf("\n\n");
610         return EXIT_SUCCESS;
611 }
612
613 /* built-in 'jobs' handler */
614 static int builtin_jobs(struct child_prog *child ATTRIBUTE_UNUSED)
615 {
616         struct pipe *job;
617         const char *status_string;
618
619         for (job = job_list; job; job = job->next) {
620                 if (job->running_progs == job->stopped_progs)
621                         status_string = "Stopped";
622                 else
623                         status_string = "Running";
624
625                 printf(JOB_STATUS_FORMAT, job->jobid, status_string, job->text);
626         }
627         return EXIT_SUCCESS;
628 }
629
630 /* built-in 'pwd' handler */
631 static int builtin_pwd(struct child_prog *dummy ATTRIBUTE_UNUSED)
632 {
633         puts(set_cwd());
634         return EXIT_SUCCESS;
635 }
636
637 /* built-in 'read VAR' handler */
638 static int builtin_read(struct child_prog *child)
639 {
640         int res;
641
642         if (child->argv[1]) {
643                 char string[BUFSIZ];
644                 char *var = NULL;
645
646                 string[0] = '\0';  /* In case stdin has only EOF */
647                 /* read string */
648                 fgets(string, sizeof(string), stdin);
649                 chomp(string);
650                 var = malloc(strlen(child->argv[1]) + strlen(string) + 2);
651                 if (var) {
652                         sprintf(var, "%s=%s", child->argv[1], string);
653                         res = set_local_var(var, 0);
654                 } else
655                         res = -1;
656                 if (res)
657                         bb_perror_msg("read");
658                 free(var);      /* So not move up to avoid breaking errno */
659                 return res;
660         }
661         do res = getchar(); while (res != '\n' && res != EOF);
662         return 0;
663 }
664
665 /* built-in 'set VAR=value' handler */
666 static int builtin_set(struct child_prog *child)
667 {
668         char *temp = child->argv[1];
669         struct variables *e;
670
671         if (temp == NULL)
672                 for (e = top_vars; e; e = e->next)
673                         printf("%s=%s\n", e->name, e->value);
674         else
675                 set_local_var(temp, 0);
676
677         return EXIT_SUCCESS;
678 }
679
680
681 /* Built-in 'shift' handler */
682 static int builtin_shift(struct child_prog *child)
683 {
684         int n = 1;
685         if (child->argv[1]) {
686                 n = atoi(child->argv[1]);
687         }
688         if (n >= 0 && n < global_argc) {
689                 /* XXX This probably breaks $0 */
690                 global_argc -= n;
691                 global_argv += n;
692                 return EXIT_SUCCESS;
693         }
694         return EXIT_FAILURE;
695 }
696
697 /* Built-in '.' handler (read-in and execute commands from file) */
698 static int builtin_source(struct child_prog *child)
699 {
700         FILE *input;
701         int status;
702
703         if (child->argv[1] == NULL)
704                 return EXIT_FAILURE;
705
706         /* XXX search through $PATH is missing */
707         input = fopen(child->argv[1], "r");
708         if (!input) {
709                 bb_error_msg("cannot open '%s'", child->argv[1]);
710                 return EXIT_FAILURE;
711         }
712
713         /* Now run the file */
714         /* XXX argv and argc are broken; need to save old global_argv
715          * (pointer only is OK!) on this stack frame,
716          * set global_argv=child->argv+1, recurse, and restore. */
717         mark_open(fileno(input));
718         status = parse_file_outer(input);
719         mark_closed(fileno(input));
720         fclose(input);
721         return status;
722 }
723
724 static int builtin_umask(struct child_prog *child)
725 {
726         mode_t new_umask;
727         const char *arg = child->argv[1];
728         char *end;
729         if (arg) {
730                 new_umask = strtoul(arg, &end, 8);
731                 if (*end != '\0' || end == arg) {
732                         return EXIT_FAILURE;
733                 }
734         } else {
735                 new_umask = umask(0);
736                 printf("%.3o\n", (unsigned) new_umask);
737         }
738         umask(new_umask);
739         return EXIT_SUCCESS;
740 }
741
742 /* built-in 'unset VAR' handler */
743 static int builtin_unset(struct child_prog *child)
744 {
745         /* bash returned already true */
746         unset_local_var(child->argv[1]);
747         return EXIT_SUCCESS;
748 }
749
750 static int builtin_not_written(struct child_prog *child)
751 {
752         printf("builtin_%s not written\n", child->argv[0]);
753         return EXIT_FAILURE;
754 }
755
756 static int b_check_space(o_string *o, int len)
757 {
758         /* It would be easy to drop a more restrictive policy
759          * in here, such as setting a maximum string length */
760         if (o->length + len > o->maxlen) {
761                 char *old_data = o->data;
762                 /* assert(data == NULL || o->maxlen != 0); */
763                 o->maxlen += max(2*len, B_CHUNK);
764                 o->data = realloc(o->data, 1 + o->maxlen);
765                 if (o->data == NULL) {
766                         free(old_data);
767                 }
768         }
769         return o->data == NULL;
770 }
771
772 static int b_addchr(o_string *o, int ch)
773 {
774         debug_printf("b_addchr: %c %d %p\n", ch, o->length, o);
775         if (b_check_space(o, 1))
776                 return B_NOSPAC;
777         o->data[o->length] = ch;
778         o->length++;
779         o->data[o->length] = '\0';
780         return 0;
781 }
782
783 static void b_reset(o_string *o)
784 {
785         o->length = 0;
786         o->nonnull = 0;
787         if (o->data != NULL)
788                 *o->data = '\0';
789 }
790
791 static void b_free(o_string *o)
792 {
793         b_reset(o);
794         free(o->data);
795         o->data = NULL;
796         o->maxlen = 0;
797 }
798
799 /* My analysis of quoting semantics tells me that state information
800  * is associated with a destination, not a source.
801  */
802 static int b_addqchr(o_string *o, int ch, int quote)
803 {
804         if (quote && strchr("*?[\\", ch)) {
805                 int rc;
806                 rc = b_addchr(o, '\\');
807                 if (rc)
808                         return rc;
809         }
810         return b_addchr(o, ch);
811 }
812
813 static int b_adduint(o_string *o, unsigned i)
814 {
815         int r;
816         char buf[sizeof(unsigned)*3 + 1];
817         char *p = buf;
818         *(utoa_to_buf(i, buf, sizeof(buf))) = '\0';
819         /* no escape checking necessary */
820         do r = b_addchr(o, *p++); while (r == 0 && *p);
821         return r;
822 }
823
824 static int static_get(struct in_str *i)
825 {
826         int ch = *i->p++;
827         if (ch == '\0') return EOF;
828         return ch;
829 }
830
831 static int static_peek(struct in_str *i)
832 {
833         return *i->p;
834 }
835
836 static void cmdedit_set_initial_prompt(void)
837 {
838 #if !ENABLE_FEATURE_EDITING_FANCY_PROMPT
839         PS1 = NULL;
840 #else
841         PS1 = getenv("PS1");
842         if (PS1 == NULL)
843                 PS1 = "\\w \\$ ";
844 #endif
845 }
846
847 static const char* setup_prompt_string(int promptmode)
848 {
849         const char *prompt_str;
850         debug_printf("setup_prompt_string %d ", promptmode);
851 #if !ENABLE_FEATURE_EDITING_FANCY_PROMPT
852         /* Set up the prompt */
853         if (promptmode == 1) {
854                 char *ns;
855                 free((char*)PS1);
856                 ns = xmalloc(strlen(cwd)+4);
857                 sprintf(ns, "%s %s", cwd, (geteuid() != 0) ? "$ " : "# ");
858                 prompt_str = ns;
859                 PS1 = ns;
860         } else {
861                 prompt_str = PS2;
862         }
863 #else
864         prompt_str = (promptmode == 1) ? PS1 : PS2;
865 #endif
866         debug_printf("result %s\n", prompt_str);
867         return prompt_str;
868 }
869
870 #if ENABLE_FEATURE_EDITING
871 static line_input_t *line_input_state;
872 #endif
873
874 static void get_user_input(struct in_str *i)
875 {
876         const char *prompt_str;
877         static char the_command[BUFSIZ];
878
879         prompt_str = setup_prompt_string(i->promptmode);
880 #if ENABLE_FEATURE_EDITING
881         /*
882          ** enable command line editing only while a command line
883          ** is actually being read; otherwise, we'll end up bequeathing
884          ** atexit() handlers and other unwanted stuff to our
885          ** child processes (rob@sysgo.de)
886          */
887         read_line_input(prompt_str, the_command, BUFSIZ, line_input_state);
888 #else
889         fputs(prompt_str, stdout);
890         fflush(stdout);
891         the_command[0] = fgetc(i->file);
892         the_command[1] = '\0';
893 #endif
894         fflush(stdout);
895         i->p = the_command;
896 }
897
898 /* This is the magic location that prints prompts
899  * and gets data back from the user */
900 static int file_get(struct in_str *i)
901 {
902         int ch;
903
904         ch = 0;
905         /* If there is data waiting, eat it up */
906         if (i->p && *i->p) {
907                 ch = *i->p++;
908         } else {
909                 /* need to double check i->file because we might be doing something
910                  * more complicated by now, like sourcing or substituting. */
911                 if (i->__promptme && interactive && i->file == stdin) {
912                         while (!i->p || !(interactive && strlen(i->p))) {
913                                 get_user_input(i);
914                         }
915                         i->promptmode = 2;
916                         i->__promptme = 0;
917                         if (i->p && *i->p) {
918                                 ch = *i->p++;
919                         }
920                 } else {
921                         ch = fgetc(i->file);
922                 }
923
924                 debug_printf("b_getch: got a %d\n", ch);
925         }
926         if (ch == '\n')
927                 i->__promptme = 1;
928         return ch;
929 }
930
931 /* All the callers guarantee this routine will never be
932  * used right after a newline, so prompting is not needed.
933  */
934 static int file_peek(struct in_str *i)
935 {
936         if (i->p && *i->p) {
937                 return *i->p;
938         }
939         i->peek_buf[0] = fgetc(i->file);
940         i->peek_buf[1] = '\0';
941         i->p = i->peek_buf;
942         debug_printf("b_peek: got a %d\n", *i->p);
943         return *i->p;
944 }
945
946 static void setup_file_in_str(struct in_str *i, FILE *f)
947 {
948         i->peek = file_peek;
949         i->get = file_get;
950         i->__promptme = 1;
951         i->promptmode = 1;
952         i->file = f;
953         i->p = NULL;
954 }
955
956 static void setup_string_in_str(struct in_str *i, const char *s)
957 {
958         i->peek = static_peek;
959         i->get = static_get;
960         i->__promptme = 1;
961         i->promptmode = 1;
962         i->p = s;
963 }
964
965 static void mark_open(int fd)
966 {
967         struct close_me *new = xmalloc(sizeof(struct close_me));
968         new->fd = fd;
969         new->next = close_me_head;
970         close_me_head = new;
971 }
972
973 static void mark_closed(int fd)
974 {
975         struct close_me *tmp;
976         if (close_me_head == NULL || close_me_head->fd != fd)
977                 bb_error_msg_and_die("corrupt close_me");
978         tmp = close_me_head;
979         close_me_head = close_me_head->next;
980         free(tmp);
981 }
982
983 static void close_all(void)
984 {
985         struct close_me *c;
986         for (c = close_me_head; c; c = c->next) {
987                 close(c->fd);
988         }
989         close_me_head = NULL;
990 }
991
992 /* squirrel != NULL means we squirrel away copies of stdin, stdout,
993  * and stderr if they are redirected. */
994 static int setup_redirects(struct child_prog *prog, int squirrel[])
995 {
996         int openfd, mode;
997         struct redir_struct *redir;
998
999         for (redir = prog->redirects; redir; redir = redir->next) {
1000                 if (redir->dup == -1 && redir->word.gl_pathv == NULL) {
1001                         /* something went wrong in the parse.  Pretend it didn't happen */
1002                         continue;
1003                 }
1004                 if (redir->dup == -1) {
1005                         mode = redir_table[redir->type].mode;
1006                         openfd = open_or_warn(redir->word.gl_pathv[0], mode);
1007                         if (openfd < 0) {
1008                         /* this could get lost if stderr has been redirected, but
1009                            bash and ash both lose it as well (though zsh doesn't!) */
1010                                 return 1;
1011                         }
1012                 } else {
1013                         openfd = redir->dup;
1014                 }
1015
1016                 if (openfd != redir->fd) {
1017                         if (squirrel && redir->fd < 3) {
1018                                 squirrel[redir->fd] = dup(redir->fd);
1019                         }
1020                         if (openfd == -3) {
1021                                 close(openfd);
1022                         } else {
1023                                 dup2(openfd, redir->fd);
1024                                 if (redir->dup == -1)
1025                                         close(openfd);
1026                         }
1027                 }
1028         }
1029         return 0;
1030 }
1031
1032 static void restore_redirects(int squirrel[])
1033 {
1034         int i, fd;
1035         for (i = 0; i < 3; i++) {
1036                 fd = squirrel[i];
1037                 if (fd != -1) {
1038                         /* No error checking.  I sure wouldn't know what
1039                          * to do with an error if I found one! */
1040                         dup2(fd, i);
1041                         close(fd);
1042                 }
1043         }
1044 }
1045
1046 /* never returns */
1047 /* XXX no exit() here.  If you don't exec, use _exit instead.
1048  * The at_exit handlers apparently confuse the calling process,
1049  * in particular stdin handling.  Not sure why? */
1050 static void pseudo_exec(struct child_prog *child)
1051 {
1052         int i, rcode;
1053         char *p;
1054         const struct built_in_command *x;
1055         if (child->argv) {
1056                 for (i = 0; is_assignment(child->argv[i]); i++) {
1057                         debug_printf("pid %d environment modification: %s\n",
1058                                         getpid(), child->argv[i]);
1059                         p = insert_var_value(child->argv[i]);
1060                         putenv(strdup(p));
1061                         if (p != child->argv[i])
1062                                 free(p);
1063                 }
1064                 child->argv += i;  /* XXX this hack isn't so horrible, since we are about
1065                                         to exit, and therefore don't need to keep data
1066                                         structures consistent for free() use. */
1067                 /* If a variable is assigned in a forest, and nobody listens,
1068                  * was it ever really set?
1069                  */
1070                 if (child->argv[0] == NULL) {
1071                         _exit(EXIT_SUCCESS);
1072                 }
1073
1074                 /*
1075                  * Check if the command matches any of the builtins.
1076                  * Depending on context, this might be redundant.  But it's
1077                  * easier to waste a few CPU cycles than it is to figure out
1078                  * if this is one of those cases.
1079                  */
1080                 for (x = bltins; x->cmd; x++) {
1081                         if (strcmp(child->argv[0], x->cmd) == 0) {
1082                                 debug_printf("builtin exec %s\n", child->argv[0]);
1083                                 rcode = x->function(child);
1084                                 fflush(stdout);
1085                                 _exit(rcode);
1086                         }
1087                 }
1088
1089                 /* Check if the command matches any busybox internal commands
1090                  * ("applets") here.
1091                  * FIXME: This feature is not 100% safe, since
1092                  * BusyBox is not fully reentrant, so we have no guarantee the things
1093                  * from the .bss are still zeroed, or that things from .data are still
1094                  * at their defaults.  We could exec ourself from /proc/self/exe, but I
1095                  * really dislike relying on /proc for things.  We could exec ourself
1096                  * from global_argv[0], but if we are in a chroot, we may not be able
1097                  * to find ourself... */
1098 #if ENABLE_FEATURE_SH_STANDALONE
1099                 debug_printf("running applet %s\n", child->argv[0]);
1100                 run_applet_and_exit(child->argv[0], child->argv);
1101 // is it ok that run_applet_and_exit() does exit(), not _exit()?
1102 // NB: IIRC on NOMMU we are after _vfork_, not fork!
1103 #endif
1104                 debug_printf("exec of %s\n", child->argv[0]);
1105                 execvp(child->argv[0], child->argv);
1106                 bb_perror_msg("cannot exec: %s", child->argv[0]);
1107                 _exit(1);
1108         }
1109
1110         if (child->group) {
1111                 debug_printf("runtime nesting to group\n");
1112                 interactive = 0;    /* crucial!!!! */
1113                 rcode = run_list_real(child->group);
1114                 /* OK to leak memory by not calling free_pipe_list,
1115                  * since this process is about to exit */
1116                 _exit(rcode);
1117         }
1118
1119         /* Can happen.  See what bash does with ">foo" by itself. */
1120         debug_printf("trying to pseudo_exec null command\n");
1121         _exit(EXIT_SUCCESS);
1122 }
1123
1124 static void insert_bg_job(struct pipe *pi)
1125 {
1126         struct pipe *thejob;
1127
1128         /* Linear search for the ID of the job to use */
1129         pi->jobid = 1;
1130         for (thejob = job_list; thejob; thejob = thejob->next)
1131                 if (thejob->jobid >= pi->jobid)
1132                         pi->jobid = thejob->jobid + 1;
1133
1134         /* add thejob to the list of running jobs */
1135         if (!job_list) {
1136                 thejob = job_list = xmalloc(sizeof(*thejob));
1137         } else {
1138                 for (thejob = job_list; thejob->next; thejob = thejob->next)
1139                         continue;
1140                 thejob->next = xmalloc(sizeof(*thejob));
1141                 thejob = thejob->next;
1142         }
1143
1144         /* physically copy the struct job */
1145         memcpy(thejob, pi, sizeof(struct pipe));
1146         thejob->next = NULL;
1147         thejob->running_progs = thejob->num_progs;
1148         thejob->stopped_progs = 0;
1149         thejob->text = xmalloc(BUFSIZ); /* cmdedit buffer size */
1150
1151         //if (pi->progs[0] && pi->progs[0].argv && pi->progs[0].argv[0])
1152         {
1153                 char *bar = thejob->text;
1154                 char **foo = pi->progs[0].argv;
1155                 if (foo)
1156                         while (*foo)
1157                                 bar += sprintf(bar, "%s ", *foo++);
1158         }
1159
1160         /* we don't wait for background thejobs to return -- append it
1161            to the list of backgrounded thejobs and leave it alone */
1162         printf("[%d] %d\n", thejob->jobid, thejob->progs[0].pid);
1163         last_bg_pid = thejob->progs[0].pid;
1164         last_jobid = thejob->jobid;
1165 }
1166
1167 /* remove a backgrounded job */
1168 static void remove_bg_job(struct pipe *pi)
1169 {
1170         struct pipe *prev_pipe;
1171
1172         if (pi == job_list) {
1173                 job_list = pi->next;
1174         } else {
1175                 prev_pipe = job_list;
1176                 while (prev_pipe->next != pi)
1177                         prev_pipe = prev_pipe->next;
1178                 prev_pipe->next = pi->next;
1179         }
1180         if (job_list)
1181                 last_jobid = job_list->jobid;
1182         else
1183                 last_jobid = 0;
1184
1185         pi->stopped_progs = 0;
1186         free_pipe(pi, 0);
1187         free(pi);
1188 }
1189
1190 /* Checks to see if any processes have exited -- if they
1191    have, figure out why and see if a job has completed */
1192 static int checkjobs(struct pipe* fg_pipe)
1193 {
1194         int attributes;
1195         int status;
1196         int prognum = 0;
1197         struct pipe *pi;
1198         pid_t childpid;
1199
1200         attributes = WUNTRACED;
1201         if (fg_pipe == NULL) {
1202                 attributes |= WNOHANG;
1203         }
1204
1205         while ((childpid = waitpid(-1, &status, attributes)) > 0) {
1206                 if (fg_pipe) {
1207                         int i, rcode = 0;
1208                         for (i = 0; i < fg_pipe->num_progs; i++) {
1209                                 if (fg_pipe->progs[i].pid == childpid) {
1210                                         if (i == fg_pipe->num_progs-1)
1211                                                 rcode = WEXITSTATUS(status);
1212                                         fg_pipe->num_progs--;
1213                                         return rcode;
1214                                 }
1215                         }
1216                 }
1217
1218                 for (pi = job_list; pi; pi = pi->next) {
1219                         prognum = 0;
1220                         while (prognum < pi->num_progs && pi->progs[prognum].pid != childpid) {
1221                                 prognum++;
1222                         }
1223                         if (prognum < pi->num_progs)
1224                                 break;
1225                 }
1226
1227                 if (pi == NULL) {
1228                         debug_printf("checkjobs: pid %d was not in our list!\n",
1229                                         childpid);
1230                         continue;
1231                 }
1232
1233                 if (WIFEXITED(status) || WIFSIGNALED(status)) {
1234                         /* child exited */
1235                         pi->running_progs--;
1236                         pi->progs[prognum].pid = 0;
1237
1238                         if (!pi->running_progs) {
1239                                 printf(JOB_STATUS_FORMAT, pi->jobid,
1240                                                         "Done", pi->text);
1241                                 remove_bg_job(pi);
1242                         }
1243                 } else {
1244                         /* child stopped */
1245                         pi->stopped_progs++;
1246                         pi->progs[prognum].is_stopped = 1;
1247                 }
1248         }
1249
1250         if (childpid == -1 && errno != ECHILD)
1251                 bb_perror_msg("waitpid");
1252
1253         /* move the shell to the foreground */
1254         //if (interactive && tcsetpgrp(shell_terminal, getpgid(0)))
1255         //      bb_perror_msg("tcsetpgrp-2");
1256         return -1;
1257 }
1258
1259 /* run_pipe_real() starts all the jobs, but doesn't wait for anything
1260  * to finish.  See checkjobs().
1261  *
1262  * return code is normally -1, when the caller has to wait for children
1263  * to finish to determine the exit status of the pipe.  If the pipe
1264  * is a simple builtin command, however, the action is done by the
1265  * time run_pipe_real returns, and the exit code is provided as the
1266  * return value.
1267  *
1268  * The input of the pipe is always stdin, the output is always
1269  * stdout.  The outpipe[] mechanism in BusyBox-0.48 lash is bogus,
1270  * because it tries to avoid running the command substitution in
1271  * subshell, when that is in fact necessary.  The subshell process
1272  * now has its stdout directed to the input of the appropriate pipe,
1273  * so this routine is noticeably simpler.
1274  */
1275 static int run_pipe_real(struct pipe *pi)
1276 {
1277         int i;
1278         int nextin, nextout;
1279         int pipefds[2];                         /* pipefds[0] is for reading */
1280         struct child_prog *child;
1281         const struct built_in_command *x;
1282         char *p;
1283         /* it is not always needed, but we aim to smaller code */
1284         int squirrel[] = { -1, -1, -1 };
1285         int rcode;
1286
1287         nextin = 0;
1288         pi->pgrp = -1;
1289
1290         /* Check if this is a simple builtin (not part of a pipe).
1291          * Builtins within pipes have to fork anyway, and are handled in
1292          * pseudo_exec.  "echo foo | read bar" doesn't work on bash, either.
1293          */
1294         child = &(pi->progs[0]);
1295         if (pi->num_progs == 1 && child->group && child->subshell == 0) {
1296                 debug_printf("non-subshell grouping\n");
1297                 setup_redirects(child, squirrel);
1298                 /* XXX could we merge code with following builtin case,
1299                  * by creating a pseudo builtin that calls run_list_real? */
1300                 rcode = run_list_real(child->group);
1301                 restore_redirects(squirrel);
1302                 return rcode;
1303         }
1304
1305         if (pi->num_progs == 1 && pi->progs[0].argv != NULL) {
1306                 for (i = 0; is_assignment(child->argv[i]); i++)
1307                         continue;
1308                 if (i != 0 && child->argv[i] == NULL) {
1309                         /* assignments, but no command: set the local environment */
1310                         for (i = 0; child->argv[i] != NULL; i++) {
1311                                 /* Ok, this case is tricky.  We have to decide if this is a
1312                                  * local variable, or an already exported variable.  If it is
1313                                  * already exported, we have to export the new value.  If it is
1314                                  * not exported, we need only set this as a local variable.
1315                                  * This junk is all to decide whether or not to export this
1316                                  * variable. */
1317                                 int export_me = 0;
1318                                 char *name, *value;
1319                                 name = xstrdup(child->argv[i]);
1320                                 debug_printf("Local environment set: %s\n", name);
1321                                 value = strchr(name, '=');
1322                                 if (value)
1323                                         *value = 0;
1324                                 if (get_local_var(name)) {
1325                                         export_me = 1;
1326                                 }
1327                                 free(name);
1328                                 p = insert_var_value(child->argv[i]);
1329                                 set_local_var(p, export_me);
1330                                 if (p != child->argv[i])
1331                                         free(p);
1332                         }
1333                         return EXIT_SUCCESS;   /* don't worry about errors in set_local_var() yet */
1334                 }
1335                 for (i = 0; is_assignment(child->argv[i]); i++) {
1336                         p = insert_var_value(child->argv[i]);
1337                         putenv(strdup(p));
1338                         if (p != child->argv[i]) {
1339                                 child->sp--;
1340                                 free(p);
1341                         }
1342                 }
1343                 if (child->sp) {
1344                         char *str;
1345
1346                         str = make_string(child->argv + i);
1347                         parse_string_outer(str, FLAG_EXIT_FROM_LOOP | FLAG_REPARSING);
1348                         free(str);
1349                         return last_return_code;
1350                 }
1351                 for (x = bltins; x->cmd; x++) {
1352                         if (strcmp(child->argv[i], x->cmd) == 0) {
1353                                 if (x->function == builtin_exec && child->argv[i+1] == NULL) {
1354                                         debug_printf("magic exec\n");
1355                                         setup_redirects(child, NULL);
1356                                         return EXIT_SUCCESS;
1357                                 }
1358                                 debug_printf("builtin inline %s\n", child->argv[0]);
1359                                 /* XXX setup_redirects acts on file descriptors, not FILEs.
1360                                  * This is perfect for work that comes after exec().
1361                                  * Is it really safe for inline use?  Experimentally,
1362                                  * things seem to work with glibc. */
1363                                 setup_redirects(child, squirrel);
1364                                 child->argv += i;  /* XXX horrible hack */
1365                                 rcode = x->function(child);
1366                                 child->argv -= i;  /* XXX restore hack so free() can work right */
1367                                 restore_redirects(squirrel);
1368                                 return rcode;
1369                         }
1370                 }
1371 #if ENABLE_FEATURE_SH_STANDALONE
1372                 {
1373                         const struct bb_applet *a = find_applet_by_name(child->argv[i]);
1374                         if (a && a->nofork) {
1375                                 setup_redirects(child, squirrel);
1376                                 rcode = run_nofork_applet(a, child->argv + i);
1377                                 restore_redirects(squirrel);
1378                                 return rcode;
1379                         }
1380                 }
1381 #endif
1382         }
1383
1384         for (i = 0; i < pi->num_progs; i++) {
1385                 child = &(pi->progs[i]);
1386
1387                 /* pipes are inserted between pairs of commands */
1388                 if ((i + 1) < pi->num_progs) {
1389                         if (pipe(pipefds) < 0)
1390                                 bb_perror_msg_and_die("pipe");
1391                         nextout = pipefds[1];
1392                 } else {
1393                         nextout = 1;
1394                         pipefds[0] = -1;
1395                 }
1396
1397                 /* XXX test for failed fork()? */
1398 #if BB_MMU
1399                 child->pid = fork();
1400 #else
1401                 child->pid = vfork();
1402 #endif
1403                 if (!child->pid) {
1404                         /* Set the handling for job control signals back to the default.  */
1405                         signal(SIGINT, SIG_DFL);
1406                         signal(SIGQUIT, SIG_DFL);
1407                         signal(SIGTERM, SIG_DFL);
1408                         signal(SIGTSTP, SIG_DFL);
1409                         signal(SIGTTIN, SIG_DFL);
1410                         signal(SIGTTOU, SIG_DFL);
1411                         signal(SIGCHLD, SIG_DFL);
1412
1413                         close_all();
1414
1415                         if (nextin != 0) {
1416                                 dup2(nextin, 0);
1417                                 close(nextin);
1418                         }
1419                         if (nextout != 1) {
1420                                 dup2(nextout, 1);
1421                                 close(nextout);
1422                         }
1423                         if (pipefds[0] != -1) {
1424                                 close(pipefds[0]);  /* opposite end of our output pipe */
1425                         }
1426
1427                         /* Like bash, explicit redirects override pipes,
1428                          * and the pipe fd is available for dup'ing. */
1429                         setup_redirects(child, NULL);
1430
1431                         if (interactive && pi->followup != PIPE_BG) {
1432                                 /* If we (the child) win the race, put ourselves in the process
1433                                  * group whose leader is the first process in this pipe. */
1434                                 if (pi->pgrp < 0) {
1435                                         pi->pgrp = getpid();
1436                                 }
1437                                 if (setpgid(0, pi->pgrp) == 0) {
1438                                         tcsetpgrp(2, pi->pgrp);
1439                                 }
1440                         }
1441
1442                         pseudo_exec(child);
1443                 }
1444
1445                 /* put our child in the process group whose leader is the
1446                    first process in this pipe */
1447                 if (pi->pgrp < 0) {
1448                         pi->pgrp = child->pid;
1449                 }
1450                 /* Don't check for errors.  The child may be dead already,
1451                  * in which case setpgid returns error code EACCES. */
1452                 setpgid(child->pid, pi->pgrp);
1453
1454                 if (nextin != 0)
1455                         close(nextin);
1456                 if (nextout != 1)
1457                         close(nextout);
1458
1459                 /* If there isn't another process, nextin is garbage
1460                    but it doesn't matter */
1461                 nextin = pipefds[0];
1462         }
1463         return -1;
1464 }
1465
1466 static int run_list_real(struct pipe *pi)
1467 {
1468         char *save_name = NULL;
1469         char **list = NULL;
1470         char **save_list = NULL;
1471         struct pipe *rpipe;
1472         int flag_rep = 0;
1473         int save_num_progs;
1474         int rcode = 0, flag_skip = 1;
1475         int flag_restore = 0;
1476         int if_code = 0, next_if_code = 0;  /* need double-buffer to handle elif */
1477         reserved_style rmode, skip_more_in_this_rmode = RES_XXXX;
1478         /* check syntax for "for" */
1479         for (rpipe = pi; rpipe; rpipe = rpipe->next) {
1480                 if ((rpipe->r_mode == RES_IN || rpipe->r_mode == RES_FOR)
1481                  && (rpipe->next == NULL)
1482                 ) {
1483                         syntax();
1484                         return 1;
1485                 }
1486                 if ((rpipe->r_mode == RES_IN && rpipe->next->r_mode == RES_IN && rpipe->next->progs->argv != NULL)
1487                  || (rpipe->r_mode == RES_FOR && rpipe->next->r_mode != RES_IN)
1488                 ) {
1489                         syntax();
1490                         return 1;
1491                 }
1492         }
1493         for (; pi; pi = (flag_restore != 0) ? rpipe : pi->next) {
1494                 if (pi->r_mode == RES_WHILE || pi->r_mode == RES_UNTIL
1495                  || pi->r_mode == RES_FOR
1496                 ) {
1497                         flag_restore = 0;
1498                         if (!rpipe) {
1499                                 flag_rep = 0;
1500                                 rpipe = pi;
1501                         }
1502                 }
1503                 rmode = pi->r_mode;
1504                 debug_printf("rmode=%d  if_code=%d  next_if_code=%d skip_more=%d\n",
1505                                 rmode, if_code, next_if_code, skip_more_in_this_rmode);
1506                 if (rmode == skip_more_in_this_rmode && flag_skip) {
1507                         if (pi->followup == PIPE_SEQ)
1508                                 flag_skip = 0;
1509                         continue;
1510                 }
1511                 flag_skip = 1;
1512                 skip_more_in_this_rmode = RES_XXXX;
1513                 if (rmode == RES_THEN || rmode == RES_ELSE)
1514                         if_code = next_if_code;
1515                 if (rmode == RES_THEN &&  if_code)
1516                         continue;
1517                 if (rmode == RES_ELSE && !if_code)
1518                         continue;
1519                 if (rmode == RES_ELIF && !if_code)
1520                         break;
1521                 if (rmode == RES_FOR && pi->num_progs) {
1522                         if (!list) {
1523                                 /* if no variable values after "in" we skip "for" */
1524                                 if (!pi->next->progs->argv)
1525                                         continue;
1526                                 /* create list of variable values */
1527                                 list = make_list_in(pi->next->progs->argv,
1528                                                 pi->progs->argv[0]);
1529                                 save_list = list;
1530                                 save_name = pi->progs->argv[0];
1531                                 pi->progs->argv[0] = NULL;
1532                                 flag_rep = 1;
1533                         }
1534                         if (!*list) {
1535                                 free(pi->progs->argv[0]);
1536                                 free(save_list);
1537                                 list = NULL;
1538                                 flag_rep = 0;
1539                                 pi->progs->argv[0] = save_name;
1540                                 pi->progs->glob_result.gl_pathv[0] = pi->progs->argv[0];
1541                                 continue;
1542                         } else {
1543                                 /* insert new value from list for variable */
1544                                 if (pi->progs->argv[0])
1545                                         free(pi->progs->argv[0]);
1546                                 pi->progs->argv[0] = *list++;
1547                                 pi->progs->glob_result.gl_pathv[0] = pi->progs->argv[0];
1548                         }
1549                 }
1550                 if (rmode == RES_IN)
1551                         continue;
1552                 if (rmode == RES_DO) {
1553                         if (!flag_rep)
1554                                 continue;
1555                 }
1556                 if ((rmode == RES_DONE)) {
1557                         if (flag_rep) {
1558                                 flag_restore = 1;
1559                         } else {
1560                                 rpipe = NULL;
1561                         }
1562                 }
1563                 if (pi->num_progs == 0)
1564                         continue;
1565                 save_num_progs = pi->num_progs; /* save number of programs */
1566                 rcode = run_pipe_real(pi);
1567                 debug_printf("run_pipe_real returned %d\n", rcode);
1568                 if (rcode != -1) {
1569                         /* We only ran a builtin: rcode was set by the return value
1570                          * of run_pipe_real(), and we don't need to wait for anything. */
1571                 } else if (pi->followup == PIPE_BG) {
1572                         /* XXX check bash's behavior with nontrivial pipes */
1573                         /* XXX compute jobid */
1574                         /* XXX what does bash do with attempts to background builtins? */
1575                         insert_bg_job(pi);
1576                         rcode = EXIT_SUCCESS;
1577                 } else {
1578                         if (interactive) {
1579                                 /* move the new process group into the foreground */
1580                                 if (tcsetpgrp(shell_terminal, pi->pgrp) && errno != ENOTTY)
1581                                         bb_perror_msg("tcsetpgrp-3");
1582                                 rcode = checkjobs(pi);
1583                                 /* move the shell to the foreground */
1584                                 if (tcsetpgrp(shell_terminal, getpgid(0)) && errno != ENOTTY)
1585                                         bb_perror_msg("tcsetpgrp-4");
1586                         } else {
1587                                 rcode = checkjobs(pi);
1588                         }
1589                         debug_printf("checkjobs returned %d\n", rcode);
1590                 }
1591                 last_return_code = rcode;
1592                 pi->num_progs = save_num_progs; /* restore number of programs */
1593                 if ( rmode == RES_IF || rmode == RES_ELIF )
1594                         next_if_code = rcode;  /* can be overwritten a number of times */
1595                 if (rmode == RES_WHILE)
1596                         flag_rep = !last_return_code;
1597                 if (rmode == RES_UNTIL)
1598                         flag_rep = last_return_code;
1599                 if ((rcode == EXIT_SUCCESS && pi->followup == PIPE_OR)
1600                  || (rcode != EXIT_SUCCESS && pi->followup == PIPE_AND)
1601                 ) {
1602                         skip_more_in_this_rmode = rmode;
1603                 }
1604                 checkjobs(NULL);
1605         }
1606         return rcode;
1607 }
1608
1609 /* return code is the exit status of the pipe */
1610 static int free_pipe(struct pipe *pi, int indent)
1611 {
1612         char **p;
1613         struct child_prog *child;
1614         struct redir_struct *r, *rnext;
1615         int a, i, ret_code = 0;
1616
1617         if (pi->stopped_progs > 0)
1618                 return ret_code;
1619         final_printf("%s run pipe: (pid %d)\n", indenter(indent), getpid());
1620         for (i = 0; i < pi->num_progs; i++) {
1621                 child = &pi->progs[i];
1622                 final_printf("%s  command %d:\n", indenter(indent), i);
1623                 if (child->argv) {
1624                         for (a = 0, p = child->argv; *p; a++, p++) {
1625                                 final_printf("%s   argv[%d] = %s\n", indenter(indent), a, *p);
1626                         }
1627                         globfree(&child->glob_result);
1628                         child->argv = NULL;
1629                 } else if (child->group) {
1630                         final_printf("%s   begin group (subshell:%d)\n", indenter(indent), child->subshell);
1631                         ret_code = free_pipe_list(child->group, indent+3);
1632                         final_printf("%s   end group\n", indenter(indent));
1633                 } else {
1634                         final_printf("%s   (nil)\n", indenter(indent));
1635                 }
1636                 for (r = child->redirects; r; r = rnext) {
1637                         final_printf("%s   redirect %d%s", indenter(indent), r->fd, redir_table[r->type].descrip);
1638                         if (r->dup == -1) {
1639                                 /* guard against the case >$FOO, where foo is unset or blank */
1640                                 if (r->word.gl_pathv) {
1641                                         final_printf(" %s\n", *r->word.gl_pathv);
1642                                         globfree(&r->word);
1643                                 }
1644                         } else {
1645                                 final_printf("&%d\n", r->dup);
1646                         }
1647                         rnext = r->next;
1648                         free(r);
1649                 }
1650                 child->redirects = NULL;
1651         }
1652         free(pi->progs);   /* children are an array, they get freed all at once */
1653         pi->progs = NULL;
1654         return ret_code;
1655 }
1656
1657 static int free_pipe_list(struct pipe *head, int indent)
1658 {
1659         int rcode = 0;   /* if list has no members */
1660         struct pipe *pi, *next;
1661         for (pi = head; pi; pi = next) {
1662                 final_printf("%s pipe reserved mode %d\n", indenter(indent), pi->r_mode);
1663                 rcode = free_pipe(pi, indent);
1664                 final_printf("%s pipe followup code %d\n", indenter(indent), pi->followup);
1665                 next = pi->next;
1666                 pi->next = NULL;
1667                 free(pi);
1668         }
1669         return rcode;
1670 }
1671
1672 /* Select which version we will use */
1673 static int run_list(struct pipe *pi)
1674 {
1675         int rcode = 0;
1676         if (fake_mode == 0) {
1677                 rcode = run_list_real(pi);
1678         }
1679         /* free_pipe_list has the side effect of clearing memory
1680          * In the long run that function can be merged with run_list_real,
1681          * but doing that now would hobble the debugging effort. */
1682         free_pipe_list(pi,0);
1683         return rcode;
1684 }
1685
1686 /* The API for glob is arguably broken.  This routine pushes a non-matching
1687  * string into the output structure, removing non-backslashed backslashes.
1688  * If someone can prove me wrong, by performing this function within the
1689  * original glob(3) api, feel free to rewrite this routine into oblivion.
1690  * Return code (0 vs. GLOB_NOSPACE) matches glob(3).
1691  * XXX broken if the last character is '\\', check that before calling.
1692  */
1693 static int globhack(const char *src, int flags, glob_t *pglob)
1694 {
1695         int cnt = 0, pathc;
1696         const char *s;
1697         char *dest;
1698         for (cnt = 1, s = src; s && *s; s++) {
1699                 if (*s == '\\') s++;
1700                 cnt++;
1701         }
1702         dest = malloc(cnt);
1703         if (!dest) return GLOB_NOSPACE;
1704         if (!(flags & GLOB_APPEND)) {
1705                 pglob->gl_pathv = NULL;
1706                 pglob->gl_pathc = 0;
1707                 pglob->gl_offs = 0;
1708                 pglob->gl_offs = 0;
1709         }
1710         pathc = ++pglob->gl_pathc;
1711         pglob->gl_pathv = realloc(pglob->gl_pathv, (pathc+1)*sizeof(*pglob->gl_pathv));
1712         if (pglob->gl_pathv == NULL) return GLOB_NOSPACE;
1713         pglob->gl_pathv[pathc-1] = dest;
1714         pglob->gl_pathv[pathc] = NULL;
1715         for (s = src; s && *s; s++, dest++) {
1716                 if (*s == '\\') s++;
1717                 *dest = *s;
1718         }
1719         *dest = '\0';
1720         return 0;
1721 }
1722
1723 /* XXX broken if the last character is '\\', check that before calling */
1724 static int glob_needed(const char *s)
1725 {
1726         for (; *s; s++) {
1727                 if (*s == '\\') s++;
1728                 if (strchr("*[?", *s)) return 1;
1729         }
1730         return 0;
1731 }
1732
1733 static int xglob(o_string *dest, int flags, glob_t *pglob)
1734 {
1735         int gr;
1736
1737         /* short-circuit for null word */
1738         /* we can code this better when the debug_printf's are gone */
1739         if (dest->length == 0) {
1740                 if (dest->nonnull) {
1741                         /* bash man page calls this an "explicit" null */
1742                         gr = globhack(dest->data, flags, pglob);
1743                         debug_printf("globhack returned %d\n", gr);
1744                 } else {
1745                         return 0;
1746                 }
1747         } else if (glob_needed(dest->data)) {
1748                 gr = glob(dest->data, flags, NULL, pglob);
1749                 debug_printf("glob returned %d\n", gr);
1750                 if (gr == GLOB_NOMATCH) {
1751                         /* quote removal, or more accurately, backslash removal */
1752                         gr = globhack(dest->data, flags, pglob);
1753                         debug_printf("globhack returned %d\n", gr);
1754                 }
1755         } else {
1756                 gr = globhack(dest->data, flags, pglob);
1757                 debug_printf("globhack returned %d\n", gr);
1758         }
1759         if (gr == GLOB_NOSPACE)
1760                 bb_error_msg_and_die("out of memory during glob");
1761         if (gr != 0) { /* GLOB_ABORTED ? */
1762                 bb_error_msg("glob(3) error %d", gr);
1763         }
1764         /* globprint(glob_target); */
1765         return gr;
1766 }
1767
1768 /* This is used to get/check local shell variables */
1769 static const char *get_local_var(const char *s)
1770 {
1771         struct variables *cur;
1772
1773         if (!s)
1774                 return NULL;
1775         for (cur = top_vars; cur; cur = cur->next)
1776                 if (strcmp(cur->name, s) == 0)
1777                         return cur->value;
1778         return NULL;
1779 }
1780
1781 /* This is used to set local shell variables
1782    flg_export == 0 if only local (not exporting) variable
1783    flg_export == 1 if "new" exporting environ
1784    flg_export > 1  if current startup environ (not call putenv()) */
1785 static int set_local_var(const char *s, int flg_export)
1786 {
1787         char *name, *value;
1788         int result = 0;
1789         struct variables *cur;
1790
1791         name = strdup(s);
1792
1793         /* Assume when we enter this function that we are already in
1794          * NAME=VALUE format.  So the first order of business is to
1795          * split 's' on the '=' into 'name' and 'value' */
1796         value = strchr(name, '=');
1797         /*if (value == 0 && ++value == 0) ??? -vda */
1798         if (value == NULL || value[1] == '\0') {
1799                 free(name);
1800                 return -1;
1801         }
1802         *value++ = '\0';
1803
1804         for (cur = top_vars; cur; cur = cur->next) {
1805                 if (strcmp(cur->name, name) == 0)
1806                         break;
1807         }
1808
1809         if (cur) {
1810                 if (strcmp(cur->value, value) == 0) {
1811                         if (flg_export > 0 && cur->flg_export == 0)
1812                                 cur->flg_export = flg_export;
1813                         else
1814                                 result++;
1815                 } else if (cur->flg_read_only) {
1816                         bb_error_msg("%s: readonly variable", name);
1817                         result = -1;
1818                 } else {
1819                         if (flg_export > 0 || cur->flg_export > 1)
1820                                 cur->flg_export = 1;
1821                         free((char*)cur->value);
1822
1823                         cur->value = strdup(value);
1824                 }
1825         } else {
1826                 cur = malloc(sizeof(struct variables));
1827                 if (!cur) {
1828                         result = -1;
1829                 } else {
1830                         cur->name = strdup(name);
1831                         if (cur->name) {
1832                                 free(cur);
1833                                 result = -1;
1834                         } else {
1835                                 struct variables *bottom = top_vars;
1836                                 cur->value = strdup(value);
1837                                 cur->next = 0;
1838                                 cur->flg_export = flg_export;
1839                                 cur->flg_read_only = 0;
1840                                 while (bottom->next)
1841                                         bottom = bottom->next;
1842                                 bottom->next = cur;
1843                         }
1844                 }
1845         }
1846
1847         if (result == 0 && cur->flg_export == 1) {
1848                 *(value-1) = '=';
1849                 result = putenv(name);
1850         } else {
1851                 free(name);
1852                 if (result > 0)            /* equivalent to previous set */
1853                         result = 0;
1854         }
1855         return result;
1856 }
1857
1858 static void unset_local_var(const char *name)
1859 {
1860         struct variables *cur;
1861
1862         if (name) {
1863                 for (cur = top_vars; cur; cur = cur->next) {
1864                         if (strcmp(cur->name, name) == 0)
1865                                 break;
1866                 }
1867                 if (cur != 0) {
1868                         struct variables *next = top_vars;
1869                         if (cur->flg_read_only) {
1870                                 bb_error_msg("%s: readonly variable", name);
1871                                 return;
1872                         }
1873                         if (cur->flg_export)
1874                                 unsetenv(cur->name);
1875                         free((char*)cur->name);
1876                         free((char*)cur->value);
1877                         while (next->next != cur)
1878                                 next = next->next;
1879                         next->next = cur->next;
1880                         free(cur);
1881                 }
1882         }
1883 }
1884
1885 static int is_assignment(const char *s)
1886 {
1887         if (!s || !isalpha(*s))
1888                 return 0;
1889         s++;
1890         while (isalnum(*s) || *s == '_')
1891                 s++;
1892         return *s == '=';
1893 }
1894
1895 /* the src parameter allows us to peek forward to a possible &n syntax
1896  * for file descriptor duplication, e.g., "2>&1".
1897  * Return code is 0 normally, 1 if a syntax error is detected in src.
1898  * Resource errors (in xmalloc) cause the process to exit */
1899 static int setup_redirect(struct p_context *ctx, int fd, redir_type style,
1900         struct in_str *input)
1901 {
1902         struct child_prog *child = ctx->child;
1903         struct redir_struct *redir = child->redirects;
1904         struct redir_struct *last_redir = NULL;
1905
1906         /* Create a new redir_struct and drop it onto the end of the linked list */
1907         while (redir) {
1908                 last_redir = redir;
1909                 redir = redir->next;
1910         }
1911         redir = xmalloc(sizeof(struct redir_struct));
1912         redir->next = NULL;
1913         redir->word.gl_pathv = NULL;
1914         if (last_redir) {
1915                 last_redir->next = redir;
1916         } else {
1917                 child->redirects = redir;
1918         }
1919
1920         redir->type = style;
1921         redir->fd = (fd == -1) ? redir_table[style].default_fd : fd;
1922
1923         debug_printf("Redirect type %d%s\n", redir->fd, redir_table[style].descrip);
1924
1925         /* Check for a '2>&1' type redirect */
1926         redir->dup = redirect_dup_num(input);
1927         if (redir->dup == -2) return 1;  /* syntax error */
1928         if (redir->dup != -1) {
1929                 /* Erik had a check here that the file descriptor in question
1930                  * is legit; I postpone that to "run time"
1931                  * A "-" representation of "close me" shows up as a -3 here */
1932                 debug_printf("Duplicating redirect '%d>&%d'\n", redir->fd, redir->dup);
1933         } else {
1934                 /* We do _not_ try to open the file that src points to,
1935                  * since we need to return and let src be expanded first.
1936                  * Set ctx->pending_redirect, so we know what to do at the
1937                  * end of the next parsed word.
1938                  */
1939                 ctx->pending_redirect = redir;
1940         }
1941         return 0;
1942 }
1943
1944 static struct pipe *new_pipe(void)
1945 {
1946         struct pipe *pi;
1947         pi = xmalloc(sizeof(struct pipe));
1948         pi->num_progs = 0;
1949         pi->progs = NULL;
1950         pi->next = NULL;
1951         pi->followup = 0;  /* invalid */
1952         pi->r_mode = RES_NONE;
1953         return pi;
1954 }
1955
1956 static void initialize_context(struct p_context *ctx)
1957 {
1958         ctx->pipe = NULL;
1959         ctx->pending_redirect = NULL;
1960         ctx->child = NULL;
1961         ctx->list_head = new_pipe();
1962         ctx->pipe = ctx->list_head;
1963         ctx->w = RES_NONE;
1964         ctx->stack = NULL;
1965         ctx->old_flag = 0;
1966         done_command(ctx);   /* creates the memory for working child */
1967 }
1968
1969 /* normal return is 0
1970  * if a reserved word is found, and processed, return 1
1971  * should handle if, then, elif, else, fi, for, while, until, do, done.
1972  * case, function, and select are obnoxious, save those for later.
1973  */
1974 static int reserved_word(o_string *dest, struct p_context *ctx)
1975 {
1976         struct reserved_combo {
1977                 const char *literal;
1978                 int code;
1979                 long flag;
1980         };
1981         /* Mostly a list of accepted follow-up reserved words.
1982          * FLAG_END means we are done with the sequence, and are ready
1983          * to turn the compound list into a command.
1984          * FLAG_START means the word must start a new compound list.
1985          */
1986         static const struct reserved_combo reserved_list[] = {
1987                 { "if",    RES_IF,    FLAG_THEN | FLAG_START },
1988                 { "then",  RES_THEN,  FLAG_ELIF | FLAG_ELSE | FLAG_FI },
1989                 { "elif",  RES_ELIF,  FLAG_THEN },
1990                 { "else",  RES_ELSE,  FLAG_FI   },
1991                 { "fi",    RES_FI,    FLAG_END  },
1992                 { "for",   RES_FOR,   FLAG_IN   | FLAG_START },
1993                 { "while", RES_WHILE, FLAG_DO   | FLAG_START },
1994                 { "until", RES_UNTIL, FLAG_DO   | FLAG_START },
1995                 { "in",    RES_IN,    FLAG_DO   },
1996                 { "do",    RES_DO,    FLAG_DONE },
1997                 { "done",  RES_DONE,  FLAG_END  }
1998         };
1999         enum { NRES = sizeof(reserved_list)/sizeof(reserved_list[0]) };
2000         const struct reserved_combo *r;
2001
2002         for (r = reserved_list; r < reserved_list+NRES; r++) {
2003                 if (strcmp(dest->data, r->literal) == 0) {
2004                         debug_printf("found reserved word %s, code %d\n", r->literal, r->code);
2005                         if (r->flag & FLAG_START) {
2006                                 struct p_context *new = xmalloc(sizeof(struct p_context));
2007                                 debug_printf("push stack\n");
2008                                 if (ctx->w == RES_IN || ctx->w == RES_FOR) {
2009                                         syntax();
2010                                         free(new);
2011                                         ctx->w = RES_SNTX;
2012                                         b_reset(dest);
2013                                         return 1;
2014                                 }
2015                                 *new = *ctx;   /* physical copy */
2016                                 initialize_context(ctx);
2017                                 ctx->stack = new;
2018                         } else if (ctx->w == RES_NONE || !(ctx->old_flag & (1 << r->code))) {
2019                                 syntax();
2020                                 ctx->w = RES_SNTX;
2021                                 b_reset(dest);
2022                                 return 1;
2023                         }
2024                         ctx->w = r->code;
2025                         ctx->old_flag = r->flag;
2026                         if (ctx->old_flag & FLAG_END) {
2027                                 struct p_context *old;
2028                                 debug_printf("pop stack\n");
2029                                 done_pipe(ctx, PIPE_SEQ);
2030                                 old = ctx->stack;
2031                                 old->child->group = ctx->list_head;
2032                                 old->child->subshell = 0;
2033                                 *ctx = *old;   /* physical copy */
2034                                 free(old);
2035                         }
2036                         b_reset(dest);
2037                         return 1;
2038                 }
2039         }
2040         return 0;
2041 }
2042
2043 /* normal return is 0.
2044  * Syntax or xglob errors return 1. */
2045 static int done_word(o_string *dest, struct p_context *ctx)
2046 {
2047         struct child_prog *child = ctx->child;
2048         glob_t *glob_target;
2049         int gr, flags = 0;
2050
2051         debug_printf("done_word: %s %p\n", dest->data, child);
2052         if (dest->length == 0 && !dest->nonnull) {
2053                 debug_printf("  true null, ignored\n");
2054                 return 0;
2055         }
2056         if (ctx->pending_redirect) {
2057                 glob_target = &ctx->pending_redirect->word;
2058         } else {
2059                 if (child->group) {
2060                         syntax();
2061                         return 1;  /* syntax error, groups and arglists don't mix */
2062                 }
2063                 if (!child->argv && (ctx->type & FLAG_PARSE_SEMICOLON)) {
2064                         debug_printf("checking %s for reserved-ness\n", dest->data);
2065                         if (reserved_word(dest, ctx))
2066                                 return (ctx->w == RES_SNTX);
2067                 }
2068                 glob_target = &child->glob_result;
2069                 if (child->argv) flags |= GLOB_APPEND;
2070         }
2071         gr = xglob(dest, flags, glob_target);
2072         if (gr != 0) return 1;
2073
2074         b_reset(dest);
2075         if (ctx->pending_redirect) {
2076                 ctx->pending_redirect = NULL;
2077                 if (glob_target->gl_pathc != 1) {
2078                         bb_error_msg("ambiguous redirect");
2079                         return 1;
2080                 }
2081         } else {
2082                 child->argv = glob_target->gl_pathv;
2083         }
2084         if (ctx->w == RES_FOR) {
2085                 done_word(dest, ctx);
2086                 done_pipe(ctx, PIPE_SEQ);
2087         }
2088         return 0;
2089 }
2090
2091 /* The only possible error here is out of memory, in which case
2092  * xmalloc exits. */
2093 static int done_command(struct p_context *ctx)
2094 {
2095         /* The child is really already in the pipe structure, so
2096          * advance the pipe counter and make a new, null child.
2097          * Only real trickiness here is that the uncommitted
2098          * child structure, to which ctx->child points, is not
2099          * counted in pi->num_progs. */
2100         struct pipe *pi = ctx->pipe;
2101         struct child_prog *prog = ctx->child;
2102
2103         if (prog && prog->group == NULL
2104          && prog->argv == NULL
2105          && prog->redirects == NULL
2106         ) {
2107                 debug_printf("done_command: skipping null command\n");
2108                 return 0;
2109         }
2110         if (prog) {
2111                 pi->num_progs++;
2112                 debug_printf("done_command: num_progs incremented to %d\n", pi->num_progs);
2113         } else {
2114                 debug_printf("done_command: initializing\n");
2115         }
2116         pi->progs = xrealloc(pi->progs, sizeof(*pi->progs) * (pi->num_progs+1));
2117
2118         prog = pi->progs + pi->num_progs;
2119         prog->redirects = NULL;
2120         prog->argv = NULL;
2121         prog->is_stopped = 0;
2122         prog->group = NULL;
2123         prog->glob_result.gl_pathv = NULL;
2124         prog->family = pi;
2125         prog->sp = 0;
2126         ctx->child = prog;
2127         prog->type = ctx->type;
2128
2129         /* but ctx->pipe and ctx->list_head remain unchanged */
2130         return 0;
2131 }
2132
2133 static int done_pipe(struct p_context *ctx, pipe_style type)
2134 {
2135         struct pipe *new_p;
2136         done_command(ctx);  /* implicit closure of previous command */
2137         debug_printf("done_pipe, type %d\n", type);
2138         ctx->pipe->followup = type;
2139         ctx->pipe->r_mode = ctx->w;
2140         new_p = new_pipe();
2141         ctx->pipe->next = new_p;
2142         ctx->pipe = new_p;
2143         ctx->child = NULL;
2144         done_command(ctx);  /* set up new pipe to accept commands */
2145         return 0;
2146 }
2147
2148 /* peek ahead in the in_str to find out if we have a "&n" construct,
2149  * as in "2>&1", that represents duplicating a file descriptor.
2150  * returns either -2 (syntax error), -1 (no &), or the number found.
2151  */
2152 static int redirect_dup_num(struct in_str *input)
2153 {
2154         int ch, d = 0, ok = 0;
2155         ch = b_peek(input);
2156         if (ch != '&') return -1;
2157
2158         b_getch(input);  /* get the & */
2159         ch = b_peek(input);
2160         if (ch == '-') {
2161                 b_getch(input);
2162                 return -3;  /* "-" represents "close me" */
2163         }
2164         while (isdigit(ch)) {
2165                 d = d*10 + (ch-'0');
2166                 ok = 1;
2167                 b_getch(input);
2168                 ch = b_peek(input);
2169         }
2170         if (ok) return d;
2171
2172         bb_error_msg("ambiguous redirect");
2173         return -2;
2174 }
2175
2176 /* If a redirect is immediately preceded by a number, that number is
2177  * supposed to tell which file descriptor to redirect.  This routine
2178  * looks for such preceding numbers.  In an ideal world this routine
2179  * needs to handle all the following classes of redirects...
2180  *     echo 2>foo     # redirects fd  2 to file "foo", nothing passed to echo
2181  *     echo 49>foo    # redirects fd 49 to file "foo", nothing passed to echo
2182  *     echo -2>foo    # redirects fd  1 to file "foo",    "-2" passed to echo
2183  *     echo 49x>foo   # redirects fd  1 to file "foo",   "49x" passed to echo
2184  * A -1 output from this program means no valid number was found, so the
2185  * caller should use the appropriate default for this redirection.
2186  */
2187 static int redirect_opt_num(o_string *o)
2188 {
2189         int num;
2190
2191         if (o->length == 0)
2192                 return -1;
2193         for (num = 0; num < o->length; num++) {
2194                 if (!isdigit(*(o->data + num))) {
2195                         return -1;
2196                 }
2197         }
2198         /* reuse num (and save an int) */
2199         num = atoi(o->data);
2200         b_reset(o);
2201         return num;
2202 }
2203
2204 static FILE *generate_stream_from_list(struct pipe *head)
2205 {
2206         FILE *pf;
2207         int pid, channel[2];
2208         if (pipe(channel) < 0) bb_perror_msg_and_die("pipe");
2209 #if BB_MMU
2210         pid = fork();
2211 #else
2212         pid = vfork();
2213 #endif
2214         if (pid < 0) {
2215                 bb_perror_msg_and_die("fork");
2216         } else if (pid == 0) {
2217                 close(channel[0]);
2218                 if (channel[1] != 1) {
2219                         dup2(channel[1], 1);
2220                         close(channel[1]);
2221                 }
2222                 _exit(run_list_real(head));   /* leaks memory */
2223         }
2224         debug_printf("forked child %d\n", pid);
2225         close(channel[1]);
2226         pf = fdopen(channel[0],"r");
2227         debug_printf("pipe on FILE *%p\n", pf);
2228         return pf;
2229 }
2230
2231 /* this version hacked for testing purposes */
2232 /* return code is exit status of the process that is run. */
2233 static int process_command_subs(o_string *dest, struct p_context *ctx, struct in_str *input, int subst_end)
2234 {
2235         int retcode;
2236         o_string result = NULL_O_STRING;
2237         struct p_context inner;
2238         FILE *p;
2239         struct in_str pipe_str;
2240         initialize_context(&inner);
2241
2242         /* recursion to generate command */
2243         retcode = parse_stream(&result, &inner, input, subst_end);
2244         if (retcode != 0) return retcode;  /* syntax error or EOF */
2245         done_word(&result, &inner);
2246         done_pipe(&inner, PIPE_SEQ);
2247         b_free(&result);
2248
2249         p = generate_stream_from_list(inner.list_head);
2250         if (p == NULL) return 1;
2251         mark_open(fileno(p));
2252         setup_file_in_str(&pipe_str, p);
2253
2254         /* now send results of command back into original context */
2255         retcode = parse_stream(dest, ctx, &pipe_str, '\0');
2256         /* XXX In case of a syntax error, should we try to kill the child?
2257          * That would be tough to do right, so just read until EOF. */
2258         if (retcode == 1) {
2259                 while (b_getch(&pipe_str) != EOF)
2260                         /* discard */;
2261         }
2262
2263         debug_printf("done reading from pipe, pclose()ing\n");
2264         /* This is the step that wait()s for the child.  Should be pretty
2265          * safe, since we just read an EOF from its stdout.  We could try
2266          * to better, by using wait(), and keeping track of background jobs
2267          * at the same time.  That would be a lot of work, and contrary
2268          * to the KISS philosophy of this program. */
2269         mark_closed(fileno(p));
2270         retcode = pclose(p);
2271         free_pipe_list(inner.list_head, 0);
2272         debug_printf("pclosed, retcode=%d\n", retcode);
2273         /* XXX this process fails to trim a single trailing newline */
2274         return retcode;
2275 }
2276
2277 static int parse_group(o_string *dest, struct p_context *ctx,
2278         struct in_str *input, int ch)
2279 {
2280         int rcode, endch = 0;
2281         struct p_context sub;
2282         struct child_prog *child = ctx->child;
2283         if (child->argv) {
2284                 syntax();
2285                 return 1;  /* syntax error, groups and arglists don't mix */
2286         }
2287         initialize_context(&sub);
2288         switch (ch) {
2289         case '(':
2290                 endch = ')';
2291                 child->subshell = 1;
2292                 break;
2293         case '{':
2294                 endch = '}';
2295                 break;
2296         default:
2297                 syntax();   /* really logic error */
2298         }
2299         rcode = parse_stream(dest, &sub, input, endch);
2300         done_word(dest, &sub); /* finish off the final word in the subcontext */
2301         done_pipe(&sub, PIPE_SEQ);  /* and the final command there, too */
2302         child->group = sub.list_head;
2303         return rcode;
2304         /* child remains "open", available for possible redirects */
2305 }
2306
2307 /* basically useful version until someone wants to get fancier,
2308  * see the bash man page under "Parameter Expansion" */
2309 static const char *lookup_param(const char *src)
2310 {
2311         const char *p = NULL;
2312         if (src) {
2313                 p = getenv(src);
2314                 if (!p)
2315                         p = get_local_var(src);
2316         }
2317         return p;
2318 }
2319
2320 /* return code: 0 for OK, 1 for syntax error */
2321 static int handle_dollar(o_string *dest, struct p_context *ctx, struct in_str *input)
2322 {
2323         int i, advance = 0;
2324         char sep[] = " ";
2325         int ch = input->peek(input);  /* first character after the $ */
2326         debug_printf("handle_dollar: ch=%c\n", ch);
2327         if (isalpha(ch)) {
2328                 b_addchr(dest, SPECIAL_VAR_SYMBOL);
2329                 ctx->child->sp++;
2330                 while (ch = b_peek(input), isalnum(ch) || ch == '_') {
2331                         b_getch(input);
2332                         b_addchr(dest, ch);
2333                 }
2334                 b_addchr(dest, SPECIAL_VAR_SYMBOL);
2335         } else if (isdigit(ch)) {
2336                 i = ch-'0';  /* XXX is $0 special? */
2337                 if (i < global_argc) {
2338                         parse_string(dest, ctx, global_argv[i]); /* recursion */
2339                 }
2340                 advance = 1;
2341         } else switch (ch) {
2342                 case '$':
2343                         b_adduint(dest, getpid());
2344                         advance = 1;
2345                         break;
2346                 case '!':
2347                         if (last_bg_pid > 0) b_adduint(dest, last_bg_pid);
2348                         advance = 1;
2349                         break;
2350                 case '?':
2351                         b_adduint(dest, last_return_code);
2352                         advance = 1;
2353                         break;
2354                 case '#':
2355                         b_adduint(dest, global_argc ? global_argc-1 : 0);
2356                         advance = 1;
2357                         break;
2358                 case '{':
2359                         b_addchr(dest, SPECIAL_VAR_SYMBOL);
2360                         ctx->child->sp++;
2361                         b_getch(input);
2362                         /* XXX maybe someone will try to escape the '}' */
2363                         while (1) {
2364                                 ch = b_getch(input);
2365                                 if (ch == EOF || ch == '}')
2366                                         break;
2367                                 b_addchr(dest, ch);
2368                         }
2369                         if (ch != '}') {
2370                                 syntax();
2371                                 return 1;
2372                         }
2373                         b_addchr(dest, SPECIAL_VAR_SYMBOL);
2374                         break;
2375                 case '(':
2376                         b_getch(input);
2377                         process_command_subs(dest, ctx, input, ')');
2378                         break;
2379                 case '*':
2380                         sep[0] = ifs[0];
2381                         for (i = 1; i < global_argc; i++) {
2382                                 parse_string(dest, ctx, global_argv[i]);
2383                                 if (i+1 < global_argc)
2384                                         parse_string(dest, ctx, sep);
2385                         }
2386                         break;
2387                 case '@':
2388                 case '-':
2389                 case '_':
2390                         /* still unhandled, but should be eventually */
2391                         bb_error_msg("unhandled syntax: $%c", ch);
2392                         return 1;
2393                         break;
2394                 default:
2395                         b_addqchr(dest,'$', dest->quote);
2396         }
2397         /* Eat the character if the flag was set.  If the compiler
2398          * is smart enough, we could substitute "b_getch(input);"
2399          * for all the "advance = 1;" above, and also end up with
2400          * a nice size-optimized program.  Hah!  That'll be the day.
2401          */
2402         if (advance) b_getch(input);
2403         return 0;
2404 }
2405
2406 int parse_string(o_string *dest, struct p_context *ctx, const char *src)
2407 {
2408         struct in_str foo;
2409         setup_string_in_str(&foo, src);
2410         return parse_stream(dest, ctx, &foo, '\0');
2411 }
2412
2413 /* return code is 0 for normal exit, 1 for syntax error */
2414 int parse_stream(o_string *dest, struct p_context *ctx,
2415         struct in_str *input, int end_trigger)
2416 {
2417         int ch, m;
2418         int redir_fd;
2419         redir_type redir_style;
2420         int next;
2421
2422         /* Only double-quote state is handled in the state variable dest->quote.
2423          * A single-quote triggers a bypass of the main loop until its mate is
2424          * found.  When recursing, quote state is passed in via dest->quote. */
2425
2426         debug_printf("parse_stream, end_trigger=%d\n", end_trigger);
2427         while ((ch = b_getch(input)) != EOF) {
2428                 m = map[ch];
2429                 next = (ch == '\n') ? 0 : b_peek(input);
2430                 debug_printf("parse_stream: ch=%c (%d) m=%d quote=%d\n",
2431                                                 ch, ch, m, dest->quote);
2432                 if (m == 0 || ((m == 1 || m == 2) && dest->quote)) {
2433                         b_addqchr(dest, ch, dest->quote);
2434                         continue;
2435                 }
2436                 if (m == 2) {  /* unquoted IFS */
2437                         if (done_word(dest, ctx)) {
2438                                 return 1;
2439                         }
2440                         /* If we aren't performing a substitution, treat a newline as a
2441                          * command separator.  */
2442                         if (end_trigger != '\0' && ch == '\n')
2443                                 done_pipe(ctx, PIPE_SEQ);
2444                 }
2445                 if (ch == end_trigger && !dest->quote && ctx->w == RES_NONE) {
2446                         debug_printf("leaving parse_stream (triggered)\n");
2447                         return 0;
2448                 }
2449                 if (m == 2)
2450                         continue;
2451                 switch (ch) {
2452                 case '#':
2453                         if (dest->length == 0 && !dest->quote) {
2454                                 while (1) {
2455                                         ch = b_peek(input);
2456                                         if (ch == EOF || ch == '\n')
2457                                                 break;
2458                                         b_getch(input);
2459                                 }
2460                         } else {
2461                                 b_addqchr(dest, ch, dest->quote);
2462                         }
2463                         break;
2464                 case '\\':
2465                         if (next == EOF) {
2466                                 syntax();
2467                                 return 1;
2468                         }
2469                         b_addqchr(dest, '\\', dest->quote);
2470                         b_addqchr(dest, b_getch(input), dest->quote);
2471                         break;
2472                 case '$':
2473                         if (handle_dollar(dest, ctx, input) != 0) return 1;
2474                         break;
2475                 case '\'':
2476                         dest->nonnull = 1;
2477                         while (1) {
2478                                 ch = b_getch(input);
2479                                 if (ch == EOF || ch == '\'')
2480                                         break;
2481                                 b_addchr(dest, ch);
2482                         }
2483                         if (ch == EOF) {
2484                                 syntax();
2485                                 return 1;
2486                         }
2487                         break;
2488                 case '"':
2489                         dest->nonnull = 1;
2490                         dest->quote = !dest->quote;
2491                         break;
2492                 case '`':
2493                         process_command_subs(dest, ctx, input, '`');
2494                         break;
2495                 case '>':
2496                         redir_fd = redirect_opt_num(dest);
2497                         done_word(dest, ctx);
2498                         redir_style = REDIRECT_OVERWRITE;
2499                         if (next == '>') {
2500                                 redir_style = REDIRECT_APPEND;
2501                                 b_getch(input);
2502                         } else if (next == '(') {
2503                                 syntax();   /* until we support >(list) Process Substitution */
2504                                 return 1;
2505                         }
2506                         setup_redirect(ctx, redir_fd, redir_style, input);
2507                         break;
2508                 case '<':
2509                         redir_fd = redirect_opt_num(dest);
2510                         done_word(dest, ctx);
2511                         redir_style = REDIRECT_INPUT;
2512                         if (next == '<') {
2513                                 redir_style = REDIRECT_HEREIS;
2514                                 b_getch(input);
2515                         } else if (next == '>') {
2516                                 redir_style = REDIRECT_IO;
2517                                 b_getch(input);
2518                         } else if (next == '(') {
2519                                 syntax();   /* until we support <(list) Process Substitution */
2520                                 return 1;
2521                         }
2522                         setup_redirect(ctx, redir_fd, redir_style, input);
2523                         break;
2524                 case ';':
2525                         done_word(dest, ctx);
2526                         done_pipe(ctx, PIPE_SEQ);
2527                         break;
2528                 case '&':
2529                         done_word(dest, ctx);
2530                         if (next == '&') {
2531                                 b_getch(input);
2532                                 done_pipe(ctx, PIPE_AND);
2533                         } else {
2534                                 done_pipe(ctx, PIPE_BG);
2535                         }
2536                         break;
2537                 case '|':
2538                         done_word(dest, ctx);
2539                         if (next == '|') {
2540                                 b_getch(input);
2541                                 done_pipe(ctx, PIPE_OR);
2542                         } else {
2543                                 /* we could pick up a file descriptor choice here
2544                                  * with redirect_opt_num(), but bash doesn't do it.
2545                                  * "echo foo 2| cat" yields "foo 2". */
2546                                 done_command(ctx);
2547                         }
2548                         break;
2549                 case '(':
2550                 case '{':
2551                         if (parse_group(dest, ctx, input, ch) != 0)
2552                                 return 1;
2553                         break;
2554                 case ')':
2555                 case '}':
2556                         syntax();   /* Proper use of this character caught by end_trigger */
2557                         return 1;
2558                 default:
2559                         syntax();   /* this is really an internal logic error */
2560                         return 1;
2561                 }
2562         }
2563         /* complain if quote?  No, maybe we just finished a command substitution
2564          * that was quoted.  Example:
2565          * $ echo "`cat foo` plus more"
2566          * and we just got the EOF generated by the subshell that ran "cat foo"
2567          * The only real complaint is if we got an EOF when end_trigger != '\0',
2568          * that is, we were really supposed to get end_trigger, and never got
2569          * one before the EOF.  Can't use the standard "syntax error" return code,
2570          * so that parse_stream_outer can distinguish the EOF and exit smoothly. */
2571         debug_printf("leaving parse_stream (EOF)\n");
2572         if (end_trigger != '\0')
2573                 return -1;
2574         return 0;
2575 }
2576
2577 static void mapset(const char *set, int code)
2578 {
2579         while (*set)
2580                 map[(unsigned char)*set++] = code;
2581 }
2582
2583 static void update_ifs_map(void)
2584 {
2585         /* char *ifs and char map[256] are both globals. */
2586         ifs = getenv("IFS");
2587         if (ifs == NULL) ifs = " \t\n";
2588         /* Precompute a list of 'flow through' behavior so it can be treated
2589          * quickly up front.  Computation is necessary because of IFS.
2590          * Special case handling of IFS == " \t\n" is not implemented.
2591          * The map[] array only really needs two bits each, and on most machines
2592          * that would be faster because of the reduced L1 cache footprint.
2593          */
2594         memset(map, 0, sizeof(map)); /* most characters flow through always */
2595         mapset("\\$'\"`", 3);        /* never flow through */
2596         mapset("<>;&|(){}#", 1);     /* flow through if quoted */
2597         mapset(ifs, 2);              /* also flow through if quoted */
2598 }
2599
2600 /* most recursion does not come through here, the exception is
2601  * from builtin_source() */
2602 int parse_stream_outer(struct in_str *inp, int flag)
2603 {
2604         struct p_context ctx;
2605         o_string temp = NULL_O_STRING;
2606         int rcode;
2607         do {
2608                 ctx.type = flag;
2609                 initialize_context(&ctx);
2610                 update_ifs_map();
2611                 if (!(flag & FLAG_PARSE_SEMICOLON) || (flag & FLAG_REPARSING)) mapset(";$&|", 0);
2612                 inp->promptmode = 1;
2613                 rcode = parse_stream(&temp, &ctx, inp, '\n');
2614                 if (rcode != 1 && ctx.old_flag != 0) {
2615                         syntax();
2616                 }
2617                 if (rcode != 1 && ctx.old_flag == 0) {
2618                         done_word(&temp, &ctx);
2619                         done_pipe(&ctx, PIPE_SEQ);
2620                         run_list(ctx.list_head);
2621                 } else {
2622                         if (ctx.old_flag != 0) {
2623                                 free(ctx.stack);
2624                                 b_reset(&temp);
2625                         }
2626                         temp.nonnull = 0;
2627                         temp.quote = 0;
2628                         inp->p = NULL;
2629                         free_pipe_list(ctx.list_head,0);
2630                 }
2631                 b_free(&temp);
2632         } while (rcode != -1 && !(flag & FLAG_EXIT_FROM_LOOP));   /* loop on syntax errors, return on EOF */
2633         return 0;
2634 }
2635
2636 static int parse_string_outer(const char *s, int flag)
2637 {
2638         struct in_str input;
2639         setup_string_in_str(&input, s);
2640         return parse_stream_outer(&input, flag);
2641 }
2642
2643 static int parse_file_outer(FILE *f)
2644 {
2645         int rcode;
2646         struct in_str input;
2647         setup_file_in_str(&input, f);
2648         rcode = parse_stream_outer(&input, FLAG_PARSE_SEMICOLON);
2649         return rcode;
2650 }
2651
2652 /* Make sure we have a controlling tty.  If we get started under a job
2653  * aware app (like bash for example), make sure we are now in charge so
2654  * we don't fight over who gets the foreground */
2655 static void setup_job_control(void)
2656 {
2657         /*static --why?? */  pid_t shell_pgrp;
2658
2659         /* Loop until we are in the foreground.  */
2660         while (tcgetpgrp(shell_terminal) != (shell_pgrp = getpgrp()))
2661                 kill(- shell_pgrp, SIGTTIN);
2662
2663         /* Ignore interactive and job-control signals.  */
2664         signal(SIGINT, SIG_IGN);
2665         signal(SIGQUIT, SIG_IGN);
2666         signal(SIGTERM, SIG_IGN);
2667         signal(SIGTSTP, SIG_IGN);
2668         signal(SIGTTIN, SIG_IGN);
2669         signal(SIGTTOU, SIG_IGN);
2670         signal(SIGCHLD, SIG_IGN);
2671
2672         /* Put ourselves in our own process group.  */
2673         setsid();
2674         shell_pgrp = getpid();
2675         setpgid(shell_pgrp, shell_pgrp);
2676
2677         /* Grab control of the terminal.  */
2678         tcsetpgrp(shell_terminal, shell_pgrp);
2679 }
2680
2681 int hush_main(int argc, char **argv);
2682 int hush_main(int argc, char **argv)
2683 {
2684         int opt;
2685         FILE *input;
2686         char **e;
2687
2688 #if ENABLE_FEATURE_EDITING
2689         line_input_state = new_line_input_t(FOR_SHELL);
2690 #endif
2691
2692         /* XXX what should these be while sourcing /etc/profile? */
2693         global_argc = argc;
2694         global_argv = argv;
2695
2696         /* (re?) initialize globals.  Sometimes hush_main() ends up calling
2697          * hush_main(), therefore we cannot rely on the BSS to zero out this
2698          * stuff.  Reset these to 0 every time. */
2699         ifs = NULL;
2700         /* map[] is taken care of with call to update_ifs_map() */
2701         fake_mode = 0;
2702         interactive = 0;
2703         close_me_head = NULL;
2704         last_bg_pid = 0;
2705         job_list = NULL;
2706         last_jobid = 0;
2707
2708         /* Initialize some more globals to non-zero values */
2709         set_cwd();
2710         if (ENABLE_FEATURE_EDITING)
2711                 cmdedit_set_initial_prompt();
2712         else PS1 = NULL;
2713         PS2 = "> ";
2714
2715         /* initialize our shell local variables with the values
2716          * currently living in the environment */
2717         e = environ;
2718         if (e)
2719                 while (*e)
2720                         set_local_var(*e++, 2);   /* without call putenv() */
2721
2722         last_return_code = EXIT_SUCCESS;
2723
2724         if (argv[0] && argv[0][0] == '-') {
2725                 debug_printf("\nsourcing /etc/profile\n");
2726                 input = fopen("/etc/profile", "r");
2727                 if (input != NULL) {
2728                         mark_open(fileno(input));
2729                         parse_file_outer(input);
2730                         mark_closed(fileno(input));
2731                         fclose(input);
2732                 }
2733         }
2734         input = stdin;
2735
2736         while ((opt = getopt(argc, argv, "c:xif")) > 0) {
2737                 switch (opt) {
2738                 case 'c':
2739                         global_argv = argv+optind;
2740                         global_argc = argc-optind;
2741                         opt = parse_string_outer(optarg, FLAG_PARSE_SEMICOLON);
2742                         goto final_return;
2743                 case 'i':
2744                         interactive++;
2745                         break;
2746                 case 'f':
2747                         fake_mode++;
2748                         break;
2749                 default:
2750 #ifndef BB_VER
2751                         fprintf(stderr, "Usage: sh [FILE]...\n"
2752                                         "   or: sh -c command [args]...\n\n");
2753                         exit(EXIT_FAILURE);
2754 #else
2755                         bb_show_usage();
2756 #endif
2757                 }
2758         }
2759         /* A shell is interactive if the '-i' flag was given, or if all of
2760          * the following conditions are met:
2761          *    no -c command
2762          *    no arguments remaining or the -s flag given
2763          *    standard input is a terminal
2764          *    standard output is a terminal
2765          *    Refer to Posix.2, the description of the 'sh' utility. */
2766         if (argv[optind] == NULL && input == stdin
2767          && isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)
2768         ) {
2769                 interactive++;
2770         }
2771
2772         debug_printf("\ninteractive=%d\n", interactive);
2773         if (interactive) {
2774                 /* Looks like they want an interactive shell */
2775 #if !ENABLE_FEATURE_SH_EXTRA_QUIET
2776                 printf( "\n\n%s hush - the humble shell v0.01 (testing)\n",
2777                         BB_BANNER);
2778                 printf( "Enter 'help' for a list of built-in commands.\n\n");
2779 #endif
2780                 setup_job_control();
2781         }
2782
2783         if (argv[optind] == NULL) {
2784                 opt = parse_file_outer(stdin);
2785                 goto final_return;
2786         }
2787
2788         debug_printf("\nrunning script '%s'\n", argv[optind]);
2789         global_argv = argv + optind;
2790         global_argc = argc - optind;
2791         input = xfopen(argv[optind], "r");
2792         opt = parse_file_outer(input);
2793
2794 #if ENABLE_FEATURE_CLEAN_UP
2795         fclose(input);
2796         if (cwd != bb_msg_unknown)
2797                 free((char*)cwd);
2798         {
2799                 struct variables *cur, *tmp;
2800                 for (cur = top_vars; cur; cur = tmp) {
2801                         tmp = cur->next;
2802                         if (!cur->flg_read_only) {
2803                                 free((char*)cur->name);
2804                                 free((char*)cur->value);
2805                                 free(cur);
2806                         }
2807                 }
2808         }
2809 #endif
2810
2811  final_return:
2812         return opt ? opt : last_return_code;
2813 }
2814
2815 static char *insert_var_value(char *inp)
2816 {
2817         int res_str_len = 0;
2818         int len;
2819         int done = 0;
2820         char *p, *res_str = NULL;
2821         const char *p1;
2822
2823         while ((p = strchr(inp, SPECIAL_VAR_SYMBOL))) {
2824                 if (p != inp) {
2825                         len = p - inp;
2826                         res_str = xrealloc(res_str, (res_str_len + len));
2827                         strncpy((res_str + res_str_len), inp, len);
2828                         res_str_len += len;
2829                 }
2830                 inp = ++p;
2831                 p = strchr(inp, SPECIAL_VAR_SYMBOL);
2832                 *p = '\0';
2833                 p1 = lookup_param(inp);
2834                 if (p1) {
2835                         len = res_str_len + strlen(p1);
2836                         res_str = xrealloc(res_str, (1 + len));
2837                         strcpy((res_str + res_str_len), p1);
2838                         res_str_len = len;
2839                 }
2840                 *p = SPECIAL_VAR_SYMBOL;
2841                 inp = ++p;
2842                 done = 1;
2843         }
2844         if (done) {
2845                 res_str = xrealloc(res_str, (1 + res_str_len + strlen(inp)));
2846                 strcpy((res_str + res_str_len), inp);
2847                 while ((p = strchr(res_str, '\n'))) {
2848                         *p = ' ';
2849                 }
2850         }
2851         return (res_str == NULL) ? inp : res_str;
2852 }
2853
2854 static char **make_list_in(char **inp, char *name)
2855 {
2856         int len, i;
2857         int name_len = strlen(name);
2858         int n = 0;
2859         char **list;
2860         char *p1, *p2, *p3;
2861
2862         /* create list of variable values */
2863         list = xmalloc(sizeof(*list));
2864         for (i = 0; inp[i]; i++) {
2865                 p3 = insert_var_value(inp[i]);
2866                 p1 = p3;
2867                 while (*p1) {
2868                         if ((*p1 == ' ')) {
2869                                 p1++;
2870                                 continue;
2871                         }
2872                         p2 = strchr(p1, ' ');
2873                         if (p2) {
2874                                 len = p2 - p1;
2875                         } else {
2876                                 len = strlen(p1);
2877                                 p2 = p1 + len;
2878                         }
2879                         /* we use n + 2 in realloc for list, because we add
2880                          * new element and then we will add NULL element */
2881                         list = xrealloc(list, sizeof(*list) * (n + 2));
2882                         list[n] = xmalloc(2 + name_len + len);
2883                         strcpy(list[n], name);
2884                         strcat(list[n], "=");
2885                         strncat(list[n], p1, len);
2886                         list[n++][name_len + len + 1] = '\0';
2887                         p1 = p2;
2888                 }
2889                 if (p3 != inp[i]) free(p3);
2890         }
2891         list[n] = NULL;
2892         return list;
2893 }
2894
2895 /* Make new string for parser */
2896 static char* make_string(char ** inp)
2897 {
2898         char *p;
2899         char *str = NULL;
2900         int n;
2901         int len = 2;
2902
2903         for (n = 0; inp[n]; n++) {
2904                 p = insert_var_value(inp[n]);
2905                 str = xrealloc(str, (len + strlen(p)));
2906                 if (n) {
2907                         strcat(str, " ");
2908                 } else {
2909                         *str = '\0';
2910                 }
2911                 strcat(str, p);
2912                 len = strlen(str) + 3;
2913                 if (p != inp[n]) free(p);
2914         }
2915         len = strlen(str);
2916         str[len] = '\n';
2917         str[len+1] = '\0';
2918         return str;
2919 }