summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-04-21 16:58:47 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-04-21 16:59:17 -0400
commit9028f404ef9605b585c176f7b0924069884cabfe (patch)
tree346625d68a5fdcfbfd1bb90d1e4dd002272caf25
parent5b13ad976a0143fbed15612db8962faa33e8d979 (diff)
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.
-rw-r--r--src/backend/port/win32/socket.c55
-rw-r--r--src/include/port/win32.h16
2 files changed, 58 insertions, 13 deletions
diff --git a/src/backend/port/win32/socket.c b/src/backend/port/win32/socket.c
index 32b885bb4d4..828550f5521 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 37f1dcc5855..4f4f67acb9f 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -277,20 +277,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.