17 static char data
[100 + IP4_FMT
];
19 static int doit(char *q
,char qtype
[2])
31 flaga
= byte_equal(qtype
,2,DNS_T_A
);
32 flagtxt
= byte_equal(qtype
,2,DNS_T_TXT
);
33 if (byte_equal(qtype
,2,DNS_T_ANY
)) flaga
= flagtxt
= 1;
34 if (!flaga
&& !flagtxt
) goto REFUSE
;
36 if (dd(q
,base
,reverseip
) != 4) goto REFUSE
;
37 uint32_unpack(reverseip
,&ipnum
);
38 uint32_pack_big(ip
,ipnum
);
40 for (i
= 0;i
<= 24;++i
) {
43 uint32_pack_big(key
,ipnum
);
45 r
= cdb_find(&c
,key
,5);
46 if (r
== -1) return 0;
49 if (!r
) { response_nxdomain(); return 1; }
51 r
= cdb_find(&c
,"",0);
52 if (r
== -1) return 0;
53 if (r
&& ((dlen
= cdb_datalen(&c
)) >= 4)) {
54 if (dlen
> 100) dlen
= 100;
55 if (cdb_read(&c
,data
,dlen
,cdb_datapos(&c
)) == -1) return 0;
59 byte_copy(data
,dlen
,"\177\0\0\2Listed $");
62 if ((dlen
>= 5) && (data
[dlen
- 1] == '$')) {
64 dlen
+= ip4_fmt(data
+ dlen
,ip
);
68 if (!response_rstart(q
,DNS_T_A
,2048)) return 0;
69 if (!response_addbytes(data
,4)) return 0;
70 response_rfinish(RESPONSE_ANSWER
);
73 if (!response_rstart(q
,DNS_T_TXT
,2048)) return 0;
75 if (!response_addbytes(&ch
,1)) return 0;
76 if (!response_addbytes(data
+ 4,dlen
- 4)) return 0;
77 response_rfinish(RESPONSE_ANSWER
);
90 int respond(char *q
,char qtype
[2],char ip
[4])
95 fd
= open_read("data.cdb");
96 if (fd
== -1) return 0;
98 result
= doit(q
,qtype
);
104 const char *fatal
= "rbldns: fatal: ";
105 const char *starting
= "starting rbldns\n";
107 void initialize(void)
113 strerr_die2x(111,fatal
,"$BASE not set");
114 if (!dns_domain_fromdot(&base
,x
,str_len(x
)))
115 strerr_die2x(111,fatal
,"unable to parse $BASE");