API Change: Pass sockaddr_in by value instead of reference

This commit is contained in:
Ryan Dahl 2011-06-01 20:43:40 -07:00
parent 11a4ad50c8
commit 6b07791598
12 changed files with 50 additions and 56 deletions

View File

@ -189,8 +189,8 @@ static void pinger_new() {
uv_req_init(&pinger->connect_req, (uv_handle_t*)&pinger->tcp, uv_req_init(&pinger->connect_req, (uv_handle_t*)&pinger->tcp,
pinger_connect_cb); pinger_connect_cb);
uv_bind(&pinger->tcp, (struct sockaddr*)&client_addr); uv_bind(&pinger->tcp, client_addr);
r = uv_connect(&pinger->connect_req, (struct sockaddr*)&server_addr); r = uv_connect(&pinger->connect_req, server_addr);
ASSERT(!r); ASSERT(!r);
} }

View File

@ -244,7 +244,7 @@ static void maybe_connect_some() {
req = req_alloc(); req = req_alloc();
uv_req_init(req, (uv_handle_t*)tcp, connect_cb); 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); ASSERT(r == 0);
} }
} }
@ -351,7 +351,7 @@ HELPER_IMPL(pump_server) {
/* Server */ /* Server */
r = uv_tcp_init(&server, NULL, NULL); r = uv_tcp_init(&server, NULL, NULL);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(&server, (struct sockaddr*) &listen_addr); r = uv_bind(&server, listen_addr);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_listen(&server, MAX_WRITE_HANDLES, accept_cb); r = uv_listen(&server, MAX_WRITE_HANDLES, accept_cb);
ASSERT(r == 0); ASSERT(r == 0);

View File

@ -146,7 +146,7 @@ static int echo_start(int port) {
return 1; return 1;
} }
r = uv_bind(&server, (struct sockaddr*) &addr); r = uv_bind(&server, addr);
if (r) { if (r) {
/* TODO: Error codes */ /* TODO: Error codes */
fprintf(stderr, "Bind error\n"); fprintf(stderr, "Bind error\n");

View File

@ -52,12 +52,12 @@ TEST_IMPL(bind_error_addrinuse) {
r = uv_tcp_init(&server1, close_cb, NULL); r = uv_tcp_init(&server1, close_cb, NULL);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(&server1, (struct sockaddr*) &addr); r = uv_bind(&server1, addr);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_tcp_init(&server2, close_cb, NULL); r = uv_tcp_init(&server2, close_cb, NULL);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(&server2, (struct sockaddr*) &addr); r = uv_bind(&server2, addr);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_listen(&server1, 128, NULL); r = uv_listen(&server1, 128, NULL);
@ -87,7 +87,7 @@ TEST_IMPL(bind_error_addrnotavail_1) {
r = uv_tcp_init(&server, close_cb, NULL); r = uv_tcp_init(&server, close_cb, NULL);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(&server, (struct sockaddr*) &addr); r = uv_bind(&server, addr);
/* It seems that Linux is broken here - bind succeeds. */ /* It seems that Linux is broken here - bind succeeds. */
if (r == -1) { if (r == -1) {
@ -113,7 +113,7 @@ TEST_IMPL(bind_error_addrnotavail_2) {
r = uv_tcp_init(&server, close_cb, NULL); r = uv_tcp_init(&server, close_cb, NULL);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(&server, (struct sockaddr*) &addr); r = uv_bind(&server, addr);
ASSERT(r == -1); ASSERT(r == -1);
ASSERT(uv_last_error().code == UV_EADDRNOTAVAIL); ASSERT(uv_last_error().code == UV_EADDRNOTAVAIL);
@ -129,14 +129,17 @@ TEST_IMPL(bind_error_addrnotavail_2) {
TEST_IMPL(bind_error_fault) { TEST_IMPL(bind_error_fault) {
char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah";
struct sockaddr_in* garbage_addr;
uv_tcp_t server; uv_tcp_t server;
int r; int r;
garbage_addr = (struct sockaddr_in*) &garbage;
uv_init(alloc_cb); uv_init(alloc_cb);
r = uv_tcp_init(&server, close_cb, NULL); r = uv_tcp_init(&server, close_cb, NULL);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(&server, (struct sockaddr*) &garbage); r = uv_bind(&server, *garbage_addr);
ASSERT(r == -1); ASSERT(r == -1);
ASSERT(uv_last_error().code == UV_EFAULT); ASSERT(uv_last_error().code == UV_EFAULT);
@ -162,9 +165,9 @@ TEST_IMPL(bind_error_inval) {
r = uv_tcp_init(&server, close_cb, NULL); r = uv_tcp_init(&server, close_cb, NULL);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(&server, (struct sockaddr*) &addr1); r = uv_bind(&server, addr1);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(&server, (struct sockaddr*) &addr2); r = uv_bind(&server, addr2);
ASSERT(r == -1); ASSERT(r == -1);
ASSERT(uv_last_error().code == UV_EINVAL); ASSERT(uv_last_error().code == UV_EINVAL);

View File

@ -193,7 +193,7 @@ TEST_IMPL(callback_stack) {
nested++; nested++;
uv_req_init(&connect_req, (uv_handle_t*)&client, connect_cb); 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"); FATAL("uv_connect failed");
} }
nested--; nested--;

View File

@ -72,8 +72,8 @@ TEST_IMPL(connection_fail) {
/* so these handles can be pre-initialized. */ /* so these handles can be pre-initialized. */
uv_req_init(&req, (uv_handle_t*)&tcp, on_connect); uv_req_init(&req, (uv_handle_t*)&tcp, on_connect);
uv_bind(&tcp, (struct sockaddr*)&client_addr); uv_bind(&tcp, client_addr);
r = uv_connect(&req, (struct sockaddr*)&server_addr); r = uv_connect(&req, server_addr);
ASSERT(!r); ASSERT(!r);
uv_run(); uv_run();

View File

@ -101,7 +101,7 @@ static void start_server() {
r = uv_tcp_init(server, close_cb, NULL); r = uv_tcp_init(server, close_cb, NULL);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_bind(server, (struct sockaddr*) &addr); r = uv_bind(server, addr);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_listen(server, 128, accept_cb); r = uv_listen(server, 128, accept_cb);
@ -153,7 +153,7 @@ static void client_connect() {
ASSERT(r == 0); ASSERT(r == 0);
uv_req_init(connect_req, (uv_handle_t*)client, connect_cb); 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); ASSERT(r == 0);
} }

View File

@ -152,7 +152,7 @@ static void pinger_new() {
uv_req_init(&pinger->connect_req, (uv_handle_t*)(&pinger->tcp), uv_req_init(&pinger->connect_req, (uv_handle_t*)(&pinger->tcp),
pinger_on_connect); pinger_on_connect);
r = uv_connect(&pinger->connect_req, (struct sockaddr*)&server_addr); r = uv_connect(&pinger->connect_req, server_addr);
ASSERT(!r); ASSERT(!r);
} }

View File

@ -184,7 +184,7 @@ TEST_IMPL(tcp_writealot) {
ASSERT(r == 0); ASSERT(r == 0);
uv_req_init(connect_req, (uv_handle_t*)client, connect_cb); 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); ASSERT(r == 0);
uv_run(); uv_run();

View File

@ -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 uv_bind(uv_tcp_t* tcp, struct sockaddr_in addr) {
int addrsize; int addrsize = sizeof(struct sockaddr_in);
int domain; int domain = AF_INET;
int r; int r;
if (tcp->fd <= 0) { if (tcp->fd <= 0) {
int fd = socket(AF_INET, SOCK_STREAM, 0); int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) { if (fd < 0) {
uv_err_new((uv_handle_t*)tcp, errno); uv_err_new((uv_handle_t*)tcp, errno);
return -1; return -1;
@ -264,18 +265,12 @@ int uv_bind(uv_tcp_t* tcp, struct sockaddr* addr) {
assert(tcp->fd >= 0); assert(tcp->fd >= 0);
if (addr->sa_family == AF_INET) { if (addr.sin_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 {
uv_err_new((uv_handle_t*)tcp, EFAULT); uv_err_new((uv_handle_t*)tcp, EFAULT);
return -1; return -1;
} }
r = bind(tcp->fd, addr, addrsize); r = bind(tcp->fd, (struct sockaddr*) &addr, addrsize);
tcp->delayed_error = 0; tcp->delayed_error = 0;
if (r) { 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; uv_tcp_t* tcp = (uv_tcp_t*)req->handle;
if (tcp->fd <= 0) { if (tcp->fd <= 0) {
int fd = socket(AF_INET, SOCK_STREAM, 0); int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) { if (fd < 0) {
uv_err_new((uv_handle_t*)tcp, errno); uv_err_new((uv_handle_t*)tcp, errno);
return -1; return -1;
@ -826,8 +822,9 @@ int uv_connect(uv_req_t* req, struct sockaddr* addr) {
tcp->connect_req = req; tcp->connect_req = req;
int addrsize = sizeof(struct sockaddr_in); 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; tcp->delayed_error = 0;
if (r != 0 && errno != EINPROGRESS) { if (r != 0 && errno != EINPROGRESS) {

View File

@ -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 uv_bind(uv_tcp_t* handle, struct sockaddr_in addr) {
int addrsize;
DWORD err; DWORD err;
int r;
int addrsize = sizeof(struct sockaddr_in);
if (addr->sa_family == AF_INET) { if (addr.sin_family != AF_INET) {
addrsize = sizeof(struct sockaddr_in);
} else if (addr->sa_family == AF_INET6) {
addrsize = sizeof(struct sockaddr_in6);
} else {
uv_set_sys_error(WSAEFAULT); uv_set_sys_error(WSAEFAULT);
return -1; return -1;
} }
if (bind(handle->socket, addr, addrsize) == SOCKET_ERROR) { r = bind(handle->socket, (struct sockaddr*) &addr, addrsize);
if (r == SOCKET_ERROR) {
err = WSAGetLastError(); err = WSAGetLastError();
if (err == WSAEADDRINUSE) { if (err == WSAEADDRINUSE) {
/* Some errors are not to be reported until connect() or listen() */ /* 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 uv_connect(uv_req_t* req, struct sockaddr_in addr) {
int addrsize; int addrsize = sizeof(struct sockaddr_in);
BOOL success; BOOL success;
DWORD bytes; DWORD bytes;
uv_tcp_t* handle = (uv_tcp_t*)req->handle; 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; return -1;
} }
if (addr->sa_family == AF_INET) { if (addr.sin_family != AF_INET) {
addrsize = sizeof(struct sockaddr_in); uv_set_sys_error(WSAEFAULT);
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);
return -1; 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)); memset(&req->overlapped, 0, sizeof(req->overlapped));
req->type = UV_CONNECT; req->type = UV_CONNECT;
success = pConnectEx(handle->socket, success = pConnectEx(handle->socket,
addr, (struct sockaddr*)&addr,
addrsize, addrsize,
NULL, NULL,
0, 0,

4
uv.h
View File

@ -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_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); int uv_shutdown(uv_req_t* req);