- * 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
* 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* 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.
adns__debug(ads,-1,0,"duplicate nameserver %s ignored",
adns__sockaddr_ntoa(sa, buf));
return;
adns__debug(ads,-1,0,"duplicate nameserver %s ignored",
adns__sockaddr_ntoa(sa, buf));
return;
- assert(n <= sizeof(ss->addr));
- ss->len = n;
- memcpy(&ss->addr, sa, n);
+ assert(salen <= sizeof(ss->addr));
+ ss->len = salen;
+ memcpy(&ss->addr, sa, salen);
err= adns_text2addr(text,0, adns_qf_addrlit_scope_forbid,
err= adns_text2addr(text,0, adns_qf_addrlit_scope_forbid,
- if (*af_io == AF_UNSPEC) *af_io= addr.addr.sa.sa_family;
- else if (*af_io != addr.addr.sa.sa_family) return 0;
- adns__sockaddr_extract(&addr.addr.sa, a, 0);
+ if (want_af != AF_UNSPEC && a->sa.sa_family != want_af) return 0;
configparseerr(ads,fn,lno,"invalid address `%s' in sortlist",tbuf);
continue;
}
configparseerr(ads,fn,lno,"invalid address `%s' in sortlist",tbuf);
continue;
}
configparseerr(ads,fn,lno,"invalid mask `%s' in sortlist",slash);
continue;
}
} else {
maskwhat = "prefix length";
initial= strtoul(slash,&ep,10);
configparseerr(ads,fn,lno,"invalid mask `%s' in sortlist",slash);
continue;
}
} else {
maskwhat = "prefix length";
initial= strtoul(slash,&ep,10);
configparseerr(ads,fn,lno,"mask length `%s' invalid",slash);
continue;
}
configparseerr(ads,fn,lno,"mask length `%s' invalid",slash);
continue;
}
- adns__prefix_mask(af, initial, &sl->mask);
+ sl->mask.sa.sa_family= sl->base.sa.sa_family;
+ adns__prefix_mask(&sl->mask, initial);
if (initial < 0) {
configparseerr(ads,fn,lno, "network address `%s'"
" in sortlist is not in classed ranges,"
" must specify mask explicitly", tbuf);
continue;
}
if (initial < 0) {
configparseerr(ads,fn,lno, "network address `%s'"
" in sortlist is not in classed ranges,"
" must specify mask explicitly", tbuf);
continue;
}
- adns__prefix_mask(af, initial, &sl->mask);
+ sl->mask.sa.sa_family= sl->base.sa.sa_family;
+ adns__prefix_mask(&sl->mask, initial);
- if (!adns__addr_match_p(af,&sl->base, af,&sl->base,&sl->mask)) {
+ if (!adns__addr_matches(sl->base.sa.sa_family,
+ adns__sockaddr_addr(&sl->base.sa),
+ &sl->base,&sl->mask)) {
if (initial >= 0) {
configparseerr(ads,fn,lno, "%s %d in sortlist"
" overlaps address `%s'",maskwhat,initial,tbuf);
if (initial >= 0) {
configparseerr(ads,fn,lno, "%s %d in sortlist"
" overlaps address `%s'",maskwhat,initial,tbuf);
for (i=0; i<ads->nservers; i++) {
if (adns__udpsocket_by_af(ads, ads->servers[i].addr.sa.sa_family))
continue;
for (i=0; i<ads->nservers; i++) {
if (adns__udpsocket_by_af(ads, ads->servers[i].addr.sa.sa_family))
continue;
udp->af= ads->servers[i].addr.sa.sa_family;
udp->fd= socket(udp->af,SOCK_DGRAM,proto->p_proto);
if (udp->fd < 0) { r= errno; goto x_free; }
udp->af= ads->servers[i].addr.sa.sa_family;
udp->fd= socket(udp->af,SOCK_DGRAM,proto->p_proto);
if (udp->fd < 0) { r= errno; goto x_free; }
r= adns__setnonblock(ads,udp->fd);
if (r) { r= errno; goto x_closeudp; }
}
r= adns__setnonblock(ads,udp->fd);
if (r) { r= errno; goto x_closeudp; }
}
if (ads->tcpsocket >= 0) close(ads->tcpsocket);
adns__vbuf_free(&ads->tcpsend);
adns__vbuf_free(&ads->tcprecv);
if (ads->tcpsocket >= 0) close(ads->tcpsocket);
adns__vbuf_free(&ads->tcpsend);
adns__vbuf_free(&ads->tcprecv);