From: Tom Lane Date: Thu, 21 Apr 2016 20:58:47 +0000 (-0400) Subject: Improve TranslateSocketError() to handle more Windows error codes. X-Git-Tag: REL9_6_BETA1~116 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=125ad539a275db5ab8f4647828b80a16d02eabd2;p=postgresql Improve TranslateSocketError() to handle more Windows error codes. The coverage was rather lean for cases that bind() or listen() might return. Add entries for everything that there's a direct equivalent for in the set of Unix errnos that elog.c has heard of. --- diff --git a/src/backend/port/win32/socket.c b/src/backend/port/win32/socket.c index 56a13e5894..5d8fb7fc91 100644 --- a/src/backend/port/win32/socket.c +++ b/src/backend/port/win32/socket.c @@ -44,23 +44,38 @@ int pgwin32_noblock = 0; /* * Convert the last socket error code into errno + * + * Note: where there is a direct correspondence between a WSAxxx error code + * and a Berkeley error symbol, this mapping is actually a no-op, because + * in win32.h we redefine the network-related Berkeley error symbols to have + * the values of their WSAxxx counterparts. The point of the switch is + * mostly to translate near-miss error codes into something that's sensible + * in the Berkeley universe. */ static void TranslateSocketError(void) { switch (WSAGetLastError()) { - case WSANOTINITIALISED: - case WSAENETDOWN: - case WSAEINPROGRESS: case WSAEINVAL: - case WSAESOCKTNOSUPPORT: - case WSAEFAULT: + case WSANOTINITIALISED: case WSAEINVALIDPROVIDER: case WSAEINVALIDPROCTABLE: - case WSAEMSGSIZE: + case WSAEDESTADDRREQ: errno = EINVAL; break; + case WSAEINPROGRESS: + errno = EINPROGRESS; + break; + case WSAEFAULT: + errno = EFAULT; + break; + case WSAEISCONN: + errno = EISCONN; + break; + case WSAEMSGSIZE: + errno = EMSGSIZE; + break; case WSAEAFNOSUPPORT: errno = EAFNOSUPPORT; break; @@ -72,16 +87,23 @@ TranslateSocketError(void) break; case WSAEPROTONOSUPPORT: case WSAEPROTOTYPE: + case WSAESOCKTNOSUPPORT: errno = EPROTONOSUPPORT; break; + case WSAECONNABORTED: + errno = ECONNABORTED; + break; case WSAECONNREFUSED: errno = ECONNREFUSED; break; + case WSAECONNRESET: + errno = ECONNRESET; + break; case WSAEINTR: errno = EINTR; break; case WSAENOTSOCK: - errno = EBADFD; + errno = ENOTSOCK; break; case WSAEOPNOTSUPP: errno = EOPNOTSUPP; @@ -92,13 +114,24 @@ TranslateSocketError(void) case WSAEACCES: errno = EACCES; break; - case WSAENOTCONN: + case WSAEADDRINUSE: + errno = EADDRINUSE; + break; + case WSAEADDRNOTAVAIL: + errno = EADDRNOTAVAIL; + break; + case WSAEHOSTUNREACH: + case WSAEHOSTDOWN: + case WSAHOST_NOT_FOUND: + case WSAENETDOWN: + case WSAENETUNREACH: case WSAENETRESET: - case WSAECONNRESET: + errno = EHOSTUNREACH; + break; + case WSAENOTCONN: case WSAESHUTDOWN: - case WSAECONNABORTED: case WSAEDISCON: - errno = ECONNREFUSED; /* ENOTCONN? */ + errno = ENOTCONN; break; default: ereport(NOTICE, diff --git a/src/include/port/win32.h b/src/include/port/win32.h index c9390d1124..bd2ad99c11 100644 --- a/src/include/port/win32.h +++ b/src/include/port/win32.h @@ -285,20 +285,32 @@ typedef int pid_t; #define EAFNOSUPPORT WSAEAFNOSUPPORT #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK +#undef ECONNABORTED +#define ECONNABORTED WSAECONNABORTED #undef ECONNRESET #define ECONNRESET WSAECONNRESET #undef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS +#undef EISCONN +#define EISCONN WSAEISCONN #undef ENOBUFS #define ENOBUFS WSAENOBUFS #undef EPROTONOSUPPORT #define EPROTONOSUPPORT WSAEPROTONOSUPPORT #undef ECONNREFUSED #define ECONNREFUSED WSAECONNREFUSED -#undef EBADFD -#define EBADFD WSAENOTSOCK +#undef ENOTSOCK +#define ENOTSOCK WSAENOTSOCK #undef EOPNOTSUPP #define EOPNOTSUPP WSAEOPNOTSUPP +#undef EADDRINUSE +#define EADDRINUSE WSAEADDRINUSE +#undef EADDRNOTAVAIL +#define EADDRNOTAVAIL WSAEADDRNOTAVAIL +#undef EHOSTUNREACH +#define EHOSTUNREACH WSAEHOSTUNREACH +#undef ENOTCONN +#define ENOTCONN WSAENOTCONN /* * Extended locale functions with gratuitous underscore prefixes.