[haiku-commits] r40456 - haiku/trunk/src/kits/network/libbind/irs

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 12 Feb 2011 00:25:17 +0100 (CET)

Author: axeld
Date: 2011-02-12 00:25:17 +0100 (Sat, 12 Feb 2011)
New Revision: 40456
Changeset: http://dev.haiku-os.org/changeset/40456

Modified:
   haiku/trunk/src/kits/network/libbind/irs/dns_ho.c
Log:
* getaddrinfo() now detects at runtime if IPv6 is available, and will prefer
  IPv6 interfaces when AF_UNSPEC is set.


Modified: haiku/trunk/src/kits/network/libbind/irs/dns_ho.c
===================================================================
--- haiku/trunk/src/kits/network/libbind/irs/dns_ho.c   2011-02-11 23:04:25 UTC 
(rev 40455)
+++ haiku/trunk/src/kits/network/libbind/irs/dns_ho.c   2011-02-11 23:25:17 UTC 
(rev 40456)
@@ -75,6 +75,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <syslog.h>
+#include <unistd.h>
 
 #include <isc/memcluster.h>
 #include <irs.h>
@@ -545,6 +546,18 @@
        return (pvt->res);
 }
 
+static int
+ipv6_available(void)
+{
+       static int socket6;
+       if (socket6 == 0) {
+               socket6 = socket(AF_INET6, SOCK_DGRAM, 0);
+               if (socket6 >= 0)
+                       close(socket6);
+       }
+       return socket6 >= 0;
+}
+
 /* XXX */
 extern struct addrinfo *addr2addrinfo __P((const struct addrinfo *,
                                           const char *));
@@ -578,21 +591,22 @@
 
        switch (pai->ai_family) {
        case AF_UNSPEC:
-#if 0
-               /* prefer IPv6 */
-               q->qclass = C_IN;
-               q->qtype = T_AAAA;
-               q->answer = q->qbuf.buf;
-               q->anslen = sizeof(q->qbuf);
-               q->next = q2;
-               q->action = RESTGT_DOALWAYS;
-               q2->qclass = C_IN;
-               q2->qtype = T_A;
-               q2->answer = q2->qbuf.buf;
-               q2->anslen = sizeof(q2->qbuf);
-               q2->action = RESTGT_DOALWAYS;
-               break;
-#endif
+               if (ipv6_available()) {
+                       /* prefer IPv6 */
+                       q->qclass = C_IN;
+                       q->qtype = T_AAAA;
+                       q->answer = q->qbuf.buf;
+                       q->anslen = sizeof(q->qbuf);
+                       q->next = q2;
+                       q->action = RESTGT_DOALWAYS;
+                       q2->qclass = C_IN;
+                       q2->qtype = T_A;
+                       q2->answer = q2->qbuf.buf;
+                       q2->anslen = sizeof(q2->qbuf);
+                       q2->action = RESTGT_DOALWAYS;
+                       break;
+               }
+               // supposed to fall through
        case AF_INET:
                q->qclass = C_IN;
                q->qtype = T_A;


Other related posts:

  • » [haiku-commits] r40456 - haiku/trunk/src/kits/network/libbind/irs - axeld