aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-05-02 02:09:36 +0000
committerEric Andersen <andersen@codepoet.org>2001-05-02 02:09:36 +0000
commite67c3ce327379c48a7210f4decdd93692d6c5176 (patch)
treee86880faf6b980466bf99ebd01400349ad8573a4
parente0244b06428c80b80719957d28a1234cc84ad0b4 (diff)
downloadbusybox-e67c3ce327379c48a7210f4decdd93692d6c5176.tar.gz
Another update from Larry:
Makes hush return code equal to that of the last command executed. Fixes the mode where input comes from a file.
-rw-r--r--hush.c36
-rw-r--r--shell/hush.c36
2 files changed, 38 insertions, 34 deletions
diff --git a/hush.c b/hush.c
index 8ef1e2731..2e65f0b6d 100644
--- 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);
}
diff --git a/shell/hush.c b/shell/hush.c
index 8ef1e2731..2e65f0b6d 100644
--- a/shell/hush.c
+++ b/shell/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);
}