Commit fc0d3f14 authored by Tom Lane's avatar Tom Lane

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
...@@ -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;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment