From 1640457f4755a4a5248f5e9c0106fa01f8f1e9ff Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 3 Mar 2022 19:19:35 +0000 Subject: 49792: Non-interative shell input is line buffered. --- Src/input.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'Src/input.c') diff --git a/Src/input.c b/Src/input.c index caeaff0e3..c59232681 100644 --- a/Src/input.c +++ b/Src/input.c @@ -223,13 +223,20 @@ shingetchar(void) return STOUC(*shinbufptr++); shinbufreset(); - do { - errno = 0; - nread = read(SHIN, shinbuffer, SHINBUFSIZE); - } while (nread < 0 && errno == EINTR); - if (nread <= 0) - return -1; - shinbufendptr = shinbuffer + nread; + for (;;) { + errno = 0; + nread = read(SHIN, shinbufendptr, 1); + if (nread > 0) { + /* Use line buffering (POSIX requirement) */ + if (*shinbufendptr++ == '\n') + break; + if (shinbufendptr == shinbuffer + SHINBUFSIZE) + break; + } else if (nread == 0 || errno != EINTR) + break; + } + if (shinbufendptr == shinbuffer) + return -1; return STOUC(*shinbufptr++); } -- cgit 1.4.1