+ adns_query cqu, ncqu;
+
+ for (cqu= qu->children.head; cqu; cqu= ncqu) {
+ ncqu= cqu->siblings.next;
+ adns_cancel(cqu);
+ }
+ for (an= qu->allocations; an; an= ann) { ann= an->next; free(an); }
+ adns__vbuf_free(&qu->vb);
+}
+
+void adns_cancel(adns_query query) {
+ switch (qu->state) {
+ case query_udp: case query_tcpwait: case query_tcpsent:
+ LIST_UNLINK(ads->timew,qu);
+ break;
+ case query_child:
+ LIST_UNLINK(ads->childw,qu);
+ break;
+ case query_done:
+ LIST_UNLINK(ads->output,qu);
+ break;
+ default:
+ abort();
+ }
+ free_query_allocs(qu);
+ free(qu->answer);
+ free(qu);
+}
+
+void adns__query_done(adns_query qu) {
+ adns_answer *ans;
+ int rrn;