From 6b0779159812fd0ec710326bace6facf51eabcfb Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 1 Jun 2011 20:43:40 -0700 Subject: [PATCH] API Change: Pass sockaddr_in by value instead of reference --- test/benchmark-ping-pongs.c | 4 ++-- test/benchmark-pump.c | 4 ++-- test/echo-server.c | 2 +- test/test-bind-error.c | 17 ++++++++++------- test/test-callback-stack.c | 2 +- test/test-connection-fail.c | 4 ++-- test/test-delayed-accept.c | 4 ++-- test/test-ping-pong.c | 2 +- test/test-tcp-writealot.c | 2 +- uv-unix.c | 23 ++++++++++------------ uv-win.c | 38 ++++++++++++++++--------------------- uv.h | 4 ++-- 12 files changed, 50 insertions(+), 56 deletions(-) diff --git a/test/benchmark-ping-pongs.c b/test/benchmark-ping-pongs.c index 49019736..536be20e 100644 --- a/test/benchmark-ping-pongs.c +++ b/test/benchmark-ping-pongs.c @@ -189,8 +189,8 @@ static void pinger_new() { uv_req_init(&pinger->connect_req, (uv_handle_t*)&pinger->tcp, pinger_connect_cb); - uv_bind(&pinger->tcp, (struct sockaddr*)&client_addr); - r = uv_connect(&pinger->connect_req, (struct sockaddr*)&server_addr); + uv_bind(&pinger->tcp, client_addr); + r = uv_connect(&pinger->connect_req, server_addr); ASSERT(!r); } diff --git a/test/benchmark-pump.c b/test/benchmark-pump.c index 2249aa99..3c5b5c06 100644 --- a/test/benchmark-pump.c +++ b/test/benchmark-pump.c @@ -244,7 +244,7 @@ static void maybe_connect_some() { req = req_alloc(); uv_req_init(req, (uv_handle_t*)tcp, connect_cb); - r = uv_connect(req, (struct sockaddr*) &connect_addr); + r = uv_connect(req, connect_addr); ASSERT(r == 0); } } @@ -351,7 +351,7 @@ HELPER_IMPL(pump_server) { /* Server */ r = uv_tcp_init(&server, NULL, NULL); ASSERT(r == 0); - r = uv_bind(&server, (struct sockaddr*) &listen_addr); + r = uv_bind(&server, listen_addr); ASSERT(r == 0); r = uv_listen(&server, MAX_WRITE_HANDLES, accept_cb); ASSERT(r == 0); diff --git a/test/echo-server.c b/test/echo-server.c index 04ee796f..3605d865 100644 --- a/test/echo-server.c +++ b/test/echo-server.c @@ -146,7 +146,7 @@ static int echo_start(int port) { return 1; } - r = uv_bind(&server, (struct sockaddr*) &addr); + r = uv_bind(&server, addr); if (r) { /* TODO: Error codes */ fprintf(stderr, "Bind error\n"); diff --git a/test/test-bind-error.c b/test/test-bind-error.c index 102dea30..32e5a378 100644 --- a/test/test-bind-error.c +++ b/test/test-bind-error.c @@ -52,12 +52,12 @@ TEST_IMPL(bind_error_addrinuse) { r = uv_tcp_init(&server1, close_cb, NULL); ASSERT(r == 0); - r = uv_bind(&server1, (struct sockaddr*) &addr); + r = uv_bind(&server1, addr); ASSERT(r == 0); r = uv_tcp_init(&server2, close_cb, NULL); ASSERT(r == 0); - r = uv_bind(&server2, (struct sockaddr*) &addr); + r = uv_bind(&server2, addr); ASSERT(r == 0); r = uv_listen(&server1, 128, NULL); @@ -87,7 +87,7 @@ TEST_IMPL(bind_error_addrnotavail_1) { r = uv_tcp_init(&server, close_cb, NULL); ASSERT(r == 0); - r = uv_bind(&server, (struct sockaddr*) &addr); + r = uv_bind(&server, addr); /* It seems that Linux is broken here - bind succeeds. */ if (r == -1) { @@ -113,7 +113,7 @@ TEST_IMPL(bind_error_addrnotavail_2) { r = uv_tcp_init(&server, close_cb, NULL); ASSERT(r == 0); - r = uv_bind(&server, (struct sockaddr*) &addr); + r = uv_bind(&server, addr); ASSERT(r == -1); ASSERT(uv_last_error().code == UV_EADDRNOTAVAIL); @@ -129,14 +129,17 @@ TEST_IMPL(bind_error_addrnotavail_2) { TEST_IMPL(bind_error_fault) { char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; + struct sockaddr_in* garbage_addr; uv_tcp_t server; int r; + garbage_addr = (struct sockaddr_in*) &garbage; + uv_init(alloc_cb); r = uv_tcp_init(&server, close_cb, NULL); ASSERT(r == 0); - r = uv_bind(&server, (struct sockaddr*) &garbage); + r = uv_bind(&server, *garbage_addr); ASSERT(r == -1); ASSERT(uv_last_error().code == UV_EFAULT); @@ -162,9 +165,9 @@ TEST_IMPL(bind_error_inval) { r = uv_tcp_init(&server, close_cb, NULL); ASSERT(r == 0); - r = uv_bind(&server, (struct sockaddr*) &addr1); + r = uv_bind(&server, addr1); ASSERT(r == 0); - r = uv_bind(&server, (struct sockaddr*) &addr2); + r = uv_bind(&server, addr2); ASSERT(r == -1); ASSERT(uv_last_error().code == UV_EINVAL); diff --git a/test/test-callback-stack.c b/test/test-callback-stack.c index f04ed9f0..a8bcdb2f 100644 --- a/test/test-callback-stack.c +++ b/test/test-callback-stack.c @@ -193,7 +193,7 @@ TEST_IMPL(callback_stack) { nested++; uv_req_init(&connect_req, (uv_handle_t*)&client, connect_cb); - if (uv_connect(&connect_req, (struct sockaddr*) &addr)) { + if (uv_connect(&connect_req, addr)) { FATAL("uv_connect failed"); } nested--; diff --git a/test/test-connection-fail.c b/test/test-connection-fail.c index 46457257..03f048c6 100644 --- a/test/test-connection-fail.c +++ b/test/test-connection-fail.c @@ -72,8 +72,8 @@ TEST_IMPL(connection_fail) { /* so these handles can be pre-initialized. */ uv_req_init(&req, (uv_handle_t*)&tcp, on_connect); - uv_bind(&tcp, (struct sockaddr*)&client_addr); - r = uv_connect(&req, (struct sockaddr*)&server_addr); + uv_bind(&tcp, client_addr); + r = uv_connect(&req, server_addr); ASSERT(!r); uv_run(); diff --git a/test/test-delayed-accept.c b/test/test-delayed-accept.c index 374a633a..f4f99d13 100644 --- a/test/test-delayed-accept.c +++ b/test/test-delayed-accept.c @@ -101,7 +101,7 @@ static void start_server() { r = uv_tcp_init(server, close_cb, NULL); ASSERT(r == 0); - r = uv_bind(server, (struct sockaddr*) &addr); + r = uv_bind(server, addr); ASSERT(r == 0); r = uv_listen(server, 128, accept_cb); @@ -153,7 +153,7 @@ static void client_connect() { ASSERT(r == 0); uv_req_init(connect_req, (uv_handle_t*)client, connect_cb); - r = uv_connect(connect_req, (struct sockaddr*)&addr); + r = uv_connect(connect_req, addr); ASSERT(r == 0); } diff --git a/test/test-ping-pong.c b/test/test-ping-pong.c index 3bd7d978..a94e658a 100644 --- a/test/test-ping-pong.c +++ b/test/test-ping-pong.c @@ -152,7 +152,7 @@ static void pinger_new() { uv_req_init(&pinger->connect_req, (uv_handle_t*)(&pinger->tcp), pinger_on_connect); - r = uv_connect(&pinger->connect_req, (struct sockaddr*)&server_addr); + r = uv_connect(&pinger->connect_req, server_addr); ASSERT(!r); } diff --git a/test/test-tcp-writealot.c b/test/test-tcp-writealot.c index ff88bc14..5755e4e8 100644 --- a/test/test-tcp-writealot.c +++ b/test/test-tcp-writealot.c @@ -184,7 +184,7 @@ TEST_IMPL(tcp_writealot) { ASSERT(r == 0); uv_req_init(connect_req, (uv_handle_t*)client, connect_cb); - r = uv_connect(connect_req, (struct sockaddr*)&addr); + r = uv_connect(connect_req, addr); ASSERT(r == 0); uv_run(); diff --git a/uv-unix.c b/uv-unix.c index 89caa84f..edea3046 100644 --- a/uv-unix.c +++ b/uv-unix.c @@ -244,13 +244,14 @@ int uv_tcp_init(uv_tcp_t* tcp, uv_close_cb close_cb, void* data) { } -int uv_bind(uv_tcp_t* tcp, struct sockaddr* addr) { - int addrsize; - int domain; +int uv_bind(uv_tcp_t* tcp, struct sockaddr_in addr) { + int addrsize = sizeof(struct sockaddr_in); + int domain = AF_INET; int r; if (tcp->fd <= 0) { int fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd < 0) { uv_err_new((uv_handle_t*)tcp, errno); return -1; @@ -264,18 +265,12 @@ int uv_bind(uv_tcp_t* tcp, struct sockaddr* addr) { assert(tcp->fd >= 0); - if (addr->sa_family == AF_INET) { - addrsize = sizeof(struct sockaddr_in); - domain = AF_INET; - } else if (addr->sa_family == AF_INET6) { - addrsize = sizeof(struct sockaddr_in6); - domain = AF_INET6; - } else { + if (addr.sin_family != AF_INET) { uv_err_new((uv_handle_t*)tcp, EFAULT); return -1; } - r = bind(tcp->fd, addr, addrsize); + r = bind(tcp->fd, (struct sockaddr*) &addr, addrsize); tcp->delayed_error = 0; if (r) { @@ -794,11 +789,12 @@ static void uv__tcp_connect(uv_tcp_t* tcp) { } -int uv_connect(uv_req_t* req, struct sockaddr* addr) { +int uv_connect(uv_req_t* req, struct sockaddr_in addr) { uv_tcp_t* tcp = (uv_tcp_t*)req->handle; if (tcp->fd <= 0) { int fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd < 0) { uv_err_new((uv_handle_t*)tcp, errno); return -1; @@ -826,8 +822,9 @@ int uv_connect(uv_req_t* req, struct sockaddr* addr) { tcp->connect_req = req; int addrsize = sizeof(struct sockaddr_in); + assert(addr.sin_family == AF_INET); - int r = connect(tcp->fd, addr, addrsize); + int r = connect(tcp->fd, (struct sockaddr*)&addr, addrsize); tcp->delayed_error = 0; if (r != 0 && errno != EINPROGRESS) { diff --git a/uv-win.c b/uv-win.c index fd3be778..fe988af9 100644 --- a/uv-win.c +++ b/uv-win.c @@ -697,20 +697,19 @@ struct sockaddr_in uv_ip4_addr(char* ip, int port) { } -int uv_bind(uv_tcp_t* handle, struct sockaddr* addr) { - int addrsize; +int uv_bind(uv_tcp_t* handle, struct sockaddr_in addr) { DWORD err; + int r; + int addrsize = sizeof(struct sockaddr_in); - if (addr->sa_family == AF_INET) { - addrsize = sizeof(struct sockaddr_in); - } else if (addr->sa_family == AF_INET6) { - addrsize = sizeof(struct sockaddr_in6); - } else { + if (addr.sin_family != AF_INET) { uv_set_sys_error(WSAEFAULT); return -1; } - if (bind(handle->socket, addr, addrsize) == SOCKET_ERROR) { + r = bind(handle->socket, (struct sockaddr*) &addr, addrsize); + + if (r == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) { /* Some errors are not to be reported until connect() or listen() */ @@ -902,8 +901,8 @@ int uv_read_stop(uv_tcp_t* handle) { } -int uv_connect(uv_req_t* req, struct sockaddr* addr) { - int addrsize; +int uv_connect(uv_req_t* req, struct sockaddr_in addr) { + int addrsize = sizeof(struct sockaddr_in); BOOL success; DWORD bytes; uv_tcp_t* handle = (uv_tcp_t*)req->handle; @@ -915,25 +914,20 @@ int uv_connect(uv_req_t* req, struct sockaddr* addr) { return -1; } - if (addr->sa_family == AF_INET) { - addrsize = sizeof(struct sockaddr_in); - if (!(handle->flags & UV_HANDLE_BOUND) && - uv_bind(handle, (struct sockaddr*)&uv_addr_ip4_any_) < 0) - return -1; - } else if (addr->sa_family == AF_INET6) { - addrsize = sizeof(struct sockaddr_in6); - assert(0); - return -1; - } else { - assert(0); + if (addr.sin_family != AF_INET) { + uv_set_sys_error(WSAEFAULT); return -1; } + if (!(handle->flags & UV_HANDLE_BOUND) && + uv_bind(handle, uv_addr_ip4_any_) < 0) + return -1; + memset(&req->overlapped, 0, sizeof(req->overlapped)); req->type = UV_CONNECT; success = pConnectEx(handle->socket, - addr, + (struct sockaddr*)&addr, addrsize, NULL, 0, diff --git a/uv.h b/uv.h index b52c29a8..78c4acc8 100644 --- a/uv.h +++ b/uv.h @@ -196,9 +196,9 @@ struct uv_tcp_s { int uv_tcp_init(uv_tcp_t* handle, uv_close_cb close_cb, void* data); -int uv_bind(uv_tcp_t* handle, struct sockaddr* addr); +int uv_bind(uv_tcp_t* handle, struct sockaddr_in); -int uv_connect(uv_req_t* req, struct sockaddr* addr); +int uv_connect(uv_req_t* req, struct sockaddr_in); int uv_shutdown(uv_req_t* req);