- if (r < qu->querylen+2) {
- newopbufused= qu->opbufused + qu->querylen + 2 - r;
- if (newopbufused > ads->opbufavail) {
- newopbufavail= ads->newopbufused<<1;
- newopbuf= realloc(newopbufavail);
- if (!newopbuf) {
- DLIST_UNLINK(ads->timew,qu);
- query_fail(ads,qu,adns_s_nolocalmem);
- return;
- }
- ads->opbuf= newopbuf;
- ads->opbufavail= newopbufavail;
- }
- if (r<2) {
- memcpy(ads->opbuf+ads->opbufused,length+r,2-r);
- ads->opbufused += (2-r);
- r= 0;
- } else {
- r -= 2;
- }
- memcpy(ads->opbuf+ads->opbufused,qu->querymsg+r,qu->querylen-r);
- ads->opbufused= newopbufused;
- }
+ r= gettimeofday(&now,0); if (r) return errno;
+ id= 0;
+
+ adns__vbuf_init(&vb);
+
+ ol= strlen(owner);
+ if (ol<=1 || ol>DNS_MAXDOMAIN+1) { stat= adns_s_domaintoolong; goto xit; }
+
+ if (owner[ol-1]=='.' && owner[ol-2]!='\\') { flags &= ~adns_qf_search; ol--; }
+
+ stat= adns__mkquery(ads,&vb,&id, owner,ol, typei,flags);
+
+ xit:
+ return adns__internal_submit(ads,query_r, typei,&vb,id, flags,now, stat,&ctx);
+}
+
+int adns_synchronous(adns_state ads,
+ const char *owner,
+ adns_rrtype type,
+ adns_queryflags flags,
+ adns_answer **answer_r) {
+ adns_query qu;
+ int r;
+
+ r= adns_submit(ads,owner,type,flags,0,&qu);
+ if (r) return r;
+
+ r= adns_wait(ads,&qu,answer_r,0);
+ if (r) adns_cancel(qu);
+
+ return r;
+}
+
+static void *alloc_common(adns_query qu, size_t sz) {
+ allocnode *an;
+
+ if (!sz) return qu; /* Any old pointer will do */
+ assert(!qu->final_allocspace);
+ an= malloc(MEM_ROUND(MEM_ROUND(sizeof(*an)) + sz));
+ if (!an) return 0;
+ LIST_LINK_TAIL(qu->allocations,an);
+ return (byte*)an + MEM_ROUND(sizeof(*an));
+}
+
+void *adns__alloc_interim(adns_query qu, size_t sz) {
+ sz= MEM_ROUND(sz);
+ qu->interim_allocd += sz;
+ return alloc_common(qu,sz);
+}
+
+void *adns__alloc_mine(adns_query qu, size_t sz) {
+ return alloc_common(qu,MEM_ROUND(sz));