(open_socket): Use SOCK_CLOEXEC and SOCK_NONBLOCK if possible.
authordrepper <drepper>
Fri, 25 Jul 2008 18:30:54 +0000 (18:30 +0000)
committerdrepper <drepper>
Fri, 25 Jul 2008 18:30:54 +0000 (18:30 +0000)
nscd/nscd_helper.c

index 9828a46..7db5d09 100644 (file)
@@ -33,6 +33,7 @@
 #include <sys/un.h>
 #include <not-cancel.h>
 #include <nis/rpcsvc/nis.h>
+#include <kernel-features.h>
 
 #include "nscd-client.h"
 
@@ -161,7 +162,26 @@ __readvall (int fd, const struct iovec *iov, int iovcnt)
 static int
 open_socket (request_type type, const char *key, size_t keylen)
 {
-  int sock = __socket (PF_UNIX, SOCK_STREAM, 0);
+  int sock;
+
+#ifdef SOCK_CLOEXEC
+# ifndef __ASSUME_SOCK_CLOEXEC
+  if (__have_sock_cloexec >= 0)
+# endif
+    {
+      sock = __socket (PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
+# ifndef __ASSUME_SOCK_CLOEXEC
+      if (__have_sock_cloexec == 0)
+       __have_sock_cloexec = sock != -1 || errno != EINVAL ? 1 : -1;
+# endif
+    }
+#endif
+#ifndef __ASSUME_SOCK_CLOEXEC
+# ifdef SOCK_CLOEXEC
+  if (__have_sock_cloexec < 0)
+# endif
+    sock = __socket (PF_UNIX, SOCK_STREAM, 0);
+#endif
   if (sock < 0)
     return -1;
 
@@ -172,8 +192,13 @@ open_socket (request_type type, const char *key, size_t keylen)
   } reqdata;
   size_t real_sizeof_reqdata = sizeof (request_header) + keylen;
 
-  /* Make socket non-blocking.  */
-  __fcntl (sock, F_SETFL, O_RDWR | O_NONBLOCK);
+#ifndef __ASSUME_SOCK_CLOEXEC
+# ifdef SOCK_NONBLOCK
+  if (__have_sock_cloexec < 0)
+# endif
+    /* Make socket non-blocking.  */
+    __fcntl (sock, F_SETFL, O_RDWR | O_NONBLOCK);
+#endif
 
   struct sockaddr_un sun;
   sun.sun_family = AF_UNIX;