diff options
author | nectar <nectar@FreeBSD.org> | 2002-05-13 19:31:58 +0000 |
---|---|---|
committer | nectar <nectar@FreeBSD.org> | 2002-05-13 19:31:58 +0000 |
commit | d8cffe661c28e3bb884e152ac50e534f88ae46fd (patch) | |
tree | 8122194080cd713ef54baa64fce62ade7a63be7e /contrib/bind/bin | |
parent | 825bd47b27b5e67e7c938d70c4dde11e68fde1a5 (diff) | |
parent | e044c1fb924b46fc1bd38b298ebea9ff73ea93a8 (diff) | |
download | FreeBSD-src-d8cffe661c28e3bb884e152ac50e534f88ae46fd.zip FreeBSD-src-d8cffe661c28e3bb884e152ac50e534f88ae46fd.tar.gz |
This commit was generated by cvs2svn to compensate for changes in r96536,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'contrib/bind/bin')
-rw-r--r-- | contrib/bind/bin/dig/dig.c | 234 | ||||
-rw-r--r-- | contrib/bind/bin/dnsquery/dnsquery.c | 73 | ||||
-rw-r--r-- | contrib/bind/bin/host/host.c | 327 | ||||
-rw-r--r-- | contrib/bind/bin/named/named.conf | 4 | ||||
-rw-r--r-- | contrib/bind/bin/named/named.h | 3 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_config.c | 17 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_defs.h | 20 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_forw.c | 20 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_func.h | 5 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_lexer.c | 8 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_main.c | 77 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_maint.c | 28 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_notify.c | 61 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_parser.y | 23 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_req.c | 95 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_resp.c | 19 | ||||
-rw-r--r-- | contrib/bind/bin/named/ns_xfr.c | 15 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/list.c | 85 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/res.h | 30 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/send.c | 30 | ||||
-rw-r--r-- | contrib/bind/bin/nslookup/subr.c | 21 |
21 files changed, 808 insertions, 387 deletions
diff --git a/contrib/bind/bin/dig/dig.c b/contrib/bind/bin/dig/dig.c index 037a495..2054258 100644 --- a/contrib/bind/bin/dig/dig.c +++ b/contrib/bind/bin/dig/dig.c @@ -1,5 +1,5 @@ #ifndef lint -static const char rcsid[] = "$Id: dig.c,v 8.51 2001/12/19 02:25:17 marka Exp $"; +static const char rcsid[] = "$Id: dig.c,v 8.54 2002/04/24 00:38:08 marka Exp $"; #endif /* @@ -172,7 +172,6 @@ static const char rcsid[] = "$Id: dig.c,v 8.51 2001/12/19 02:25:17 marka Exp $"; #include <errno.h> #include <fcntl.h> #include <netdb.h> -#include <resolv.h> #include <setjmp.h> #include <stdio.h> #include <stdlib.h> @@ -181,6 +180,8 @@ static const char rcsid[] = "$Id: dig.c,v 8.51 2001/12/19 02:25:17 marka Exp $"; #include "port_after.h" +#include <resolv.h> + #include "../nslookup/res.h" /* Global. */ @@ -209,9 +210,10 @@ static int eecode = 0; static FILE * qfp; static char *defsrv, *srvmsg; static char defbuf[40] = "default -- "; -static char srvbuf[60]; +static char srvbuf[1024]; static char myhostname[MAXHOSTNAMELEN]; static struct sockaddr_in myaddress; +static struct sockaddr_in6 myaddress6; static u_int32_t ixfr_serial; /* stuff for nslookup modules */ @@ -248,8 +250,8 @@ static void stackarg(char *, char **); int main(int argc, char **argv) { - struct hostent *hp; short port = htons(NAMESERVER_PORT); + short lport; /* Wierd stuff for SPARC alignment, hurts nothing else. */ union { HEADER header_; @@ -302,6 +304,14 @@ main(int argc, char **argv) { myaddress.sin_family = AF_INET; myaddress.sin_addr.s_addr = INADDR_ANY; myaddress.sin_port = 0; /*INPORT_ANY*/; + +#ifdef HAVE_SA_LEN + myaddress6.sin6_len = sizeof(struct sockaddr_in6); +#endif + myaddress6.sin6_family = AF_INET6; + myaddress6.sin6_addr = in6addr_any; + myaddress6.sin6_port = 0; /*INPORT_ANY*/; + defsrv = strcat(defbuf, inet_ntoa(res.nsaddr.sin_addr)); res_x = res; @@ -498,7 +508,7 @@ main(int argc, char **argv) { break; case 'p': if (argv[0][2] != '\0') - port = ntohs(atoi(argv[0]+2)); + port = htons(atoi(argv[0]+2)); else if (*++argv == NULL) printf("; no arg for -p?\n"); else @@ -530,14 +540,19 @@ main(int argc, char **argv) { a = *argv; if ((p = strchr(a, ':')) != NULL) { *p++ = '\0'; - myaddress.sin_port = - ntohs(atoi(p)); - } - if (!inet_aton(a,&myaddress.sin_addr)){ + lport = htons(atoi(p)); + } else + lport = htons(0); + if (inet_pton(AF_INET6, a, + &myaddress6.sin6_addr) == 1) { + myaddress6.sin6_port = lport; + } else if (!inet_aton(a, + &myaddress.sin_addr)) { fprintf(stderr, ";; bad -b addr\n"); exit(1); - } + } else + myaddress.sin_port = lport; } break; case 'k': @@ -749,82 +764,113 @@ main(int argc, char **argv) { srvbuf[0] = 0; srvmsg = defsrv; if (srv != NULL) { - struct in_addr addr; - - if (inet_aton(srv, &addr)) { - res.nscount = 1; - res.nsaddr.sin_addr = addr; - srvmsg = strcat(srvbuf, srv); - } else { - res_t = res; - res_ninit(&res); - res.pfcode = 0; - res.options = RES_DEFAULT; - hp = gethostbyname(srv); + int nscount = 0; + union res_sockaddr_union u[MAXNS]; + struct addrinfo *answer = NULL; + struct addrinfo *cur = NULL; + struct addrinfo hint; + + memset(u, 0, sizeof(u)); + res_t = res; + res_ninit(&res); + res.pfcode = 0; + res.options = RES_DEFAULT; + memset(&hint, 0, sizeof(hint)); + hint.ai_socktype = SOCK_DGRAM; + if (!getaddrinfo(srv, NULL, &hint, &answer)) { res = res_t; - if (hp == NULL - || hp->h_addr_list == NULL - || *hp->h_addr_list == NULL) { - fflush(stdout); - fprintf(stderr, - "; Bad server: %s -- using default server and timer opts\n", - srv); - fflush(stderr); - srvmsg = defsrv; - srv = NULL; - } else { - u_int32_t **addr; - - res.nscount = 0; - for (addr = (u_int32_t**)hp->h_addr_list; - *addr && (res.nscount < MAXNS); - addr++) { - res.nsaddr_list[ - res.nscount++ - ].sin_addr.s_addr = **addr; + cur = answer; + for (cur = answer; + cur != NULL; + cur = cur->ai_next) { + if (nscount == MAXNS) + break; + switch (cur->ai_addr->sa_family) { + case AF_INET6: + u[nscount].sin6 = + *(struct sockaddr_in6*)cur->ai_addr; + u[nscount++].sin6.sin6_port = + port; + break; + case AF_INET: + u[nscount].sin = + *(struct sockaddr_in*)cur->ai_addr; + u[nscount++].sin6.sin6_port = + port; + break; } - - srvmsg = strcat(srvbuf,srv); + } + if (nscount != 0) { + char buf[80]; + res_setservers(&res, u, nscount); + srvmsg = strcat(srvbuf, srv); strcat(srvbuf, " "); - strcat(srvmsg, - inet_ntoa(res.nsaddr.sin_addr)); + buf[0] = '\0'; + switch (u[0].sin.sin_family) { + case AF_INET: + inet_ntop(AF_INET, + &u[0].sin.sin_addr, + buf, sizeof(buf)); + break; + case AF_INET6: + inet_ntop(AF_INET, + &u[0].sin6.sin6_addr, + buf, sizeof(buf)); + break; + } + strcat(srvbuf, buf); } + freeaddrinfo(answer); + } else { + res = res_t; + fflush(stdout); + fprintf(stderr, + "; Bad server: %s -- using default server and timer opts\n", + srv); + fflush(stderr); + srvmsg = defsrv; + srv = NULL; } printf("; (%d server%s found)\n", res.nscount, (res.nscount==1)?"":"s"); res.id += res.retry; } - { - int i; - - for (i = 0; i < res.nscount; i++) { - res.nsaddr_list[i].sin_family = AF_INET; - res.nsaddr_list[i].sin_port = port; - } - res.id += res.retry; - } - if (ns_t_xfr_p(xfr)) { int i; - + int nscount; + union res_sockaddr_union u[MAXNS]; + nscount = res_getservers(&res, u, MAXNS); for (i = 0; i < res.nscount; i++) { int x; if (keyfile) x = printZone(xfr, domain, - &res.nsaddr_list[i], + &u[i].sin, &key); else x = printZone(xfr, domain, - &res.nsaddr_list[i], + &u[i].sin, NULL); if (res.pfcode & RES_PRF_STATS) { + char buf[80]; exectime = time(NULL); + buf[0] = '\0'; + switch (u[i].sin.sin_family) { + case AF_INET: + inet_ntop(AF_INET, + &u[i].sin.sin_addr, + buf, sizeof(buf)); + break; + case AF_INET6: + inet_ntop(AF_INET6, + &u[i].sin6.sin6_addr, + buf, sizeof(buf)); + break; + } printf(";; FROM: %s to SERVER: %s\n", myhostname, - inet_ntoa(res.nsaddr_list[i] - .sin_addr)); + buf); printf(";; WHEN: %s", ctime(&exectime)); } if (!x) @@ -984,7 +1030,7 @@ where: server,\n\ fputs("\ notes: defname and search don't work; use fully-qualified names.\n\ this is DiG version " VSTRING "\n\ - $Id: dig.c,v 8.51 2001/12/19 02:25:17 marka Exp $\n\ + $Id: dig.c,v 8.54 2002/04/24 00:38:08 marka Exp $\n\ ", stderr); } @@ -1322,24 +1368,56 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin, perror(";; socket"); return (e); } - if (bind(sockFD, (struct sockaddr *)&myaddress, sizeof myaddress) < 0){ - int e = errno; + + switch (sin->sin_family) { + case AF_INET: + if (bind(sockFD, (struct sockaddr *)&myaddress, + sizeof myaddress) < 0){ + int e = errno; - fprintf(stderr, ";; bind(%s:%u): %s\n", - inet_ntoa(myaddress.sin_addr), - ntohs(myaddress.sin_port), - strerror(e)); - (void) close(sockFD); - sockFD = -1; - return (e); - } - if (connect(sockFD, (const struct sockaddr *)sin, sizeof *sin) < 0) { - int e = errno; + fprintf(stderr, ";; bind(%s:%u): %s\n", + inet_ntoa(myaddress.sin_addr), + ntohs(myaddress.sin_port), + strerror(e)); + (void) close(sockFD); + sockFD = -1; + return (e); + } + if (connect(sockFD, (const struct sockaddr *)sin, + sizeof *sin) < 0) { + int e = errno; - perror(";; connect"); - (void) close(sockFD); - sockFD = -1; - return (e); + perror(";; connect"); + (void) close(sockFD); + sockFD = -1; + return (e); + } + break; + case AF_INET6: + if (bind(sockFD, (struct sockaddr *)&myaddress6, + sizeof myaddress6) < 0){ + int e = errno; + char buf[80]; + + fprintf(stderr, ";; bind(%s:%u): %s\n", + inet_ntop(AF_INET6, &myaddress6.sin6_addr, + buf, sizeof(buf)), + ntohs(myaddress6.sin6_port), + strerror(e)); + (void) close(sockFD); + sockFD = -1; + return (e); + } + if (connect(sockFD, (const struct sockaddr *)sin, + sizeof(struct sockaddr_in6)) < 0) { + int e = errno; + + perror(";; connect"); + (void) close(sockFD); + sockFD = -1; + return (e); + } + break; } /* diff --git a/contrib/bind/bin/dnsquery/dnsquery.c b/contrib/bind/bin/dnsquery/dnsquery.c index c9fed3c..cbc1e85 100644 --- a/contrib/bind/bin/dnsquery/dnsquery.c +++ b/contrib/bind/bin/dnsquery/dnsquery.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: dnsquery.c,v 8.16 2001/09/25 04:50:15 marka Exp $"; +static const char rcsid[] = "$Id: dnsquery.c,v 8.19 2002/04/12 03:03:48 marka Exp $"; #endif /* not lint */ /* @@ -30,7 +30,6 @@ static const char rcsid[] = "$Id: dnsquery.c,v 8.16 2001/09/25 04:50:15 marka Ex #include <errno.h> #include <netdb.h> -#include <resolv.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -38,21 +37,54 @@ static const char rcsid[] = "$Id: dnsquery.c,v 8.16 2001/09/25 04:50:15 marka Ex #include "port_after.h" +#include <resolv.h> + extern int errno; extern int h_errno; extern char *h_errlist[]; struct __res_state res; +static int +newserver(char *srv, union res_sockaddr_union *u, int ns, int max) { + struct addrinfo *answer = NULL; + struct addrinfo *cur = NULL; + struct addrinfo hint; + short port = htons(NAMESERVER_PORT); + + memset(&hint, 0, sizeof(hint)); + hint.ai_socktype = SOCK_DGRAM; + if (!getaddrinfo(srv, NULL, &hint, &answer)) { + for (cur = answer; cur != NULL; cur = cur->ai_next) { + if (ns >= max) + break; + switch (cur->ai_addr->sa_family) { + case AF_INET6: + u[ns].sin6 = + *(struct sockaddr_in6*)cur->ai_addr; + u[ns++].sin6.sin6_port = port; + break; + case AF_INET: + u[ns].sin = *(struct sockaddr_in*)cur->ai_addr; + u[ns++].sin6.sin6_port = port; + break; + } + } + freeaddrinfo(answer); + } else { + fprintf(stderr, "Bad nameserver (%s)\n", srv); + exit(1); + } + return (ns); +} + int main(int argc, char *argv[]) { char name[MAXDNAME]; u_char answer[8*1024]; - int c, n, i = 0; - u_int32_t ul; + int c, n; int nameservers = 0, class, type, len; - struct in_addr q_nsaddr[MAXNS]; - struct hostent *q_nsname; + union res_sockaddr_union q_nsaddr[MAXNS]; extern int optind, opterr; extern char *optarg; int stream = 0, debug = 0; @@ -137,23 +169,8 @@ main(int argc, char *argv[]) { ); exit(1); } - if (nameservers >= MAXNS) break; - (void) inet_aton(optarg, - &q_nsaddr[nameservers]); - if (!inet_aton(optarg, (struct in_addr *)&ul)){ - q_nsname = gethostbyname(optarg); - if (q_nsname == 0) { - fprintf(stderr, - "Bad nameserver (%s)\n", - optarg); - exit(1); - } - memcpy(&q_nsaddr[nameservers], - q_nsname->h_addr, INADDRSZ); - } - else - q_nsaddr[nameservers].s_addr = ul; - nameservers++; + nameservers = newserver(optarg, q_nsaddr, + nameservers, MAXNS); break; default : fprintf(stderr, @@ -189,14 +206,8 @@ main(int argc, char *argv[]) { res.options |= RES_USEVC; /* if the -n flag was used, add them to the resolver's list */ - if (nameservers != 0) { - res.nscount = nameservers; - for (i = nameservers - 1; i >= 0; i--) { - res.nsaddr_list[i].sin_addr.s_addr = q_nsaddr[i].s_addr; - res.nsaddr_list[i].sin_family = AF_INET; - res.nsaddr_list[i].sin_port = htons(NAMESERVER_PORT); - } - } + if (nameservers != 0) + res_setservers(&res, q_nsaddr, nameservers); /* * if the -h arg is fully-qualified, use res_query() since diff --git a/contrib/bind/bin/host/host.c b/contrib/bind/bin/host/host.c index eb28564..84b3621 100644 --- a/contrib/bind/bin/host/host.c +++ b/contrib/bind/bin/host/host.c @@ -1,5 +1,5 @@ #ifndef lint -static const char rcsid[] = "$Id: host.c,v 8.49 2001/12/17 04:24:37 marka Exp $"; +static const char rcsid[] = "$Id: host.c,v 8.52 2002/04/28 01:34:52 marka Exp $"; #endif /* not lint */ /* @@ -100,7 +100,6 @@ static const char copyright[] = #include <ctype.h> #include <netdb.h> -#include <resolv.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -113,6 +112,8 @@ static const char copyright[] = #include "port_after.h" +#include <resolv.h> + /* Global. */ #ifndef PATH_SEP @@ -185,9 +186,8 @@ static char getdomain[NS_MAXDNAME]; static int parsetype(const char *s); static int parseclass(const char *s); -static void printanswer(const struct hostent *hp); static void hperror(int errnum); -static int addrinfo(struct in_addr addr); +static int addrinfo(struct sockaddr_storage *addr); static int gethostinfo(char *name); static int getdomaininfo(const char *name, const char *domain); static int getinfo(const char *name, const char *domain, @@ -225,12 +225,16 @@ Usage: %s [-adlrwv] [-t querytype] [-c class] host [server]\n\ int main(int argc, char **argv) { - struct in_addr addr; + struct sockaddr_storage addr; struct hostent *hp; char *s; int waitmode = 0; int ncnames, ch; int nkeychains; + struct addrinfo *answer = NULL; + struct addrinfo *cur = NULL; + struct addrinfo hint; + int ip = 0; dst_init(); @@ -292,33 +296,93 @@ main(int argc, char **argv) { if (argc > 1) usage("extra undefined arguments"); if (argc == 1) { + union res_sockaddr_union u[MAXNS]; + int nscount; + s = *argv++; argc--; server_specified++; + memset(&hint, 0, sizeof(hint)); + hint.ai_flags = AI_CANONNAME; + hint.ai_family = PF_UNSPEC; + hint.ai_socktype = SOCK_DGRAM; - if (!inet_aton(s, &addr)) { - hp = gethostbyname(s); - if (hp == NULL) { - fprintf(stderr, - "Error in looking up server name:\n"); - hperror(res.res_h_errno); - exit(1); + if (!getaddrinfo(s, NULL, &hint, &answer)) { + nscount = 0; + if (answer->ai_canonname != NULL) { + printf("Using domain server:\n"); + printf("Name: %s\n", answer->ai_canonname); + printf("Addresses:"); + } else + printf("Using domain server"); + + for (cur = answer; cur != NULL; cur = cur->ai_next) { + char buf[80]; + struct sockaddr_in6 *sin6; + struct sockaddr_in *sin; + + switch (cur->ai_addr->sa_family) { + case AF_INET6: + sin6 = + (struct sockaddr_in6 *)cur->ai_addr; + inet_ntop(cur->ai_addr->sa_family, + &sin6->sin6_addr, + buf, sizeof(buf)); + printf(" %s", buf); + if (nscount >= MAXNS) + break; + u[nscount].sin6 = *sin6; + u[nscount++].sin6.sin6_port = + htons(NAMESERVER_PORT); + break; + case AF_INET: + sin = + (struct sockaddr_in*)cur->ai_addr; + inet_ntop(cur->ai_addr->sa_family, + &sin->sin_addr, + buf, sizeof(buf)); + printf(" %s", buf); + if (nscount >= MAXNS) + break; + u[nscount].sin = *sin; + u[nscount++].sin6.sin6_port = + htons(NAMESERVER_PORT); + break; + } } - memcpy(&res.nsaddr.sin_addr, hp->h_addr, NS_INADDRSZ); - printf("Using domain server:\n"); - printanswer(hp); + if (nscount != 0) { + res_setservers(&res, u, nscount); + } + if (answer->ai_canonname != NULL) + printf("\n\n"); + else + printf(":\n\n"); + freeaddrinfo(answer); } else { - res.nsaddr.sin_family = AF_INET; - res.nsaddr.sin_addr = addr; - res.nsaddr.sin_port = htons(NAMESERVER_PORT); - printf("Using domain server %s:\n", - inet_ntoa(res.nsaddr.sin_addr)); + fprintf(stderr, "Error in looking up server name:\n"); + exit(1); } - res.nscount = 1; res.retry = 2; } - if (strcmp(getdomain, ".") == 0 || !inet_aton(getdomain, &addr)) - addr.s_addr = INADDR_NONE; + memset(&hint, 0, sizeof(hint)); + hint.ai_flags = AI_NUMERICHOST; + hint.ai_socktype = SOCK_DGRAM; + if(!getaddrinfo(getdomain, NULL, &hint, &answer)) { + memset(&addr, 0, sizeof(addr)); + switch (answer->ai_family) { + case AF_INET: + memcpy(&addr, answer->ai_addr, + sizeof(struct sockaddr_in)); + ip = 1; + break; + case AF_INET6: + memcpy(&addr, answer->ai_addr, + sizeof(struct sockaddr_in6)); + ip = 1; + break; + } + freeaddrinfo(answer); + } hp = NULL; res.res_h_errno = TRY_AGAIN; /* @@ -330,7 +394,7 @@ main(int argc, char **argv) { exit(ListHosts(getdomain, querytype ? querytype : ns_t_a)); ncnames = 5; nkeychains = 18; while (hp == NULL && res.res_h_errno == TRY_AGAIN) { - if (addr.s_addr == INADDR_NONE) { + if (!ip) { cname = NULL; hp = (struct hostent *)gethostinfo(getdomain); getdomain[0] = 0; /* clear this query */ @@ -378,7 +442,7 @@ main(int argc, char **argv) { continue; } } else { - if (addrinfo(addr) == 0) + if (addrinfo(&addr) == 0) hp = NULL; else hp = (struct hostent *)1; /* XXX */ @@ -428,21 +492,6 @@ parseclass(const char *s) { } static void -printanswer(const struct hostent *hp) { - struct in_addr **hptr; - char **cp; - - printf("Name: %s\n", hp->h_name); - printf("Address:"); - for (hptr = (struct in_addr **)hp->h_addr_list; *hptr; hptr++) - printf(" %s", inet_ntoa(**hptr)); - printf("\nAliases:"); - for (cp = hp->h_aliases; cp && *cp && **cp; cp++) - printf(" %s", *cp); - printf("\n\n"); -} - -static void hperror(int errnum) { switch(errnum) { case HOST_NOT_FOUND: @@ -525,15 +574,50 @@ hperror(int errnum) { } static int -addrinfo(struct in_addr addr) { - u_int32_t ha = ntohl(addr.s_addr); +addrinfo(struct sockaddr_storage *addr) { char name[NS_MAXDNAME]; - - sprintf(name, "%u.%u.%u.%u.IN-ADDR.ARPA.", - (ha) & 0xff, - (ha >> 8) & 0xff, - (ha >> 16) & 0xff, - (ha >> 24) & 0xff); + unsigned char *p; + struct in6_addr *addr6; + + switch(addr->ss_family) { + case AF_INET: + p = (unsigned char*)&((struct sockaddr_in *)addr)->sin_addr; + mapped: + sprintf(name, "%u.%u.%u.%u.IN-ADDR.ARPA.", + p[3], p[2], p[1], p[0]); + break; + case AF_INET6: + addr6 = &((struct sockaddr_in6 *)addr)->sin6_addr; + p = (unsigned char *)addr6; + if (IN6_IS_ADDR_V4MAPPED(addr6) || + IN6_IS_ADDR_V4COMPAT(addr6)) { + p += 12; + goto mapped; + } + sprintf(name, + "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x." + "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x." + "IP6.ARPA", + p[15] & 0xf, (p[15] >> 4) & 0xf, + p[14] & 0xf, (p[14] >> 4) & 0xf, + p[13] & 0xf, (p[13] >> 4) & 0xf, + p[12] & 0xf, (p[12] >> 4) & 0xf, + p[11] & 0xf, (p[11] >> 4) & 0xf, + p[10] & 0xf, (p[10] >> 4) & 0xf, + p[9] & 0xf, (p[9] >> 4) & 0xf, + p[8] & 0xf, (p[8] >> 4) & 0xf, + p[7] & 0xf, (p[7] >> 4) & 0xf, + p[6] & 0xf, (p[6] >> 4) & 0xf, + p[5] & 0xf, (p[5] >> 4) & 0xf, + p[4] & 0xf, (p[4] >> 4) & 0xf, + p[3] & 0xf, (p[3] >> 4) & 0xf, + p[2] & 0xf, (p[2] >> 4) & 0xf, + p[1] & 0xf, (p[1] >> 4) & 0xf, + p[0] & 0xf, (p[0] >> 4) & 0xf); + break; + default: + abort(); + } return (getinfo(name, NULL, ns_t_ptr)); } @@ -1552,12 +1636,44 @@ pr_cdname(const u_char *cp, const u_char *msg, char *name, int namelen) { return (cp + n); } +static void +add(union res_sockaddr_union *u, int type, void *p) { + memset(u, 0, sizeof(*u)); + switch (type) { + case ns_t_a: + memcpy(&u->sin.sin_addr, p, NS_INADDRSZ); + u->sin.sin_family = AF_INET; + u->sin.sin_port = htons(NAMESERVER_PORT); +#ifdef HAVE_SA_LEN + u->sin.sin_len = sizeof(u->sin); +#endif + break; + + case ns_t_aaaa: + memcpy(&u->sin6.sin6_addr, p, 16); + u->sin6.sin6_family = AF_INET6; + u->sin6.sin6_port = htons(NAMESERVER_PORT); +#ifdef HAVE_SA_LEN + u->sin6.sin6_len = sizeof(u->sin6); +#endif + break; + } +} + +static int +salen(union res_sockaddr_union *u) { + switch (u->sin.sin_family) { + case AF_INET6: return (sizeof(u->sin6)); + case AF_INET: return (sizeof(u->sin)); + } + return (0); +} + static int ListHosts(char *namePtr, int queryType) { querybuf buf, answer; struct sockaddr_in sin; const HEADER *headerPtr; - const struct hostent *hp; enum { NO_ERRORS, ERR_READING_LEN, ERR_READING_MSG, ERR_PRINTING } error = NO_ERRORS; @@ -1570,7 +1686,7 @@ ListHosts(char *namePtr, int queryType) { /* Names and addresses of name servers to try. */ char nsname[NUMNS][NS_MAXDNAME]; int nshaveaddr[NUMNS]; - struct in_addr nsipaddr[NUMNSADDR]; + union res_sockaddr_union nsipaddr[NUMNSADDR]; int numns, numnsaddr, thisns; int qdcount, ancount; @@ -1582,10 +1698,9 @@ ListHosts(char *namePtr, int queryType) { if (namePtr[i-1] == '.') namePtr[i-1] = 0; - if (server_specified) { - memcpy(&nsipaddr[0], &res.nsaddr.sin_addr, NS_INADDRSZ); - numnsaddr = 1; - } else { + if (server_specified) + numnsaddr = res_getservers(&res, nsipaddr, NUMNSADDR); + else { /* * First we have to find out where to look. This needs a NS * query, possibly followed by looking up addresses for some @@ -1703,20 +1818,17 @@ ListHosts(char *namePtr, int queryType) { } } } - } else if (type == ns_t_a) { - if (numnsaddr < NUMNSADDR) - for (i = 0; i < numns; i++) { - if (ns_samename(nsname[i], + } else if ((type == ns_t_a || type == ns_t_aaaa) && + numnsaddr < NUMNSADDR) { + for (i = 0; i < numns; i++) { + if (ns_samename(nsname[i], (char *)domain) - == 1) { - nshaveaddr[i]++; - memcpy( - &nsipaddr[numnsaddr], - cp, NS_INADDRSZ); - numnsaddr++; - break; - } - } + != 1) + continue; + nshaveaddr[i]++; + add(&nsipaddr[numnsaddr++], type, cp); + break; + } } cp += dlen; } @@ -1728,28 +1840,50 @@ ListHosts(char *namePtr, int queryType) { */ for (i = 0; i < numns; i++) { - if (nshaveaddr[i] == 0) { - struct in_addr **hptr; - int numaddrs = 0; + struct addrinfo *answer = NULL; + struct addrinfo *cur = NULL; + struct addrinfo hint; - hp = gethostbyname(nsname[i]); - if (hp) { - for (hptr = (struct in_addr **) - hp->h_addr_list; - *hptr != NULL; - hptr++) - if (numnsaddr < NUMNSADDR) { - memcpy( - &nsipaddr[numnsaddr], - *hptr, NS_INADDRSZ); - numnsaddr++; - numaddrs++; - } + memset(&hint, 0, sizeof(hint)); + hint.ai_family = PF_UNSPEC; + hint.ai_socktype = SOCK_STREAM; + + if (nshaveaddr[i] == 0 && + !getaddrinfo(nsname[i], NULL, &hint, &answer)) { + int numaddrs = 0; + for (cur = answer; + cur != NULL; + cur = cur->ai_next) { + union res_sockaddr_union *u; + + if (numnsaddr >= NUMNSADDR) + break; + + u = &nsipaddr[numnsaddr]; + switch (cur->ai_addr->sa_family) { + case AF_INET6: + u->sin6 = + *(struct sockaddr_in6 *)cur->ai_addr; + u->sin6.sin6_port = + htons(NAMESERVER_PORT); + numnsaddr++; + numaddrs++; + break; + case AF_INET: + u->sin = + *(struct sockaddr_in*)cur->ai_addr; + u->sin6.sin6_port = + htons(NAMESERVER_PORT); + numnsaddr++; + numaddrs++; + break; + } } if (res.options & RES_DEBUG || verbose) printf( "Found %d addresses for %s by extra query\n", numaddrs, nsname[i]); + freeaddrinfo(answer); } else if (res.options & RES_DEBUG || verbose) printf("Found %d addresses for %s\n", nshaveaddr[i], nsname[i]); @@ -1786,14 +1920,31 @@ ListHosts(char *namePtr, int queryType) { */ for ((void)NULL; thisns < numnsaddr; thisns++) { - if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + if ((sockFD = socket(nsipaddr[thisns].sin.sin_family, + SOCK_STREAM, 0)) < 0) { + if (errno == EPROTONOSUPPORT) + continue; perror("ListHosts"); return (ERROR); } - memcpy(&sin.sin_addr, &nsipaddr[thisns], NS_INADDRSZ); - if (res.options & RES_DEBUG || verbose) - printf("Trying %s\n", inet_ntoa(sin.sin_addr)); - if (connect(sockFD, (struct sockaddr *)&sin, sizeof(sin)) >= 0) + if (res.options & RES_DEBUG || verbose) { + char buf[80]; + switch (nsipaddr[thisns].sin.sin_family) { + case AF_INET: + inet_ntop(nsipaddr[thisns].sin.sin_family, + &nsipaddr[thisns].sin.sin_addr, + buf, sizeof(buf)); + break; + case AF_INET6: + inet_ntop(nsipaddr[thisns].sin6.sin6_family, + &nsipaddr[thisns].sin6.sin6_addr, + buf, sizeof(buf)); + break; + } + printf("Trying %s\n", buf); + } + if (connect(sockFD, (struct sockaddr *)&nsipaddr[thisns], + salen(&nsipaddr[thisns])) >= 0) break; if (verbose) perror("Connection failed, trying next server"); diff --git a/contrib/bind/bin/named/named.conf b/contrib/bind/bin/named/named.conf index 08ef27d..d0d2996 100644 --- a/contrib/bind/bin/named/named.conf +++ b/contrib/bind/bin/named/named.conf @@ -52,6 +52,8 @@ options { // notify on a zone-by-zone // basis in the "zone" statement // see (below) + // notify explicit; // only sent the notifies to the + // also-notify list serial-queries 4; // number of parallel SOA queries // we can have outstanding for master // zone change testing purposes @@ -193,6 +195,8 @@ zone "master.demo.zone" { // zone? The global option is used // if "notify" is not specified // here. + // notify explicit; // only sent the notifies to the + // also-notify list also-notify { }; // don't notify any nameservers other // than those on the NS list for this // zone diff --git a/contrib/bind/bin/named/named.h b/contrib/bind/bin/named/named.h index 023767c..a9d6088 100644 --- a/contrib/bind/bin/named/named.h +++ b/contrib/bind/bin/named/named.h @@ -16,10 +16,11 @@ */ /* - * $Id: named.h,v 8.31 2002/02/01 00:05:38 marka Exp $ + * $Id: named.h,v 8.32 2002/03/15 00:58:16 vixie Exp $ */ /* Options. Change them at your peril. */ +#undef NXDOMAIN_ON_DENIAL #define DEBUG #define ADDAUTH #define STUBS diff --git a/contrib/bind/bin/named/ns_config.c b/contrib/bind/bin/named/ns_config.c index 2d59a62..1680d91 100644 --- a/contrib/bind/bin/named/ns_config.c +++ b/contrib/bind/bin/named/ns_config.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ns_config.c,v 8.133 2002/02/01 00:05:39 marka Exp $"; +static const char rcsid[] = "$Id: ns_config.c,v 8.134 2002/04/25 05:27:04 marka Exp $"; #endif /* not lint */ /* @@ -317,7 +317,7 @@ validate_zone(struct zoneinfo *zp) { #ifdef BIND_NOTIFY /* Check notify */ - if (zp->z_notify != znotify_use_default) { + if (zp->z_notify != notify_use_default) { if (zp->z_type != z_master && zp->z_type != z_slave) { ns_error(ns_log_config, "'notify' given for non-master, non-slave zone '%s'", @@ -872,7 +872,7 @@ set_zone_dialup(zone_config zh, int value) { if (value) { zp->z_dialup = zdialup_yes; #ifdef BIND_NOTIFY - zp->z_notify = znotify_yes; + zp->z_notify = notify_yes; #endif } else zp->z_dialup = zdialup_no; @@ -881,17 +881,14 @@ set_zone_dialup(zone_config zh, int value) { } int -set_zone_notify(zone_config zh, int value) { +set_zone_notify(zone_config zh, enum notify value) { #ifdef BIND_NOTIFY struct zoneinfo *zp; zp = zh.opaque; INSIST(zp != NULL); - if (value) - zp->z_notify = znotify_yes; - else - zp->z_notify = znotify_no; + zp->z_notify = value; #endif return (1); } @@ -1150,6 +1147,9 @@ new_options() { op->max_log_size_ixfr = 0; op->minroots = MINROOTS; op->preferred_glue = 0; +#ifdef BIND_NOTIFY + op->notify = notify_yes; +#endif return (op); } @@ -1210,7 +1210,6 @@ set_boolean_option(u_int *op_flags, int bool_opt, int value) { case OPTION_NOFETCHGLUE: case OPTION_FORWARD_ONLY: case OPTION_FAKE_IQUERY: - case OPTION_NONOTIFY: case OPTION_SUPNOTIFY_INITIAL: case OPTION_NONAUTH_NXDOMAIN: case OPTION_MULTIPLE_CNAMES: diff --git a/contrib/bind/bin/named/ns_defs.h b/contrib/bind/bin/named/ns_defs.h index 86a81b6..3474550 100644 --- a/contrib/bind/bin/named/ns_defs.h +++ b/contrib/bind/bin/named/ns_defs.h @@ -1,6 +1,6 @@ /* * from ns.h 4.33 (Berkeley) 8/23/90 - * $Id: ns_defs.h,v 8.115 2002/01/29 03:59:35 marka Exp $ + * $Id: ns_defs.h,v 8.118 2002/04/25 05:27:06 marka Exp $ */ /* @@ -170,10 +170,11 @@ typedef enum need { main_need_qrylog, /* toggle_qrylog() needed. */ main_need_debug, /* use_desired_debug() needed. */ main_need_restart, /* exec() needed. */ - main_need_reap, /* need to reap dead children */ - main_need_noexpired, /* ns_reconfig() needed w/ noexpired set */ + main_need_reap, /* need to reap dead children. */ + main_need_noexpired, /* ns_reconfig() needed w/ noexpired set. */ main_need_num, /* number of needs, used for array bound. */ - main_need_tick /* tick every second to poll for cleanup (NT)*/ + main_need_tick, /* tick every second to poll for cleanup (NT) */ + main_need_tryxfer /* attemt to start a zone transfer. */ } main_need; /* What global options are set? */ @@ -182,7 +183,7 @@ typedef enum need { #define OPTION_FORWARD_ONLY 0x00000004 /* Don't use NS RR's, just forward. */ #define OPTION_FAKE_IQUERY 0x00000008 /* Fake up bogus response to IQUERY. */ #ifdef BIND_NOTIFY -#define OPTION_NONOTIFY 0x00000010 /* Turn off notify */ +/* #define OPTION_NONOTIFY 0x00000010 */ /* Turn off notify */ #define OPTION_SUPNOTIFY_INITIAL 0x00000020 /* Supress initial notify */ #endif #define OPTION_NONAUTH_NXDOMAIN 0x00000040 /* Generate non-auth NXDOMAINs? */ @@ -272,7 +273,7 @@ typedef enum need { enum severity { ignore, warn, fail, not_set }; #ifdef BIND_NOTIFY -enum znotify { znotify_use_default=0, znotify_yes, znotify_no }; +enum notify { notify_use_default=0, notify_yes, notify_no, notify_explicit }; #endif enum zdialup { zdialup_use_default=0, zdialup_yes, zdialup_no }; @@ -368,7 +369,7 @@ struct zoneinfo { from us */ long z_max_transfer_time_in; /* max num seconds for AXFR */ #ifdef BIND_NOTIFY - enum znotify z_notify; /* Notify mode */ + enum notify z_notify; /* Notify mode */ struct in_addr *z_also_notify; /* More nameservers to notify */ int z_notify_count; #endif @@ -496,7 +497,7 @@ struct qinfo { u_int16_t q_class; /* class of query */ u_int16_t q_type; /* type of query */ #ifdef BIND_NOTIFY - int q_notifyzone; /* zone which needs another znotify() + int q_notifyzone; /* zone which needs another notify() * when the reply to this comes in. */ #endif @@ -610,6 +611,8 @@ struct qstream { ns_tcp_tsig_state *tsig_state; /* used by ns_sign_tcp */ int tsig_skip; /* skip calling ns_sign_tcp * during the next flush */ + int tsig_size; /* need to reserve this space + * for the tsig. */ struct qs_x_lev { /* decompose the recursion. */ enum {sxl_ns, sxl_all, sxl_sub} state; /* what's this level doing? */ @@ -790,6 +793,7 @@ typedef struct options { u_int lame_ttl; int minroots; u_int16_t preferred_glue; + enum notify notify; } *options; typedef struct key_list_element { diff --git a/contrib/bind/bin/named/ns_forw.c b/contrib/bind/bin/named/ns_forw.c index f62ba20..494a96a 100644 --- a/contrib/bind/bin/named/ns_forw.c +++ b/contrib/bind/bin/named/ns_forw.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)ns_forw.c 4.32 (Berkeley) 3/3/91"; -static const char rcsid[] = "$Id: ns_forw.c,v 8.89 2002/01/29 03:59:36 marka Exp $"; +static const char rcsid[] = "$Id: ns_forw.c,v 8.90 2002/02/22 05:12:35 marka Exp $"; #endif /* not lint */ /* @@ -467,6 +467,7 @@ nslookup(struct databuf *nsp[], struct qinfo *qp, const char *fname; int oldn, naddr, class, found_arr, potential_ns, lame_ns; time_t curtime; + int found_auth6; ns_debug(ns_log_default, 3, "nslookup(nsp=%p, qp=%p, \"%s\", d=%d)", nsp, qp, syslogdname, qp->q_distance); @@ -503,19 +504,17 @@ nslookup(struct databuf *nsp[], struct qinfo *qp, } } + found_arr = 0; + found_auth6 = 0; tmphtp = ((nsdp->d_flags & DB_F_HINT) ?fcachetab :hashtab); np = nlookup(dname, &tmphtp, &fname, 0); if (np == NULL) { ns_debug(ns_log_default, 3, "%s: not found %s %p", dname, fname, np); - found_arr = 0; goto need_sysquery; } - if (fname != dname) { - found_arr = 0; + if (fname != dname) goto need_sysquery; - } - found_arr = 0; oldn = n; /* look for name server addresses */ @@ -534,6 +533,13 @@ nslookup(struct databuf *nsp[], struct qinfo *qp, } if (dp->d_rcode == NXDOMAIN && dp->d_class == class) goto skipserver; + if (dp->d_class == class && + (dp->d_type == T_AAAA || dp->d_type == ns_t_a6) && + (zones[dp->d_zone].z_type == z_master || + zones[dp->d_zone].z_type == z_slave)) { + found_auth6++; + continue; + } if (dp->d_type != T_A || dp->d_class != class) continue; if (dp->d_rcode) { @@ -683,7 +689,7 @@ nslookup(struct databuf *nsp[], struct qinfo *qp, } ns_debug(ns_log_default, 8, "nslookup: %d ns addrs", n); need_sysquery: - if (found_arr == 0) { + if (found_arr == 0 && found_auth6 == 0) { potential_ns++; if (qp->q_distance < NS_MAX_DISTANCE) (void) sysquery(dname, class, T_A, NULL, NULL, diff --git a/contrib/bind/bin/named/ns_func.h b/contrib/bind/bin/named/ns_func.h index 501aa01..e035d93 100644 --- a/contrib/bind/bin/named/ns_func.h +++ b/contrib/bind/bin/named/ns_func.h @@ -90,7 +90,7 @@ /* ns_func.h - declarations for ns_*.c's externally visible functions * - * $Id: ns_func.h,v 8.115 2002/01/29 03:59:38 marka Exp $ + * $Id: ns_func.h,v 8.117 2002/04/25 05:27:07 marka Exp $ */ /* ++from ns_glue.c++ */ @@ -313,6 +313,7 @@ void qserial_answer(struct qinfo *); void printzoneinfo(int, int, int); #endif void endxfer(void); +void tryxfer(void); void addxfer(struct zoneinfo *); void ns_zreload(void); void ns_reload(void); @@ -421,7 +422,7 @@ int set_zone_type(zone_config, int); int set_zone_filename(zone_config, char *); int set_zone_checknames(zone_config, enum severity); #ifdef BIND_NOTIFY -int set_zone_notify(zone_config, int value); +int set_zone_notify(zone_config, enum notify value); #endif int set_zone_maintain_ixfr_base(zone_config, int value); int set_zone_update_acl(zone_config, ip_match_list); diff --git a/contrib/bind/bin/named/ns_lexer.c b/contrib/bind/bin/named/ns_lexer.c index 4a6f820..b10219a 100644 --- a/contrib/bind/bin/named/ns_lexer.c +++ b/contrib/bind/bin/named/ns_lexer.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ns_lexer.c,v 8.28 2001/12/28 04:07:47 marka Exp $"; +static const char rcsid[] = "$Id: ns_lexer.c,v 8.30 2002/04/25 05:27:08 marka Exp $"; #endif /* not lint */ /* @@ -57,7 +57,7 @@ typedef enum lexer_state { #define LEXER_MAX_PUSHBACK 2 typedef struct lexer_file_context { - const char * name; + char * name; FILE * stream; int line_number; LexerState state; @@ -251,6 +251,7 @@ static struct keyword keywords[] = { {"directory", T_DIRECTORY}, {"dump-file", T_DUMP_FILE}, {"dynamic", T_DYNAMIC}, + {"explicit", T_EXPLICIT}, {"fail", T_FAIL}, {"fake-iquery", T_FAKE_IQUERY}, {"false", T_FALSE}, @@ -400,7 +401,7 @@ lexer_begin_file(const char *filename, FILE *stream) { panic("memget failed in lexer_begin_file", NULL); INSIST(stream != NULL); lf->stream = stream; - lf->name = filename; /* note copy by reference */ + lf->name = savestr(filename, 1); lf->line_number = 1; lf->state = scan; lf->flags = 0; @@ -419,6 +420,7 @@ lexer_end_file(void) { lf = current_file; current_file = lf->next; fclose(lf->stream); + freestr(lf->name); memput(lf, sizeof *lf); } diff --git a/contrib/bind/bin/named/ns_main.c b/contrib/bind/bin/named/ns_main.c index 23cf249..d839387 100644 --- a/contrib/bind/bin/named/ns_main.c +++ b/contrib/bind/bin/named/ns_main.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)ns_main.c 4.55 (Berkeley) 7/1/91"; -static const char rcsid[] = "$Id: ns_main.c,v 8.155 2001/11/16 05:37:27 marka Exp $"; +static const char rcsid[] = "$Id: ns_main.c,v 8.157 2002/04/13 23:26:16 marka Exp $"; #endif /* not lint */ /* @@ -570,18 +570,46 @@ main(int argc, char *argv[]) { } static int +sq_closeone(void) { + struct qstream *sp, *nextsp; + struct qstream *candidate = NULL; + time_t lasttime, maxctime = 0; + int result = 0; + + gettime(&tt); + + for (sp = streamq; sp; sp = nextsp) { + nextsp = sp->s_next; + if (sp->s_refcnt) + continue; + lasttime = tt.tv_sec - sp->s_time; + if (lasttime >= VQEXPIRY) { + sq_remove(sp); + result = 1; + } else if (lasttime > maxctime) { + candidate = sp; + maxctime = lasttime; + } + } + if (candidate) { + sq_remove(candidate); + result = 1; + } + return (result); +} + +static int ns_socket(int domain, int type, int protocol) { - int fd; + int fd, tmp; + again: fd = socket(domain, type, protocol); - if (fd == -1) - return (-1); #ifdef F_DUPFD /* XXX */ /* * Leave a space for stdio to work in. */ if (fd >= 0 && fd <= 20) { - int new, tmp; + int new; if ((new = fcntl(fd, F_DUPFD, 20)) == -1) ns_notice(ns_log_default, "fcntl(fd, F_DUPFD, 20): %s", strerror(errno)); @@ -591,6 +619,11 @@ ns_socket(int domain, int type, int protocol) { fd = new; } #endif + tmp = errno; + if (errno == EMFILE) + if (sq_closeone()) + goto again; + errno = tmp; return (fd); } @@ -680,25 +713,7 @@ stream_accept(evContext lev, void *uap, int rfd, * eventlib which will call us right back. */ if (streamq) { - struct qstream *nextsp; - struct qstream *candidate = NULL; - time_t lasttime, maxctime = 0; - - for (sp = streamq; sp; sp = nextsp) { - nextsp = sp->s_next; - if (sp->s_refcnt) - continue; - gettime(&tt); - lasttime = tt.tv_sec - sp->s_time; - if (lasttime >= VQEXPIRY) - sq_remove(sp); - else if (lasttime > maxctime) { - candidate = sp; - maxctime = lasttime; - } - } - if (candidate) - sq_remove(candidate); + (void)sq_closeone(); return; } /* fall through */ @@ -808,19 +823,20 @@ tcp_send(struct qinfo *qp) { struct qstream *sp; struct sockaddr_in src; int on = 1, n; + int fd; ns_debug(ns_log_default, 1, "tcp_send"); - if ((sp = sq_add()) == NULL) { + if ((fd = ns_socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) == -1) return (SERVFAIL); - } - if ((sp->s_rfd = ns_socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) == -1) { - sq_remove(sp); + if (fd > evHighestFD(ev)) { + close(fd); return (SERVFAIL); } - if (sp->s_rfd > evHighestFD(ev)) { - sq_remove(sp); + if ((sp = sq_add()) == NULL) { + close(fd); return (SERVFAIL); } + sp->s_rfd = fd; if (setsockopt(sp->s_rfd, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on)) < 0) ns_info(ns_log_default, @@ -2837,6 +2853,7 @@ init_needs(void) { handlers[main_need_restart] = ns_restart; handlers[main_need_reap] = reapchild; handlers[main_need_noexpired] = ns_noexpired; + handlers[main_need_tryxfer] = tryxfer; } static void diff --git a/contrib/bind/bin/named/ns_maint.c b/contrib/bind/bin/named/ns_maint.c index 0408936..82df685 100644 --- a/contrib/bind/bin/named/ns_maint.c +++ b/contrib/bind/bin/named/ns_maint.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)ns_maint.c 4.39 (Berkeley) 3/2/91"; -static const char rcsid[] = "$Id: ns_maint.c,v 8.131 2001/11/12 04:49:32 marka Exp $"; +static const char rcsid[] = "$Id: ns_maint.c,v 8.135 2002/04/25 05:27:10 marka Exp $"; #endif /* not lint */ /* @@ -132,7 +132,6 @@ static int nxfers(struct zoneinfo *), static void startxfer(struct zoneinfo *), abortxfer(struct zoneinfo *), - tryxfer(void), purge_z_2(struct hashbuf *, int); static int purge_nonglue_2(const char *, struct hashbuf *, int, int, int); @@ -453,9 +452,10 @@ ns_heartbeat(evContext ctx, void *uap, struct timespec due, * Trigger a refresh query while the link is up by * sending a notify. */ - if (((zp->z_notify == znotify_yes) || - ((zp->z_notify == znotify_use_default) && - !NS_OPTION_P(OPTION_NONOTIFY))) && + if (((zp->z_notify == notify_yes) || + (zp->z_notify == notify_explicit) || + ((zp->z_notify == notify_use_default) && + server_options->notify != notify_no)) && (zt == z_master || zt == z_slave) && !loading && ((zp->z_flags & Z_AUTH) != 0)) ns_notify(zp->z_origin, zp->z_class, ns_t_soa); @@ -1199,6 +1199,22 @@ remove_zone(struct zoneinfo *zp, const char *verb) { xfers_deferred--; } ns_stopxfrs(zp); + if ((zp->z_flags & Z_XFER_RUNNING) != 0) { + int i; + /* Kill and abandon the current transfer. */ + for (i = 0; i < MAX_XFERS_RUNNING; i++) { + if (xferstatus[i].xfer_pid == zp->z_xferpid) { + xferstatus[i].xfer_pid = 0; + xferstatus[i].xfer_state = XFER_IDLE; + xfers_running--; + break; + } + } + (void)kill(zp->z_xferpid, SIGTERM); + zp->z_flags &= ~(Z_XFER_RUNNING|Z_XFER_ABORTED|Z_XFER_GONE); + zp->z_xferpid = 0; + ns_need(main_need_tryxfer); + } do_reload(zp->z_origin, zp->z_type, zp->z_class, 1); ns_notice(ns_log_config, "%s zone \"%s\" (%s) %s", zoneTypeString(zp->z_type), zp->z_origin, @@ -1692,7 +1708,7 @@ endxfer() { /* * Try to start some xfers - new "fair scheduler" by Bob Halley @DEC (1995) */ -static void +void tryxfer() { static struct zoneinfo *zp = NULL; static struct zoneinfo *lastzones = NULL; diff --git a/contrib/bind/bin/named/ns_notify.c b/contrib/bind/bin/named/ns_notify.c index cde636a..286b3eb 100644 --- a/contrib/bind/bin/named/ns_notify.c +++ b/contrib/bind/bin/named/ns_notify.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ns_notify.c,v 8.18 2001/11/12 04:49:33 marka Exp $"; +static const char rcsid[] = "$Id: ns_notify.c,v 8.20 2002/04/25 05:27:12 marka Exp $"; #endif /* not lint */ /* @@ -56,12 +56,12 @@ static const char rcsid[] = "$Id: ns_notify.c,v 8.18 2001/11/12 04:49:33 marka E /* Types. */ -struct notify { +struct pnotify { char * name; ns_class class; ns_type type; evTimerID timer; - LINK(struct notify) link; + LINK(struct pnotify) link; }; /* Forward. */ @@ -71,14 +71,14 @@ static void sysnotify_slaves(const char *, const char *, ns_class, ns_type, int, int *, int *); static void sysnotify_ns(const char *, const char *, ns_class, ns_type, int, int *, int *); -static void free_notify(struct notify *); +static void free_notify(struct pnotify *); static void notify_timer(evContext, void *, struct timespec, struct timespec); /* Local. */ -static LIST(struct notify) pending_notifies; -static LIST(struct notify) loading_notifies; +static LIST(struct pnotify) pending_notifies; +static LIST(struct pnotify) loading_notifies; /* Public. */ @@ -91,7 +91,7 @@ ns_notify(const char *dname, ns_class class, ns_type type) { static const char no_room[] = "%s failed, cannot notify for zone %s"; int delay, max_delay; struct zoneinfo *zp; - struct notify *ni; + struct pnotify *ni; zp = find_auth_zone(dname, class); if (zp == NULL) { @@ -162,7 +162,7 @@ ns_notify(const char *dname, ns_class class, ns_type type) { void notify_afterload() { - struct notify *ni; + struct pnotify *ni; INSIST(loading == 0); while ((ni = HEAD(loading_notifies)) != NULL) { @@ -180,7 +180,7 @@ notify_afterload() { void ns_unnotify(void) { while (!EMPTY(pending_notifies)) { - struct notify *ni = HEAD(pending_notifies); + struct pnotify *ni = HEAD(pending_notifies); INSIST(LINKED(ni, link)); UNLINK(pending_notifies, ni, link); @@ -194,7 +194,7 @@ ns_unnotify(void) { */ void ns_stopnotify(const char *dname, ns_class class) { - struct notify *ni; + struct pnotify *ni; ni = HEAD(pending_notifies); while (ni != NULL && @@ -235,9 +235,9 @@ sysnotify(const char *dname, ns_class class, ns_type type) { dname); return; } - if (zp->z_notify == znotify_no || - (zp->z_notify == znotify_use_default && - NS_OPTION_P(OPTION_NONOTIFY))) + if (zp->z_notify == notify_no || + (zp->z_notify == notify_use_default && + server_options->notify == notify_no)) return; if (zp->z_type != z_master && zp->z_type != z_slave) { ns_warning(ns_log_notify, "sysnotify: %s not master or slave", @@ -247,7 +247,11 @@ sysnotify(const char *dname, ns_class class, ns_type type) { zname = zp->z_origin; zserial = zp->z_serial; nns = na = 0; - sysnotify_slaves(dname, zname, class, type, zp - zones, &nns, &na); + if (zp->z_notify == notify_yes || + (zp->z_notify == notify_use_default && + server_options->notify == notify_yes)) + sysnotify_slaves(dname, zname, class, type, + zp - zones, &nns, &na); /* * Handle any global or zone-specific also-notify clauses @@ -351,18 +355,26 @@ sysnotify_ns(const char *dname, const char *aname, const char *fname; struct in_addr nss[NSMAX]; struct hashbuf *htp; - int is_us, nsc; + int is_us, nsc, auth6, neg; int cname = 0; htp = hashtab; anp = nlookup(aname, &htp, &fname, 0); nsc = 0; is_us = 0; + auth6 = 0; + neg = 0; if (anp != NULL) for (adp = anp->n_data; adp; adp = adp->d_next) { struct in_addr ina; - if (match(adp, class, T_CNAME)) { + if (adp->d_class != class) + continue; + if (adp->d_rcode == NXDOMAIN) { + neg = 1; + break; + } + if (adp->d_type == T_CNAME && adp->d_rcode == 0) { cname = 1; ns_error(ns_log_notify, "NS '%s' for '%s/%s' is a CNAME", @@ -371,8 +383,18 @@ sysnotify_ns(const char *dname, const char *aname, p_class(class)); break; } + if ((adp->d_type == T_AAAA || adp->d_type == ns_t_a6) && + (zones[adp->d_class].z_type == z_master || + zones[adp->d_class].z_type == z_slave)) { + auth6 = 1; + continue; + } if (!match(adp, class, T_A)) continue; + if (adp->d_rcode) { + neg = 1; + continue; + } if (adp->d_type == ns_t_sig) continue; ina = ina_get(adp->d_data); @@ -384,7 +406,8 @@ sysnotify_ns(const char *dname, const char *aname, nss[nsc++] = ina; } /*next A*/ if (nsc == 0) { - if (!is_us && !cname && !NS_OPTION_P(OPTION_NOFETCHGLUE)) { + if (!is_us && !cname && !auth6 && !neg && + !NS_OPTION_P(OPTION_NOFETCHGLUE)) { struct qinfo *qp; qp = sysquery(aname, class, ns_t_a, NULL, NULL, 0, @@ -400,7 +423,7 @@ sysnotify_ns(const char *dname, const char *aname, } static void -free_notify(struct notify *ni) { +free_notify(struct pnotify *ni) { struct zoneinfo *zp; INSIST(!LINKED(ni, link)); @@ -422,7 +445,7 @@ notify_timer(evContext ctx, void *uap, struct timespec due, struct timespec inter) { - struct notify *ni = uap; + struct pnotify *ni = uap; UNUSED(ctx); UNUSED(due); diff --git a/contrib/bind/bin/named/ns_parser.y b/contrib/bind/bin/named/ns_parser.y index 0fe9dc7..8e62962 100644 --- a/contrib/bind/bin/named/ns_parser.y +++ b/contrib/bind/bin/named/ns_parser.y @@ -1,6 +1,6 @@ %{ #if !defined(lint) && !defined(SABER) -static char rcsid[] = "$Id: ns_parser.y,v 8.78 2001/12/28 04:07:48 marka Exp $"; +static char rcsid[] = "$Id: ns_parser.y,v 8.79 2002/04/25 05:27:13 marka Exp $"; #endif /* not lint */ /* @@ -150,7 +150,7 @@ int yyparse(); %token T_TRANSFER_FORMAT T_MAX_TRANSFER_TIME_IN %token T_SERIAL_QUERIES T_ONE_ANSWER T_MANY_ANSWERS %type <axfr_fmt> transfer_format -%token T_NOTIFY T_NOTIFY_INITIAL T_AUTH_NXDOMAIN +%token T_NOTIFY T_EXPLICIT T_NOTIFY_INITIAL T_AUTH_NXDOMAIN %token T_MULTIPLE_CNAMES T_USE_IXFR T_MAINTAIN_IXFR_BASE %token T_CLEAN_INTERVAL T_INTERFACE_INTERVAL T_STATS_INTERVAL %token T_MAX_LOG_SIZE_IXFR @@ -374,10 +374,16 @@ option: /* Empty */ set_global_boolean_option(current_options, OPTION_HITCOUNT, $2); } + | T_NOTIFY T_EXPLICIT + { + current_options->notify = notify_explicit; + } | T_NOTIFY yea_or_nay { - set_global_boolean_option(current_options, - OPTION_NONOTIFY, !$2); + if ($2) + current_options->notify = notify_yes; + else + current_options->notify = notify_no; } | T_NOTIFY_INITIAL yea_or_nay { @@ -1681,9 +1687,16 @@ zone_option: T_TYPE zone_type { set_zone_max_log_size_ixfr(current_zone, $2); } + | T_NOTIFY T_EXPLICIT + { + set_zone_notify(current_zone, notify_explicit); + } | T_NOTIFY yea_or_nay { - set_zone_notify(current_zone, $2); + if ($2) + set_zone_notify(current_zone, notify_yes); + else + set_zone_notify(current_zone, notify_no); } | T_MAINTAIN_IXFR_BASE yea_or_nay { diff --git a/contrib/bind/bin/named/ns_req.c b/contrib/bind/bin/named/ns_req.c index 6695881..1a1d756 100644 --- a/contrib/bind/bin/named/ns_req.c +++ b/contrib/bind/bin/named/ns_req.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)ns_req.c 4.47 (Berkeley) 7/1/91"; -static const char rcsid[] = "$Id: ns_req.c,v 8.162 2002/02/01 00:05:36 marka Exp $"; +static const char rcsid[] = "$Id: ns_req.c,v 8.168 2002/04/30 03:43:52 marka Exp $"; #endif /* not lint */ /* @@ -231,24 +231,10 @@ ns_get_opt(u_char *msg, u_char *eom, version = *cp++; GETSHORT(flags, cp); GETSHORT(rdlen, cp); - /* ensure options are well formed */ + if (cp + rdlen > eom) + return (-1); options = cp; optsize = rdlen; - while (rdlen != 0) { - u_int16_t code; - u_int16_t len; - - if (rdlen < 4) - return (-1); - GETSHORT(code, cp); - GETSHORT(len, cp); - rdlen -= 4; - if (len > rdlen) - return (-1); - cp += len; - rdlen -= len; - } - /* Everything checks out. */ if (versionp != NULL) *versionp = version; if (rcodep != NULL) @@ -315,6 +301,7 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, u_int16_t rcode = ns_r_noerror; u_int16_t udpsize = 0; int drop; + int tsig_adjust = 0; #ifdef DEBUG if (debug > 3) { @@ -332,9 +319,18 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, has_tsig = 0; else { char buf[MAXDNAME]; + u_char tmp[NS_MAXCDNAME]; has_tsig = 1; - n = dn_expand(msg, msg + msglen, tsigstart, buf, sizeof buf); + n = ns_name_unpack(msg, msg + msglen, tsigstart, + tmp, sizeof tmp); + if (n > 0) { + tsig_adjust = dn_skipname(tmp, tmp + sizeof(tmp)) - n; + if (ns_name_ntop(tmp, buf, sizeof buf) == -1) + n = -1; + else if (buf[0] == '.') + buf[0] = '\0'; + } if (n < 0) { ns_debug(ns_log_default, 1, "ns_req: bad TSIG key name"); @@ -395,7 +391,8 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, in_tsig->siglen = siglen; memcpy(in_tsig->sig, sig, siglen); tsig_size = msglen_orig - msglen; - in_tsig->tsig_size = tsig_size; + /* AXFR/IXFR need the uncompressed tsig size. */ + in_tsig->tsig_size = tsig_size + tsig_adjust; } else if (has_tsig) { action = Finish; in_tsig = memget(sizeof(struct tsig_record)); @@ -576,8 +573,9 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, sig2len = sizeof sig2; msglen = cp - msg; buflen = buflen_orig - msglen; - n = ns_sign(msg, &msglen, msglen + buflen, error, key, - sig, siglen, sig2, &sig2len, tsig_time); + n = ns_sign2(msg, &msglen, msglen + buflen, error, key, + sig, siglen, sig2, &sig2len, tsig_time, + dnptrs, dnptrs_end); if (n == NS_TSIG_ERROR_NO_SPACE && ntohs(hp->qdcount) != 0) { hp->qdcount = htons(0); @@ -609,12 +607,14 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, INSIST(n > 0); cp += n; buflen -= n; + msglen += n; } if (has_tsig > 0) { buflen += tsig_size; sig2len = sizeof sig2; - n = ns_sign(msg, &msglen, msglen + buflen, error, key, - sig, siglen, sig2, &sig2len, tsig_time); + n = ns_sign2(msg, &msglen, msglen + buflen, error, key, + sig, siglen, sig2, &sig2len, tsig_time, + dnptrs, dnptrs_end); if (n != 0) { INSIST(0); } @@ -1218,12 +1218,17 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp, goto fetchns; } } +#ifdef NXDOMAIN_ON_DENIAL + hp->rcode = ns_r_nxdomain; + return (Finish); +#else ns_notice(ns_log_security, "denied query from %s for \"%s\" %s/%s", sin_ntoa(from), *dname ? dname : ".", p_type(type), p_class(class)); nameserIncr(from.sin_addr, nssRcvdUQ); return (Refuse); +#endif } } else { ip_match_list transfer_acl; @@ -2315,7 +2320,10 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) { cp = msg; loop: for (ap = addinfo, i = 0; i < addcount; ap++, i++) { - int foundany = 0, + int auth = 0, + founda = 0, + foundaaaa = 0, + founda6 = 0, foundcname = 0, save_count = count, save_msglen = msglen; @@ -2340,16 +2348,27 @@ loop: /* look for the data */ (void)delete_stale(np); for (dp = np->n_data; dp != NULL; dp = dp->d_next) { + if (dp->d_class != ap->a_class) + continue; if (dp->d_rcode == NXDOMAIN) { - if (dp->d_class == ap->a_class) - foundany++; + founda = founda6 = foundaaaa = 1; continue; } - if ((match(dp, (int)ap->a_class, T_CNAME) && - dp->d_type == T_CNAME)) { + switch (dp->d_type) { + case ns_t_a: founda = 1; break; + case ns_t_a6: founda6 = 1; break; + case ns_t_aaaa: foundaaaa = 1; break; + } + if (!dp->d_rcode && dp->d_type == T_CNAME) { foundcname++; break; } + if (auth == 0 && ap->a_type == T_A && + (dp->d_type == ns_t_a || dp->d_type == ns_t_a6 || + dp->d_type == ns_t_aaaa) && + (zones[dp->d_zone].z_type == z_master || + zones[dp->d_zone].z_type == z_slave)) + auth = 1; if (pass == 0 && ap->a_type == T_A && server_options->preferred_glue != 0 && !match(dp, (int)ap->a_class, @@ -2374,8 +2393,6 @@ loop: if (ap->a_type == T_SRV && !match(dp, (int)ap->a_class, T_SRV)) continue; - - foundany++; if (dp->d_rcode) continue; /* @@ -2417,12 +2434,20 @@ loop: } next_rr: if (!NS_OPTION_P(OPTION_NOFETCHGLUE) && - !foundcname && !foundany && - (ap->a_type == T_A || ap->a_type == T_AAAA)) { + !foundcname && ap->a_type == T_A) { /* ask a real server for this info */ - (void) sysquery(ap->a_dname, (int)ap->a_class, - ap->a_type, NULL, NULL, 0, ns_port, - QUERY, 0); + if (!founda && !auth) + (void) sysquery(ap->a_dname, (int)ap->a_class, + ns_t_a, NULL, NULL, 0, ns_port, + QUERY, 0); + if (!foundaaaa && !auth) + (void) sysquery(ap->a_dname, (int)ap->a_class, + ns_t_aaaa, NULL, NULL, 0, + ns_port, QUERY, 0); + if (!founda6 && !auth) + (void) sysquery(ap->a_dname, (int)ap->a_class, + ns_t_a6, NULL, NULL, 0, ns_port, + QUERY, 0); } if (foundcname) { if (!haveComplained(nhash(ap->a_dname), diff --git a/contrib/bind/bin/named/ns_resp.c b/contrib/bind/bin/named/ns_resp.c index ea62674..5be0038 100644 --- a/contrib/bind/bin/named/ns_resp.c +++ b/contrib/bind/bin/named/ns_resp.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)ns_resp.c 4.65 (Berkeley) 3/3/91"; -static const char rcsid[] = "$Id: ns_resp.c,v 8.172 2002/01/31 00:06:41 marka Exp $"; +static const char rcsid[] = "$Id: ns_resp.c,v 8.176 2002/04/17 07:10:10 marka Exp $"; #endif /* not lint */ /* @@ -182,7 +182,8 @@ static int rrsetcmp(char *, struct db_list *, struct hashbuf *), struct sockaddr_in, char **); static void mark_bad(struct qinfo *qp, struct sockaddr_in from); static void mark_lame(struct qinfo *qp, struct sockaddr_in from); -static int mark_noedns(struct qinfo *qp, struct sockaddr_in from); +static int mark_noedns(struct qinfo *qp, struct sockaddr_in from, + int cache); static void fast_retry(struct qinfo *qp, struct sockaddr_in from, int samehost); static void add_related_additional(char *); @@ -417,15 +418,15 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp) switch (hp->rcode) { case SERVFAIL: nameserIncr(from.sin_addr, nssRcvdFail); - noedns = mark_noedns(qp, from); + noedns = mark_noedns(qp, from, 0); break; case FORMERR: nameserIncr(from.sin_addr, nssRcvdFErr); - noedns = mark_noedns(qp, from); + noedns = mark_noedns(qp, from, 1); break; case NOTIMP: nameserIncr(from.sin_addr, nssRcvdErr); - noedns = mark_noedns(qp, from); + noedns = mark_noedns(qp, from, 1); break; default: nameserIncr(from.sin_addr, nssRcvdErr); @@ -1059,6 +1060,7 @@ tcp_retry: /* Additional section. */ switch (type) { case T_A: + case ns_t_a6: case T_AAAA: case T_SRV: if (externalcname || @@ -1778,6 +1780,7 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp, case T_LOC: case T_KEY: case ns_t_cert: + case ns_t_opt: cp1 = cp; n = dlen; cp += n; @@ -1859,6 +1862,8 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp, } n = cp1 - data; cp1 = data; + if (tnamep != NULL && type == T_SOA) + *tnamep = savestr((char *)cp1, 1); break; case T_NAPTR: @@ -3933,14 +3938,14 @@ trunc_adjust(u_char *msg, int msglen, int outlen) { * mark the server "from" bad in the qp structure so it won't be retried. */ static int -mark_noedns(struct qinfo *qp, struct sockaddr_in from) { +mark_noedns(struct qinfo *qp, struct sockaddr_in from, int cache) { int i; for (i = 0; i < (int)qp->q_naddr; i++) if (ina_equal(qp->q_addr[i].ns_addr.sin_addr, from.sin_addr)) { if (qp->q_addr[i].noedns) return (1); - if (qp->q_addr[i].nsdata) + if (qp->q_addr[i].nsdata && cache) qp->q_addr[i].nsdata->d_noedns = 1; qp->q_addr[i].noedns = 1; break; diff --git a/contrib/bind/bin/named/ns_xfr.c b/contrib/bind/bin/named/ns_xfr.c index ab23b6b..d7a8505 100644 --- a/contrib/bind/bin/named/ns_xfr.c +++ b/contrib/bind/bin/named/ns_xfr.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ns_xfr.c,v 8.67 2001/07/10 05:06:50 marka Exp $"; +static const char rcsid[] = "$Id: ns_xfr.c,v 8.68 2002/04/11 05:19:06 marka Exp $"; #endif /* not lint */ /* @@ -180,13 +180,15 @@ ns_xfr(struct qstream *qsp, struct namebuf *znp, qsp->xfr.transfer_format = si->transfer_format; else qsp->xfr.transfer_format = server_options->transfer_format; - if (in_tsig == NULL) + if (in_tsig == NULL) { qsp->xfr.tsig_state = NULL; - else { + qsp->xfr.tsig_size = 0; + } else { qsp->xfr.tsig_state = memget(sizeof(ns_tcp_tsig_state)); ns_sign_tcp_init(in_tsig->key, in_tsig->sig, in_tsig->siglen, qsp->xfr.tsig_state); qsp->xfr.tsig_skip = 0; + qsp->xfr.tsig_size = in_tsig->tsig_size; } if (type == ns_t_ixfr) { @@ -393,14 +395,15 @@ sx_addrr(struct qstream *qsp, const char *dname, struct databuf *dp) { } } - n = make_rr(dname, dp, qsp->xfr.cp, qsp->xfr.eom - qsp->xfr.cp, - 0, qsp->xfr.ptrs, edp, 0); + n = make_rr(dname, dp, qsp->xfr.cp, qsp->xfr.eom - qsp->xfr.cp - + qsp->xfr.tsig_size, 0, qsp->xfr.ptrs, edp, 0); if (n < 0) { if (sx_flush(qsp) < 0) return (-1); if (qsp->xfr.cp == NULL) sx_newmsg(qsp); - n = make_rr(dname, dp, qsp->xfr.cp, qsp->xfr.eom - qsp->xfr.cp, + n = make_rr(dname, dp, qsp->xfr.cp, qsp->xfr.eom - + qsp->xfr.cp - qsp->xfr.tsig_size, 0, qsp->xfr.ptrs, edp, 0); INSIST(n >= 0); } diff --git a/contrib/bind/bin/nslookup/list.c b/contrib/bind/bin/nslookup/list.c index c910230..3255a19 100644 --- a/contrib/bind/bin/nslookup/list.c +++ b/contrib/bind/bin/nslookup/list.c @@ -53,7 +53,7 @@ #ifndef lint static const char sccsid[] = "@(#)list.c 5.23 (Berkeley) 3/21/91"; -static const char rcsid[] = "$Id: list.c,v 8.26 2001/06/18 14:43:38 marka Exp $"; +static const char rcsid[] = "$Id: list.c,v 8.27 2002/04/09 05:55:17 marka Exp $"; #endif /* not lint */ /* @@ -258,7 +258,9 @@ ListSubr(int qtype, char *domain, char *cmd) { ns_msg handle; querybuf buf; - struct sockaddr_in sin; + struct sockaddr_storage sa; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; HEADER *headerPtr; int msglen, amtToRead, numRead, soacnt; u_int len; @@ -269,6 +271,8 @@ ListSubr(int qtype, char *domain, char *cmd) { enum { NO_ERRORS, ERR_READING_LEN, ERR_READING_MSG, ERR_PRINTING } error = NO_ERRORS; struct iovec iov[2]; + AddrInfo *AddrPtr; + int salen = 0; /* * Create a query packet for the requested domain name. @@ -281,10 +285,6 @@ ListSubr(int qtype, char *domain, char *cmd) { return (ERROR); } - memset(&sin, 0, sizeof sin); - sin.sin_family = AF_INET; - sin.sin_port = htons(nsport); - /* * Check to see if we have the address of the server or the * address of a server who knows about this domain. @@ -293,20 +293,44 @@ ListSubr(int qtype, char *domain, char *cmd) { */ if (defaultPtr->addrList != NULL) - sin.sin_addr = *(struct in_addr *) defaultPtr->addrList[0]; + AddrPtr = defaultPtr->addrList[0]; else - sin.sin_addr = *(struct in_addr *) - defaultPtr->servers[0]->addrList[0]; + AddrPtr = defaultPtr->servers[0]->addrList[0]; + + memset(&sa, 0, sizeof sa); + switch (AddrPtr->addrType) { + case AF_INET: + sin = (struct sockaddr_in *)&sa; + sin->sin_family = AddrPtr->addrType; + sin->sin_port = htons(nsport); + memcpy(&sin->sin_addr, AddrPtr->addr, AddrPtr->addrLen); +#ifdef HAVE_SA_LEN + sin->sin_len = sizeof(*sin); +#endif + salen = sizeof(struct sockaddr_in); + break; + + case AF_INET6: + sin6 = (struct sockaddr_in6 *)&sa; + sin6->sin6_family = AddrPtr->addrType; + sin6->sin6_port = htons(nsport); + memcpy(&sin6->sin6_addr, AddrPtr->addr, AddrPtr->addrLen); +#ifdef HAVE_SA_LEN + sin6->sin6_len = sizeof(*sin6); +#endif + salen = sizeof(struct sockaddr_in6); + break; + } /* * Set up a virtual circuit to the server. */ - sockFD = socket(AF_INET, SOCK_STREAM, 0); + sockFD = socket(AddrPtr->addrType, SOCK_STREAM, 0); if (sockFD < 0) { perror("ls: socket"); return (ERROR); } - if (connect(sockFD, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + if (connect(sockFD, (struct sockaddr *)&sa, salen) < 0) { int e; if (errno == ECONNREFUSED) @@ -530,13 +554,16 @@ Finger(string, putToFile) int putToFile; { struct servent *sp; - struct sockaddr_in sin; + struct sockaddr_storage sa; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; FILE *f; int c; int lastc; char name[NAME_LEN]; char file[PATH_MAX]; int i; + int salen = 0; /* * We need a valid current host info to get an inet address. @@ -573,23 +600,45 @@ Finger(string, putToFile) return (ERROR); } - memset(&sin, 0, sizeof sin); - sin.sin_family = curHostInfo.addrType; - sin.sin_port = sp->s_port; - memcpy(&sin.sin_addr, curHostInfo.addrList[0], curHostInfo.addrLen); + memset(&sa, 0, sizeof sa); + switch (curHostInfo.addrList[0]->addrType) { + case AF_INET: + sin = (struct sockaddr_in *)&sa; + sin->sin_family = curHostInfo.addrList[0]->addrType; + sin->sin_port = sp->s_port; + memcpy(&sin->sin_addr, curHostInfo.addrList[0]->addr, + curHostInfo.addrList[0]->addrLen); +#ifdef HAVE_SA_LEN + sin->sin_len = sizeof(*sin); +#endif + salen = sizeof(struct sockaddr_in); + break; + + case AF_INET6: + sin6 = (struct sockaddr_in6 *)&sa; + sin6->sin6_family = curHostInfo.addrList[0]->addrType; + sin6->sin6_port = sp->s_port; + memcpy(&sin6->sin6_addr, curHostInfo.addrList[0]->addr, + curHostInfo.addrList[0]->addrLen); +#ifdef HAVE_SA_LEN + sin6->sin6_len = sizeof(*sin6); +#endif + salen = sizeof(struct sockaddr_in6); + break; + } /* * Set up a virtual circuit to the host. */ - sockFD = socket(curHostInfo.addrType, SOCK_STREAM, 0); + sockFD = socket(curHostInfo.addrList[0]->addrType, SOCK_STREAM, 0); if (sockFD < 0) { fflush(stdout); perror("finger: socket"); return (ERROR); } - if (connect(sockFD, (struct sockaddr *)&sin, sizeof (sin)) < 0) { + if (connect(sockFD, (struct sockaddr *)&sa, salen) < 0) { fflush(stdout); perror("finger: connect"); close(sockFD); diff --git a/contrib/bind/bin/nslookup/res.h b/contrib/bind/bin/nslookup/res.h index 79f8633..fe9241d 100644 --- a/contrib/bind/bin/nslookup/res.h +++ b/contrib/bind/bin/nslookup/res.h @@ -55,7 +55,7 @@ /* * @(#)res.h 5.10 (Berkeley) 6/1/90 - * $Id: res.h,v 8.9 2001/06/20 12:30:34 marka Exp $ + * $Id: res.h,v 8.10 2002/04/09 05:55:22 marka Exp $ */ /* @@ -131,18 +131,22 @@ typedef int Boolean; * for use in system calls)." */ +typedef struct { + int addrType; + int addrLen; + char *addr; +} AddrInfo; + typedef struct { char *name; /* official name of host */ char **domains; /* domains it serves */ - char **addrList; /* list of addresses from name server */ + AddrInfo **addrList; /* list of addresses from name server */ } ServerInfo; typedef struct { char *name; /* official name of host */ char **aliases; /* alias list */ - char **addrList; /* list of addresses from name server */ - int addrType; /* host address type */ - int addrLen; /* length of address */ + AddrInfo **addrList; /* list of addresses from name server */ ServerInfo **servers; } HostInfo; @@ -188,15 +192,14 @@ extern void PrintHostInfo(); extern void FreeHostInfoPtr(); extern FILE *OpenFile(); extern int pickString(const char *, char *, size_t); -extern int GetHostInfoByName(struct in_addr *, int, int, const char *, - HostInfo *, Boolean); -extern int GetHostInfoByAddr(); -extern int GetHostDomain(struct in_addr *, int, int, const char *, char *, - HostInfo *, Boolean); +extern int GetHostInfoByName(union res_sockaddr_union *, int, int, + const char *, HostInfo *, Boolean, Boolean); +extern int GetHostDomain(union res_sockaddr_union *, int, int, + const char *, char *, HostInfo *, Boolean, Boolean); extern int matchString(const char *, const char *); extern int StringToType(char *, int, FILE *); extern int StringToClass(char *, int, FILE *); -extern int SendRequest(struct in_addr *, const u_char *, int, +extern int SendRequest(union res_sockaddr_union *, const u_char *, int, u_char *, u_int, int *); extern void SendRequest_close(void); extern int SetDefaultServer(char *, Boolean); @@ -217,7 +220,8 @@ SIG_FN IntrHandler(int); int ListSubr(int, char *, char *); void FreeHostInfoPtr(HostInfo *); unsigned char * res_skip(unsigned char *, int, unsigned char *); -extern Boolean IsAddr(const char *, struct in_addr *); +extern Boolean IsAddr(const char *, union res_sockaddr_union *); void PrintHelp(void); -int GetHostInfoByAddr(struct in_addr *, struct in_addr *, HostInfo *); +int GetHostInfoByAddr(union res_sockaddr_union *, union res_sockaddr_union *, + HostInfo *); diff --git a/contrib/bind/bin/nslookup/send.c b/contrib/bind/bin/nslookup/send.c index ecbd75d..de60d21 100644 --- a/contrib/bind/bin/nslookup/send.c +++ b/contrib/bind/bin/nslookup/send.c @@ -53,7 +53,7 @@ #ifndef lint static const char sccsid[] = "@(#)send.c 5.18 (Berkeley) 3/2/91"; -static const char rcsid[] = "$Id: send.c,v 8.12 2001/07/03 06:27:12 marka Exp $"; +static const char rcsid[] = "$Id: send.c,v 8.13 2002/04/09 05:55:23 marka Exp $"; #endif /* not lint */ /* @@ -120,8 +120,8 @@ unsigned short nsport = NAMESERVER_PORT; */ int -SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen, - u_char *answer, u_int anslen, int *trueLenPtr) +SendRequest(union res_sockaddr_union *nsAddrPtr, const u_char *buf, + int buflen, u_char *answer, u_int anslen, int *trueLenPtr) { int n, try, v_circuit, resplen; ISC_SOCKLEN_T salen; @@ -136,15 +136,15 @@ SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen, struct iovec iov[2]; int terrno = ETIMEDOUT; char junk[512]; - struct sockaddr_in sin, sa; + struct sockaddr_storage sa; + int family = nsAddrPtr->sin.sin_family; + int clen = (family == AF_INET) ? sizeof(struct sockaddr_in) : + sizeof(struct sockaddr_in6); if (res.options & RES_DEBUG2) { printf("------------\nSendRequest(), len %d\n", buflen); Print_query(buf, buf + buflen, 1); } - sin.sin_family = AF_INET; - sin.sin_port = htons(nsport); - sin.sin_addr = *nsAddrPtr; v_circuit = (res.options & RES_USEVC) || buflen > PACKETSZ; id = hp->id; /* @@ -161,15 +161,15 @@ SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen, */ try = res.retry; if (s < 0) { - s = socket(AF_INET, SOCK_STREAM, 0); + s = socket(family, SOCK_STREAM, 0); if (s < 0) { terrno = errno; if (res.options & RES_DEBUG) perror("socket (vc) failed"); continue; } - if (connect(s, (struct sockaddr *)&sin, - sizeof(struct sockaddr)) < 0) { + if (connect(s, (struct sockaddr *)nsAddrPtr, + clen) < 0) { terrno = errno; if (res.options & RES_DEBUG) perror("connect failed"); @@ -266,7 +266,7 @@ SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen, * Use datagrams. */ if (s < 0) { - s = socket(AF_INET, SOCK_DGRAM, 0); + s = socket(family, SOCK_DGRAM, 0); if (s < 0) { terrno = errno; if (res.options & RES_DEBUG) @@ -276,8 +276,8 @@ SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen, } #if BSD >= 43 if (connected == 0) { - if (connect(s, (struct sockaddr *)&sin, - sizeof sin) < 0) { + if (connect(s, (struct sockaddr *)nsAddrPtr, + clen) < 0) { if (res.options & RES_DEBUG) perror("connect"); continue; @@ -291,8 +291,8 @@ SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen, } #else /* BSD */ if (sendto(s, (const char *)buf, buflen, 0, - (struct sockaddr *) &sin, - sizeof sin) != buflen) { + (struct sockaddr *) &nsAddrPtr, + clen) != buflen) { if (res.options & RES_DEBUG) perror("sendto"); continue; diff --git a/contrib/bind/bin/nslookup/subr.c b/contrib/bind/bin/nslookup/subr.c index 854e090..ff9f1e9 100644 --- a/contrib/bind/bin/nslookup/subr.c +++ b/contrib/bind/bin/nslookup/subr.c @@ -53,7 +53,7 @@ #ifndef lint static const char sccsid[] = "@(#)subr.c 5.24 (Berkeley) 3/2/91"; -static const char rcsid[] = "$Id: subr.c,v 8.15 2001/06/18 14:43:45 marka Exp $"; +static const char rcsid[] = "$Id: subr.c,v 8.16 2002/04/09 05:55:24 marka Exp $"; #endif /* not lint */ /* @@ -238,10 +238,12 @@ PrintHostInfo(file, title, hp) const char *title; register HostInfo *hp; { + register AddrInfo **ap; register char **cp; register ServerInfo **sp; char comma; int i; + char buf[80]; fprintf(file, "%-7s %s", title, hp->name); @@ -253,14 +255,18 @@ PrintHostInfo(file, title, hp) } comma = ' '; i = 0; - for (cp = hp->addrList; cp && *cp; cp++) { + for (ap = hp->addrList; ap && *ap; ap++) { i++; if (i > 4) { fprintf(file, "\n\t"); comma = ' '; i = 0; } - fprintf(file,"%c %s", comma, inet_ntoa(*(struct in_addr *)*cp)); + if (inet_ntop((*ap)->addrType, (*ap)->addr, + buf, sizeof(buf)) != NULL) { + fprintf(file,"%c %s", comma, buf); + } else + fprintf(file,"%c <UNKNOWN>", comma); comma = ','; } } @@ -289,15 +295,18 @@ PrintHostInfo(file, title, hp) comma = ' '; i = 0; - for (cp = (*sp)->addrList; cp && *cp && **cp; cp++) { + for (ap = (*sp)->addrList; ap && *ap; ap++) { i++; if (i > 4) { fprintf(file, "\n\t"); comma = ' '; i = 0; } - fprintf(file, - "%c %s", comma, inet_ntoa(*(struct in_addr *)*cp)); + if (inet_ntop((*ap)->addrType, (*ap)->addr, + buf, sizeof(buf)) != NULL) + fprintf(file,"%c %s", comma, buf); + else + fprintf(file,"%c <UNKNOWN>", comma); comma = ','; } fprintf(file, "\n\t"); |