Vodz, last_patch_114
[oweals/busybox.git] / shell / lash.c
index 5c4e97f4aa47c083a81db4433514b44a6290b955..1fcd63bdf5f731d6af2c55257a049a07913daa59 100644 (file)
@@ -2,8 +2,7 @@
 /*
  * lash -- the BusyBox Lame-Ass SHell
  *
- * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen
- * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
+ * Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
  *
  * Based in part on ladsh.c by Michael K. Johnson and Erik W. Troan, which is
  * under the following liberal license: "We have placed this source code in the
@@ -246,7 +245,7 @@ static int builtin_cd(struct child_prog *child)
        }
        cwd = xgetcwd((char *)cwd);
        if (!cwd)
-               cwd = unknown;
+               cwd = bb_msg_unknown;
        return EXIT_SUCCESS;
 }
 
@@ -284,12 +283,12 @@ static int builtin_fg_bg(struct child_prog *child)
                        }
                }
                if (!job) {
-                       error_msg("%s: no current job", child->argv[0]);
+                       bb_error_msg("%s: no current job", child->argv[0]);
                        return EXIT_FAILURE;
                }
        } else {
                if (sscanf(child->argv[1], "%%%d", &jobnum) != 1) {
-                       error_msg("%s: bad argument '%s'", child->argv[0], child->argv[1]);
+                       bb_error_msg("%s: bad argument '%s'", child->argv[0], child->argv[1]);
                        return EXIT_FAILURE;
                }
                for (job = child->family->job_list->head; job; job = job->next) {
@@ -298,7 +297,7 @@ static int builtin_fg_bg(struct child_prog *child)
                        }
                }
                if (!job) {
-                       error_msg("%s: %d: no such job", child->argv[0], jobnum);
+                       bb_error_msg("%s: %d: no such job", child->argv[0], jobnum);
                        return EXIT_FAILURE;
                }
        }
@@ -320,7 +319,7 @@ static int builtin_fg_bg(struct child_prog *child)
                if (i == ESRCH) {
                        remove_job(&job_list, job);
                } else {
-                       perror_msg("kill (SIGCONT)");
+                       bb_perror_msg("kill (SIGCONT)");
                }
        }
 
@@ -371,7 +370,7 @@ static int builtin_pwd(struct child_prog *dummy)
 {
        cwd = xgetcwd((char *)cwd);
        if (!cwd)
-               cwd = unknown;
+               cwd = bb_msg_unknown;
        puts(cwd);
        return EXIT_SUCCESS;
 }
@@ -489,7 +488,7 @@ static void mark_closed(int fd)
 {
        struct close_me *tmp;
        if (close_me_head == NULL || close_me_head->fd != fd)
-               error_msg_and_die("corrupt close_me");
+               bb_error_msg_and_die("corrupt close_me");
        tmp = close_me_head;
        close_me_head = close_me_head->next;
        free(tmp);
@@ -518,12 +517,9 @@ static void free_job(struct job *cmd)
                if (cmd->progs[i].redirects)
                        free(cmd->progs[i].redirects);
        }
-       if (cmd->progs)
-               free(cmd->progs);
-       if (cmd->text)
-               free(cmd->text);
-       if (cmd->cmdbuf)
-               free(cmd->cmdbuf);
+       free(cmd->progs);
+       free(cmd->text);
+       free(cmd->cmdbuf);
        keep = cmd->job_list;
        memset(cmd, 0, sizeof(struct job));
        cmd->job_list = keep;
@@ -602,7 +598,7 @@ static void checkjobs(struct jobset *j_list)
        }
 
        if (childpid == -1 && errno != ECHILD)
-               perror_msg("waitpid");
+               bb_perror_msg("waitpid");
 }
 
 /* squirrel != NULL means we squirrel away copies of stdin, stdout,
@@ -631,7 +627,7 @@ static int setup_redirects(struct child_prog *prog, int squirrel[])
                if (openfd < 0) {
                        /* this could get lost if stderr has been redirected, but
                           bash and ash both lose it as well (though zsh doesn't!) */
-                       perror_msg("error opening %s", redir->filename);
+                       bb_perror_msg("error opening %s", redir->filename);
                        return 1;
                }
 
@@ -677,8 +673,7 @@ static inline void setup_prompt_string(char **prompt_str)
 #ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
        /* Set up the prompt */
        if (shell_context == 0) {
-               if (PS1)
-                       free(PS1);
+               free(PS1);
                PS1=xmalloc(strlen(cwd)+4);
                sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ?  "$ ":"# ");
                *prompt_str = PS1;
@@ -807,7 +802,7 @@ static int expand_arguments(char *command)
        while( command && command[ix]) {
                if (command[ix] == '\\') {
                        const char *tmp = command+ix+1;
-                       command[ix] = process_escape_sequence(  &tmp );
+                       command[ix] = bb_process_escape_sequence(  &tmp );
                        memmove(command+ix + 1, tmp, strlen(tmp)+1);
                }
                ix++;
@@ -820,7 +815,7 @@ static int expand_arguments(char *command)
 
        /* We need a clean copy, so strsep can mess up the copy while
         * we write stuff into the original (in a minute) */
-       cmd = cmd_copy = xstrdup(command);
+       cmd = cmd_copy = bb_xstrdup(command);
        *command = '\0';
        for (ix = 0, tmpcmd = cmd; 
                        (tmpcmd = strsep_space(cmd, &ix)) != NULL; cmd += ix, ix=0) {
@@ -833,13 +828,13 @@ static int expand_arguments(char *command)
                if (retval == GLOB_NOSPACE) {
                        /* Mem may have been allocated... */
                        globfree (&expand_result);
-                       error_msg(out_of_space);
+                       bb_error_msg(out_of_space);
                        return FALSE;
                } else if (retval != 0) {
                        /* Some other error.  GLOB_NOMATCH shouldn't
                         * happen because of the GLOB_NOCHECK flag in 
                         * the glob call. */
-                       error_msg("syntax error");
+                       bb_error_msg("syntax error");
                        return FALSE;
                } else {
                        /* Convert from char** (one word per string) to a simple char*,
@@ -847,7 +842,7 @@ static int expand_arguments(char *command)
                        for (i=0; i < expand_result.gl_pathc; i++) {
                                length=strlen(expand_result.gl_pathv[i]);
                                if (total_length+length+1 >= BUFSIZ) {
-                                       error_msg(out_of_space);
+                                       bb_error_msg(out_of_space);
                                        return FALSE;
                                }
                                strcat(command+total_length, " ");
@@ -890,7 +885,7 @@ static int expand_arguments(char *command)
                        case '0':case '1':case '2':case '3':case '4':
                        case '5':case '6':case '7':case '8':case '9':
                                {
-                                       int ixx=*(dst + 1)-48;
+                                       int ixx=*(dst+1)-48+1;
                                        if (ixx >= argc) {
                                                var='\0';
                                        } else {
@@ -934,7 +929,7 @@ static int expand_arguments(char *command)
                        int subst_len = strlen(var);
                        int trail_len = strlen(src);
                        if (dst+subst_len+trail_len >= command+BUFSIZ) {
-                               error_msg(out_of_space);
+                               bb_error_msg(out_of_space);
                                return FALSE;
                        }
                        /* Move stuff to the end of the string to accommodate
@@ -1010,7 +1005,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                        if (*src == '\\') {
                                src++;
                                if (!*src) {
-                                       error_msg("character expected after \\");
+                                       bb_error_msg("character expected after \\");
                                        free_job(job);
                                        return 1;
                                }
@@ -1094,7 +1089,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                                        chptr++;
 
                                if (!*chptr) {
-                                       error_msg("file name expected after %c", *(src-1));
+                                       bb_error_msg("file name expected after %c", *(src-1));
                                        free_job(job);
                                        job->num_progs=0;
                                        return 1;
@@ -1113,7 +1108,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                                if (*prog->argv[argc_l] || saw_quote)
                                        argc_l++;
                                if (!argc_l) {
-                                       error_msg("empty command in pipe");
+                                       bb_error_msg("empty command in pipe");
                                        free_job(job);
                                        job->num_progs=0;
                                        return 1;
@@ -1140,7 +1135,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                                        src++;
 
                                if (!*src) {
-                                       error_msg("empty command in pipe");
+                                       bb_error_msg("empty command in pipe");
                                        free_job(job);
                                        job->num_progs=0;
                                        return 1;
@@ -1159,7 +1154,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                        case '\\':
                                src++;
                                if (!*src) {
-                                       error_msg("character expected after \\");
+                                       bb_error_msg("character expected after \\");
                                        free_job(job);
                                        return 1;
                                }
@@ -1221,7 +1216,7 @@ static int pseudo_exec(struct child_prog *child)
        /* Check if the command matches any of the forking builtins. */
        for (x = bltins_forking; x->cmd; x++) {
                if (strcmp(child->argv[0], x->cmd) == 0) {
-                       applet_name=x->cmd;
+                       bb_applet_name=x->cmd;
                        _exit (x->function(child));
                }
        }
@@ -1229,7 +1224,7 @@ static int pseudo_exec(struct child_prog *child)
        /* Check if the command matches any busybox internal
         * commands ("applets") here.  Following discussions from
         * November 2000 on busybox@busybox.net, don't use
-        * get_last_path_component().  This way explicit (with
+        * bb_get_last_path_component().  This way explicit (with
         * slashes) filenames will never be interpreted as an
         * applet, just like with builtins.  This way the user can
         * override an applet with an explicit filename reference.
@@ -1245,7 +1240,7 @@ static int pseudo_exec(struct child_prog *child)
         * /bin/cat exists on the filesystem and is _not_ busybox.
         * Some systems want this, others do not.  Choose wisely.  :-)
         */
-       name = get_last_path_component(name);
+       name = bb_get_last_path_component(name);
 #endif
 
        {
@@ -1259,9 +1254,9 @@ static int pseudo_exec(struct child_prog *child)
 
        execvp(child->argv[0], child->argv);
 
-       /* Do not use perror_msg_and_die() here, since we must not 
+       /* Do not use bb_perror_msg_and_die() here, since we must not 
         * call exit() but should call _exit() instead */
-       fprintf(stderr, "%s: %s\n", child->argv[0], strerror(err));
+       fprintf(stderr, "%s: %m\n", child->argv[0]);
        _exit(EXIT_FAILURE);
 }
 
@@ -1303,7 +1298,7 @@ static void insert_job(struct job *newjob, int inbg)
                /* move the new process group into the foreground */
                /* suppress messages when run from /linuxrc mag@sysgo.de */
                if (tcsetpgrp(shell_terminal, newjob->pgrp) && errno != ENOTTY)
-                       perror_msg("tcsetpgrp");
+                       bb_perror_msg("tcsetpgrp");
        }
 }
 
@@ -1321,7 +1316,7 @@ static int run_command(struct job *newjob, int inbg, int outpipe[2])
                child = & (newjob->progs[i]);
 
                if ((i + 1) < newjob->num_progs) {
-                       if (pipe(pipefds)<0) perror_msg_and_die("pipe");
+                       if (pipe(pipefds)<0) bb_perror_msg_and_die("pipe");
                        nextout = pipefds[1];
                } else {
                        if (outpipe[1]!=-1) {
@@ -1468,7 +1463,7 @@ static int busy_loop(FILE * input)
 
                        if (waitpid(job_list.fg->progs[i].pid, &status, WUNTRACED)<0) {
                                if (errno != ECHILD) {
-                                       perror_msg_and_die("waitpid(%d)",job_list.fg->progs[i].pid);
+                                       bb_perror_msg_and_die("waitpid(%d)",job_list.fg->progs[i].pid);
                                }
                        }
 
@@ -1500,7 +1495,7 @@ static int busy_loop(FILE * input)
                                /* move the shell to the foreground */
                                /* suppress messages when run from /linuxrc mag@sysgo.de */
                                if (tcsetpgrp(shell_terminal, getpgrp()) && errno != ENOTTY)
-                                       perror_msg("tcsetpgrp"); 
+                                       bb_perror_msg("tcsetpgrp"); 
                        }
                }
        }
@@ -1508,7 +1503,7 @@ static int busy_loop(FILE * input)
 
        /* return controlling TTY back to parent process group before exiting */
        if (tcsetpgrp(shell_terminal, parent_pgrp) && errno != ENOTTY)
-               perror_msg("tcsetpgrp");
+               bb_perror_msg("tcsetpgrp");
 
        /* return exit status if called with "-c" */
        if (input == NULL && WIFEXITED(status))
@@ -1521,7 +1516,7 @@ static int busy_loop(FILE * input)
 #ifdef CONFIG_FEATURE_CLEAN_UP
 void free_memory(void)
 {
-       if (cwd && cwd!=unknown) {
+       if (cwd && cwd!=bb_msg_unknown) {
                free((char*)cwd);
        }
        if (local_pending_command)
@@ -1536,7 +1531,7 @@ void free_memory(void)
 /* Make sure we have a controlling tty.  If we get started under a job
  * aware app (like bash for example), make sure we are now in charge so
  * we don't fight over who gets the foreground */
-static void setup_job_control()
+static void setup_job_control(void)
 {
        int status;
        
@@ -1598,8 +1593,8 @@ int lash_main(int argc_l, char **argv_l)
                        case 'c':
                                input = NULL;
                                if (local_pending_command != 0)
-                                       error_msg_and_die("multiple -c arguments");
-                               local_pending_command = xstrdup(argv[optind]);
+                                       bb_error_msg_and_die("multiple -c arguments");
+                               local_pending_command = bb_xstrdup(argv[optind]);
                                optind++;
                                argv = argv+optind;
                                break;
@@ -1607,7 +1602,7 @@ int lash_main(int argc_l, char **argv_l)
                                interactive = TRUE;
                                break;
                        default:
-                               show_usage();
+                               bb_show_usage();
                }
        }
        /* A shell is interactive if the `-i' flag was given, or if all of
@@ -1631,14 +1626,14 @@ int lash_main(int argc_l, char **argv_l)
 #endif
        } else if (local_pending_command==NULL) {
                //printf( "optind=%d  argv[optind]='%s'\n", optind, argv[optind]);
-               input = xfopen(argv[optind], "r");
+               input = bb_xfopen(argv[optind], "r");
                mark_open(fileno(input));  /* be lazy, never mark this closed */
        }
 
        /* initialize the cwd -- this is never freed...*/
        cwd = xgetcwd(0);
        if (!cwd)
-               cwd = unknown;
+               cwd = bb_msg_unknown;
 
 #ifdef CONFIG_FEATURE_CLEAN_UP
        atexit(free_memory);