From c87c44fff3f28040159db6ad08134a647e85aacf Mon Sep 17 00:00:00 2001 From: Alexis Campailla Date: Fri, 8 Aug 2014 19:12:41 +0200 Subject: [PATCH] windows: fix uv__getaddrinfo_translate_error Use Windows socket error codes, as recommended by MSDN, like we already do with GetNameInfoW. --- src/unix/getaddrinfo.c | 57 ++++++++++++++++++++++++++++++++++++++++++ src/uv-common.c | 56 ----------------------------------------- src/win/getaddrinfo.c | 16 ++++++++++++ src/win/getnameinfo.c | 6 +++-- 4 files changed, 77 insertions(+), 58 deletions(-) diff --git a/src/unix/getaddrinfo.c b/src/unix/getaddrinfo.c index 1db00680..5718af64 100644 --- a/src/unix/getaddrinfo.c +++ b/src/unix/getaddrinfo.c @@ -27,6 +27,63 @@ #include +int uv__getaddrinfo_translate_error(int sys_err) { + switch (sys_err) { + case 0: return 0; +#if defined(EAI_ADDRFAMILY) + case EAI_ADDRFAMILY: return UV_EAI_ADDRFAMILY; +#endif +#if defined(EAI_AGAIN) + case EAI_AGAIN: return UV_EAI_AGAIN; +#endif +#if defined(EAI_BADFLAGS) + case EAI_BADFLAGS: return UV_EAI_BADFLAGS; +#endif +#if defined(EAI_BADHINTS) + case EAI_BADHINTS: return UV_EAI_BADHINTS; +#endif +#if defined(EAI_CANCELED) + case EAI_CANCELED: return UV_EAI_CANCELED; +#endif +#if defined(EAI_FAIL) + case EAI_FAIL: return UV_EAI_FAIL; +#endif +#if defined(EAI_FAMILY) + case EAI_FAMILY: return UV_EAI_FAMILY; +#endif +#if defined(EAI_MEMORY) + case EAI_MEMORY: return UV_EAI_MEMORY; +#endif +#if defined(EAI_NODATA) + case EAI_NODATA: return UV_EAI_NODATA; +#endif +#if defined(EAI_NONAME) +# if !defined(EAI_NODATA) || EAI_NODATA != EAI_NONAME + case EAI_NONAME: return UV_EAI_NONAME; +# endif +#endif +#if defined(EAI_OVERFLOW) + case EAI_OVERFLOW: return UV_EAI_OVERFLOW; +#endif +#if defined(EAI_PROTOCOL) + case EAI_PROTOCOL: return UV_EAI_PROTOCOL; +#endif +#if defined(EAI_SERVICE) + case EAI_SERVICE: return UV_EAI_SERVICE; +#endif +#if defined(EAI_SOCKTYPE) + case EAI_SOCKTYPE: return UV_EAI_SOCKTYPE; +#endif +#if defined(EAI_SYSTEM) + case EAI_SYSTEM: return -errno; +#endif + } + assert(!"unknown EAI_* error code"); + abort(); + return 0; /* Pacify compiler. */ +} + + static void uv__getaddrinfo_work(struct uv__work* w) { uv_getaddrinfo_t* req; int err; diff --git a/src/uv-common.c b/src/uv-common.c index 4e3968cb..86f45a56 100644 --- a/src/uv-common.c +++ b/src/uv-common.c @@ -410,62 +410,6 @@ uint64_t uv_now(const uv_loop_t* loop) { } -int uv__getaddrinfo_translate_error(int sys_err) { - switch (sys_err) { - case 0: return 0; -#if defined(EAI_ADDRFAMILY) - case EAI_ADDRFAMILY: return UV_EAI_ADDRFAMILY; -#endif -#if defined(EAI_AGAIN) - case EAI_AGAIN: return UV_EAI_AGAIN; -#endif -#if defined(EAI_BADFLAGS) - case EAI_BADFLAGS: return UV_EAI_BADFLAGS; -#endif -#if defined(EAI_BADHINTS) - case EAI_BADHINTS: return UV_EAI_BADHINTS; -#endif -#if defined(EAI_CANCELED) - case EAI_CANCELED: return UV_EAI_CANCELED; -#endif -#if defined(EAI_FAIL) - case EAI_FAIL: return UV_EAI_FAIL; -#endif -#if defined(EAI_FAMILY) - case EAI_FAMILY: return UV_EAI_FAMILY; -#endif -#if defined(EAI_MEMORY) - case EAI_MEMORY: return UV_EAI_MEMORY; -#endif -#if defined(EAI_NODATA) - case EAI_NODATA: return UV_EAI_NODATA; -#endif -#if defined(EAI_NONAME) -# if !defined(EAI_NODATA) || EAI_NODATA != EAI_NONAME - case EAI_NONAME: return UV_EAI_NONAME; -# endif -#endif -#if defined(EAI_OVERFLOW) - case EAI_OVERFLOW: return UV_EAI_OVERFLOW; -#endif -#if defined(EAI_PROTOCOL) - case EAI_PROTOCOL: return UV_EAI_PROTOCOL; -#endif -#if defined(EAI_SERVICE) - case EAI_SERVICE: return UV_EAI_SERVICE; -#endif -#if defined(EAI_SOCKTYPE) - case EAI_SOCKTYPE: return UV_EAI_SOCKTYPE; -#endif -#if defined(EAI_SYSTEM) - case EAI_SYSTEM: return -errno; -#endif - } - assert(!"unknown EAI_* error code"); - abort(); - return 0; /* Pacify compiler. */ -} - size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs) { unsigned int i; diff --git a/src/win/getaddrinfo.c b/src/win/getaddrinfo.c index 086200a9..6392fbaf 100644 --- a/src/win/getaddrinfo.c +++ b/src/win/getaddrinfo.c @@ -27,6 +27,22 @@ #include "req-inl.h" +int uv__getaddrinfo_translate_error(int sys_err) { + switch (sys_err) { + case 0: return 0; + case WSATRY_AGAIN: return UV_EAI_AGAIN; + case WSAEINVAL: return UV_EAI_BADFLAGS; + case WSANO_RECOVERY: return UV_EAI_FAIL; + case WSAEAFNOSUPPORT: return UV_EAI_FAMILY; + case WSA_NOT_ENOUGH_MEMORY: return UV_EAI_MEMORY; + case WSAHOST_NOT_FOUND: return UV_EAI_NONAME; + case WSATYPE_NOT_FOUND: return UV_EAI_SERVICE; + case WSAESOCKTNOSUPPORT: return UV_EAI_SOCKTYPE; + default: return uv_translate_sys_error(sys_err); + } +} + + /* * MinGW is missing this */ diff --git a/src/win/getnameinfo.c b/src/win/getnameinfo.c index 45608dae..43d9edc2 100644 --- a/src/win/getnameinfo.c +++ b/src/win/getnameinfo.c @@ -46,13 +46,15 @@ static void uv__getnameinfo_work(struct uv__work* w) { int ret = 0; req = container_of(w, uv_getnameinfo_t, work_req); - ret = GetNameInfoW((struct sockaddr*)&req->storage, + if (!GetNameInfoW((struct sockaddr*)&req->storage, sizeof(req->storage), host, ARRAY_SIZE(host), service, ARRAY_SIZE(service), - req->flags); + req->flags)) { + ret = WSAGetLastError(); + } req->retcode = uv__getaddrinfo_translate_error(ret); /* convert results to UTF-8 */