diff --git a/include/uv.h b/include/uv.h index 505b024b..4eeade74 100644 --- a/include/uv.h +++ b/include/uv.h @@ -783,6 +783,11 @@ UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, */ UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); +enum uv_tcp_flags { + /* Used with uv_tcp_bind, when an IPv6 address is used */ + UV_TCP_IPV6ONLY = 1 +}; + /* * Bind the handle to an address and port. `addr` should point to an * initialized struct sockaddr_in or struct sockaddr_in6. @@ -793,8 +798,9 @@ UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); * That is, a successful call to uv_tcp_bind() does not guarantee that * the call to uv_listen() or uv_tcp_connect() will succeed as well. */ -UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr); - +UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int flags); UV_EXTERN int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name, diff --git a/samples/socks5-proxy/server.c b/samples/socks5-proxy/server.c index 477469fa..3f1ba42c 100644 --- a/samples/socks5-proxy/server.c +++ b/samples/socks5-proxy/server.c @@ -155,7 +155,7 @@ static void do_bind(uv_getaddrinfo_t *req, int status, struct addrinfo *addrs) { CHECK(0 == uv_tcp_init(loop, &sx->tcp_handle)); what = "uv_tcp_bind"; - err = uv_tcp_bind(&sx->tcp_handle, &s.addr); + err = uv_tcp_bind(&sx->tcp_handle, &s.addr, 0); if (err == 0) { what = "uv_listen"; err = uv_listen((uv_stream_t *) &sx->tcp_handle, 128, on_connection); diff --git a/src/unix/tcp.c b/src/unix/tcp.c index e5f226c1..2c36dc3f 100644 --- a/src/unix/tcp.c +++ b/src/unix/tcp.c @@ -58,7 +58,8 @@ static int maybe_new_socket(uv_tcp_t* handle, int domain, int flags) { int uv__tcp_bind(uv_tcp_t* tcp, const struct sockaddr* addr, - unsigned int addrlen) { + unsigned int addrlen, + unsigned int flags) { int err; int on; @@ -72,6 +73,19 @@ int uv__tcp_bind(uv_tcp_t* tcp, 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(tcp->io_watcher.fd, + IPPROTO_IPV6, + IPV6_V6ONLY, + &on, + sizeof on) == -1) { + return -errno; + } + } +#endif + errno = 0; if (bind(tcp->io_watcher.fd, addr, addrlen) && errno != EADDRINUSE) return -errno; diff --git a/src/uv-common.c b/src/uv-common.c index c4cf3c7f..e5fc5077 100644 --- a/src/uv-common.c +++ b/src/uv-common.c @@ -152,7 +152,9 @@ int uv_ip6_name(struct sockaddr_in6* src, char* dst, size_t size) { } -int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr) { +int uv_tcp_bind(uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int flags) { unsigned int addrlen; if (handle->type != UV_TCP) @@ -165,7 +167,7 @@ int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr) { else return UV_EINVAL; - return uv__tcp_bind(handle, addr, addrlen); + return uv__tcp_bind(handle, addr, addrlen, flags); } diff --git a/src/uv-common.h b/src/uv-common.h index 6fcc212a..3bcdcef3 100644 --- a/src/uv-common.h +++ b/src/uv-common.h @@ -61,7 +61,8 @@ enum { int uv__tcp_bind(uv_tcp_t* tcp, const struct sockaddr* addr, - unsigned int addrlen); + unsigned int addrlen, + unsigned int flags); int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, diff --git a/src/win/tcp.c b/src/win/tcp.c index 5437e3df..8fa2146a 100644 --- a/src/win/tcp.c +++ b/src/win/tcp.c @@ -237,7 +237,8 @@ void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) { static int uv_tcp_try_bind(uv_tcp_t* handle, const struct sockaddr* addr, - unsigned int addrlen) { + unsigned int addrlen, + unsigned int flags) { DWORD err; int r; @@ -261,6 +262,19 @@ static int uv_tcp_try_bind(uv_tcp_t* handle, } } +#ifdef IPV6_V6ONLY + if (addr->sa_family == AF_INET6) { + int on; + + on = (flags & UV_TCP_IPV6ONLY) != 0; + + /* TODO: how to handle errors? This may fail if there is no ipv4 stack */ + /* available, or when run on XP/2003 which have no support for dualstack */ + /* sockets. For now we're silently ignoring the error. */ + setsockopt(handle->socket, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof on); + } +#endif + r = bind(handle->socket, addr, addrlen); if (r == SOCKET_ERROR) { @@ -500,7 +514,8 @@ int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) { if (!(handle->flags & UV_HANDLE_BOUND)) { err = uv_tcp_try_bind(handle, (const struct sockaddr*) &uv_addr_ip4_any_, - sizeof(uv_addr_ip4_any_)); + sizeof(uv_addr_ip4_any_), + 0); if (err) return err; } @@ -685,7 +700,7 @@ static int uv_tcp_try_connect(uv_connect_t* req, } else { abort(); } - err = uv_tcp_try_bind(handle, bind_addr, addrlen); + err = uv_tcp_try_bind(handle, bind_addr, addrlen, 0); if (err) return err; } @@ -1372,10 +1387,11 @@ int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) { */ int uv__tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, - unsigned int addrlen) { + unsigned int addrlen, + unsigned int flags) { int err; - err = uv_tcp_try_bind(handle, addr, addrlen); + err = uv_tcp_try_bind(handle, addr, addrlen, flags); if (err) return uv_translate_sys_error(err); diff --git a/test/benchmark-multi-accept.c b/test/benchmark-multi-accept.c index dbcba005..d71235ef 100644 --- a/test/benchmark-multi-accept.c +++ b/test/benchmark-multi-accept.c @@ -210,7 +210,8 @@ static void send_listen_handles(uv_handle_type type, if (type == UV_TCP) { ASSERT(0 == uv_tcp_init(loop, (uv_tcp_t*) &ctx.server_handle)); ASSERT(0 == uv_tcp_bind((uv_tcp_t*) &ctx.server_handle, - (const struct sockaddr*) &listen_addr)); + (const struct sockaddr*) &listen_addr, + 0)); } else ASSERT(0); diff --git a/test/benchmark-ping-pongs.c b/test/benchmark-ping-pongs.c index d93e561e..bb560d7d 100644 --- a/test/benchmark-ping-pongs.c +++ b/test/benchmark-ping-pongs.c @@ -193,7 +193,9 @@ static void pinger_new(void) { pinger->tcp.data = pinger; - ASSERT(0 == uv_tcp_bind(&pinger->tcp, (const struct sockaddr*) &client_addr)); + ASSERT(0 == uv_tcp_bind(&pinger->tcp, + (const struct sockaddr*) &client_addr, + 0)); r = uv_tcp_connect(&pinger->connect_req, &pinger->tcp, diff --git a/test/benchmark-pump.c b/test/benchmark-pump.c index b557cd4b..678634ff 100644 --- a/test/benchmark-pump.c +++ b/test/benchmark-pump.c @@ -379,7 +379,7 @@ HELPER_IMPL(tcp_pump_server) { server = (uv_stream_t*)&tcpServer; r = uv_tcp_init(loop, &tcpServer); ASSERT(r == 0); - r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &listen_addr); + r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &listen_addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcpServer, MAX_WRITE_HANDLES, connection_cb); ASSERT(r == 0); diff --git a/test/blackhole-server.c b/test/blackhole-server.c index cec35bd8..ad878b35 100644 --- a/test/blackhole-server.c +++ b/test/blackhole-server.c @@ -108,7 +108,7 @@ HELPER_IMPL(tcp4_blackhole_server) { r = uv_tcp_init(loop, &tcp_server); ASSERT(r == 0); - r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 128, connection_cb); diff --git a/test/dns-server.c b/test/dns-server.c index 8c701221..80052c70 100644 --- a/test/dns-server.c +++ b/test/dns-server.c @@ -311,7 +311,7 @@ static int dns_start(int port) { return 1; } - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); if (r) { /* TODO: Error codes */ fprintf(stderr, "Bind error\n"); diff --git a/test/echo-server.c b/test/echo-server.c index 193a168d..e5201b9f 100644 --- a/test/echo-server.c +++ b/test/echo-server.c @@ -229,7 +229,7 @@ static int tcp4_echo_start(int port) { return 1; } - r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr, 0); if (r) { /* TODO: Error codes */ fprintf(stderr, "Bind error\n"); @@ -264,7 +264,7 @@ static int tcp6_echo_start(int port) { } /* IPv6 is optional as not all platforms support it */ - r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr6); + r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr6, 0); if (r) { /* show message but return OK */ fprintf(stderr, "IPv6 not supported\n"); diff --git a/test/test-connection-fail.c b/test/test-connection-fail.c index 9b98c4d8..57001401 100644 --- a/test/test-connection-fail.c +++ b/test/test-connection-fail.c @@ -101,7 +101,7 @@ static void connection_fail(uv_connect_cb connect_cb) { /* We are never doing multiple reads/connects at a time anyway. */ /* so these handles can be pre-initialized. */ - ASSERT(0 == uv_tcp_bind(&tcp, (const struct sockaddr*) &client_addr)); + ASSERT(0 == uv_tcp_bind(&tcp, (const struct sockaddr*) &client_addr, 0)); r = uv_tcp_connect(&req, &tcp, diff --git a/test/test-delayed-accept.c b/test/test-delayed-accept.c index f210d5fc..b45100d6 100644 --- a/test/test-delayed-accept.c +++ b/test/test-delayed-accept.c @@ -108,7 +108,7 @@ static void start_server(void) { r = uv_tcp_init(uv_default_loop(), server); ASSERT(r == 0); - r = uv_tcp_bind(server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)server, 128, connection_cb); diff --git a/test/test-emfile.c b/test/test-emfile.c index 98b7da5b..453bfe4c 100644 --- a/test/test-emfile.c +++ b/test/test-emfile.c @@ -49,7 +49,7 @@ TEST_IMPL(emfile) { ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(loop, &server_handle)); ASSERT(0 == uv_tcp_init(loop, &client_handle)); - ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr)); + ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 8, connection_cb)); /* Lower the file descriptor limit and use up all fds save one. */ diff --git a/test/test-getsockname.c b/test/test-getsockname.c index dc6a949b..a67d967f 100644 --- a/test/test-getsockname.c +++ b/test/test-getsockname.c @@ -180,7 +180,7 @@ static int tcp_listener(void) { return 1; } - r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr, 0); if (r) { fprintf(stderr, "Bind error\n"); return 1; diff --git a/test/test-ipc-send-recv.c b/test/test-ipc-send-recv.c index 73013eba..b2b5aa0e 100644 --- a/test/test-ipc-send-recv.c +++ b/test/test-ipc-send-recv.c @@ -145,7 +145,7 @@ TEST_IMPL(ipc_send_recv_tcp) { r = uv_tcp_init(uv_default_loop(), &ctx.send.tcp); ASSERT(r == 0); - r = uv_tcp_bind(&ctx.send.tcp, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&ctx.send.tcp, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = run_test(); diff --git a/test/test-ipc.c b/test/test-ipc.c index 6826b041..cc44d32e 100644 --- a/test/test-ipc.c +++ b/test/test-ipc.c @@ -375,7 +375,7 @@ TEST_IMPL(listen_with_simultaneous_accepts) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_simultaneous_accepts(&server, 1); @@ -400,7 +400,7 @@ TEST_IMPL(listen_no_simultaneous_accepts) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_simultaneous_accepts(&server, 0); @@ -566,7 +566,7 @@ int ipc_helper(int listen_after_write) { r = uv_tcp_init(uv_default_loop(), &tcp_server); ASSERT(r == 0); - r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); if (!listen_after_write) { @@ -618,7 +618,7 @@ int ipc_helper_tcp_connection(void) { ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); - r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 12, ipc_on_connection_tcp_conn); diff --git a/test/test-multiple-listen.c b/test/test-multiple-listen.c index 3ce6233d..4ae5fa67 100644 --- a/test/test-multiple-listen.c +++ b/test/test-multiple-listen.c @@ -53,7 +53,7 @@ static void start_server(void) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server, 128, connection_cb); diff --git a/test/test-tcp-bind-error.c b/test/test-tcp-bind-error.c index 42c01062..96bfe116 100644 --- a/test/test-tcp-bind-error.c +++ b/test/test-tcp-bind-error.c @@ -42,12 +42,12 @@ TEST_IMPL(tcp_bind_error_addrinuse) { ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server1); ASSERT(r == 0); - r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_init(uv_default_loop(), &server2); ASSERT(r == 0); - r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server1, 128, NULL); @@ -78,7 +78,7 @@ TEST_IMPL(tcp_bind_error_addrnotavail_1) { ASSERT(r == 0); /* It seems that Linux is broken here - bind succeeds. */ - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0 || r == UV_EADDRNOTAVAIL); uv_close((uv_handle_t*)&server, close_cb); @@ -101,7 +101,7 @@ TEST_IMPL(tcp_bind_error_addrnotavail_2) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == UV_EADDRNOTAVAIL); uv_close((uv_handle_t*)&server, close_cb); @@ -126,7 +126,7 @@ TEST_IMPL(tcp_bind_error_fault) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr, 0); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); @@ -152,9 +152,9 @@ TEST_IMPL(tcp_bind_error_inval) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1, 0); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2, 0); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); @@ -177,7 +177,7 @@ TEST_IMPL(tcp_bind_localhost_ok) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); diff --git a/test/test-tcp-bind6-error.c b/test/test-tcp-bind6-error.c index 08772190..1d65f3de 100644 --- a/test/test-tcp-bind6-error.c +++ b/test/test-tcp-bind6-error.c @@ -43,12 +43,12 @@ TEST_IMPL(tcp_bind6_error_addrinuse) { r = uv_tcp_init(uv_default_loop(), &server1); ASSERT(r == 0); - r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_init(uv_default_loop(), &server2); ASSERT(r == 0); - r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server1, 128, NULL); @@ -77,7 +77,7 @@ TEST_IMPL(tcp_bind6_error_addrnotavail) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == UV_EADDRNOTAVAIL); uv_close((uv_handle_t*)&server, close_cb); @@ -102,7 +102,7 @@ TEST_IMPL(tcp_bind6_error_fault) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr, 0); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); @@ -128,9 +128,9 @@ TEST_IMPL(tcp_bind6_error_inval) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1, 0); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2, 0); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); @@ -153,7 +153,7 @@ TEST_IMPL(tcp_bind6_localhost_ok) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); diff --git a/test/test-tcp-close-accept.c b/test/test-tcp-close-accept.c index 471be53a..10f9d919 100644 --- a/test/test-tcp-close-accept.c +++ b/test/test-tcp-close-accept.c @@ -156,7 +156,7 @@ TEST_IMPL(tcp_close_accept) { ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(loop, &tcp_server)); - ASSERT(0 == uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr)); + ASSERT(0 == uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &tcp_server, ARRAY_SIZE(tcp_outgoing), connection_cb)); diff --git a/test/test-tcp-close.c b/test/test-tcp-close.c index 05af38c1..e65885aa 100644 --- a/test/test-tcp-close.c +++ b/test/test-tcp-close.c @@ -85,7 +85,7 @@ static void start_server(uv_loop_t* loop, uv_tcp_t* handle) { r = uv_tcp_init(loop, handle); ASSERT(r == 0); - r = uv_tcp_bind(handle, (const struct sockaddr*) &addr); + r = uv_tcp_bind(handle, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)handle, 128, connection_cb); diff --git a/test/test-tcp-try-write.c b/test/test-tcp-try-write.c index f4f4fb56..00341e41 100644 --- a/test/test-tcp-try-write.c +++ b/test/test-tcp-try-write.c @@ -110,7 +110,7 @@ static void start_server(void) { ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(uv_default_loop(), &server)); - ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) &addr)); + ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &server, 128, connection_cb)); } diff --git a/test/test-tcp-unexpected-read.c b/test/test-tcp-unexpected-read.c index 3410cf08..11fee8ba 100644 --- a/test/test-tcp-unexpected-read.c +++ b/test/test-tcp-unexpected-read.c @@ -98,7 +98,7 @@ TEST_IMPL(tcp_unexpected_read) { ASSERT(0 == uv_tcp_init(loop, &server_handle)); ASSERT(0 == uv_tcp_init(loop, &client_handle)); ASSERT(0 == uv_tcp_init(loop, &peer_handle)); - ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr)); + ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 1, connection_cb)); ASSERT(0 == uv_tcp_connect(&connect_req, &client_handle, diff --git a/test/test-tcp-write-to-half-open-connection.c b/test/test-tcp-write-to-half-open-connection.c index 92cc7d96..2fa2ae72 100644 --- a/test/test-tcp-write-to-half-open-connection.c +++ b/test/test-tcp-write-to-half-open-connection.c @@ -115,7 +115,7 @@ TEST_IMPL(tcp_write_to_half_open_connection) { r = uv_tcp_init(loop, &tcp_server); ASSERT(r == 0); - r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr); + r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 1, connection_cb);