#include <ctime>
#include <sys/time.h>
-static memcached_return_t connect_poll(memcached_server_st *server)
+#ifndef SOCK_CLOEXEC
+#define SOCK_CLOEXEC 0
+#endif
+
+static memcached_return_t connect_poll(memcached_instance_st *server)
{
struct pollfd fds[1];
fds[0].fd= server->fd;
return memcached_set_errno(*server, get_socket_errno(), MEMCACHED_AT);
}
-static memcached_return_t set_hostinfo(memcached_server_st *server)
+static memcached_return_t set_hostinfo(memcached_instance_st *server)
{
assert(server->type != MEMCACHED_CONNECTION_UNIX_SOCKET);
if (server->address_info)
return MEMCACHED_SUCCESS;
}
-static inline void set_socket_nonblocking(memcached_server_st *server)
+static inline void set_socket_nonblocking(memcached_instance_st *server)
{
#ifdef WIN32
u_long arg= 1;
#endif
}
-static void set_socket_options(memcached_server_st *server)
+static void set_socket_options(memcached_instance_st *server)
{
assert_msg(server->fd != INVALID_SOCKET, "invalid socket was passed to set_socket_options()");
set_socket_nonblocking(server);
}
-static memcached_return_t unix_socket_connect(memcached_server_st *server)
+static memcached_return_t unix_socket_connect(memcached_instance_st *server)
{
#ifndef WIN32
WATCHPOINT_ASSERT(server->fd == INVALID_SOCKET);
#endif
}
-static memcached_return_t network_connect(memcached_server_st *server)
+static memcached_return_t network_connect(memcached_instance_st *server)
{
bool timeout_error_occured= false;
continue;
}
+ int type= server->address_info_next->ai_socktype;
+ if (HAVE_SOCK_CLOEXEC)
+ {
+ type|= SOCK_CLOEXEC;
+ }
+
if ((server->fd= socket(server->address_info_next->ai_family,
- server->address_info_next->ai_socktype,
+ type,
server->address_info_next->ai_protocol)) < 0)
{
return memcached_set_errno(*server, get_socket_errno(), NULL);
}
+ if (HAVE_SOCK_CLOEXEC == 0)
+ {
+#ifdef FD_CLOEXEC
+ int rval;
+ do
+ {
+ rval= fcntl (server->fd, F_SETFD, FD_CLOEXEC);
+ } while (rval == -1 && (errno == EINTR or errno == EAGAIN));
+#endif
+ }
+
set_socket_options(server);
/* connect to server */
if (memcached_has_current_error(*server))
{
- return memcached_server_error_return(server);
+ return memcached_instance_error_return(server);
}
if (timeout_error_occured and server->state < MEMCACHED_SERVER_STATE_IN_PROGRESS)
if (memcached_has_current_error(*server))
{
memcached_mark_server_for_timeout(server);
- assert(memcached_failed(memcached_server_error_return(server)));
+ assert(memcached_failed(memcached_instance_error_return(server)));
}
else
{