9 const char *fatal
= "pickdns: fatal: ";
10 const char *starting
= "starting pickdns\n";
12 static char seed
[128];
16 dns_random_init(seed
);
21 static char data
[512];
23 static int doit(char *q
,char qtype
[2],char ip
[4])
31 qlen
= dns_domain_length(q
);
32 if (qlen
> 255) return 0; /* impossible */
34 flaga
= byte_equal(qtype
,2,DNS_T_A
);
35 flagmx
= byte_equal(qtype
,2,DNS_T_MX
);
36 if (byte_equal(qtype
,2,DNS_T_ANY
)) flaga
= flagmx
= 1;
37 if (!flaga
&& !flagmx
) goto REFUSE
;
40 byte_copy(key
+ 1,4,ip
);
42 r
= cdb_find(&c
,key
,5);
43 if (!r
) r
= cdb_find(&c
,key
,4);
44 if (!r
) r
= cdb_find(&c
,key
,3);
45 if (!r
) r
= cdb_find(&c
,key
,2);
46 if (r
== -1) return 0;
50 if (r
&& (cdb_datalen(&c
) == 2))
51 if (cdb_read(&c
,key
+ 1,2,cdb_datapos(&c
)) == -1) return 0;
53 byte_copy(key
+ 3,qlen
,q
);
54 case_lowerb(key
+ 3,qlen
+ 3);
56 r
= cdb_find(&c
,key
,qlen
+ 3);
59 r
= cdb_find(&c
,key
,qlen
+ 3);
62 if (r
== -1) return 0;
63 dlen
= cdb_datalen(&c
);
65 if (dlen
> 512) dlen
= 512;
66 if (cdb_read(&c
,data
,dlen
,cdb_datapos(&c
)) == -1) return 0;
69 dns_sortip(data
,dlen
);
70 if (dlen
> 12) dlen
= 12;
73 if (!response_rstart(q
,DNS_T_A
,5)) return 0;
74 if (!response_addbytes(data
+ dlen
,4)) return 0;
75 response_rfinish(RESPONSE_ANSWER
);
89 int respond(char *q
,char qtype
[2],char ip
[4])
94 fd
= open_read("data.cdb");
95 if (fd
== -1) return 0;
97 result
= doit(q
,qtype
,ip
);