From 855ceea901c2cd5324ec3f427fa4303ac55fa51d Mon Sep 17 00:00:00 2001 From: Joshua Krusell Date: Wed, 22 Jul 2015 13:06:56 -0700 Subject: 35939: fix select polling in ztcp and zsocket --- Src/Modules/tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Src/Modules/tcp.c') diff --git a/Src/Modules/tcp.c b/Src/Modules/tcp.c index 0d9522047..d5b62a82e 100644 --- a/Src/Modules/tcp.c +++ b/Src/Modules/tcp.c @@ -519,7 +519,7 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func)) tv.tv_sec = 0; tv.tv_usec = 0; - if ((ret = select(lfd+1, &rfds, NULL, NULL, &tv))) return 1; + if ((ret = select(lfd+1, &rfds, NULL, NULL, &tv)) == 0) return 1; else if (ret == -1) { zwarnnam(nam, "select error: %e", errno); -- cgit v1.2.3 From 9728f535e27548925b93981662844b3a2fe7dbfa Mon Sep 17 00:00:00 2001 From: Joshua Krusell Date: Mon, 10 Aug 2015 12:22:12 +0200 Subject: 36039: Restart socket commands on EINTR --- ChangeLog | 3 +++ Src/Modules/socket.c | 7 +++++-- Src/Modules/tcp.c | 7 +++++-- 3 files changed, 13 insertions(+), 4 deletions(-) (limited to 'Src/Modules/tcp.c') diff --git a/ChangeLog b/ChangeLog index ee5945f56..909507cc6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2015-08-10 Peter Stephenson + * 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; -- cgit v1.2.3 From cbdb3cf9be7f0fb5a94e78c3f6fcd22805a57fab Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 10 Aug 2015 13:44:12 +0100 Subject: not quite posted: check for error return before EINTR --- ChangeLog | 3 +++ Src/Modules/socket.c | 2 +- Src/Modules/tcp.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) (limited to 'Src/Modules/tcp.c') diff --git a/ChangeLog b/ChangeLog index 909507cc6..4153f6a86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2015-08-10 Peter Stephenson + * not quite posted: Src/Modules/socket.c, Src/Modules/tcp.c: + check for error return before testing for EINTR. + * Joshua Krusell: 36039: Src/Modules/socket.c, Src/Modules/tcp.c: Restart socket commands on EINTR. diff --git a/Src/Modules/socket.c b/Src/Modules/socket.c index 92d0a5035..65b87d7dd 100644 --- a/Src/Modules/socket.c +++ b/Src/Modules/socket.c @@ -193,7 +193,7 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func)) len = sizeof(soun); do { rfd = accept(lfd, (struct sockaddr *)&soun, &len); - } while (errno == EINTR && !errflag); + } while (rfd < 0 && errno == EINTR && !errflag); if (rfd == -1) { zwarnnam(nam, "could not accept connection: %e", errno); diff --git a/Src/Modules/tcp.c b/Src/Modules/tcp.c index 304927313..bc1765da1 100644 --- a/Src/Modules/tcp.c +++ b/Src/Modules/tcp.c @@ -538,7 +538,7 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func)) len = sizeof(sess->peer.in); do { rfd = accept(lfd, (struct sockaddr *)&sess->peer.in, &len); - } while (errno == EINTR && !errflag); + } while (rfd < 0 && errno == EINTR && !errflag); if (rfd == -1) { zwarnnam(nam, "could not accept connection: %e", errno); -- cgit v1.2.3