1 /* vi: set sw=4 ts=4: */
3 * lash -- the BusyBox Lame-Ass SHell
5 * Copyright (C) 1999,2000,2001 by Lineo, inc.
6 * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
8 * Based in part on ladsh.c by Michael K. Johnson and Erik W. Troan, which is
9 * under the following liberal license: "We have placed this source code in the
10 * public domain. Use it in any project, free or commercial."
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 /* This shell's parsing engine is officially at a dead-end.
29 * Future work shell work should be done using hush.c
32 //For debugging/development on the shell only...
43 #include <sys/ioctl.h>
51 #ifdef BB_LOCALE_SUPPORT
56 #define expand_t glob_t
59 static const int MAX_READ = 128; /* size of input buffer for `read' builtin */
60 #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n"
63 enum redir_type { REDIRECT_INPUT, REDIRECT_OVERWRITE,
67 static const unsigned int DEFAULT_CONTEXT=0x1;
68 static const unsigned int IF_TRUE_CONTEXT=0x2;
69 static const unsigned int IF_FALSE_CONTEXT=0x4;
70 static const unsigned int THEN_EXP_CONTEXT=0x8;
71 static const unsigned int ELSE_EXP_CONTEXT=0x10;
75 struct job *head; /* head of list of running jobs */
76 struct job *fg; /* current foreground job */
80 enum redir_type type; /* type of redirection */
81 int fd; /* file descriptor being redirected */
82 char *filename; /* file to redirect fd to */
86 pid_t pid; /* 0 if exited */
87 char **argv; /* program name and arguments */
88 int num_redirects; /* elements in redirection array */
89 struct redir_struct *redirects; /* I/O redirects */
90 int is_stopped; /* is the program currently running? */
91 struct job *family; /* pointer back to the child's parent job */
95 int jobid; /* job number */
96 int num_progs; /* total number of programs in job */
97 int running_progs; /* number of programs running */
98 char *text; /* name of job */
99 char *cmdbuf; /* buffer various argv's point into */
100 pid_t pgrp; /* process group ID for the job */
101 struct child_prog *progs; /* array of programs in job */
102 struct job *next; /* to track background commands */
103 int stopped_progs; /* number of programs alive, but stopped */
104 unsigned int job_context; /* bitmask defining current context */
105 struct jobset *job_list;
108 struct built_in_command {
109 char *cmd; /* name */
110 char *descr; /* description */
111 int (*function) (struct child_prog *); /* function ptr */
116 struct close_me *next;
119 /* function prototypes for builtins */
120 static int builtin_cd(struct child_prog *cmd);
121 static int builtin_exec(struct child_prog *cmd);
122 static int builtin_exit(struct child_prog *cmd);
123 static int builtin_fg_bg(struct child_prog *cmd);
124 static int builtin_help(struct child_prog *cmd);
125 static int builtin_jobs(struct child_prog *dummy);
126 static int builtin_pwd(struct child_prog *dummy);
127 static int builtin_export(struct child_prog *cmd);
128 static int builtin_source(struct child_prog *cmd);
129 static int builtin_unset(struct child_prog *cmd);
130 static int builtin_read(struct child_prog *cmd);
133 /* function prototypes for shell stuff */
134 static void mark_open(int fd);
135 static void mark_closed(int fd);
136 static void close_all(void);
137 static void checkjobs(struct jobset *job_list);
138 static void remove_job(struct jobset *j_list, struct job *job);
139 static int get_command(FILE * source, char *command);
140 static int parse_command(char **command_ptr, struct job *job, int *inbg);
141 static int run_command(struct job *newjob, int inbg, int outpipe[2]);
142 static int pseudo_exec(struct child_prog *cmd) __attribute__ ((noreturn));
143 static int busy_loop(FILE * input);
146 /* Table of built-in functions (these are non-forking builtins, meaning they
147 * can change global variables in the parent shell process but they will not
148 * work with pipes and redirects; 'unset foo | whatever' will not work) */
149 static struct built_in_command bltins[] = {
150 {"bg", "Resume a job in the background", builtin_fg_bg},
151 {"cd", "Change working directory", builtin_cd},
152 {"exec", "Exec command, replacing this shell with the exec'd process", builtin_exec},
153 {"exit", "Exit from shell()", builtin_exit},
154 {"fg", "Bring job into the foreground", builtin_fg_bg},
155 {"jobs", "Lists the active jobs", builtin_jobs},
156 {"export", "Set environment variable", builtin_export},
157 {"unset", "Unset environment variable", builtin_unset},
158 {"read", "Input environment variable", builtin_read},
159 {".", "Source-in and run commands in a file", builtin_source},
160 /* to do: add ulimit */
164 /* Table of forking built-in functions (things that fork cannot change global
165 * variables in the parent process, such as the current working directory) */
166 static struct built_in_command bltins_forking[] = {
167 {"pwd", "Print current directory", builtin_pwd},
168 {"help", "List shell built-in commands", builtin_help},
173 /* Variables we export */
174 unsigned int shell_context; /* Used in cmdedit.c to reset the
175 context when someone hits ^C */
178 /* Globals that are static to this file */
179 static const char *cwd;
180 static char *local_pending_command = NULL;
181 static struct jobset job_list = { NULL, NULL };
184 static struct close_me *close_me_head;
185 static int last_return_code;
186 static int last_bg_pid;
187 static unsigned int last_jobid;
188 static int shell_terminal;
189 static pid_t shell_pgrp;
191 static char *PS2 = "> ";
195 static inline void debug_printf(const char *format, ...)
198 va_start(args, format);
199 vfprintf(stderr, format, args);
203 static inline void debug_printf(const char *format, ...) { }
207 Most builtins need access to the struct child_prog that has
208 their arguments, previously coded as cmd->progs[0]. That coding
209 can exhibit a bug, if the builtin is not the first command in
210 a pipeline: "echo foo | exec sort" will attempt to exec foo.
212 builtin previous use notes
213 ------ ----------------- ---------
215 exec cmd->progs[0] squashed bug: didn't look for applets or forking builtins
217 fg_bg cmd->progs[0], job_list->head, job_list->fg
226 I added "struct job *family;" to struct child_prog,
227 and switched API to builtin_foo(struct child_prog *child);
228 So cmd->text becomes child->family->text
229 cmd->job_context becomes child->family->job_context
230 cmd->progs[0] becomes *child
231 job_list becomes child->family->job_list
234 /* built-in 'cd <path>' handler */
235 static int builtin_cd(struct child_prog *child)
239 if (child->argv[1] == NULL)
240 newdir = getenv("HOME");
242 newdir = child->argv[1];
244 printf("cd: %s: %m\n", newdir);
247 cwd = xgetcwd((char *)cwd);
253 /* built-in 'exec' handler */
254 static int builtin_exec(struct child_prog *child)
256 if (child->argv[1] == NULL)
257 return EXIT_SUCCESS; /* Really? */
264 /* built-in 'exit' handler */
265 static int builtin_exit(struct child_prog *child)
267 if (child->argv[1] == NULL)
270 exit (atoi(child->argv[1]));
273 /* built-in 'fg' and 'bg' handler */
274 static int builtin_fg_bg(struct child_prog *child)
277 struct job *job=NULL;
279 /* If they gave us no args, assume they want the last backgrounded task */
280 if (!child->argv[1]) {
281 for (job = child->family->job_list->head; job; job = job->next) {
282 if (job->jobid == last_jobid) {
287 error_msg("%s: no current job", child->argv[0]);
291 if (sscanf(child->argv[1], "%%%d", &jobnum) != 1) {
292 error_msg("%s: bad argument '%s'", child->argv[0], child->argv[1]);
295 for (job = child->family->job_list->head; job; job = job->next) {
296 if (job->jobid == jobnum) {
301 error_msg("%s: %d: no such job", child->argv[0], jobnum);
306 if (*child->argv[0] == 'f') {
307 /* Put the job into the foreground. */
308 tcsetpgrp(shell_terminal, job->pgrp);
310 child->family->job_list->fg = job;
313 /* Restart the processes in the job */
314 for (i = 0; i < job->num_progs; i++)
315 job->progs[i].is_stopped = 0;
317 job->stopped_progs = 0;
319 if ( (i=kill(- job->pgrp, SIGCONT)) < 0) {
321 remove_job(&job_list, job);
323 perror_msg("kill (SIGCONT)");
329 /* built-in 'help' handler */
330 static int builtin_help(struct child_prog *dummy)
332 struct built_in_command *x;
334 printf("\nBuilt-in commands:\n");
335 printf("-------------------\n");
336 for (x = bltins; x->cmd; x++) {
339 printf("%s\t%s\n", x->cmd, x->descr);
341 for (x = bltins_forking; x->cmd; x++) {
344 printf("%s\t%s\n", x->cmd, x->descr);
350 /* built-in 'jobs' handler */
351 static int builtin_jobs(struct child_prog *child)
356 for (job = child->family->job_list->head; job; job = job->next) {
357 if (job->running_progs == job->stopped_progs)
358 status_string = "Stopped";
360 status_string = "Running";
362 printf(JOB_STATUS_FORMAT, job->jobid, status_string, job->text);
368 /* built-in 'pwd' handler */
369 static int builtin_pwd(struct child_prog *dummy)
371 cwd = xgetcwd((char *)cwd);
378 /* built-in 'export VAR=value' handler */
379 static int builtin_export(struct child_prog *child)
382 char *v = child->argv[1];
386 for (e = environ; *e; e++) {
393 fprintf(stderr, "export: %m\n");
394 #ifdef BB_FEATURE_SH_FANCY_PROMPT
395 if (strncmp(v, "PS1=", 4)==0)
399 #ifdef BB_LOCALE_SUPPORT
400 if(strncmp(v, "LC_ALL=", 7)==0)
401 setlocale(LC_ALL, getenv("LC_ALL"));
402 if(strncmp(v, "LC_CTYPE=", 9)==0)
403 setlocale(LC_CTYPE, getenv("LC_CTYPE"));
409 /* built-in 'read VAR' handler */
410 static int builtin_read(struct child_prog *child)
412 int res = 0, len, newlen;
414 char string[MAX_READ];
416 if (child->argv[1]) {
417 /* argument (VAR) given: put "VAR=" into buffer */
418 strcpy(string, child->argv[1]);
419 len = strlen(string);
422 fgets(&string[len], sizeof(string) - len, stdin); /* read string */
423 newlen = strlen(string);
425 string[--newlen] = '\0'; /* chomp trailing newline */
427 ** string should now contain "VAR=<value>"
428 ** copy it (putenv() won't do that, so we must make sure
429 ** the string resides in a static buffer!)
432 if((s = strdup(string)))
435 fprintf(stderr, "read: %m\n");
438 fgets(string, sizeof(string), stdin);
443 /* Built-in '.' handler (read-in and execute commands from file) */
444 static int builtin_source(struct child_prog *child)
450 if (child->argv[1] == NULL)
453 input = fopen(child->argv[1], "r");
455 printf( "Couldn't open file '%s'\n", child->argv[1]);
461 /* Now run the file */
462 status = busy_loop(input);
468 /* built-in 'unset VAR' handler */
469 static int builtin_unset(struct child_prog *child)
471 if (child->argv[1] == NULL) {
472 printf( "unset: parameter required.\n");
475 unsetenv(child->argv[1]);
479 static void mark_open(int fd)
481 struct close_me *new = xmalloc(sizeof(struct close_me));
483 new->next = close_me_head;
487 static void mark_closed(int fd)
489 struct close_me *tmp;
490 if (close_me_head == NULL || close_me_head->fd != fd)
491 error_msg_and_die("corrupt close_me");
493 close_me_head = close_me_head->next;
497 static void close_all()
499 struct close_me *c, *tmp;
500 for (c=close_me_head; c; c=tmp) {
505 close_me_head = NULL;
509 /* free up all memory from a job */
510 static void free_job(struct job *cmd)
515 for (i = 0; i < cmd->num_progs; i++) {
516 free(cmd->progs[i].argv);
517 if (cmd->progs[i].redirects)
518 free(cmd->progs[i].redirects);
526 keep = cmd->job_list;
527 memset(cmd, 0, sizeof(struct job));
528 cmd->job_list = keep;
531 /* remove a job from a jobset */
532 static void remove_job(struct jobset *j_list, struct job *job)
537 if (job == j_list->head) {
538 j_list->head = job->next;
540 prevjob = j_list->head;
541 while (prevjob->next != job)
542 prevjob = prevjob->next;
543 prevjob->next = job->next;
547 last_jobid = j_list->head->jobid;
554 /* Checks to see if any background processes have exited -- if they
555 have, figure out why and see if a job has completed */
556 static void checkjobs(struct jobset *j_list)
563 while ((childpid = waitpid(-1, &status, WNOHANG | WUNTRACED)) > 0) {
564 for (job = j_list->head; job; job = job->next) {
566 while (prognum < job->num_progs &&
567 job->progs[prognum].pid != childpid) prognum++;
568 if (prognum < job->num_progs)
572 /* This happens on backticked commands */
576 if (WIFEXITED(status) || WIFSIGNALED(status)) {
578 job->running_progs--;
579 job->progs[prognum].pid = 0;
581 if (!job->running_progs) {
582 printf(JOB_STATUS_FORMAT, job->jobid, "Done", job->text);
584 remove_job(j_list, job);
588 job->stopped_progs++;
589 job->progs[prognum].is_stopped = 1;
592 /* Printing this stuff is a pain, since it tends to
593 * overwrite the prompt an inconveinient moments. So
595 if (job->stopped_progs == job->num_progs) {
596 printf(JOB_STATUS_FORMAT, job->jobid, "Stopped",
603 if (childpid == -1 && errno != ECHILD)
604 perror_msg("waitpid");
607 /* squirrel != NULL means we squirrel away copies of stdin, stdout,
608 * and stderr if they are redirected. */
609 static int setup_redirects(struct child_prog *prog, int squirrel[])
614 struct redir_struct *redir = prog->redirects;
616 for (i = 0; i < prog->num_redirects; i++, redir++) {
617 switch (redir->type) {
621 case REDIRECT_OVERWRITE:
622 mode = O_WRONLY | O_CREAT | O_TRUNC;
624 case REDIRECT_APPEND:
625 mode = O_WRONLY | O_CREAT | O_APPEND;
629 openfd = open(redir->filename, mode, 0666);
631 /* this could get lost if stderr has been redirected, but
632 bash and ash both lose it as well (though zsh doesn't!) */
633 perror_msg("error opening %s", redir->filename);
637 if (openfd != redir->fd) {
638 if (squirrel && redir->fd < 3) {
639 squirrel[redir->fd] = dup(redir->fd);
641 dup2(openfd, redir->fd);
649 static void restore_redirects(int squirrel[])
652 for (i=0; i<3; i++) {
655 /* No error checking. I sure wouldn't know what
656 * to do with an error if I found one! */
663 static inline void cmdedit_set_initial_prompt(void)
665 #ifndef BB_FEATURE_SH_FANCY_PROMPT
674 static inline void setup_prompt_string(char **prompt_str)
676 #ifndef BB_FEATURE_SH_FANCY_PROMPT
677 /* Set up the prompt */
678 if (shell_context == 0) {
681 PS1=xmalloc(strlen(cwd)+4);
682 sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ? "$ ":"# ");
688 *prompt_str = (shell_context==0)? PS1 : PS2;
692 static int get_command(FILE * source, char *command)
696 if (source == NULL) {
697 if (local_pending_command) {
698 /* a command specified (-c option): return it & mark it done */
699 strcpy(command, local_pending_command);
700 free(local_pending_command);
701 local_pending_command = NULL;
707 if (source == stdin) {
708 setup_prompt_string(&prompt_str);
710 #ifdef BB_FEATURE_COMMAND_EDITING
712 ** enable command line editing only while a command line
713 ** is actually being read; otherwise, we'll end up bequeathing
714 ** atexit() handlers and other unwanted stuff to our
715 ** child processes (rob@sysgo.de)
717 cmdedit_read_input(prompt_str, command);
721 fputs(prompt_str, stdout);
725 if (!fgets(command, BUFSIZ - 2, source)) {
734 static char* itoa(register int i)
736 static char a[7]; /* Max 7 ints */
737 register char *b = a + sizeof(a) - 1;
745 *--b = '0' + (i % 10);
754 char * strsep_space( char *string, int * ix)
760 /* Short circuit the trivial case */
761 if ( !string || ! string[*ix])
764 /* Find the end of the token. */
765 while( string && string[*ix] && !isspace(string[*ix]) ) {
769 /* Find the end of any whitespace trailing behind
770 * the token and let that be part of the token */
771 while( string && string[*ix] && isspace(string[*ix]) ) {
775 if (! string && *ix==0) {
776 /* Nothing useful was found */
780 token = xmalloc(*ix+1);
782 strncpy(token, string, *ix);
787 static int expand_arguments(char *command)
789 int total_length=0, length, i, retval, ix = 0;
790 expand_t expand_result;
791 char *tmpcmd, *cmd, *cmd_copy;
792 char *src, *dst, *var;
793 const char *out_of_space = "out of space during expansion";
794 int flags = GLOB_NOCHECK
803 /* get rid of the terminating \n */
806 /* Fix up escape sequences to be the Real Thing(tm) */
807 while( command && command[ix]) {
808 if (command[ix] == '\\') {
809 const char *tmp = command+ix+1;
810 command[ix] = process_escape_sequence( &tmp );
811 memmove(command+ix + 1, tmp, strlen(tmp)+1);
815 /* Use glob and then fixup environment variables and such */
817 /* It turns out that glob is very stupid. We have to feed it one word at a
818 * time since it can't cope with a full string. Here we convert command
819 * (char*) into cmd (char**, one word per string) */
821 /* We need a clean copy, so strsep can mess up the copy while
822 * we write stuff into the original (in a minute) */
823 cmd = cmd_copy = strdup(command);
825 for (ix = 0, tmpcmd = cmd;
826 (tmpcmd = strsep_space(cmd, &ix)) != NULL; cmd += ix, ix=0) {
829 /* we need to trim() the result for glob! */
831 retval = glob(tmpcmd, flags, NULL, &expand_result);
832 free(tmpcmd); /* Free mem allocated by strsep_space */
833 if (retval == GLOB_NOSPACE) {
834 /* Mem may have been allocated... */
835 globfree (&expand_result);
836 error_msg(out_of_space);
838 } else if (retval != 0) {
839 /* Some other error. GLOB_NOMATCH shouldn't
840 * happen because of the GLOB_NOCHECK flag in
842 error_msg("syntax error");
845 /* Convert from char** (one word per string) to a simple char*,
846 * but don't overflow command which is BUFSIZ in length */
847 for (i=0; i < expand_result.gl_pathc; i++) {
848 length=strlen(expand_result.gl_pathv[i]);
849 if (total_length+length+1 >= BUFSIZ) {
850 error_msg(out_of_space);
853 strcat(command+total_length, " ");
855 strcat(command+total_length, expand_result.gl_pathv[i]);
856 total_length+=length;
858 globfree (&expand_result);
864 /* Now do the shell variable substitutions which
865 * wordexp can't do for us, namely $? and $! */
867 while((dst = strchr(src,'$')) != NULL){
871 var = itoa(last_return_code);
877 var = itoa(last_bg_pid);
879 /* Everything else like $$, $#, $[0-9], etc. should all be
880 * expanded by wordexp(), so we can in theory skip that stuff
881 * here, but just to be on the safe side (i.e., since uClibc
882 * wordexp doesn't do this stuff yet), lets leave it in for
885 var = itoa(getpid());
890 case '0':case '1':case '2':case '3':case '4':
891 case '5':case '6':case '7':case '8':case '9':
893 int ixx=*(dst + 1)-48;
904 /* a single character construction was found, and
905 * already handled in the case statement */
908 /* Looks like an environment variable */
910 int num_skip_chars=0;
911 int dstlen = strlen(dst);
912 /* Is this a ${foo} type variable? */
913 if (dstlen >=2 && *(dst+1) == '{') {
914 src=strchr(dst+1, '}');
918 while(isalnum(*src) || *src=='_') src++;
924 *src='\0'; /* temporary */
925 var = getenv(dst + 1 + num_skip_chars);
927 src += num_skip_chars;
930 /* Seems we got an un-expandable variable. So delete it. */
934 int subst_len = strlen(var);
935 int trail_len = strlen(src);
936 if (dst+subst_len+trail_len >= command+BUFSIZ) {
937 error_msg(out_of_space);
940 /* Move stuff to the end of the string to accommodate
941 * filling the created gap with the new stuff */
942 memmove(dst+subst_len, src, trail_len+1);
943 /* Now copy in the new stuff */
944 memcpy(dst, var, subst_len);
952 /* Return cmd->num_progs as 0 if no command is present (e.g. an empty
953 line). If a valid command is found, command_ptr is set to point to
954 the beginning of the next command (if the original command had more
955 then one job associated with it) or NULL if no more commands are
957 static int parse_command(char **command_ptr, struct job *job, int *inbg)
960 char *return_command = NULL;
961 char *src, *buf, *chptr;
965 int i, saw_quote = 0;
968 struct child_prog *prog;
970 /* skip leading white space */
971 while (**command_ptr && isspace(**command_ptr))
974 /* this handles empty lines or leading '#' characters */
975 if (!**command_ptr || (**command_ptr == '#')) {
982 job->progs = xmalloc(sizeof(*job->progs));
984 /* We set the argv elements to point inside of this string. The
985 memory is freed by free_job(). Allocate twice the original
986 length in case we need to quote every single character.
988 Getting clean memory relieves us of the task of NULL
989 terminating things and makes the rest of this look a bit
990 cleaner (though it is, admittedly, a tad less efficient) */
991 job->cmdbuf = command = xcalloc(2*strlen(*command_ptr) + 1, sizeof(char));
995 prog->num_redirects = 0;
996 prog->redirects = NULL;
997 prog->is_stopped = 0;
1001 prog->argv = xmalloc(sizeof(*prog->argv) * argv_alloced);
1002 prog->argv[0] = job->cmdbuf;
1006 while (*src && !done) {
1007 if (quote == *src) {
1013 error_msg("character expected after \\");
1018 /* in shell, "\'" should yield \' */
1019 if (*src != quote) {
1023 } else if (*src == '*' || *src == '?' || *src == '[' ||
1024 *src == ']') *buf++ = '\\';
1026 } else if (isspace(*src)) {
1027 if (*prog->argv[argc_l] || saw_quote) {
1029 /* +1 here leaves room for the NULL which ends argv */
1030 if ((argc_l + 1) == argv_alloced) {
1032 prog->argv = xrealloc(prog->argv,
1033 sizeof(*prog->argv) *
1036 prog->argv[argc_l] = buf;
1047 case '#': /* comment */
1054 case '>': /* redirects */
1056 i = prog->num_redirects++;
1057 prog->redirects = xrealloc(prog->redirects,
1058 sizeof(*prog->redirects) *
1061 prog->redirects[i].fd = -1;
1062 if (buf != prog->argv[argc_l]) {
1063 /* the stuff before this character may be the file number
1065 prog->redirects[i].fd =
1066 strtol(prog->argv[argc_l], &chptr, 10);
1068 if (*chptr && *prog->argv[argc_l]) {
1070 prog->argv[argc_l] = buf;
1074 if (prog->redirects[i].fd == -1) {
1076 prog->redirects[i].fd = 1;
1078 prog->redirects[i].fd = 0;
1081 if (*src++ == '>') {
1083 prog->redirects[i].type =
1084 REDIRECT_APPEND, src++;
1086 prog->redirects[i].type = REDIRECT_OVERWRITE;
1088 prog->redirects[i].type = REDIRECT_INPUT;
1091 /* This isn't POSIX sh compliant. Oh well. */
1093 while (isspace(*chptr))
1097 error_msg("file name expected after %c", *(src-1));
1103 prog->redirects[i].filename = buf;
1104 while (*chptr && !isspace(*chptr))
1107 src = chptr - 1; /* we src++ later */
1108 prog->argv[argc_l] = ++buf;
1111 case '|': /* pipe */
1112 /* finish this command */
1113 if (*prog->argv[argc_l] || saw_quote)
1116 error_msg("empty command in pipe");
1121 prog->argv[argc_l] = NULL;
1123 /* and start the next */
1125 job->progs = xrealloc(job->progs,
1126 sizeof(*job->progs) * job->num_progs);
1127 prog = job->progs + (job->num_progs - 1);
1128 prog->num_redirects = 0;
1129 prog->redirects = NULL;
1130 prog->is_stopped = 0;
1135 prog->argv = xmalloc(sizeof(*prog->argv) * argv_alloced);
1136 prog->argv[0] = ++buf;
1139 while (*src && isspace(*src))
1143 error_msg("empty command in pipe");
1148 src--; /* we'll ++ it at the end of the loop */
1152 case '&': /* background */
1154 case ';': /* multiple commands */
1156 return_command = *command_ptr + (src - *command_ptr) + 1;
1162 error_msg("character expected after \\");
1166 if (*src == '*' || *src == '[' || *src == ']'
1167 || *src == '?') *buf++ = '\\';
1176 if (*prog->argv[argc_l] || saw_quote) {
1183 prog->argv[argc_l] = NULL;
1185 if (!return_command) {
1186 job->text = xmalloc(strlen(*command_ptr) + 1);
1187 strcpy(job->text, *command_ptr);
1189 /* This leaves any trailing spaces, which is a bit sloppy */
1190 count = return_command - *command_ptr;
1191 job->text = xmalloc(count + 1);
1192 strncpy(job->text, *command_ptr, count);
1193 job->text[count] = '\0';
1196 *command_ptr = return_command;
1201 /* Run the child_prog, no matter what kind of command it uses.
1203 static int pseudo_exec(struct child_prog *child)
1205 struct built_in_command *x;
1206 #ifdef BB_FEATURE_SH_STANDALONE_SHELL
1210 /* Check if the command matches any of the non-forking builtins.
1211 * Depending on context, this might be redundant. But it's
1212 * easier to waste a few CPU cycles than it is to figure out
1213 * if this is one of those cases.
1215 for (x = bltins; x->cmd; x++) {
1216 if (strcmp(child->argv[0], x->cmd) == 0 ) {
1217 exit(x->function(child));
1221 /* Check if the command matches any of the forking builtins. */
1222 for (x = bltins_forking; x->cmd; x++) {
1223 if (strcmp(child->argv[0], x->cmd) == 0) {
1225 exit (x->function(child));
1228 #ifdef BB_FEATURE_SH_STANDALONE_SHELL
1229 /* Check if the command matches any busybox internal
1230 * commands ("applets") here. Following discussions from
1231 * November 2000 on busybox@opensource.lineo.com, don't use
1232 * get_last_path_component(). This way explicit (with
1233 * slashes) filenames will never be interpreted as an
1234 * applet, just like with builtins. This way the user can
1235 * override an applet with an explicit filename reference.
1236 * The only downside to this change is that an explicit
1237 * /bin/foo invocation will fork and exec /bin/foo, even if
1238 * /bin/foo is a symlink to busybox.
1240 name = child->argv[0];
1242 #ifdef BB_FEATURE_SH_APPLETS_ALWAYS_WIN
1243 /* If you enable BB_FEATURE_SH_APPLETS_ALWAYS_WIN, then
1244 * if you run /bin/cat, it will use BusyBox cat even if
1245 * /bin/cat exists on the filesystem and is _not_ busybox.
1246 * Some systems want this, others do not. Choose wisely. :-)
1248 name = get_last_path_component(name);
1252 char** argv_l=child->argv;
1254 for(argc_l=0;*argv_l!=NULL; argv_l++, argc_l++);
1256 run_applet_by_name(name, argc_l, child->argv);
1260 execvp(child->argv[0], child->argv);
1261 perror_msg_and_die("%s", child->argv[0]);
1264 static void insert_job(struct job *newjob, int inbg)
1267 struct jobset *j_list=newjob->job_list;
1269 /* find the ID for thejob to use */
1271 for (thejob = j_list->head; thejob; thejob = thejob->next)
1272 if (thejob->jobid >= newjob->jobid)
1273 newjob->jobid = thejob->jobid + 1;
1275 /* add thejob to the list of running jobs */
1276 if (!j_list->head) {
1277 thejob = j_list->head = xmalloc(sizeof(*thejob));
1279 for (thejob = j_list->head; thejob->next; thejob = thejob->next) /* nothing */;
1280 thejob->next = xmalloc(sizeof(*thejob));
1281 thejob = thejob->next;
1284 *thejob = *newjob; /* physically copy the struct job */
1285 thejob->next = NULL;
1286 thejob->running_progs = thejob->num_progs;
1287 thejob->stopped_progs = 0;
1290 /* we don't wait for background thejobs to return -- append it
1291 to the list of backgrounded thejobs and leave it alone */
1292 printf("[%d] %d\n", thejob->jobid,
1293 newjob->progs[newjob->num_progs - 1].pid);
1294 last_jobid = newjob->jobid;
1295 last_bg_pid=newjob->progs[newjob->num_progs - 1].pid;
1297 newjob->job_list->fg = thejob;
1299 /* move the new process group into the foreground */
1300 /* suppress messages when run from /linuxrc mag@sysgo.de */
1301 if (tcsetpgrp(shell_terminal, newjob->pgrp) && errno != ENOTTY)
1302 perror_msg("tcsetpgrp");
1306 static int run_command(struct job *newjob, int inbg, int outpipe[2])
1308 /* struct job *thejob; */
1310 int nextin, nextout;
1311 int pipefds[2]; /* pipefd[0] is for reading */
1312 struct built_in_command *x;
1313 struct child_prog *child;
1315 nextin = 0, nextout = 1;
1316 for (i = 0; i < newjob->num_progs; i++) {
1317 child = & (newjob->progs[i]);
1319 if ((i + 1) < newjob->num_progs) {
1320 if (pipe(pipefds)<0) perror_msg_and_die("pipe");
1321 nextout = pipefds[1];
1323 if (outpipe[1]!=-1) {
1324 nextout = outpipe[1];
1331 /* Check if the command matches any non-forking builtins,
1332 * but only if this is a simple command.
1333 * Non-forking builtins within pipes have to fork anyway,
1334 * and are handled in pseudo_exec. "echo foo | read bar"
1335 * is doomed to failure, and doesn't work on bash, either.
1337 if (newjob->num_progs == 1) {
1338 for (x = bltins; x->cmd; x++) {
1339 if (strcmp(child->argv[0], x->cmd) == 0 ) {
1340 int squirrel[] = {-1, -1, -1};
1342 setup_redirects(child, squirrel);
1343 rcode = x->function(child);
1344 restore_redirects(squirrel);
1350 if (!(child->pid = fork())) {
1351 /* Set the handling for job control signals back to the default. */
1352 signal(SIGINT, SIG_DFL);
1353 signal(SIGQUIT, SIG_DFL);
1354 signal(SIGTSTP, SIG_DFL);
1355 signal(SIGTTIN, SIG_DFL);
1356 signal(SIGTTOU, SIG_DFL);
1357 signal(SIGCHLD, SIG_DFL);
1361 if (outpipe[1]!=-1) {
1371 dup2(nextout, 2); /* Really? */
1376 /* explicit redirects override pipes */
1377 setup_redirects(child,NULL);
1381 if (outpipe[1]!=-1) {
1385 /* put our child in the process group whose leader is the
1386 first process in this pipe */
1387 setpgid(child->pid, newjob->progs[0].pid);
1393 /* If there isn't another process, nextin is garbage
1394 but it doesn't matter */
1395 nextin = pipefds[0];
1398 newjob->pgrp = newjob->progs[0].pid;
1400 insert_job(newjob, inbg);
1405 static int busy_loop(FILE * input)
1408 char *next_command = NULL;
1414 newjob.job_list = &job_list;
1415 newjob.job_context = DEFAULT_CONTEXT;
1417 /* save current owner of TTY so we can restore it on exit */
1418 parent_pgrp = tcgetpgrp(shell_terminal);
1420 command = (char *) xcalloc(BUFSIZ, sizeof(char));
1424 /* no job is in the foreground */
1426 /* see if any background processes have exited */
1427 checkjobs(&job_list);
1429 if (!next_command) {
1430 if (get_command(input, command))
1432 next_command = command;
1435 if (expand_arguments(next_command) == FALSE) {
1437 command = (char *) xcalloc(BUFSIZ, sizeof(char));
1438 next_command = NULL;
1442 if (!parse_command(&next_command, &newjob, &inbg) &&
1444 int pipefds[2] = {-1,-1};
1445 debug_printf( "job=%p fed to run_command by busy_loop()'\n",
1447 run_command(&newjob, inbg, pipefds);
1451 command = (char *) xcalloc(BUFSIZ, sizeof(char));
1452 next_command = NULL;
1455 /* a job is running in the foreground; wait for it */
1457 while (!job_list.fg->progs[i].pid ||
1458 job_list.fg->progs[i].is_stopped == 1) i++;
1460 if (waitpid(job_list.fg->progs[i].pid, &status, WUNTRACED)<0)
1461 perror_msg_and_die("waitpid(%d)",job_list.fg->progs[i].pid);
1463 if (WIFEXITED(status) || WIFSIGNALED(status)) {
1464 /* the child exited */
1465 job_list.fg->running_progs--;
1466 job_list.fg->progs[i].pid = 0;
1468 last_return_code=WEXITSTATUS(status);
1470 if (!job_list.fg->running_progs) {
1472 remove_job(&job_list, job_list.fg);
1476 /* the child was stopped */
1477 job_list.fg->stopped_progs++;
1478 job_list.fg->progs[i].is_stopped = 1;
1480 if (job_list.fg->stopped_progs == job_list.fg->running_progs) {
1481 printf("\n" JOB_STATUS_FORMAT, job_list.fg->jobid,
1482 "Stopped", job_list.fg->text);
1488 /* move the shell to the foreground */
1489 /* suppress messages when run from /linuxrc mag@sysgo.de */
1490 if (tcsetpgrp(shell_terminal, getpgrp()) && errno != ENOTTY)
1491 perror_msg("tcsetpgrp");
1497 /* return controlling TTY back to parent process group before exiting */
1498 if (tcsetpgrp(shell_terminal, parent_pgrp))
1499 perror_msg("tcsetpgrp");
1501 /* return exit status if called with "-c" */
1502 if (input == NULL && WIFEXITED(status))
1503 return WEXITSTATUS(status);
1509 #ifdef BB_FEATURE_CLEAN_UP
1510 void free_memory(void)
1515 if (local_pending_command)
1516 free(local_pending_command);
1518 if (job_list.fg && !job_list.fg->running_progs) {
1519 remove_job(&job_list, job_list.fg);
1524 /* Make sure we have a controlling tty. If we get started under a job
1525 * aware app (like bash for example), make sure we are now in charge so
1526 * we don't fight over who gets the foreground */
1527 static void setup_job_control()
1529 /* Loop until we are in the foreground. */
1530 while (tcgetpgrp (shell_terminal) != (shell_pgrp = getpgrp ()))
1531 kill (- shell_pgrp, SIGTTIN);
1533 /* Ignore interactive and job-control signals. */
1534 signal(SIGINT, SIG_IGN);
1535 signal(SIGQUIT, SIG_IGN);
1536 signal(SIGTSTP, SIG_IGN);
1537 signal(SIGTTIN, SIG_IGN);
1538 signal(SIGTTOU, SIG_IGN);
1539 signal(SIGCHLD, SIG_IGN);
1541 /* Put ourselves in our own process group. */
1543 shell_pgrp = getpid ();
1544 setpgid (shell_pgrp, shell_pgrp);
1546 /* Grab control of the terminal. */
1547 tcsetpgrp(shell_terminal, shell_pgrp);
1550 int shell_main(int argc_l, char **argv_l)
1552 int opt, interactive=FALSE;
1553 FILE *input = stdin;
1557 /* These variables need re-initializing when recursing */
1560 local_pending_command = NULL;
1561 close_me_head = NULL;
1562 job_list.head = NULL;
1566 if (argv[0] && argv[0][0] == '-') {
1568 prof_input = fopen("/etc/profile", "r");
1570 int tmp_fd = fileno(prof_input);
1572 /* Now run the file */
1573 busy_loop(prof_input);
1575 mark_closed(tmp_fd);
1579 while ((opt = getopt(argc_l, argv_l, "cxi")) > 0) {
1583 if (local_pending_command != 0)
1584 error_msg_and_die("multiple -c arguments");
1585 local_pending_command = xstrdup(argv[optind]);
1596 /* A shell is interactive if the `-i' flag was given, or if all of
1597 * the following conditions are met:
1599 * no arguments remaining or the -s flag given
1600 * standard input is a terminal
1601 * standard output is a terminal
1602 * Refer to Posix.2, the description of the `sh' utility. */
1603 if (argv[optind]==NULL && input==stdin &&
1604 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
1607 setup_job_control();
1608 if (interactive==TRUE) {
1609 //printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]);
1610 /* Looks like they want an interactive shell */
1611 printf( "\n\n" BB_BANNER " Built-in shell (lash)\n");
1612 printf( "Enter 'help' for a list of built-in commands.\n\n");
1613 } else if (local_pending_command==NULL) {
1614 //printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]);
1615 input = xfopen(argv[optind], "r");
1616 mark_open(fileno(input)); /* be lazy, never mark this closed */
1619 /* initialize the cwd -- this is never freed...*/
1624 #ifdef BB_FEATURE_CLEAN_UP
1625 atexit(free_memory);
1628 #ifdef BB_FEATURE_COMMAND_EDITING
1629 cmdedit_set_initial_prompt();
1634 return (busy_loop(input));