aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-11-27 23:59:18 +0100
committerDaniel Stenberg <daniel@haxx.se>2014-11-30 23:21:14 +0100
commitaba5888f6b68633ff84f73f22c67f7af900f8511 (patch)
tree2ce125b20d356b7a5b0c04aae6da354bf3076619
parent397a634ebd027c5f20d365327d9d340679f294d8 (diff)
lib/connect: restrict IP/TCP options to said sockets
This patch prepares for adding UNIX domain sockets support. TCP_NODELAY and TCP_KEEPALIVE are specific to TCP/IP sockets, so do not apply these to other socket types. bindlocal only works for IP sockets (independent of TCP/UDP), so filter that out too for other types. Signed-off-by: Peter Wu <peter@lekensteyn.nl>
-rw-r--r--lib/connect.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/lib/connect.c b/lib/connect.c
index 3be491895..25d2103f4 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -991,6 +991,7 @@ static CURLcode singleipconnect(struct connectdata *conn,
CURLcode result;
char ipaddress[MAX_IPADR_LEN];
long port;
+ bool is_tcp;
*sockp = CURL_SOCKET_BAD;
@@ -1013,14 +1014,16 @@ static CURLcode singleipconnect(struct connectdata *conn,
}
infof(data, " Trying %s...\n", ipaddress);
- if(data->set.tcp_nodelay)
+ is_tcp = (addr.family == AF_INET || addr.family == AF_INET6) &&
+ addr.socktype == SOCK_STREAM;
+ if(is_tcp && data->set.tcp_nodelay)
tcpnodelay(conn, sockfd);
nosigpipe(conn, sockfd);
Curl_sndbufset(sockfd);
- if(data->set.tcp_keepalive)
+ if(is_tcp && data->set.tcp_keepalive)
tcpkeepalive(data, sockfd);
if(data->set.fsockopt) {
@@ -1038,16 +1041,17 @@ static CURLcode singleipconnect(struct connectdata *conn,
}
/* possibly bind the local end to an IP, interface or port */
- result = bindlocal(conn, sockfd, addr.family);
- if(result) {
- Curl_closesocket(conn, sockfd); /* close socket and bail out */
- if(result == CURLE_UNSUPPORTED_PROTOCOL) {
- /* The address family is not supported on this interface.
- We can continue trying addresses */
- return CURLE_OK;
+ if(addr.family == AF_INET || addr.family == AF_INET6) {
+ result = bindlocal(conn, sockfd, addr.family);
+ if(result) {
+ Curl_closesocket(conn, sockfd); /* close socket and bail out */
+ if(result == CURLE_UNSUPPORTED_PROTOCOL) {
+ /* The address family is not supported on this interface.
+ We can continue trying addresses */
+ return CURLE_OK;
+ }
+ return result;
}
-
- return result;
}
/* set socket non-blocking */