pacman/util: flush terminal input before reading response

Addresses FS#20538

Signed-off-by: Dave Reisner <d@falconindy.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dave Reisner 2011-03-18 11:03:28 -04:00 committed by Dan McGee
parent e8069cfc3d
commit 9477abc359
2 changed files with 24 additions and 2 deletions

View File

@ -154,7 +154,8 @@ AC_CHECK_LIB([gpgme], [gpgme_check_version], ,
# Checks for header files. # Checks for header files.
AC_CHECK_HEADERS([fcntl.h glob.h libintl.h locale.h mntent.h string.h \ 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/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. # Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE AC_C_INLINE
@ -173,7 +174,7 @@ AC_FUNC_GETMNTENT
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
AC_FUNC_MKTIME AC_FUNC_MKTIME
AC_CHECK_FUNCS([geteuid getmntinfo realpath regcomp strcasecmp \ AC_CHECK_FUNCS([geteuid getmntinfo realpath regcomp strcasecmp \
strndup strrchr strsep swprintf \ strndup strrchr strsep swprintf tcflush \
wcwidth uname]) wcwidth uname])
# For the diskspace code # For the diskspace code
FS_STATS_TYPE FS_STATS_TYPE

View File

@ -37,6 +37,9 @@
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
#include <wchar.h> #include <wchar.h>
#ifdef HAVE_TERMIOS_H
#include <termios.h> /* tcflush */
#endif
#include <alpm.h> #include <alpm.h>
#include <alpm_list.h> #include <alpm_list.h>
@ -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 */ /* gets the current screen column width */
int getcols(void) int getcols(void)
{ {
@ -812,6 +827,8 @@ int multiselect_question(char *array, int count)
break; break;
} }
flush_term_input();
if(fgets(response, sizeof(response), stdin)) { if(fgets(response, sizeof(response), stdin)) {
strtrim(response); strtrim(response);
if(strlen(response) > 0) { if(strlen(response) > 0) {
@ -849,6 +866,8 @@ int select_question(int count)
break; break;
} }
flush_term_input();
if(fgets(response, sizeof(response), stdin)) { if(fgets(response, sizeof(response), stdin)) {
strtrim(response); strtrim(response);
if(strlen(response) > 0) { if(strlen(response) > 0) {
@ -891,6 +910,8 @@ static int question(short preset, char *fmt, va_list args)
return preset; return preset;
} }
flush_term_input();
if(fgets(response, sizeof(response), stdin)) { if(fgets(response, sizeof(response), stdin)) {
strtrim(response); strtrim(response);
if(strlen(response) == 0) { if(strlen(response) == 0) {