diff options
author | Denis Vlasenko | 2007-04-28 16:47:08 +0000 |
---|---|---|
committer | Denis Vlasenko | 2007-04-28 16:47:08 +0000 |
commit | 0937be5fa64e9dc0f2dc525225c34ab7c52f256c (patch) | |
tree | 44a4fa6eb07c4449bc11416ce92ccb9a7d895c84 | |
parent | b5eaabb32221ece5d3a149cb3b49c439fa3647d5 (diff) | |
download | busybox-0937be5fa64e9dc0f2dc525225c34ab7c52f256c.zip busybox-0937be5fa64e9dc0f2dc525225c34ab7c52f256c.tar.gz |
hush: make hush properly detect EOF on stdin (even interactive one -
think about pty being destroyed) and exit.
-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 9e13e4a..25eb78f 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -1023,8 +1023,9 @@ static const char* setup_prompt_string(int promptmode) static line_input_t *line_input_state; #endif -static void get_user_input(struct in_str *i) +static int get_user_input(struct in_str *i) { + int r; const char *prompt_str; static char the_command[BUFSIZ]; @@ -1036,15 +1037,16 @@ static void get_user_input(struct in_str *i) ** atexit() handlers and other unwanted stuff to our ** child processes (rob@sysgo.de) */ - read_line_input(prompt_str, the_command, BUFSIZ, line_input_state); + r = read_line_input(prompt_str, the_command, BUFSIZ, line_input_state); #else fputs(prompt_str, stdout); fflush(stdout); - the_command[0] = fgetc(i->file); + the_command[0] = r = fgetc(i->file); the_command[1] = '\0'; #endif fflush(stdout); i->p = the_command; + return r; /* < 0 == EOF. Not meaningful otherwise */ } /* This is the magic location that prints prompts @@ -1061,8 +1063,9 @@ static int file_get(struct in_str *i) /* need to double check i->file because we might be doing something * more complicated by now, like sourcing or substituting. */ if (i->__promptme && interactive_fd && i->file == stdin) { - while (!i->p || !(interactive_fd && strlen(i->p))) { - get_user_input(i); + while (!i->p || !(interactive_fd && i->p[0])) { + if (get_user_input(i) < 0) + return EOF; } i->promptmode = 2; i->__promptme = 0; |