* resolv/res_send.c (send_dg): Create sockets with non-blocking
authorUlrich Drepper <drepper@redhat.com>
Tue, 2 Dec 2008 06:21:18 +0000 (06:21 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 2 Dec 2008 06:21:18 +0000 (06:21 +0000)
flag already set.

ChangeLog
resolv/res_send.c

index 153f552..776adcf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2008-12-01  Ulrich Drepper  <drepper@redhat.com>
 
+       * resolv/res_send.c (send_dg): Create sockets with non-blocking
+       flag already set.
+
        * stdlib/setenv.c (unsetenv): Don't search environment if it does
        not exist.
        * stdlib/Makefile (tests): Add tst-unsetenv1.
index ac5cc0b..ce4c11f 100644 (file)
@@ -95,6 +95,7 @@ static const char rcsid[] = "$BINDId: res_send.c,v 8.38 2000/03/30 20:16:51 vixi
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <kernel-features.h>
 
 #if PACKETSZ > 65536
 #define MAXPACKET       PACKETSZ
@@ -103,6 +104,13 @@ static const char rcsid[] = "$BINDId: res_send.c,v 8.38 2000/03/30 20:16:51 vixi
 #endif
 
 
+#ifndef __ASSUME_O_CLOEXEC
+static int __have_o_nonblock;
+#else
+# define __have_o_nonblock 0
+#endif
+
+
 /* From ev_streams.c.  */
 
 static inline void
@@ -920,8 +928,20 @@ send_dg(res_state statp,
        if (EXT(statp).nssocks[ns] == -1) {
                /* only try IPv6 if IPv6 NS and if not failed before */
                if ((EXT(statp).nscount6 > 0) && !statp->ipv6_unavail) {
-                       EXT(statp).nssocks[ns] =
-                           socket(PF_INET6, SOCK_DGRAM, 0);
+                       if (__have_o_nonblock >= 0) {
+                               EXT(statp).nssocks[ns] =
+                                 socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK,
+                                        0);
+#ifndef __ASSUME_O_CLOEXEC
+                               if (__have_o_nonblock == 0)
+                                       __have_o_nonblock
+                                         = (EXT(statp).nssocks[ns] == -1
+                                            && errno == EINVAL ? -1 : 1);
+#endif
+                       }
+                       if (__have_o_nonblock < 0)
+                               EXT(statp).nssocks[ns] =
+                                 socket(PF_INET6, SOCK_DGRAM, 0);
                        if (EXT(statp).nssocks[ns] < 0)
                            statp->ipv6_unavail = errno == EAFNOSUPPORT;
                        /* If IPv6 socket and nsap is IPv4, make it
@@ -929,8 +949,22 @@ send_dg(res_state statp,
                        else if (nsap->sin6_family == AF_INET)
                            convaddr4to6(nsap);
                }
-               if (EXT(statp).nssocks[ns] < 0)
-                       EXT(statp).nssocks[ns] = socket(PF_INET, SOCK_DGRAM, 0);
+               if (EXT(statp).nssocks[ns] < 0) {
+                       if (__have_o_nonblock >= 0) {
+                               EXT(statp).nssocks[ns]
+                                 = socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK,
+                                          0);
+#ifndef __ASSUME_O_CLOEXEC
+                               if (__have_o_nonblock == 0)
+                                       __have_o_nonblock
+                                         = (EXT(statp).nssocks[ns] == -1
+                                            && errno == EINVAL ? -1 : 1);
+#endif
+                       }
+                       if (__have_o_nonblock < 0)
+                               EXT(statp).nssocks[ns]
+                                 = socket(PF_INET, SOCK_DGRAM, 0);
+               }
                if (EXT(statp).nssocks[ns] < 0) {
                        *terrno = errno;
                        Perror(statp, stderr, "socket(dg)", errno);
@@ -955,13 +989,15 @@ send_dg(res_state statp,
                        __res_iclose(statp, false);
                        return (0);
                }
-               /* Make socket non-blocking.  */
-               int fl = __fcntl (EXT(statp).nssocks[ns], F_GETFL);
-               if  (fl != -1)
-                       __fcntl (EXT(statp).nssocks[ns], F_SETFL,
-                                fl | O_NONBLOCK);
-               Dprint(statp->options & RES_DEBUG,
-                      (stdout, ";; new DG socket\n"))
+               if (__have_o_nonblock < 0) {
+                       /* Make socket non-blocking.  */
+                       int fl = __fcntl (EXT(statp).nssocks[ns], F_GETFL);
+                       if  (fl != -1)
+                               __fcntl (EXT(statp).nssocks[ns], F_SETFL,
+                                        fl | O_NONBLOCK);
+                       Dprint(statp->options & RES_DEBUG,
+                              (stdout, ";; new DG socket\n"))
+               }
        }
 
        /*