aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-04-21 15:44:18 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-04-21 15:44:18 -0400
commitb2bb59bd51849d4eec777171f6e402581e00d654 (patch)
tree93dbfc29b5c1544495ab48befbed03ad783cd27b
parent663624e60bd679ef7d4abeca1e68aceb5f2f5bbe (diff)
downloadpostgresql-b2bb59bd51849d4eec777171f6e402581e00d654.tar.gz
postgresql-b2bb59bd51849d4eec777171f6e402581e00d654.zip
Provide errno-translation wrappers around bind() and listen() on Windows.
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>
-rw-r--r--src/backend/port/win32/socket.c24
-rw-r--r--src/include/port/win32.h4
2 files changed, 28 insertions, 0 deletions
diff --git a/src/backend/port/win32/socket.c b/src/backend/port/win32/socket.c
index 658463000fb..32b885bb4d4 100644
--- a/src/backend/port/win32/socket.c
+++ b/src/backend/port/win32/socket.c
@@ -27,7 +27,10 @@
*/
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
@@ -260,6 +263,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)
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index d0a2cf72eb0..fc2222be680 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -335,6 +335,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)
@@ -342,6 +344,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);