17static int want(
const char *
owner,
const char type[2])
31 if (byte_equal(type,2,
x))
return 0;
32 uint16_unpack_big(
x + 8,&datalen);
44static char data[32767];
46static unsigned int dpos;
50static int find(
char *d,
int flagwild)
63 dlen = cdb_datalen(&c);
68 if ((ch ==
'=' + 1) || (ch ==
'*' + 1) || (ch ==
'6' + 1)) {
71 if (byte_diff(recordloc,2,
clientloc))
continue;
73 if (flagwild != (ch ==
'*'))
continue;
75 uint32_unpack_big(ttlstr,&ttl);
77 if (byte_diff(ttd,8,
"\0\0\0\0\0\0\0\0")) {
78 tai_unpack(ttd,&cutoff);
80 if (tai_less(&cutoff,&
now))
continue;
81 tai_sub(&cutoff,&cutoff,&
now);
82 newttl = tai_approx(&cutoff);
83 if (newttl <= 2.0) newttl = 2.0;
84 if (newttl >= 3600.0) newttl = 3600.0;
88 if (!tai_less(&cutoff,&
now))
continue;
94static int dobytes(
unsigned int len)
97 if (
len > 20)
return 0;
110static int doit(
char *q,
char qtype[2])
122 int flagauthoritative;
127 int addrnum,addr6num;
137 flagauthoritative = 0;
139 while ((r = find(control,0))) {
140 if (r == -1)
return 0;
145 if (!*control)
return 0;
150 if (!flagauthoritative) {
161 addrnum = addr6num = 0;
162 addrttl = addr6ttl = 0;
164 while ((r = find(wild,wild != q))) {
165 if (r == -1)
return 0;
173 if ((i < addrnum) && (addrnum < 8))
174 byte_copy(addr[addrnum],4,addr[i]);
177 if (addrnum < 1000000) ++addrnum;
184 if ((i < addr6num) && (addr6num < 8))
185 byte_copy(addr6[addr6num],16,addr6[i]);
188 if (addr6num < 1000000) ++addr6num;
196 if (!dobytes(2))
return 0;
202 if (!dobytes(20))
return 0;
209 for (i = 0; i < addrnum; ++i)
215 for (i = 0; i < addr6num; ++i)
222 if (flagfound)
break;
223 if (wild == control)
break;
236 if (flagauthoritative && (aupos == anpos)) {
238 while ((r = find(control,0))) {
239 if (r == -1)
return 0;
244 if (!dobytes(20))
return 0;
249 }
else if (want(control,
DNS_T_NS)) {
251 while ((r = find(control,0))) {
252 if (r == -1)
return 0;
264 while (bpos < arpos) {
275 while ((r = find(d1,0))) {
276 if (r == -1)
return 0;
279 if (!dobytes(4))
return 0;
284 if (!dobytes(16))
return 0;
290 uint16_unpack_big(
x + 8,&u16);
314 fd = open_read(
"data.cdb");
315 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_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
int response_rstart(const char *, const char *, uint32)
void response_nxdomain(void)
#define RESPONSE_ADDITIONAL
int respond(char *q, char qtype[2], char ip[16])