diff options
Diffstat (limited to 'src/backend/postmaster/postmaster.c')
-rw-r--r-- | src/backend/postmaster/postmaster.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index fb45b89587b..a7858c40989 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.475.2.5 2006/05/19 15:15:38 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.475.2.6 2006/07/16 18:17:23 tgl Exp $ * * NOTES * @@ -1408,8 +1408,12 @@ ProcessStartupPacket(Port *port, bool SSLdone) #else SSLok = 'N'; /* No support for SSL */ #endif + +retry1: if (send(port->sock, &SSLok, 1, 0) != 1) { + if (errno == EINTR) + goto retry1; /* if interrupted, just retry */ ereport(COMMERROR, (errcode_for_socket_access(), errmsg("failed to send SSL negotiation response: %m"))); @@ -2545,6 +2549,7 @@ static void report_fork_failure_to_client(Port *port, int errnum) { char buffer[1000]; + int rc; /* Format the error message packet (always V2 protocol) */ snprintf(buffer, sizeof(buffer), "E%s%s\n", @@ -2555,7 +2560,11 @@ report_fork_failure_to_client(Port *port, int errnum) if (!pg_set_noblock(port->sock)) return; - send(port->sock, buffer, strlen(buffer) + 1, 0); + /* We'll retry after EINTR, but ignore all other failures */ + do + { + rc = send(port->sock, buffer, strlen(buffer) + 1, 0); + } while (rc < 0 && errno == EINTR); } |