diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 908c39c256..2949cf64a3 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.297 2005/01/06 18:29:10 tgl Exp $ + * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.298 2005/01/06 20:06:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1452,30 +1452,36 @@ keep_going: /* We will come back to here until there /* * On first time through, get the postmaster's response to - * our SSL negotiation packet. Be careful to read only - * one byte (if there's more, it could be SSL data). + * our SSL negotiation packet. */ if (conn->ssl == NULL) { + /* + * We use pqReadData here since it has the logic to + * distinguish no-data-yet from connection closure. + * Since conn->ssl isn't set, a plain recv() will occur. + */ char SSLok; - int nread; + int rdresult; - retry_ssl_read: - nread = recv(conn->sock, &SSLok, 1, 0); - if (nread < 0) + rdresult = pqReadData(conn); + if (rdresult < 0) { - if (SOCK_ERRNO == EINTR) - /* Interrupted system call - just try again */ - goto retry_ssl_read; - - printfPQExpBuffer(&conn->errorMessage, - libpq_gettext("could not receive server response to SSL negotiation packet: %s\n"), - SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf))); + /* errorMessage is already filled in */ goto error_return; } - if (nread == 0) + if (rdresult == 0) + { /* caller failed to wait for data */ return PGRES_POLLING_READING; + } + if (pqGetc(&SSLok, conn) < 0) + { + /* should not happen really */ + return PGRES_POLLING_READING; + } + /* mark byte consumed */ + conn->inStart = conn->inCursor; if (SSLok == 'S') { /* Do one-time setup; this creates conn->ssl */