OSDN Git Service

Clean up broken test for whether to wait for input in SSL case.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 25 Oct 2000 22:27:25 +0000 (22:27 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 25 Oct 2000 22:27:25 +0000 (22:27 +0000)
Per discussion with Magnus Hagander.

src/backend/postmaster/postmaster.c

index e752d5e..51ec3b8 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.174 2000/10/24 21:33:52 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.175 2000/10/25 22:27:25 tgl Exp $
  *
  * NOTES
  *
@@ -262,7 +262,7 @@ static void InitSSL(void);
 #endif
 
 #ifdef CYR_RECODE
-void           GetCharSetByHost(char *, int, char *);
+extern void GetCharSetByHost(char *, int, char *);
 
 #endif
 
@@ -803,34 +803,38 @@ ServerLoop(void)
                Port       *port;
                fd_set          rmask,
                                        wmask;
+               struct timeval *timeout = (struct timeval *) NULL;
 #ifdef USE_SSL
-               bool            no_select = false;
-#endif
+               struct timeval timeout_tv;
 
                /*
-                * Wait for something to happen.
+                * If we are using SSL, there may be input data already read and
+                * pending in SSL's input buffers.  If so, check for additional
+                * input from other clients, but don't delay before processing.
                 */
-               memcpy((char *) &rmask, (char *) &readmask, sizeof(fd_set));
-               memcpy((char *) &wmask, (char *) &writemask, sizeof(fd_set));
-
-#ifdef USE_SSL
                for (curr = DLGetHead(PortList); curr; curr = DLGetSucc(curr))
                {
-                       if (((Port *) DLE_VAL(curr))->ssl &&
-                               SSL_pending(((Port *) DLE_VAL(curr))->ssl) > 0)
+                       Port       *port = (Port *) DLE_VAL(curr);
+
+                       if (port->ssl && SSL_pending(port->ssl))
                        {
-                               no_select = true;
+                               timeout_tv.tv_sec = 0;
+                               timeout_tv.tv_usec = 0;
+                               timeout = &timeout_tv;
                                break;
                        }
                }
-               if (no_select)
-                       FD_ZERO(&rmask);        /* So we don't accept() anything below */
 #endif
 
+               /*
+                * Wait for something to happen.
+                */
+               memcpy((char *) &rmask, (char *) &readmask, sizeof(fd_set));
+               memcpy((char *) &wmask, (char *) &writemask, sizeof(fd_set));
+
                PG_SETMASK(&UnBlockSig);
 
-               if (select(nSockets, &rmask, &wmask, (fd_set *) NULL,
-                                  (struct timeval *) NULL) < 0)
+               if (select(nSockets, &rmask, &wmask, (fd_set *) NULL, timeout) < 0)
                {
                        if (errno == EINTR || errno == EWOULDBLOCK)
                                continue;
@@ -894,8 +898,10 @@ ServerLoop(void)
                                                           (void *) port);
                }
 
-               /* Build up new masks for select(). */
-
+               /*
+                * Scan active ports, processing any available input.  While we
+                * are at it, build up new masks for next select().
+                */
                nSockets = initMasks(&readmask, &writemask);
 
                curr = DLGetHead(PortList);
@@ -946,7 +952,7 @@ ServerLoop(void)
                                /*
                                 * Can't start backend if max backend count is exceeded.
                                 *
-                                * The same when shutdowning data base.
+                                * The same when data base is in startup/shutdown mode.
                                 */
                                if (Shutdown > NoShutdown)
                                        PacketSendError(&port->pktInfo,
@@ -966,8 +972,8 @@ ServerLoop(void)
                                        /*
                                         * If the backend start fails then keep the connection
                                         * open to report it.  Otherwise, pretend there is an
-                                        * error to close the connection which will now be
-                                        * managed by the backend.
+                                        * error to close our descriptor for the connection,
+                                        * which will now be managed by the backend.
                                         */
                                        if (BackendStartup(port) != STATUS_OK)
                                                PacketSendError(&port->pktInfo,
@@ -1067,22 +1073,23 @@ readStartupPacket(void *arg, PacketLen len, void *pkt)
                char            SSLok;
 
 #ifdef USE_SSL
-                if (!EnableSSL || port->laddr.sa.sa_family != AF_INET)
-                       /* No SSL when disabled or on Unix sockets */
-                       SSLok = 'N';
+               /* No SSL when disabled or on Unix sockets */
+               if (!EnableSSL || port->laddr.sa.sa_family != AF_INET)
+                       SSLok = 'N';
                else
-                       SSLok = 'S';            /* Support for SSL */
+                       SSLok = 'S';            /* Support for SSL */
 #else
                SSLok = 'N';                    /* No support for SSL */
 #endif
                if (send(port->sock, &SSLok, 1, 0) != 1)
                {
                        perror("Failed to send SSL negotiation response");
-                       return STATUS_ERROR;/* Close connection */
+                       return STATUS_ERROR; /* Close connection */
                }
 
 #ifdef USE_SSL
-               if (SSLok == 'S') {
+               if (SSLok == 'S')
+               {
                  if (!(port->ssl = SSL_new(SSL_context)) ||
                      !SSL_set_fd(port->ssl, port->sock) ||
                      SSL_accept(port->ssl) <= 0)