Another update from Larry:
authorEric Andersen <andersen@codepoet.org>
Wed, 2 May 2001 02:09:36 +0000 (02:09 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 2 May 2001 02:09:36 +0000 (02:09 -0000)
    Makes hush return code equal to that of the last command executed.
    Fixes the mode where input comes from a file.

hush.c
shell/hush.c

diff --git a/hush.c b/hush.c
index 8ef1e2731de2fb13d3e78685a0a500f37e5b3a38..2e65f0b6db3d08e24274ebaf7a52db52c4a4bb36 100644 (file)
--- a/hush.c
+++ b/hush.c
@@ -445,7 +445,7 @@ static int builtin_exec(struct child_prog *child)
 static int builtin_exit(struct child_prog *child)
 {
        if (child->argv[1] == NULL)
-               exit(EXIT_SUCCESS);
+               exit(last_return_code);
        exit (atoi(child->argv[1]));
 }
 
@@ -814,17 +814,14 @@ static int file_get(struct in_str *i)
                if (i->__promptme && interactive && i->file == stdin) {
                        get_user_input(i);
                        i->promptmode=2;
+                       i->__promptme = 0;
+                       if (i->p && *i->p) {
+                               ch=*i->p++;
+                       }
                } else {
-                       static char buffer;
-                       buffer = fgetc(i->file);
-                       i->p = &buffer;
+                       ch = fgetc(i->file);
                }
 
-               i->__promptme = 0;
-
-               if (i->p && *i->p) {
-                       ch=*i->p++;
-               }
                debug_printf("b_getch: got a %d\n", ch);
        }
        if (ch == '\n') i->__promptme=1;
@@ -839,9 +836,10 @@ static int file_peek(struct in_str *i)
        if (i->p && *i->p) {
                return *i->p;
        } else {
-               static char buffer;
-               buffer = fgetc(i->file);
-               i->p = &buffer;
+               static char buffer[2];
+               buffer[0] = fgetc(i->file);
+               buffer[1] = '\0';
+               i->p = buffer;
                debug_printf("b_peek: got a %d\n", *i->p);
                return *i->p; 
        }
@@ -2081,6 +2079,8 @@ int shell_main(int argc, char **argv)
        int opt;
        FILE *input;
 
+       last_return_code=EXIT_SUCCESS;
+
        /* XXX what should these be while sourcing /etc/profile? */
        global_argc = argc;
        global_argv = argv;
@@ -2110,7 +2110,7 @@ int shell_main(int argc, char **argv)
                                        global_argv = argv+optind;
                                        global_argc = argc-optind;
                                        opt = parse_string_outer(optarg);
-                                       exit(opt);
+                                       goto final_return;
                                }
                                break;
                        case 'i':
@@ -2136,13 +2136,14 @@ int shell_main(int argc, char **argv)
                        isatty(fileno(stdin)) && isatty(fileno(stdout))) {
                interactive++;
        }
-       
+
+       debug_printf("\ninteractive=%d\n", interactive);
        if (interactive) {
                /* Looks like they want an interactive shell */
                fprintf(stdout, "\nhush -- the humble shell v0.01 (testing)\n\n");
-               exit(parse_file_outer(stdin));
+               opt=parse_file_outer(stdin);
+               goto final_return;
        }
-       debug_printf("\ninteractive=%d\n", interactive);
 
        debug_printf("\nrunning script '%s'\n", argv[optind]);
        global_argv = argv+optind;
@@ -2154,5 +2155,6 @@ int shell_main(int argc, char **argv)
        fclose(input.file);
 #endif
 
-       return(opt);
+final_return:
+       return(opt?opt:last_return_code);
 }
index 8ef1e2731de2fb13d3e78685a0a500f37e5b3a38..2e65f0b6db3d08e24274ebaf7a52db52c4a4bb36 100644 (file)
@@ -445,7 +445,7 @@ static int builtin_exec(struct child_prog *child)
 static int builtin_exit(struct child_prog *child)
 {
        if (child->argv[1] == NULL)
-               exit(EXIT_SUCCESS);
+               exit(last_return_code);
        exit (atoi(child->argv[1]));
 }
 
@@ -814,17 +814,14 @@ static int file_get(struct in_str *i)
                if (i->__promptme && interactive && i->file == stdin) {
                        get_user_input(i);
                        i->promptmode=2;
+                       i->__promptme = 0;
+                       if (i->p && *i->p) {
+                               ch=*i->p++;
+                       }
                } else {
-                       static char buffer;
-                       buffer = fgetc(i->file);
-                       i->p = &buffer;
+                       ch = fgetc(i->file);
                }
 
-               i->__promptme = 0;
-
-               if (i->p && *i->p) {
-                       ch=*i->p++;
-               }
                debug_printf("b_getch: got a %d\n", ch);
        }
        if (ch == '\n') i->__promptme=1;
@@ -839,9 +836,10 @@ static int file_peek(struct in_str *i)
        if (i->p && *i->p) {
                return *i->p;
        } else {
-               static char buffer;
-               buffer = fgetc(i->file);
-               i->p = &buffer;
+               static char buffer[2];
+               buffer[0] = fgetc(i->file);
+               buffer[1] = '\0';
+               i->p = buffer;
                debug_printf("b_peek: got a %d\n", *i->p);
                return *i->p; 
        }
@@ -2081,6 +2079,8 @@ int shell_main(int argc, char **argv)
        int opt;
        FILE *input;
 
+       last_return_code=EXIT_SUCCESS;
+
        /* XXX what should these be while sourcing /etc/profile? */
        global_argc = argc;
        global_argv = argv;
@@ -2110,7 +2110,7 @@ int shell_main(int argc, char **argv)
                                        global_argv = argv+optind;
                                        global_argc = argc-optind;
                                        opt = parse_string_outer(optarg);
-                                       exit(opt);
+                                       goto final_return;
                                }
                                break;
                        case 'i':
@@ -2136,13 +2136,14 @@ int shell_main(int argc, char **argv)
                        isatty(fileno(stdin)) && isatty(fileno(stdout))) {
                interactive++;
        }
-       
+
+       debug_printf("\ninteractive=%d\n", interactive);
        if (interactive) {
                /* Looks like they want an interactive shell */
                fprintf(stdout, "\nhush -- the humble shell v0.01 (testing)\n\n");
-               exit(parse_file_outer(stdin));
+               opt=parse_file_outer(stdin);
+               goto final_return;
        }
-       debug_printf("\ninteractive=%d\n", interactive);
 
        debug_printf("\nrunning script '%s'\n", argv[optind]);
        global_argv = argv+optind;
@@ -2154,5 +2155,6 @@ int shell_main(int argc, char **argv)
        fclose(input.file);
 #endif
 
-       return(opt);
+final_return:
+       return(opt?opt:last_return_code);
 }