summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDave Reisner <d@falconindy.com>2011-03-18 16:03:28 +0100
committerDan McGee <dan@archlinux.org>2011-03-28 16:04:15 +0200
commit9477abc3591905a20acbfe7b8ce7832617d72701 (patch)
treef5b63ec70295739b6ad5d8ec048d1437ea88da8f /src
parente8069cfc3def97f564f5e4a4301e43de2a6a9b67 (diff)
downloadpacman-9477abc3591905a20acbfe7b8ce7832617d72701.tar.gz
pacman-9477abc3591905a20acbfe7b8ce7832617d72701.tar.xz
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>
Diffstat (limited to 'src')
-rw-r--r--src/pacman/util.c21
1 files changed, 21 insertions, 0 deletions
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 <unistd.h>
#include <limits.h>
#include <wchar.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h> /* tcflush */
+#endif
#include <alpm.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 */
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) {