Provide errno-translation wrappers around bind() and listen() on Windows.
authorTom Lane <[email protected]>
Thu, 21 Apr 2016 19:44:18 +0000 (15:44 -0400)
committerTom Lane <[email protected]>
Thu, 21 Apr 2016 19:44:18 +0000 (15:44 -0400)
Fix Windows builds to report something useful rather than "could not bind
IPv4 socket: No error" when bind() fails.

Back-patch of commits d1b7d4877b9a71f4 and 22989a8e34168f57.

Discussion: <4065.1452450340@sss.pgh.pa.us>

src/backend/port/win32/socket.c
src/include/port/win32.h

index 64212c73707c21d5f79726d30e6dd4773e0dfb4c..f82553fca64426a2a652b47ad2d2093c6498f7bb 100644 (file)
  */
 int            pgwin32_noblock = 0;
 
+/* Undef the macros defined in win32.h, so we can access system functions */
 #undef socket
+#undef bind
+#undef listen
 #undef accept
 #undef connect
 #undef select
@@ -261,6 +264,27 @@ pgwin32_socket(int af, int type, int protocol)
    return s;
 }
 
+int
+pgwin32_bind(SOCKET s, struct sockaddr * addr, int addrlen)
+{
+   int         res;
+
+   res = bind(s, addr, addrlen);
+   if (res < 0)
+       TranslateSocketError();
+   return res;
+}
+
+int
+pgwin32_listen(SOCKET s, int backlog)
+{
+   int         res;
+
+   res = listen(s, backlog);
+   if (res < 0)
+       TranslateSocketError();
+   return res;
+}
 
 SOCKET
 pgwin32_accept(SOCKET s, struct sockaddr * addr, int *addrlen)
index 0ae3087ad44bda94c8964d6d9b2cfbaff0b5d54e..1a2075677daa74500ff2f98b06083d91e15609a6 100644 (file)
@@ -361,6 +361,8 @@ void        pg_queue_signal(int signum);
 /* In backend/port/win32/socket.c */
 #ifndef FRONTEND
 #define socket(af, type, protocol) pgwin32_socket(af, type, protocol)
+#define bind(s, addr, addrlen) pgwin32_bind(s, addr, addrlen)
+#define listen(s, backlog) pgwin32_listen(s, backlog)
 #define accept(s, addr, addrlen) pgwin32_accept(s, addr, addrlen)
 #define connect(s, name, namelen) pgwin32_connect(s, name, namelen)
 #define select(n, r, w, e, timeout) pgwin32_select(n, r, w, e, timeout)
@@ -368,6 +370,8 @@ void        pg_queue_signal(int signum);
 #define send(s, buf, len, flags) pgwin32_send(s, buf, len, flags)
 
 SOCKET     pgwin32_socket(int af, int type, int protocol);
+int            pgwin32_bind(SOCKET s, struct sockaddr * addr, int addrlen);
+int            pgwin32_listen(SOCKET s, int backlog);
 SOCKET     pgwin32_accept(SOCKET s, struct sockaddr * addr, int *addrlen);
 int            pgwin32_connect(SOCKET s, const struct sockaddr * name, int namelen);
 int            pgwin32_select(int nfds, fd_set *readfs, fd_set *writefds, fd_set *exceptfds, const struct timeval * timeout);