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 */