summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2010-05-29 09:44:53 +1000
committerHerbert Xu <herbert@gondor.apana.org.au>2010-05-29 09:44:53 +1000
commit0cda2e1f8d8222fa497f808b54a2146d60e304f5 (patch)
tree39fcfeb0ab93422c63141e8fcf5bd305a32fe7a6 /src
parent[JOBS] Fix wait regression where it does not wait for all jobs (diff)
downloaddash-0cda2e1f8d8222fa497f808b54a2146d60e304f5.tar.gz
dash-0cda2e1f8d8222fa497f808b54a2146d60e304f5.zip
[BUILTIN] Continue after EINTR in read(1) with no pending signals
The recent introduction of SIGCHLD trapping broke read(1) as
each SIGCHLD may cause read(1) to return prematurely.  Now if
we did have a trap for SIGCHLD read(1) should actually do this.
However, returning when SIGCHLD isn't trapped is wrong.

This patch fixes this by checking for EINTR and pendingsigs in
read(1).

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'src')
-rw-r--r--src/miscbltin.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/miscbltin.c b/src/miscbltin.c
index 046f2f2..5ab1648 100644
--- a/src/miscbltin.c
+++ b/src/miscbltin.c
@@ -57,6 +57,7 @@
 #include "main.h"
 #include "expand.h"
 #include "parser.h"
+#include "trap.h"
 
 #undef rflag
 
@@ -158,9 +159,16 @@ readcmd(int argc, char **argv)
 	backslash = 0;
 	STARTSTACKSTR(p);
 	for (;;) {
-		if (read(0, &c, 1) != 1) {
-			status = 1;
+		switch (read(0, &c, 1)) {
+		case 1:
 			break;
+		default:
+			if (errno == EINTR && !pendingsigs)
+				continue;
+				/* fall through */
+		case 0:
+			status = 1;
+			goto out;
 		}
 		if (c == '\0')
 			continue;
@@ -181,6 +189,7 @@ put:
 resetbs:
 		backslash = 0;
 	}
+out:
 	STACKSTRNUL(p);
 	readcmd_handle_line(stackblock(), ap, p + 1 - (char *)stackblock());
 	return status;