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. --- ChangeLog | 3 +++ Src/input.c | 21 ++++++++++++++------- Test/A01grammar.ztst | 9 +++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index a5ba0fa6a..ec015533a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2022-03-03 Peter Stephenson + * 49792: Src/input.c, Test/A01grammar.ztst: Use line buffering + for non-interactive input. + * 49787: Test/W02jobs.ztst, Test/W03jobparameters.ztst: test for jobs fix in 49783. 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++); } diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst index 4e39a8f3c..0312fe94e 100644 --- a/Test/A01grammar.ztst +++ b/Test/A01grammar.ztst @@ -961,3 +961,12 @@ F:Note that the behaviour of 'exit' inside try-list inside a function is unspeci F:This test was written to ensure the behaviour doesn't change silently. F:If this test fails during development, it *might* be appropriate to change F:its expectations. + + ( + export VALUE=first + print -l 'echo Value is $VALUE' 'VALUE=second sh' 'echo Value is $VALUE' | + $ZTST_testdir/../Src/zsh -f + ) +0:Non-interactive shell command input is line buffered +>Value is first +>Value is second -- cgit 1.4.1