From 1870c18f3c741fddae9ec3363e67f62ff0af804d Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Wed, 24 Aug 2011 04:40:14 +0200 Subject: [PATCH] win: change uv_getsockname signature to support udp --- src/win/handle.c | 15 +++++++++++++++ src/win/internal.h | 5 ++++- src/win/tcp.c | 2 +- src/win/udp.c | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/win/handle.c b/src/win/handle.c index 2a1d597454..138c200855 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 97f30f16be..ab203caa09 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 45b8a1e80f..8574067a2e 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 0428f97bfb..4c1a968a9b 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;