11 int adns__internal_submit(adns_state ads
, adns_query
*query_r
,
12 adns_rrtype type
, char *query_dgram
, int query_len
,
13 adns_queryflags flags
, struct timeval now
,
14 adns_status failstat
, const qcontext
*ctx
) {
15 /* Submits a query (for internal use, called during external submits).
17 * The new query is returned in *query_r, or we return adns_s_nomemory.
19 * The query datagram should already have been assembled; memory for it
20 * is taken over by this routine whether it succeeds or fails.
22 * If failstat is nonzero then if we are successful in creating the query
23 * it is immediately failed with code failstat (but _submit still succeds).
25 * ctx is copied byte-for-byte into the query.
31 const typeinfo
*typei
;
36 qu
= malloc(sizeof(*qu
)); if (!qu
) goto x_nomemory
;
37 qu
->answer
= malloc(sizeof(*qu
->answer
)); if (!qu
->answer
) goto x_freequ_nomemory
;
40 qu
->back
= qu
->next
= qu
->parent
= 0;
41 LIST_INIT(qu
->children
);
42 qu
->siblings
.next
= qu
->siblings
.back
= 0;
44 qu
->interim_allocd
= 0;
47 qu
->typei
= adns__findtype(type
);
48 qu
->query_dgram
= query_dgram
;
49 qu
->query_dglen
= query_dglen
;
50 adns__vbuf_init(&qu
->vb
);
53 qu
->cname_dglen
= qu
->cname_begin
= 0;
59 qu
->udpsent
= qu
->tcpfailed
= 0;
60 timerclear(&qu
->timeout
);
61 memcpy(&qu
->context
,ctx
,sizeof(qu
->context
));
62 memcpy(qu
->owner
,owner
,ol
); qu
->owner
[ol
]= 0;
64 qu
->answer
->status
= adns_s_ok
;
66 qu
->answer
->type
= type
;
73 qu
->answer
->rrsz
= qu
->rrsz
;
76 failstat
= adns_s_notimplemented
;
79 adns__query_fail(ads
,qu
,failstat
);
83 adns__query_udp(ads
,qu
,now
);
84 adns__autosys(ads
,now
);
92 return adns_s_nomemory
;
95 int adns_submit(adns_state ads
,
98 adns_queryflags flags
,
100 adns_query
*query_r
) {
104 r
= gettimeofday(&now
,0); if (r
) return errno
;
107 if (ol
<=1 || ol
>DNS_MAXDOMAIN
+1)
108 return failsubmit(ads
,context
,query_r
,flags
,id
,adns_s_invaliddomain
);
109 if (owner
[ol
-1]=='.' && owner
[ol
-2]!='\\') { flags
&= ~adns_qf_search
; ol
--; }
111 stat
= adns__mkquery(ads
,owner
,ol
,id
,typei
,flags
);
112 if (stat
) return failsubmit(ads
,context
,query_r
,flags
,id
,stat
);
114 adns__internal_submit(ads
,type
,flags
,now
,query_r
117 int adns_synchronous(adns_state ads
,
120 adns_queryflags flags
,
121 adns_answer
**answer_r
) {
125 r
= adns_submit(ads
,owner
,type
,flags
,0,&qu
);
129 r
= adns_wait(ads
,&qu
,answer_r
,0);
131 if (r
) adns_cancel(ads
,qu
);
135 void adns_cancel(adns_state ads
, adns_query query
) {
139 void *adns__alloc_interim(adns_state ads
, adns_query qu
, size_t sz
) {
143 an
= malloc(MEM_ROUND(MEM_ROUND(sizeof(*an
)) + sz
));
145 adns__query_fail(ads
,qu
,adns_s_nolocalmem
);
148 qu
->permalloclen
+= sz
;
149 an
->next
= qu
->allocations
;
151 return (byte
*)an
+ MEM_ROUND(sizeof(*an
));