From 6b57118c15c6ba60fd84e72ab1ec32bad7f7f7de 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 Conflicts: src/pacman/util.c Signed-off-by: Dave Reisner Signed-off-by: Dan McGee (cherry picked from commit 9477abc3591905a20acbfe7b8ce7832617d72701) --- configure.ac | 5 +++-- src/pacman/util.c | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index c672c66c..f6d5a2c3 100644 --- a/configure.ac +++ b/configure.ac @@ -171,7 +171,8 @@ AM_CONDITIONAL([HAVE_LIBFETCH], [test "x$ac_cv_lib_fetch_fetchParseURL" = "xyes" # Checks for header files. AC_CHECK_HEADERS([fcntl.h glob.h libintl.h locale.h mntent.h string.h \ sys/ioctl.h sys/mount.h sys/param.h sys/statvfs.h \ - sys/time.h sys/types.h sys/ucred.h syslog.h wchar.h]) + sys/time.h sys/types.h sys/ucred.h syslog.h termios.h \ + wchar.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_INLINE @@ -190,7 +191,7 @@ AC_FUNC_GETMNTENT AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_MKTIME AC_CHECK_FUNCS([geteuid getmntinfo realpath regcomp strcasecmp \ - strndup strrchr strsep swprintf \ + strndup strrchr strsep swprintf tcflush \ wcwidth uname]) # For the diskspace code FS_STATS_TYPE diff --git a/src/pacman/util.c b/src/pacman/util.c index 53dbd637..0cb6a9f4 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(int def) { @@ -828,6 +843,8 @@ int multiselect_question(char *array, int count) break; } + flush_term_input(); + if(fgets(response, response_len, stdin)) { const size_t response_incr = 64; /* handle buffer not being large enough to read full line case */ @@ -887,6 +904,8 @@ int select_question(int count) break; } + flush_term_input(); + if(fgets(response, sizeof(response), stdin)) { strtrim(response); if(strlen(response) > 0) { @@ -934,6 +953,8 @@ static int question(short preset, char *fmt, va_list args) } fflush(stream); + flush_term_input(); + if(fgets(response, sizeof(response), stdin)) { strtrim(response); if(strlen(response) == 0) { -- cgit v1.2.3-70-g09d2