15static int want(
const char *
owner,
const char type[2])
29 if (byte_equal(type,2,
x))
return 0;
30 uint16_unpack_big(
x + 8,&datalen);
42static char data[32767];
44static unsigned int dpos;
48static int find(
char *d,
int flagwild)
61 dlen = cdb_datalen(&c);
66 if ((ch ==
'=' + 1) || (ch ==
'*' + 1)) {
69 if (byte_diff(recordloc,2,
clientloc))
continue;
71 if (flagwild != (ch ==
'*'))
continue;
73 uint32_unpack_big(ttlstr,&ttl);
75 if (byte_diff(ttd,8,
"\0\0\0\0\0\0\0\0")) {
76 tai_unpack(ttd,&cutoff);
78 if (tai_less(&cutoff,&
now))
continue;
79 tai_sub(&cutoff,&cutoff,&
now);
80 newttl = tai_approx(&cutoff);
81 if (newttl <= 2.0) newttl = 2.0;
82 if (newttl >= 3600.0) newttl = 3600.0;
86 if (!tai_less(&cutoff,&
now))
continue;
92static int dobytes(
unsigned int len)
95 if (
len > 20)
return 0;
108static int doit(
char *q,
char qtype[2])
120 int flagauthoritative;
126 int addr4num, addr6num;
136 flagauthoritative = 0;
138 while ((r = find(control,0))) {
139 if (r == -1)
return 0;
144 if (!*control)
return 0;
149 if (!flagauthoritative) {
160 addr4num = addr6num = 0;
161 addr4ttl = addr6ttl = 0;
163 while ((r = find(wild,wild != q))) {
164 if (r == -1)
return 0;
167 if (byte_diff(
type,2,qtype) && byte_diff(qtype,2,
DNS_T_ANY) &&
175 byte_copy(addr4[addr4num],4,addr4[i]);
178 if (addr4num < 1000000) ++addr4num;
186 byte_copy(addr6[addr6num],16,addr6[i]);
189 if (addr6num < 1000000) ++addr6num;
199 if (!dobytes(2))
return 0;
205 if (!dobytes(20))
return 0;
212 for (i = 0; i < addr4num; ++i)
218 for (i = 0; i < addr6num; ++i)
225 if (flagfound)
break;
226 if (wild == control)
break;
238 if (flagauthoritative && (aupos == anpos)) {
240 while ((r = find(control,0))) {
241 if (r == -1)
return 0;
246 if (!dobytes(20))
return 0;
251 }
else if (want(control,
DNS_T_NS)) {
253 while ((r = find(control,0))) {
254 if (r == -1)
return 0;
268 while (bpos < arpos) {
286 while ((r = find(d1,0))) {
287 if (r == -1)
return 0;
289 if (byte_equal(d1,dl,dn))
continue;
292 if (!dobytes(4))
return 0;
296 if (byte_equal(d1,dl,dn))
continue;
299 if (!dobytes(16))
return 0;
305 uint16_unpack_big(
x + 8,&u16);
329 fd = open_read(
"data.cdb");
330 if (
fd == -1)
return 0;
unsigned int doit(char *buf, unsigned int len, unsigned int pos)
void doname(stralloc *sa)
int find_clientloc(char clientloc[2], const char ip[16])
int dns_domain_equal(const char *dn1, const char *dn2)
unsigned int dns_domain_length(const char *dn)
unsigned int dns_packet_getname(const char *buf, unsigned int len, unsigned int pos, char **d)
unsigned int dns_packet_copy(const char *buf, unsigned int len, unsigned int pos, char *out, unsigned int outlen)
unsigned int dns_packet_skipname(const char *buf, unsigned int len, unsigned int pos)
unsigned int dns_random(unsigned int n)
void owner(int uid, int gid)
void d(const char *home, const char *subdir, int uid, int gid, int mode)
int response_rstart(const char *, const char[2], uint32)
int response_addname(const char *)
void response_rfinish(int)
int response_addbytes(const char *, unsigned int)
unsigned int max_response_len
unsigned int response_len
#define RESPONSE_AUTHORITY
void response_nxdomain(void)
#define RESPONSE_ADDITIONAL
int respond(char *q, char qtype[2], char ip[16])