X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=lib%2Fsocket.c;h=1c1853c7cd7989cb84ea3f52774f2e0c6782b4a1;hb=4a58e6145568fd21ef956ae6ac3d3c37ef209a57;hp=6bf3cfff23d2d65dfe6120201c33b211de114c9e;hpb=63f36a0923e8aef6ef3f91cd30fba8ddc9f9509a;p=deb_libnfs.git diff --git a/lib/socket.c b/lib/socket.c index 6bf3cff..1c1853c 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -46,6 +46,10 @@ #include #endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + #ifdef HAVE_NETINET_TCP_H #include #endif @@ -68,6 +72,7 @@ #include #include #include +#include #include #include "libnfs-zdr.h" #include "libnfs.h" @@ -95,6 +100,14 @@ static void set_nonblocking(int fd) #endif //FIXME } +static void set_nolinger(int fd) +{ + struct linger lng; + lng.l_onoff = 1; + lng.l_linger = 0; + setsockopt(fd, SOL_SOCKET, SO_LINGER, &lng, sizeof(lng)); +} + #ifdef HAVE_NETINET_TCP_H int set_tcp_sockopt(int sockfd, int optname, int value) { @@ -498,7 +511,7 @@ static int rpc_connect_sockaddr_async(struct rpc_context *rpc, struct sockaddr_s ((struct sockaddr_in6 *)&ss)->sin6_port = port; ((struct sockaddr_in6 *)&ss)->sin6_family = AF_INET6; #ifdef HAVE_SOCKADDR_LEN - ((struct sockaddr_in6 *)&ss)->sin6_len = sizeof(struct sockaddr_in); + ((struct sockaddr_in6 *)&ss)->sin6_len = sizeof(struct sockaddr_in6); #endif break; } @@ -514,6 +527,7 @@ static int rpc_connect_sockaddr_async(struct rpc_context *rpc, struct sockaddr_s } set_nonblocking(rpc->fd); + set_nolinger(rpc->fd); if (connect(rpc->fd, (struct sockaddr *)s, socksize) != 0 && errno != EINPROGRESS) { rpc_set_error(rpc, "connect() to server failed. %s(%d)", strerror(errno), errno); @@ -551,6 +565,7 @@ int rpc_connect_async(struct rpc_context *rpc, const char *server, int port, rpc case AF_INET: ((struct sockaddr_in *)&rpc->s)->sin_family = ai->ai_family; ((struct sockaddr_in *)&rpc->s)->sin_port = htons(port); + ((struct sockaddr_in *)&rpc->s)->sin_addr = ((struct sockaddr_in *)(ai->ai_addr))->sin_addr; #ifdef HAVE_SOCKADDR_LEN ((struct sockaddr_in *)&rpc->s)->sin_len = sizeof(struct sockaddr_in); #endif @@ -558,6 +573,7 @@ int rpc_connect_async(struct rpc_context *rpc, const char *server, int port, rpc case AF_INET6: ((struct sockaddr_in6 *)&rpc->s)->sin6_family = ai->ai_family; ((struct sockaddr_in6 *)&rpc->s)->sin6_port = htons(port); + ((struct sockaddr_in6 *)&rpc->s)->sin6_addr = ((struct sockaddr_in6 *)(ai->ai_addr))->sin6_addr; #ifdef HAVE_SOCKADDR_LEN ((struct sockaddr_in6 *)&rpc->s)->sin6_len = sizeof(struct sockaddr_in6); #endif