From 251209bd6f6e66ca9bcf28cd652d85d1cd729fdc Mon Sep 17 00:00:00 2001 From: Matthieu Patou Date: Wed, 2 Nov 2011 09:39:23 +0100 Subject: [PATCH] s4-resolver: make it work back with ipv4 only DNS records It turns out that if there is no AAAA record the dns server (bind and MS windows at least) do not return the A record when just asked for AAAA. Autobuild-User: Matthieu Patou Autobuild-Date: Wed Nov 2 11:15:34 CET 2011 on sn-devel-104 --- source4/libcli/resolve/dns_ex.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/source4/libcli/resolve/dns_ex.c b/source4/libcli/resolve/dns_ex.c index 60e9afda370..993ef43caab 100644 --- a/source4/libcli/resolve/dns_ex.c +++ b/source4/libcli/resolve/dns_ex.c @@ -178,29 +178,38 @@ static struct dns_records_container get_a_aaaa_records(TALLOC_CTX *mem_ctx, to avoid them in the parent */ reply = rk_dns_lookup(name, "AAAA"); - if (!reply) { - return ret; - } + count = count2 = 0; + + if (reply) { + + count = count_dns_rr(reply->head, rk_ns_t_aaaa); + count2 = count_dns_rr(reply->head, rk_ns_t_a); + + if (!count2) { + /* + * DNS server didn't returned A when asked for AAAA records. + * Most of the server do it, let's ask for A specificaly. + */ + reply2 = rk_dns_lookup(name, "A"); - count = count_dns_rr(reply->head, rk_ns_t_aaaa); - count2 = count_dns_rr(reply->head, rk_ns_t_a); + if (!reply2) { + return ret; + } - if (!count2) { - /* - * DNS server didn't returned A when asked for AAAA records. - * Most of the server do it, let's ask for A specificaly. - */ - reply2 = rk_dns_lookup(name, "A"); + count2 = count_dns_rr(reply2->head, rk_ns_t_a); + } else { + reply2 = NULL; + } + } else { - if (!reply2) { + reply = rk_dns_lookup(name, "A"); + if (!reply) { return ret; } - count2 = count_dns_rr(reply2->head, rk_ns_t_a); - } else { reply2 = NULL; + count = count_dns_rr(reply->head, rk_ns_t_a); } - count += count2; if (count == 0) { @@ -322,7 +331,7 @@ static struct dns_records_container get_srv_records(TALLOC_CTX *mem_ctx, addrs = talloc_realloc(mem_ctx, addrs, char*, total); for (j=0; j < c.count; j++) { - addrs[total - j] = talloc_steal(addrs, c.list[j]); + addrs[total - j - 1] = talloc_steal(addrs, c.list[j]); } } } -- 2.11.4.GIT