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.
This commit is contained in:
parent
c45564ac8a
commit
6b1cca3975
@ -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,
|
static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, SOCKET socket,
|
||||||
SOCKET socket) {
|
int family) {
|
||||||
DWORD yes = 1;
|
DWORD yes = 1;
|
||||||
WSAPROTOCOL_INFOW info;
|
WSAPROTOCOL_INFOW info;
|
||||||
int opt_len;
|
int opt_len;
|
||||||
@ -118,6 +118,12 @@ static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle,
|
|||||||
|
|
||||||
handle->socket = socket;
|
handle->socket = socket;
|
||||||
|
|
||||||
|
if (family == AF_INET6) {
|
||||||
|
handle->flags |= UV_HANDLE_IPV6;
|
||||||
|
} else {
|
||||||
|
assert(!(handle->flags & UV_HANDLE_IPV6));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
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,
|
static int uv__bind(uv_udp_t* handle,
|
||||||
int domain,
|
int family,
|
||||||
struct sockaddr* addr,
|
struct sockaddr* addr,
|
||||||
int addrsize,
|
int addrsize,
|
||||||
unsigned int flags) {
|
unsigned int flags) {
|
||||||
int r;
|
int r;
|
||||||
DWORD no = 0, yes = 1;
|
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_UDP_IPV6ONLY is supported only for IPV6 sockets */
|
||||||
uv__set_artificial_error(handle->loop, UV_EINVAL);
|
uv__set_artificial_error(handle->loop, UV_EINVAL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handle->socket == INVALID_SOCKET) {
|
if (handle->socket == INVALID_SOCKET) {
|
||||||
SOCKET sock = socket(domain, SOCK_DGRAM, 0);
|
SOCKET sock = socket(family, SOCK_DGRAM, 0);
|
||||||
if (sock == INVALID_SOCKET) {
|
if (sock == INVALID_SOCKET) {
|
||||||
uv__set_sys_error(handle->loop, WSAGetLastError());
|
uv__set_sys_error(handle->loop, WSAGetLastError());
|
||||||
return -1;
|
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);
|
closesocket(sock);
|
||||||
return -1;
|
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. */
|
/* On windows IPV6ONLY is on by default. */
|
||||||
/* If the user doesn't specify it libuv turns it off. */
|
/* 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,
|
int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr,
|
||||||
unsigned int flags) {
|
unsigned int flags) {
|
||||||
if (uv_allow_ipv6) {
|
|
||||||
handle->flags |= UV_HANDLE_IPV6;
|
|
||||||
return uv__bind(handle,
|
return uv__bind(handle,
|
||||||
AF_INET6,
|
AF_INET6,
|
||||||
(struct sockaddr*) &addr,
|
(struct sockaddr*) &addr,
|
||||||
sizeof(struct sockaddr_in6),
|
sizeof(struct sockaddr_in6),
|
||||||
flags);
|
flags);
|
||||||
} else {
|
|
||||||
uv__set_sys_error(handle->loop, WSAEAFNOSUPPORT);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user