]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* nscd/nscd_helper.c (open_socket): Use SOCK_CLOEXEC and
authorUlrich Drepper <drepper@redhat.com>
Fri, 25 Jul 2008 18:31:07 +0000 (18:31 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 25 Jul 2008 18:31:07 +0000 (18:31 +0000)
SOCK_NONBLOCK if possible.

ChangeLog
nscd/nscd_helper.c

index 5c962f0af46f7d6a8a221bce54e7a50beaf69420..98775ce1027b89ebc40998f62b9eec541556226c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2008-07-25  Ulrich Drepper  <drepper@redhat.com>
 
+       * nscd/nscd_helper.c (open_socket): Use SOCK_CLOEXEC and
+       SOCK_NONBLOCK if possible.
+
        * sysdeps/unix/sysv/linux/opensock.c (__opensock): Use
        SOCK_CLOEXEC if available.
 
index 9828a46df03cf7a5764039955d208cb021d26cb6..7db5d098456bd6b3e84cf18623a4c1d62173419b 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;