aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/libpq/fe-connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/libpq/fe-connect.c')
-rw-r--r--src/interfaces/libpq/fe-connect.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 10e77d186cf..d7049b52b66 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -1626,8 +1626,23 @@ keep_going: /* We will come back to here until there is
conn->raddr.salen = addr_cur->ai_addrlen;
/* Open a socket */
- conn->sock = socket(addr_cur->ai_family, SOCK_STREAM, 0);
- if (conn->sock < 0)
+ {
+ /*
+ * While we use 'pgsocket' as the socket type in the
+ * backend, we use 'int' for libpq socket values.
+ * This requires us to map PGINVALID_SOCKET to -1
+ * on Windows.
+ * See http://msdn.microsoft.com/en-us/library/windows/desktop/ms740516%28v=vs.85%29.aspx
+ */
+ pgsocket sock = socket(addr_cur->ai_family, SOCK_STREAM, 0);
+#ifdef WIN32
+ if (sock == PGINVALID_SOCKET)
+ conn->sock = -1;
+ else
+#endif
+ conn->sock = sock;
+ }
+ if (conn->sock == -1)
{
/*
* ignore socket() failure if we have more addresses
@@ -3173,7 +3188,7 @@ internal_cancel(SockAddr *raddr, int be_pid, int be_key,
char *errbuf, int errbufsize)
{
int save_errno = SOCK_ERRNO;
- int tmpsock = -1;
+ pgsocket tmpsock = PGINVALID_SOCKET;
char sebuf[256];
int maxlen;
struct
@@ -3186,7 +3201,7 @@ internal_cancel(SockAddr *raddr, int be_pid, int be_key,
* We need to open a temporary connection to the postmaster. Do this with
* only kernel calls.
*/
- if ((tmpsock = socket(raddr->addr.ss_family, SOCK_STREAM, 0)) < 0)
+ if ((tmpsock = socket(raddr->addr.ss_family, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
{
strlcpy(errbuf, "PQcancel() -- socket() failed: ", errbufsize);
goto cancel_errReturn;
@@ -3257,7 +3272,7 @@ cancel_errReturn:
maxlen);
strcat(errbuf, "\n");
}
- if (tmpsock >= 0)
+ if (tmpsock != PGINVALID_SOCKET)
closesocket(tmpsock);
SOCK_ERRNO_SET(save_errno);
return FALSE;
@@ -5246,6 +5261,15 @@ PQerrorMessage(const PGconn *conn)
return conn->errorMessage.data;
}
+/*
+ * In Windows, socket values are unsigned, and an invalid socket value
+ * (INVALID_SOCKET) is ~0, which equals -1 in comparisons (with no compiler
+ * warning). Ideally we would return an unsigned value for PQsocket() on
+ * Windows, but that would cause the function's return value to differ from
+ * Unix, so we just return -1 for invalid sockets.
+ * http://msdn.microsoft.com/en-us/library/windows/desktop/cc507522%28v=vs.85%29.aspx
+ * http://stackoverflow.com/questions/10817252/why-is-invalid-socket-defined-as-0-in-winsock2-h-c
+ */
int
PQsocket(const PGconn *conn)
{