Fix error messages/unlimited CPU utilization.
[m6w6/libmemcached] / libmemcached / connect.cc
index 34e72f76b34231f520b8c170933a9df57f44adf2..8e8092c860cc29c95f8499a050cd365d95e72bc3 100644 (file)
 #include <ctime>
 #include <sys/time.h>
 
+#ifndef SOCK_CLOEXEC 
+#define SOCK_CLOEXEC 0
+#endif
+
 static memcached_return_t connect_poll(memcached_server_st *server)
 {
   struct pollfd fds[1];
@@ -451,13 +455,30 @@ static memcached_return_t network_connect(memcached_server_st *server)
       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 */