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,
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);
}

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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--;

View File

@ -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();

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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();

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 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) {

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 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,

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_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);