OSDN Git Service

Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
authorRob Landley <rob@landley.net>
Tue, 20 Mar 2012 16:10:54 +0000 (11:10 -0500)
committerRob Landley <rob@landley.net>
Tue, 20 Mar 2012 16:10:54 +0000 (11:10 -0500)
lib/lib.c

index f4b81f5..4190b06 100644 (file)
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -794,20 +794,22 @@ void terminal_size(unsigned *x, unsigned *y)
 // This should use a raw tty, fixit later.
 int yesno(char *prompt, int def)
 {
-       FILE *fp = fopen("/dev/tty", "rw");
+       FILE *fps[] = {stdin, stdout, stderr};
+       int i;
        char buf;
 
-       if (!fp) return 1;
+       for (i=0; i<3; i++) if (isatty(i)) break;
+       if (i == 3) return 1;
 
-       fprintf(fp, "%s (%c/%c):", prompt, def ? 'Y' : 'y', def ? 'n' : 'N');
-       while (fread(&buf, 1, 1, fp)) {
+       fprintf(fps[i], "%s (%c/%c):", prompt, def ? 'Y' : 'y', def ? 'n' : 'N');
+       fflush(fps[i]);
+       while (fread(&buf, 1, 1, fps[i])) {
                if (tolower(buf) == 'y') def = 1;
                if (tolower(buf) == 'n') def = 0;
                else if (!isspace(buf)) continue;
 
                break;
        }
-       fclose(fp);
 
        return def;
 }