summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2007-04-28 16:47:08 +0000
committerDenis Vlasenko2007-04-28 16:47:08 +0000
commit0937be5fa64e9dc0f2dc525225c34ab7c52f256c (patch)
tree44a4fa6eb07c4449bc11416ce92ccb9a7d895c84
parentb5eaabb32221ece5d3a149cb3b49c439fa3647d5 (diff)
downloadbusybox-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.c13
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;