changeset 554:997e016fbdf0

Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
author Rob Landley <rob@landley.net>
date Tue, 20 Mar 2012 11:10:54 -0500
parents 75da5d793fc8
children 2871a78416a6
files lib/lib.c
diffstat 1 files changed, 7 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lib/lib.c	Mon Mar 19 20:56:18 2012 -0500
+++ b/lib/lib.c	Tue Mar 20 11:10:54 2012 -0500
@@ -794,20 +794,22 @@
 // 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;
 }