diff options
| author | Tom Lane | 2016-04-21 19:44:18 +0000 |
|---|---|---|
| committer | Tom Lane | 2016-04-21 19:44:18 +0000 |
| commit | 5e2fb8862bfc4ba8f0ed4ce0b99931db91ad84b1 (patch) | |
| tree | a74e0bcc50364c7920c1a14edfdd858214e7db77 /src | |
| parent | 679c92238c74ed6c96e4251d7ea68f8a096ff674 (diff) | |
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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/backend/port/win32/socket.c | 24 | ||||
| -rw-r--r-- | src/include/port/win32.h | 4 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/backend/port/win32/socket.c b/src/backend/port/win32/socket.c index 19597bf870c..771e38c3a53 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 @@ -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) diff --git a/src/include/port/win32.h b/src/include/port/win32.h index 550c3ecff42..faccca56de0 100644 --- a/src/include/port/win32.h +++ b/src/include/port/win32.h @@ -363,6 +363,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) @@ -370,6 +372,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); |
