Clean up SOCK_NONBLOCK
[awesomized/libmemcached] / libmemcached / connect.cc
index 5d180d185e0208004270c707887a51499e26b91b..65be51a07f9a2c509f7dba7bc6c11043e358bc1a 100644 (file)
 #include <sys/time.h>
 
 #ifndef SOCK_CLOEXEC 
-#define SOCK_CLOEXEC 0
+#  define SOCK_CLOEXEC 0
+#endif
+
+#ifndef SOCK_NONBLOCK 
+#  define SOCK_NONBLOCK 0
+#endif
+
+#ifndef FD_CLOEXEC
+# define FD_CLOEXEC 0
 #endif
 
 static memcached_return_t connect_poll(org::libmemcached::Instance* server)
@@ -245,28 +253,31 @@ static inline void set_socket_nonblocking(org::libmemcached::Instance* server)
 #else
   int flags;
 
-  do
-  {
-    flags= fcntl(server->fd, F_GETFL, 0);
-  } while (flags == -1 && (errno == EINTR || errno == EAGAIN));
-
-  if (flags == -1)
-  {
-    memcached_set_errno(*server, errno, NULL);
-  }
-  else if ((flags & O_NONBLOCK) == 0)
+  if (SOCK_NONBLOCK == 0)
   {
-    int rval;
-
     do
     {
-      rval= fcntl(server->fd, F_SETFL, flags | O_NONBLOCK);
-    } while (rval == -1 && (errno == EINTR or errno == EAGAIN));
+      flags= fcntl(server->fd, F_GETFL, 0);
+    } while (flags == -1 && (errno == EINTR || errno == EAGAIN));
 
-    if (rval == -1)
+    if (flags == -1)
     {
       memcached_set_errno(*server, errno, NULL);
     }
+    else if ((flags & O_NONBLOCK) == 0)
+    {
+      int rval;
+
+      do
+      {
+        rval= fcntl(server->fd, F_SETFL, flags | O_NONBLOCK);
+      } while (rval == -1 && (errno == EINTR or errno == EAGAIN));
+
+      if (rval == -1)
+      {
+        memcached_set_errno(*server, errno, NULL);
+      }
+    }
   }
 #endif
 }
@@ -386,7 +397,6 @@ static void set_socket_options(org::libmemcached::Instance* server)
     assert(error == 0);
   }
 
-
   /* libmemcached will always use nonblocking IO to avoid write deadlocks */
   set_socket_nonblocking(server);
 }
@@ -396,7 +406,18 @@ static memcached_return_t unix_socket_connect(org::libmemcached::Instance* serve
 #ifndef WIN32
   WATCHPOINT_ASSERT(server->fd == INVALID_SOCKET);
 
-  if ((server->fd= socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+  int type= SOCK_STREAM;
+  if (SOCK_CLOEXEC)
+  {
+    type|= SOCK_CLOEXEC;
+  }
+
+  if (SOCK_NONBLOCK)
+  {
+    type|= SOCK_NONBLOCK;
+  }
+
+  if ((server->fd= socket(AF_UNIX, type, 0)) < 0)
   {
     memcached_set_errno(*server, errno, NULL);
     return MEMCACHED_CONNECTION_FAILURE;
@@ -481,11 +502,16 @@ static memcached_return_t network_connect(org::libmemcached::Instance* server)
     }
 
     int type= server->address_info_next->ai_socktype;
-    if (HAVE_SOCK_CLOEXEC)
+    if (SOCK_CLOEXEC)
     {
       type|= SOCK_CLOEXEC;
     }
 
+    if (SOCK_NONBLOCK)
+    {
+      type|= SOCK_NONBLOCK;
+    }
+
     if ((server->fd= socket(server->address_info_next->ai_family,
                             type,
                             server->address_info_next->ai_protocol)) < 0)
@@ -493,15 +519,17 @@ static memcached_return_t network_connect(org::libmemcached::Instance* server)
       return memcached_set_errno(*server, get_socket_errno(), NULL);
     }
 
-    if (HAVE_SOCK_CLOEXEC == 0)
+    // If SOCK_CLOEXEC exists then we don't need to call the following
+    if (SOCK_CLOEXEC == 0)
     {
-#ifdef FD_CLOEXEC
-      int rval;
-      do
+      if (FD_CLOEXEC)
       {
-        rval= fcntl (server->fd, F_SETFD, FD_CLOEXEC);
-      } while (rval == -1 && (errno == EINTR or errno == EAGAIN));
-#endif
+        int rval;
+        do
+        {
+          rval= fcntl (server->fd, F_SETFD, FD_CLOEXEC);
+        } while (rval == -1 && (errno == EINTR or errno == EAGAIN));
+      }
     }
 
     set_socket_options(server);