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;