+ if (ol>=1 && owner[ol-1]=='.' && (ol<2 || owner[ol-2]!='\\')) {
+ flags &= ~adns_qf_search;
+ qu->flags= flags;
+ ol--;
+ }
+
+ if (flags & adns_qf_search) {
+ r= adns__vbuf_append(&qu->search_vb,owner,ol);
+ if (!r) { stat= adns_s_nomemory; goto x_adnsfail; }
+
+ for (ndots=0, p=owner; (p= strchr(p,'.')); p++, ndots++);
+ qu->search_doneabs= (ndots >= ads->searchndots) ? -1 : 0;
+ qu->search_origlen= ol;
+ adns__search_next(ads,qu,now);
+ } else {
+ if (flags & adns_qf_owner) {
+ if (!save_owner(qu,owner,ol)) { stat= adns_s_nomemory; goto x_adnsfail; }
+ }
+ query_simple(ads,qu, owner,ol, typei,flags, now);
+ }
+ adns__autosys(ads,now);
+ adns__consistency(ads,qu,cc_entex);
+ return 0;
+
+ x_adnsfail:
+ adns__query_fail(qu,stat);
+ adns__consistency(ads,qu,cc_entex);
+ return 0;
+
+ x_errno:
+ r= errno;
+ assert(r);
+ adns__consistency(ads,0,cc_entex);
+ return r;
+}
+
+static const char *default_zone = "<magic>";
+
+int adns_submit_reverse_any(adns_state ads,
+ const struct sockaddr *addr,
+ const char *zone,
+ adns_rrtype type,
+ adns_queryflags flags,
+ void *context,
+ adns_query *query_r) {
+ char *buf, *buf_free, *p;
+ char shortbuf[100];
+ const afinfo *ai;
+ int r, lreq;
+
+ flags &= ~adns_qf_search;
+
+ switch (addr->sa_family) {
+ case AF_INET:
+ ai = &adns__inet_afinfo;
+ if (zone == default_zone) zone = "in-addr.arpa";
+ break;
+ case AF_INET6:
+ ai = &adns__inet6_afinfo;
+ if (zone == default_zone) zone = "ip6.arpa";
+ break;
+ default:
+ return ENOSYS;
+ }
+
+ lreq= strlen(zone) + ai->nrevcomp*(ai->revcompwd + 1) + 1;
+ if (lreq > sizeof(shortbuf)) {
+ buf= malloc(lreq);
+ if (!buf) return errno;
+ buf_free= buf;
+ } else {
+ buf= shortbuf;
+ buf_free= 0;
+ }
+
+ p = ai->rev_mkname(addr, buf);
+ *p++ = '.';
+ strcpy(p, zone);
+
+ r= adns_submit(ads,buf,type,flags,context,query_r);
+ free(buf_free);
+ return r;
+}