Skip to content
Snippets Groups Projects
Commit fc0d3f14 authored by Tom Lane's avatar Tom Lane
Browse files

pqWait() should check for exception status as well as read or write

ready.  It appears that most (all?) Unixen will consider a socket to
be read or write ready if it has an error condition, but of course
Microsoft does things differently.
parent 8484f669
No related branches found
No related tags found
No related merge requests found
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.47 2001/03/22 04:01:26 momjian Exp $ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.48 2001/03/31 23:13:30 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -712,12 +712,17 @@ pqFlush(PGconn *conn) ...@@ -712,12 +712,17 @@ pqFlush(PGconn *conn)
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
/* pqWait: wait until we can read or write the connection socket /* pqWait: wait until we can read or write the connection socket
*
* We also stop waiting and return if the kernel flags an exception condition
* on the socket. The actual error condition will be detected and reported
* when the caller tries to read or write the socket.
*/ */
int int
pqWait(int forRead, int forWrite, PGconn *conn) pqWait(int forRead, int forWrite, PGconn *conn)
{ {
fd_set input_mask; fd_set input_mask;
fd_set output_mask; fd_set output_mask;
fd_set except_mask;
if (conn->sock < 0) if (conn->sock < 0)
{ {
...@@ -731,17 +736,19 @@ pqWait(int forRead, int forWrite, PGconn *conn) ...@@ -731,17 +736,19 @@ pqWait(int forRead, int forWrite, PGconn *conn)
retry: retry:
FD_ZERO(&input_mask); FD_ZERO(&input_mask);
FD_ZERO(&output_mask); FD_ZERO(&output_mask);
FD_ZERO(&except_mask);
if (forRead) if (forRead)
FD_SET(conn->sock, &input_mask); FD_SET(conn->sock, &input_mask);
if (forWrite) if (forWrite)
FD_SET(conn->sock, &output_mask); FD_SET(conn->sock, &output_mask);
if (select(conn->sock + 1, &input_mask, &output_mask, (fd_set *) NULL, FD_SET(conn->sock, &except_mask);
if (select(conn->sock + 1, &input_mask, &output_mask, &except_mask,
(struct timeval *) NULL) < 0) (struct timeval *) NULL) < 0)
{ {
if (errno == EINTR) if (errno == EINTR)
goto retry; goto retry;
printfPQExpBuffer(&conn->errorMessage, printfPQExpBuffer(&conn->errorMessage,
"pqWait() -- select() failed: errno=%d\n%s\n", "pqWait() -- select() failed: errno=%d\n%s\n",
errno, strerror(errno)); errno, strerror(errno));
return EOF; return EOF;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment