aboutsummaryrefslogtreecommitdiff
path: root/editors
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-05-02 20:39:02 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-05-02 20:39:02 +0200
commit0cc9b1843df8c4b6838446542b3f7d5780fb9e84 (patch)
treece983d93b2fa364861887c23f47e873a933d6889 /editors
parenta1a3b595e1c96c3568818d019864bb23cd33e673 (diff)
downloadbusybox-0cc9b1843df8c4b6838446542b3f7d5780fb9e84.tar.gz
vi: survive if stdin is nonblocking. closes 9851
function old new delta readit 55 69 +14 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'editors')
-rw-r--r--editors/vi.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/editors/vi.c b/editors/vi.c
index f33db66c6..76d1f261b 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -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");