diff --git a/src/win/handle.c b/src/win/handle.c index 2a1d5974..138c2008 100644 --- a/src/win/handle.c +++ b/src/win/handle.c @@ -39,6 +39,21 @@ int uv_is_active(uv_handle_t* handle) { } +int uv_getsockname(uv_handle_t* handle, struct sockaddr* name, int* namelen) { + switch (handle->type) { + case UV_TCP: + return uv_tcp_getsockname((uv_tcp_t*) handle, name, namelen); + + case UV_UDP: + return uv_tcp_getsockname((uv_tcp_t*) handle, name, namelen); + + default: + uv_set_sys_error(WSAENOTSOCK); + return -1; + } +} + + void uv_close(uv_handle_t* handle, uv_close_cb cb) { uv_tcp_t* tcp; uv_pipe_t* pipe; diff --git a/src/win/internal.h b/src/win/internal.h index 97f30f16..ab203caa 100644 --- a/src/win/internal.h +++ b/src/win/internal.h @@ -168,6 +168,7 @@ int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb); int uv_tcp_write(uv_write_t* req, uv_tcp_t* handle, uv_buf_t bufs[], int bufcnt, uv_write_cb cb); +int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name, int* namelen); void uv_process_tcp_read_req(uv_tcp_t* handle, uv_req_t* req); void uv_process_tcp_write_req(uv_tcp_t* handle, uv_write_t* req); @@ -180,11 +181,13 @@ void uv_tcp_endgame(uv_tcp_t* handle); /* * UDP */ -void uv_udp_endgame(uv_udp_t* handle); +int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name, int* namelen); void uv_process_udp_recv_req(uv_udp_t* handle, uv_req_t* req); void uv_process_udp_send_req(uv_udp_t* handle, uv_udp_send_t* req); +void uv_udp_endgame(uv_udp_t* handle); + /* * Pipes diff --git a/src/win/tcp.c b/src/win/tcp.c index 45b8a1e8..8574067a 100644 --- a/src/win/tcp.c +++ b/src/win/tcp.c @@ -548,7 +548,7 @@ int uv_tcp_connect6(uv_connect_t* req, uv_tcp_t* handle, } -int uv_getsockname(uv_handle_t* handle, struct sockaddr* name, int* namelen) { +int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name, int* namelen) { int result; if (handle->flags & UV_HANDLE_SHUTTING) { diff --git a/src/win/udp.c b/src/win/udp.c index 0428f97b..4c1a968a 100644 --- a/src/win/udp.c +++ b/src/win/udp.c @@ -200,6 +200,24 @@ int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned int flags) } +int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name, int* namelen) { + int result; + + if (handle->flags & UV_HANDLE_SHUTTING) { + uv_set_sys_error(WSAESHUTDOWN); + return -1; + } + + result = getsockname(handle->socket, name, namelen); + if (result != 0) { + uv_set_sys_error(WSAGetLastError()); + return -1; + } + + return 0; +} + + static void uv_udp_queue_recv(uv_udp_t* handle) { uv_req_t* req; uv_buf_t buf;