]> granicus.if.org Git - postgresql/commitdiff
pqWait() should check for exception status as well as read or write
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 31 Mar 2001 23:13:30 +0000 (23:13 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 31 Mar 2001 23:13:30 +0000 (23:13 +0000)
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.

src/interfaces/libpq/fe-misc.c

index 697128cb8289dbf8dc1548a62d169cf6fc17f179..17501665e693c0aa74100324b28dbfcc126e6cb1 100644 (file)
@@ -25,7 +25,7 @@
  *
  *
  * 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)
 
 /* --------------------------------------------------------------------- */
 /* 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
 pqWait(int forRead, int forWrite, PGconn *conn)
 {
        fd_set          input_mask;
        fd_set          output_mask;
+       fd_set          except_mask;
 
        if (conn->sock < 0)
        {
@@ -731,17 +736,19 @@ pqWait(int forRead, int forWrite, PGconn *conn)
 retry:
                FD_ZERO(&input_mask);
                FD_ZERO(&output_mask);
+               FD_ZERO(&except_mask);
                if (forRead)
                        FD_SET(conn->sock, &input_mask);
                if (forWrite)
                        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)
                {
                        if (errno == EINTR)
                                goto retry;
                        printfPQExpBuffer(&conn->errorMessage,
-                                                  "pqWait() -- select() failed: errno=%d\n%s\n",
+                                                         "pqWait() -- select() failed: errno=%d\n%s\n",
                                                          errno, strerror(errno));
                        return EOF;
                }