From ebc50aee1da389cb0ef1f3cf8073e69bf13be6ff Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 29 Dec 2014 04:25:16 +0100 Subject: [PATCH] Revert "unix: only set SO_REUSEADDR when bind() fails" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a9e95a33bc723dc42daea2fcde6dde1d4cc5efad. This seems to cause regressions in the test suite when IPv6 is disabled. As optimizations go, it's a very minor one so let's not spend too much effort trying to track down the cause of the regressions but revert the change before it makes its way into a release. PR-URL: https://github.com/libuv/libuv/pull/92 Reviewed-By: Saúl Ibarra Corretgé --- src/unix/tcp.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/unix/tcp.c b/src/unix/tcp.c index e1803236..8c19c1ab 100644 --- a/src/unix/tcp.c +++ b/src/unix/tcp.c @@ -62,7 +62,6 @@ int uv__tcp_bind(uv_tcp_t* tcp, unsigned int flags) { int err; int on; - int fd; /* Cannot set IPv6-only mode on non-IPv6 socket. */ if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6) @@ -74,29 +73,26 @@ int uv__tcp_bind(uv_tcp_t* tcp, if (err) return err; - fd = tcp->io_watcher.fd; + on = 1; + if (setsockopt(tcp->io_watcher.fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) + return -errno; #ifdef IPV6_V6ONLY if (addr->sa_family == AF_INET6) { on = (flags & UV_TCP_IPV6ONLY) != 0; - if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on))) + if (setsockopt(tcp->io_watcher.fd, + IPPROTO_IPV6, + IPV6_V6ONLY, + &on, + sizeof on) == -1) { return -errno; + } } #endif - if (bind(fd, addr, addrlen)) { - if (errno != EADDRINUSE) - return -errno; - - on = 1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) - return -errno; - - errno = 0; - if (bind(fd, addr, addrlen) && errno != EADDRINUSE) - return -errno; - } - + errno = 0; + if (bind(tcp->io_watcher.fd, addr, addrlen) && errno != EADDRINUSE) + return -errno; tcp->delayed_error = -errno; if (addr->sa_family == AF_INET6)