Eliminated seeks so that we work correctly on pipes, and removed reliance on
[oweals/busybox.git] / sh.c
diff --git a/sh.c b/sh.c
index ee45b1a0dbe895437e97663c1e9536d03da64f4f..243ba8139d7fa03da14e998ca13aee166a58014a 100644 (file)
--- a/sh.c
+++ b/sh.c
@@ -1159,7 +1159,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
        int argc_l = 0;
        int done = 0;
        int argv_alloced;
-       int i;
+       int i, saw_quote = 0;
        char quote = '\0';
        int count;
        struct child_prog *prog;
@@ -1221,7 +1221,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                                           *src == ']') *buf++ = '\\';
                        *buf++ = *src;
                } else if (isspace(*src)) {
-                       if (*prog->argv[argc_l]) {
+                       if (*prog->argv[argc_l] || saw_quote) {
                                buf++, argc_l++;
                                /* +1 here leaves room for the NULL which ends argv */
                                if ((argc_l + 1) == argv_alloced) {
@@ -1231,12 +1231,14 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                                                                                  argv_alloced);
                                }
                                prog->argv[argc_l] = buf;
+                               saw_quote = 0;
                        }
                } else
                        switch (*src) {
                        case '"':
                        case '\'':
                                quote = *src;
+                               saw_quote = 1;
                                break;
 
                        case '#':                       /* comment */
@@ -1305,7 +1307,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
 
                        case '|':                       /* pipe */
                                /* finish this command */
-                               if (*prog->argv[argc_l])
+                               if (*prog->argv[argc_l] || saw_quote)
                                        argc_l++;
                                if (!argc_l) {
                                        error_msg("empty command in pipe");
@@ -1474,7 +1476,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                src++;
        }
 
-       if (*prog->argv[argc_l]) {
+       if (*prog->argv[argc_l] || saw_quote) {
                argc_l++;
        }
        if (!argc_l) {
@@ -1907,7 +1909,7 @@ int shell_main(int argc_l, char **argv_l)
        if (interactive==TRUE) {
                //printf( "optind=%d  argv[optind]='%s'\n", optind, argv[optind]);
                /* Looks like they want an interactive shell */
-               printf( "\n\nBusyBox v%s (%s) Built-in shell (lash)\n", BB_VER, BB_BT);
+               printf( "\n\n" BB_BANNER " Built-in shell (lash)\n");
                printf( "Enter 'help' for a list of built-in commands.\n\n");
        } else if (local_pending_command==NULL) {
                //printf( "optind=%d  argv[optind]='%s'\n", optind, argv[optind]);