#include <sys/socket.h>
#endif
+#ifdef HAVE_NETINET_TCP_H
+#include <netinet/tcp.h>
+#endif
+
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#endif //FIXME
}
+#ifdef HAVE_NETINET_TCP_H
+int set_tcp_sockopt(int sockfd, int optname, int value)
+{
+ int level;
+
+ #if defined(__FreeBSD__) || defined(__sun) || (defined(__APPLE__) && defined(__MACH__))
+ struct protoent *buf;
+
+ if ((buf = getprotobyname("tcp")) != NULL)
+ level = buf->p_proto;
+ else
+ return -1;
+ #else
+ level = SOL_TCP;
+ #endif
+
+ return setsockopt(sockfd, level, optname, (char *)&value, sizeof(value));
+}
+#endif
+
int rpc_get_fd(struct rpc_context *rpc)
{
assert(rpc->magic == RPC_CONTEXT_MAGIC);
rpc->auto_reconnect = 0;
}
+void rpc_set_tcp_syncnt(struct rpc_context *rpc, int v)
+{
+ assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
+ rpc->tcp_syncnt = v;
+}
+
static int rpc_connect_sockaddr_async(struct rpc_context *rpc, struct sockaddr_storage *s)
{
int socksize;
case AF_INET:
socksize = sizeof(struct sockaddr_in);
rpc->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+#ifdef HAVE_NETINET_TCP_H
+ if (rpc->tcp_syncnt != RPC_PARAM_UNDEFINED) {
+ set_tcp_sockopt(rpc->fd, TCP_SYNCNT, rpc->tcp_syncnt);
+ }
+#endif
break;
default:
rpc_set_error(rpc, "Can not handle AF_FAMILY:%d", s->ss_family);