diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-04-28 16:47:08 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-04-28 16:47:08 +0000 |
| commit | 0937be5fa64e9dc0f2dc525225c34ab7c52f256c (patch) | |
| tree | 44a4fa6eb07c4449bc11416ce92ccb9a7d895c84 /shell | |
| parent | b5eaabb32221ece5d3a149cb3b49c439fa3647d5 (diff) | |
| download | busybox-w32-0937be5fa64e9dc0f2dc525225c34ab7c52f256c.tar.gz busybox-w32-0937be5fa64e9dc0f2dc525225c34ab7c52f256c.tar.bz2 busybox-w32-0937be5fa64e9dc0f2dc525225c34ab7c52f256c.zip | |
hush: make hush properly detect EOF on stdin (even interactive one -
think about pty being destroyed) and exit.
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/hush.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/shell/hush.c b/shell/hush.c index 9e13e4a2e..25eb78f4e 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
| @@ -1023,8 +1023,9 @@ static const char* setup_prompt_string(int promptmode) | |||
| 1023 | static line_input_t *line_input_state; | 1023 | static line_input_t *line_input_state; |
| 1024 | #endif | 1024 | #endif |
| 1025 | 1025 | ||
| 1026 | static void get_user_input(struct in_str *i) | 1026 | static int get_user_input(struct in_str *i) |
| 1027 | { | 1027 | { |
| 1028 | int r; | ||
| 1028 | const char *prompt_str; | 1029 | const char *prompt_str; |
| 1029 | static char the_command[BUFSIZ]; | 1030 | static char the_command[BUFSIZ]; |
| 1030 | 1031 | ||
| @@ -1036,15 +1037,16 @@ static void get_user_input(struct in_str *i) | |||
| 1036 | ** atexit() handlers and other unwanted stuff to our | 1037 | ** atexit() handlers and other unwanted stuff to our |
| 1037 | ** child processes (rob@sysgo.de) | 1038 | ** child processes (rob@sysgo.de) |
| 1038 | */ | 1039 | */ |
| 1039 | read_line_input(prompt_str, the_command, BUFSIZ, line_input_state); | 1040 | r = read_line_input(prompt_str, the_command, BUFSIZ, line_input_state); |
| 1040 | #else | 1041 | #else |
| 1041 | fputs(prompt_str, stdout); | 1042 | fputs(prompt_str, stdout); |
| 1042 | fflush(stdout); | 1043 | fflush(stdout); |
| 1043 | the_command[0] = fgetc(i->file); | 1044 | the_command[0] = r = fgetc(i->file); |
| 1044 | the_command[1] = '\0'; | 1045 | the_command[1] = '\0'; |
| 1045 | #endif | 1046 | #endif |
| 1046 | fflush(stdout); | 1047 | fflush(stdout); |
| 1047 | i->p = the_command; | 1048 | i->p = the_command; |
| 1049 | return r; /* < 0 == EOF. Not meaningful otherwise */ | ||
| 1048 | } | 1050 | } |
| 1049 | 1051 | ||
| 1050 | /* This is the magic location that prints prompts | 1052 | /* This is the magic location that prints prompts |
| @@ -1061,8 +1063,9 @@ static int file_get(struct in_str *i) | |||
| 1061 | /* need to double check i->file because we might be doing something | 1063 | /* need to double check i->file because we might be doing something |
| 1062 | * more complicated by now, like sourcing or substituting. */ | 1064 | * more complicated by now, like sourcing or substituting. */ |
| 1063 | if (i->__promptme && interactive_fd && i->file == stdin) { | 1065 | if (i->__promptme && interactive_fd && i->file == stdin) { |
| 1064 | while (!i->p || !(interactive_fd && strlen(i->p))) { | 1066 | while (!i->p || !(interactive_fd && i->p[0])) { |
| 1065 | get_user_input(i); | 1067 | if (get_user_input(i) < 0) |
| 1068 | return EOF; | ||
| 1066 | } | 1069 | } |
| 1067 | i->promptmode = 2; | 1070 | i->promptmode = 2; |
| 1068 | i->__promptme = 0; | 1071 | i->__promptme = 0; |
