From 94cb06fecfb27ca252e1a4a2ac83488ff1787f23 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 14 Jun 2012 00:46:57 +0200 Subject: [PATCH] unix: make uv__nonblock() EINTR resilient It's underspecified if and when ioctl(FIONBIO) or fcntl() can return EINTR. Let's take the safe route. --- src/unix/core.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/unix/core.c b/src/unix/core.c index a9c49f08..766da526 100644 --- a/src/unix/core.c +++ b/src/unix/core.c @@ -462,26 +462,34 @@ int uv__accept(int sockfd) { int uv__nonblock(int fd, int set) { + int r; + #if FIONBIO - return ioctl(fd, FIONBIO, &set); + do + r = ioctl(fd, FIONBIO, &set); + while (r == -1 && errno == EINTR); + + return r; #else int flags; - if ((flags = fcntl(fd, F_GETFL)) == -1) { + do + r = fcntl(fd, F_GETFL); + while (r == -1 && errno == EINTR); + + if (r == -1) return -1; - } - if (set) { - flags |= O_NONBLOCK; - } else { - flags &= ~O_NONBLOCK; - } + if (set) + flags = r | O_NONBLOCK; + else + flags = r & ~O_NONBLOCK; - if (fcntl(fd, F_SETFL, flags) == -1) { - return -1; - } + do + r = fcntl(fd, F_SETFL, flags); + while (r == -1 && errno == EINTR); - return 0; + return r; #endif }