Set SO_NOSIGPIPE on sockets used by phttpget. Without this, if

(1) phttpget is attempting to download enough files that it can't send
all the requests at once, and
(2) the remote server forcibly closes the connection, resulting in RST
packets being sent,
phttpget will receive a SIGPIPE and terminate without downloading all
of the files.

This is probably responsible for a number of hard-to-reproduce errors
with portsnap and freebsd-update.

MFC after:	3 days
This commit is contained in:
Colin Percival 2009-04-03 21:13:18 +00:00
parent bafb92643e
commit 04419f3b80
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=190679

View File

@ -317,6 +317,7 @@ main(int argc, char *argv[])
int chunked; /* != if transfer-encoding is chunked */
off_t clen; /* Chunk length */
int firstreq = 0; /* # of first request for this connection */
int val; /* Value used for setsockopt call */
/* Check that the arguments are sensible */
if (argc < 2)
@ -370,6 +371,11 @@ main(int argc, char *argv[])
setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO,
(void *)&timo, (socklen_t)sizeof(timo));
/* ... disable SIGPIPE generation ... */
val = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE,
(void *)&val, sizeof(int));
/* ... and connect to the server. */
if(connect(sd, res->ai_addr, res->ai_addrlen)) {
close(sd);