- ap= &pai->qu->ctx.info.ptr_parent_addr;
- if (!ap->ai) {
- adns__findlabel_start(&fls, pai->ads, -1, pai->qu,
- pai->qu->query_dgram, pai->qu->query_dglen,
- pai->qu->query_dglen, DNS_HDRSIZE, 0);
-
- f = (1 << n_ed) - 1; /* superposition of address types */
- for (i = 0;; i++) {
- st= adns__findlabel_next(&fls,&lablen,&labstart); assert(!st);
- if (lablen <= 0) break;
- for (j = 0; j < n_ed; j++) {
- if (!(f & (1 << j))) continue;
- if (i < expectdomain[j].ai->nrevcomp) {
- ac = expectdomain[j].ai->rev_parsecomp(
- pai->qu->query_dgram + labstart, lablen);
- if (ac < 0) goto mismatch;
- assert(i < sizeof(ipv[j]));
- ipv[j][i] = ac;
- } else {
- tp = expectdomain[j].tail[i - expectdomain[j].ai->nrevcomp];
- if (!tp ||
- strncmp(pai->qu->query_dgram + labstart, tp, lablen) != 0 ||
- tp[lablen] != 0)
- goto mismatch;
- }
- continue;
-
- mismatch:
- f &= ~(1 << j);
- if (!f) return adns_s_querydomainwrong;
- }
- }
-
- if (lablen < 0) return adns_s_querydomainwrong;
- for (j = 0; j < n_ed; j++) {
- if (!(f & (1 << j))) continue;
- if (i >= expectdomain[j].ai->nrevcomp &&
- !expectdomain[j].tail[i - expectdomain[j].ai->nrevcomp])
- { foundj = j; continue; }
- f &= ~(1 << j);
- if (!f) return adns_s_querydomainwrong;
- }
- assert(foundj >= 0 && f == (1 << foundj)); /* collapsed to a single type */
-
- ap->ai = expectdomain[foundj].ai;
- ap->ai->rev_mkaddr(&ap->addr, ipv[foundj]);
- }
-