aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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 56a13e5894b..5d8fb7fc91d 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 c9390d11247..bd2ad99c113 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.