From 0937be5fa64e9dc0f2dc525225c34ab7c52f256c Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sat, 28 Apr 2007 16:47:08 +0000 Subject: [PATCH] hush: make hush properly detect EOF on stdin (even interactive one - think about pty being destroyed) and exit. --- shell/hush.c | 13 ++++++++----- 1 file 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) 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; -- 2.25.1