X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fevent.c;h=3dd927b6974fb675536676eff51a17a8162a319a;hb=daf4b02e92a15276eae294d05ca233c3fc145b46;hp=5b2b42df3a0e2ad01cff09a33253f179ea8d12ed;hpb=eb2a930e0ff09c830479df1aea5d8a4ce9354dc1;p=adns.git diff --git a/src/event.c b/src/event.c index 5b2b42d..3dd927b 100644 --- a/src/event.c +++ b/src/event.c @@ -6,14 +6,15 @@ */ /* * This file is part of adns, which is - * Copyright (C) 1997-2000,2003,2006 Ian Jackson + * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson + * Copyright (C) 2014 Mark Wooding * Copyright (C) 1999-2000,2003,2006 Tony Finch * Copyright (C) 1991 Massachusetts Institute of Technology * (See the file INSTALL for full details.) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) + * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, @@ -22,8 +23,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with this program; if not, write to the Free Software Foundation. */ #include @@ -316,8 +316,8 @@ int adns__pollfds(adns_state ads, struct pollfd pollfds_buf[MAX_POLLFDS]) { assert(MAX_POLLFDS == MAXUDP + 1); - for (i=0; inudp; i++) - ADD_POLLFD(ads->udpsocket[i].fd, POLLIN); + for (i=0; inudpsockets; i++) + ADD_POLLFD(ads->udpsockets[i].fd, POLLIN); switch (ads->tcpstate) { case server_disconnected: @@ -396,33 +396,32 @@ int adns_processreadable(adns_state ads, int fd, const struct timeval *now) { default: abort(); } - for (i=0; inudp; i++) { - udp= &ads->udpsocket[i]; - if (fd == udp->fd) { - for (;;) { - udpaddrlen= sizeof(udpaddr); - r= recvfrom(fd,udpbuf,sizeof(udpbuf),0, &udpaddr.sa,&udpaddrlen); - if (r<0) { - if (errno == EAGAIN || errno == EWOULDBLOCK) { r= 0; goto xit; } - if (errno == EINTR) continue; - if (errno_resources(errno)) { r= errno; goto xit; } - adns__warn(ads,-1,0,"datagram receive error: %s",strerror(errno)); - r= 0; goto xit; - } - for (serv= 0; - serv < ads->nservers && - !adns__sockaddr_equal_p(&udpaddr.sa, - &ads->servers[serv].addr.sa); - serv++); - if (serv >= ads->nservers) { - adns__warn(ads,-1,0,"datagram received from unknown nameserver %s", - adns__sockaddr_ntoa(&udpaddr.sa, addrbuf)); - continue; - } - adns__procdgram(ads,udpbuf,r,serv,0,*now); + for (i=0; inudpsockets; i++) { + udp= &ads->udpsockets[i]; + if (fd != udp->fd) continue; + for (;;) { + udpaddrlen= sizeof(udpaddr); + r= recvfrom(fd,udpbuf,sizeof(udpbuf),0, &udpaddr.sa,&udpaddrlen); + if (r<0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { r= 0; goto xit; } + if (errno == EINTR) continue; + if (errno_resources(errno)) { r= errno; goto xit; } + adns__warn(ads,-1,0,"datagram receive error: %s",strerror(errno)); + r= 0; goto xit; } - break; + for (serv= 0; + serv < ads->nservers && + !adns__sockaddrs_equal(&udpaddr.sa, + &ads->servers[serv].addr.sa); + serv++); + if (serv >= ads->nservers) { + adns__warn(ads,-1,0,"datagram received from unknown nameserver %s", + adns__sockaddr_ntoa(&udpaddr.sa, addrbuf)); + continue; + } + adns__procdgram(ads,udpbuf,r,serv,0,*now); } + break; } r= 0; xit: