- if (
- break;
-
-
- }
-
- tcpserver_broken(
-
- if (ads-
- used= 0;
- for (;;) {
- vbuf_ensure(&ads->tcprecv,2);
- vbuf_ensure(&ads->tcprecv,
- if (ads->tcprecv.avail<2) break;
- if (ads->tcprecv.used
-
- if (ads->tcprecv.used<2 && ads->tcprecv.avail
- if (ads->tcprecv.used<2 && ads->tcprecv.avail
- r= read(ads->tcpsocket,
- if (adns->tcprecv.used<2) {
- if (
-
- if (ads->tcpstate != server_disc) {
-
-
+ if (callb_checkfd(maxfd,readfds,ads->udpsocket)) {
+ count++;
+ for (;;) {
+ udpaddrlen= sizeof(udpaddr);
+ r= recvfrom(ads->udpsocket,udpbuf,sizeof(udpbuf),0,&udpaddr,&udpaddrlen);
+ if (r<0) {
+ if (!(errno == EAGAIN || errno == EWOULDBLOCK ||
+ errno == EINTR || errno == ENOMEM || errno == ENOBUFS))
+ warn("datagram receive error: %s",strerror(errno));
+ break;
+ }
+ if (udpaddrlen != sizeof(udpaddr)) {
+ diag("datagram received with wrong address length %d (expected %d)",
+ udpaddrlen,sizeof(udpaddr));
+ continue;
+ }
+ if (udpaddr.sin_family != AF_INET) {
+ diag("datagram received with wrong protocol family %u (expected %u)",
+ udpaddr.sin_family,AF_INET);
+ continue;
+ }
+ if (ntohs(udpaddr.sin_port) != NSPORT) {
+ diag("datagram received from wrong port %u (expected %u)",
+ ntohs(udpaddr.sin_port),NSPORT);
+ continue;
+ }
+ for (serv= 0;
+ serv < ads->nservers &&
+ ads->servers[serv].addr.s_addr != udpaddr.sin_addr.s_addr;
+ serv++);
+ if (serv >= ads->nservers) {
+ warn("datagram received from unknown nameserver %s",inet_ntoa(udpaddr.sin_addr));
+ continue;
+ }
+ procdgram(ads,udpbuf,r,serv);