X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/f930c455a13d7d30ee94bdbfc460bc6227cda111..refs/heads/master:/src/transmit.c?ds=sidebyside diff --git a/src/transmit.c b/src/transmit.c index ecea891..33c3329 100644 --- a/src/transmit.c +++ b/src/transmit.c @@ -5,14 +5,15 @@ */ /* * This file is part of adns, which is - * Copyright (C) 1997-2000,2003,2006 Ian Jackson + * Copyright (C) 1997-2000,2003,2006,2014-2016 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, @@ -21,8 +22,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 @@ -120,7 +120,6 @@ adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r, const char *p, *pe; adns_status st; - if (!((type^adns_r_addr) & adns_rrt_reprmask)) ads->nextid++; /* bodge */ st= mkquery_header(ads,vb,id_r,ol+2); if (st) return st; MKQUERY_START(vb); @@ -156,7 +155,6 @@ adns_status adns__mkquery_frdgram(adns_state ads, vbuf *vb, int *id_r, int lablen, labstart; adns_status st; - if (!((type^adns_r_addr) & adns_rrt_reprmask)) ads->nextid++; /* bodge */ st= mkquery_header(ads,vb,id_r,qd_dglen); if (st) return st; MKQUERY_START(vb); @@ -242,9 +240,17 @@ static void query_usetcp(adns_query qu, struct timeval now) { adns__tcp_tryconnect(qu->ads,now); } +struct udpsocket *adns__udpsocket_by_af(adns_state ads, int af) { + int i; + for (i=0; inudpsockets; i++) + if (ads->udpsockets[i].af == af) return &ads->udpsockets[i]; + return 0; +} + void adns__query_send(adns_query qu, struct timeval now) { int serv, r; adns_state ads; + struct udpsocket *udp; adns_rr_addr *addr; assert(qu->state == query_tosend); @@ -261,8 +267,10 @@ void adns__query_send(adns_query qu, struct timeval now) { ads= qu->ads; serv= qu->udpnextserver; addr= &ads->servers[serv]; + udp= adns__udpsocket_by_af(ads, addr->addr.sa.sa_family); + assert(udp); - r= sendto(ads->udpsocket,qu->query_dgram,qu->query_dglen,0, + r= sendto(udp->fd,qu->query_dgram,qu->query_dglen,0, &addr->addr.sa,addr->len); if (r<0 && errno == EMSGSIZE) { qu->retries= 0;