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)
}
#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 */
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);
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;
}
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;
sclose(listener);
sclose(socks[0]);
sclose(socks[1]);
+ socks[0] = socks[1] = CURL_SOCKET_BAD;
return -1;
}