about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoshua Krusell <js.shirin@gmail.com>2015-08-10 12:22:12 +0200
committerPeter Stephenson <pws@zsh.org>2015-08-10 12:32:33 +0100
commit9728f535e27548925b93981662844b3a2fe7dbfa (patch)
tree8384f3d5ca894d796c19dcf1f9d6af6f01919eca
parentade35d3c2689da409fd23029b91fd1327d808291 (diff)
downloadzsh-9728f535e27548925b93981662844b3a2fe7dbfa.tar.gz
zsh-9728f535e27548925b93981662844b3a2fe7dbfa.tar.xz
zsh-9728f535e27548925b93981662844b3a2fe7dbfa.zip
36039: Restart socket commands on EINTR
-rw-r--r--ChangeLog3
-rw-r--r--Src/Modules/socket.c7
-rw-r--r--Src/Modules/tcp.c7
3 files changed, 13 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index ee5945f56..909507cc6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2015-08-10  Peter Stephenson  <p.stephenson@samsung.com>
 
+	* Joshua Krusell: 36039: Src/Modules/socket.c,
+	Src/Modules/tcp.c: Restart socket commands on EINTR.
+
 	* 35885: Doc/Zsh/mod_system.zo: document how to close
 	fd's opened with sysopen.
 
diff --git a/Src/Modules/socket.c b/Src/Modules/socket.c
index cd56d4646..92d0a5035 100644
--- a/Src/Modules/socket.c
+++ b/Src/Modules/socket.c
@@ -191,8 +191,11 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func))
 	}
 
 	len = sizeof(soun);
-	if ((rfd = accept(lfd, (struct sockaddr *)&soun, &len)) == -1)
-	{
+	do {
+	    rfd = accept(lfd, (struct sockaddr *)&soun, &len);
+	} while (errno == EINTR && !errflag);
+
+	if (rfd == -1) {
 	    zwarnnam(nam, "could not accept connection: %e", errno);
 	    return 1;
 	}
diff --git a/Src/Modules/tcp.c b/Src/Modules/tcp.c
index d5b62a82e..304927313 100644
--- a/Src/Modules/tcp.c
+++ b/Src/Modules/tcp.c
@@ -536,8 +536,11 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func))
 	sess = zts_alloc(ZTCP_INBOUND);
 
 	len = sizeof(sess->peer.in);
-	if ((rfd = accept(lfd, (struct sockaddr *)&sess->peer.in, &len)) == -1)
-	{
+	do {
+	    rfd = accept(lfd, (struct sockaddr *)&sess->peer.in, &len);
+	} while (errno == EINTR && !errflag);
+
+	if (rfd == -1) {
 	    zwarnnam(nam, "could not accept connection: %e", errno);
 	    tcp_close(sess);
 	    return 1;