From 9477abc3591905a20acbfe7b8ce7832617d72701 Mon Sep 17 00:00:00 2001
From: Dave Reisner <d@falconindy.com>
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 <d@falconindy.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
---
 src/pacman/util.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

(limited to 'src/pacman')

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) {
-- 
cgit v1.2.3-70-g09d2