diff --git a/headers/posix/resolv.h b/headers/posix/resolv.h index 2b1b569b1f..bb600068d1 100644 --- a/headers/posix/resolv.h +++ b/headers/posix/resolv.h @@ -238,6 +238,7 @@ union res_sockaddr_union { #define RES_NOTLDQUERY 0x00100000 /* don't unqualified name as a tld */ #define RES_USE_DNSSEC 0x00200000 /* use DNSSEC using OK bit in OPT */ /* #define RES_DEBUG2 0x00400000 */ /* nslookup internal */ +#define RES_USE_INET4 0x00800000 /* use IPv4 in gethostbyname() */ /* KAME extensions: use higher bit to avoid conflict with ISC use */ #define RES_USE_DNAME 0x10000000 /* use DNAME */ #define RES_USE_EDNS0 0x40000000 /* use EDNS0 if configured */ diff --git a/src/kits/network/libbind/irs/getaddrinfo.c b/src/kits/network/libbind/irs/getaddrinfo.c index 1839ba48e1..b95e6cd21c 100644 --- a/src/kits/network/libbind/irs/getaddrinfo.c +++ b/src/kits/network/libbind/irs/getaddrinfo.c @@ -328,6 +328,7 @@ getaddrinfo(hostname, servname, hints, res) struct addrinfo ai, ai0, *afai = NULL; struct addrinfo *pai; const struct explore *ex; + struct net_data *net_data; memset(&sentinel, 0, sizeof(sentinel)); cur = &sentinel; @@ -501,6 +502,11 @@ getaddrinfo(hostname, servname, hints, res) if (hostname == NULL) SETERROR(EAI_NONAME); + /* init after numeric lookups to avoid recursion in resolv.conf */ + net_data = init(); + if ((net_data->res->options & RES_USE_INET4) && ai0.ai_family == PF_UNSPEC) + ai0.ai_family = PF_INET; + /* * hostname as alphabetical name. * We'll make sure that diff --git a/src/kits/network/libbind/resolv/res_debug.c b/src/kits/network/libbind/resolv/res_debug.c index 8446bbbe4e..3e1d2c687c 100644 --- a/src/kits/network/libbind/resolv/res_debug.c +++ b/src/kits/network/libbind/resolv/res_debug.c @@ -680,6 +680,7 @@ p_option(u_long option) { case RES_INSECURE2: return "insecure2"; case RES_NOALIASES: return "noaliases"; case RES_USE_INET6: return "inet6"; + case RES_USE_INET4: return "inet4"; #ifdef RES_USE_EDNS0 /*%< KAME extension */ case RES_USE_EDNS0: return "edns0"; case RES_NSID: return "nsid"; diff --git a/src/kits/network/libbind/resolv/res_init.c b/src/kits/network/libbind/resolv/res_init.c index b96d8517ce..213e8d9001 100644 --- a/src/kits/network/libbind/resolv/res_init.c +++ b/src/kits/network/libbind/resolv/res_init.c @@ -594,6 +594,8 @@ res_setoptions(res_state statp, const char *options, const char *source) statp->options |= RES_NOTLDQUERY; } else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) { statp->options |= RES_USE_INET6; + } else if (!strncmp(cp, "inet4", sizeof("inet4") - 1)) { + statp->options |= RES_USE_INET4; } else if (!strncmp(cp, "rotate", sizeof("rotate") - 1)) { statp->options |= RES_ROTATE; } else if (!strncmp(cp, "no-check-names",