3 #include "adns-internal.h"
5 static adns_query
allocquery(adns_state ads
, const char *owner
, int ol
,
6 int qml
, int id
, adns_rrtype type
,
7 adns_queryflags flags
, void *context
) {
11 qu
= malloc(sizeof(*qu
)+ol
+1+qml
); if (!qu
) return 0;
12 qu
->next
= qu
->back
= qu
->parent
= 0;
13 qu
->children
.head
= qu
->children
.tail
= 0;
14 qu
->siblings
.next
= qu
->siblings
.back
= 0;
21 qu
->sentudp
= qu
->senttcp
= 0;
23 memcpy(qu
->owner
,owner
,ol
); qu
->owner
[ol
]= 0;
24 qu
->querymsg
= qm
= qu
->owner
+ol
+1;
25 memcpy(qm
,ads
->qbuf
,qml
);
30 static int failsubmit(adns_state ads
, void *context
, adns_query
*query_r
,
31 adns_rrtype type
, adns_queryflags flags
,
32 int id
, adns_status stat
) {
35 qu
= allocquery(ads
,0,0,0,id
,type
,flags
,context
); if (!qu
) return errno
;
36 query_fail(ads
,qu
,stat
);
41 int adns_submit(adns_state ads
,
44 adns_queryflags flags
,
46 adns_query
*query_r
) {
54 if (ol
<=1 || ol
>MAXDNAME
+1)
55 return failsubmit(ads
,context
,query_r
,type
,flags
,id
,adns_s_invaliddomain
);
56 if (owner
[ol
-1]=='.' && owner
[ol
-2]!='\\') { flags
&= ~adns_f_search
; ol
--; }
58 stat
= mkquery(ads
,owner
,ol
,id
,type
,flags
,&qml
);
59 if (stat
) return failsubmit(ads
,context
,query_r
,type
,flags
,id
,stat
);
61 qu
= allocquery(ads
,owner
,ol
,qml
,id
,type
,flags
,context
); if (!qu
) return errno
;
62 if (qu
->flags
& adns_f_usevc
) qu
->udpretries
= -1;
63 LIST_LINK_TAIL(ads
->tosend
,qu
);
65 r
= gettimeofday(&now
,0); if (r
) return;
66 quproc_tosend(ads
,qu
,now
);
73 int adns_synchronous(adns_state ads
,
76 adns_queryflags flags
,
77 adns_answer
**answer_r
) {
81 r
= adns_submit(ads
,owner
,type
,flags
,0,&qu
);
85 r
= adns_wait(ads
,&qu
,answer_r
,0);
87 if (r
) adns_cancel(ads
,qu
);
91 void adns_cancel(adns_state ads
, adns_query query
) {