chiark / gitweb /
src/types.c (icb_hostaddr): Report correct output status and address count.
[adns] / src / types.c
index 582ddb58bdab3da6ff77830ba5348da6c84a0047..66415a3941c0485ff32603a9782915e60fd769be 100644 (file)
@@ -485,9 +485,21 @@ static void addr_rrtypes(adns_state ads, adns_rrtype type,
 {
   size_t n = 0;
   adns_rrtype qtf = type & adns__qtf_deref;
+  adns_queryflags permitaf = 0, hackaf = 0;
 
   if (!(type & adns__qtf_bigaddr) || !(type & adns__qtf_manyaf))
     qf = (qf & adns__qf_afmask) | adns_qf_ipv4_only;
+  else if (ads->iflags & adns_if_afmask) {
+    if (ads->iflags & adns_if_af_v4only) {
+      permitaf |= adns_qf_ipv4_only;
+      hackaf |= adns_qf_domapv4;
+    }
+    if (ads->iflags & adns_if_af_v6only)
+      permitaf |= adns_qf_ipv6_only;
+    if (qf & permitaf)
+      qf &= hackaf | permitaf | ~adns__qf_afmask;
+  }
+
 
   if (qf & adns_qf_ipv4_only) rrty[n++] = adns_r_a | qtf;
   if (qf & adns_qf_ipv6_only) rrty[n++] = adns_r_aaaa | qtf;
@@ -842,7 +854,6 @@ static void icb_hostaddr(adns_query parent, adns_query child) {
   size_t addrsz = addr_rrsz(parent);
 
   st= cans->status == adns_s_nodata ? adns_s_ok : cans->status;
-  rrp->astatus= st;
 
   if (st) goto done;
   assert(addrsz == cans->rrsz);
@@ -860,9 +871,10 @@ static void icb_hostaddr(adns_query parent, adns_query child) {
 done:
   if (st) {
     adns__free_interim(parent, rrp->addrs);
-    rrp->naddrs= (st>0 && st<=adns_s_max_tempfail) ? -1 : cans->nrrs;
+    rrp->naddrs= (st>0 && st<=adns_s_max_tempfail) ? -1 : 0;
   }
 
+  rrp->astatus= st;
   if (parent->children.head) {
     LIST_LINK_TAIL(ads->childw,parent);
   } else {