djbdnscurve6 53
djbdnscurve6
Loading...
Searching...
No Matches
rbldns.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "str.h"
3#include "byte.h"
4#include "ip.h"
5#include "open.h"
6#include "env.h"
7#include "cdbread.h"
8#include "dns.h"
9#include "dd.h"
10#include "response.h"
11#include "logmsg.h"
12#include "uint_t.h"
13#include "scan.h"
14
15#define WHO "rbldns"
16
17const char *server = WHO;
18
19int flagcurved = 0;
20unsigned int flagedns0 = 0;
21unsigned int msgsize = MSGSIZE;
22
23static char *base;
24
25static struct cdb c;
26static char data[100 + IP6_FMT];
27
28static int doit(char *q,char qtype[2])
29{
30 int flaga;
31 int flaga4;
32 int flagtxt;
33 int flagip6;
34 char ch;
35 char reverseip4[4];
36 char reverseip6[16];
37 char ip4[4];
38 char ip5[16]; /* aehm */
39 char ip6[16];
40 uint32 ipnum4;
41 uint64 ipnum5; /* aehm */
42 struct uint128_t ipnum6;
43 uint32 dlen;
44 int r;
45 int i;
46 stralloc ipstring = {0};
47 stralloc tmp = {0};
48
49 flaga = byte_equal(qtype,2,DNS_T_A);
50 flaga4 = byte_equal(qtype,2,DNS_T_AAAA);
51 flagtxt = byte_equal(qtype,2,DNS_T_TXT);
52 if (byte_equal(qtype,2,DNS_T_ANY)) flaga = flaga4 = flagtxt = 1;
53 if (!(flaga || flaga4) && !flagtxt) goto REFUSE;
54
55 if (flaga || flagtxt) {
56 r = dd4(q,base,reverseip4);
57 if (r < 0) goto IPV6;
58 if (r != 4) goto REFUSE;
59 uint32_unpack(reverseip4,&ipnum4);
60 uint32_pack_big(ip4,ipnum4);
61 if (ip4_bytestring(&ipstring,ip4,32) <= 0) return 0;
62
63 for (i = 32; i > 0; --i) {
64 if (!stralloc_copys(&tmp,"")) return 0;
65 if (!stralloc_catb(&tmp,ipstring.s,i)) return 0;
66 r = cdb_find(&c,tmp.s,i);
67 if (r == -1) return 0;
68 if (r) goto BASE;
69 }
70 if (!r) { response_nxdomain(); return 1; }
71 }
72
73
74 IPV6:
75 if (flaga4 || flagtxt) {
76 flagip6 = 1;
77 if (dd6(q,base,reverseip6) != 16) goto REFUSE;
78
79 uint128_unpack(reverseip6,&ipnum6); // IPv6 incl. link token
80 uint128_pack_big(ip6,ipnum6);
81 if (ip6_bytestring(&ipstring,ip6,128) <= 0) return 0;
82 if (!stralloc_copys(&tmp,"^")) return 0;
83 if (!stralloc_catb(&tmp,ipstring.s,128)) return 0;
84 r = cdb_find(&c,tmp.s,129);
85 if (r) goto BASE;
86
87 uint64_unpack(reverseip6 + 8,&ipnum5); // IPv6 net-id only
88 uint64_pack_big(ip5,ipnum5);
89 if (ip6_bytestring(&ipstring,ip5,64) <= 0) return 0;
90
91 for (i = 64; i > 0; --i) {
92 if (!stralloc_copys(&tmp,"^")) return 0;
93 if (!stralloc_catb(&tmp,ipstring.s,i)) return 0;
94 r = cdb_find(&c,tmp.s,i);
95 if (r == -1) return 0;
96 if (r) goto BASE;
97 }
98 if (!r) { response_nxdomain(); return 1; }
99 }
100
101
102 BASE:
103 r = cdb_find(&c,"",0);
104 if (r == -1) return 0;
105 if (r && ((dlen = cdb_datalen(&c)) >= 4)) {
106 if (dlen > 256) dlen = 256;
107 if (cdb_read(&c,data,dlen,cdb_datapos(&c)) == -1) return 0;
108 }
109 else {
110 dlen = 12;
111 byte_copy(data,dlen,"\177\0\0\2Listed $");
112 }
113
114 if ((dlen >= 5) && (data[dlen - 1] == '$')) {
115 --dlen;
116 if (flagip6)
117 dlen += ip6_fmt(data + dlen,ip6);
118 else
119 dlen += ip4_fmt(data + dlen,ip4);
120 }
121
122 if (flaga) {
123 if (!response_rstart(q,DNS_T_A,2048)) return 0;
124 if (!response_addbytes(data,4)) return 0;
126 }
127 if (flaga4) {
128 if (!response_rstart(q,DNS_T_AAAA,2048)) return 0;
129 if (!response_addbytes(data,16)) return 0;
131 }
132 if (flagtxt) {
133 if (!response_rstart(q,DNS_T_TXT,2048)) return 0;
134 ch = dlen - 4;
135 if (!response_addbytes(&ch,1)) return 0;
136 if (!response_addbytes(data + 4,dlen - 4)) return 0;
138 }
139
140 return 1;
141
142
143 REFUSE:
144 response[2] &= ~4;
145 response[3] &= ~15;
146 response[3] |= 5;
147 return 1;
148}
149
150int respond(char *q,char qtype[2],char ip[16])
151{
152 int fd;
153 int result;
154
155 fd = open_read("data.cdb");
156 if (fd == -1) return 0;
157 cdb_init(&c,fd);
158 result = doit(q,qtype);
159 cdb_free(&c);
160 close(fd);
161 return result;
162}
163
164const char *starting = "starting rbldns ";
165
166void init_server(void)
167{
168 char *x;
169
170 x = env_get("BASE");
171 if (!x)
172 logmsg(WHO,111,ERROR,"$BASE not set");
173 if (dns_domain_fromdot(&base,x,str_len(x)) <= 0)
174 logmsg(WHO,111,FATAL,"unable to parse $BASE");
175}
int fd
Definition: axfr-get.c:103
unsigned int doit(char *buf, unsigned int len, unsigned int pos)
Definition: axfr-get.c:131
char data[32767]
Definition: axfrdns.c:133
char ip[16]
Definition: axfrdns.c:128
uint32 dlen
Definition: axfrdns.c:134
int dd6(const char *q, const char *base, char ip[16])
Definition: dd.c:40
int dd4(const char *q, const char *base, char ip[4])
Definition: dd.c:7
#define DNS_T_A
Definition: dns.h:65
#define DNS_T_ANY
Definition: dns.h:96
#define MSGSIZE
Definition: dns.h:47
#define DNS_T_TXT
Definition: dns.h:72
#define DNS_T_AAAA
Definition: dns.h:76
int dns_domain_fromdot(char **out, const char *buf, unsigned int n)
Definition: dns_dfd.c:6
char ip6[16]
Definition: dnsfilter.c:57
struct line * x
char ip4[4]
Definition: dnsfilter.c:56
struct line tmp
Definition: dnsfilter.c:38
char * base
Definition: rbldns-conf.c:20
struct cdb_make cdb
Definition: rbldns-data.c:36
int respond(char *q, char qtype[2], char ip[16])
Definition: rbldns.c:150
int flagcurved
Definition: rbldns.c:19
void init_server(void)
Definition: rbldns.c:166
const char * starting
Definition: rbldns.c:164
unsigned int flagedns0
Definition: rbldns.c:20
const char * server
Definition: rbldns.c:17
unsigned int msgsize
Definition: rbldns.c:21
#define WHO
Definition: rbldns.c:15
int response_rstart(const char *, const char[2], uint32)
Definition: response.c:75
void response_rfinish(int)
Definition: response.c:89
int response_addbytes(const char *, unsigned int)
Definition: response.c:17
char response[]
Definition: response.c:6
#define RESPONSE_ANSWER
Definition: response.h:23
void response_nxdomain(void)
Definition: response.c:103