#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
+#include <string.h>
#include <sys/time.h>
qu->udpnextserver= 0;
qu->udpsent= qu->tcpfailed= 0;
timerclear(&qu->timeout);
- memcpy(&qu->context,ctx,sizeof(qu->context));
+ memcpy(&qu->ctx,ctx,sizeof(qu->ctx));
qu->answer->status= adns_s_ok;
qu->answer->cname= 0;
if (!typei) return adns_s_notimplemented;
ctx.ext= context;
+ ctx.callback= 0;
+ memset(&ctx.info,0,sizeof(ctx.info));
+
r= gettimeofday(&now,0); if (r) return errno;
id= 0;
return rp;
}
+static void cancel_children(adns_query qu) {
+ adns_query cqu, ncqu;
+
+ for (cqu= qu->children.head; cqu; cqu= ncqu) {
+ ncqu= cqu->siblings.next;
+ adns_cancel(cqu);
+ }
+ LIST_INIT(qu->children);
+}
+
void adns__reset_cnameonly(adns_query qu) {
- /* fixme: cancel children */
assert(!qu->final_allocspace);
+ cancel_children(qu);
qu->answer->nrrs= 0;
qu->answer->rrs= 0;
qu->interim_allocd= qu->answer->cname ? MEM_ROUND(strlen(qu->answer->cname)+1) : 0;
static void free_query_allocs(adns_query qu) {
allocnode *an, *ann;
- adns_query cqu, ncqu;
- for (cqu= qu->children.head; cqu; cqu= ncqu) {
- ncqu= cqu->siblings.next;
- adns_cancel(cqu);
- }
+ cancel_children(qu);
for (an= qu->allocations.head; an; an= ann) { ann= an->next; free(an); }
adns__vbuf_free(&qu->vb);
}
parent= qu->parent;
if (parent) {
LIST_UNLINK_PART(parent->children,qu,siblings.);
- qu->context.intern.callback(parent,qu);
+ qu->ctx.callback(parent,qu);
free_query_allocs(qu);
free(qu);
- if (!parent->children.head) adns__query_done(parent);
} else {
makefinal_query(qu);
LIST_LINK_TAIL(qu->ads->output,qu);