sock_fd = socket(ident_serv->ai_family, ident_serv->ai_socktype,
ident_serv->ai_protocol);
- if (sock_fd < 0)
+ if (sock_fd == PGINVALID_SOCKET)
{
ereport(LOG,
(errcode_for_socket_access(),
ident_response)));
ident_inet_done:
- if (sock_fd >= 0)
+ if (sock_fd != PGINVALID_SOCKET)
closesocket(sock_fd);
pg_freeaddrinfo_all(remote_addr.addr.ss_family, ident_serv);
pg_freeaddrinfo_all(local_addr.addr.ss_family, la);
packet->length = htons(packet->length);
sock = socket(serveraddrs[0].ai_family, SOCK_DGRAM, 0);
- if (sock < 0)
+ if (sock == PGINVALID_SOCKET)
{
ereport(LOG,
(errmsg("could not create RADIUS socket: %m")));
int error;
sock = WSASocket(AF_INET, SOCK_DGRAM, 0, 0, 0, 0);
- if (sock == SOCKET_ERROR)
+ if (sock == INVALID_SOCKET)
return -1;
while (n_ii < 1024)
total;
sock = socket(AF_INET, SOCK_DGRAM, 0);
- if (sock == -1)
+ if (sock == PGINVALID_SOCKET)
return -1;
while (n_buffer < 1024 * 100)
#ifdef HAVE_IPV6
/* We'll need an IPv6 socket too for the SIOCGLIFNETMASK ioctls */
sock6 = socket(AF_INET6, SOCK_DGRAM, 0);
- if (sock6 == -1)
+ if (sock6 == PGINVALID_SOCKET)
{
free(buffer);
close(sock);
char *ptr,
*buffer = NULL;
size_t n_buffer = 1024;
- int sock;
+ pgsocket sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
- if (sock == -1)
+ if (sock == PGINVALID_SOCKET)
return -1;
while (n_buffer < 1024 * 100)
break;
}
- if ((fd = socket(addr->ai_family, SOCK_STREAM, 0)) < 0)
+ if ((fd = socket(addr->ai_family, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
{
ereport(LOG,
(errcode_for_socket_access(),
port->raddr.salen = sizeof(port->raddr.addr);
if ((port->sock = accept(server_fd,
(struct sockaddr *) & port->raddr.addr,
- &port->raddr.salen)) < 0)
+ &port->raddr.salen)) == PGINVALID_SOCKET)
{
ereport(LOG,
(errcode_for_socket_access(),
pgwin32_waitforsinglesocket(SOCKET s, int what, int timeout)
{
static HANDLE waitevent = INVALID_HANDLE_VALUE;
- static SOCKET current_socket = -1;
+ static SOCKET current_socket = INVALID_SOCKET;
static int isUDP = 0;
HANDLE events[2];
int r;
if (StreamConnection(serverFd, port) != STATUS_OK)
{
- if (port->sock >= 0)
+ if (port->sock != PGINVALID_SOCKET)
StreamClose(port->sock);
ConnFree(port);
return NULL;
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
char *errbuf, int errbufsize)
{
int save_errno = SOCK_ERRNO;
- int tmpsock = -1;
+ pgsocket tmpsock = PGINVALID_SOCKET;
char sebuf[256];
int maxlen;
struct
* 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;
maxlen);
strcat(errbuf, "\n");
}
- if (tmpsock >= 0)
+ if (tmpsock != PGINVALID_SOCKET)
closesocket(tmpsock);
SOCK_ERRNO_SET(save_errno);
return FALSE;
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)
{
PGnotify *notifyTail; /* newest unreported Notify msg */
/* Connection data */
+ /* See PQconnectPoll() for how we use 'int' and not 'pgsocket'. */
int sock; /* Unix FD for socket, -1 if not connected */
SockAddr laddr; /* Local address */
SockAddr raddr; /* Remote address */