- if (qu->answer->status == adns_s_nolocalmem && !qu->interim_allocd) {
- ans= qu->answer;
- } else {
- ans= realloc(qu->answer,
- MEM_ROUND(MEM_ROUND(sizeof(*ans)) + qu->interim_allocd));
- if (!ans) {
- qu->answer->cname= 0;
- adns__query_fail(qu, adns_s_nolocalmem);
- return;
- }
+ cancel_children(qu);
+ for (an= qu->allocations.head; an; an= ann) { ann= an->next; free(an); }
+ adns__vbuf_free(&qu->vb);
+}
+
+void adns_cancel(adns_query qu) {
+ switch (qu->state) {
+ case query_udp: case query_tcpwait: case query_tcpsent:
+ LIST_UNLINK(qu->ads->timew,qu);
+ break;
+ case query_child:
+ LIST_UNLINK(qu->ads->childw,qu);
+ break;
+ case query_done:
+ LIST_UNLINK(qu->ads->output,qu);
+ break;
+ default:
+ abort();
+ }
+ free_query_allocs(qu);
+ free(qu->answer);
+ free(qu);
+}
+
+void adns__update_expires(adns_query qu, unsigned long ttl, struct timeval now) {
+ time_t max;
+
+ assert(ttl <= MAXTTLBELIEVE);
+ max= now.tv_sec + ttl;
+ if (qu->expires < max) return;
+ qu->expires= max;
+}
+
+static void makefinal_query(adns_query qu) {
+ adns_answer *ans;
+ int rrn;
+
+ ans= qu->answer;
+
+ if (qu->interim_allocd) {
+ ans= realloc(qu->answer, MEM_ROUND(MEM_ROUND(sizeof(*ans)) + qu->interim_allocd));
+ if (!ans) goto x_nomem;