Skip to content
This repository has been archived by the owner on May 4, 2018. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
unix,win: Start unifying shared bind code.
  • Loading branch information
erickt authored and ry committed Oct 4, 2011
1 parent 85368e8 commit 4c32906
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 104 deletions.
38 changes: 14 additions & 24 deletions src/unix/tcp.c
Expand Up @@ -33,10 +33,10 @@ int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* tcp) {
}


static int uv__tcp_bind(uv_tcp_t* tcp,
int domain,
struct sockaddr* addr,
int addrsize) {
static int uv__bind(uv_tcp_t* tcp,
int domain,
struct sockaddr* addr,
int addrsize) {
int saved_errno;
int status;

Expand Down Expand Up @@ -76,29 +76,19 @@ static int uv__tcp_bind(uv_tcp_t* tcp,
}


int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) {
if (handle->type != UV_TCP || addr.sin_family != AF_INET) {
uv__set_sys_error(handle->loop, EFAULT);
return -1;
}

return uv__tcp_bind(handle,
AF_INET,
(struct sockaddr*)&addr,
sizeof(struct sockaddr_in));
int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) {
return uv__bind(handle,
AF_INET,
(struct sockaddr*)&addr,
sizeof(struct sockaddr_in));
}


int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) {
if (handle->type != UV_TCP || addr.sin6_family != AF_INET6) {
uv__set_sys_error(handle->loop, EFAULT);
return -1;
}

return uv__tcp_bind(handle,
AF_INET6,
(struct sockaddr*)&addr,
sizeof(struct sockaddr_in6));
int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) {
return uv__bind(handle,
AF_INET6,
(struct sockaddr*)&addr,
sizeof(struct sockaddr_in6));
}


Expand Down
48 changes: 18 additions & 30 deletions src/unix/udp.c
Expand Up @@ -34,8 +34,6 @@ static void uv__udp_run_pending(uv_udp_t* handle);
static void uv__udp_recvmsg(uv_udp_t* handle);
static void uv__udp_sendmsg(uv_udp_t* handle);
static void uv__udp_io(EV_P_ ev_io* w, int events);
static int uv__udp_bind(uv_udp_t* handle, int domain, struct sockaddr* addr,
socklen_t len, unsigned flags);
static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain);
static int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, uv_buf_t bufs[],
int bufcnt, struct sockaddr* addr, socklen_t addrlen, uv_udp_send_cb send_cb);
Expand Down Expand Up @@ -289,11 +287,11 @@ static void uv__udp_io(EV_P_ ev_io* w, int events) {
}


static int uv__udp_bind(uv_udp_t* handle,
int domain,
struct sockaddr* addr,
socklen_t len,
unsigned flags) {
static int uv__bind(uv_udp_t* handle,
int domain,
struct sockaddr* addr,
socklen_t len,
unsigned flags) {
int saved_errno;
int status;
int yes;
Expand Down Expand Up @@ -389,7 +387,7 @@ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain) {
abort();
}

return uv__udp_bind(handle, domain, (struct sockaddr*)&taddr, addrlen, 0);
return uv__bind(handle, domain, (struct sockaddr*)&taddr, addrlen, 0);
}


Expand Down Expand Up @@ -443,31 +441,21 @@ int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) {
}


int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags) {
if (handle->type != UV_UDP || addr.sin_family != AF_INET) {
uv__set_sys_error(handle->loop, EFAULT);
return -1;
}

return uv__udp_bind(handle,
AF_INET,
(struct sockaddr*)&addr,
sizeof addr,
flags);
int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags) {
return uv__bind(handle,
AF_INET,
(struct sockaddr*)&addr,
sizeof addr,
flags);
}


int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) {
if (handle->type != UV_UDP || addr.sin6_family != AF_INET6) {
uv__set_sys_error(handle->loop, EFAULT);
return -1;
}

return uv__udp_bind(handle,
AF_INET6,
(struct sockaddr*)&addr,
sizeof addr,
flags);
int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) {
return uv__bind(handle,
AF_INET6,
(struct sockaddr*)&addr,
sizeof addr,
flags);
}


Expand Down
38 changes: 38 additions & 0 deletions src/uv-common.c
Expand Up @@ -207,6 +207,44 @@ int uv_ares_handles_empty(uv_loop_t* loop) {
return loop->uv_ares_handles_ ? 0 : 1;
}

int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) {
if (handle->type != UV_TCP || addr.sin_family != AF_INET) {
uv__set_artificial_error(handle->loop, UV_EFAULT);
return -1;
}

return uv__tcp_bind(handle, addr);
}

int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) {
if (handle->type != UV_TCP || addr.sin6_family != AF_INET6) {
uv__set_artificial_error(handle->loop, UV_EFAULT);
return -1;
}

return uv__tcp_bind6(handle, addr);
}

int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr,
unsigned int flags) {
if (handle->type != UV_UDP || addr.sin_family != AF_INET) {
uv__set_artificial_error(handle->loop, UV_EFAULT);
return -1;
}

return uv__udp_bind(handle, addr, flags);
}

int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr,
unsigned int flags) {
if (handle->type != UV_UDP || addr.sin6_family != AF_INET6) {
uv__set_artificial_error(handle->loop, UV_EFAULT);
return -1;
}

return uv__udp_bind6(handle, addr, flags);
}

int uv_tcp_connect(uv_connect_t* req,
uv_tcp_t* handle,
struct sockaddr_in address,
Expand Down
6 changes: 6 additions & 0 deletions src/uv-common.h
Expand Up @@ -53,6 +53,12 @@ void uv__set_error(uv_loop_t* loop, uv_err_code code, int sys_error);
void uv__set_sys_error(uv_loop_t* loop, int sys_error);
void uv__set_artificial_error(uv_loop_t* loop, uv_err_code code);

int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr);
int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr);

int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags);
int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags);

int uv__tcp_connect(uv_connect_t* req,
uv_tcp_t* handle,
struct sockaddr_in address,
Expand Down
38 changes: 12 additions & 26 deletions src/win/tcp.c
Expand Up @@ -154,20 +154,22 @@ void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) {
}


static int uv__bind(uv_loop_t* loop, uv_tcp_t* handle, int domain,
struct sockaddr* addr, int addrsize) {
static int uv__bind(uv_tcp_t* handle,
int domain,
struct sockaddr* addr,
int addrsize) {
DWORD err;
int r;
SOCKET sock;

if (handle->socket == INVALID_SOCKET) {
sock = socket(domain, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
uv__set_sys_error(loop, WSAGetLastError());
uv__set_sys_error(handle->loop, WSAGetLastError());
return -1;
}

if (uv_tcp_set_socket(loop, handle, sock) == -1) {
if (uv_tcp_set_socket(handle->loop, handle, sock) == -1) {
closesocket(sock);
return -1;
}
Expand All @@ -182,7 +184,7 @@ static int uv__bind(uv_loop_t* loop, uv_tcp_t* handle, int domain,
handle->bind_error = err;
handle->flags |= UV_HANDLE_BIND_ERROR;
} else {
uv__set_sys_error(loop, err);
uv__set_sys_error(handle->loop, err);
return -1;
}
}
Expand All @@ -193,40 +195,24 @@ static int uv__bind(uv_loop_t* loop, uv_tcp_t* handle, int domain,
}


int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) {
uv_loop_t* loop = handle->loop;

if (handle->type != UV_TCP || addr.sin_family != AF_INET) {
uv__set_sys_error(loop, WSAEFAULT);
return -1;
}

return uv__bind(loop,
handle,
int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) {
return uv__bind(handle,
AF_INET,
(struct sockaddr*)&addr,
sizeof(struct sockaddr_in));
}


int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) {
uv_loop_t* loop = handle->loop;

if (handle->type != UV_TCP || addr.sin6_family != AF_INET6) {
uv__set_sys_error(loop, WSAEFAULT);
return -1;
}

int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) {
if (uv_allow_ipv6) {
handle->flags |= UV_HANDLE_IPV6;
return uv__bind(loop,
handle,
return uv__bind(handle,
AF_INET6,
(struct sockaddr*)&addr,
sizeof(struct sockaddr_in6));

} else {
uv__set_sys_error(loop, WSAEAFNOSUPPORT);
uv__set_sys_error(handle->loop, WSAEAFNOSUPPORT);
return -1;
}
}
Expand Down
36 changes: 12 additions & 24 deletions src/win/udp.c
Expand Up @@ -139,27 +139,29 @@ void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle) {
}


static int uv__bind(uv_udp_t* handle, int domain, struct sockaddr* addr,
int addrsize, unsigned int flags) {
uv_loop_t* loop = handle->loop;
static int uv__bind(uv_udp_t* handle,
int domain,
struct sockaddr* addr,
int addrsize,
unsigned int flags) {
DWORD err;
int r;
SOCKET sock;

if ((flags & UV_UDP_IPV6ONLY) && domain != AF_INET6) {
/* UV_UDP_IPV6ONLY is supported only for IPV6 sockets */
uv__set_artificial_error(loop, UV_EINVAL);
uv__set_artificial_error(handle->loop, UV_EINVAL);
return -1;
}

if (handle->socket == INVALID_SOCKET) {
sock = socket(domain, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET) {
uv__set_sys_error(loop, WSAGetLastError());
uv__set_sys_error(handle->loop, WSAGetLastError());
return -1;
}

if (uv_udp_set_socket(loop, handle, sock) == -1) {
if (uv_udp_set_socket(handle->loop, handle, sock) == -1) {
closesocket(sock);
return -1;
}
Expand All @@ -184,7 +186,7 @@ static int uv__bind(uv_udp_t* handle, int domain, struct sockaddr* addr,

if (r == SOCKET_ERROR) {
err = WSAGetLastError();
uv__set_sys_error(loop, WSAGetLastError());
uv__set_sys_error(handle->loop, WSAGetLastError());
return -1;
}

Expand All @@ -194,15 +196,8 @@ static int uv__bind(uv_udp_t* handle, int domain, struct sockaddr* addr,
}


int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr,
int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr,
unsigned int flags) {
uv_loop_t* loop = handle->loop;

if (handle->type != UV_UDP || addr.sin_family != AF_INET) {
uv__set_sys_error(loop, WSAEFAULT);
return -1;
}

return uv__bind(handle,
AF_INET,
(struct sockaddr*) &addr,
Expand All @@ -211,15 +206,8 @@ int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr,
}


int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr,
int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr,
unsigned int flags) {
uv_loop_t* loop = handle->loop;

if (handle->type != UV_UDP || addr.sin6_family != AF_INET6) {
uv__set_sys_error(loop, WSAEFAULT);
return -1;
}

if (uv_allow_ipv6) {
handle->flags |= UV_HANDLE_IPV6;
return uv__bind(handle,
Expand All @@ -228,7 +216,7 @@ int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr,
sizeof(struct sockaddr_in6),
flags);
} else {
uv__set_sys_error(loop, WSAEAFNOSUPPORT);
uv__set_sys_error(handle->loop, WSAEAFNOSUPPORT);
return -1;
}
}
Expand Down

0 comments on commit 4c32906

Please sign in to comment.