vi: survive if stdin is nonblocking. closes 9851
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 2 May 2017 18:39:02 +0000 (20:39 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 2 May 2017 18:39:02 +0000 (20:39 +0200)
function                                             old     new   delta
readit                                                55      69     +14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/vi.c

index f33db66c655d8ac40921e3202f3786ff51a27961..76d1f261b7c00084663ddebea4d50c128771c64b 100644 (file)
@@ -2816,8 +2816,15 @@ static int readit(void) // read (maybe cursor) key from stdin
        int c;
 
        fflush_all();
-       c = read_key(STDIN_FILENO, readbuffer, /*timeout off:*/ -2);
+
+       // Wait for input. TIMEOUT = -1 makes read_key wait even
+       // on nonblocking stdin.
+       // Note: read_key sets errno to 0 on success.
+ again:
+       c = read_key(STDIN_FILENO, readbuffer, /*timeout:*/ -1);
        if (c == -1) { // EOF/error
+               if (errno == EAGAIN) // paranoia
+                       goto again;
                go_bottom_and_clear_to_eol();
                cookmode(); // terminal to "cooked"
                bb_error_msg_and_die("can't read user input");