[git commit] vi: survive if stdin is nonblocking. closes 9851

Denys Vlasenko vda.linux at googlemail.com
Tue May 2 18:39:02 UTC 2017


commit: https://git.busybox.net/busybox/commit/?id=0cc9b1843df8c4b6838446542b3f7d5780fb9e84
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
readit                                                55      69     +14

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/vi.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/editors/vi.c b/editors/vi.c
index f33db66..76d1f26 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");


More information about the busybox-cvs mailing list