16
extern char *starting;
17
extern int respond(char *,char *,char *);
18
extern void initialize(void);
35
if (len >= sizeof buf) goto NOQ;
36
pos = dns_packet_copy(buf,len,0,header,12); if (!pos) goto NOQ;
37
if (header[2] & 128) goto NOQ;
38
if (header[4]) goto NOQ;
39
if (header[5] != 1) goto NOQ;
41
pos = dns_packet_getname(buf,len,pos,&q); if (!pos) goto NOQ;
42
pos = dns_packet_copy(buf,len,pos,qtype,2); if (!pos) goto NOQ;
43
pos = dns_packet_copy(buf,len,pos,qclass,2); if (!pos) goto NOQ;
45
if (!response_query(q,qtype,qclass)) goto NOQ;
47
if (byte_equal(qclass,2,DNS_C_IN))
50
if (byte_diff(qclass,2,DNS_C_ANY)) goto WEIRDCLASS;
52
if (!(header[2] & 1)) response[2] &= ~1;
54
if (header[2] & 126) goto NOTIMP;
55
if (byte_equal(qtype,2,DNS_T_AXFR)) goto NOTIMP;
57
case_lowerb(q,dns_domain_length(q));
58
if (!respond(q,qtype,ip)) {
59
qlog(ip,port,header,q,qtype," - ");
62
qlog(ip,port,header,q,qtype," + ");
68
qlog(ip,port,header,q,qtype," I ");
74
qlog(ip,port,header,q,qtype," C ");
78
qlog(ip,port,"\0\0","","\0\0"," / ");
89
strerr_die2x(111,fatal,"$IP not set");
91
strerr_die3x(111,fatal,"unable to parse IP address ",x);
95
strerr_die2sys(111,fatal,"unable to create UDP socket: ");
96
if (socket_bind4_reuse(udp53,ip,53) == -1)
97
strerr_die2sys(111,fatal,"unable to bind UDP socket: ");
104
socket_tryreservein(udp53,65536);
106
buffer_putsflush(buffer_2,starting);
109
len = socket_recv4(udp53,buf,sizeof buf,ip,&port);
110
if (len < 0) continue;
111
if (!doit()) continue;
112
if (response_len > 512) response_tc();
113
socket_send4(udp53,response,response_len,ip,port);
114
/* may block for buffer space; if it fails, too bad */