aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/postmaster/postmaster.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index e752d5e8871..51ec3b88856 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -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)