diff options
author | asmodai <asmodai@FreeBSD.org> | 2001-01-28 23:00:22 +0000 |
---|---|---|
committer | asmodai <asmodai@FreeBSD.org> | 2001-01-28 23:00:22 +0000 |
commit | 1f243835b5b81bfd6b9e5f666730965fe5d60ed6 (patch) | |
tree | 4c0925b2692b57db0c0c1044db977bbc4c0899d7 /contrib/bind/bin | |
parent | 43c4a8b07e19a2567390a7f788929e5c908a4d7b (diff) | |
download | FreeBSD-src-1f243835b5b81bfd6b9e5f666730965fe5d60ed6.zip FreeBSD-src-1f243835b5b81bfd6b9e5f666730965fe5d60ed6.tar.gz |
Virgin import of BIND v8.2.3-REL
Diffstat (limited to 'contrib/bind/bin')
61 files changed, 1663 insertions, 1090 deletions
diff --git a/contrib/bind/bin/Makefile b/contrib/bind/bin/Makefile index 57fcc58..5b56413 100644 --- a/contrib/bind/bin/Makefile +++ b/contrib/bind/bin/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.28 2000/07/11 06:41:26 vixie Exp $ +# $Id: Makefile,v 8.30 2000/12/23 08:02:48 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = .. O=o A=a @@ -67,11 +67,11 @@ SUBDIRS = addr nslookup dig dnsquery host named named-xfer ndc nsupdate \ all: ${SUBDIRS} ${SUBDIRS}: FRC - @(cd $@; pwd; ${MAKE} ${MARGS}) + @(cd $@; pwd; ${MAKE} ${MARGS}) || exit 1 install depend tags clean distclean:: @for x in ${SUBDIRS}; do \ - (cd $$x; pwd; ${MAKE} ${MARGS} $@); \ + (cd $$x; pwd; ${MAKE} ${MARGS} $@) || exit 1; \ done distclean:: clean @@ -85,7 +85,7 @@ links: FRC ( mkdir $$x; cd $$x; pwd; ln -s ../SRC/$$x SRC; \ cp SRC/Makefile Makefile; chmod +w Makefile; \ $(MAKE) $(MARGS) links; \ - ); \ + ) || exit 1; \ done FRC: diff --git a/contrib/bind/bin/addr/Makefile b/contrib/bind/bin/addr/Makefile index 98b7a91..1b91e47 100644 --- a/contrib/bind/bin/addr/Makefile +++ b/contrib/bind/bin/addr/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.26 2000/07/11 06:41:27 vixie Exp $ +# $Id: Makefile,v 8.27 2000/12/23 08:02:49 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/dig/Makefile b/contrib/bind/bin/dig/Makefile index ca7775d..b5a65fa 100644 --- a/contrib/bind/bin/dig/Makefile +++ b/contrib/bind/bin/dig/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.26 2000/07/11 06:41:27 vixie Exp $ +# $Id: Makefile,v 8.27 2000/12/23 08:02:50 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/dig/dig.c b/contrib/bind/bin/dig/dig.c index de192e0..01d87a9 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.42 2000/07/17 07:36:52 vixie Exp $"; +static const char rcsid[] = "$Id: dig.c,v 8.44 2000/12/23 08:14:31 vixie Exp $"; #endif /* @@ -201,7 +201,6 @@ static const char rcsid[] = "$Id: dig.c,v 8.42 2000/07/17 07:36:52 vixie Exp $"; static int eecode = 0; static FILE * qfp; -static int sockFD; static char *defsrv, *srvmsg; static char defbuf[40] = "default -- "; static char srvbuf[60]; @@ -228,7 +227,7 @@ char *pager = NULL; /* Forward. */ static void Usage(void); -static int SetOption(const char *); +static int setopt(const char *); static void res_re_init(void); static int xstrtonum(char *); static int printZone(ns_type, const char *, @@ -273,8 +272,7 @@ main(int argc, char **argv) { char cmd[512]; char domain[MAXDNAME]; - char msg[120], *msgptr; - char **vtmp; + char msg[120], **vtmp; char *args[DIG_MAXARGS]; char **ax; int once = 1, dofile = 0; /* batch -vs- interactive control */ @@ -283,7 +281,6 @@ main(int argc, char **argv) { int wait=0, delay; int envset=0, envsave=0; struct __res_state res_x, res_t; - char *pp; ns_tsig_key key; char *keyfile = NULL, *keyname = NULL; @@ -402,7 +399,7 @@ main(int argc, char **argv) { if (**argv == '%') continue; if (**argv == '+') { - SetOption(*argv+1); + setopt(*argv+1); continue; } if (**argv == '=') { @@ -426,11 +423,16 @@ main(int argc, char **argv) { if (**argv == '-') { switch (argv[0][1]) { case 'T': - wait = atoi(*++argv); + if (*++argv == NULL) + printf("; no arg for -T?\n"); + else + wait = atoi(*argv); break; case 'c': - if ((tmp = atoi(*++argv)) - || *argv[0]=='0') { + if(*++argv == NULL) + printf("; no arg for -c?\n"); + else if ((tmp = atoi(*argv)) + || *argv[0] == '0') { queryClass = tmp; } else if ((tmp = StringToClass(*argv, 0, NULL) @@ -443,7 +445,9 @@ main(int argc, char **argv) { } break; case 't': - if ((tmp = atoi(*++argv)) + if (*++argv == NULL) + printf("; no arg for -t?\n"); + else if ((tmp = atoi(*argv)) || *argv[0]=='0') { queryType = tmp; qtypeSet++; @@ -456,17 +460,15 @@ main(int argc, char **argv) { printf( "; invalid type specified\n" ); - } + } break; case 'x': if (!qtypeSet) { queryType = T_ANY; qtypeSet++; } - if (!(addrc = *++argv)) { - printf( - "; no arg for -x?\n" - ); + if ((addrc = *++argv) == NULL) { + printf("; no arg for -x?\n"); break; } addrend = addrc + strlen(addrc); @@ -484,8 +486,10 @@ main(int argc, char **argv) { case 'p': if (argv[0][2] != '\0') port = ntohs(atoi(argv[0]+2)); + else if (*++argv == NULL) + printf("; no arg for -p?\n"); else - port = htons(atoi(*++argv)); + port = htons(atoi(*argv)); break; case 'P': if (argv[0][2] != '\0') @@ -496,16 +500,21 @@ main(int argc, char **argv) { case 'n': if (argv[0][2] != '\0') res.ndots = atoi(argv[0]+2); + else if (*++argv == NULL) + printf("; no arg for -n?\n"); else - res.ndots = atoi(*++argv); + res.ndots = atoi(*argv); break; case 'b': { char *a, *p; if (argv[0][2] != '\0') a = argv[0]+2; - else - a = *++argv; + else if (*++argv == NULL) { + printf("; no arg for -b?\n"); + break; + } else + a = *argv; if ((p = strchr(a, ':')) != NULL) { *p++ = '\0'; myaddress.sin_port = @@ -523,8 +532,11 @@ main(int argc, char **argv) { if (argv[0][2] != '\0') keyfile = argv[0]+2; - else - keyfile = *++argv; + else if (*++argv == NULL) { + printf("; no arg for -k?\n"); + break; + } else + keyfile = *argv; keyname = strchr(keyfile, ':'); if (keyname == NULL) { @@ -878,8 +890,6 @@ main(int argc, char **argv) { assert(end_time.tv_usec >= 0 && end_time.tv_usec < 1000000); if (res.pfcode & RES_PRF_STATS) { - time_t t; - query_time = difftv(start_time, end_time); printf(";; Total query time: "); prnttime(query_time); @@ -954,13 +964,13 @@ 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.42 2000/07/17 07:36:52 vixie Exp $\n\ + $Id: dig.c,v 8.44 2000/12/23 08:14:31 vixie Exp $\n\ ", stderr); } static int -SetOption(const char *string) { - char option[NAME_LEN], type[NAME_LEN], *ptr; +setopt(const char *string) { + char option[NAME_LEN], *ptr; int i; i = pickString(string, option, sizeof option); @@ -1184,12 +1194,11 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin, static int answerLen = 0; querybuf buf; - HEADER *headerPtr; int msglen, amtToRead, numRead, result = 0, sockFD, len; int count, type, class, rlen, done, n; int numAnswers = 0, numRecords = 0, soacnt = 0; u_char *cp, tmp[NS_INT16SZ]; - char dname[2][NS_MAXDNAME], file[NAME_LEN]; + char dname[2][NS_MAXDNAME]; enum { NO_ERRORS, ERR_READING_LEN, ERR_READING_MSG, ERR_PRINTING } error = NO_ERRORS; pid_t zpid; @@ -1527,7 +1536,7 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin, return (ERROR); } printf(";; pid %lu: exit %d, signal %d, core %c\n", - pid, WEXITSTATUS(status), + (u_long)pid, WEXITSTATUS(status), WIFSIGNALED(status) ? WTERMSIG(status) : 0, WCOREDUMP(status) ? 't' : 'f'); } diff --git a/contrib/bind/bin/dnskeygen/Makefile b/contrib/bind/bin/dnskeygen/Makefile index 232a206..601375f 100644 --- a/contrib/bind/bin/dnskeygen/Makefile +++ b/contrib/bind/bin/dnskeygen/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 1.6 2000/07/11 06:41:28 vixie Exp $ +# $Id: Makefile,v 1.7 2000/12/23 08:02:50 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/dnskeygen/dnskeygen.c b/contrib/bind/bin/dnskeygen/dnskeygen.c index c30eae7..f226a6f 100644 --- a/contrib/bind/bin/dnskeygen/dnskeygen.c +++ b/contrib/bind/bin/dnskeygen/dnskeygen.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: dnskeygen.c,v 1.9 1999/10/13 16:38:59 vixie Exp $"; +static const char rcsid[] = "$Id: dnskeygen.c,v 1.11 2000/12/23 08:14:31 vixie Exp $"; #endif /* not lint */ /* @@ -50,9 +50,8 @@ main(int argc, char **argv) { int size = -1, exp = 0; int no_auth = 0, no_conf = 0; int sign_val = 0, flags = 0, protocol = -1; - int i, err = 0, n; + int i, err = 0; extern char *optarg; - char array[1024]; dst_init(); if ((prog = strrchr(argv[0],'/')) == NULL) @@ -216,6 +215,8 @@ main(int argc, char **argv) { } else if (size < 0) usage("No size specified", 0); + else /* size == 0 */ + sign_val = 0; if (err) usage("errors encountered/unknown flag", 1); diff --git a/contrib/bind/bin/dnsquery/Makefile b/contrib/bind/bin/dnsquery/Makefile index 511cb66..7b52a60 100644 --- a/contrib/bind/bin/dnsquery/Makefile +++ b/contrib/bind/bin/dnsquery/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.25 2000/07/11 06:41:29 vixie Exp $ +# $Id: Makefile,v 8.26 2000/12/23 08:02:51 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/dnsquery/dnsquery.c b/contrib/bind/bin/dnsquery/dnsquery.c index 218c8a8..e8abd3e 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.13 1999/10/13 16:38:59 vixie Exp $"; +static const char rcsid[] = "$Id: dnsquery.c,v 8.15 2000/12/23 08:14:32 vixie Exp $"; #endif /* not lint */ /* @@ -55,7 +55,6 @@ main(int argc, char *argv[]) { struct hostent *q_nsname; extern int optind, opterr; extern char *optarg; - HEADER *hp; int stream = 0, debug = 0; /* set defaults */ @@ -80,7 +79,12 @@ main(int argc, char *argv[]) { case 'p' : res.retrans = atoi(optarg); break; - case 'h' : strcpy(name, optarg); + case 'h' : if (strlen(optarg) >= sizeof(name)) { + fprintf(stderr, + "Domain name too long (%s)\n", optarg); + exit(-1); + } else + strcpy(name, optarg); break; case 'c' : { @@ -157,8 +161,15 @@ main(int argc, char *argv[]) { exit(-1); } } - if (optind < argc) - strcpy(name, argv[optind]); + if (optind < argc) { + if (strlen(argv[optind]) >= sizeof(name)) { + fprintf(stderr, + "Domain name too long (%s)\n", argv[optind]); + exit(-1); + } else { + strcpy(name, argv[optind]); + } + } len = sizeof(answer); diff --git a/contrib/bind/bin/host/Makefile b/contrib/bind/bin/host/Makefile index b4f07ad..8795b56 100644 --- a/contrib/bind/bin/host/Makefile +++ b/contrib/bind/bin/host/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.25 2000/07/11 06:41:29 vixie Exp $ +# $Id: Makefile,v 8.26 2000/12/23 08:02:51 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/host/host.c b/contrib/bind/bin/host/host.c index 77e5329..adb4feb 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.37 2000/07/11 07:06:14 vixie Exp $"; +static const char rcsid[] = "$Id: host.c,v 8.42 2000/12/23 08:14:32 vixie Exp $"; #endif /* not lint */ /* @@ -126,6 +126,9 @@ static const char copyright[] = #define SUCCESS 0 #define TIME_OUT -1 #define NO_INFO -2 +#ifdef ERROR +#undef ERROR +#endif #define ERROR -3 #define NONAUTH -4 @@ -166,12 +169,13 @@ static u_char hostbuf[NS_MAXDNAME]; static int sockFD; static FILE *filePtr; -static struct __res_state res, orig; +static struct __res_state res; static char *cname = NULL; static const char *progname = "amnesia"; static int getclass = ns_c_in, verbose = 0, list = 0; static int server_specified = 0; static int gettype = 0; +static int querytype = 0; static char getdomain[NS_MAXDNAME]; /* Forward. */ @@ -221,9 +225,9 @@ main(int argc, char **argv) { struct in_addr addr; struct hostent *hp; char *s; - int inverse = 0, waitmode = 0; + int waitmode = 0; int ncnames, ch; - int nkeychains, i; + int nkeychains; dst_init(); @@ -237,7 +241,7 @@ main(int argc, char **argv) { switch (ch) { case 'a': verbose = 1; - gettype = ns_t_any; + querytype = ns_t_any; break; case 'c': getclass = parseclass(optarg); @@ -255,7 +259,7 @@ main(int argc, char **argv) { sigchase = 1; break; case 't': - gettype = parsetype(optarg); + querytype = parsetype(optarg); break; case 'v': verbose = 1; @@ -270,10 +274,10 @@ main(int argc, char **argv) { /*NOTREACHED*/ } } - if ((gettype == 0) && (sigchase)) { + if ((querytype == 0) && (sigchase)) { if (verbose) printf ("Forcing `-t a' for signature trace.\n"); - gettype = ns_t_a; + querytype = ns_t_a; } argc -= optind; argv += optind; @@ -320,7 +324,7 @@ main(int argc, char **argv) { res.options &= ~RES_DEFNAMES; if (list) - exit(ListHosts(getdomain, gettype ? gettype : ns_t_a)); + 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) { @@ -336,18 +340,17 @@ main(int argc, char **argv) { /* start new query, for KEY */ strcpy (getdomain, chase_signer); strcat (getdomain, "."); - gettype = ns_t_key; + querytype = ns_t_key; } else if (!(chase_step & SD_BADSIG)) { /* start new query, for SIG */ strcpy (getdomain, chase_domain); strcat (getdomain, "."); - gettype = ns_t_sig; + querytype = ns_t_sig; } else if (hp && !(chase_step & SD_SIG) && (chase_step & SD_BADSIG)) { printf ("%s for %s not found, last verified key %s\n", chase_step & SD_SIG ? "Key" : "Signature", chase_step & SD_SIG ? chase_signer : chase_domain, - chase_domain, chase_lastgoodkey ? chase_lastgoodkey : "None"); } } @@ -536,7 +539,7 @@ gethostinfo(char *name) { char *cp, **domain; char tmp[NS_MAXDNAME]; const char *tp; - int hp, nDomain; + int hp; int asis = 0; u_int n; @@ -587,8 +590,8 @@ static int getdomaininfo(const char *name, const char *domain) { int val1, val2; - if (gettype) - return (getinfo(name, domain, gettype)); + if (querytype) + return (getinfo(name, domain, gettype=querytype)); else { val1 = getinfo(name, domain, gettype=ns_t_a); if (cname || verbose) @@ -600,11 +603,9 @@ getdomaininfo(const char *name, const char *domain) { static int getinfo(const char *name, const char *domain, int type) { - HEADER *hp; - u_char *eom, *bp, *cp; + u_char *eom; querybuf buf, answer; - int n, n1, i, j, nmx, ancount, nscount, arcount, qdcount, buflen; - u_short pref, class; + int n; char host[NS_MAXDNAME]; if (domain == NULL) @@ -634,8 +635,7 @@ getinfo(const char *name, const char *domain, int type) { static int printinfo(const querybuf *answer, const u_char *eom, int filter, int isls) { - int n, n1, i, j, nmx, ancount, nscount, arcount, qdcount, buflen, savesigchase; - u_short pref, class; + int n, nmx, ancount, nscount, arcount, qdcount, buflen, savesigchase; const u_char *bp, *cp; const HEADER *hp; @@ -696,8 +696,18 @@ printinfo(const querybuf *answer, const u_char *eom, int filter, int isls) { if (!hp->ad) if (verbose && isls == 0) printf("The following answer is not verified as authentic by the server:\n"); - while (--ancount >= 0 && cp && cp < eom) + while (--ancount >= 0 && cp && cp < eom) { cp = pr_rr(cp, answer->qb2, stdout, filter); + /* + * When we ask for address and there is a CNAME, it + * seems to return both the CNAME and the address. + * Since we trace down the CNAME chain ourselves, we + * don't really want to print the address at this + * point. + */ + if (cname && ! verbose) + return (1); + } } if (!verbose) return (1); @@ -967,24 +977,24 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) { } if (doprint) - fprintf(file, "(\n\t\t\t%ld\t;serial (version)", + fprintf(file, "(\n\t\t\t%lu\t;serial (version)", ns_get32(cp)); cp += INT32SZ; if (doprint) - fprintf(file, "\n\t\t\t%ld\t;refresh period", + fprintf(file, "\n\t\t\t%lu\t;refresh period", ns_get32(cp)); cp += INT32SZ; if (doprint) fprintf(file, - "\n\t\t\t%ld\t;retry refresh this often", + "\n\t\t\t%lu\t;retry refresh this often", ns_get32(cp)); cp += INT32SZ; if (doprint) - fprintf(file, "\n\t\t\t%ld\t;expiration period", + fprintf(file, "\n\t\t\t%lu\t;expiration period", ns_get32(cp)); cp += INT32SZ; if (doprint) - fprintf(file, "\n\t\t\t%ld\t;minimum TTL\n\t\t\t)", + fprintf(file, "\n\t\t\t%lu\t;minimum TTL\n\t\t\t)", ns_get32(cp)); cp += INT32SZ; break; @@ -1235,15 +1245,15 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) { /* original ttl */ origttl = cp; if (doprint && verbose) - fprintf(file, " %d", ns_get32(cp)); + fprintf(file, " %ld", ns_get32(cp)); cp += INT32SZ; /* signature expiration */ if (doprint && verbose) - fprintf(file, " %d", ns_get32(cp)); + fprintf(file, " %ld", ns_get32(cp)); cp += INT32SZ; /* time signed */ if (doprint && verbose) - fprintf(file, " %d", ns_get32(cp)); + fprintf(file, " %ld", ns_get32(cp)); cp += INT32SZ; /* key footprint */ if (doprint && verbose) @@ -1265,7 +1275,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) { if (sigchase && !(chase_step & SD_SIG) && strcmp (chase_domain, thisdomain) == 0 && - chase_class == class & chase_type == tc) + chase_class == class && chase_type == tc) { u_char cdname[NS_MAXCDNAME]; @@ -1336,7 +1346,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) { if (sigchase && (chase_step & (SD_SIG|SD_RR)) && strcmp (getdomain, name) == 0 && - getclass == class & gettype == type) + getclass == class && gettype == type) { DST_KEY *dstkey; int rc, len, i, j; @@ -1452,7 +1462,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) { u_char cdname[NS_MAXCDNAME]; if (doprint && !verbose) - fprintf (file, " (chasing signature)", sigchase-1); + fprintf(file, " (chasing signature)"); /* unpack rr */ @@ -1566,6 +1576,7 @@ ListHosts(char *namePtr, int queryType) { int nshaveaddr[NUMNS]; struct in_addr nsipaddr[NUMNSADDR]; int numns, numnsaddr, thisns; + int qdcount, ancount; /* * Normalize to not have trailing dot. We do string compares below @@ -1638,7 +1649,8 @@ ListHosts(char *namePtr, int queryType) { cp = answer.qb2 + HFIXEDSZ; eom = answer.qb2 + msglen; - if (ntohs(answer.qb1.qdcount) > 0) { + qdcount = ntohs(answer.qb1.qdcount); + while (qdcount-- > 0) { n = dn_skipname(cp, eom); if (n < 0) { printf("Form error.\n"); @@ -1876,35 +1888,60 @@ ListHosts(char *namePtr, int queryType) { } numAnswers++; cp = buf.qb2 + HFIXEDSZ; - if (ntohs(buf.qb1.qdcount) > 0) { + qdcount = ntohs(buf.qb1.qdcount); + while (qdcount-- > 0) { n = dn_skipname(cp, buf.qb2 + len); - if (n < 0) { + if (n <= 0) { + error = ERR_PRINTING; + break; + } + if (cp + n + QFIXEDSZ > buf.qb2 + len) { error = ERR_PRINTING; break; } cp += n + QFIXEDSZ; } - nmp = cp; - n = dn_skipname(cp, buf.qb2 + len); - if (n < 0) { - error = ERR_PRINTING; - break; + ancount = ntohs(buf.qb1.ancount); + while (ancount-- > 0) { + nmp = cp; + n = dn_skipname(cp, buf.qb2 + len); + if (n <= 0) { + error = ERR_PRINTING; + break; + } + cp += n; + if (cp + INT16SZ > buf.qb2 + len) { + error = ERR_PRINTING; + break; + } + type = ns_get16(cp); + cp += INT16SZ; + if (type == ns_t_soa) { + (void) dn_expand(buf.qb2, buf.qb2 + len, nmp, + dname[soacnt], sizeof dname[0]); + if (soacnt) { + if (ns_samename(dname[0], dname[1]) == 1) + goto done; + } else + soacnt++; + } + if (cp + INT16SZ*2 + INT32SZ > buf.qb2 + len) { + error = ERR_PRINTING; + break; + } + cp += INT32SZ + INT16SZ; + dlen = ns_get16(cp); + cp += INT16SZ; + if (cp + dlen > buf.qb2 + len) { + error = ERR_PRINTING; + break; + } + cp += dlen; } - cp += n; - if (cp + INT16SZ > buf.qb2 + len) { - error = ERR_PRINTING; + if (error != NO_ERRORS) break; - } - if ((ns_get16(cp) == ns_t_soa)) { - (void) dn_expand(buf.qb2, buf.qb2 + len, nmp, - dname[soacnt], sizeof dname[0]); - if (soacnt) { - if (ns_samename(dname[0], dname[1]) == 1) - break; - } else - soacnt++; - } } + done: (void) close(sockFD); sockFD = -1; diff --git a/contrib/bind/bin/irpd/Makefile b/contrib/bind/bin/irpd/Makefile index 9eaf4cc..af98cfb 100644 --- a/contrib/bind/bin/irpd/Makefile +++ b/contrib/bind/bin/irpd/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 1.6 2000/07/17 07:15:08 vixie Exp $ +# $Id: Makefile,v 1.7 2000/12/23 08:02:52 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/irpd/irpd.c b/contrib/bind/bin/irpd/irpd.c index 4a94d2c..e03276f 100644 --- a/contrib/bind/bin/irpd/irpd.c +++ b/contrib/bind/bin/irpd/irpd.c @@ -37,7 +37,7 @@ seem to be so for getnetbyaddr #endif #if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: irpd.c,v 1.8 2000/02/04 08:28:27 vixie Exp $"; +static const char rcsid[] = "$Id: irpd.c,v 1.10 2000/12/23 08:14:33 vixie Exp $"; #endif /* LIBC_SCCS and not lint */ /* Imports. */ @@ -144,7 +144,6 @@ static struct response_buff *newbuffer(u_int length); static void release_buffer(struct response_buff *b); static struct arg_s *split_string(const char *string); static void free_args(struct arg_s *args); -static int is_all_digits(char *p); static struct client_ctx *make_cli_ctx(void); static struct net_data *get_net_data(struct ctl_sess *sess); @@ -248,8 +247,6 @@ static void irpd_abort(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx); -static void irpd_done(struct ctl_sctx *ctx, struct ctl_sess *sess, - void *param); static void response_done(struct ctl_sctx *ctx, struct ctl_sess *sess, void *uap); static void logger(enum ctl_severity, const char *fmt, ...); @@ -333,7 +330,6 @@ main(int argc, char **argv) { struct sockaddr_un uaddr; #endif struct sockaddr_in iaddr; - log_channel chan; short port = IRPD_PORT; char *prog = argv[0]; char *sockname = IRPD_PATH; @@ -344,7 +340,7 @@ main(int argc, char **argv) { addr = (struct sockaddr *)&iaddr; socksize = sizeof iaddr; - openlog("iprd", LOG_CONS|LOG_PID, LOG_DAEMON); + openlog("iprd", LOG_CONS|LOG_PID, ISC_FACILITY); while ((ch = getopt(argc, argv, "u:p:c:")) != -1) { switch(ch) { case 'c': @@ -448,7 +444,6 @@ send_hostent(struct ctl_sess *sess, struct hostent *ho) { if (ho == NULL) simple_response(sess, IRPD_GETHOST_NONE, "No such host"); else { - size_t need; struct response_buff *b = newbuffer(0); if (irp_marshall_ho(ho, &b->buff, &b->bufflen) != 0) { @@ -500,7 +495,6 @@ irpd_gethostbyname(struct ctl_sctx *ctx, struct ctl_sess *sess, { char hname[MAXHOSTNAMELEN]; struct arg_s *args; - int i; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -539,7 +533,6 @@ irpd_gethostbyname2(struct ctl_sctx *ctx, struct ctl_sess *sess, { char hname[MAXHOSTNAMELEN]; struct arg_s *args; - int i; int af; struct net_data *netdata = get_net_data(sess); @@ -591,7 +584,6 @@ irpd_gethostbyaddr(struct ctl_sctx *ctx, struct ctl_sess *sess, char haddr[MAXHOSTNAMELEN]; char tmpaddr[NS_IN6ADDRSZ]; struct arg_s *args; - int i; int af; int addrlen; struct net_data *netdata = get_net_data(sess); @@ -657,9 +649,6 @@ irpd_gethostent(struct ctl_sctx *ctx, struct ctl_sess *sess, u_int respflags, void *respctx, void *uctx) { struct hostent *ho; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -683,10 +672,6 @@ irpd_sethostent(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - struct hostent *ho; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -742,8 +727,6 @@ irpd_getpwnam(struct ctl_sctx *ctx, struct ctl_sess *sess, struct arg_s *args; struct passwd *pw; char username[64]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -786,8 +769,6 @@ irpd_getpwuid(struct ctl_sctx *ctx, struct ctl_sess *sess, struct arg_s *args; struct passwd *pw; char userid[64]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -847,9 +828,6 @@ irpd_getpwent(struct ctl_sctx *ctx, struct ctl_sess *sess, u_int respflags, void *respctx, void *uctx) { struct passwd *pw; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -872,10 +850,6 @@ irpd_setpwent(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - struct passwd *pw; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -917,34 +891,6 @@ send_nwent(struct ctl_sess *sess, struct nwent *nw) { /* * static void - * send_netent(struct ctl_sess *sess, struct netent *ne); - * Sends a NETENT structure over the wire, or "No such - * Network" error if NE is NULL. - */ -static void -send_netent(struct ctl_sess *sess, struct netent *ne) { - if (ne == NULL) { - simple_response(sess, IRPD_GETNET_NONE, "No such net"); - } else { - struct response_buff *b = newbuffer(0); - - if (irp_marshall_ne(ne, &b->buff, - &b->bufflen) != 0) { - simple_response(sess, IRPD_GETNET_ERROR, - "Internal error"); - logger(ctl_warning, "Cant marshall ne\n"); - return; - } - - strcat(b->buff, "\r\n"); - - ctl_response(sess, IRPD_GETNET_OK, "Network found", 0, 0, - response_done, b, b->buff, strlen(b->buff)); - } -} - -/* - * static void * irpd_getnetbyname(struct ctl_sctx *ctx, struct ctl_sess *sess, * const struct ctl_verb *verb, const char *rest, * u_int respflags, void *respctx, void *uctx); @@ -959,8 +905,6 @@ irpd_getnetbyname(struct ctl_sctx *ctx, struct ctl_sess *sess, struct netent *ne; struct nwent *nw; char netname[MAXNETNAMELEN]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1015,7 +959,6 @@ irpd_getnetbyaddr(struct ctl_sctx *ctx, struct ctl_sess *sess, char haddr[MAXHOSTNAMELEN]; long tmpaddr; struct arg_s *args; - int i; int af; int addrlen; int bits; @@ -1105,9 +1048,6 @@ irpd_getnetent(struct ctl_sctx *ctx, struct ctl_sess *sess, { struct netent *ne; struct nwent *nw; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1136,11 +1076,6 @@ irpd_setnetent(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - struct netent *ne; - struct nwent *nw; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1195,8 +1130,6 @@ irpd_getgrnam(struct ctl_sctx *ctx, struct ctl_sess *sess, struct arg_s *args; struct group *gr; char groupname[64]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1239,8 +1172,6 @@ irpd_getgrgid(struct ctl_sctx *ctx, struct ctl_sess *sess, struct arg_s *args; struct group *gr; char groupid[64]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1300,9 +1231,6 @@ irpd_getgrent(struct ctl_sctx *ctx, struct ctl_sess *sess, u_int respflags, void *respctx, void *uctx) { struct group *gr; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1325,10 +1253,6 @@ irpd_setgrent(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - struct group *gr; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1372,8 +1296,6 @@ irpd_getservbyname(struct ctl_sctx *ctx, struct ctl_sess *sess, struct servent *serv; char servicename[64]; char protoname[10]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1425,8 +1347,6 @@ irpd_getservbyport(struct ctl_sctx *ctx, struct ctl_sess *sess, struct servent *sv; char portnum[64]; char protoname[10]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1494,9 +1414,6 @@ irpd_getservent(struct ctl_sctx *ctx, struct ctl_sess *sess, u_int respflags, void *respctx, void *uctx) { struct servent *sv; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1519,10 +1436,6 @@ irpd_setservent(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - struct servent *sv; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1577,8 +1490,6 @@ irpd_getprotobyname(struct ctl_sctx *ctx, struct ctl_sess *sess, struct arg_s *args; struct protoent *pr; char protoname[64]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1621,8 +1532,6 @@ irpd_getprotobynumber(struct ctl_sctx *ctx, struct ctl_sess *sess, struct arg_s *args; struct protoent *pr; char protonum[64]; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1682,9 +1591,6 @@ irpd_getprotoent(struct ctl_sctx *ctx, struct ctl_sess *sess, u_int respflags, void *respctx, void *uctx) { struct protoent *pr; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1707,10 +1613,6 @@ irpd_setprotoent(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - struct protoent *pr; - size_t need; - size_t need_total = 0; - struct response_buff *b; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1757,9 +1659,6 @@ irpd_getnetgrent(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - char netgroupname[64]; - struct response_buff *b = NULL; - size_t need; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1794,8 +1693,6 @@ irpd_innetgr(struct ctl_sctx *ctx, struct ctl_sess *sess, u_int respflags, void *respctx, void *uctx) { struct arg_s *args; - struct response_buff *b; - size_t need; struct net_data *netdata = get_net_data(sess); char *host; char *user; @@ -1837,7 +1734,6 @@ irpd_innetgr(struct ctl_sctx *ctx, struct ctl_sess *sess, memput(ngtmp, args->iov[1].iov_len + 1); } - untimely: free_args(args); } @@ -1870,7 +1766,6 @@ irpd_setnetgrent(struct ctl_sctx *ctx, struct ctl_sess *sess, "setnetgrent ok"); } - untimely: free_args(args); } @@ -1886,7 +1781,6 @@ irpd_endnetgrent(struct ctl_sctx *ctx, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - struct arg_s *args; struct net_data *netdata = get_net_data(sess); INSIST(netdata != NULL); @@ -1905,20 +1799,6 @@ irpd_endnetgrent(struct ctl_sctx *ctx, struct ctl_sess *sess, /* * static void - * irpd_done(struct ctl_sctx *ctx, struct ctl_sess *sess, void *param) - * Callback for when QUIT respnse is sent out. - */ -static void -irpd_done(struct ctl_sctx *ctx, struct ctl_sess *sess, void *param) { - struct net_data *netdata = get_net_data(sess); - - INSIST(netdata != NULL); - - net_data_destroy(netdata); -} - -/* - * static void * irpd_quit(struct ctl_sctx *ctx, struct ctl_sess *sess, * const struct ctl_verb *verb, const char *rest, * u_int respflags, void *respctx, void *uctx); @@ -2239,15 +2119,6 @@ make_cli_ctx(void) { return (p); } -static void -release_cli_ctx(struct client_ctx *ctx) { - INSIST(ctx != NULL); - INSIST(ctx->net_data != NULL); - - net_data_destroy(ctx->net_data); - memput(ctx, sizeof *ctx); -} - static struct net_data * get_net_data(struct ctl_sess *sess) { struct client_ctx *ctx = ctl_getcsctx(sess); diff --git a/contrib/bind/bin/mkservdb/Makefile b/contrib/bind/bin/mkservdb/Makefile index 300505d..61055b5 100644 --- a/contrib/bind/bin/mkservdb/Makefile +++ b/contrib/bind/bin/mkservdb/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 1.7 2000/07/11 06:41:30 vixie Exp $ +# $Id: Makefile,v 1.8 2000/12/23 08:02:52 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/mkservdb/mkservdb.c b/contrib/bind/bin/mkservdb/mkservdb.c index 5647ec7..b3b758c 100644 --- a/contrib/bind/bin/mkservdb/mkservdb.c +++ b/contrib/bind/bin/mkservdb/mkservdb.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: mkservdb.c,v 1.6 1999/10/13 16:39:00 vixie Exp $"; +static const char rcsid[] = "$Id: mkservdb.c,v 1.9 2001/01/26 06:54:11 vixie Exp $"; #endif /* not lint */ /* @@ -29,6 +29,7 @@ static const char rcsid[] = "$Id: mkservdb.c,v 1.6 1999/10/13 16:39:00 vixie Exp #include <ctype.h> #ifdef IRS_LCL_SV_DB #include <db.h> +#include <err.h> #endif #include <fcntl.h> #include <limits.h> @@ -37,9 +38,11 @@ static const char rcsid[] = "$Id: mkservdb.c,v 1.6 1999/10/13 16:39:00 vixie Exp #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include "../../include/irs.h" #include "../../lib/irs/irs_p.h" +#include "../../include/isc/misc.h" #include "port_after.h" @@ -61,6 +64,7 @@ main(int argc, char **argv) { struct servent *getnextent(FILE *); +int main(int argc, char **argv) { DB *db; DBT key; @@ -112,24 +116,26 @@ main(int argc, char **argv) { } data.size = p - dbuf; - if ((r = db->put(db, &key, &data, R_NOOVERWRITE))) + if ((r = db->put(db, &key, &data, R_NOOVERWRITE))) { if (r < 0) - errx(1, "failed to write %s", key.data); + errx(1, "failed to write %s", (char *)key.data); else - warnx("will not overwrite %s", key.data); + warnx("will not overwrite %s", (char *)key.data); + } for (n = 0; sv->s_aliases[n]; ++n) { if (strlen(sv->s_aliases[n]) + sizeof "/" + strlen(sv->s_proto) > sizeof kbuf) continue; key.size = SPRINTF((kbuf, "%s/%s", sv->s_aliases[n], sv->s_proto))+1; - if ((r = db->put(db, &key, &data, R_NOOVERWRITE))) + if ((r = db->put(db, &key, &data, R_NOOVERWRITE))) { if (r < 0) errx(1, "failed to write %s", - key.data); + (char *)key.data); else warnx("will not overwrite %s", - key.data); + (char *)key.data); + } } ports = (u_short *)kbuf; @@ -152,16 +158,17 @@ main(int argc, char **argv) { } data.size = p - dbuf; - if ((r = db->put(db, &key, &data, R_NOOVERWRITE))) + if ((r = db->put(db, &key, &data, R_NOOVERWRITE))) { if (r < 0) errx(1, "failed to write %d/%s", ntohs(sv->s_port), sv->s_proto); else warnx("will not overwrite %d/%s", - ntohs(sv->s_port), sv->s_proto); + ntohs(sv->s_port), sv->s_proto); + } } db->close(db); - if (rename(tmpdatabase, database)) + if (isc_movefile(tmpdatabase, database)) err(1, "rename %s -> %s", tmpdatabase, database); exit(0); } diff --git a/contrib/bind/bin/named-bootconf/Makefile b/contrib/bind/bin/named-bootconf/Makefile index 35403e9..54f255b 100644 --- a/contrib/bind/bin/named-bootconf/Makefile +++ b/contrib/bind/bin/named-bootconf/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 1.2 2000/07/11 06:41:33 vixie Exp $ +# $Id: Makefile,v 1.3 2000/12/23 08:02:53 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/named-bootconf/named-bootconf.sh b/contrib/bind/bin/named-bootconf/named-bootconf.sh index c1dfaad..3952b14 100644 --- a/contrib/bind/bin/named-bootconf/named-bootconf.sh +++ b/contrib/bind/bin/named-bootconf/named-bootconf.sh @@ -181,19 +181,24 @@ while read CMD ARGS; do esac set - X $ARGS shift - if [ $# -gt 2 ]; then + if [ $# -gt 1 ]; then ZONE=$1 shift - PRIMARIES=$1 - while [ $# -gt 2 ]; do - shift + PRIMARIES="" + while [ $# -gt 1 ]; do PRIMARIES="$PRIMARIES $1" + shift done (echo "" cat $COMMENTFILE echo "zone \"$ZONE\" ${class}{" echo " type slave;" - echo " file \"$2\";" + if expr x"$1" : '^x[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' > /dev/null + then + PRIMARIES="$PRIMARIES $1" + else + echo " file \"$1\";" + fi echo " masters {" for PRIMARY in $PRIMARIES; do echo " $PRIMARY;" @@ -215,19 +220,24 @@ while read CMD ARGS; do esac set - X $ARGS shift - if [ $# -gt 2 ]; then + if [ $# -gt 1 ]; then ZONE=$1 shift - PRIMARIES=$1 - while [ $# -gt 2 ]; do - shift + PRIMARIES="" + while [ $# -gt 1 ]; do PRIMARIES="$PRIMARIES $1" + shift done (echo "" cat $COMMENTFILE echo "zone \"$ZONE\" ${class}{" echo " type stub;" - echo " file \"$2\";" + if expr x"$1" : '^x[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' > /dev/null + then + PRIMARIES="$PRIMARIES $1" + else + echo " file \"$1\";" + fi echo " masters {" for PRIMARY in $PRIMARIES; do echo " $PRIMARY;" diff --git a/contrib/bind/bin/named-xfer/Makefile b/contrib/bind/bin/named-xfer/Makefile index b85a4d5..b44ff42 100644 --- a/contrib/bind/bin/named-xfer/Makefile +++ b/contrib/bind/bin/named-xfer/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.30 2000/07/11 06:41:34 vixie Exp $ +# $Id: Makefile,v 8.31 2000/12/23 08:02:54 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/named-xfer/named-xfer.c b/contrib/bind/bin/named-xfer/named-xfer.c index 3747526..774adb9 100644 --- a/contrib/bind/bin/named-xfer/named-xfer.c +++ b/contrib/bind/bin/named-xfer/named-xfer.c @@ -130,7 +130,7 @@ char copyright[] = #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)named-xfer.c 4.18 (Berkeley) 3/7/91"; -static const char rcsid[] = "$Id: named-xfer.c,v 8.94 2000/07/11 05:38:27 vixie Exp $"; +static const char rcsid[] = "$Id: named-xfer.c,v 8.104 2000/12/23 08:14:44 vixie Exp $"; #endif /* not lint */ #include "port_before.h" @@ -162,12 +162,9 @@ static const char rcsid[] = "$Id: named-xfer.c,v 8.94 2000/07/11 05:38:27 vixie #include <isc/eventlib.h> #include <isc/list.h> #include <isc/logging.h> -/* This still uses malloc/free, but the tsig routines allocate memory with - * memget, and we free it with memput. - */ #include <isc/memcluster.h> - #include <isc/dst.h> +#include <isc/misc.h> #include "port_after.h" @@ -205,8 +202,8 @@ static FILE *fp = NULL, static char *ProgName; -static void usage(const char *), - tsig_init(const char *); +static void usage(const char *); +static int tsig_init(const char *); static int getzone(struct zoneinfo *, u_int32_t, int), print_output(struct zoneinfo *, u_int32_t, u_char *, int, u_char *, int), @@ -264,7 +261,7 @@ init_xfer_logging() { log_ctx_valid = 1; - chan = log_new_syslog_channel(0, 0, LOG_DAEMON); + chan = log_new_syslog_channel(0, 0, ISC_FACILITY); if (chan == NULL) return (0); if (log_add_channel(log_ctx, ns_log_default, chan) < 0) { @@ -321,15 +318,13 @@ main(int argc, char *argv[]) { struct in_addr axfr_src; char *dbfile = NULL, *tracefile = NULL, *tm = NULL, *tsigfile = NULL; char *ixfrfile = NULL; - u_int32_t new_serial_no = 0; - int dbfd, ddtd, result, c, fd, ixfd; + int dbfd, ddtd, result, c, ixfd; u_int32_t serial_no = 0; u_int port = htons(NAMESERVER_PORT); struct stat statbuf; int stub_only = 0; int class = C_IN; int n; - long num_files; #ifdef _AUX_SOURCE set42sig(); @@ -363,7 +358,7 @@ main(int argc, char *argv[]) { #ifdef SYSLOG_42BSD openlog(ProgName, n); #else - openlog(ProgName, n, LOG_DAEMON); + openlog(ProgName, n, ISC_FACILITY); #endif while ((c = getopt(argc, argv, "C:d:l:s:t:z:f:i:p:P:qx:ST:Z")) != -1) switch (c) { @@ -595,10 +590,16 @@ main(int argc, char *argv[]) { dprintf(1, "domain `%s'; ixfrfile `%s'; serial %u\n", domain, ixfrfile, serial_no); + if (tsigfile) + dprintf(1, "tsigfile `%s'\n", tsigfile); + buildservicelist(); buildprotolist(); - tsig_init(tsigfile); + if (tsig_init(tsigfile) == -1) { + cleanup_for_exit(); + return (XFER_FAIL); + } /* init zone data */ @@ -688,8 +689,8 @@ main(int argc, char *argv[]) { * AXFR. Rename the temporary file to the IXFR * name, named will rename it again to the dbname. */ - if (movefile(tmpname, ixfrfile) == -1) { - perror("movefile"); + if (isc_movefile(tmpname, ixfrfile) == -1) { + perror("isc_movefile"); #ifdef DEBUG if (debug) (void) unlink(ddtfile); @@ -703,10 +704,10 @@ main(int argc, char *argv[]) { }; exit(XFER_SUCCESSAXFRIXFRFILE); } - if (movefile(tmpname, dbfile) == -1) { - perror("movefile"); + if (isc_movefile(tmpname, dbfile) == -1) { + perror("isc_movefile"); if (!quiet) - syslog(LOG_ERR, "movefile %s to %s: %m", + syslog(LOG_ERR, "isc_movefile %s to %s: %m", tmpname, dbfile); cleanup_for_exit(); exit(XFER_FAIL); @@ -715,10 +716,10 @@ main(int argc, char *argv[]) { case XFER_SUCCESSIXFR: unlink(tmpname); - if (movefile(tmpiname, ixfrfile) == -1) { - perror("movefile"); + if (isc_movefile(tmpiname, ixfrfile) == -1) { + perror("isc_movefile"); if (!quiet) - syslog(LOG_ERR, "movefile %s to %s: %m", + syslog(LOG_ERR, "isc_movefile %s to %s: %m", tmpiname, ixfrfile); cleanup_for_exit(); exit(XFER_FAIL); @@ -774,26 +775,28 @@ usage(const char *msg) { exit(XFER_FAIL); } -static void +static int tsig_init(const char *file) { char buf[1024]; - int n; FILE *fp; char *s; if (file == NULL) - return; + return (0); fp = fopen(file, "r"); if (fp == NULL) - return; + return (-1); dst_init(); INIT_LIST(tsig_list); while (1) { tsig_node *n = malloc(sizeof(tsig_node)); int alg, secret_len; - char *address, *name; char *cp; u_char secret[128]; + char *name; + + if (n == NULL) + return (-1); s = fgets(buf, sizeof(buf), fp); if (s == NULL) @@ -804,6 +807,9 @@ tsig_init(const char *file) { fgets(buf, sizeof(buf), fp); buf[strlen(buf)-1] = 0; name = strdup(buf); + + if (name == NULL) + return (-1); fscanf(fp, "%d", &alg); fgets(buf, sizeof(buf), fp); @@ -819,10 +825,12 @@ tsig_init(const char *file) { secret, secret_len); free(name); + INIT_LINK(n, link); APPEND(tsig_list, n, link); } fclose(fp); unlink(file); + return (0); } #define DEF_DNAME '\001' /* '\0' means the root domain */ @@ -830,6 +838,7 @@ tsig_init(const char *file) { u_int32_t minimum_ttl = 0; int soa_cnt = 0, scdsoa = 0, methode = ISNOTIXFR; int delete_soa = 1; +int ixfr_single_answer_mode = 0; u_int32_t final_serial = 0; int ixfr_soa = 0; int ns_cnt = 0; @@ -844,7 +853,6 @@ static int getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) { HEADER *hp; u_int len; - u_int32_t serial; int s, n, l, error = 0; int was_ixfr = 0; u_int cnt; @@ -852,7 +860,9 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) { u_char *buf = NULL, *cpp = NULL; u_char *bp; u_int bufsize = 0; - char name[MAXDNAME], name2[MAXDNAME]; + u_char *buf2 = NULL; + u_int buf2size = 0; + char name2[MAXDNAME]; struct sockaddr_in sin; struct sockaddr_in local; int locallen; @@ -862,7 +872,6 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) { struct sigvec sv, osv; #endif int qdcount, ancount, aucount, arcount, class, type; - int first_serial; const char *badsoa_msg = "Nil"; struct sockaddr_in my_addr; char my_addr_text[30]; @@ -1217,8 +1226,8 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) { loop_cnt = 0; bp = NULL; do { - u_char *cp4; - u_short type, class, dlen; + u_char *cp4, *ocp = tmp; + u_short type, class, dlen, olen = len; u_int32_t ttl; n = dn_expand(buf, eom, tmp, name2, sizeof name2); if (n < 0) { @@ -1285,13 +1294,163 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) { name2, p_type(type)); tmp = cp4 + dlen; loop_cnt++; - if (loop_cnt >= ancount) { + if (ancount == 1 && loop_cnt == 1) + { + + badsoa_msg = soa_zinfo(&zp_start, bp, eom); + if (badsoa_msg) + goto badsoa; + if (zp_start.z_serial == serial_no) { + (void) my_close(s); + dprintf(1, "zone up-to-date, serial %u\n", + zp_start.z_serial); + if (ixfp) { + (void) unlink (tmpiname); + (void) fclose(ixfp); + ixfp = NULL; + } + return (XFER_UPTODATE); + } + if (buf2 == NULL) { + if ((buf2 = (u_char *)malloc(2 * PACKETSZ)) == NULL) { + syslog(LOG_INFO, "malloc(%u) failed", 2 * PACKETSZ); + error++; + break; + } + buf2size = 2 * PACKETSZ; + } + if (netread(s, (char *)buf2, INT16SZ, XFER_TIMER) < 0) { + (void) my_close(s); + error++; + tmp = bp; + check_serial = 0; + break; + } + if ((len = ns_get16(buf2)) == 0) { + (void) my_close(s); + tmp = bp; + check_serial = 0; + break; + } + if (len > buf2size) { + if ((buf2 = (u_char *)realloc(buf2, len)) == NULL) { + syslog(LOG_INFO, + "malloc(%u) failed for SOA from server [%s], zone %s\n", + len, + inet_ntoa(sin.sin_addr), + zp->z_origin); + (void) my_close(s); + tmp = bp; + check_serial = 0; + break; + } + buf2size = len; + } + if (netread(s, (char *)buf2, len, XFER_TIMER) < 0) { + error++; + (void) my_close(s); + tmp = bp; + check_serial = 0; + break; + } + /* + * Verify the TSIG if expected + */ + if (tsig_signed != 0) { + ret = ns_verify(buf, (int *)&len, tsig_key, sig, siglen, + NULL, NULL, ×igned, 0); + if (ret != 0) { + syslog(LOG_NOTICE, + "SOA TSIG verification from server [%s], zone %s: %s (%d)\n", + inet_ntoa(sin.sin_addr), zp->z_origin, + tsig_rcode(ret), ret); + error++; + (void) my_close(s); + tmp = bp; + check_serial = 0; + break; + } + } +#ifdef DEBUG + if (debug >= 3) { + (void)fprintf(ddt,"len = %d\n", len); + res_pquery(&res, buf2, len, ddt); + } +#endif + hp = (HEADER *) buf2; + qdcount = ntohs(hp->qdcount); + ancount = ntohs(hp->ancount); + aucount = ntohs(hp->nscount); + arcount = ntohs(hp->arcount); + + tmp = buf2 + HFIXEDSZ; + eom = buf2 + len; + /* Query Section. */ + if (qdcount > 1) { + badsoa_msg = "question error"; + goto badsoa; + } + n = dn_expand(buf2, eom, tmp, name2, sizeof name2); + if (n < 0) { + badsoa_msg = "qname error"; + goto badsoa; + } + tmp += n; + bp = tmp; + if (tmp + 2 * INT16SZ > eom) { + badsoa_msg = "query error"; + goto badsoa; + } + NS_GET16(type, tmp); + NS_GET16(class, tmp); + if (class != curclass || + ns_samename(zp->z_origin, name2) != 1) + { + syslog(LOG_INFO, + "wrong query in resp from [%s], zone %s: [%s %s %s]\n", + inet_ntoa(sin.sin_addr), zp->z_origin, + name2, p_class(class), p_type(type)); + error++; + (void) my_close(s); + tmp = bp; + check_serial = 0; + break; + } + if (type == T_SOA) { + ixfr_single_answer_mode = 1; + if (ixfp) + if (ixfr_log(buf2, len, &delete_soa, ixfp, + &sin, domain, &serial_no, + &ixfr_first) < 0) { + error++; + break; + } + free(buf); + buf = buf2; + bufsize = buf2size; + break; + } + else { + methode = ISNOTIXFR; + was_ixfr++; + check_serial = 0; + cp = buf + HFIXEDSZ; + n = print_output(zp, serial_no, buf, olen, ocp, 3); + buf = buf2; + bufsize = buf2size; + break; + } + } + if (loop_cnt > 1) { tmp = bp; check_serial = 0; break; } } while (1); + if (error != 0) { + return (XFER_FAIL); + } if (ns_samename(zp->z_origin, name2) != 1) { syslog(LOG_INFO, "wrong answer in resp from [%s], zone %s: [%s %s %s]\n", @@ -1301,9 +1460,11 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) { (void) my_close(s); continue; } + if (loop_cnt < 1) { badsoa_msg = soa_zinfo(&zp_start, tmp, eom); if (badsoa_msg) goto badsoa; + } if (methode == ISNOTIXFR) { if (SEQ_GT(zp_start.z_serial, serial_no) || !check_serial) { const char *l, *nl, *t; @@ -1342,6 +1503,8 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) { "; zone '%s' first transfer\n", domain, serial_no); t = strdup(inet_ntoa(sin.sin_addr)); + if (t == NULL) + return (XFER_FAIL); fprintf(dbfp, "; from %s:%d (local %s) using %s at %s", t, ntohs(sin.sin_port), inet_ntoa(local.sin_addr), @@ -1558,7 +1721,7 @@ axfr_response: n = print_output(zp, serial_no, buf, len, cp, - was_ixfr); + 0); if (n < 0) break; cp += n; @@ -1592,7 +1755,7 @@ axfr_response: buf, len, cp, - was_ixfr); + 0); if (n < 0) break; cp += n; @@ -1604,7 +1767,7 @@ axfr_response: cnt++) { n = print_output(zp, serial_no, buf, len, cp, - was_ixfr); + 0); cp += n; } if (n < 0) { @@ -1641,7 +1804,7 @@ axfr_response: cnt++) { n = print_output(zp, serial_no, buf, len, cp, - was_ixfr); + 0); if (n < 0) break; cp += n; @@ -1788,13 +1951,14 @@ axfr_response: (void) my_close(s); return (XFER_FAIL); } - if (ancount == 1) { + if (soa_cnt > 2) { methode = ISNOTIXFR; check_serial = 0; soa_cnt = 0; - goto axfr_response; + goto axfr_response; } dprintf(1, "We have an IXFR\n"); + loop_cnt = 0; while (SEQ_GT(zp_finish.z_serial, serial_no)) { /* * Receive length & response @@ -1881,13 +2045,14 @@ axfr_response: } break; } - if (ixfp) + if (ixfp) { if (ixfr_log(buf, len, &delete_soa, ixfp, &sin, domain, &serial_no, &ixfr_first) < 0) { error++; break; } + } } (void) my_close(s); if (!error) { @@ -2010,7 +2175,7 @@ writemsg(int rfd, const u_char *msg, int msglen) { iov[1].iov_len = msglen; ret = writev(rfd, iov, 2); if (ret != INT16SZ + msglen) { - syslog(LOG_DEBUG, "writemsg(%d,%#x,%d) failed: %s", + syslog(LOG_DEBUG, "writemsg(%d,%p,%d) failed: %s", rfd, msg, msglen, strerror(errno)); return (-1); } @@ -2070,10 +2235,10 @@ soa_zinfo(struct zoneinfo *zp, u_char *cp, u_char *eom) { */ static int print_output(struct zoneinfo *zp, u_int32_t serial_no, u_char *msg, - int msglen, u_char *rrp, int was_ixfr) { + int msglen, u_char *rrp, int xfr_detect) { u_char *cp; HEADER *hp = (HEADER *) msg; - u_int32_t addr, ttl, tmpnum; + u_int32_t ttl, tmpnum; int i, j, tab, result, n1, n; u_int class, type, dlen; char data[MAXDATA]; @@ -2434,6 +2599,8 @@ print_output(struct zoneinfo *zp, u_int32_t serial_no, u_char *msg, } if (zp_start.z_serial == zp_finish.z_serial) { methode = ISNOTIXFR; + if (xfr_detect == 3) + soa_cnt = 0; } else if (zp_finish.z_serial != serial_no) { syslog(LOG_INFO, "Unexpected serial number for zone %s: %u", @@ -2499,7 +2666,7 @@ print_output(struct zoneinfo *zp, u_int32_t serial_no, u_char *msg, return (result); } } - if ((soa_cnt == 2) && (was_ixfr == 0)) + if (soa_cnt == 2) return (result); } @@ -2783,22 +2950,19 @@ print_output(struct zoneinfo *zp, u_int32_t serial_no, u_char *msg, fprintf(dbfp, " %u", preference); /* Flags */ - if ((n = *cp++) != 0) { - fprintf(dbfp, " \"%.*s\"", (int)n, cp); - cp += n; - } + n = *cp++; + fprintf(dbfp, " \"%.*s\"", (int)n, cp); + cp += n; /* Service */ - if ((n = *cp++) != 0) { - fprintf(dbfp, " \"%.*s\"", (int)n, cp); - cp += n; - } + n = *cp++; + fprintf(dbfp, " \"%.*s\"", (int)n, cp); + cp += n; /* Regexp */ - if ((n = *cp++) != 0) { - fprintf(dbfp, " \"%.*s\"", (int)n, cp); - cp += n; - } + n = *cp++; + fprintf(dbfp, " \"%.*s\"", (int)n, cp); + cp += n; /* Replacement */ fprintf(dbfp, " %s.\n", cp); @@ -2950,7 +3114,7 @@ print_output(struct zoneinfo *zp, u_int32_t serial_no, u_char *msg, default: cp1 = cp + n; while (cp < cp1) - fprintf(dbfp, "0x%02.2X ", *cp++ & 0xFF); + fprintf(dbfp, "0x%02X ", *cp++ & 0xFF); (void) fprintf(dbfp, "???\n"); } if (ferror(dbfp)) { @@ -3026,7 +3190,6 @@ do_section(ns_msg *handle, ns_sect section, int pflag, FILE *file, int *delete) opcode = (ns_opcode)ns_msg_getflag(*handle, ns_f_opcode); rrnum = 0; - serial = -1; for (;;) { if (ns_parserr(handle, section, rrnum, &rr)) { if (errno != ENODEV) { @@ -3130,11 +3293,10 @@ ixfr_log(const u_char *msg, int len, int *delete, FILE *file, ns_class class; ns_opcode opcode; ns_rcode rcode; - u_int id, n; + u_int id; + u_int32_t new_serial = 0; char time[25]; ns_rr rr; - char *cp; - HEADER *hp; if ((_res.options & RES_INIT) == 0 && res_init() == -1) { dprintf(1, "ixfr_log() failed\n"); @@ -3170,7 +3332,9 @@ ixfr_log(const u_char *msg, int len, int *delete, FILE *file, ntohs(sin->sin_port), time, (long)getpid()); (*first_rr)++; } - *serial_no = do_section(&handle, ns_s_an, RES_PRF_ANS, file, delete); + new_serial = do_section(&handle, ns_s_an, RES_PRF_ANS, file, delete); + if (type == T_SOA && SEQ_GT(new_serial, *serial_no) && (*delete)) + *serial_no = new_serial; return (1); } diff --git a/contrib/bind/bin/named/Makefile b/contrib/bind/bin/named/Makefile index fb50427..78e4fee 100644 --- a/contrib/bind/bin/named/Makefile +++ b/contrib/bind/bin/named/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.50 2000/07/11 06:41:32 vixie Exp $ +# $Id: Makefile,v 8.51 2000/12/23 08:02:53 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/named/db_defs.h b/contrib/bind/bin/named/db_defs.h index 6fad285..a3e9032 100644 --- a/contrib/bind/bin/named/db_defs.h +++ b/contrib/bind/bin/named/db_defs.h @@ -1,6 +1,6 @@ /* * from db.h 4.16 (Berkeley) 6/1/90 - * $Id: db_defs.h,v 8.38 2000/04/21 06:54:01 vixie Exp $ + * $Id: db_defs.h,v 8.40 2000/11/29 06:55:46 marka Exp $ */ /* @@ -103,9 +103,17 @@ /* * Hash table structures. */ +/* + * XXX + * For IPv6 transport support we need a seperate reference counted + * database of source addresses and d_addr should become a union with + * a pointer into that database. A bit can be robbed from d_rode to + * indicate what the union is being used for. This should require less + * memory than making d_addr a union of struct in6_addr and struct in_addr. + */ struct databuf { struct databuf *d_next; /* linked list */ - struct nameser *d_ns; /* NS from whence this came */ + struct in_addr d_addr; /* NS from whence this came */ u_int32_t d_ttl; /* time to live */ /* if d_zone == DB_Z_CACHE, then * d_ttl is actually the time when @@ -125,11 +133,18 @@ struct databuf { int16_t d_type; /* type number */ int16_t d_size; /* size of data area */ u_int32_t d_rcnt; +#ifdef HITCOUNTS + u_int32_t d_hitcnt; /* Number of requests for this data. */ +#endif /* HITCOUNTS */ u_int16_t d_nstime; /* NS response time, milliseconds */ u_char d_data[sizeof(void*)]; /* dynamic (padded) */ }; #define DATASIZE(n) (sizeof(struct databuf) - sizeof(void*) + n) +#ifdef HITCOUNTS +extern u_int32_t db_total_hits; +#endif /* HITCOUNTS */ + #ifdef BIND_UPDATE /* * d_mark definitions diff --git a/contrib/bind/bin/named/db_dump.c b/contrib/bind/bin/named/db_dump.c index 10acb8c..5bb9456 100644 --- a/contrib/bind/bin/named/db_dump.c +++ b/contrib/bind/bin/named/db_dump.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)db_dump.c 4.33 (Berkeley) 3/3/91"; -static const char rcsid[] = "$Id: db_dump.c,v 8.43 2000/04/21 06:54:01 vixie Exp $"; +static const char rcsid[] = "$Id: db_dump.c,v 8.48 2000/12/23 08:14:34 vixie Exp $"; #endif /* not lint */ /* @@ -125,15 +125,20 @@ static const char rcsid[] = "$Id: db_dump.c,v 8.43 2000/04/21 06:54:01 vixie Exp #include "named.h" +#ifdef HITCOUNTS +u_int32_t db_total_hits; +#endif /* HITCOUNTS */ + static const char *MkCredStr(int); +static int fwd_dump(FILE *fp); + /* * Dump current data base in a format similar to RFC 883. */ void -doadump() -{ +doadump(void) { FILE *fp; ns_notice(ns_log_db, "dumping nameserver data"); @@ -141,6 +146,10 @@ doadump() if ((fp = write_open(server_options->dump_filename)) == NULL) return; gettime(&tt); +#ifdef HITCOUNTS + if (NS_OPTION_P(OPTION_HITCOUNT)) + fprintf(fp, "; Total hits: %d\n",db_total_hits); +#endif /* HITCOUNTS */ fprintf(fp, "; Dumped at %s", ctimel(tt.tv_sec)); if (zones != NULL && nzones != 0) zt_dump(fp); @@ -204,7 +213,8 @@ zt_dump(FILE *fp) { fprintf(fp, ";; --zone table--\n"); return (0); } -int + +static int fwd_dump(FILE *fp) { int i; fprintf(fp, ";; ++forwarders table++\n"); @@ -471,18 +481,18 @@ db_dump(struct hashbuf *htp, FILE *fp, int zone, char *origin) { NS_GET16(preference, cp); fprintf(fp, "%u", preference); - if ((n = *cp++) != 0) { - fprintf(fp, "\"%.*s\"", (int)n, cp); - cp += n; - } - if ((n = *cp++) != 0) { - fprintf(fp, "\"%.*s\"", (int)n, cp); - cp += n; - } - if ((n = *cp++) != 0) { - fprintf(fp, " \"%.*s\"", (int)n, cp); - cp += n; - } + n = *cp++; + fprintf(fp, "\"%.*s\"", (int)n, cp); + cp += n; + + n = *cp++; + fprintf(fp, "\"%.*s\"", (int)n, cp); + cp += n; + + n = *cp++; + fprintf(fp, " \"%.*s\"", (int)n, cp); + cp += n; + fprintf(fp, " %s.", cp); break; @@ -627,18 +637,24 @@ db_dump(struct hashbuf *htp, FILE *fp, int zone, char *origin) { getname(np, dname, sizeof(dname)); when = db_lame_find(dname, dp); if (when != 0 && when > tt.tv_sec) { - fprintf(fp, "%sLAME=%d", + fprintf(fp, "%sLAME=%ld", sep, when - tt.tv_sec); sep = " "; } } eoln: - if (dp->d_ns != NULL){ + if (dp->d_addr.s_addr != htonl(0)) { fprintf(fp, "%s[%s]", - sep, inet_ntoa(dp->d_ns->addr)); + sep, inet_ntoa(dp->d_addr)); sep = " "; } +#ifdef HITCOUNTS + if (NS_OPTION_P(OPTION_HITCOUNT)) { + fprintf(fp, "%shits=%d", sep, dp->d_hitcnt); + sep=" "; + } +#endif /* HITCOUNTS */ putc('\n', fp); } } diff --git a/contrib/bind/bin/named/db_func.h b/contrib/bind/bin/named/db_func.h index cb83beb..d01de88 100644 --- a/contrib/bind/bin/named/db_func.h +++ b/contrib/bind/bin/named/db_func.h @@ -90,53 +90,53 @@ /* db_proc.h - prototypes for functions in db_*.c * - * $Id: db_func.h,v 8.42 2000/04/21 06:54:02 vixie Exp $ + * $Id: db_func.h,v 8.44 2000/12/02 23:28:33 vixie Exp $ */ /* ++from db_update.c++ */ -extern int db_update(const char *name, +int db_update(const char *name, struct databuf *odp, struct databuf *newdp, struct databuf **savedpp, int flags, struct hashbuf *htp, - struct sockaddr_in from), - db_cmp(const struct databuf *, const struct databuf *), - findMyZone(struct namebuf *np, int class); + struct sockaddr_in from); +int db_cmp(const struct databuf *, const struct databuf *); +int findMyZone(struct namebuf *np, int class); void fixttl(struct databuf *dp); /* --from db_update.c-- */ /* ++from db_save.c++ */ -extern struct namebuf *savename(const char *, int); -extern struct databuf *savedata(int, int, u_int32_t, u_char *, int); -extern struct hashbuf *savehash(struct hashbuf *); +struct namebuf * savename(const char *, int); +struct databuf * savedata(int, int, u_int32_t, u_char *, int); +struct hashbuf * savehash(struct hashbuf *); /* --from db_save.c-- */ /* ++from db_dump.c++ */ -extern int db_dump(struct hashbuf *, FILE *, int, char *), +int db_dump(struct hashbuf *, FILE *, int, char *), zt_dump(FILE *); -extern void doadump(void); +void doadump(void); /* --from db_dump.c-- */ /* ++from db_load.c++ */ -extern int makename_ok(char *name, const char *origin, int class, +int makename_ok(char *name, const char *origin, int class, struct zoneinfo *zp, enum transport transport, enum context context, const char *owner, const char *filename, int lineno, int size); -extern void endline(FILE *); -extern int getword(char *, size_t, FILE *, int), - getttl(FILE *, const char *, int, u_int32_t *, int *), - getnum(FILE *, const char *, int), - db_load(const char *, const char *, struct zoneinfo *, +void endline(FILE *); +int getword(char *, size_t, FILE *, int); +int getttl(FILE *, const char *, int, u_int32_t *, int *); +int getnum(FILE *, const char *, int, int *); +int db_load(const char *, const char *, struct zoneinfo *, const char *, int); -extern int getnonblank(FILE *, const char *), - getservices(int, char *, FILE *, const char *); -extern char getprotocol(FILE *, const char *); -extern int makename(char *, const char *, int); -extern void db_err(int, char *, int, const char *, int); -extern int parse_sec_rdata(char *inp, int inp_len, int inp_full, +int getnonblank(FILE *, const char *, int); +int getservices(int, char *, FILE *, const char *); +char getprotocol(FILE *, const char *); +int makename(char *, const char *, int); +void db_err(int, char *, int, const char *, int); +int parse_sec_rdata(char *inp, int inp_len, int inp_full, u_char *data, int data_len, FILE *fp, struct zoneinfo *zp, char *domain, u_int32_t ttl, @@ -146,40 +146,37 @@ extern int parse_sec_rdata(char *inp, int inp_len, int inp_full, /* --from db_load.c-- */ /* ++from db_glue.c++ */ -extern void buildservicelist(void), - destroyservicelist(void), - buildprotolist(void), - destroyprotolist(void), - getname(struct namebuf *, char *, int); -extern int servicenumber(const char *), - protocolnumber(const char *), - get_class(const char *); -extern u_int nhash(const char *); -extern const char *protocolname(int), - *servicename(u_int16_t, const char *); -#ifndef BSD -extern int getdtablesize(void); -#endif -extern struct databuf *rm_datum(struct databuf *, - struct namebuf *, - struct databuf *, - struct databuf **); -extern struct namebuf *rm_name(struct namebuf *, - struct namebuf **, - struct namebuf *); -extern void rm_hash(struct hashbuf *); -extern void db_freedata(struct databuf *); -extern void db_lame_add(char *zone, char *server, time_t when); -extern time_t db_lame_find(char *zone, struct databuf *dp); -extern void db_lame_clean(void); -extern void db_lame_destroy(void); +void buildservicelist(void); +void destroyservicelist(void); +void buildprotolist(void); +void destroyprotolist(void); +void getname(struct namebuf *, char *, int); +int servicenumber(const char *); +int protocolnumber(const char *); +int get_class(const char *); +u_int nhash(const char *); +const char * protocolname(int); +const char * servicename(u_int16_t, const char *); +struct databuf * rm_datum(struct databuf *, + struct namebuf *, + struct databuf *, + struct databuf **); +struct namebuf * rm_name(struct namebuf *, + struct namebuf **, + struct namebuf *); +void rm_hash(struct hashbuf *); +void db_freedata(struct databuf *); +void db_lame_add(char *zone, char *server, time_t when); +time_t db_lame_find(char *zone, struct databuf *dp); +void db_lame_clean(void); +void db_lame_destroy(void); /* --from db_glue.c-- */ /* ++from db_lookup.c++ */ -extern struct namebuf *nlookup(const char *, struct hashbuf **, - const char **, int); -extern struct namebuf *np_parent __P((struct namebuf *)); -extern int match(struct databuf *, int, int), +struct namebuf * nlookup(const char *, struct hashbuf **, + const char **, int); +struct namebuf * np_parent(struct namebuf *); +int match(struct databuf *, int, int), nxtmatch(const char *, struct databuf *, struct databuf *), rrmatch(const char *, struct databuf *, @@ -187,8 +184,8 @@ extern int match(struct databuf *, int, int), /* --from db_lookup.c-- */ /* ++from db_ixfr.c++ */ -extern ns_deltalist * ixfr_get_change_list(struct zoneinfo *, u_int32_t, - u_int32_t); +ns_deltalist * ixfr_get_change_list(struct zoneinfo *, u_int32_t, + u_int32_t); int ixfr_have_log(struct zoneinfo *, u_int32_t, u_int32_t); /* --from db_ixfr.c++ */ @@ -204,6 +201,7 @@ int db_set_update(char *name, struct databuf *dp, int *rrcount, int line, const char *file); /* --from db_sec.c-- */ + /* ++from db_tsig.c++ */ char * tsig_alg_name(int value); int tsig_alg_value(char *name); diff --git a/contrib/bind/bin/named/db_glue.c b/contrib/bind/bin/named/db_glue.c index 8c48465..ba59802 100644 --- a/contrib/bind/bin/named/db_glue.c +++ b/contrib/bind/bin/named/db_glue.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)db_glue.c 4.4 (Berkeley) 6/1/90"; -static const char rcsid[] = "$Id: db_glue.c,v 8.40 2000/04/21 06:54:02 vixie Exp $"; +static const char rcsid[] = "$Id: db_glue.c,v 8.42 2000/12/23 08:14:35 vixie Exp $"; #endif /* not lint */ /* @@ -345,17 +345,14 @@ rm_datum(struct databuf *dp, struct namebuf *np, struct databuf *pdp, np->n_data = ndp; else pdp->d_next = ndp; -#ifdef BIND_UPDATE if (savedpp != NULL) { /* mark deleted or pending deletion */ dp->d_mark |= D_MARK_DELETED; dp->d_next = *savedpp; + DRCNTINC(dp); *savedpp = dp; } else dp->d_next = NULL; -#else - dp->d_next = NULL; -#endif dp->d_flags &= ~DB_F_ACTIVE; DRCNTDEC(dp); if (dp->d_rcnt) { @@ -381,10 +378,7 @@ rm_datum(struct databuf *dp, struct namebuf *np, struct databuf *pdp, "rm_datum: rcnt = %d", dp->d_rcnt); } } else -#ifdef BIND_UPDATE - if (savedpp == NULL) -#endif - db_freedata(dp); + db_freedata(dp); return (ndp); } @@ -439,9 +433,6 @@ getname(struct namebuf *np, char *buf, int buflen) { while (np != NULL) { i = (int) NAMELEN(*np); if (i + 1 >= buflen) { - *cp = '\0'; - ns_info(ns_log_db, - "domain name too long: %s...", buf); strcpy(buf, "Name_Too_Long"); return; } diff --git a/contrib/bind/bin/named/db_ixfr.c b/contrib/bind/bin/named/db_ixfr.c index 7a50618..14385d6 100644 --- a/contrib/bind/bin/named/db_ixfr.c +++ b/contrib/bind/bin/named/db_ixfr.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static char rcsid[] = "$Id: db_ixfr.c,v 8.20 2000/02/29 05:15:03 vixie Exp $"; +static char rcsid[] = "$Id: db_ixfr.c,v 8.23 2000/12/23 08:14:35 vixie Exp $"; #endif /* @@ -370,10 +370,7 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin, ns_updque *listuprec, u_int32_t *old_serial, u_int32_t *new_serial) { - static int read_soa, read_ns, rrcount; - char data[MAXDATA], dnbuf[MAXDNAME], sclass[3]; - const char *errtype = "Database"; char *dname, *cp, *cp1; char buf[MAXDATA]; u_int32_t serial, ttl; @@ -388,7 +385,6 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin, int zonelist[MAXDNAME]; struct databuf *dp; struct in_addr ina; - struct sockaddr_in empty_from; int datasize; ns_updrec * rrecp; u_long l; @@ -483,7 +479,7 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin, cp = fgets(buf, sizeof buf, fp); if (!cp) *buf = '\0'; - n = sscanf(cp, "origin %s class %s serial %ul", + n = sscanf(cp, "origin %s class %s serial %lu", origin, sclass, &serial); if (n != 3 || ns_samename(origin, zp->z_origin) != 1) err++; @@ -638,14 +634,15 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin, err++; break; } - c = getnonblank(fp, zp->z_updatelog); + c = getnonblank(fp, zp->z_updatelog, 0); if (c == '(') { multiline = 1; } else { multiline = 0; ungetc(c, fp); } - n = getnum(fp, zp->z_updatelog, GETNUM_SERIAL); + n = getnum(fp, zp->z_updatelog, GETNUM_SERIAL, + &multiline); if (getnum_error) { err++; break; @@ -665,11 +662,13 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin, n = l; PUTLONG(n, cp); } - if (multiline && - getnonblank(fp, zp->z_updatelog) != ')') - { - err++; - break; + if (multiline) { + c = getnonblank(fp, zp->z_updatelog, 1); + if (c != ')') { + ungetc(c, fp); + err++; + break; + } } endline(fp); n = cp - data; diff --git a/contrib/bind/bin/named/db_load.c b/contrib/bind/bin/named/db_load.c index 305944c..0adb7ab 100644 --- a/contrib/bind/bin/named/db_load.c +++ b/contrib/bind/bin/named/db_load.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)db_load.c 4.38 (Berkeley) 3/2/91"; -static const char rcsid[] = "$Id: db_load.c,v 8.104 2000/07/17 07:48:09 vixie Exp $"; +static const char rcsid[] = "$Id: db_load.c,v 8.110 2001/01/25 05:50:53 marka Exp $"; #endif /* not lint */ /* @@ -252,6 +252,7 @@ db_load(const char *filename, const char *in_origin, int genstart, genend, genstep; char *thisfile; void *state = NULL; + int loggenerr; empty_from.sin_family = AF_INET; empty_from.sin_addr.s_addr = htonl(INADDR_ANY); @@ -270,6 +271,13 @@ db_load(const char *filename, const char *in_origin, /* Any updates should be saved before we attempt to reload. */ INSIST((zp->z_flags & (Z_NEED_DUMP|Z_NEED_SOAUPDATE)) == 0); case Z_HINT: + if(filename == NULL) { + ns_error(ns_log_load, + "Required filename not specified for Hint zone"); + zp->z_flags |= Z_DB_BAD; + zp->z_ftime = 0; + return (0); + } transport = primary_trans; break; case Z_SECONDARY: @@ -314,7 +322,10 @@ db_load(const char *filename, const char *in_origin, ns_warning(ns_log_load, "db_load could not open: %s: %s", filename, strerror(errno)); zp->z_ftime = 0; - return (-1); + if (ininclude) + return (-1); + errs = -1; + goto cleanup; } if (zp->z_type == Z_HINT) { dbflags = DB_NODATA | DB_NOHINTS; @@ -414,10 +425,21 @@ db_load(const char *filename, const char *in_origin, } if (!getword(genrhs, sizeof(genrhs), fp, 2)) ERRTOZ("$GENERATE missing RHS"); + loggenerr = 1; for (i = genstart; i <= genend; i += genstep) { if (genname(genlhs, i, origin, domain, sizeof domain) == -1) ERRTOZ("$GENERATE genname LHS failed"); + if (!ns_samedomain(domain, zp->z_origin)) { + /* Log first per $GENERATE. */ + if (loggenerr) { + ns_info(ns_log_load, + "%s:%d: $GENERATE LHS out of zone (ignored)", + filename, lineno); + loggenerr = 0; + } + continue; + } context = ns_ownercontext(type, transport); if (!ns_nameok(NULL, domain, class, zp, transport, context, domain, inaddr_any)) { @@ -668,7 +690,7 @@ db_load(const char *filename, const char *in_origin, filename, lineno, domain, zp->z_origin); } - c = getnonblank(fp, filename); + c = getnonblank(fp, filename, 0); if (c == '(') { multiline = 1; } else { @@ -677,7 +699,8 @@ db_load(const char *filename, const char *in_origin, } serial = zp->z_serial; zp->z_serial = getnum(fp, filename, - GETNUM_SERIAL); + GETNUM_SERIAL, + &multiline); if (getnum_error) errs++; n = (u_int32_t) zp->z_serial; @@ -750,7 +773,7 @@ db_load(const char *filename, const char *in_origin, ttl = n; n = cp - (char *)data; if (multiline) { - buf[0] = getnonblank(fp, filename); + buf[0] = getnonblank(fp, filename, 1); buf[1] = '\0'; if (buf[0] != ')') ERRTO("SOA \")\""); @@ -807,7 +830,8 @@ db_load(const char *filename, const char *in_origin, PUTSHORT((u_int16_t)n, cp); /* Preference */ - n = getnum(fp, filename, GETNUM_NONE); + n = getnum(fp, filename, GETNUM_NONE, + &multiline); if (getnum_error || n > 65536) ERRTO("NAPTR Preference"); PUTSHORT((u_int16_t)n, cp); @@ -874,12 +898,14 @@ db_load(const char *filename, const char *in_origin, PUTSHORT((u_int16_t)n, cp); if (type == ns_t_srv) { - n = getnum(fp, filename, GETNUM_NONE); + n = getnum(fp, filename, GETNUM_NONE, + &multiline); if (getnum_error || n > 65536) ERRTO("SRV RR"); PUTSHORT((u_int16_t)n, cp); - n = getnum(fp, filename, GETNUM_NONE); + n = getnum(fp, filename, GETNUM_NONE, + &multiline); if (getnum_error || n > 65536) ERRTO("SRV RR"); PUTSHORT((u_int16_t)n, cp); @@ -1095,19 +1121,27 @@ db_load(const char *filename, const char *in_origin, } errs += purge_nonglue(zp->z_origin, (dataflags & DB_F_HINT) ? fcachetab : - hashtab, zp->z_class); + hashtab, zp->z_class, + zp->z_type == z_master); + cleanup: while (filenames) { fn = filenames; filenames = filenames->next; freestr(fn->name); memput(fn, sizeof *fn); } - if (errs != 0) - ns_warning(ns_log_load, + if (errs != 0) { + if (errs != -1) + ns_warning(ns_log_load, "%s zone \"%s\" (%s) rejected due to errors (serial %u)", - zoneTypeString(zp->z_type), zp->z_origin, - p_class(zp->z_class), zp->z_serial); - else + zoneTypeString(zp->z_type), + zp->z_origin, + p_class(zp->z_class), zp->z_serial); + if ((zp->z_flags & Z_NOTIFY) != 0) + ns_stopnotify(zp->z_origin, zp->z_class); + do_reload(zp->z_origin, zp->z_type, zp->z_class, + loading); + } else ns_info(ns_log_load, "%s zone \"%s\" (%s) loaded (serial %u)", zoneTypeString(zp->z_type), zp->z_origin, @@ -1366,7 +1400,7 @@ getttl(FILE *fp, const char *fn, int lineno, u_int32_t *ttl, int *multiline) { return (-1); } if (*multiline) { - ch = getnonblank(fp, fn); + ch = getnonblank(fp, fn, 1); if (ch == EOF) return (-1); if (ch == ';') @@ -1447,7 +1481,7 @@ getallwords(char *buf, size_t size, FILE *fp, int preserve) { } int -getnum(FILE *fp, const char *src, int opt) { +getnum(FILE *fp, const char *src, int opt, int *multiline) { int c, n; int seendigit = 0; int seendecimal = 0; @@ -1461,8 +1495,12 @@ getnum(FILE *fp, const char *src, int opt) { #endif for (n = 0; (c = getc(fp)) != EOF; ) { if (isspace(c)) { - if (c == '\n') - lineno++; + if (c == '\n') { + if (*multiline) + lineno++; + else if (!seendigit) + goto eol; + } if (seendigit) break; continue; @@ -1470,8 +1508,12 @@ getnum(FILE *fp, const char *src, int opt) { if (c == ';') { while ((c = getc(fp)) != EOF && c != '\n') ; - if (c == '\n') - lineno++; + if (c == '\n') { + if (*multiline) + lineno++; + else if (!seendigit) + goto eol; + } if (seendigit) break; continue; @@ -1541,32 +1583,50 @@ getnum(FILE *fp, const char *src, int opt) { src, lineno, n+m); } return (n + m); + + eol: + ns_error(ns_log_db, "%s:%d: unexpected end of line", src, lineno); + getnum_error = 1; + (void) ungetc(c, fp); + return (0); } #ifndef BIND_UPDATE static #endif int -getnonblank(FILE *fp, const char *src) { +getnonblank(FILE *fp, const char *src, int multiline) { int c; while ((c = getc(fp)) != EOF) { if (isspace(c)) { - if (c == '\n') - lineno++; + if (c == '\n') { + if (multiline) + lineno++; + else + goto eol; + } continue; } if (c == ';') { while ((c = getc(fp)) != EOF && c != '\n') ; - if (c == '\n') - lineno++; + if (c == '\n') { + if (multiline) + lineno++; + else + goto eol; + } continue; } return (c); } ns_info(ns_log_db, "%s:%d: unexpected EOF", src, lineno); return (EOF); + eol: + ns_error(ns_log_db, "%s:%d: unexpected end of line", src, lineno); + /* don't ungetc(c, fp); as the caller will do this. */ + return(c); } /* @@ -2118,7 +2178,7 @@ parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size, } else { /* Parse and output OTTL; scan TEXP */ origTTL = wordtouint32(buf); - if (0 >= origTTL || wordtouint32_error || + if (origTTL >= 0 || wordtouint32_error || (origTTL > 0x7fffffff)) ERRTO("Original TTL value bad"); cp = &data[i]; diff --git a/contrib/bind/bin/named/db_save.c b/contrib/bind/bin/named/db_save.c index 1fe0e73..2c8833c 100644 --- a/contrib/bind/bin/named/db_save.c +++ b/contrib/bind/bin/named/db_save.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)db_save.c 4.16 (Berkeley) 3/21/91"; -static const char rcsid[] = "$Id: db_save.c,v 8.27 2000/04/21 06:54:03 vixie Exp $"; +static const char rcsid[] = "$Id: db_save.c,v 8.28 2000/11/29 06:55:48 marka Exp $"; #endif /* not lint */ /* @@ -156,7 +156,7 @@ savedata(class, type, ttl, data, size) dp->d_clev = 0; dp->d_secure = DB_S_INSECURE; dp->d_rcode = NOERROR; - dp->d_ns = NULL; + dp->d_addr.s_addr = htonl(0); dp->d_nstime = 0; memcpy(dp->d_data, data, dp->d_size); return (dp); diff --git a/contrib/bind/bin/named/db_sec.c b/contrib/bind/bin/named/db_sec.c index 2ed4a4c..9fb24fb 100644 --- a/contrib/bind/bin/named/db_sec.c +++ b/contrib/bind/bin/named/db_sec.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: db_sec.c,v 8.31 2000/04/21 06:54:04 vixie Exp $"; +static const char rcsid[] = "$Id: db_sec.c,v 8.32 2000/12/23 08:14:36 vixie Exp $"; #endif /* not lint */ /* @@ -572,7 +572,7 @@ verify_set(struct db_rrset *rrset) { namefield == NS_KEY_NAME_RESERVED) continue; if (namefield == NS_KEY_NAME_ENTITY && - (key->dk_flags & NS_KEY_SIGNATORYMASK == 0)) + (key->dk_flags & NS_KEY_SIGNATORYMASK) == 0) continue; /* diff --git a/contrib/bind/bin/named/db_update.c b/contrib/bind/bin/named/db_update.c index 3bd9838..b765c4d 100644 --- a/contrib/bind/bin/named/db_update.c +++ b/contrib/bind/bin/named/db_update.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)db_update.c 4.28 (Berkeley) 3/21/91"; -static const char rcsid[] = "$Id: db_update.c,v 8.42 2000/04/21 06:54:04 vixie Exp $"; +static const char rcsid[] = "$Id: db_update.c,v 8.45 2000/12/23 08:14:36 vixie Exp $"; #endif /* not lint */ /* @@ -583,7 +583,7 @@ db_update(const char *name, goto delete; if (dp->d_type == T_CNAME && !NS_OPTION_P(OPTION_MULTIPLE_CNAMES) && - db_cmp(dp, odp) != 0) + db_cmp(dp, odp) != 0) { if ((flags & DB_REPLACE) == 0 && zones[dp->d_zone].z_type == Z_PRIMARY) { @@ -593,6 +593,7 @@ db_update(const char *name, return (CNAMEANDOTHER); } else goto delete; + } #if 0 /* BEW - this _seriously_ breaks DNSSEC. Is it necessary for dynamic update? */ #ifdef BIND_UPDATE @@ -751,10 +752,9 @@ db_update(const char *name, ns_debug(ns_log_db, 3, "db_update: adding%s %#x", (newdp->d_flags&DB_F_HINT) ? " hint":"", newdp); - if (NS_OPTION_P(OPTION_HOSTSTATS) && - newdp->d_zone == DB_Z_CACHE && + if (newdp->d_zone == DB_Z_CACHE && (newdp->d_flags & DB_F_HINT) == 0) - newdp->d_ns = nameserFind(from.sin_addr, NS_F_INSERT); + newdp->d_addr = from.sin_addr; /* Add to end of list, generally preserving order */ newdp->d_next = NULL; @@ -937,10 +937,8 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) { cp1 += t1; cp2 += t2; /* Replacement */ - t1 = strlen((char *)cp1); t2 = strlen((char *)cp2); - if (t1 != t2 || memcmp(cp1, cp2, t1)) + if (ns_samename((char *)cp1, (char *)cp2) != 1) return (1); - cp1 += t1 + 1; cp2 += t2 + 1; /* they all checked out! */ return (0); diff --git a/contrib/bind/bin/named/ns_config.c b/contrib/bind/bin/named/ns_config.c index 670e288..82b4da6 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.114 2000/04/23 02:18:58 vixie Exp $"; +static const char rcsid[] = "$Id: ns_config.c,v 8.118 2000/12/23 08:14:37 vixie Exp $"; #endif /* not lint */ /* @@ -1134,6 +1134,7 @@ new_options() { op->stats_interval = 3600; op->ordering = NULL; op->max_ncache_ttl = DEFAULT_MAX_NCACHE_TTL; + op->max_host_stats = 0; op->lame_ttl = NTTL; op->heartbeat_interval = 3600; op->max_log_size_ixfr = 20; @@ -1189,6 +1190,9 @@ set_boolean_option(u_int *op_flags, int bool_opt, int value) { INSIST(op_flags != NULL); switch (bool_opt) { +#ifdef HITCOUNTS + case OPTION_HITCOUNT: +#endif /* HITCOUNTS */ case OPTION_NORECURSE: case OPTION_NOFETCHGLUE: case OPTION_FORWARD_ONLY: @@ -1743,7 +1747,6 @@ free_rrset_order_list(rrset_order_list rol) { memput(rol, sizeof (*rol)); } - void add_to_rrset_order_list(rrset_order_list rol, rrset_order_element roe) { INSIST(rol != NULL); @@ -2956,7 +2959,7 @@ init_default_log_channels() { char *name; FILE *stream; - syslog_channel = log_new_syslog_channel(0, log_info, LOG_DAEMON); + syslog_channel = log_new_syslog_channel(0, log_info, ISC_FACILITY); if (syslog_channel == NULL || log_inc_references(syslog_channel) < 0) ns_panic(ns_log_config, 0, "couldn't create syslog_channel"); @@ -3070,8 +3073,10 @@ shutdown_configuration() { config_initialized = 0; } -void +time_t load_configuration(const char *filename) { + time_t mtime; + REQUIRE(config_initialized); ns_debug(ns_log_config, 3, "load configuration %s", filename); @@ -3089,7 +3094,7 @@ load_configuration(const char *filename) { options_installed = 0; logging_installed = 0; - parse_configuration(filename); + mtime = parse_configuration(filename); /* * If the user didn't specify logging or options, but they previously @@ -3123,4 +3128,5 @@ load_configuration(const char *filename) { loading = 0; /* release queued notifies */ notify_afterload(); + return (mtime); } diff --git a/contrib/bind/bin/named/ns_ctl.c b/contrib/bind/bin/named/ns_ctl.c index 66cb862..1950b07 100644 --- a/contrib/bind/bin/named/ns_ctl.c +++ b/contrib/bind/bin/named/ns_ctl.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ns_ctl.c,v 8.34 2000/04/21 06:54:05 vixie Exp $"; +static const char rcsid[] = "$Id: ns_ctl.c,v 8.39 2000/12/19 23:31:38 marka Exp $"; #endif /* not lint */ /* @@ -154,7 +154,7 @@ static struct ctl_verb verbs[] = { { "reload", verb_reload, "reload [zone] ..."}, { "reconfig", verb_reconfig, "reconfig [-noexpired] (just sees new/gone zones)"}, { "dumpdb", verb_dumpdb, "dumpdb"}, - { "stats", verb_stats, "stats"}, + { "stats", verb_stats, "stats [clear]"}, { "trace", verb_trace, "trace [level]"}, { "notrace", verb_notrace, "notrace"}, { "querylog", verb_querylog, "querylog"}, @@ -271,6 +271,7 @@ ns_ctl_install(controls *new) { /* Add any new controls which were found. */ for (ctl = HEAD(*new); ctl != NULL; ctl = next) { next = NEXT(ctl, link); + UNLINK(*new, ctl, link); APPEND(server_controls, ctl, link); install(ctl); if (ctl->sctx == NULL) @@ -636,6 +637,7 @@ getpid_closure(struct ctl_sctx *sctx, struct ctl_sess *sess, void *uap) { enum state { e_version = 0, + e_config, e_nzones, e_debug, e_xfersrun, @@ -643,7 +645,6 @@ enum state { e_qserials, e_qrylog, e_priming, - e_loading, e_finito }; @@ -666,7 +667,7 @@ verb_status(struct ctl_sctx *ctl, struct ctl_sess *sess, 0, NULL, NULL, NULL, NULL, 0); return; } - pvt->state = e_version; + pvt->state = (enum state)0; (void)ctl_setcsctx(sess, pvt); } switch (pvt->state++) { @@ -674,6 +675,10 @@ verb_status(struct ctl_sctx *ctl, struct ctl_sess *sess, strncpy(pvt->text, Version, sizeof pvt->text); pvt->text[sizeof pvt->text - 1] = '\0'; break; + case e_config: + sprintf(pvt->text, "config (%s) last loaded at age: %24s", + conffile, ctime(&confmtime)); + break; case e_nzones: sprintf(pvt->text, "number of zones allocated: %d", nzones); break; @@ -695,12 +700,10 @@ verb_status(struct ctl_sctx *ctl, struct ctl_sess *sess, qrylog ? "ON" : "OFF"); break; case e_priming: - sprintf(pvt->text, "server is %s priming", - priming ? "STILL" : "DONE"); - break; - case e_loading: - sprintf(pvt->text, "server %s loading its configuration", - loading ? "IS" : "IS NOT"); + if (priming) + sprintf(pvt->text, "server is initialising itself"); + else + sprintf(pvt->text, "server is up and running"); break; case e_finito: return; @@ -861,9 +864,15 @@ verb_stats(struct ctl_sctx *ctl, struct ctl_sess *sess, const struct ctl_verb *verb, const char *rest, u_int respflags, void *respctx, void *uctx) { - ns_need(main_need_statsdump); - ctl_response(sess, 250, "Statistics dump initiated.", - 0, NULL, NULL, NULL, NULL, 0); + if (rest != NULL && strcmp(rest, "clear") == 0) { + ns_need(main_need_statsdumpandclear); + ctl_response(sess, 250, "Statistics dump and clear initiated.", + 0, NULL, NULL, NULL, NULL, 0); + } else { + ns_need(main_need_statsdump); + ctl_response(sess, 250, "Statistics dump initiated.", + 0, NULL, NULL, NULL, NULL, 0); + } } static void diff --git a/contrib/bind/bin/named/ns_defs.h b/contrib/bind/bin/named/ns_defs.h index 56b50fe..8d480f2 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.96 2000/04/21 06:54:06 vixie Exp $ + * $Id: ns_defs.h,v 8.102 2000/12/01 05:35:48 vixie Exp $ */ /* @@ -143,6 +143,9 @@ #define DEFAULT_XFERS_RUNNING 10 /* default value of transfers_in */ #define DEFAULT_XFERS_PER_NS 2 /* default # of xfers per peer nameserver */ #define XFER_BUFSIZE (16*1024) /* arbitrary but bigger than most MTU's */ +#define MAX_SYNCDELAY 3 /* Presumed timeout in use by our clients. */ +#define MAX_SYNCDRAIN 100000 /* How long we'll spin in drain_all_rcvbuf. */ +#define MAX_SYNCSTORE 500 /* maximum time to cache negative answers */ #define DEFAULT_MAX_NCACHE_TTL (3*60*60) @@ -160,6 +163,7 @@ typedef enum need { main_need_zoneload, /* loadxfer() needed. */ main_need_dump, /* doadump() needed. */ main_need_statsdump, /* ns_stats() needed. */ + main_need_statsdumpandclear, /* ns_stats() needed. */ main_need_exit, /* exit() needed. */ main_need_qrylog, /* toggle_qrylog() needed. */ main_need_debug, /* use_desired_debug() needed. */ @@ -190,6 +194,8 @@ typedef enum need { #define OPTION_TREAT_CR_AS_SPACE 0x1000 /* Treat CR in zone files as space */ #define OPTION_USE_IXFR 0x2000 /* Use by delault ixfr in zone transfer */ #define OPTION_MAINTAIN_IXFR_BASE 0x4000 /* Part of IXFR file name logic. */ +#define OPTION_HITCOUNT 0x8000 /* Keep track of each time an RR gets + * hit in the database */ #define DEFAULT_OPTION_FLAGS (OPTION_NODIALUP|OPTION_NONAUTH_NXDOMAIN|\ OPTION_USE_ID_POOL|OPTION_NORFC2308_TYPE1) @@ -671,8 +677,8 @@ struct nameser { u_int32_t rtt; /* round trip time */ /* XXX - need to add more stuff from "struct qserv", and use our rtt */ u_int16_t flags; /* see below */ -#endif u_int8_t xfers; /* #/xfers running right now */ +#endif }; enum transport { primary_trans, secondary_trans, response_trans, update_trans, @@ -764,6 +770,7 @@ typedef struct options { rrset_order_list ordering; int heartbeat_interval; u_int max_ncache_ttl; + u_int max_host_stats; u_int lame_ttl; int minroots; } *options; diff --git a/contrib/bind/bin/named/ns_forw.c b/contrib/bind/bin/named/ns_forw.c index beb919c..dac6525 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.75 2000/05/09 07:12:58 vixie Exp $"; +static const char rcsid[] = "$Id: ns_forw.c,v 8.78 2000/12/23 08:14:37 vixie Exp $"; #endif /* not lint */ /* @@ -375,6 +375,8 @@ nslookupComplain(const char *sysloginfo, const char *queryname, ns_debug(ns_log_default, 2, "NS '%s' %s", dname, complaint); if (sysloginfo && queryname && !haveComplained((u_long)queryname, (u_long)complaint)) { + char nsbuf[20], abuf[20]; + a = ns = (char *)NULL; print_a = (a_rr->d_type == T_A); a_type = p_type(a_rr->d_type); @@ -389,25 +391,21 @@ nslookupComplain(const char *sysloginfo, const char *queryname, break; } } - if (NS_OPTION_P(OPTION_HOSTSTATS)) { - char nsbuf[20], abuf[20]; - - if (nsdp != NULL) { - if (nsdp->d_ns != NULL) { - strcpy(nsbuf, - inet_ntoa(nsdp->d_ns->addr)); - ns = nsbuf; - } else { - ns = zones[nsdp->d_zone].z_origin; - } - } - if (a_rr->d_ns != NULL) { - strcpy(abuf, inet_ntoa(a_rr->d_ns->addr)); - a = abuf; + if (nsdp != NULL) { + if (nsdp->d_addr.s_addr != htonl(0)) { + strcpy(nsbuf, + inet_ntoa(nsdp->d_addr)); + ns = nsbuf; } else { - a = zones[a_rr->d_zone].z_origin; + ns = zones[nsdp->d_zone].z_origin; } } + if (a_rr->d_addr.s_addr != htonl(0)) { + strcpy(abuf, inet_ntoa(a_rr->d_addr)); + a = abuf; + } else { + a = zones[a_rr->d_zone].z_origin; + } if (a != NULL || ns != NULL) ns_info(ns_log_default, "%s: query(%s) %s (%s:%s) learnt (%s=%s:NS=%s)", @@ -677,7 +675,6 @@ nslookup(struct databuf *nsp[], struct qinfo *qp, skipserver: (void)NULL; } - out: ns_debug(ns_log_default, 3, "nslookup: %d ns addrs total", n); qp->q_naddr = n; if (n == 0 && potential_ns == 0 && !NS_ZFWDTAB(qp->q_fzone)) { @@ -766,14 +763,17 @@ int qcomp(struct qserv *qs1, struct qserv *qs2) { u_int rtt1, rtt2, rttr1, rttr2; - if (qs1->nsdata == NULL || qs2->nsdata == NULL) { + if (qs1->nsdata == NULL) { rtt1 = 0; rttr1 = 0; - rtt2 = 0; - rttr2 = 0; } else { rtt1 = qs1->nsdata->d_nstime; rttr1 = RTTROUND(rtt1); + } + if (qs2->nsdata == NULL) { + rtt2 = 0; + rttr2 = 0; + } else { rtt2 = qs2->nsdata->d_nstime; rttr2 = RTTROUND(rtt2); } @@ -979,7 +979,7 @@ retry(struct qinfo *qp) { #ifdef DEBUG if (debug >= 10) res_pquery(&res, qp->q_msg, n, - log_get_stream(packet_channel)); + log_get_stream(packet_channel)); #endif if (send_msg((u_char *)hp, n, qp)) { ns_debug(ns_log_default, 1, @@ -1013,7 +1013,7 @@ retry(struct qinfo *qp) { #ifdef DEBUG if (debug >= 10) res_pquery(&res, qp->q_msg, qp->q_msglen, - log_get_stream(packet_channel)); + log_get_stream(packet_channel)); #endif key = tsig_key_from_addr(nsa->sin_addr); if (key != NULL) { @@ -1258,13 +1258,13 @@ nsfwdadd(struct qinfo *qp, struct fwdinfo *fwd) { nextfwd: fwd = fwd->next; } - qp->q_naddr = n; /* Update the refcounts before the sort. */ - for (i = 0; i < (u_int)n; i++) { + for (i = qp->q_naddr; i < (u_int)n; i++) { DRCNTINC(qp->q_addr[i].nsdata); DRCNTINC(qp->q_addr[i].ns); } + qp->q_naddr = n; if (n > 1) { qsort((char *)qp->q_addr, n, sizeof(struct qserv), (int (*)(const void *, const void *))qcomp); diff --git a/contrib/bind/bin/named/ns_func.h b/contrib/bind/bin/named/ns_func.h index 760266d..ca30823 100644 --- a/contrib/bind/bin/named/ns_func.h +++ b/contrib/bind/bin/named/ns_func.h @@ -90,42 +90,42 @@ /* ns_func.h - declarations for ns_*.c's externally visible functions * - * $Id: ns_func.h,v 8.96 2000/04/21 06:54:06 vixie Exp $ + * $Id: ns_func.h,v 8.104 2001/01/25 05:50:54 marka Exp $ */ /* ++from ns_glue.c++ */ -extern struct in_addr ina_get(const u_char *data); -extern const char *sin_ntoa(struct sockaddr_in); -extern int ns_wouldlog(int category, int level); -extern void ns_debug(int, int, const char *, ...), - ns_info(int, const char *, ...), - ns_notice(int, const char *, ...), - ns_warning(int, const char *, ...), - ns_error(int, const char *, ...), - ns_panic(int, int, const char *, ...), - ns_assertion_failed(char *file, int line, +struct in_addr ina_get(const u_char *data); +const char * sin_ntoa(struct sockaddr_in); +int ns_wouldlog(int category, int level); +void ns_debug(int, int, const char *, ...); +void ns_info(int, const char *, ...); +void ns_notice(int, const char *, ...); +void ns_warning(int, const char *, ...); +void ns_error(int, const char *, ...); +void ns_panic(int, int, const char *, ...); +void ns_assertion_failed(char *file, int line, assertion_type type, char *cond, int print_errno); -extern void panic(const char *, const void *), - gettime(struct timeval *); -extern int nlabels(const char *), - my_close(int), - my_fclose(FILE *); -extern void __freestr(char *); -extern char *__newstr(size_t, int), - *__savestr(const char *, int), - *checked_ctime(const time_t *t), - *ctimel(long); -extern void __freestr_record(char *, char *, int); -extern char *__newstr_record(size_t, int, char *, int); -extern char *__savestr_record(const char *, int, char *, int); -extern u_char *ina_put(struct in_addr ina, u_char *data), - *savebuf(const u_char *, size_t, int); -extern void dprintf(int level, const char *format, ...); +void panic(const char *, const void *); +void gettime(struct timeval *); +int nlabels(const char *); +int my_close(int); +int my_fclose(FILE *); +void __freestr(char *); +char * __newstr(size_t, int); +char * __savestr(const char *, int); +char * checked_ctime(const time_t *t); +char * ctimel(long); +void __freestr_record(char *, char *, int); +char * __newstr_record(size_t, int, char *, int); +char * __savestr_record(const char *, int, char *, int); +u_char * ina_put(struct in_addr ina, u_char *data); +u_char * savebuf(const u_char *, size_t, int); +void dprintf(int level, const char *format, ...); #ifdef DEBUG_STRINGS -extern char *debug_newstr(size_t, int, const char *, int), - *debug_savestr(const char *, int, const char *, int); -extern void debug_freestr(char *, const char *, int); +char * debug_newstr(size_t, int, const char *, int); +char * debug_savestr(const char *, int, const char *, int); +void debug_freestr(char *, const char *, int); #define newstr(l, n) debug_newstr((l), (n), __FILE__, __LINE__) #define savestr(s, n) debug_savestr((s), (n), __FILE__, __LINE__) #define freestr(s) debug_freestr((s), __FILE__, __LINE__) @@ -140,7 +140,6 @@ extern void debug_freestr(char *, const char *, int); #define freestr(s) __freestr((s)) #endif #endif /* DEBUG_STRINGS */ -int movefile(const char *, const char *); /* --from ns_glue.c-- */ /* ++from ns_notify.c++ */ @@ -153,43 +152,43 @@ void ns_stopnotify(const char *, ns_class); /* --from ns_notify.c-- */ /* ++from ns_resp.c++ */ -extern void ns_resp(u_char *, int, struct sockaddr_in, - struct qstream *), - prime_cache(void), - delete_all(struct namebuf *, int, int); -extern int delete_stale(struct namebuf *); -extern struct qinfo *sysquery(const char *, int, int, - struct in_addr *, int, u_int16_t, int); -extern int doupdate(u_char *, u_char *, struct databuf **, - int, int, int, u_int, struct sockaddr_in), - send_msg(u_char *, int, struct qinfo *), - findns(struct namebuf **, int, - struct databuf **, int *, int), - finddata(struct namebuf *, int, int, HEADER *, - char **, int *, int *), - add_data(struct namebuf *, +void ns_resp(u_char *, int, struct sockaddr_in, + struct qstream *); +void prime_cache(void); +void delete_all(struct namebuf *, int, int); +int delete_stale(struct namebuf *); +struct qinfo * sysquery(const char *, int, int, + struct in_addr *, int, u_int16_t, int); +int doupdate(u_char *, u_char *, struct databuf **, + int, int, int, u_int, struct sockaddr_in); +int send_msg(u_char *, int, struct qinfo *); +int findns(struct namebuf **, int, + struct databuf **, int *, int); +int finddata(struct namebuf *, int, int, HEADER *, + char **, int *, int *); +int add_data(struct namebuf *, struct databuf **, - u_char *, int, int *), - trunc_adjust(u_char *, int, int); + u_char *, int, int *); +int trunc_adjust(u_char *, int, int); /* --from ns_resp.c-- */ /* ++from ns_req.c++ */ -extern void ns_req(u_char *, int, int, +void ns_req(u_char *, int, int, struct qstream *, struct sockaddr_in, - int), - free_addinfo(void), - free_nsp(struct databuf **); -extern int stale(struct databuf *), - make_rr(const char *, struct databuf *, + int); +void free_addinfo(void); +void free_nsp(struct databuf **); +int stale(struct databuf *); +int make_rr(const char *, struct databuf *, u_char *, int, int, - u_char **, u_char **, int), - doaddinfo(HEADER *, u_char *, int), - doaddauth(HEADER *, u_char *, int, + u_char **, u_char **, int); +int doaddinfo(HEADER *, u_char *, int); +int doaddauth(HEADER *, u_char *, int, struct namebuf *, struct databuf *); #ifdef BIND_NOTIFY -extern int findZonePri(const struct zoneinfo *, +int findZonePri(const struct zoneinfo *, const struct sockaddr_in); #endif /* --from ns_req.c-- */ @@ -198,12 +197,12 @@ extern int findZonePri(const struct zoneinfo *, void ns_xfr(struct qstream *qsp, struct namebuf *znp, int zone, int class, int type, int id, int opcode, u_int32_t serial_ixfr, - struct tsig_record *in_tsig), - ns_stopxfrs(struct zoneinfo *), - ns_freexfr(struct qstream *), - sx_newmsg(struct qstream *qsp), - sx_sendlev(struct qstream *qsp), - sx_sendsoa(struct qstream *qsp); + struct tsig_record *in_tsig); +void ns_stopxfrs(struct zoneinfo *); +void ns_freexfr(struct qstream *); +void sx_newmsg(struct qstream *qsp); +void sx_sendlev(struct qstream *qsp); +void sx_sendsoa(struct qstream *qsp); /* --from ns_xfr.c-- */ /* ++from ns_ctl.c++ */ @@ -219,12 +218,13 @@ void ns_ctl_install(controls *); /* --from ns_ctl.c-- */ /* ++from ns_ixfr.c++ */ -void sx_send_ixfr(struct qstream *qsp); +void sx_send_ixfr(struct qstream *); +int ixfr_log_maint(struct zoneinfo *); /* --from ns_ixfr.c-- */ /* ++from ns_forw.c++ */ -extern time_t retrytime(struct qinfo *); -extern int ns_forw(struct databuf *nsp[], +time_t retrytime(struct qinfo *); +int ns_forw(struct databuf *nsp[], u_char *msg, int msglen, struct sockaddr_in from, @@ -236,139 +236,142 @@ extern int ns_forw(struct databuf *nsp[], int type, struct namebuf *np, int use_tcp, - struct tsig_record *in_tsig), - haveComplained(u_long, u_long), - nslookup(struct databuf *nsp[], + struct tsig_record *in_tsig); +int haveComplained(u_long, u_long); +int nslookup(struct databuf *nsp[], struct qinfo *qp, const char *syslogdname, - const char *sysloginfo), - qcomp(struct qserv *, struct qserv *); -extern void schedretry(struct qinfo *, time_t), - unsched(struct qinfo *), - reset_retrytimer(void), - retrytimer(evContext ctx, void *uap, - struct timespec due, struct timespec ival), - retry(struct qinfo *), - qflush(void), - qremove(struct qinfo *), - ns_freeqns(struct qinfo *, char *), - ns_freeqry(struct qinfo *), - freeComplaints(void), - nsfwdadd(struct qinfo *, struct fwdinfo *); -extern struct qinfo *qfindid(u_int16_t), - *qnew(const char *, int, int, int); + const char *sysloginfo); +int qcomp(struct qserv *, struct qserv *); +void schedretry(struct qinfo *, time_t); +void unsched(struct qinfo *); +void reset_retrytimer(void); +void retrytimer(evContext ctx, void *uap, + struct timespec due, struct timespec ival); +void retry(struct qinfo *); +void qflush(void); +void qremove(struct qinfo *); +void ns_freeqns(struct qinfo *, char *); +void ns_freeqry(struct qinfo *); +void freeComplaints(void); +void nsfwdadd(struct qinfo *, struct fwdinfo *); +struct qinfo * qfindid(u_int16_t); +struct qinfo * qnew(const char *, int, int, int); /* --from ns_forw.c-- */ /* ++from ns_main.c++ */ -extern struct in_addr net_mask(struct in_addr); -extern void sq_remove(struct qstream *), - sq_flushw(struct qstream *), - sq_flush(struct qstream *allbut), - dq_remove_gen(time_t gen), - dq_remove_all(), - sq_done(struct qstream *), - ns_setproctitle(char *, int), - getnetconf(int), - nsid_init(void), - ns_setoption(int option), - writestream(struct qstream *, const u_char *, int), - ns_need_unsafe(enum need), - ns_need(enum need), - opensocket_f(void), - nsid_hash(u_char *, size_t); -extern u_int16_t nsid_next(void); -extern int sq_openw(struct qstream *, int), - sq_writeh(struct qstream *, sq_closure), - sq_write(struct qstream *, const u_char *, int), - tcp_send(struct qinfo *), - aIsUs(struct in_addr); +void toggle_qrylog(void); +struct in_addr net_mask(struct in_addr); +void sq_remove(struct qstream *); +void sq_flushw(struct qstream *); +void sq_flush(struct qstream *allbut); +void dq_remove_gen(time_t gen); +void dq_remove_all(); +void sq_done(struct qstream *); +void ns_setproctitle(char *, int); +void getnetconf(int); +void nsid_init(void); +void ns_setoption(int option); +void writestream(struct qstream *, const u_char *, int); +void ns_need_unsafe(enum need); +void ns_need(enum need); +void opensocket_f(void); +void nsid_hash(u_char *, size_t); +u_int16_t nsid_next(void); +int sq_openw(struct qstream *, int); +int sq_writeh(struct qstream *, sq_closure); +int sq_write(struct qstream *, const u_char *, int); +int tcp_send(struct qinfo *); +int aIsUs(struct in_addr); /* --from ns_main.c-- */ /* ++from ns_maint.c++ */ -extern void zone_maint(struct zoneinfo *), - sched_zone_maint(struct zoneinfo *), - ns_cleancache(evContext ctx, void *uap, +void zone_maint(struct zoneinfo *); +void sched_zone_maint(struct zoneinfo *); +void ns_cleancache(evContext ctx, void *uap, struct timespec due, - struct timespec inter), - clean_cache_from(char *dname, struct hashbuf *htp), - remove_zone(struct zoneinfo *, const char *), - purge_zone(const char *, struct hashbuf *, int), - loadxfer(void), - qserial_retrytime(struct zoneinfo *, time_t), - qserial_query(struct zoneinfo *), - qserial_answer(struct qinfo *), + struct timespec inter); +void clean_cache_from(char *dname, struct hashbuf *htp); +void remove_zone(struct zoneinfo *, const char *); +void purge_zone(const char *, struct hashbuf *, int); +void loadxfer(void); +void qserial_retrytime(struct zoneinfo *, time_t); +void qserial_query(struct zoneinfo *); +void qserial_answer(struct qinfo *); #ifdef DEBUG - printzoneinfo(int, int, int), +void printzoneinfo(int, int, int); #endif - endxfer(void), - addxfer(struct zoneinfo *), - ns_zreload(void), - ns_reload(void), - ns_reconfig(void), - ns_noexpired(void); +void endxfer(void); +void addxfer(struct zoneinfo *); +void ns_zreload(void); +void ns_reload(void); +void ns_reconfig(void); +void ns_noexpired(void); #if 0 -extern int reload_all_unsafe(void); +int reload_all_unsafe(void); #endif -extern int zonefile_changed_p(struct zoneinfo *); +int zonefile_changed_p(struct zoneinfo *); int reload_master(struct zoneinfo *); -extern const char * deferred_reload_unsafe(struct zoneinfo *); -extern struct namebuf * purge_node(struct hashbuf *htp, struct namebuf *np); -extern int clean_cache(struct hashbuf *, int); -extern void reapchild(void); -extern const char * zoneTypeString(unsigned int); -extern void ns_heartbeat(evContext ctx, void *uap, +const char * deferred_reload_unsafe(struct zoneinfo *); +struct namebuf * purge_node(struct hashbuf *htp, struct namebuf *np); +int clean_cache(struct hashbuf *, int); +void reapchild(void); +const char * zoneTypeString(unsigned int); +void ns_heartbeat(evContext ctx, void *uap, struct timespec, struct timespec); -extern void make_new_zones(void); -extern void free_zone(struct zoneinfo *); -extern struct zoneinfo *find_auth_zone(const char *, ns_class); -extern int purge_nonglue(const char *dname, struct hashbuf *htp, - int class); +void make_new_zones(void); +void free_zone(struct zoneinfo *); +struct zoneinfo * find_auth_zone(const char *, ns_class); +int purge_nonglue(const char *dname, struct hashbuf *htp, + int class, int log); /* --from ns_maint.c-- */ /* ++from ns_sort.c++ */ -extern void sort_response(u_char *, u_char *, int, +void sort_response(u_char *, u_char *, int, struct sockaddr_in *); /* --from ns_sort.c-- */ /* ++from ns_init.c++ */ -extern void ns_refreshtime(struct zoneinfo *, time_t); -extern void ns_retrytime(struct zoneinfo *, time_t); -extern void ns_init(const char *); -extern void purgeandload(struct zoneinfo *zp); -extern enum context ns_ptrcontext(const char *owner); -extern enum context ns_ownercontext(int type, enum transport); -extern int ns_nameok(const struct qinfo *qry, const char *name, +void ns_refreshtime(struct zoneinfo *, time_t); +void ns_retrytime(struct zoneinfo *, time_t); +time_t ns_init(const char *); +void purgeandload(struct zoneinfo *zp); +enum context ns_ptrcontext(const char *owner); +enum context ns_ownercontext(int type, enum transport); +int ns_nameok(const struct qinfo *qry, const char *name, int class, struct zoneinfo *zp, enum transport, enum context, const char *owner, struct in_addr source); -extern int ns_wildcard(const char *name); -extern void zoneinit(struct zoneinfo *); -extern void do_reload(const char *, int, int, int); -extern void ns_shutdown(void); +int ns_wildcard(const char *name); +void zoneinit(struct zoneinfo *); +void do_reload(const char *, int, int, int); +void ns_shutdown(void); /* --from ns_init.c-- */ /* ++from ns_ncache.c++ */ -extern void cache_n_resp(u_char *, int, struct sockaddr_in, +void cache_n_resp(u_char *, int, struct sockaddr_in, const char *, int, int); /* --from ns_ncache.c-- */ /* ++from ns_udp.c++ */ -extern void ns_udp(void); +void ns_udp(void); /* --from ns_udp.c-- */ /* ++from ns_stats.c++ */ -extern void ns_stats(void), - ns_freestats(void); -extern void ns_logstats(evContext ctx, void *uap, +void ns_stats(void); +void ns_stats_dumpandclear(void); +void ns_freestats(void); +void ns_logstats(evContext ctx, void *uap, struct timespec, struct timespec); -extern void qtypeIncr(int qtype); -extern struct nameser *nameserFind(struct in_addr addr, int flags); +void qtypeIncr(int qtype); +struct nameser * nameserFind(struct in_addr addr, int flags); #define NS_F_INSERT 0x0001 #define nameserIncr(a,w) NS_INCRSTAT(a,w) /* XXX should change name. */ /* --from ns_stats.c-- */ /* ++from ns_update.c++ */ +struct databuf * findzonesoa(struct zoneinfo *); void free_rrecp(ns_updque *, int rcode, struct sockaddr_in); int findzone(const char *, int, int, int *, int); u_char * findsoaserial(u_char *data); @@ -389,6 +392,16 @@ void rdata_dump(struct databuf *dp, FILE *fp); /* --from ns_update.c-- */ /* ++from ns_config.c++ */ +void add_to_rrset_order_list(rrset_order_list, + rrset_order_element); +const char * p_order(int); +int set_zone_ixfr_file(zone_config, char *); +int set_zone_master_port(zone_config, u_short); +int set_zone_max_log_size_ixfr(zone_config, int); +int set_zone_dialup(zone_config, int); +int set_trusted_key(const char *, const int, + const int, const int, const char *); +int set_zone_ixfr_tmp(zone_config, char *); void free_zone_timerinfo(struct zoneinfo *); void free_zone_contents(struct zoneinfo *, int); struct zoneinfo * find_zone(const char *, int); @@ -485,17 +498,19 @@ void init_logging(void); void shutdown_logging(void); void init_configuration(void); void shutdown_configuration(void); -void load_configuration(const char *); +time_t load_configuration(const char *); /* --from ns_config.c-- */ + /* ++from parser.y++ */ ip_match_list lookup_acl(char *); void define_acl(char *, ip_match_list); struct dst_key *lookup_key(char *); void define_key(char *, struct dst_key *); -void parse_configuration(const char *); +time_t parse_configuration(const char *); void parser_initialize(void); void parser_shutdown(void); /* --from parser.y-- */ + /* ++from ns_signal.c++ */ void init_signals(void); void block_signals(void); diff --git a/contrib/bind/bin/named/ns_glob.h b/contrib/bind/bin/named/ns_glob.h index e9f70e7..8f4628a 100644 --- a/contrib/bind/bin/named/ns_glob.h +++ b/contrib/bind/bin/named/ns_glob.h @@ -1,6 +1,6 @@ /* * from ns.h 4.33 (Berkeley) 8/23/90 - * $Id: ns_glob.h,v 8.55 2000/07/20 22:50:38 vixie Exp $ + * $Id: ns_glob.h,v 8.56 2000/12/02 18:39:25 vixie Exp $ */ /* @@ -125,9 +125,12 @@ DECL time_t resettime; /* next query to retry */ DECL struct qinfo *retryqp; - /* default configuration file */ + /* configuration file name */ DECL char *conffile; + /* configuration file mtime */ +DECL time_t confmtime; + /* default debug output file */ DECL char *debugfile; diff --git a/contrib/bind/bin/named/ns_glue.c b/contrib/bind/bin/named/ns_glue.c index 8360ad5..c1f9be2 100644 --- a/contrib/bind/bin/named/ns_glue.c +++ b/contrib/bind/bin/named/ns_glue.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ns_glue.c,v 8.17 2000/07/17 07:36:52 vixie Exp $"; +static const char rcsid[] = "$Id: ns_glue.c,v 8.18 2000/11/08 06:16:36 marka Exp $"; #endif /* not lint */ /* @@ -435,17 +435,6 @@ ctimel(long l) { return (checked_ctime(&t)); } -/* - * rename() is lame (can't overwrite an existing file) on some systems. - * use movefile() instead, and let lame OS ports do what they need to. - */ -#ifndef HAVE_MOVEFILE -int -movefile(const char *oldname, const char *newname) { - return (rename(oldname, newname)); -} -#endif - #ifdef ultrix /* * Some library routines in libc need to be able to see the res_send diff --git a/contrib/bind/bin/named/ns_init.c b/contrib/bind/bin/named/ns_init.c index 66242a4..c5842f6 100644 --- a/contrib/bind/bin/named/ns_init.c +++ b/contrib/bind/bin/named/ns_init.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)ns_init.c 4.38 (Berkeley) 3/21/91"; -static const char rcsid[] = "$Id: ns_init.c,v 8.68 2000/04/21 06:54:07 vixie Exp $"; +static const char rcsid[] = "$Id: ns_init.c,v 8.70 2000/12/23 08:14:38 vixie Exp $"; #endif /* not lint */ /* @@ -132,10 +132,11 @@ ns_retrytime(struct zoneinfo *zp, time_t timebase) { /* * Read configuration file and save it as internal state. */ -void +time_t ns_init(const char *conffile) { struct zoneinfo *zp; static int loads = 0; /* number of times loaded */ + time_t mtime; ns_debug(ns_log_config, 1, "ns_init(%s)", conffile); gettime(&tt); @@ -181,7 +182,7 @@ ns_init(const char *conffile) { } #endif - load_configuration(conffile); + mtime = load_configuration(conffile); /* Erase all old zones that were not found. */ for (zp = &zones[0]; zp < &zones[nzones]; zp++) { @@ -210,6 +211,7 @@ ns_init(const char *conffile) { ns_debug(ns_log_config, 1, "exit ns_init()"); loads++; + return (mtime); } void @@ -277,9 +279,9 @@ do_reload(const char *domain, int type, int class, int mark) { */ zp = find_zone(domain, class); if (zp != NULL && - (type != z_master && zp->z_type == z_master) || - (type != z_slave && zp->z_type == z_slave && zp->z_serial != 0) || - (type != z_stub && zp->z_type == z_stub && zp->z_serial != 0)) + ((type != z_master && zp->z_type == z_master) || + (type != z_slave && zp->z_type == z_slave && zp->z_serial != 0) || + (type != z_stub && zp->z_type == z_stub && zp->z_serial != 0))) return; /* @@ -466,7 +468,7 @@ ns_nameok(const struct qinfo *qry, const char *name, int class, else { s = newstr(strlen(transport_strings[transport]) + sizeof " from [000.000.000.000] for [000.000.000.000]", 0); - if (s) + if (s != NULL) { if ( (transport == response_trans) && (qry != NULL) ) { @@ -496,6 +498,7 @@ ns_nameok(const struct qinfo *qry, const char *name, int class, transport_strings[transport], inet_ntoa(source)); } + } } if (ns_samename(owner, name) == 1) o = savestr("", 0); diff --git a/contrib/bind/bin/named/ns_ixfr.c b/contrib/bind/bin/named/ns_ixfr.c index 693dc6f..5dd438b 100644 --- a/contrib/bind/bin/named/ns_ixfr.c +++ b/contrib/bind/bin/named/ns_ixfr.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ns_ixfr.c,v 8.19 2000/04/18 20:47:27 vixie Exp $"; +static const char rcsid[] = "$Id: ns_ixfr.c,v 8.25 2000/12/27 06:56:03 vixie Exp $"; #endif /* not lint */ /* @@ -46,6 +46,7 @@ static const char rcsid[] = "$Id: ns_ixfr.c,v 8.19 2000/04/18 20:47:27 vixie Exp #include <isc/eventlib.h> #include <isc/logging.h> #include <isc/memcluster.h> +#include <isc/misc.h> #include "port_after.h" @@ -85,10 +86,7 @@ sx_new_ixfrmsg(struct qstream *qsp) { struct namebuf *np; struct hashbuf *htp; struct zoneinfo *zp; - struct databuf *dp; const char * fname; - u_char ** edp = qsp->xfr.ptrs + - sizeof qsp->xfr.ptrs / sizeof(u_char *); qsp->xfr.ixfr_zone = qsp->xfr.zone; zp = &zones[qsp->xfr.zone]; @@ -102,11 +100,6 @@ sx_new_ixfrmsg(struct qstream *qsp) { htp = hashtab; np = nlookup(zp->z_origin, &htp, &fname, 0); buflen = XFER_BUFSIZE; - foreach_rr(dp, np, T_SOA, qsp->xfr.class, qsp->xfr.zone) { - n = make_rr(zp->z_origin, dp, qsp->xfr.cp, qsp->xfr.eom - qsp->xfr.cp, 0, qsp->xfr.ptrs, edp, 0); - qsp->xfr.cp += n; - hp->ancount = htons(ntohs(hp->ancount) + 1); - } } } @@ -194,13 +187,11 @@ sx_addrr(struct qstream *qsp, const char *dname, struct databuf *dp) { void sx_send_ixfr(struct qstream *qsp) { char * cp; - u_int32_t serial = 0; struct zoneinfo *zp = NULL; struct databuf *soa_dp; struct databuf *old_soadp; ns_delta *dp; ns_updrec *rp; - ns_updrec *trp; int foundsoa; zp = &zones[qsp->xfr.zone]; @@ -211,6 +202,8 @@ sx_send_ixfr(struct qstream *qsp) { "sx_send_ixfr: unable to locate soa"); } old_soadp = memget(DATASIZE(soa_dp->d_size)); + if (old_soadp == NULL) + ns_panic(ns_log_update, 1, "sx_send_ixfr: out of memory"); memcpy(old_soadp, soa_dp, DATASIZE(soa_dp->d_size)); again: @@ -218,13 +211,8 @@ sx_send_ixfr(struct qstream *qsp) { case s_x_firstsoa: ns_debug(ns_log_default, 3, "IXFR: s_x_firstsoa (%s)", zp->z_origin); - /* - * The current SOA has been emited already. - * It would be cleaner if the first one was emited here... - * - * if (sx_addrr(qsp, zp->z_origin, soa_dp) < 0) - * goto cleanup; - */ + if (sx_addrr(qsp, zp->z_origin, soa_dp) < 0) + goto cleanup; qsp->xfr.state = s_x_deletesoa; /* FALLTHROUGH */ case s_x_deletesoa: @@ -377,12 +365,13 @@ sx_send_ixfr(struct qstream *qsp) { if (qsp->xfr.ixfr_zone != 0) sx_addrr(qsp, zp->z_origin, soa_dp); break; + default: + break; } ns_debug(ns_log_default, 3, "IXFR: flushing %s", zp->z_origin); qsp->xfr.state = s_x_done; sx_flush(qsp); sq_writeh(qsp, sq_flushw); - cleanup: if (qsp->xfr.top.ixfr != NULL) { if(!EMPTY(*qsp->xfr.top.ixfr)) { while ((dp = HEAD(*qsp->xfr.top.ixfr)) != NULL) { @@ -400,6 +389,7 @@ sx_send_ixfr(struct qstream *qsp) { memput(qsp->xfr.top.ixfr, sizeof *qsp->xfr.top.ixfr); qsp->xfr.top.ixfr = NULL; } + cleanup: memput(old_soadp, DATASIZE(old_soadp->d_size)); } @@ -413,11 +403,9 @@ sx_send_ixfr(struct qstream *qsp) { * int ixfr_log_maint(struct zoneinfo *zp, int fast_trim) * * zp - pointer to the zone information - * fast_trim - is used to denote that this is not called on the regular - * maintaince cycle. - * */ -int ixfr_log_maint(struct zoneinfo *zp, int fast_trim) { +int +ixfr_log_maint(struct zoneinfo *zp) { int fd, rcount, wcount; int found = 0; int error = 0; @@ -466,32 +454,26 @@ int ixfr_log_maint(struct zoneinfo *zp, int fast_trim) { zp->z_max_log_size_ixfr); if (zp->z_max_log_size_ixfr) { if (sb.st_size > zp->z_max_log_size_ixfr) - seek = (signed)sb.st_size - - (signed)(zp->z_max_log_size_ixfr + - (zp->z_max_log_size_ixfr * .10) ); + seek = sb.st_size - + (size_t)(zp->z_max_log_size_ixfr + + (zp->z_max_log_size_ixfr * 0.10) ); else seek = 0; } else { - if (sb.st_size > (db_sb.st_size * .50)) - seek = (signed)sb.st_size - (signed)((db_sb.st_size * .50) - + ((db_sb.st_size * zp->z_max_log_size_ixfr) *.10)); + if (sb.st_size > (db_sb.st_size * 0.50)) + seek = sb.st_size - (size_t)((db_sb.st_size * 0.50) + + ((db_sb.st_size * zp->z_max_log_size_ixfr) * 0.10)); else seek = 0; } ns_debug(ns_log_default, 3, "seek: %d", seek); - if (seek < 1) - { + if (seek < 1) { ns_debug(ns_log_default, 3, "%s does not need to be reduced", zp->z_ixfr_base); (void) my_fclose(from_fp); return (-1); } - if ((fast_trim) && seek < (zp->z_max_log_size_ixfr + 100000)) { - (void) my_fclose(from_fp); - return (0); - } - tmpname = memget(strlen(zp->z_ixfr_base) + sizeof(".XXXXXX") + 1); if (!tmpname) { ns_warning(ns_log_default, "memget failed"); @@ -570,7 +552,7 @@ int ixfr_log_maint(struct zoneinfo *zp, int fast_trim) { (void) close(fd); (void) my_fclose(from_fp); if (error == 0) { - if (rename(tmpname, zp->z_ixfr_base) == -1) { + if (isc_movefile(tmpname, zp->z_ixfr_base) == -1) { ns_warning(ns_log_default, "can not rename %s to %s :%s", tmpname, zp->z_ixfr_base, strerror(errno)); } diff --git a/contrib/bind/bin/named/ns_lexer.c b/contrib/bind/bin/named/ns_lexer.c index 7110fe4..bb2d11f 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.20 2000/04/21 06:54:07 vixie Exp $"; +static const char rcsid[] = "$Id: ns_lexer.c,v 8.22 2000/11/29 06:55:58 marka Exp $"; #endif /* not lint */ /* @@ -260,7 +260,11 @@ static struct keyword keywords[] = { {"has-old-clients", T_HAS_OLD_CLIENTS}, {"heartbeat-interval", T_HEARTBEAT}, {"hint", T_HINT}, +#ifdef HITCOUNTS + {"hit-count", T_HITCOUNT}, +#endif /* HITCOUNTS */ {"host-statistics", T_HOSTSTATS}, + {"host-statistics-max", T_HOSTSTATSMAX}, {"if-no-answer", T_IF_NO_ANSWER}, {"if-no-domain", T_IF_NO_DOMAIN}, {"ignore", T_IGNORE}, diff --git a/contrib/bind/bin/named/ns_main.c b/contrib/bind/bin/named/ns_main.c index 1461807..5caaae9 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.126 2000/07/20 22:50:39 vixie Exp $"; +static const char rcsid[] = "$Id: ns_main.c,v 8.142 2001/01/15 20:06:25 vixie Exp $"; #endif /* not lint */ /* @@ -112,6 +112,7 @@ char copyright[] = #include <errno.h> #include <fcntl.h> #include <grp.h> +#include <irs.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> @@ -138,6 +139,17 @@ char copyright[] = #include "named.h" #undef MAIN_PROGRAM +typedef void (*handler)(void); + +typedef struct _savedg { + struct sockaddr_in from; + int dfd; + interface * ifp; + time_t gen; + u_char * buf; + u_int16_t buflen; +} savedg; + /* list of interfaces */ static LIST(struct _interface) iflist; static int iflist_initialized = 0; @@ -162,10 +174,13 @@ static u_int16_t nsid_c1, nsid_c2, nsid_c3; static u_int16_t nsid_state2; static int nsid_algorithm; -typedef void (*handler)(void); static int needs = 0, needs_exit = 0; static handler handlers[main_need_num]; +static void savedg_waitfunc(evContext, void*, const void*); static void need_waitfunc(evContext, void *, const void *); +static int drain_rcvbuf(evContext, interface *, int, + int *, int *); +static int drain_all_rcvbuf(evContext); static struct qstream *sq_add(void); static int opensocket_d(interface *), @@ -178,8 +193,6 @@ static void stream_write(evContext, void *, int, int); static interface * if_find(struct in_addr, u_int16_t port); -static int sq_here(struct qstream *); - static void deallocate_everything(void), stream_accept(evContext, void *, int, const void *, int, @@ -197,7 +210,8 @@ static void stream_send(evContext, void *, int, static int only_digits(const char *); static void init_needs(void), - handle_needs(void); + handle_needs(void), + exit_handler(void); #ifndef HAVE_CUSTOM static void custom_init(void), @@ -445,7 +459,7 @@ main(int argc, char *argv[], char *envp[]) { #ifdef SYSLOG_42BSD openlog("named", n); #else - openlog("named", n, LOG_DAEMON); + openlog("named", n, ISC_FACILITY); #endif init_logging(); @@ -461,7 +475,7 @@ main(int argc, char *argv[], char *envp[]) { init_needs(); init_signals(); - ns_notice(ns_log_default, "starting. %s", Version); + ns_notice(ns_log_default, "starting (%s). %s", conffile, Version); /* * Initialize and load database. @@ -469,7 +483,7 @@ main(int argc, char *argv[], char *envp[]) { gettime(&tt); buildservicelist(); buildprotolist(); - ns_init(conffile); + confmtime = ns_init(conffile); time(&boottime); resettime = boottime; @@ -730,17 +744,14 @@ stream_accept(evContext lev, void *uap, int rfd, INSIST_ERR(evRead(lev, rfd, &iov, 1, stream_getlen, sp, &sp->evID_r) != -1); sp->flags |= STREAM_READ_EV; -#ifdef DEBUG - if (debug) - ns_info(ns_log_default, "IP/TCP connection from %s (fd %d)", - sin_ntoa(sp->s_from), rfd); -#endif + ns_debug(ns_log_default, 1, "IP/TCP connection from %s (fd %d)", + sin_ntoa(sp->s_from), rfd); } int tcp_send(struct qinfo *qp) { struct qstream *sp; - int on = 1; + int on = 1, n; ns_debug(ns_log_default, 1, "tcp_send"); if ((sp = sq_add()) == NULL) { @@ -754,10 +765,34 @@ tcp_send(struct qinfo *qp) { sq_remove(sp); return (SERVFAIL); } + if (setsockopt(sp->s_rfd, SOL_SOCKET, SO_REUSEADDR, + (char*)&on, sizeof(on)) < 0) + ns_info(ns_log_default, + "tcp_send: setsockopt(SO_REUSEADDR): %s", + strerror(errno)); +#ifdef SO_REUSEPORT + if (setsockopt(sp->s_rfd, SOL_SOCKET, SO_REUSEPORT, + (char*)&on, sizeof(on)) < 0) + ns_info(ns_log_default, + "tcp_send: setsockopt(SO_REUSEPORT): %s", + strerror(errno)); +#endif + if (bind(sp->s_rfd, (struct sockaddr *)&server_options->query_source, + sizeof server_options->query_source) < 0) + ns_info(ns_log_default, "tcp_send: bind(query_source): %s", + strerror(errno)); if (fcntl(sp->s_rfd, F_SETFD, 1) < 0) { sq_remove(sp); return (SERVFAIL); } + if ((n = fcntl(sp->s_rfd, F_GETFL, 0)) == -1) { + sq_remove(sp); + return (SERVFAIL); + } + if (fcntl(sp->s_rfd, F_SETFL, n|PORT_NONBLOCK) == -1) { + sq_remove(sp); + return (SERVFAIL); + } if (sq_openw(sp, qp->q_msglen + INT16SZ) == -1) { sq_remove(sp); return (SERVFAIL); @@ -768,10 +803,10 @@ tcp_send(struct qinfo *qp) { } if (setsockopt(sp->s_rfd, SOL_SOCKET, SO_KEEPALIVE, - (char*)&on, sizeof(on)) < 0) - ns_info(ns_log_default, - "tcp_send: setsockopt(rfd, SO_KEEPALIVE): %s", - strerror(errno)); + (char*)&on, sizeof(on)) < 0) + ns_info(ns_log_default, + "tcp_send: setsockopt(SO_KEEPALIVE): %s", + strerror(errno)); gettime(&tt); sp->s_size = -1; sp->s_time = tt.tv_sec; /* last transaction time */ @@ -1023,6 +1058,21 @@ datagram_read(evContext lev, void *uap, int fd, int evmask) { } static void +savedg_waitfunc(evContext ctx, void *uap, const void *tag) { + savedg *dg = (savedg *)uap; + + if (!EMPTY(iflist) && HEAD(iflist)->gen == dg->gen) { + u_char buf[PACKETSZ]; + + memcpy(buf, dg->buf, dg->buflen); + dispatch_message(buf, dg->buflen, sizeof buf, NULL, + dg->from, dg->dfd, dg->ifp); + } + memput(dg->buf, dg->buflen); + memput(dg, sizeof *dg); +} + +static void dispatch_message(u_char *msg, int msglen, int buflen, struct qstream *qsp, struct sockaddr_in from, int dfd, interface *ifp) { @@ -1252,6 +1302,7 @@ getnetconf(int periodic_scan) { ns_panic(ns_log_default, 1, "memget(interface)", NULL); memset(ifp, 0, sizeof *ifp); + INIT_LINK(ifp, link); APPEND(iflist, ifp, link); ifp->addr = ina; ifp->port = li->port; @@ -1467,6 +1518,14 @@ opensocket_d(interface *ifp) { /* XXX press on regardless, this is not too serious. */ } #endif +#ifdef SO_BSDCOMPAT + if (setsockopt(ifp->dfd, SOL_SOCKET, SO_BSDCOMPAT, + (char*)&on, sizeof on) < 0) { + ns_info(ns_log_default, + "setsockopt(dfd=%d, SO_BSDCOMPAT): %s", + ifp->dfd, strerror(errno)); + } +#endif if (bind(ifp->dfd, (struct sockaddr *)&nsa, sizeof nsa)) { ns_error(ns_log_default, "bind(dfd=%d, %s): %s", ifp->dfd, sin_ntoa(nsa), strerror(errno)); @@ -1482,6 +1541,75 @@ opensocket_d(interface *ifp) { return (0); } +static int +drain_rcvbuf(evContext ctx, interface *ifp, int fd, int *mread, int *mstore) { + int drop = 0; + + drop = 0; + for (; *mread > 0; (*mread)--) { + union { + HEADER h; + u_char buf[PACKETSZ+1]; + } u; + struct sockaddr_in from; + int from_len = sizeof from; + savedg *dg; + int n; + + n = recvfrom(fd, (char *)u.buf, sizeof u.buf, 0, + (struct sockaddr *)&from, &from_len); + if (n <= 0) + break; /* Socket buffer assumed empty. */ + drop++; /* Pessimistic assumption. */ + if (n > PACKETSZ) + continue; /* Oversize message - EDNS0 needed. */ + if (from.sin_family != AF_INET) + continue; /* Not IPv4 - IPv6 needed. */ + if (u.h.opcode == ns_o_query && u.h.qr == 0) + continue; /* Query - what we're here to axe. */ + if (*mstore <= 0) + continue; /* Reached storage quota, ignore. */ + if ((dg = memget(sizeof *dg)) == NULL) + continue; /* No memory - probably fatal. */ + if ((dg->buf = memget(n)) == NULL) { + memput(dg, sizeof *dg); + continue; /* No memory - probably fatal. */ + } + dg->from = from; + dg->dfd = fd; + dg->ifp = ifp; + dg->gen = ifp->gen; + dg->buflen = n; + memcpy(dg->buf, u.buf, n); + if (evWaitFor(ctx, (void *)drain_all_rcvbuf, savedg_waitfunc, + dg, NULL) < 0) + { + memput(dg->buf, dg->buflen); + memput(dg, sizeof *dg); + continue; /* No memory - probably fatal. */ + } + drop--; /* Pessimism was inappropriate. */ + (*mstore)--; + } + return (drop); +} + +static int +drain_all_rcvbuf(evContext ctx) { + interface *ifp; + int mread = MAX_SYNCDRAIN; + int mstore = MAX_SYNCSTORE; + int drop = 0; + + for (ifp = HEAD(iflist); ifp != NULL; ifp = NEXT(ifp, link)) + if (ifp->dfd != -1) + drop += drain_rcvbuf(ctx, ifp, ifp->dfd, + &mread, &mstore); + if (mstore < MAX_SYNCSTORE) + INSIST_ERR(evDo(ctx, (void *)drain_all_rcvbuf) != -1); + return (drop); +} + /* opensocket_s(ifp) * Open stream (listener) socket bound to interface address. * Returns: @@ -1640,6 +1768,14 @@ opensocket_f() { strerror(errno)); /* XXX press on regardless, this is not too serious. */ } +#ifdef SO_BSDCOMPAT + if (setsockopt(ds, SOL_SOCKET, SO_BSDCOMPAT, + (char *)&on, sizeof on) != 0) { + ns_notice(ns_log_default, "setsockopt(BSDCOMPAT): %s", + strerror(errno)); + /* XXX press on regardless, this is not too serious. */ + } +#endif if (bind(ds, (struct sockaddr *)&server_options->query_source, sizeof server_options->query_source) < 0) ns_panic(ns_log_default, 0, "opensocket_f: bind(%s): %s", @@ -1923,22 +2059,6 @@ sq_write(struct qstream *qs, const u_char *buf, int len) { return (0); } -/* int - * sq_here(sp) - * determine whether stream 'sp' is still on the streamq - * return: - * boolean: is it here? - */ -static int -sq_here(struct qstream *sp) { - struct qstream *t; - - for (t = streamq; t != NULL; t = t->s_next) - if (t == sp) - return (1); - return (0); -} - /* * Initiate query on stream; * mark as referenced and stop selecting for input. @@ -2630,7 +2750,8 @@ init_needs(void) { handlers[main_need_zoneload] = loadxfer; handlers[main_need_dump] = doadump; handlers[main_need_statsdump] = ns_stats; - handlers[main_need_exit] = wild; + handlers[main_need_statsdumpandclear] = ns_stats_dumpandclear; + handlers[main_need_exit] = exit_handler; handlers[main_need_qrylog] = toggle_qrylog; handlers[main_need_debug] = use_desired_debug; handlers[main_need_restart] = ns_restart; @@ -2646,15 +2767,17 @@ handle_needs(void) { block_signals(); for (need = 0; need < main_need_num; need++) if ((needs & (1 << need)) != 0) { - INSIST_ERR(evWaitFor(ev, handle_needs, need_waitfunc, - handlers[need], NULL) != -1); + INSIST_ERR(evWaitFor(ev, (void *)handle_needs, + need_waitfunc, + (void *)handlers[need], + NULL) != -1); queued++; } needs = 0; unblock_signals(); ns_debug(ns_log_default, 15, "handle_needs(): queued %d", queued); if (queued != 0) { - INSIST_ERR(evDo(ev, handle_needs) != -1); + INSIST_ERR(evDo(ev, (void *)handle_needs) != -1); return; } ns_panic(ns_log_default, 1, "ns_handle_needs: queued == 0", NULL); @@ -2663,8 +2786,16 @@ handle_needs(void) { static void need_waitfunc(evContext ctx, void *uap, const void *tag) { handler hand = (handler) uap; + time_t begin; + long syncdelay; + begin = time(NULL); (*hand)(); + syncdelay = time(NULL) - begin; + + if (syncdelay > MAX_SYNCDELAY) + ns_notice(ns_log_default, "drained %d queries (delay %ld sec)", + drain_all_rcvbuf(ctx), syncdelay); } void @@ -2678,8 +2809,11 @@ ns_need(enum need need) { void ns_need_unsafe(enum need need) { needs |= (1 << need); - if (need == main_need_exit) - needs_exit = 1; +} + +static void +exit_handler(void) { + needs_exit = 1; } void diff --git a/contrib/bind/bin/named/ns_maint.c b/contrib/bind/bin/named/ns_maint.c index 952774f..b5ed644 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.105 2000/07/17 07:25:00 vixie Exp $"; +static const char rcsid[] = "$Id: ns_maint.c,v 8.117 2001/01/25 05:50:55 marka Exp $"; #endif /* not lint */ /* @@ -120,14 +120,14 @@ static const char rcsid[] = "$Id: ns_maint.c,v 8.105 2000/07/17 07:25:00 vixie E #include <isc/eventlib.h> #include <isc/logging.h> #include <isc/memcluster.h> - #include <isc/dst.h> +#include <isc/misc.h> #include "port_after.h" #include "named.h" -static int nxfers(struct zoneinfo *, int), +static int nxfers(struct zoneinfo *), bottom_of_zone(struct databuf *, int); static void startxfer(struct zoneinfo *), @@ -135,19 +135,18 @@ static void startxfer(struct zoneinfo *), tryxfer(void), purge_z_2(struct hashbuf *, int); static int purge_nonglue_2(const char *, struct hashbuf *, - int, int); + int, int, int); #ifndef HAVE_SPAWNXFER static pid_t spawnxfer(char **, struct zoneinfo *); #endif -static time_t stats_time; /* Redundant ??? XXX ogud */ - /* State of all running zone transfers */ static struct { - pid_t xfer_pid; - int xfer_state; /* see below */ - WAIT_T xfer_status; + pid_t xfer_pid; + int xfer_state; /* see below */ + WAIT_T xfer_status; + struct in_addr xfer_addr; } xferstatus[MAX_XFERS_RUNNING]; #define XFER_IDLE 0 @@ -642,41 +641,115 @@ qserial_answer(struct qinfo *qp) { /* * Writes TSIG key info for an address to a file, optionally opening it first. + * Returns: + * -1: Error. + * 0: No action taken. + * 1: Tsig info successfully written. */ static int -write_tsig_info(struct in_addr addr, char *name, int *fd, int creat_failed) { +write_tsig_info(struct in_addr addr, char *name, int *fd) { server_info si; DST_KEY *dst_key; int tsig_fd = *fd; char tsig_str[1024], secret_buf64[172]; u_char secret_buf[128]; - int secret_len; + int secret_len, len; si = find_server(addr); if (si == NULL || si->key_list == NULL || si->key_list->first == NULL) return(0); dst_key = si->key_list->first->key; - if (tsig_fd < 0 && creat_failed == 0) { - *fd = tsig_fd = creat(name, S_IRUSR); + if (tsig_fd == -1) { + *fd = tsig_fd = mkstemp(name); if (tsig_fd < 0) { ns_warning(ns_log_default, - "write_tsig_info: creat(%s) for TSIG info failed", + "write_tsig_info: mkstemp(%s) for TSIG info failed", name); return(-1); } (void) fchown(tsig_fd, user_id, group_id); } - if (creat_failed != 0) - return(-1); + memset(secret_buf, 0, sizeof(secret_buf)); secret_len = dst_key_to_buffer(dst_key, secret_buf, sizeof(secret_buf)); - b64_ntop(secret_buf, secret_len, secret_buf64, sizeof(secret_buf64)); + if (secret_len == 0) + return (-1); + len = b64_ntop(secret_buf, secret_len, secret_buf64, + sizeof(secret_buf64)); + if (len == -1) + return (-1); + /* We need snprintf! */ + if (strlen(dst_key->dk_key_name) + len + sizeof("XXX.XXX.XXX.XXX"), + sizeof("123") + 5 > sizeof(tsig_str)) + return (-1); sprintf(tsig_str, "%s\n%s\n%d\n%s\n", inet_ntoa(addr), dst_key->dk_key_name, dst_key->dk_alg, secret_buf64); - write(tsig_fd, tsig_str, strlen(tsig_str)); - return (0); + len = strlen(tsig_str); + if (write(tsig_fd, tsig_str, strlen(tsig_str)) != len) + return (-1); + return (1); +} + +/* + * Returns number of tsigs written or -1. + */ +static int +write_tsigs(struct zoneinfo *zp, char *tsig_name) { + struct in_addr a; + int tsig_ret; + int tsig_fd = -1; + int cnt; + int records = 0; + + for (cnt = 0; cnt < zp->z_xaddrcnt; cnt++) { + a = zp->z_xaddr[cnt]; + if (aIsUs(a) && ns_port == zp->z_port) + continue; + + tsig_ret = write_tsig_info(a, tsig_name, &tsig_fd); + switch (tsig_ret) { + case -1: + goto error; + case 0: + break; + case 1: + records++; + break; + } + } + + if (tsig_fd != -1) + close(tsig_fd); + return (records); + + error: + if (tsig_fd != -1) { + unlink(tsig_name); + close(tsig_fd); + } + return (-1); +} + +#ifdef BIND_IXFR +static int +supports_ixfr(struct zoneinfo *zp) { + int cnt = 0; + for (cnt = 0; cnt < zp->z_xaddrcnt; cnt++) { + struct in_addr a; + server_info si; + + a = zp->z_xaddr[cnt]; + if (aIsUs(a) && ns_port == zp->z_port) + continue; + si = find_server(a); + + if (si != NULL && (si->flags & SERVER_INFO_SUPPORT_IXFR) != 0) + return(1); + } + return(0); } +#endif /* * Start an asynchronous zone transfer for a zone. Depends on current time @@ -693,8 +766,7 @@ startxfer(struct zoneinfo *zp) { char port_str[10]; char class_str[10]; char src_str[20]; - int tsig_fd = -1; - char tsig_name[MAXPATHLEN+1], *s; + char tsig_name[MAXPATHLEN+1]; int tsig_ret = 0; ns_debug(ns_log_default, 1, "startxfer() %s", @@ -706,9 +778,9 @@ startxfer(struct zoneinfo *zp) { argv[argc++] = "-f"; argv[argc++] = zp->z_source; #ifdef BIND_IXFR - if (zp->z_ixfr_tmp) { - argv[argc++] = "-i"; - argv[argc++] = zp->z_ixfr_tmp; + if (supports_ixfr(zp) && zp->z_ixfr_tmp != NULL) { + argv[argc++] = "-i"; + argv[argc++] = zp->z_ixfr_tmp; } #endif if (zp->z_serial != 0) { @@ -731,12 +803,6 @@ startxfer(struct zoneinfo *zp) { argv[argc++] = "-P"; sprintf(port_str, "%d", ntohs(zp->z_port) != 0 ? zp->z_port : ns_port); argv[argc++] = port_str; - argv[argc++] = "-T"; - sprintf(tsig_name, "%s.%d", zp->z_origin, getpid()); - s = tsig_name; - while ((s = strchr(s, '/')) != NULL) - *s = '_'; - argv[argc++] = tsig_name; #ifdef STUBS if (zp->z_type == Z_STUB) argv[argc++] = "-S"; @@ -762,6 +828,22 @@ startxfer(struct zoneinfo *zp) { zp->z_xaddr[zp->z_xaddrcnt] = zp->z_addr[zp->z_xaddrcnt]; } + + /* + * Store TSIG keys if we have them. + */ + strcpy(tsig_name, "tsigs.XXXXXX"); + tsig_ret = write_tsigs(zp, tsig_name); + if (tsig_ret == -1) { + ns_error(ns_log_xfer_in, "unable to write tsig info: '%s'", + zp->z_origin); + return; + } + if (tsig_ret != 0) { + argv[argc++] = "-T"; + argv[argc++] = tsig_name; + } + /* * Copy the server ip addresses into argv, after converting * to ascii and saving the static inet_ntoa result. @@ -790,10 +872,7 @@ startxfer(struct zoneinfo *zp) { argv[argc++] = "axfr"; } #endif - tsig_ret = write_tsig_info(a, tsig_name, &tsig_fd, tsig_ret); } - if (tsig_fd > 0) - close(tsig_fd); argv[argc] = NULL; @@ -830,7 +909,6 @@ startxfer(struct zoneinfo *zp) { ns_warning(ns_log_default, "startxfer: too many xfers running"); zp->z_time = tt.tv_sec + 10; - (void)nxfers(zp, -1); return; } @@ -842,6 +920,7 @@ startxfer(struct zoneinfo *zp) { xferstatus[i].xfer_state = XFER_RUNNING; xferstatus[i].xfer_pid = pid; /* XXX - small race condition here if we * can't hold signals */ + xferstatus[i].xfer_addr = zp->z_xaddr[0]; ns_debug(ns_log_default, 1, "started xfer child %d", pid); zp->z_flags &= ~Z_NEED_XFER; zp->z_flags |= Z_XFER_RUNNING; @@ -1102,11 +1181,12 @@ remove_zone(struct zoneinfo *zp, const char *verb) { memset(zp, 0, sizeof(*zp)); zp->z_type = z_nil; /* Pedantic; memset() did it. */ INIT_LINK(zp, z_reloadlink); + INIT_LINK(zp, z_freelink); free_zone(zp); } int -purge_nonglue(const char *dname, struct hashbuf *htp, int class) { +purge_nonglue(const char *dname, struct hashbuf *htp, int class, int log) { const char *fname; struct namebuf *np; struct hashbuf *phtp = htp; @@ -1127,7 +1207,7 @@ purge_nonglue(const char *dname, struct hashbuf *htp, int class) { h = htp; else h = np->n_hash; - errs += purge_nonglue_2(dname, h, class, 0); + errs += purge_nonglue_2(dname, h, class, 0, log); if (h->h_cnt == 0 && !root_zone) { rm_hash(np->n_hash); np->n_hash = NULL; @@ -1157,7 +1237,7 @@ valid_glue(struct databuf *dp, char *name, int belowcut) { /* NOKEY is in parent zone otherwise child zone */ if (dp->d_type == T_KEY && dp->d_size == 4 && - (dp->d_data[0] & 0xc6) == 0xc2) + (dp->d_data[0] & 0xc3) == 0xc1) return (1); /* NXT & KEY records may be signed */ @@ -1169,7 +1249,7 @@ valid_glue(struct databuf *dp, char *name, int belowcut) { static int purge_nonglue_2(const char *dname, struct hashbuf *htp, int class, - int belowcut) + int belowcut, int log) { struct databuf *dp, *pdp; struct namebuf *np, *pnp, *npn; @@ -1197,7 +1277,8 @@ purge_nonglue_2(const char *dname, struct hashbuf *htp, int class, if (dp->d_class == class && zonecut && !valid_glue(dp, name, belowcut)) { - ns_error(ns_log_db, + if (log) + ns_error(ns_log_db, "zone: %s/%s: non-glue record %s bottom of zone: %s/%s", *dname ? dname : ".", p_class(dp->d_class), @@ -1207,7 +1288,8 @@ purge_nonglue_2(const char *dname, struct hashbuf *htp, int class, p_type(dp->d_type)); dp = rm_datum(dp, np, pdp, NULL); - errs++; + if (log) + errs++; } else { pdp = dp; dp = dp->d_next; @@ -1222,7 +1304,8 @@ purge_nonglue_2(const char *dname, struct hashbuf *htp, int class, np->n_hash, class, zonecut || - belowcut); + belowcut, + log); /* if now empty, free it */ if (np->n_hash->h_cnt == 0) { @@ -1356,11 +1439,13 @@ bottom_of_zone(struct databuf *dp, int class) { /* * Handle XFER limit for a nameserver. */ + + static int -nxfers(struct zoneinfo *zp, int delta) { +nxfers(struct zoneinfo *zp) { struct in_addr nsa; - struct nameser *nsp; int ret; + int i; if (zp->z_xaddrcnt != 0) nsa = zp->z_xaddr[0]; /* first ns holds zone's xfer limit */ @@ -1368,15 +1453,12 @@ nxfers(struct zoneinfo *zp, int delta) { nsa = zp->z_addr[0]; /* first ns holds zone's xfer limit */ else return (-1); - - if (!(nsp = nameserFind(nsa, NS_F_INSERT))) - return (-1); /* probably ENOMEM */ - - ret = nsp->xfers; - if (delta < 0 && -delta > ret) - return (-1); /* taking more than we have */ - - nsp->xfers += delta; + + ret = 0; + for (i = 0; i < MAX_XFERS_RUNNING; i++) + if (xferstatus[i].xfer_status == XFER_RUNNING && + xferstatus[i].xfer_addr.s_addr == nsa.s_addr) + ret++; return (ret); } @@ -1413,7 +1495,6 @@ pid %lu - forgetting, processes may accumulate", zp->z_xferpid = 0; xfers_running--; - (void)nxfers(zp, -1); zp->z_flags &= ~(Z_XFER_RUNNING|Z_XFER_ABORTED|Z_XFER_GONE); } else if (kill(zp->z_xferpid, SIGTERM) == -1) { if (errno == ESRCH) @@ -1479,7 +1560,6 @@ endxfer() { if (zp->z_xferpid != pid) continue; xfers_running--; - (void) nxfers(zp, -1); zp->z_xferpid = 0; zp->z_flags &= ~(Z_XFER_RUNNING|Z_XFER_ABORTED|Z_XFER_GONE); @@ -1509,7 +1589,9 @@ endxfer() { if (exitstatus == XFER_SUCCESSAXFRIXFRFILE) { zp->z_xferpid = XFER_ISAXFRIXFR; } - movefile(zp->z_ixfr_tmp, zp->z_source); + if (zp->z_ixfr_tmp != NULL) + isc_movefile(zp->z_ixfr_tmp, + zp->z_source); /* XXX should incorporate loadxfer() */ zp->z_flags |= Z_NEED_RELOAD; zp->z_flags &= ~Z_SYSLOGGED; @@ -1529,19 +1611,24 @@ endxfer() { (void)unlink(zp->z_updatelog); (void)unlink(zp->z_ixfr_base); - movefile(zp->z_ixfr_tmp, - zp->z_ixfr_base); + isc_movefile(zp->z_ixfr_tmp, + zp->z_ixfr_base); (void)unlink(zp->z_ixfr_tmp); if (zonedump(zp, ISIXFR) < 0) ns_warning(ns_log_db, "error in write ixfr updates to zone file %s", zp ->z_source); - } else + ns_refreshtime(zp, tt.tv_sec); + sched_zone_maint(zp); + } else { ns_notice(ns_log_default, "IXFR Merge failed %s", zp->z_ixfr_tmp); zp->z_flags &= ~(Z_XFER_RUNNING|Z_XFER_ABORTED|Z_XFER_GONE); + ns_retrytime(zp, tt.tv_sec); + sched_zone_maint(zp); + } break; case XFER_TIMEOUT: @@ -1622,10 +1709,9 @@ tryxfer() { xfers_running >= server_options->transfers_in) break; - if ((xfers = nxfers(zp, 0)) != -1 && + if ((xfers = nxfers(zp)) != -1 && xfers < server_options->transfers_per_ns && (zp->z_flags & Z_NEED_XFER)) { - nxfers(zp, 1); xfers_deferred--; startxfer(zp); sched_zone_maint(zp); @@ -1827,7 +1913,7 @@ ns_reload(void) { qflush(); sq_flush(NULL); reloading++; /* To force transfer if secondary and backing up. */ - ns_init(conffile); + confmtime = ns_init(conffile); time(&resettime); reloading--; ns_notice(ns_log_default, "Ready to answer queries."); @@ -1875,6 +1961,7 @@ make_new_zones(void) { block_signals(); for (n = 0; n < NEWZONES; n++) { INIT_LINK(&zones[nzones], z_reloadlink); + INIT_LINK(&zones[nzones], z_freelink); if (nzones != 0) free_zone(&zones[nzones]); nzones++; @@ -1906,7 +1993,6 @@ spawnxfer(char **argv, struct zoneinfo *zp) { execv(server_options->named_xfer, argv); ns_error(ns_log_default, "can't exec %s: %s", server_options->named_xfer, strerror(errno)); - (void)nxfers(zp, -1); _exit(XFER_FAIL); /* Avoid duplicate buffer flushes. */ } return (pid); diff --git a/contrib/bind/bin/named/ns_notify.c b/contrib/bind/bin/named/ns_notify.c index 0cf1e0a..4523422 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.10 2000/04/21 06:54:09 vixie Exp $"; +static const char rcsid[] = "$Id: ns_notify.c,v 8.12 2000/12/23 08:14:40 vixie Exp $"; #endif /* not lint */ /* @@ -129,6 +129,7 @@ ns_notify(const char *dname, ns_class class, ns_type type) { } ni->class = class; ni->type = type; + INIT_LINK(ni, link); evInitID(&ni->timer); if (loading != 0) { @@ -215,7 +216,7 @@ ns_stopnotify(const char *dname, ns_class class) { */ static void sysnotify(const char *dname, ns_class class, ns_type type) { - const char *zname, *fname; + const char *zname; u_int32_t zserial; int nns, na, i; struct zoneinfo *zp; diff --git a/contrib/bind/bin/named/ns_parser.y b/contrib/bind/bin/named/ns_parser.y index c987e2b..680a586 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.55 2000/04/23 02:18:59 vixie Exp $"; +static char rcsid[] = "$Id: ns_parser.y,v 8.63 2000/12/23 08:14:41 vixie Exp $"; #endif /* not lint */ /* @@ -25,6 +25,7 @@ static char rcsid[] = "$Id: ns_parser.y,v 8.55 2000/04/23 02:18:59 vixie Exp $"; #include "port_before.h" #include <sys/types.h> +#include <sys/stat.h> #include <sys/socket.h> #include <sys/un.h> @@ -70,10 +71,10 @@ static int should_install; static options current_options; static int seen_options; +static int logged_options_error; static controls current_controls; -static topology_config current_topology; static int seen_topology; static server_config current_server; @@ -131,6 +132,7 @@ int yyparse(); %token T_DIRECTORY T_PIDFILE T_NAMED_XFER %token T_DUMP_FILE T_STATS_FILE T_MEMSTATS_FILE %token T_FAKE_IQUERY T_RECURSION T_FETCH_GLUE +%token T_HITCOUNT %token T_QUERY_SOURCE T_LISTEN_ON T_PORT T_ADDRESS %token T_RRSET_ORDER T_ORDER T_NAME T_CLASS %token T_CONTROLS T_INET T_UNIX T_PERM T_OWNER T_GROUP T_ALLOW @@ -142,7 +144,7 @@ int yyparse(); %token T_DATASIZE T_STACKSIZE T_CORESIZE %token T_DEFAULT T_UNLIMITED %token T_FILES T_VERSION -%token T_HOSTSTATS T_DEALLOC_ON_EXIT +%token T_HOSTSTATS T_HOSTSTATSMAX T_DEALLOC_ON_EXIT %token T_TRANSFERS_IN T_TRANSFERS_OUT T_TRANSFERS_PER_NS %token T_TRANSFER_FORMAT T_MAX_TRANSFER_TIME_IN %token T_SERIAL_QUERIES T_ONE_ANSWER T_MANY_ANSWERS @@ -349,6 +351,11 @@ option: /* Empty */ set_global_boolean_option(current_options, OPTION_NOFETCHGLUE, !$2); } + | T_HITCOUNT yea_or_nay + { + set_global_boolean_option(current_options, + OPTION_HITCOUNT, $2); + } | T_NOTIFY yea_or_nay { set_global_boolean_option(current_options, @@ -529,7 +536,11 @@ option: /* Empty */ { current_options->stats_interval = $2 * 60; } - | T_MAX_LOG_SIZE_IXFR L_NUMBER + | T_HOSTSTATSMAX L_NUMBER + { + current_options->max_host_stats = $2; + } + | T_MAX_LOG_SIZE_IXFR size_spec { current_options->max_log_size_ixfr = $2; } @@ -1124,7 +1135,6 @@ channel_name: any_string channel: channel_name { log_channel channel; - symbol_value value; if (current_category >= 0) { channel = lookup_channel($1); @@ -1461,9 +1471,11 @@ zone_stmt: T_ZONE L_QSTRING optional_class symbol_value value; char *zone_name; - if (!seen_options) + if (!seen_options && !logged_options_error) { parser_error(0, "no options statement before first zone; using previous/default"); + logged_options_error = 1; + } sym_type = SYM_ZONE | ($3 & 0xffff); value.pointer = NULL; zone_name = canonical_name($2); @@ -1555,17 +1567,17 @@ zone_option: T_TYPE zone_type "zone filename already set; skipping"); } | T_FILE_IXFR L_QSTRING - { - if (!set_zone_ixfr_file(current_zone, $2)) - parser_warning(0, - "zone ixfr data base already set; skipping"); - } + { + if (!set_zone_ixfr_file(current_zone, $2)) + parser_warning(0, + "zone ixfr data base already set; skipping"); + } | T_IXFR_TMP L_QSTRING - { - if (!set_zone_ixfr_tmp(current_zone, $2)) - parser_warning(0, - "zone ixfr temp filename already set; skipping"); - } + { + if (!set_zone_ixfr_tmp(current_zone, $2)) + parser_warning(0, + "zone ixfr temp filename already set; skipping"); + } | T_MASTERS maybe_zero_port '{' master_in_addr_list '}' { set_zone_master_port(current_zone, $2); @@ -1615,7 +1627,7 @@ zone_option: T_TYPE zone_type parser_warning(0, "zone max transfer time (in) already set; skipping"); } - | T_MAX_LOG_SIZE_IXFR L_NUMBER + | T_MAX_LOG_SIZE_IXFR size_spec { set_zone_max_log_size_ixfr(current_zone, $2); } @@ -1872,6 +1884,7 @@ define_builtin_channels() { static void parser_setup() { seen_options = 0; + logged_options_error = 0; seen_topology = 0; symtab = new_symbol_table(SYMBOL_TABLE_SIZE, NULL); if (authtab != NULL) @@ -1941,13 +1954,16 @@ define_key(char *name, struct dst_key *dst_key) { dprint_key_info(dst_key); } -void +time_t parse_configuration(const char *filename) { FILE *config_stream; + struct stat sb; config_stream = fopen(filename, "r"); if (config_stream == NULL) ns_panic(ns_log_parser, 0, "can't open '%s'", filename); + if (fstat(fileno(config_stream), &sb) == -1) + ns_panic(ns_log_parser, 0, "can't stat '%s'", filename); lexer_setup(); parser_setup(); @@ -1955,6 +1971,7 @@ parse_configuration(const char *filename) { (void)yyparse(); lexer_end_file(); parser_cleanup(); + return (sb.st_mtime); } void diff --git a/contrib/bind/bin/named/ns_req.c b/contrib/bind/bin/named/ns_req.c index 75d688f..f103ad6 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.119 2000/08/21 05:57:09 vixie Exp $"; +static const char rcsid[] = "$Id: ns_req.c,v 8.129 2001/01/08 23:46:41 marka Exp $"; #endif /* not lint */ /* @@ -174,11 +174,14 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, HEADER *hp = (HEADER *) msg; u_char *cp, *eom; enum req_action action; - int n, ra, has_tsig, msglen_orig, tsig_size, siglen, sig2len; + int n, ra, has_tsig, tsig_size, sig2len; u_char *tsigstart; u_char sig[TSIG_SIG_SIZE], sig2[TSIG_SIG_SIZE]; struct tsig_record *in_tsig = NULL; int error = NOERROR; + int msglen_orig = msglen; + int buflen_orig = buflen; + int siglen = sizeof sig; DST_KEY *key; time_t tsig_time; @@ -188,8 +191,6 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, fp_nquery(msg, msglen, log_get_stream(packet_channel)); } #endif - msglen_orig = msglen; - siglen = sizeof(sig); tsigstart = ns_find_tsig(msg, msg + msglen); if (tsigstart == NULL) @@ -198,7 +199,7 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, char buf[MAXDNAME]; has_tsig = 1; - n = dn_expand(msg, msg + msglen, tsigstart, buf, sizeof(buf)); + n = dn_expand(msg, msg + msglen, tsigstart, buf, sizeof buf); if (n < 0) { ns_debug(ns_log_default, 1, "ns_req: bad TSIG key name", @@ -374,24 +375,31 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, * a TSIG error, build a new message with no data and a TSIG. */ if ((hp->tc || error != NOERROR) && has_tsig > 0) { + sign_again: hp->ancount = htons(0); hp->nscount = htons(0); hp->arcount = htons(0); cp = msg + HFIXEDSZ; cp += ns_skiprr(cp, msg + msglen, ns_s_qd, ntohs(hp->qdcount)); - sig2len = sizeof(sig2); - buflen += (msglen - (cp - msg)); + 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); - if (n != 0) { - INSIST(0); + if (n == NS_TSIG_ERROR_NO_SPACE && ntohs(hp->qdcount) != 0) { + hp->qdcount = htons(0); + goto sign_again; } + if (n != 0) + ns_info(ns_log_default, + "ns_req: unable to sign response"); cp = msg + msglen; - } /* Either the message is not truncated or there was no TSIG */ else { + /* + * Reserve space for tsig if required. + */ if (has_tsig > 0) buflen -= tsig_size; n = doaddinfo(hp, cp, buflen); @@ -399,7 +407,7 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, buflen -= n; if (has_tsig > 0) { buflen += tsig_size; - sig2len = sizeof(sig2); + sig2len = sizeof sig2; msglen = cp - msg; n = ns_sign(msg, &msglen, msglen + buflen, error, key, sig, siglen, sig2, &sig2len, tsig_time); @@ -417,12 +425,12 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp, ntohs(hp->id), cp - msg, hp->rcode); if (debug >= 10) res_pquery(&res, msg, cp - msg, - log_get_stream(packet_channel)); + log_get_stream(packet_channel)); #endif /*DEBUG*/ if (qsp == NULL) { if (sendto(dfd, (char*)msg, cp - msg, 0, (struct sockaddr *)&from, - sizeof(from)) < 0) { + sizeof from) < 0) { if (!haveComplained(ina_ulong(from.sin_addr), (u_long)sendtoStr)) ns_info(ns_log_default, @@ -460,7 +468,7 @@ static enum req_action req_notify(HEADER *hp, u_char **cpp, u_char *eom, u_char *msg, struct sockaddr_in from) { - int n, type, class, zn; + int n, type, class; char dnbuf[MAXDNAME]; struct zoneinfo *zp; @@ -769,11 +777,6 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp, np == NULL ? "missed" : "found", dname, fname, cname); - - ns_debug(ns_log_default, 1, "req: %s '%s' as '%s' (cname=%d)", - np == NULL ? "missed" : "found", - dname, fname, cname); - #ifdef YPKLUDGE /* Some braindamaged resolver software will not recognize internet addresses in dot notation and @@ -950,6 +953,10 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp, p_type(type), sin_ntoa(from), *dname ? dname : "."); nameserIncr(from.sin_addr, nssRcvdUXFR); + if (type == ns_t_ixfr) { + hp->rcode = ns_r_refused; + return (Finish); + } return (Refuse); } @@ -961,6 +968,10 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp, p_type(type), sin_ntoa(from), *dname ? dname : "."); nameserIncr(from.sin_addr, nssRcvdUXFR); + if (type == ns_t_ixfr) { + hp->rcode = ns_r_refused; + return (Finish); + } return (Refuse); } @@ -972,6 +983,10 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp, p_type(type), sin_ntoa(from), *dname ? dname : "."); nameserIncr(from.sin_addr, nssRcvdUXFR); + if (type == ns_t_ixfr) { + hp->rcode = ns_r_refused; + return (Finish); + } return (Refuse); } @@ -983,6 +998,10 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp, p_type(type), sin_ntoa(from), *dname ? dname : "."); nameserIncr(from.sin_addr, nssRcvdUXFR); + if (type == ns_t_ixfr) { + hp->rcode = ns_r_refused; + return (Finish); + } return (Refuse); } @@ -1389,15 +1408,20 @@ static enum req_action req_iquery(HEADER *hp, u_char **cpp, u_char *eom, int *buflenp, u_char *msg, struct sockaddr_in from) { - int dlen, alen, n, type, class, count; - char dnbuf[MAXDNAME], anbuf[PACKETSZ], *data, *fname; + u_int rdata_offset; + size_t alen; + int dlen, n; + ns_type type; + ns_class class; + u_char anbuf[PACKETSZ], *anptr; + char dnbuf[MAXDNAME]; nameserIncr(from.sin_addr, nssRcvdIQ); - if (ntohs(hp->ancount) != 1 - || ntohs(hp->qdcount) != 0 - || ntohs(hp->nscount) != 0 - || ntohs(hp->arcount) != 0) { + if (ntohs(hp->ancount) != 1 || + ntohs(hp->qdcount) != 0 || + ntohs(hp->nscount) != 0 || + ntohs(hp->arcount) != 0) { ns_debug(ns_log_default, 1, "FORMERR IQuery header counts wrong"); hp->rcode = ns_r_formerr; @@ -1407,7 +1431,9 @@ req_iquery(HEADER *hp, u_char **cpp, u_char *eom, int *buflenp, /* * Skip domain name, get class, and type. */ - if ((n = dn_skipname(*cpp, eom)) < 0) { + anptr = *cpp; + n = dn_skipname(*cpp, eom); + if (n < 0) { ns_debug(ns_log_default, 1, "FORMERR IQuery packet name problem"); hp->rcode = ns_r_formerr; @@ -1430,43 +1456,41 @@ req_iquery(HEADER *hp, u_char **cpp, u_char *eom, int *buflenp, hp->rcode = ns_r_formerr; return (Finish); } + rdata_offset = *cpp - anptr; *cpp += dlen; + INSIST(*cpp == eom); /* - * not all inverse queries are handled. + * Not all inverse queries are handled. */ - switch (type) { - case T_A: - if (!NS_OPTION_P(OPTION_FAKE_IQUERY) || dlen != INT32SZ) { - if (dlen != INT32SZ) - ns_warning(ns_log_security, - "bad iquery from %s", - inet_ntoa(from.sin_addr)); - return (Refuse); - } - break; - default: + if (type != ns_t_a) { ns_warning(ns_log_security, "unsupported iquery type from %s", inet_ntoa(from.sin_addr)); return (Refuse); } + if (dlen != INT32SZ) { + ns_warning(ns_log_security, + "bad iquery from %s", + inet_ntoa(from.sin_addr)); + return (Refuse); + } + if (!NS_OPTION_P(OPTION_FAKE_IQUERY)) + return (Refuse); + ns_debug(ns_log_default, 1, "req: IQuery class %d type %d", class, type); - fname = (char *)msg + HFIXEDSZ; - alen = (char *)*cpp - fname; - if ((size_t)alen > sizeof anbuf) { + alen = eom - anptr; + if (alen > sizeof anbuf) { ns_warning(ns_log_security, "bad iquery from %s", inet_ntoa(from.sin_addr)); return (Refuse); } - memcpy(anbuf, fname, alen); - data = anbuf + alen - dlen; - *cpp = (u_char *)fname; + memcpy(anbuf, anptr, alen); + *cpp = anptr; *buflenp -= HFIXEDSZ; - count = 0; #ifdef QRYLOG if (qrylog) { @@ -1474,7 +1498,7 @@ req_iquery(HEADER *hp, u_char **cpp, u_char *eom, int *buflenp, strcpy(tmp, inet_ntoa(from.sin_addr)); ns_info(ns_log_queries, "XX /%s/%s/-%s", - tmp, inet_ntoa(ina_get((u_char *)data)), + tmp, inet_ntoa(ina_get(&anbuf[rdata_offset])), p_type(type)); } #endif /*QRYLOG*/ @@ -1487,7 +1511,7 @@ req_iquery(HEADER *hp, u_char **cpp, u_char *eom, int *buflenp, * A better strategy would be to turn this into a PTR query, but that * would legitimize inverse queries in a way they do not deserve. */ - sprintf(dnbuf, "[%s]", inet_ntoa(ina_get((u_char *)data))); + sprintf(dnbuf, "[%s]", inet_ntoa(ina_get(&anbuf[rdata_offset]))); *buflenp -= QFIXEDSZ; n = dn_comp(dnbuf, *cpp, *buflenp, NULL, NULL); if (n < 0) { @@ -1495,19 +1519,20 @@ req_iquery(HEADER *hp, u_char **cpp, u_char *eom, int *buflenp, return (Finish); } *cpp += n; + *buflenp -= n; PUTSHORT((u_int16_t)type, *cpp); + *buflenp -= INT16SZ; PUTSHORT((u_int16_t)class, *cpp); - *buflenp -= n; - count++; + *buflenp -= INT16SZ; - ns_debug(ns_log_default, 1, "req: IQuery %d records", count); - hp->qdcount = htons((u_int16_t)count); + hp->qdcount = htons(1); if (alen > *buflenp) { hp->tc = 1; return (Finish); } memcpy(*cpp, anbuf, alen); *cpp += alen; + *buflenp -= alen; return (Finish); } @@ -1540,7 +1565,7 @@ stale(struct databuf *dp) { if ((int32_t)(tt.tv_sec - zp->z_lastupdate) > (int32_t)zp->z_expire) { ns_debug(ns_log_default, 1, - "stale: secondary zone %s expired", + "stale: slave zone %s expired", zp->z_origin); if (!haveComplained((u_long)zp, (u_long)stale)) { ns_notice(ns_log_default, @@ -1775,7 +1800,7 @@ make_rr(const char *name, struct databuf *dp, u_char *buf, /* Replacement */ ns_debug(ns_log_default, 1, "Replacement = %s", cp1); - n = dn_comp((char *)cp1, cp, buflen, comp_ptrs, edp); + n = dn_comp((char *)cp1, cp, buflen, NULL, NULL); ns_debug(ns_log_default, 1, "dn_comp's n = %u", n); if (n < 0) goto cleanup; diff --git a/contrib/bind/bin/named/ns_resp.c b/contrib/bind/bin/named/ns_resp.c index 36e3626..2a56e11 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.144 2000/07/11 08:26:09 vixie Exp $"; +static const char rcsid[] = "$Id: ns_resp.c,v 8.149 2001/01/03 09:47:27 marka Exp $"; #endif /* not lint */ /* @@ -201,6 +201,8 @@ learntFrom(struct qinfo *qp, struct sockaddr_in *server) { char *a, *ns, *na; struct databuf *db; int i; + char nsbuf[20]; + char abuf[20]; a = ns = na = "<Not Available>"; @@ -209,34 +211,22 @@ learntFrom(struct qinfo *qp, struct sockaddr_in *server) { server->sin_addr)) { db = qp->q_addr[i].ns; if (db != NULL) { - if (NS_OPTION_P(OPTION_HOSTSTATS)) { - char nsbuf[20]; - - if (db->d_ns != NULL) { - strcpy(nsbuf, - inet_ntoa(db->d_ns->addr)); - ns = nsbuf; - } else { - ns = zones[db->d_zone] - .z_origin; - } + if (db->d_addr.s_addr != htonl(0)) { + strcpy(nsbuf, inet_ntoa(db->d_addr)); + ns = nsbuf; + } else { + ns = zones[db->d_zone].z_origin; } if (db->d_rcode == 0) na = (char*)qp->q_addr[i].ns->d_data; } - - if (NS_OPTION_P(OPTION_HOSTSTATS)) { - char abuf[20]; - - db = qp->q_addr[i].nsdata; - if (db != NULL) { - if (db->d_ns != NULL) { - strcpy(abuf, - inet_ntoa(db->d_ns->addr)); - a = abuf; - } else { - a = zones[db->d_zone].z_origin; - } + db = qp->q_addr[i].nsdata; + if (db != NULL) { + if (db->d_addr.s_addr != htonl(0)) { + strcpy(abuf, inet_ntoa(db->d_addr)); + a = abuf; + } else { + a = zones[db->d_zone].z_origin; } } break; @@ -467,7 +457,6 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp) if (ina_equal(fwd->fwddata->fwdaddr.sin_addr, from.sin_addr)) break; /* - /* * find the qinfo pointer and update * the rtt and fact that we have called on this server before. */ @@ -714,7 +703,7 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp) #ifdef DEBUG if (debug > 0) res_pquery(&res, msg, msglen, - log_get_stream(packet_channel)); + log_get_stream(packet_channel)); #endif /* * Since there is no answer section (ancount == 0), @@ -1096,6 +1085,10 @@ tcp_retry: : DB_C_ADDITIONAL; } } +#ifdef HITCOUNTS + ++dp->d_hitcnt; + ++db_total_hits; +#endif /* HITCOUNTS */ rrsetadd(flushset, name, dp); } free_related_additional(); @@ -1498,7 +1491,7 @@ tcp_retry: #ifdef DEBUG if (debug >= 10) res_pquery(&res, qp->q_msg, qp->q_msglen, - log_get_stream(packet_channel)); + log_get_stream(packet_channel)); #endif key = tsig_key_from_addr(nsa->sin_addr); if (key != NULL) { @@ -1535,7 +1528,7 @@ tcp_retry: if (!haveComplained(ina_ulong(nsa->sin_addr), (u_long)tcpsendStr)) ns_info(ns_log_default, - "ns_forw: tcp_send(%s) failed: %s", + "ns_resp: tcp_send(%s) failed: %s", sin_ntoa(*nsa), strerror(errno)); } } else if (sendto(ds, (char*)qp->q_msg, qp->q_msglen, 0, @@ -2474,7 +2467,7 @@ sysquery(const char *dname, int class, int type, #ifdef DEBUG if (debug >= 10) res_pquery(&res, qp->q_msg, qp->q_msglen, - log_get_stream(packet_channel)); + log_get_stream(packet_channel)); #endif key = tsig_key_from_addr(nsa->sin_addr); @@ -2927,6 +2920,10 @@ finddata(struct namebuf *np, int class, int type, goto done; } } +#ifdef HITCOUNTS + ++dp->d_hitcnt; + ++db_total_hits; +#endif /* HITCOUNTS */ /* Don't put anything but key or sig RR's in response to requests for key or sig */ @@ -3021,7 +3018,8 @@ finddata(struct namebuf *np, int class, int type, order = match_order(np, class, foundcname ? T_CNAME : type); - /* shuffle the SIG records down to the bottom of the array + /* + * shuffle the SIG records down to the bottom of the array * as we need to make sure they get packed last, no matter * what the ordering is. We're sure to maintain the * original ordering within the two sets of records (so @@ -3037,10 +3035,11 @@ finddata(struct namebuf *np, int class, int type, sig_count = found_count - jdx; first_sig = jdx ; - /* now shift the SIG records down to the end of the array + /* + * now shift the SIG records down to the end of the array * and copy in the non-SIG records */ - for (i = idx = found_count - 1 ; idx >= 0 ; idx--) { + for (i = idx = found_count - 1 ; i >= 0 ; idx--) { if (i < non_sig_count) { found[i] = tmpfound[i]; i--; diff --git a/contrib/bind/bin/named/ns_stats.c b/contrib/bind/bin/named/ns_stats.c index f04790b..b823462 100644 --- a/contrib/bind/bin/named/ns_stats.c +++ b/contrib/bind/bin/named/ns_stats.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static const char sccsid[] = "@(#)ns_stats.c 4.10 (Berkeley) 6/27/90"; -static const char rcsid[] = "$Id: ns_stats.c,v 8.30 2000/04/23 02:18:59 vixie Exp $"; +static const char rcsid[] = "$Id: ns_stats.c,v 8.32 2000/11/29 06:56:05 marka Exp $"; #endif /* not lint */ /* @@ -108,6 +108,27 @@ static const char rcsid[] = "$Id: ns_stats.c,v 8.30 2000/04/23 02:18:59 vixie Ex static u_long typestats[T_ANY+1]; static void nameserStats(FILE *); +static u_int32_t ns_stats_cnt = 0; +static int ns_stats_disabled = 0; + +void +ns_stats_dumpandclear() { + time_t timenow = time(NULL); + FILE *f; + + ns_stats(); + if (!(f = fopen(server_options->stats_filename, "a"))) { + ns_notice(ns_log_statistics, "cannot open stat file, \"%s\"", + server_options->stats_filename); + } + if (f != NULL) { + (void) fchown(fileno(f), user_id, group_id); + fprintf(f, "+++ Host Statistics Cleared +++ (%ld) %s", + (long)timenow, checked_ctime(&timenow)); + (void) my_fclose(f); + } + ns_freestats(); +} void ns_stats() { @@ -246,12 +267,23 @@ nameserFind(addr, flags) if (!nameserInit) { tree_init(&nameserTree); nameserInit++; + ns_stats_cnt = 0; + ns_stats_disabled = 0; } dummy.addr = addr; ns = (struct nameser *)tree_srch(&nameserTree, nameserCompar, (tree_t)&dummy); if (ns == NULL && (flags & NS_F_INSERT) != 0) { + if (server_options->max_host_stats != 0 && + ns_stats_cnt > server_options->max_host_stats) { + if (!ns_stats_disabled) + ns_notice(ns_log_statistics, + "ns_stats_disabled: %s reached", + "host-statistics-max"); + ns_stats_disabled = 1; + return (NULL); + } ns = (struct nameser *)memget(sizeof(struct nameser)); if (ns == NULL) { nomem: if (!haveComplained((u_long)nameserFind, 0)) @@ -268,6 +300,7 @@ nameserFind(addr, flags) errno = save; goto nomem; } + ns_stats_cnt++; } return (ns); } @@ -324,8 +357,11 @@ nameserStats(f) nameserStatsHdr(f); fprintf(f, "(Global)\n"); nameserStatsOut(f, globalStats); - if (NS_OPTION_P(OPTION_HOSTSTATS)) + if (NS_OPTION_P(OPTION_HOSTSTATS)) { tree_trav(&nameserTree, nameserStatsTravUAR); + if (ns_stats_disabled) + fprintf(f, "++ Host Statistics Incomplete ++\n"); + } fprintf(f, "-- Name Server Statistics --\n"); nameserStatsFile = NULL; } @@ -335,7 +371,7 @@ ns_logstats(evContext ctx, void *uap, struct timespec due, struct timespec inter) { char buffer[1024]; - char buffer2[32], header[64]; + char buffer2[32], header[128]; time_t timenow = time(NULL); int i; #ifdef HAVE_GETRUSAGE @@ -348,11 +384,18 @@ ns_logstats(evContext ctx, void *uap, struct timespec due, getrusage(RUSAGE_SELF, &usage); getrusage(RUSAGE_CHILDREN, &childu); - sprintf(buffer, "CPU=%gu/%gs CHILDCPU=%gu/%gs", - tv_float(usage.ru_utime), tv_float(usage.ru_stime), - tv_float(childu.ru_utime), tv_float(childu.ru_stime)); - ns_info(ns_log_statistics, "USAGE %lu %lu %s", (u_long)timenow, - (u_long)boottime, buffer); + /* + * Get around a stupid compiler bug in gcc on solaris. + * There is a problem if three or more doubles are passed to + * sprintf. + * <http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=337&database=gcc> + */ + sprintf(buffer, "CPU=%gu/%gs CHILDCPU=", tv_float(usage.ru_utime), + tv_float(usage.ru_stime)); + sprintf(header, "%gu/%gs", tv_float(childu.ru_utime), + tv_float(childu.ru_stime)); + ns_info(ns_log_statistics, "USAGE %lu %lu %s%s", (u_long)timenow, + (u_long)boottime, buffer, header); # undef tv_float #endif /*HAVE_GETRUSAGE*/ @@ -399,4 +442,6 @@ ns_freestats(void) { return; tree_mung(&nameserTree, nameserFree); nameserInit = 0; + ns_stats_cnt = 0; + ns_stats_disabled = 0; } diff --git a/contrib/bind/bin/named/ns_update.c b/contrib/bind/bin/named/ns_update.c index da0c5a9..e20d258 100644 --- a/contrib/bind/bin/named/ns_update.c +++ b/contrib/bind/bin/named/ns_update.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ns_update.c,v 8.81 2000/07/11 09:25:14 vixie Exp $"; +static const char rcsid[] = "$Id: ns_update.c,v 8.89 2001/01/14 09:46:20 marka Exp $"; #endif /* not lint */ /* @@ -73,15 +73,13 @@ static const char rcsid[] = "$Id: ns_update.c,v 8.81 2000/07/11 09:25:14 vixie E #include <isc/eventlib.h> #include <isc/logging.h> #include <isc/memcluster.h> - #include <isc/dst.h> +#include <isc/misc.h> #include "port_after.h" #include "named.h" -static ns_updque curupd; - #define WRITEABLE_MASK (S_IWUSR | S_IWGRP | S_IWOTH) /* XXXRTH almost all funcs. in here should be static! @@ -273,7 +271,6 @@ printupdatelog(struct sockaddr_in srcaddr, u_int32_t old_serial) { struct databuf *dp; - struct map *mp; ns_updrec *rrecp; int opcode; char time[25]; @@ -313,9 +310,9 @@ printupdatelog(struct sockaddr_in srcaddr, old_serial); if (ifp) fprintf(ifp, - "zone:\torigin %s class %s serial %u\n", + "zone:\torigin %s class %s serial %lu\n", zp->z_origin, p_class(zp->z_class), - old_serial); + (u_long)old_serial); break; case S_PREREQ: opcode = rrecp->r_opcode; @@ -730,16 +727,14 @@ process_prereq(ns_updrec *ur, int *rcodep, u_int16_t zclass) { static int prescan_nameok(ns_updrec *ur, int *rcodep, u_int16_t zclass, - struct zoneinfo *zp) { - const char *dname = ur->r_dname; + struct zoneinfo *zp) +{ const char *owner = ur->r_dname; u_int16_t class = ur->r_class; u_int16_t type = ur->r_type; char *cp = (char *)ur->r_dp->d_data; enum context context; - int ret = 1; - /* We don't care about deletes */ if (ur->r_class != zclass) return (1); @@ -808,16 +803,17 @@ prescan_nameok(ns_updrec *ur, int *rcodep, u_int16_t zclass, /* * Order (2) * Preference (2) - * Flags (1) */ - cp += 5; + cp += 4; + /* Flags (txt) */ + cp += (*cp&0xff) + 1; /* Service (txt) */ - cp += strlen(cp) + 1; + cp += (*cp&0xff) + 1; /* Pattern (txt) */ - cp += strlen(cp) + 1; + cp += (*cp&0xff) + 1; context = domain_ctx; - if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner, - inaddr_any)) + if (!ns_nameok(NULL, cp, class, zp, primary_trans, + context, owner, inaddr_any)) goto refused; break; case ns_t_srv: @@ -887,14 +883,10 @@ prescan_nameok(ns_updrec *ur, int *rcodep, u_int16_t zclass, */ static int prescan_update(ns_updrec *ur, int *rcodep, u_int16_t zclass) { - const char *dname = ur->r_dname; u_int16_t class = ur->r_class; u_int16_t type = ur->r_type; u_int32_t ttl = ur->r_ttl; struct databuf *rdp = ur->r_dp; - const char *fname; - struct hashbuf *htp; - struct namebuf *np; if (class == zclass) { if (!ns_t_rr_p(type)) { @@ -952,11 +944,10 @@ static int process_updates(const ns_updque *updlist, int *rcodep, struct sockaddr_in from) { - int i, j, n, dbflags, matches, zonenum; + int j, n, dbflags, matches, zonenum; int numupdated = 0, soaupdated = 0, schedmaint = 0; u_int16_t zclass; ns_updrec *ur; - const char *fname; struct databuf *dp, *savedp; struct zoneinfo *zp; int zonelist[MAXDNAME]; @@ -1145,25 +1136,20 @@ class=%s, type=%s, ttl=%d, dp=0x%0x", static enum req_action req_update_private(HEADER *hp, u_char *cp, u_char *eom, u_char *msg, struct qstream *qsp, int dfd, struct sockaddr_in from, - struct tsig_record *in_tsig) + struct tsig_record *in_tsig, ns_updque curupd) { char dnbuf[MAXDNAME], *dname; u_int zocount, prcount, upcount, adcount, class, type, dlen; u_int32_t ttl; - int i, n, cnt, found, matches, zonenum, numupdated = 0; + int i, n, matches, zonenum, numupdated = 0; int rcode = NOERROR; - u_int c, section; + u_int section; u_char rdata[MAXDATA]; - struct qinfo *qp; struct databuf *dp, *nsp[NSMAX]; - struct databuf **nspp = &nsp[0]; struct zoneinfo *zp; ns_updrec *rrecp; int zonelist[MAXDNAME]; - int should_use_tcp; u_int32_t old_serial; - int unapproved_ip = 0; - int tsig_len; DST_KEY *in_key = (in_tsig != NULL) ? in_tsig->key : NULL; nsp[0] = NULL; @@ -1219,7 +1205,7 @@ req_update_private(HEADER *hp, u_char *cp, u_char *eom, u_char *msg, */ if (!ip_addr_or_key_allowed(zp->z_update_acl, from.sin_addr, in_key)) { - ns_notice(ns_log_security, "denied update from %s for %s", + ns_notice(ns_log_security, "denied update from %s for \"%s\"", sin_ntoa(from), *dname ? dname : "."); nameserIncr(from.sin_addr, nssRcvdUUpd); return (Refuse); @@ -1353,6 +1339,7 @@ req_update_private(HEADER *hp, u_char *cp, u_char *eom, u_char *msg, dp->d_secure = DB_S_INSECURE; /* should be UNCHECKED */ dp->d_clev = nlabels(zp->z_origin); /* XXX - also record in dp->d_ns, which host this came from */ + DRCNTINC(dp); rrecp->r_dp = dp; /* Append the current record to the end of list of records. */ APPEND(curupd, rrecp, r_link); @@ -1408,8 +1395,11 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) { else next_rrecp = PREV(rrecp, r_link); if (rrecp->r_section != S_UPDATE) { - if (rrecp->r_dp) - db_freedata(rrecp->r_dp); + if (rrecp->r_dp) { + DRCNTDEC(rrecp->r_dp); + if (rrecp->r_dp->d_rcnt == 0) + db_freedata(rrecp->r_dp); + } res_freeupdrec(rrecp); continue; } @@ -1447,19 +1437,26 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) { */ } } + DRCNTDEC(dp); + if (dp->d_rcnt == 0) + db_freedata(dp); } else { /* * Databuf's matching this were deleted by this * update, or were never executed (because we bailed * out early). */ - db_freedata(dp); + DRCNTDEC(dp); + if (dp->d_rcnt == 0) + db_freedata(dp); } /* Process deleted databuf's. */ dp = rrecp->r_deldp; while (dp != NULL) { tmpdp = dp; + DRCNTDEC(tmpdp); + tmpdp->d_next = NULL; dp = dp->d_next; if (rcode == NOERROR) { if (tmpdp->d_rcnt) @@ -1468,7 +1465,6 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) { p_type(tmpdp->d_type), tmpdp->d_rcnt); else { - tmpdp->d_next = NULL; db_freedata(tmpdp); } } else { @@ -1484,6 +1480,8 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) { "free_rrecp: added back databuf 0x%0x", tmpdp); } + if (tmpdp->d_rcnt == 0) + db_freedata(tmpdp); } } res_freeupdrec(rrecp); @@ -1497,9 +1495,11 @@ req_update(HEADER *hp, u_char *cp, u_char *eom, u_char *msg, struct tsig_record *in_tsig) { enum req_action ret; + ns_updque curupd; INIT_LIST(curupd); - ret = req_update_private(hp, cp, eom, msg, qsp, dfd, from, in_tsig); + ret = req_update_private(hp, cp, eom, msg, qsp, dfd, from, + in_tsig, curupd); free_rrecp(&curupd, ret == Refuse ? ns_r_refused : hp->rcode, from); if (ret == Finish) { hp->qdcount = hp->ancount = hp->nscount = hp->arcount = 0; @@ -1801,7 +1801,7 @@ rdata_dump(struct databuf *dp, FILE *fp) { if ((n = *cp++) != '\0') { for (j = n; j > 0 && cp < end; j--) if ((*cp < ' ') || (*cp > '~')) { - fprintf(fp, "\\%03.3d", *cp++); + fprintf(fp, "\\%03d", *cp++); } else if (*cp == '\\' || *cp =='"') { putc('\\', fp); putc(*cp++, fp); @@ -1944,7 +1944,7 @@ int findzone(const char *dname, int class, int depth, int *zonelist, int maxzones){ char *tmpdname; char tmpdnamebuf[MAXDNAME]; - char *zonename, *cp; + char *zonename; int tmpdnamelen, zonenamelen, zonenum, i, j, c; int matches = 0; int escaped, found, done; @@ -2076,7 +2076,7 @@ zonelist=0x%x, maxzones=%d)", int merge_logs(struct zoneinfo *zp, char *logname) { char origin[MAXDNAME], data[MAXDATA], dnbuf[MAXDNAME], sclass[3]; - char buf[BUFSIZ], buf2[100]; + char buf[BUFSIZ]; FILE *fp; u_int32_t serial, ttl, old_serial, new_serial; char *dname, *cp, *cp1; @@ -2091,10 +2091,10 @@ merge_logs(struct zoneinfo *zp, char *logname) { struct in_addr ina; int zonelist[MAXDNAME]; struct stat st; - u_char *serialp; struct sockaddr_in empty_from; int datasize; unsigned long l; + ns_updque curupd; empty_from.sin_family = AF_INET; empty_from.sin_addr.s_addr = htonl(INADDR_ANY); @@ -2124,7 +2124,7 @@ merge_logs(struct zoneinfo *zp, char *logname) { /* * See if we really have a log file -- it might be a zone dump - * that was in the process of being movefiled, or it might + * that was in the process of being isc_movefiled, or it might * be garbage! */ @@ -2135,13 +2135,14 @@ merge_logs(struct zoneinfo *zp, char *logname) { return (-1); } if (strcmp(buf, DumpSignature) == 0) { - /* It's a dump; finish movefile that was interrupted. */ + /* It's a dump; finish isc_movefile that was interrupted. */ ns_info(ns_log_update, - "completing interrupted dump movefile for %s", + "completing interrupted dump isc_movefile for %s", zp->z_source); fclose(fp); - if (movefile(logname, zp->z_source) < 0) { - ns_error(ns_log_update, "movefile(%s,%s) failed: %s :1", + if (isc_movefile(logname, zp->z_source) < 0) { + ns_error(ns_log_update, + "isc_movefile(%s,%s) failed: %s :1", logname, zp->z_source, strerror(errno)); fclose(fp); @@ -2281,7 +2282,7 @@ merge_logs(struct zoneinfo *zp, char *logname) { cp = fgets(buf, sizeof buf, fp); if (!cp) *buf = '\0'; - n = sscanf(cp, "origin %s class %s serial %ul", + n = sscanf(cp, "origin %s class %s serial %lu", origin, sclass, &serial); if (n != 3 || ns_samename(origin, zp->z_origin) != 1) err++; @@ -2339,7 +2340,7 @@ merge_logs(struct zoneinfo *zp, char *logname) { break; } /* Owner's domain name. */ - if (!getword((char *)dnbuf, sizeof dnbuf, fp, 0)) { + if (!getword((char *)dnbuf, sizeof dnbuf, fp, 1)) { err++; break; } @@ -2454,14 +2455,15 @@ merge_logs(struct zoneinfo *zp, char *logname) { err++; break; } - c = getnonblank(fp, logname); + c = getnonblank(fp, logname, 1); if (c == '(') { multiline = 1; } else { multiline = 0; ungetc(c, fp); } - n = getnum(fp, logname, GETNUM_SERIAL); + n = getnum(fp, logname, GETNUM_SERIAL, + &multiline); if (getnum_error) { err++; break; @@ -2476,12 +2478,14 @@ merge_logs(struct zoneinfo *zp, char *logname) { } PUTLONG(n, cp); } - if (multiline && - (getnonblank(fp, logname) - != ')')) { + if (multiline) { + c = getnonblank(fp, logname, 1); + if (c != ')') { + ungetc(c, fp); err++; break; } + } n = cp - data; endline(fp); break; @@ -2710,13 +2714,14 @@ merge_logs(struct zoneinfo *zp, char *logname) { dp->d_cred = DB_C_ZONE; dp->d_clev = nlabels(zp->z_origin); dp->d_secure = DB_S_INSECURE; /* should be UNCHECKED */ + DRCNTINC(dp); rrecp->r_dp = dp; } else { rrecp->r_zone = zonenum; } APPEND(curupd, rrecp, r_link); } /* for (;;) */ - + INSIST(EMPTY(curupd)); fclose(fp); return (0); } @@ -2826,9 +2831,11 @@ zonedump(struct zoneinfo *zp, int mode) { } if (mode == ISIXFR) { - if (movefile(tmp_name, zp->z_ixfr_tmp) < 0) { - ns_error(ns_log_update, "movefile(%s,%s) failed: %s :2", - tmp_name, zp->z_ixfr_tmp, strerror(errno)); + if (isc_movefile(tmp_name, zp->z_ixfr_tmp) < 0) { + ns_error(ns_log_update, + "isc_movefile(%s,%s) failed: %s :2", + tmp_name, zp->z_ixfr_tmp, + strerror(errno)); return (-1); } if (chmod(zp->z_source, 0644) < 0) @@ -2836,8 +2843,9 @@ zonedump(struct zoneinfo *zp, int mode) { "chmod(%s,%o) failed, pressing on: %s", zp->z_source, st.st_mode, strerror(errno)); - if (movefile(zp->z_ixfr_tmp, zp->z_source) < 0) { - ns_error(ns_log_update, "movefile(%s,%s) failed: %s :3", + if (isc_movefile(zp->z_ixfr_tmp, zp->z_source) < 0) { + ns_error(ns_log_update, + "isc_movefile(%s,%s) failed: %s :3", zp->z_ixfr_tmp, zp->z_source, strerror(errno)); return (-1); @@ -2849,20 +2857,26 @@ zonedump(struct zoneinfo *zp, int mode) { zp->z_source, st.st_mode, strerror(errno)); } else if (mode == ISNOTIXFR) { - if (movefile(tmp_name, zp->z_updatelog) < 0) { - ns_error(ns_log_update, "movefile(%s,%s) failed: %s :4", - tmp_name, zp->z_updatelog, strerror(errno)); + if (isc_movefile(tmp_name, zp->z_updatelog) < 0) { + ns_error(ns_log_update, + "isc_movefile(%s,%s) failed: %s :4", + tmp_name, zp->z_updatelog, + strerror(errno)); return (-1); } - if (movefile(zp->z_updatelog, zp->z_source) < 0) { - ns_error(ns_log_update, "movefile(%s,%s) failed: %s:5", - zp->z_updatelog, zp->z_source, - strerror(errno)); + if (isc_movefile(zp->z_updatelog, zp->z_source) < 0) { + ns_error(ns_log_update, + "isc_movefile(%s,%s) failed: %s :5", + zp->z_updatelog, zp->z_source, + strerror(errno)); return (-1); } } else { - if (movefile(tmp_name, zp->z_source) < 0) { - ns_error(ns_log_update, "movefile(%s,%s) failed: % s :6", tmp_name, zp->z_source, strerror(errno)); + if (isc_movefile(tmp_name, zp->z_source) < 0) { + ns_error(ns_log_update, + "isc_movefile(%s,%s) failed: %s :6", + tmp_name, zp->z_source, + strerror(errno)); return (-1); } } diff --git a/contrib/bind/bin/named/ns_xfr.c b/contrib/bind/bin/named/ns_xfr.c index f5cbdfa..5c05fe0 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.62 2000/04/24 05:20:51 vixie Exp $"; +static const char rcsid[] = "$Id: ns_xfr.c,v 8.63 2000/12/23 08:14:43 vixie Exp $"; #endif /* not lint */ /* @@ -188,7 +188,7 @@ ns_xfr(struct qstream *qsp, struct namebuf *znp, if (type == ns_t_ixfr) { changes = ixfr_get_change_list(&zones[zone], serial_ixfr, zones[zone].z_serial); - ixfr_log_maint(&zones[zone], 1); + ixfr_log_maint(&zones[zone]); if (changes != NULL) { qsp->xfr.serial = serial_ixfr; qsp->xfr.top.ixfr = changes; @@ -314,7 +314,7 @@ sx_flush(struct qstream *qsp) { #ifdef DEBUG if (debug >= 10) res_pquery(&res, qsp->xfr.msg, qsp->xfr.cp - qsp->xfr.msg, - log_get_stream(packet_channel)); + log_get_stream(packet_channel)); #endif if (qsp->xfr.tsig_state != NULL && qsp->xfr.tsig_skip == 0) { int msglen = qsp->xfr.cp - qsp->xfr.msg; diff --git a/contrib/bind/bin/ndc/Makefile b/contrib/bind/bin/ndc/Makefile index 332e3d6..2e31b0c 100644 --- a/contrib/bind/bin/ndc/Makefile +++ b/contrib/bind/bin/ndc/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 1.16 2000/07/11 06:41:34 vixie Exp $ +# $Id: Makefile,v 1.17 2000/12/23 08:02:54 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/ndc/ndc.c b/contrib/bind/bin/ndc/ndc.c index 7235586..bc3e2dc 100644 --- a/contrib/bind/bin/ndc/ndc.c +++ b/contrib/bind/bin/ndc/ndc.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ndc.c,v 1.14 2000/02/04 08:28:32 vixie Exp $"; +static const char rcsid[] = "$Id: ndc.c,v 1.16 2000/12/23 08:14:45 vixie Exp $"; #endif /* not lint */ /* @@ -31,6 +31,7 @@ static const char rcsid[] = "$Id: ndc.c,v 1.14 2000/02/04 08:28:32 vixie Exp $"; #include <arpa/nameser.h> #include <arpa/inet.h> +#include <ctype.h> #include <errno.h> #include <stdarg.h> #include <stdio.h> @@ -296,8 +297,20 @@ builtincmd(void) { static void builtinhelp(void) { - printf(helpfmt, "start", "start the server"); - printf(helpfmt, "restart", "stop server if any, start a new one"); + const char *fmt; + + switch (mode) { + case e_channel: + fmt = "(builtin) %s - %s\n"; + break; + case e_signals: + fmt = helpfmt; + break; + default: + abort(); + } + printf(fmt, "start", "start the server"); + printf(fmt, "restart", "stop server if any, start a new one"); } static void @@ -371,8 +384,10 @@ command_channel(void) { int helping = (strcasecmp(cmd, "help") == 0); int save_quiet = quiet; - if (helping) + if (helping) { quiet = 0; + builtinhelp(); + } channel_loop(cmd, !quiet, NULL, NULL); quiet = save_quiet; } @@ -496,7 +511,6 @@ static void command_signals(void) { struct cmdsig *cmdsig; pid_t pid; - int sig; if (strcasecmp(cmd, "help") == 0) { printf(helpfmt, "help", "this output"); diff --git a/contrib/bind/bin/nslookup/Makefile b/contrib/bind/bin/nslookup/Makefile index 332b973..5c564f4 100644 --- a/contrib/bind/bin/nslookup/Makefile +++ b/contrib/bind/bin/nslookup/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.25 2000/07/11 06:41:35 vixie Exp $ +# $Id: Makefile,v 8.26 2000/12/23 08:02:55 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/nslookup/commands.l b/contrib/bind/bin/nslookup/commands.l index 19cf062..ff0d19b 100644 --- a/contrib/bind/bin/nslookup/commands.l +++ b/contrib/bind/bin/nslookup/commands.l @@ -95,6 +95,7 @@ static char sccsid[] = "@(#)commands.l 5.13 (Berkeley) 7/24/90"; #include "port_before.h" #include <sys/types.h> +#include <netinet/in.h> #include "port_after.h" #include "res.h" diff --git a/contrib/bind/bin/nslookup/debug.c b/contrib/bind/bin/nslookup/debug.c index a5f85e6..9b30977 100644 --- a/contrib/bind/bin/nslookup/debug.c +++ b/contrib/bind/bin/nslookup/debug.c @@ -53,7 +53,7 @@ #ifndef lint static const char sccsid[] = "@(#)debug.c 5.26 (Berkeley) 3/21/91"; -static const char rcsid[] = "$Id: debug.c,v 8.16 2000/07/11 05:59:32 vixie Exp $"; +static const char rcsid[] = "$Id: debug.c,v 8.17 2000/11/08 06:47:31 marka Exp $"; #endif /* not lint */ /* @@ -88,7 +88,9 @@ static const char rcsid[] = "$Id: debug.c,v 8.16 2000/07/11 05:59:32 vixie Exp $ /* * Imported from res_debug.c */ +#ifndef HAVE_DECL_RES_OPCODES extern char *_res_opcodes[]; +#endif /* * Used to highlight the start of a record when printing it. diff --git a/contrib/bind/bin/nslookup/getinfo.c b/contrib/bind/bin/nslookup/getinfo.c index 8d5c8df..57aadd3 100644 --- a/contrib/bind/bin/nslookup/getinfo.c +++ b/contrib/bind/bin/nslookup/getinfo.c @@ -53,7 +53,7 @@ #ifndef lint static const char sccsid[] = "@(#)getinfo.c 5.26 (Berkeley) 3/21/91"; -static const char rcsid[] = "$Id: getinfo.c,v 8.16 2000/07/11 04:36:26 vixie Exp $"; +static const char rcsid[] = "$Id: getinfo.c,v 8.17 2000/12/23 08:14:46 vixie Exp $"; #endif /* not lint */ /* @@ -693,6 +693,7 @@ GetHostInfoByName(nsAddrPtr, queryClass, queryType, name, hostPtr, isServer) * Perform a query on the concatenation of name and domain, * removing a trailing dot from name if domain is NULL. */ +int GetHostDomain(nsAddrPtr, queryClass, queryType, name, domain, hostPtr, isServer) struct in_addr *nsAddrPtr; int queryClass; diff --git a/contrib/bind/bin/nslookup/list.c b/contrib/bind/bin/nslookup/list.c index db46d7f..863d433 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.23 2000/03/30 23:25:34 vixie Exp $"; +static const char rcsid[] = "$Id: list.c,v 8.25 2000/12/23 08:14:46 vixie Exp $"; #endif /* not lint */ /* @@ -72,6 +72,8 @@ static const char rcsid[] = "$Id: list.c,v 8.23 2000/03/30 23:25:34 vixie Exp $" #include <sys/param.h> #include <sys/socket.h> +#include <sys/types.h> +#include <sys/uio.h> #include <netinet/in.h> #include <arpa/nameser.h> @@ -258,7 +260,7 @@ ListSubr(int qtype, char *domain, char *cmd) { querybuf buf; struct sockaddr_in sin; HEADER *headerPtr; - int msglen, amtToRead, numRead, n, count, soacnt; + int msglen, amtToRead, numRead, soacnt; u_int len; int numAnswers = 0; int numRecords = 0; @@ -266,6 +268,7 @@ ListSubr(int qtype, char *domain, char *cmd) { char soaname[2][NAME_LEN], file[PATH_MAX]; enum { NO_ERRORS, ERR_READING_LEN, ERR_READING_MSG, ERR_PRINTING } error = NO_ERRORS; + struct iovec iov[2]; /* * Create a query packet for the requested domain name. @@ -321,8 +324,11 @@ ListSubr(int qtype, char *domain, char *cmd) { * Send length & message for zone transfer */ ns_put16(msglen, tmp); - if (write(sockFD, (char *)tmp, INT16SZ) != INT16SZ || - write(sockFD, (char *)buf.qb2, msglen) != msglen) { + iov[0].iov_base = (char *)tmp; + iov[0].iov_len = INT16SZ; + iov[1].iov_base = (char *)buf.qb2; + iov[1].iov_len = msglen; + if (writev(sockFD, iov, 2) != INT16SZ + msglen) { perror("ls: write"); (void) close(sockFD); sockFD = -1; @@ -518,6 +524,7 @@ ListSubr(int qtype, char *domain, char *cmd) { ******************************************************************************* */ +int Finger(string, putToFile) char *string; int putToFile; @@ -641,8 +648,7 @@ Finger(string, putToFile) } void -ListHost_close() -{ +ListHost_close(void) { if (sockFD != -1) { (void) close(sockFD); sockFD = -1; diff --git a/contrib/bind/bin/nslookup/main.c b/contrib/bind/bin/nslookup/main.c index f78d927..b27b418 100644 --- a/contrib/bind/bin/nslookup/main.c +++ b/contrib/bind/bin/nslookup/main.c @@ -77,7 +77,7 @@ char copyright[] = #ifndef lint static const char sccsid[] = "@(#)main.c 5.42 (Berkeley) 3/3/91"; -static const char rcsid[] = "$Id: main.c,v 8.14 2000/03/30 23:25:34 vixie Exp $"; +static const char rcsid[] = "$Id: main.c,v 8.16 2000/12/23 08:14:47 vixie Exp $"; #endif /* not lint */ /* @@ -114,19 +114,22 @@ static const char rcsid[] = "$Id: main.c,v 8.14 2000/03/30 23:25:34 vixie Exp $" #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include "port_after.h" #include "res.h" #include "pathnames.h" +int yylex(void); + /* * Name of a top-level name server. Can be changed with * the "set root" command. */ #ifndef ROOT_SERVER -#define ROOT_SERVER "a.root-servers.net." +#define ROOT_SERVER "f.root-servers.net." #endif char rootServerName[NAME_LEN] = ROOT_SERVER; @@ -181,10 +184,10 @@ static void ReadRC(); /* * Forward declarations. */ -void LocalServer(HostInfo *defaultPtr); -void res_re_init(void); -void res_dnsrch(char *cp); - +static void LocalServer(HostInfo *defaultPtr); +static void res_re_init(void); +static void res_dnsrch(char *cp); +static void Usage(void); /* ****************************************************************************** @@ -198,10 +201,8 @@ void res_dnsrch(char *cp); ****************************************************************************** */ -main(argc, argv) - int argc; - char **argv; -{ +int +main(int argc, char **argv) { char *wantedHost = NULL; Boolean useLocalServer; int result; @@ -299,8 +300,8 @@ main(argc, argv) break; } else { result = GetHostInfoByAddr(&(res.nsaddr_list[i].sin_addr), - &(res.nsaddr_list[i].sin_addr), - defaultPtr); + &(res.nsaddr_list[i].sin_addr), + defaultPtr); if (result != SUCCESS) { fprintf(stderr, "*** Can't find server name for address %s: %s\n", @@ -407,8 +408,8 @@ LocalServer(defaultPtr) ****************************************************************************** */ -Usage() -{ +static void +Usage(void) { fprintf(stderr, "Usage:\n"); fprintf(stderr, " nslookup [-opt ...] # interactive mode using default server\n"); @@ -782,10 +783,7 @@ LookupHost(string, putToFile) */ int -LookupHostWithServer(string, putToFile) - char *string; - Boolean putToFile; -{ +LookupHostWithServer(char *string, Boolean putToFile) { char file[PATH_MAX]; char host[NAME_LEN]; char server[NAME_LEN]; @@ -956,7 +954,13 @@ SetOption(option) return(ERROR); } - queryType = StringToType(type, queryType, stderr); + i = StringToType(type, queryType, stderr); + if (ns_t_xfr_p(i)) { + fprintf(stderr, "*** qtype may not be a zone transfer\n"); + return(ERROR); + } + + queryType = i; } } else if (strncmp(option, "cl", 2) == 0) { /* query class */ ptr = strchr(option, '='); diff --git a/contrib/bind/bin/nslookup/pathnames.h b/contrib/bind/bin/nslookup/pathnames.h index bfeae4f..71f56cc 100644 --- a/contrib/bind/bin/nslookup/pathnames.h +++ b/contrib/bind/bin/nslookup/pathnames.h @@ -55,11 +55,13 @@ /* * @(#)pathnames.h 5.1 (Berkeley) 5/28/90 - * $Id: pathnames.h,v 8.1 1994/12/15 06:24:31 vixie Exp $ + * $Id: pathnames.h,v 8.2 2000/11/08 06:47:32 marka Exp $ */ #define _PATH_NSLOOKUPRC "/.nslookuprc" +#ifndef _PATH_PAGERCMD #define _PATH_PAGERCMD "more" +#endif #ifndef _PATH_HELPFILE #if defined(BSD) && BSD >= 198810 diff --git a/contrib/bind/bin/nslookup/res.h b/contrib/bind/bin/nslookup/res.h index 5ffd6ce..2a07b17 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.5 1998/09/16 17:03:17 vixie Exp $ + * $Id: res.h,v 8.7 2000/12/23 08:14:47 vixie Exp $ */ /* @@ -97,6 +97,10 @@ typedef int Boolean; * */ +#ifdef ERROR +#undef ERROR +#endif + #define SUCCESS 0 #define TIME_OUT -1 #define NO_INFO -2 @@ -186,3 +190,21 @@ extern void ShowOptions(); extern void FreeHostInfoPtr(); extern FILE *OpenFile(); extern char *res_skip(); +extern int pickString(const char *, char *, size_t); +extern int GetHostInfoByName(); +extern int GetHostInfoByAddr(); +extern int GetHostDomain(); +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, + u_char *, u_int, int *); +extern void SendRequest_close(void); +extern int SetDefaultServer(char *, Boolean); +extern int Finger(char *, int); +void ListHostsByType(char *, int); +void ListHosts(char *, int); +void ListHost_close(void); +int SetOption(char *); +int LookupHost(char *, Boolean); +int LookupHostWithServer(char *, Boolean); diff --git a/contrib/bind/bin/nslookup/send.c b/contrib/bind/bin/nslookup/send.c index 61a8751..6af8873 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.9 1999/10/13 16:39:19 vixie Exp $"; +static const char rcsid[] = "$Id: send.c,v 8.10 2000/12/23 08:14:47 vixie Exp $"; #endif /* not lint */ /* @@ -87,6 +87,7 @@ static const char rcsid[] = "$Id: send.c,v 8.9 1999/10/13 16:39:19 vixie Exp $"; #include <errno.h> #include <resolv.h> #include <stdio.h> +#include <string.h> #include <unistd.h> #include "port_after.h" @@ -393,8 +394,8 @@ SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen, * * Called from the interrupt handler. */ -void SendRequest_close() -{ +void +SendRequest_close(void) { if (s != -1) { (void) close(s); s = -1; diff --git a/contrib/bind/bin/nslookup/subr.c b/contrib/bind/bin/nslookup/subr.c index a3b9f96..44708b3 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.13 1999/10/13 16:39:20 vixie Exp $"; +static const char rcsid[] = "$Id: subr.c,v 8.14 2000/12/23 08:14:48 vixie Exp $"; #endif /* not lint */ /* @@ -82,6 +82,7 @@ static const char rcsid[] = "$Id: subr.c,v 8.13 1999/10/13 16:39:20 vixie Exp $" #include <arpa/nameser.h> #include <arpa/inet.h> +#include <ctype.h> #include <netdb.h> #include <setjmp.h> #include <signal.h> diff --git a/contrib/bind/bin/nsupdate/Makefile b/contrib/bind/bin/nsupdate/Makefile index d8bd2b1..16fcc04 100644 --- a/contrib/bind/bin/nsupdate/Makefile +++ b/contrib/bind/bin/nsupdate/Makefile @@ -13,16 +13,16 @@ ## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ## SOFTWARE. -# $Id: Makefile,v 8.25 2000/07/11 06:41:35 vixie Exp $ +# $Id: Makefile,v 8.26 2000/12/23 08:02:55 vixie Exp $ DESTDIR= CC= cc SHELL= /bin/sh -CDEBUG= -g +CDEBUG= -g -Wall #(net2 and its descendents) -SYSTYPE = bsdos +SYSTYPE = freebsd TOP = ../.. INCL = ${TOP}/include PORTINCL = ${TOP}/port/${SYSTYPE}/include diff --git a/contrib/bind/bin/nsupdate/nsupdate.c b/contrib/bind/bin/nsupdate/nsupdate.c index d164bb1..3363654 100644 --- a/contrib/bind/bin/nsupdate/nsupdate.c +++ b/contrib/bind/bin/nsupdate/nsupdate.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: nsupdate.c,v 8.24 2000/07/11 06:32:01 vixie Exp $"; +static const char rcsid[] = "$Id: nsupdate.c,v 8.26 2000/12/23 08:14:48 vixie Exp $"; #endif /* not lint */ /* @@ -141,15 +141,10 @@ int dns_findprimary (res_state, char *, struct ns_tsig_key *, char *, * zone to which a resource record belongs */ int -main(argc, argv) - int argc; - char **argv; -{ +main(int argc, char **argv) { FILE *fp = NULL; - char buf[BUFSIZ], buf2[BUFSIZ], hostbuf[100], filebuf[100]; + char buf[BUFSIZ], buf2[BUFSIZ]; char dnbuf[MAXDNAME], data[MAXDATA]; - u_char packet[PACKETSZ], answer[PACKETSZ]; - char *host = hostbuf, *batchfile = filebuf; char *r_dname, *cp, *startp, *endp, *svstartp; char section[15], opcode[10]; int i, c, n, n1, inside, lineno = 0, vc = 0, @@ -160,13 +155,11 @@ main(argc, argv) struct map *mp; ns_updrec *rrecp; ns_updque listuprec; - struct in_addr hostaddr; extern int getopt(); extern char *optarg; extern int optind, opterr, optopt; ns_tsig_key key; - char *keyfile=NULL, *keyname=NULL, *p, *pp; - int file_major, file_minor, alg; + char *keyfile=NULL, *keyname=NULL; progname = argv[0]; @@ -429,8 +422,8 @@ main(argc, argv) switch (r_section) { case S_PREREQ: if (r_ttl) { - fprintf(stderr, "nonzero ttl in prereq section: %ul\n", - r_ttl); + fprintf(stderr, "nonzero ttl in prereq section: %lu\n", + (u_long)r_ttl); r_ttl = 0; } switch (r_opcode) { |