grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
grep "icky.icky.icky.ptang.zoop.boing.good. 1 IN A 192.0.2.1" dig.out.test$n > /dev/null || ret=1
sleep 1
-cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
-NS good.
-NS boing.good.
-NS zoop.boing.good.
-ADDR ns3.good.
-ADDR ns3.good.
+sort ans2/query.log > ans2/query.log.sorted
+cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1
ADDR a.bit.longer.ns.name.good.
ADDR a.bit.longer.ns.name.good.
+ADDR ns2.good.
+ADDR ns3.good.
+ADDR ns3.good.
+NS boing.good.
+NS good.
+NS zoop.boing.good.
__EOF
cat << __EOF | diff ans3/query.log - > /dev/null || ret=1
NS zoop.boing.good.
cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
NS bad.
NS boing.bad.
+ADDR ns2.bad.
__EOF
for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
if [ $ret != 0 ]; then echo_i "failed"; fi
grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
grep "icky.icky.icky.ptang.zoop.boing.bad. 1 IN A 192.0.2.1" dig.out.test$n > /dev/null || ret=1
sleep 1
-cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
-NS bad.
-NS boing.bad.
+sort ans2/query.log > ans2/query.log.sorted
+cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1
+ADDR a.bit.longer.ns.name.bad.
+ADDR a.bit.longer.ns.name.bad.
ADDR icky.icky.icky.ptang.zoop.boing.bad.
+ADDR ns2.bad.
ADDR ns3.bad.
ADDR ns3.bad.
-ADDR a.bit.longer.ns.name.bad.
-ADDR a.bit.longer.ns.name.bad.
+NS bad.
+NS boing.bad.
__EOF
echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | diff ans3/query.log - > /dev/null || ret=1
echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | diff ans4/query.log - > /dev/null || ret=1
$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.6 > dig.out.test$n
grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
sleep 1
-cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
-NS ugly.
+sort ans2/query.log > ans2/query.log.sorted
+cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1
+ADDR ns2.ugly.
NS boing.ugly.
NS boing.ugly.
+NS ugly.
__EOF
for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
if [ $ret != 0 ]; then echo_i "failed"; fi
grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
grep "icky.icky.icky.ptang.zoop.boing.ugly. 1 IN A 192.0.2.1" dig.out.test$n > /dev/null || ret=1
sleep 1
-cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
-NS ugly.
-NS boing.ugly.
-NS boing.ugly.
+sort ans2/query.log > ans2/query.log.sorted
+cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1
+ADDR a.bit.longer.ns.name.ugly.
+ADDR a.bit.longer.ns.name.ugly.
ADDR icky.icky.icky.ptang.zoop.boing.ugly.
+ADDR ns2.ugly.
ADDR ns3.ugly.
ADDR ns3.ugly.
-ADDR a.bit.longer.ns.name.ugly.
-ADDR a.bit.longer.ns.name.ugly.
+NS boing.ugly.
+NS boing.ugly.
+NS ugly.
__EOF
echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | diff ans3/query.log - > /dev/null || ret=1
echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | diff ans4/query.log - > /dev/null || ret=1
sleep 5
grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
grep "icky.icky.icky.ptang.zoop.boing.slow. 1 IN A 192.0.2.1" dig.out.test$n > /dev/null || ret=1
-cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
-NS slow.
-NS boing.slow.
-NS zoop.boing.slow.
-ADDR ns3.slow.
-ADDR ns3.slow.
+sort ans2/query.log > ans2/query.log.sorted
+cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1
ADDR a.bit.longer.ns.name.slow.
ADDR a.bit.longer.ns.name.slow.
+ADDR ns2.slow.
+ADDR ns3.slow.
+ADDR ns3.slow.
+NS boing.slow.
+NS slow.
+NS zoop.boing.slow.
__EOF
cat << __EOF | diff ans3/query.log - > /dev/null || ret=1
NS zoop.boing.slow.
grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
grep "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa. 1 IN PTR nee.com." dig.out.test$n > /dev/null || ret=1
sleep 1
-cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
+grep -v ADDR ans2/query.log > ans2/query.log.trimmed
+cat << __EOF | diff ans2/query.log.trimmed - > /dev/null || ret=1
NS 1.0.0.2.ip6.arpa.
NS 8.f.4.0.1.0.0.2.ip6.arpa.
NS 0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
grep "more.icky.icky.icky.ptang.zoop.boing.good. 1 IN A 192.0.2.2" dig.out.test$n > /dev/null || ret=1
sleep 1
-cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
-NS good.
-NS boing.good.
-NS zoop.boing.good.
-ADDR ns3.good.
-ADDR ns3.good.
+sort ans2/query.log > ans2/query.log.sorted
+cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1
ADDR a.bit.longer.ns.name.good.
ADDR a.bit.longer.ns.name.good.
+ADDR ns2.good.
+ADDR ns3.good.
+ADDR ns3.good.
+NS boing.good.
+NS good.
+NS zoop.boing.good.
__EOF
cat << __EOF | diff ans3/query.log - > /dev/null || ret=1
NS zoop.boing.good.
grep "a.bit.longer.ns.name.fwd. 1 IN A 10.53.0.4" dig.out.test$n >/dev/null || ret=1
sleep 1
cat << __EOF | diff ans2/query.log - > /dev/null || ret=1
-NS fwd.
-ADDR a.bit.longer.ns.name.good.
+ADDR a.bit.longer.ns.name.fwd.
__EOF
for ans in ans2; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
if [ $ret != 0 ]; then echo_i "failed"; fi
bool minimized;
unsigned int qmin_labels;
bool ip6arpaskip;
+ bool forwarding;
dns_name_t qminname;
dns_rdatatype_t qmintype;
dns_fetch_t * qminfetch;
if (UNMARKED(addrinfo)) {
addrinfo->flags |= FCTX_ADDRINFO_MARK;
fctx->find = NULL;
+ fctx->forwarding = true;
return (addrinfo);
}
}
/*
* No forwarders. Move to the next find.
*/
-
+ fctx->forwarding = false;
fctx->attributes |= FCTX_ATTR_TRIEDFIND;
find = fctx->find;
return;
}
- /*
- * We're minimizing and we're not yet at the final NS -
- * we need to launch a query for NS for 'upper' domain
- */
- if (fctx->minimized) {
- unsigned int options = fctx->options;
- options &= ~DNS_FETCHOPT_QMINIMIZE;
- fctx_increference(fctx);
- task = res->buckets[bucketnum].task;
- result = dns_resolver_createfetch(fctx->res, &fctx->qminname,
- fctx->qmintype, &fctx->domain,
- &fctx->nameservers, NULL, NULL, 0,
- options, 0, fctx->qc, task,
- resume_qmin, fctx,
- &fctx->qminrrset, NULL,
- &fctx->qminfetch);
- if (result != ISC_R_SUCCESS) {
- LOCK(&fctx->res->buckets[fctx->bucketnum].lock);
- RUNTIME_CHECK(!fctx_decreference(fctx));
- UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock);
- fctx_done(fctx, DNS_R_SERVFAIL, __LINE__);
- }
- return;
- }
-
addrinfo = fctx_nextaddress(fctx);
/* Try to find an address that isn't over quota */
return;
}
}
+ /*
+ * We're minimizing and we're not yet at the final NS -
+ * we need to launch a query for NS for 'upper' domain
+ */
+ if (fctx->minimized && !fctx->forwarding) {
+ unsigned int options = fctx->options;
+ options &= ~DNS_FETCHOPT_QMINIMIZE;
+ fctx_increference(fctx);
+ task = res->buckets[bucketnum].task;
+ result = dns_resolver_createfetch(fctx->res, &fctx->qminname,
+ fctx->qmintype, &fctx->domain,
+ &fctx->nameservers, NULL, NULL, 0,
+ options, 0, fctx->qc, task,
+ resume_qmin, fctx,
+ &fctx->qminrrset, NULL,
+ &fctx->qminfetch);
+ if (result != ISC_R_SUCCESS) {
+ LOCK(&fctx->res->buckets[fctx->bucketnum].lock);
+ RUNTIME_CHECK(!fctx_decreference(fctx));
+ UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock);
+ fctx_done(fctx, DNS_R_SERVFAIL, __LINE__);
+ }
+ return;
+ }
if (dns_name_countlabels(&fctx->domain) > 2) {
result = isc_counter_increment(fctx->qc);
fctx->depth = depth;
fctx->minimized = false;
fctx->ip6arpaskip = false;
+ fctx->forwarding = false;
fctx->qmin_labels = 1;
fctx->qminfetch = NULL;
dns_rdataset_init(&fctx->qminrrset);