diff options
author | Peter Wu <peter@lekensteyn.nl> | 2014-11-27 23:59:18 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2014-11-30 23:21:14 +0100 |
commit | aba5888f6b68633ff84f73f22c67f7af900f8511 (patch) | |
tree | 2ce125b20d356b7a5b0c04aae6da354bf3076619 | |
parent | 397a634ebd027c5f20d365327d9d340679f294d8 (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.c | 26 |
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 */ |