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