diff options
Diffstat (limited to 'support/nfs')
-rw-r--r-- | support/nfs/svc_socket.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/support/nfs/svc_socket.c b/support/nfs/svc_socket.c index a3cb7ce..888c915 100644 --- a/support/nfs/svc_socket.c +++ b/support/nfs/svc_socket.c @@ -22,6 +22,7 @@ #include <netdb.h> #include <rpc/rpc.h> #include <sys/socket.h> +#include <sys/fcntl.h> #include <errno.h> #ifdef _LIBC @@ -112,6 +113,26 @@ svc_socket (u_long number, int type, int protocol, int reuse) } } + if (sock >= 0 && protocol == IPPROTO_TCP) + { + /* Make the TCP rendezvous socket non-block to avoid + * problems with blocking in accept() after a spurious + * wakeup from the kernel */ + int flags; + if ((flags = fcntl(sock, F_GETFL)) < 0) + { + perror (_("svc_socket: can't get socket flags")); + (void) __close (sock); + sock = -1; + } + else if (fcntl(sock, F_SETFL, flags|O_NONBLOCK) < 0) + { + perror (_("svc_socket: can't set socket flags")); + (void) __close (sock); + sock = -1; + } + } + return sock; } |