socketpair: set SO_NOSIGPIPE where possible
No binary (build failed)
—
(log yok)
| @@ -294,6 +294,15 @@ static CURLcode sock_assign_addr(struct Curl_sockaddr_ex *dest, | |
| return CURLE_OK; | |
| } | |
| + | #ifdef USE_SO_NOSIGPIPE |
| + | int Curl_sock_nosigpipe(curl_socket_t sockfd) |
| + | { |
| + | int onoff = 1; |
| + | return setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, |
| + | (void *)&onoff, sizeof(onoff)); |
| + | } |
| + | #endif /* USE_SO_NOSIGPIPE */ |
| + | |
| static CURLcode socket_open(struct Curl_easy *data, | |
| struct Curl_sockaddr_ex *addr, | |
| curl_socket_t *sockfd) | |
| @@ -333,15 +342,12 @@ static CURLcode socket_open(struct Curl_easy *data, | |
| } | |
| #ifdef USE_SO_NOSIGPIPE | |
| - | { |
| - | int onoff = 1; |
| - | if(setsockopt(*sockfd, SOL_SOCKET, SO_NOSIGPIPE, |
| - | (void *)&onoff, sizeof(onoff)) < 0) { |
| - | failf(data, "setsockopt enable SO_NOSIGPIPE: %s", |
| - | curlx_strerror(SOCKERRNO, errbuf, sizeof(errbuf))); |
| - | *sockfd = CURL_SOCKET_BAD; |
| - | return CURLE_COULDNT_CONNECT; |
| - | } |
| + | if(Curl_sock_nosigpipe(*sockfd) < 0) { |
| + | failf(data, "setsockopt enable SO_NOSIGPIPE: %s", |
| + | curlx_strerror(SOCKERRNO, errbuf, sizeof(errbuf))); |
| + | sclose(*sockfd); |
| + | *sockfd = CURL_SOCKET_BAD; |
| + | return CURLE_COULDNT_CONNECT; |
| } | |
| #endif /* USE_SO_NOSIGPIPE */ | |
| @@ -73,6 +73,11 @@ CURLcode Curl_socket_open(struct Curl_easy *data, | |
| uint8_t transport, | |
| curl_socket_t *sockfd); | |
| + | #ifdef USE_SO_NOSIGPIPE |
| + | /* Set SO_NOSIGPIPE on socket, return < 0 on error. */ |
| + | int Curl_sock_nosigpipe(curl_socket_t sockfd); |
| + | #endif |
| + | |
| int Curl_socket_close(struct Curl_easy *data, struct connectdata *conn, | |
| curl_socket_t sock); | |
| @@ -109,10 +109,20 @@ static int wakeup_socketpair(curl_socket_t socks[2], bool nonblocking) | |
| curlx_nonblock(socks[1], TRUE) < 0) { | |
| sclose(socks[0]); | |
| sclose(socks[1]); | |
| + | socks[0] = socks[1] = CURL_SOCKET_BAD; |
| return -1; | |
| } | |
| } | |
| #endif | |
| + | #ifdef USE_SO_NOSIGPIPE |
| + | if(Curl_sock_nosigpipe(socks[1]) < 0) { |
| + | sclose(socks[0]); |
| + | sclose(socks[1]); |
| + | socks[0] = socks[1] = CURL_SOCKET_BAD; |
| + | return -1; |
| + | } |
| + | #endif /* USE_SO_NOSIGPIPE */ |
| + | |
| return 0; | |
| } | |
| @@ -253,6 +263,10 @@ static int wakeup_inet(curl_socket_t socks[2], bool nonblocking) | |
| if(curlx_nonblock(socks[0], TRUE) < 0 || | |
| curlx_nonblock(socks[1], TRUE) < 0) | |
| goto error; | |
| + | #ifdef USE_SO_NOSIGPIPE |
| + | if(Curl_sock_nosigpipe(socks[1]) < 0) |
| + | goto error; |
| + | #endif |
| sclose(listener); | |
| return 0; | |
| @@ -260,6 +274,7 @@ error: | |
| sclose(listener); | |
| sclose(socks[0]); | |
| sclose(socks[1]); | |
| + | socks[0] = socks[1] = CURL_SOCKET_BAD; |
| return -1; | |
| } | |