From 6b1cca397504287ed1b1f915c5bfd434e89f3cd6 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Sat, 26 Jan 2013 05:08:48 +0100 Subject: [PATCH] win/udp: make uv_udp_set_socket set UV_HANDLE_IPV6 This patch makes uv_udp_set_socket responsible for setting the UV_HANDLE_IPV6 flag. In addition, this patch fixes some minor style issues. --- src/win/udp.c | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/win/udp.c b/src/win/udp.c index 3f19fe30..f760dc01 100644 --- a/src/win/udp.c +++ b/src/win/udp.c @@ -56,8 +56,8 @@ int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name, } -static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, - SOCKET socket) { +static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, SOCKET socket, + int family) { DWORD yes = 1; WSAPROTOCOL_INFOW info; int opt_len; @@ -118,6 +118,12 @@ static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, handle->socket = socket; + if (family == AF_INET6) { + handle->flags |= UV_HANDLE_IPV6; + } else { + assert(!(handle->flags & UV_HANDLE_IPV6)); + } + return 0; } @@ -164,33 +170,36 @@ void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle) { static int uv__bind(uv_udp_t* handle, - int domain, + int family, struct sockaddr* addr, int addrsize, unsigned int flags) { int r; DWORD no = 0, yes = 1; - if ((flags & UV_UDP_IPV6ONLY) && domain != AF_INET6) { + if ((flags & UV_UDP_IPV6ONLY) && family != AF_INET6) { /* UV_UDP_IPV6ONLY is supported only for IPV6 sockets */ uv__set_artificial_error(handle->loop, UV_EINVAL); return -1; } if (handle->socket == INVALID_SOCKET) { - SOCKET sock = socket(domain, SOCK_DGRAM, 0); + SOCKET sock = socket(family, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { uv__set_sys_error(handle->loop, WSAGetLastError()); return -1; } - if (uv_udp_set_socket(handle->loop, handle, sock) == -1) { + if (uv_udp_set_socket(handle->loop, handle, sock, family) < 0) { closesocket(sock); return -1; } + + if (family == AF_INET6) + handle->flags |= UV_HANDLE_IPV6; } - if (domain == AF_INET6 && !(flags & UV_UDP_IPV6ONLY)) { + if (family == AF_INET6 && !(flags & UV_UDP_IPV6ONLY)) { /* On windows IPV6ONLY is on by default. */ /* If the user doesn't specify it libuv turns it off. */ @@ -238,17 +247,11 @@ int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr, int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned int flags) { - if (uv_allow_ipv6) { - handle->flags |= UV_HANDLE_IPV6; - return uv__bind(handle, - AF_INET6, - (struct sockaddr*) &addr, - sizeof(struct sockaddr_in6), - flags); - } else { - uv__set_sys_error(handle->loop, WSAEAFNOSUPPORT); - return -1; - } + return uv__bind(handle, + AF_INET6, + (struct sockaddr*) &addr, + sizeof(struct sockaddr_in6), + flags); } @@ -645,10 +648,10 @@ int uv_udp_set_broadcast(uv_udp_t* handle, int value) { } if (setsockopt(handle->socket, - SOL_SOCKET, - SO_BROADCAST, - (char*) &optval, - sizeof optval)) { + SOL_SOCKET, + SO_BROADCAST, + (char*) &optval, + sizeof optval)) { uv__set_sys_error(handle->loop, WSAGetLastError()); return -1; }