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

Commit

Permalink
Specialize uv_xxx_getsockname, add uv_tcp_getpeername
Browse files Browse the repository at this point in the history
  • Loading branch information
piscisaureus committed Sep 4, 2011
1 parent 18af137 commit 12b01e9
Show file tree
Hide file tree
Showing 11 changed files with 194 additions and 119 deletions.
6 changes: 3 additions & 3 deletions include/uv.h
Expand Up @@ -415,6 +415,8 @@ int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle);

int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in);
int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6);
int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name, int* namelen);
int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name, int* namelen);

/*
* uv_tcp_connect, uv_tcp_connect6
Expand All @@ -436,9 +438,6 @@ struct uv_connect_s {
};


int uv_getsockname(uv_handle_t* handle, struct sockaddr* name, int* namelen);


/*
* UDP support.
*/
Expand Down Expand Up @@ -521,6 +520,7 @@ int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags);
* 0 on success, -1 on error.
*/
int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags);
int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name, int* namelen);

/*
* Send data. If the socket has not previously been bound with `uv_udp_bind`
Expand Down
21 changes: 0 additions & 21 deletions src/unix/core.c
Expand Up @@ -300,27 +300,6 @@ void uv__next(EV_P_ ev_idle* watcher, int revents) {
}


int uv_getsockname(uv_handle_t* handle, struct sockaddr* name, int* namelen) {
socklen_t socklen;
int saved_errno;

/* Don't clobber errno. */
saved_errno = errno;

/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t)*namelen;

if (getsockname(handle->fd, name, &socklen) == -1) {
uv_err_new(handle->loop, errno);
} else {
*namelen = (int)socklen;
}

errno = saved_errno;
return 0;
}


void uv_ref(uv_loop_t* loop) {
ev_ref(loop->ev);
}
Expand Down
1 change: 1 addition & 0 deletions src/unix/error.c
Expand Up @@ -80,6 +80,7 @@ static uv_err_code uv_translate_sys_error(int sys_errno) {
case ECONNREFUSED: return UV_ECONNREFUSED;
case EADDRINUSE: return UV_EADDRINUSE;
case EADDRNOTAVAIL: return UV_EADDRNOTAVAIL;
case ENOTCONN: return UV_ENOTCONN;
default: return UV_UNKNOWN;
}
}
Expand Down
48 changes: 48 additions & 0 deletions src/unix/tcp.c
Expand Up @@ -122,6 +122,54 @@ int uv_tcp_bind6(uv_tcp_t* tcp, struct sockaddr_in6 addr) {
}


int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name,
int* namelen) {
socklen_t socklen;
int saved_errno;
int rv = 0;

/* Don't clobber errno. */
saved_errno = errno;

/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t)*namelen;

if (getsockname(handle->fd, name, &socklen) == -1) {
uv_err_new(handle->loop, errno);
rv = -1;
} else {
*namelen = (int)socklen;
}

errno = saved_errno;
return rv;
}


int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name,
int* namelen) {
socklen_t socklen;
int saved_errno;
int rv = 0;

/* Don't clobber errno. */
saved_errno = errno;

/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t)*namelen;

if (getpeername(handle->fd, name, &socklen) == -1) {
uv_err_new(handle->loop, errno);
rv = -1;
} else {
*namelen = (int)socklen;
}

errno = saved_errno;
return rv;
}


int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) {
int r;

Expand Down
24 changes: 24 additions & 0 deletions src/unix/udp.c
Expand Up @@ -460,6 +460,30 @@ int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) {
}


int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name,
int* namelen) {
socklen_t socklen;
int saved_errno;
int rv = 0;

/* Don't clobber errno. */
saved_errno = errno;

/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t)*namelen;

if (getsockname(handle->fd, name, &socklen) == -1) {
uv_err_new(handle->loop, errno);
rv = -1;
} else {
*namelen = (int)socklen;
}

errno = saved_errno;
return rv;
}


int uv_udp_send(uv_udp_send_t* req,
uv_udp_t* handle,
uv_buf_t bufs[],
Expand Down
2 changes: 2 additions & 0 deletions src/win/error.c
Expand Up @@ -117,6 +117,8 @@ uv_err_code uv_translate_sys_error(int sys_errno) {
case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH;
case WSAENETUNREACH: return UV_ENETUNREACH;
case ERROR_OUTOFMEMORY: return UV_ENOMEM;
case ERROR_NOT_CONNECTED: return UV_ENOTCONN;
case WSAENOTCONN: return UV_ENOTCONN;
case ERROR_NOT_SUPPORTED: return UV_ENOTSUP;
case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL;
case ERROR_INVALID_FLAGS: return UV_EBADF;
Expand Down
17 changes: 0 additions & 17 deletions src/win/handle.c
Expand Up @@ -39,23 +39,6 @@ int uv_is_active(uv_handle_t* handle) {
}


int uv_getsockname(uv_handle_t* handle, struct sockaddr* name, int* namelen) {
uv_loop_t* loop = handle->loop;

switch (handle->type) {
case UV_TCP:
return uv_tcp_getsockname(loop, (uv_tcp_t*) handle, name, namelen);

case UV_UDP:
return uv_udp_getsockname(loop, (uv_udp_t*) handle, name, namelen);

default:
uv_set_sys_error(loop, WSAENOTSOCK);
return -1;
}
}


void uv_close(uv_handle_t* handle, uv_close_cb cb) {
uv_tcp_t* tcp;
uv_pipe_t* pipe;
Expand Down
5 changes: 0 additions & 5 deletions src/win/internal.h
Expand Up @@ -123,8 +123,6 @@ int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb,
uv_read_cb read_cb);
int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle,
uv_buf_t bufs[], int bufcnt, uv_write_cb cb);
int uv_tcp_getsockname(uv_loop_t* loop, uv_tcp_t* handle,
struct sockaddr* name, int* namelen);

void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req);
void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle,
Expand All @@ -140,9 +138,6 @@ void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle);
/*
* UDP
*/
int uv_udp_getsockname(uv_loop_t* loop, uv_udp_t* handle,
struct sockaddr* name, int* namelen);

void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req);
void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle,
uv_udp_send_t* req);
Expand Down
25 changes: 23 additions & 2 deletions src/win/tcp.c
Expand Up @@ -573,8 +573,9 @@ int uv_tcp_connect6(uv_connect_t* req, uv_tcp_t* handle,
}


int uv_tcp_getsockname(uv_loop_t* loop, uv_tcp_t* handle,
struct sockaddr* name, int* namelen) {
int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name,
int* namelen) {
uv_loop_t* loop = handle->loop;
int result;

if (handle->flags & UV_HANDLE_SHUTTING) {
Expand All @@ -592,6 +593,26 @@ int uv_tcp_getsockname(uv_loop_t* loop, uv_tcp_t* handle,
}


int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name,
int* namelen) {
uv_loop_t* loop = handle->loop;
int result;

if (handle->flags & UV_HANDLE_SHUTTING) {
uv_set_sys_error(loop, WSAESHUTDOWN);
return -1;
}

result = getpeername(handle->socket, name, namelen);
if (result != 0) {
uv_set_sys_error(loop, WSAGetLastError());
return -1;
}

return 0;
}


int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle,
uv_buf_t bufs[], int bufcnt, uv_write_cb cb) {
int result;
Expand Down
5 changes: 3 additions & 2 deletions src/win/udp.c
Expand Up @@ -40,8 +40,9 @@ static char uv_zero_[] = "";
static unsigned int active_udp_streams = 0;


int uv_udp_getsockname(uv_loop_t* loop, uv_udp_t* handle,
struct sockaddr* name, int* namelen) {
int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name,
int* namelen) {
uv_loop_t* loop = handle->loop;
int result;

result = getsockname(handle->socket, name, namelen);
Expand Down

0 comments on commit 12b01e9

Please sign in to comment.