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));