From 9477abc3591905a20acbfe7b8ce7832617d72701 Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Fri, 18 Mar 2011 11:03:28 -0400 Subject: pacman/util: flush terminal input before reading response Addresses FS#20538 Signed-off-by: Dave Reisner Signed-off-by: Dan McGee --- src/pacman/util.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src') diff --git a/src/pacman/util.c b/src/pacman/util.c index 558d6f8f..51bb0526 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -37,6 +37,9 @@ #include #include #include +#ifdef HAVE_TERMIOS_H +#include /* tcflush */ +#endif #include #include @@ -100,6 +103,18 @@ int needs_root(void) } } +/* discard unhandled input on the terminal's input buffer */ +static int flush_term_input(void) { +#ifdef HAVE_TCFLUSH + if(isatty(fileno(stdin))) { + return(tcflush(fileno(stdin), TCIFLUSH)); + } +#endif + + /* fail silently */ + return 0; +} + /* gets the current screen column width */ int getcols(void) { @@ -812,6 +827,8 @@ int multiselect_question(char *array, int count) break; } + flush_term_input(); + if(fgets(response, sizeof(response), stdin)) { strtrim(response); if(strlen(response) > 0) { @@ -849,6 +866,8 @@ int select_question(int count) break; } + flush_term_input(); + if(fgets(response, sizeof(response), stdin)) { strtrim(response); if(strlen(response) > 0) { @@ -891,6 +910,8 @@ static int question(short preset, char *fmt, va_list args) return preset; } + flush_term_input(); + if(fgets(response, sizeof(response), stdin)) { strtrim(response); if(strlen(response) == 0) { -- cgit v1.2.3