3 #include <arpa/nameser.h>
5 #include "adns-internal.h"
7 #define LIST_UNLINK(list,node) \
9 if ((node)->back) (node)->back->next= (node)->next; \
10 else (list).head= (node)->next; \
11 if ((node)->next) (node)->next->back= (node)->back; \
12 else (list).tail= (node)->back; \
15 #define LIST_LINK_TAIL(list,node) \
18 (node)->next= (list).tail; \
19 if (list).tail (list).tail->back= (node); else (list).head= (node); \
20 (list).tail= (node); \
23 void addserver(adns_state ads
, struct in_addr addr
) {
24 if (ads
->nservers
>=MAXSERVERS
) {
25 if (ads
->flags
& adns_if_debug
)
26 fprintf(stderr
,"adns: too many nameservers, ignoring %s",
29 ads
->servers
[ads
->nservers
].addr
= addr
;
30 ads
->servers
[ads
->nservers
].tcpsocket
= -1;
35 void readconfig(adns_state ads
, const char *filename
) {
38 void readconfigenv(adns_state ads
, const char *envvar
) {
41 if (flags
& adns_if_noenv
) return;
42 filename
= getenv(envvar
); if (!filename
) return;
43 readconfig(ads
,filename
);
46 int adns_init(adns_state
*ads_r
, int flags
) {
50 ads
= malloc(sizeof(*ads
)); if (!ads
) return errno
;
51 ads
->queue
.head
= ads
->queue
.tail
= 0;
52 ads
->timew
.head
= ads
->timew
.tail
= 0;
53 ads
->child
.head
= ads
->child
.tail
= 0;
54 ads
->ready
.head
= ads
->ready
.tail
= 0;
58 ads
->tcpbufavail
= ads
->tcpbufused
= ads
->tcpbufdone
= 0;
63 readconfig(ads
,"/etc/resolv.conf");
64 readconfigenv(ads
,"RES_CONF");
65 readconfigenv(ads
,"ADNS_RES_CONF");
67 if (ads
->flags
& adns_if_debug
)
68 fprintf(stderr
,"adns: no nameservers, using localhost\n");
69 addserver(ads
,INADDR_LOOPBACK
);
76 void query_fail(adns_state ads
, adns_query qu
, ands_status stat
) {
77 struct adns_answer ans
;
80 if (!ans
) ans
= malloc(sizeof(*qu
->answer
));
88 LIST_LINK_TAIL(ads
.ready
,qu
);
91 void adns_event(adns_state ads
,
92 fd_set
*readfds
, fd_set
*writefds
, fd_set
*exceptfds
,
93 int *maxfd
, struct timeval
*tv
) {
97 int adns_submit(adns_state ads
,
102 adns_query
*query_r
) {
109 if (ol
>MAXDNAME
+1) { stat
= ands_s_invaliddomain
; ol
= 0; }
110 if (ol
>0 && owner
[ol
-1]=='.') { flags
&= ~adns_f_search
; ol
--; }
111 qu
= malloc(sizeof(*qu
)+ol
+1); if (!qu
) return errno
;
112 qu
->next
= qu
->back
= qu
->parent
= qu
->child
= 0;
116 qu
->context
= context
;
119 memcpy(qu
->owner
,owner
,ol
); qu
->owner
[ol
]= 0;
121 query_fail(ads
,qu
,stat
);
123 LIST_LINK_TAIL(ads
->input
,qu
);
124 adns_event(ads
,0,0,0,0,0);