diff --git a/include/uv.h b/include/uv.h index fcef08bb..a9d16b8a 100644 --- a/include/uv.h +++ b/include/uv.h @@ -766,8 +766,11 @@ UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, */ UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); -UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr_in* addr); -UV_EXTERN int uv_tcp_bind6(uv_tcp_t* handle, const struct sockaddr_in6* addr); +/* + * Bind the handle to an address and port. `addr` should point to an + * initialized struct sockaddr_in or struct sockaddr_in6. + */ +UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr); UV_EXTERN int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name, int* namelen); diff --git a/src/uv-common.c b/src/uv-common.c index 5ec085e2..c084594b 100644 --- a/src/uv-common.c +++ b/src/uv-common.c @@ -191,19 +191,20 @@ int uv_ip6_name(struct sockaddr_in6* src, char* dst, size_t size) { } -int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr_in* addr) { - if (handle->type == UV_TCP && addr->sin_family == AF_INET) - return uv__tcp_bind(handle, (const struct sockaddr*) addr, sizeof(*addr)); +int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr) { + unsigned int addrlen; + + if (handle->type != UV_TCP) + return UV_EINVAL; + + if (addr->sa_family == AF_INET) + addrlen = sizeof(struct sockaddr_in); + else if (addr->sa_family == AF_INET6) + addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; -} - -int uv_tcp_bind6(uv_tcp_t* handle, const struct sockaddr_in6* addr) { - if (handle->type == UV_TCP && addr->sin6_family == AF_INET6) - return uv__tcp_bind(handle, (const struct sockaddr*) addr, sizeof(*addr)); - else - return UV_EINVAL; + return uv__tcp_bind(handle, addr, addrlen); } diff --git a/test/benchmark-multi-accept.c b/test/benchmark-multi-accept.c index 81614bc5..871b11aa 100644 --- a/test/benchmark-multi-accept.c +++ b/test/benchmark-multi-accept.c @@ -209,7 +209,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, &listen_addr)); + ASSERT(0 == uv_tcp_bind((uv_tcp_t*) &ctx.server_handle, + (const struct sockaddr*) &listen_addr)); } else ASSERT(0); diff --git a/test/benchmark-ping-pongs.c b/test/benchmark-ping-pongs.c index c5c11fee..fa475b62 100644 --- a/test/benchmark-ping-pongs.c +++ b/test/benchmark-ping-pongs.c @@ -191,7 +191,7 @@ static void pinger_new(void) { pinger->tcp.data = pinger; - uv_tcp_bind(&pinger->tcp, &client_addr); + ASSERT(0 == uv_tcp_bind(&pinger->tcp, (const struct sockaddr*) &client_addr)); r = uv_tcp_connect(&pinger->connect_req, &pinger->tcp, diff --git a/test/benchmark-pump.c b/test/benchmark-pump.c index ac132cbf..af311857 100644 --- a/test/benchmark-pump.c +++ b/test/benchmark-pump.c @@ -366,7 +366,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, &listen_addr); + r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &listen_addr); 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 75f84563..cec35bd8 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, &addr); + r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr); 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 aabded55..8ffe4e7b 100644 --- a/test/dns-server.c +++ b/test/dns-server.c @@ -305,7 +305,7 @@ static int dns_start(int port) { return 1; } - r = uv_tcp_bind(&server, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); if (r) { /* TODO: Error codes */ fprintf(stderr, "Bind error\n"); diff --git a/test/echo-server.c b/test/echo-server.c index 69742019..a4c151b5 100644 --- a/test/echo-server.c +++ b/test/echo-server.c @@ -236,7 +236,7 @@ static int tcp4_echo_start(int port) { return 1; } - r = uv_tcp_bind(&tcpServer, &addr); + r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr); if (r) { /* TODO: Error codes */ fprintf(stderr, "Bind error\n"); @@ -271,7 +271,7 @@ static int tcp6_echo_start(int port) { } /* IPv6 is optional as not all platforms support it */ - r = uv_tcp_bind6(&tcpServer, &addr6); + r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr6); 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 80099306..ffed0ab5 100644 --- a/test/test-connection-fail.c +++ b/test/test-connection-fail.c @@ -101,7 +101,8 @@ 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. */ - uv_tcp_bind(&tcp, &client_addr); + ASSERT(0 == uv_tcp_bind(&tcp, (const struct sockaddr*) &client_addr)); + r = uv_tcp_connect(&req, &tcp, &server_addr, connect_cb); ASSERT(!r); diff --git a/test/test-delayed-accept.c b/test/test-delayed-accept.c index a7d31883..434f7a62 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, &addr); + r = uv_tcp_bind(server, (const struct sockaddr*) &addr); ASSERT(r == 0); r = uv_listen((uv_stream_t*)server, 128, connection_cb); diff --git a/test/test-getsockname.c b/test/test-getsockname.c index 87bb616d..ab7c26df 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, &addr); + r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr); 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 5119b317..cbd6a95f 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, &addr); + r = uv_tcp_bind(&ctx.send.tcp, (const struct sockaddr*) &addr); ASSERT(r == 0); r = run_test(); diff --git a/test/test-ipc.c b/test/test-ipc.c index 7085ea3c..97dfdbf3 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, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); 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, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); 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, &addr); + r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr); 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, &addr); + r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr); 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 c19ec71b..4853f4c4 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, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); 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 306372a7..0ceceded 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, &addr); + r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr); ASSERT(r == 0); r = uv_tcp_init(uv_default_loop(), &server2); ASSERT(r == 0); - r = uv_tcp_bind(&server2, &addr); + r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr); 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, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); 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, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); ASSERT(r == UV_EADDRNOTAVAIL); uv_close((uv_handle_t*)&server, close_cb); @@ -125,7 +125,7 @@ TEST_IMPL(tcp_bind_error_fault) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, garbage_addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); @@ -151,9 +151,9 @@ TEST_IMPL(tcp_bind_error_inval) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, &addr1); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1); ASSERT(r == 0); - r = uv_tcp_bind(&server, &addr2); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); @@ -176,7 +176,7 @@ TEST_IMPL(tcp_bind_localhost_ok) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind(&server, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); diff --git a/test/test-tcp-bind6-error.c b/test/test-tcp-bind6-error.c index e92afef7..7eb2f05b 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_bind6(&server1, &addr); + r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr); ASSERT(r == 0); r = uv_tcp_init(uv_default_loop(), &server2); ASSERT(r == 0); - r = uv_tcp_bind6(&server2, &addr); + r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr); 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_bind6(&server, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); ASSERT(r == UV_EADDRNOTAVAIL); uv_close((uv_handle_t*)&server, close_cb); @@ -101,7 +101,7 @@ TEST_IMPL(tcp_bind6_error_fault) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind6(&server, garbage_addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); @@ -127,9 +127,9 @@ TEST_IMPL(tcp_bind6_error_inval) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind6(&server, &addr1); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1); ASSERT(r == 0); - r = uv_tcp_bind6(&server, &addr2); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); @@ -152,7 +152,7 @@ TEST_IMPL(tcp_bind6_localhost_ok) { r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); - r = uv_tcp_bind6(&server, &addr); + r = uv_tcp_bind(&server, (const struct sockaddr*) &addr); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); diff --git a/test/test-tcp-close.c b/test/test-tcp-close.c index 183e9af0..41712461 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, &addr); + r = uv_tcp_bind(handle, (const struct sockaddr*) &addr); ASSERT(r == 0); r = uv_listen((uv_stream_t*)handle, 128, connection_cb); diff --git a/test/test-tcp-unexpected-read.c b/test/test-tcp-unexpected-read.c index 14fd6826..a1cc3277 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, &addr)); + ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr)); ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 1, connection_cb)); ASSERT(0 == uv_tcp_connect(&connect_req, &client_handle, &addr, connect_cb)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); diff --git a/test/test-tcp-write-to-half-open-connection.c b/test/test-tcp-write-to-half-open-connection.c index b33deee6..ef135a50 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, &addr); + r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 1, connection_cb);