From 1a87776be94ae8250b7c55e224ede0400996384d Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Wed, 30 Jan 2013 20:30:10 +0100 Subject: [PATCH] deps: upgrade libuv to 034ea31 --- deps/uv/src/win/error.c | 70 ++++++++++++++++++++++++---------------------- deps/uv/src/win/internal.h | 3 -- deps/uv/src/win/tcp.c | 64 +++++++++++++++++++++++------------------- deps/uv/src/win/udp.c | 49 +++++++++++++++++--------------- deps/uv/src/win/winsock.c | 59 +++++++++++++++++++------------------- 5 files changed, 130 insertions(+), 115 deletions(-) diff --git a/deps/uv/src/win/error.c b/deps/uv/src/win/error.c index ba33963..7d7d1ea 100644 --- a/deps/uv/src/win/error.c +++ b/deps/uv/src/win/error.c @@ -66,30 +66,6 @@ void uv_fatal_error(const int errorno, const char* syscall) { uv_err_code uv_translate_sys_error(int sys_errno) { switch (sys_errno) { case ERROR_SUCCESS: return UV_OK; - case ERROR_BEGINNING_OF_MEDIA: return UV_EIO; - case ERROR_BUS_RESET: return UV_EIO; - case ERROR_CRC: return UV_EIO; - case ERROR_DEVICE_DOOR_OPEN: return UV_EIO; - case ERROR_DEVICE_REQUIRES_CLEANING: return UV_EIO; - case ERROR_DISK_CORRUPT: return UV_EIO; - case ERROR_EOM_OVERFLOW: return UV_EIO; - case ERROR_FILEMARK_DETECTED: return UV_EIO; - case ERROR_GEN_FAILURE: return UV_EIO; - case ERROR_INVALID_BLOCK_LENGTH: return UV_EIO; - case ERROR_IO_DEVICE: return UV_EIO; - case ERROR_NO_DATA_DETECTED: return UV_EIO; - case ERROR_NO_SIGNAL_SENT: return UV_EIO; - case ERROR_OPEN_FAILED: return UV_EIO; - case ERROR_SETMARK_DETECTED: return UV_EIO; - case ERROR_SIGNAL_REFUSED: return UV_EIO; - case ERROR_FILE_NOT_FOUND: return UV_ENOENT; - case ERROR_INVALID_NAME: return UV_ENOENT; - case ERROR_INVALID_REPARSE_DATA: return UV_ENOENT; - case ERROR_MOD_NOT_FOUND: return UV_ENOENT; - case ERROR_PATH_NOT_FOUND: return UV_ENOENT; - case WSANO_DATA: return UV_ENOENT; - case ERROR_ACCESS_DENIED: return UV_EPERM; - case ERROR_PRIVILEGE_NOT_HELD: return UV_EPERM; case ERROR_NOACCESS: return UV_EACCES; case WSAEACCES: return UV_EACCES; case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE; @@ -98,8 +74,12 @@ uv_err_code uv_translate_sys_error(int sys_errno) { case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT; case WSAEWOULDBLOCK: return UV_EAGAIN; case WSAEALREADY: return UV_EALREADY; + case ERROR_INVALID_FLAGS: return UV_EBADF; + case ERROR_INVALID_HANDLE: return UV_EBADF; case ERROR_LOCK_VIOLATION: return UV_EBUSY; + case ERROR_PIPE_BUSY: return UV_EBUSY; case ERROR_SHARING_VIOLATION: return UV_EBUSY; + case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET; case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED; case WSAECONNABORTED: return UV_ECONNABORTED; case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED; @@ -114,9 +94,29 @@ uv_err_code uv_translate_sys_error(int sys_errno) { case WSAEHOSTUNREACH: return UV_EHOSTUNREACH; case ERROR_OPERATION_ABORTED: return UV_EINTR; case WSAEINTR: return UV_EINTR; + case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL; case ERROR_INVALID_DATA: return UV_EINVAL; + case ERROR_INVALID_PARAMETER: return UV_EINVAL; case ERROR_SYMLINK_NOT_SUPPORTED: return UV_EINVAL; case WSAEINVAL: return UV_EINVAL; + case WSAEPFNOSUPPORT: return UV_EINVAL; + case WSAESOCKTNOSUPPORT: return UV_EINVAL; + case ERROR_BEGINNING_OF_MEDIA: return UV_EIO; + case ERROR_BUS_RESET: return UV_EIO; + case ERROR_CRC: return UV_EIO; + case ERROR_DEVICE_DOOR_OPEN: return UV_EIO; + case ERROR_DEVICE_REQUIRES_CLEANING: return UV_EIO; + case ERROR_DISK_CORRUPT: return UV_EIO; + case ERROR_EOM_OVERFLOW: return UV_EIO; + case ERROR_FILEMARK_DETECTED: return UV_EIO; + case ERROR_GEN_FAILURE: return UV_EIO; + case ERROR_INVALID_BLOCK_LENGTH: return UV_EIO; + case ERROR_IO_DEVICE: return UV_EIO; + case ERROR_NO_DATA_DETECTED: return UV_EIO; + case ERROR_NO_SIGNAL_SENT: return UV_EIO; + case ERROR_OPEN_FAILED: return UV_EIO; + case ERROR_SETMARK_DETECTED: return UV_EIO; + case ERROR_SIGNAL_REFUSED: return UV_EIO; case ERROR_CANT_RESOLVE_FILENAME: return UV_ELOOP; case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE; case WSAEMFILE: return UV_EMFILE; @@ -125,6 +125,14 @@ uv_err_code uv_translate_sys_error(int sys_errno) { case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH; case WSAENETUNREACH: return UV_ENETUNREACH; case WSAENOBUFS: return UV_ENOBUFS; + case ERROR_DIRECTORY: return UV_ENOENT; + case ERROR_FILE_NOT_FOUND: return UV_ENOENT; + case ERROR_INVALID_NAME: return UV_ENOENT; + case ERROR_INVALID_REPARSE_DATA: return UV_ENOENT; + case ERROR_MOD_NOT_FOUND: return UV_ENOENT; + case ERROR_PATH_NOT_FOUND: return UV_ENOENT; + case WSAHOST_NOT_FOUND: return UV_ENOENT; + case WSANO_DATA: return UV_ENOENT; case ERROR_NOT_ENOUGH_MEMORY: return UV_ENOMEM; case ERROR_OUTOFMEMORY: return UV_ENOMEM; case ERROR_CANNOT_MAKE: return UV_ENOSPC; @@ -132,26 +140,22 @@ uv_err_code uv_translate_sys_error(int sys_errno) { case ERROR_EA_TABLE_FULL: return UV_ENOSPC; case ERROR_END_OF_MEDIA: return UV_ENOSPC; case ERROR_HANDLE_DISK_FULL: return UV_ENOSPC; - case ERROR_WRITE_PROTECT: return UV_EROFS; case ERROR_NOT_CONNECTED: return UV_ENOTCONN; case WSAENOTCONN: return UV_ENOTCONN; case ERROR_DIR_NOT_EMPTY: return UV_ENOTEMPTY; + case WSAENOTSOCK: return UV_ENOTSOCK; case ERROR_NOT_SUPPORTED: return UV_ENOTSUP; - case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL; - case ERROR_INVALID_FLAGS: return UV_EBADF; - case ERROR_INVALID_HANDLE: return UV_EBADF; - case ERROR_INVALID_PARAMETER: return UV_EINVAL; - case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET; case ERROR_BROKEN_PIPE: return UV_EOF; + case ERROR_ACCESS_DENIED: return UV_EPERM; + case ERROR_PRIVILEGE_NOT_HELD: return UV_EPERM; case ERROR_BAD_PIPE: return UV_EPIPE; case ERROR_NO_DATA: return UV_EPIPE; case ERROR_PIPE_NOT_CONNECTED: return UV_EPIPE; case WSAESHUTDOWN: return UV_EPIPE; - case ERROR_PIPE_BUSY: return UV_EBUSY; + case WSAEPROTONOSUPPORT: return UV_EPROTONOSUPPORT; + case ERROR_WRITE_PROTECT: return UV_EROFS; case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT; case WSAETIMEDOUT: return UV_ETIMEDOUT; - case WSAHOST_NOT_FOUND: return UV_ENOENT; - case WSAENOTSOCK: return UV_ENOTSOCK; case ERROR_NOT_SAME_DEVICE: return UV_EXDEV; default: return UV_UNKNOWN; } diff --git a/deps/uv/src/win/internal.h b/deps/uv/src/win/internal.h index b9f8bba..9dc58d5 100644 --- a/deps/uv/src/win/internal.h +++ b/deps/uv/src/win/internal.h @@ -323,9 +323,6 @@ int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info, OVERLAPPED* overlapped); -/* Whether ipv6 is supported */ -extern int uv_allow_ipv6; - /* Whether there are any non-IFS LSPs stacked on TCP */ extern int uv_tcp_non_ifs_lsp_ipv4; extern int uv_tcp_non_ifs_lsp_ipv6; diff --git a/deps/uv/src/win/tcp.c b/deps/uv/src/win/tcp.c index 9ac0140..8e95c38 100644 --- a/deps/uv/src/win/tcp.c +++ b/deps/uv/src/win/tcp.c @@ -81,7 +81,7 @@ static int uv__tcp_keepalive(uv_tcp_t* handle, SOCKET socket, int enable, unsign static int uv_tcp_set_socket(uv_loop_t* loop, uv_tcp_t* handle, - SOCKET socket, int imported) { + SOCKET socket, int family, int imported) { DWORD yes = 1; int non_ifs_lsp; @@ -107,8 +107,11 @@ static int uv_tcp_set_socket(uv_loop_t* loop, uv_tcp_t* handle, } } - non_ifs_lsp = (handle->flags & UV_HANDLE_IPV6) ? uv_tcp_non_ifs_lsp_ipv6 : - uv_tcp_non_ifs_lsp_ipv4; + if (family == AF_INET6) { + non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv6; + } else { + non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv4; + } if (pSetFileCompletionNotificationModes && !non_ifs_lsp) { if (pSetFileCompletionNotificationModes((HANDLE) socket, @@ -134,6 +137,12 @@ static int uv_tcp_set_socket(uv_loop_t* loop, uv_tcp_t* handle, handle->socket = socket; + if (family == AF_INET6) { + handle->flags |= UV_HANDLE_IPV6; + } else { + assert(!(handle->flags & UV_HANDLE_IPV6)); + } + return 0; } @@ -238,14 +247,14 @@ void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) { static int uv__bind(uv_tcp_t* handle, - int domain, + int family, struct sockaddr* addr, int addrsize) { DWORD err; int r; if (handle->socket == INVALID_SOCKET) { - SOCKET sock = socket(domain, SOCK_STREAM, 0); + SOCKET sock = socket(family, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { uv__set_sys_error(handle->loop, WSAGetLastError()); return -1; @@ -258,7 +267,7 @@ static int uv__bind(uv_tcp_t* handle, return -1; } - if (uv_tcp_set_socket(handle->loop, handle, sock, 0) == -1) { + if (uv_tcp_set_socket(handle->loop, handle, sock, family, 0) < 0) { closesocket(sock); return -1; } @@ -293,17 +302,10 @@ int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) { int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) { - if (uv_allow_ipv6) { - handle->flags |= UV_HANDLE_IPV6; - return uv__bind(handle, - AF_INET6, - (struct sockaddr*)&addr, - sizeof(struct sockaddr_in6)); - - } else { - uv__set_sys_error(handle->loop, WSAEAFNOSUPPORT); - return -1; - } + return uv__bind(handle, + AF_INET6, + (struct sockaddr*)&addr, + sizeof(struct sockaddr_in6)); } @@ -592,6 +594,7 @@ int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) { int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client) { uv_loop_t* loop = server->loop; int rv = 0; + int family; uv_tcp_accept_t* req = server->pending_accepts; @@ -606,7 +609,17 @@ int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client) { return -1; } - if (uv_tcp_set_socket(client->loop, client, req->accept_socket, 0) == -1) { + if (server->flags & UV_HANDLE_IPV6) { + family = AF_INET6; + } else { + family = AF_INET; + } + + if (uv_tcp_set_socket(client->loop, + client, + req->accept_socket, + family, + 0) < 0) { closesocket(req->accept_socket); rv = -1; } else { @@ -756,11 +769,6 @@ int uv__tcp_connect6(uv_connect_t* req, BOOL success; DWORD bytes; - if (!uv_allow_ipv6) { - uv__set_sys_error(loop, WSAEAFNOSUPPORT); - return -1; - } - if (handle->flags & UV_HANDLE_BIND_ERROR) { uv__set_sys_error(loop, handle->bind_error); return -1; @@ -1181,7 +1189,11 @@ int uv_tcp_import(uv_tcp_t* tcp, WSAPROTOCOL_INFOW* socket_protocol_info, return -1; } - if (uv_tcp_set_socket(tcp->loop, tcp, socket, 1) != 0) { + if (uv_tcp_set_socket(tcp->loop, + tcp, + socket, + socket_protocol_info->iAddressFamily, + 1) < 0) { closesocket(socket); return -1; } @@ -1193,10 +1205,6 @@ int uv_tcp_import(uv_tcp_t* tcp, WSAPROTOCOL_INFOW* socket_protocol_info, tcp->flags |= UV_HANDLE_BOUND; tcp->flags |= UV_HANDLE_SHARED_TCP_SOCKET; - if (socket_protocol_info->iAddressFamily == AF_INET6) { - tcp->flags |= UV_HANDLE_IPV6; - } - tcp->loop->active_tcp_streams++; return 0; } diff --git a/deps/uv/src/win/udp.c b/deps/uv/src/win/udp.c index 3f19fe3..212a782 100644 --- a/deps/uv/src/win/udp.c +++ b/deps/uv/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; @@ -93,7 +93,7 @@ static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, /* if the user is using the default UDP driver (AFD) and has no other */ /* LSPs stacked on top. Here we check whether that is the case. */ opt_len = (int) sizeof info; - if (!getsockopt(socket, + if (getsockopt(socket, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &info, @@ -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; } diff --git a/deps/uv/src/win/winsock.c b/deps/uv/src/win/winsock.c index 2c3e49a..47395bb 100644 --- a/deps/uv/src/win/winsock.c +++ b/deps/uv/src/win/winsock.c @@ -25,9 +25,6 @@ #include "internal.h" -/* Whether ipv6 is supported */ -int uv_allow_ipv6; - /* Whether there are any non-IFS LSPs stacked on TCP */ int uv_tcp_non_ifs_lsp_ipv4; int uv_tcp_non_ifs_lsp_ipv6; @@ -75,6 +72,12 @@ BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target) { } +static int error_means_no_support(DWORD error) { + return error == WSAEPROTONOSUPPORT || error == WSAESOCKTNOSUPPORT || + error == WSAEPFNOSUPPORT || error == WSAEAFNOSUPPORT; +} + + void uv_winsock_init() { const GUID wsaid_connectex = WSAID_CONNECTEX; const GUID wsaid_acceptex = WSAID_ACCEPTEX; @@ -100,48 +103,48 @@ void uv_winsock_init() { /* Detect non-IFS LSPs */ dummy = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (dummy == INVALID_SOCKET) { - uv_fatal_error(WSAGetLastError(), "socket"); - } - opt_len = (int) sizeof protocol_info; - if (!getsockopt(dummy, - SOL_SOCKET, - SO_PROTOCOL_INFOW, - (char*) &protocol_info, - &opt_len) == SOCKET_ERROR) { - uv_fatal_error(WSAGetLastError(), "socket"); - } + if (dummy != INVALID_SOCKET) { + opt_len = (int) sizeof protocol_info; + if (!getsockopt(dummy, + SOL_SOCKET, + SO_PROTOCOL_INFOW, + (char*) &protocol_info, + &opt_len) == SOCKET_ERROR) + uv_fatal_error(WSAGetLastError(), "getsockopt"); - if (!(protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES)) { - uv_tcp_non_ifs_lsp_ipv4 = 1; - } + if (!(protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES)) + uv_tcp_non_ifs_lsp_ipv4 = 1; + + if (closesocket(dummy) == SOCKET_ERROR) + uv_fatal_error(WSAGetLastError(), "closesocket"); - if (closesocket(dummy) == SOCKET_ERROR) { - uv_fatal_error(WSAGetLastError(), "closesocket"); + } else if (!error_means_no_support(WSAGetLastError())) { + /* Any error other than "socket type not supported" is fatal. */ + uv_fatal_error(WSAGetLastError(), "socket"); } /* Detect IPV6 support and non-IFS LSPs */ dummy = socket(AF_INET6, SOCK_STREAM, IPPROTO_IP); - if (dummy != INVALID_SOCKET) { - uv_allow_ipv6 = TRUE; + if (dummy != INVALID_SOCKET) { opt_len = (int) sizeof protocol_info; if (!getsockopt(dummy, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, - &opt_len) == SOCKET_ERROR) { - uv_fatal_error(WSAGetLastError(), "socket"); - } + &opt_len) == SOCKET_ERROR) + uv_fatal_error(WSAGetLastError(), "getsockopt"); - if (!(protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES)) { + if (!(protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES)) uv_tcp_non_ifs_lsp_ipv6 = 1; - } - if (closesocket(dummy) == SOCKET_ERROR) { + if (closesocket(dummy) == SOCKET_ERROR) uv_fatal_error(WSAGetLastError(), "closesocket"); - } + + } else if (!error_means_no_support(WSAGetLastError())) { + /* Any error other than "socket type not supported" is fatal. */ + uv_fatal_error(WSAGetLastError(), "socket"); } } -- 2.7.4