Attempt to print yesno questions on /dev/tty so that ideally the user
can't miss them, especially when redirecting stdout/stderr to file.

Signed-off-by: Simon Gomizelj <[email protected]>
---
 src/pacman/util.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/pacman/util.c b/src/pacman/util.c
index 3270c74..4532f84 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -1449,11 +1449,11 @@ static int question(short preset, char *fmt, va_list 
args)
        char response[32];
        FILE *stream;
        int fd_in = fileno(stdin);
+       int rc = preset;
 
-       if(config->noconfirm) {
-               stream = stdout;
-       } else {
-               /* Use stderr so questions are always displayed when 
redirecting output */
+       stream = fopen("/dev/tty", "w");
+       if(stream == NULL) {
+               /* if we can't get at the underlying tty, fallback on stderr */
                stream = stderr;
        }
 
@@ -1471,7 +1471,7 @@ static int question(short preset, char *fmt, va_list args)
 
        if(config->noconfirm) {
                fprintf(stream, "\n");
-               return preset;
+               goto cleanup;
        }
 
        fflush(stream);
@@ -1480,7 +1480,7 @@ static int question(short preset, char *fmt, va_list args)
        if(fgets(response, sizeof(response), stdin)) {
                size_t len = strtrim(response);
                if(len == 0) {
-                       return preset;
+                       goto cleanup;
                }
 
                /* if stdin is piped, response does not get printed out, and as 
a result
@@ -1490,12 +1490,18 @@ static int question(short preset, char *fmt, va_list 
args)
                }
 
                if(strcasecmp(response, _("Y")) == 0 || strcasecmp(response, 
_("YES")) == 0) {
-                       return 1;
+                       rc = 1;
                } else if(strcasecmp(response, _("N")) == 0 || 
strcasecmp(response, _("NO")) == 0) {
-                       return 0;
+                       rc = 0;
                }
        }
-       return 0;
+
+cleanup:
+       if(stream != stdout) {
+               fclose(stream);
+       }
+
+       return rc;
 }
 
 int yesno(char *fmt, ...)
-- 
1.8.1.4


Reply via email to