+ 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;
+}
+
+int adns_submit_reverse(adns_state ads,
+ const struct sockaddr *addr,
+ adns_rrtype type,
+ adns_queryflags flags,
+ void *context,
+ adns_query *query_r) {
+ const unsigned char *iaddr;
+ char buf[30];
+
+ if (type != adns_r_ptr && type != adns_r_ptr_raw) return EINVAL;
+ flags &= ~adns_qf_search;