summaryrefslogtreecommitdiff
path: root/usr.sbin/named
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/named')
-rw-r--r--usr.sbin/named/Version.c136
-rw-r--r--usr.sbin/named/Version.self1
-rw-r--r--usr.sbin/named/adb.scripts/databuf1
-rw-r--r--usr.sbin/named/adb.scripts/databufs2
-rw-r--r--usr.sbin/named/adb.scripts/namebuf2
-rw-r--r--usr.sbin/named/db.h131
-rw-r--r--usr.sbin/named/db_dump.c787
-rw-r--r--usr.sbin/named/db_glue.c227
-rw-r--r--usr.sbin/named/db_load.c969
-rw-r--r--usr.sbin/named/db_lookup.c173
-rw-r--r--usr.sbin/named/db_reload.c120
-rw-r--r--usr.sbin/named/db_save.c212
-rw-r--r--usr.sbin/named/db_update.c404
-rw-r--r--usr.sbin/named/named.8440
-rw-r--r--usr.sbin/named/named.reload6
-rw-r--r--usr.sbin/named/named.restart9
-rw-r--r--usr.sbin/named/ns.h285
-rw-r--r--usr.sbin/named/ns_forw.c579
-rw-r--r--usr.sbin/named/ns_init.c704
-rw-r--r--usr.sbin/named/ns_main.c1301
-rw-r--r--usr.sbin/named/ns_maint.c544
-rw-r--r--usr.sbin/named/ns_req.c1353
-rw-r--r--usr.sbin/named/ns_resp.c1704
-rw-r--r--usr.sbin/named/ns_sort.c156
-rw-r--r--usr.sbin/named/ns_stats.c157
-rw-r--r--usr.sbin/named/pathnames.h60
-rw-r--r--usr.sbin/named/storage.c167
-rw-r--r--usr.sbin/named/tools/Makefile6
-rw-r--r--usr.sbin/named/tools/nslookup/Makefile19
-rw-r--r--usr.sbin/named/tools/nslookup/commands.l197
-rw-r--r--usr.sbin/named/tools/nslookup/debug.c463
-rw-r--r--usr.sbin/named/tools/nslookup/getinfo.c800
-rw-r--r--usr.sbin/named/tools/nslookup/list.c945
-rw-r--r--usr.sbin/named/tools/nslookup/main.c1108
-rw-r--r--usr.sbin/named/tools/nslookup/nslookup.8364
-rw-r--r--usr.sbin/named/tools/nslookup/nslookup.help31
-rw-r--r--usr.sbin/named/tools/nslookup/pathnames.h37
-rw-r--r--usr.sbin/named/tools/nslookup/res.h148
-rw-r--r--usr.sbin/named/tools/nslookup/send.c564
-rw-r--r--usr.sbin/named/tools/nslookup/skip.c188
-rw-r--r--usr.sbin/named/tools/nslookup/subr.c510
-rw-r--r--usr.sbin/named/tools/nsquery/Makefile8
-rw-r--r--usr.sbin/named/tools/nsquery/nsquery.c110
-rw-r--r--usr.sbin/named/tools/nstest/Makefile8
-rw-r--r--usr.sbin/named/tools/nstest/nstest.c389
45 files changed, 0 insertions, 16525 deletions
diff --git a/usr.sbin/named/Version.c b/usr.sbin/named/Version.c
deleted file mode 100644
index b2d8c987927..00000000000
--- a/usr.sbin/named/Version.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/*-
- * Copyright (c) 1986, 1987, 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)Version.c 4.10 (Berkeley) 4/24/91
- */
-
-#ifndef lint
-/*char sccsid[] = "from: @(#)named 4.8.3 %WHEN% %WHOANDWHERE%\n";*/
-static char rcsid[] = "$Id: Version.c,v 1.1 1995/10/18 08:47:49 deraadt Exp $";
-#endif /* not lint */
-
-char Version[] = "named 4.8.3 %WHEN%\n\t%WHOANDWHERE%\n";
-
-#ifdef COMMENT
-
-SCCS/s.Version.c:
-
-D 4.8.3 90/08/15 09:21:21 bloom 37 35 00031/00028/00079
-Version distributed with 4.3 Reno tape (June 1990)
-(with additional changes for backward compat. after Reno)
-
-D 4.8.2 89/09/18 13:57:11 bloom 35 34 00020/00014/00087
-Interim fixes release
-
-D 4.8.1 89/02/08 17:12:15 karels 34 33 00026/00017/00075
-branch for 4.8.1
-
-D 4.8 88/07/09 14:27:00 karels 33 28 00043/00031/00049
-4.8 is here!
-
-D 4.7 87/11/20 13:15:52 karels 25 24 00000/00000/00062
-4.7.3 beta
-
-D 4.6 87/07/21 12:15:52 karels 25 24 00000/00000/00062
-4.6 declared stillborn
-
-D 4.5 87/02/10 12:33:25 kjd 24 18 00000/00000/00062
-February 1987, Network Release. Child (bind) grows up, parent (kevin) leaves home.
-
-D 4.4 86/10/01 10:06:26 kjd 18 12 00020/00017/00042
-October 1, 1986 Network Distribution
-
-D 4.3 86/06/04 12:12:18 kjd 12 7 00015/00028/00044
-Version distributed with 4.3BSD
-
-D 4.2 86/04/30 20:57:16 kjd 7 1 00056/00000/00016
-Network distribution Freeze and one more version until 4.3BSD
-
-D 1.1 86/04/30 19:30:00 kjd 1 0 00016/00000/00000
-date and time created 86/04/30 19:30:00 by kjd
-
-code versions:
-
-Makefile
- Makefile.dist 5.4 (Berkeley) 8/15/90
-Makefile.reno
- Makefile 5.8 (Berkeley) 7/28/90
-Version.c
- Version.c 4.9 (Berkeley) 7/21/90
-db.h
- db.h 4.16 (Berkeley) 6/1/90
-db_dump.c
- db_dump.c 4.30 (Berkeley) 6/1/90
-db_glue.c
- db_glue.c 4.4 (Berkeley) 6/1/90
-db_load.c
- db_load.c 4.37 (Berkeley) 6/1/90
-db_lookup.c
- db_lookup.c 4.17 (Berkeley) 6/1/90
-db_reload.c
- db_reload.c 4.21 (Berkeley) 6/1/90
-db_save.c
- db_save.c 4.15 (Berkeley) 6/1/90
-db_update.c
- db_update.c 4.26 (Berkeley) 6/1/90
-named-xfer.c
- named-xfer.c 4.16 (Berkeley) 8/15/90
-named.reload
- named.reload 5.1 (Berkeley) 2/8/89
-named.reload.reno
- named.reload 5.2 (Berkeley) 6/27/89
-named.restart
- named.restart 5.2 (Berkeley) 2/5/89
-named.restart.reno
- named.restart 5.4 (Berkeley) 6/27/89
-ns.h
- ns.h 4.32 (Berkeley) 8/15/90
-ns_forw.c
- ns_forw.c 4.30 (Berkeley) 6/27/90
-ns_init.c
- ns_init.c 4.35 (Berkeley) 6/27/90
-ns_main.c
- ns_main.c 4.51 (Berkeley) 8/15/90
-ns_maint.c
- ns_maint.c 4.38 (Berkeley) 8/15/90
-ns_req.c
- ns_req.c 4.44 (Berkeley) 6/27/90
-ns_resp.c
- ns_resp.c 4.63 (Berkeley) 6/1/90
-ns_sort.c
- ns_sort.c 4.8 (Berkeley) 6/1/90
-ns_stats.c
- ns_stats.c 4.10 (Berkeley) 6/27/90
-pathnames.h
- pathnames.h 5.4 (Berkeley) 6/1/90
-
-#endif COMMENT
diff --git a/usr.sbin/named/Version.self b/usr.sbin/named/Version.self
deleted file mode 100644
index cd65debe7cd..00000000000
--- a/usr.sbin/named/Version.self
+++ /dev/null
@@ -1 +0,0 @@
-D 4.8 %E% %U% karels 26 25 00000/00000/00062
diff --git a/usr.sbin/named/adb.scripts/databuf b/usr.sbin/named/adb.scripts/databuf
deleted file mode 100644
index d6f1e2cf260..00000000000
--- a/usr.sbin/named/adb.scripts/databuf
+++ /dev/null
@@ -1 +0,0 @@
-./"next"16t"ttl"16t"flags"8t"zone"8t"class"8t"type"nXDx3dn"mark"8t"size"8t"nstime"nddD
diff --git a/usr.sbin/named/adb.scripts/databufs b/usr.sbin/named/adb.scripts/databufs
deleted file mode 100644
index c1f8938d725..00000000000
--- a/usr.sbin/named/adb.scripts/databufs
+++ /dev/null
@@ -1,2 +0,0 @@
-./"next"16t"ttl"16t"flags"8t"zone"8t"class"8t"type"nXDx3dn"mark"8t"size"8t"nstime"nddD
-*.,<9-1$<databuf
diff --git a/usr.sbin/named/adb.scripts/namebuf b/usr.sbin/named/adb.scripts/namebuf
deleted file mode 100644
index f5170b63552..00000000000
--- a/usr.sbin/named/adb.scripts/namebuf
+++ /dev/null
@@ -1,2 +0,0 @@
-./"dname"16t"hashval"16t"next"n3Xn"data"16t"parent"16t"hashbuf"n3X
-*./"name"16ts
diff --git a/usr.sbin/named/db.h b/usr.sbin/named/db.h
deleted file mode 100644
index 7e3bb3e9217..00000000000
--- a/usr.sbin/named/db.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 1985, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: @(#)db.h 4.16 (Berkeley) 6/1/90
- * $Id: db.h,v 1.1 1995/10/18 08:47:49 deraadt Exp $
- */
-
-/*
- * Global structures and variables for data base routines.
- */
-
-#define INVBLKSZ 7 /* # of namebuf pointers per block */
-#define INVHASHSZ 919 /* size of inverse hash table */
-
- /* max length of data in RR data field */
-#define MAXDATA 2048
-
-/*
- * Hash table structures.
- */
-struct databuf {
- struct databuf *d_next; /* linked list */
- u_long d_ttl; /* time to live */
- short d_flags;
- short d_zone; /* zone number */
- short d_class; /* class number */
- short d_type; /* type number */
- short d_mark; /* place to mark data */
- short d_size; /* size of data area */
- u_long d_nstime; /* NS response time, milliseconds */
- char d_data[1]; /* the data is malloc'ed to size */
-};
-#define DATASIZE(n) (sizeof(struct databuf) - 1 + n)
-
-/*
- * d_flags definitions
- */
-#define DB_F_HINT 0x01 /* databuf belongs to fcachetab */
-
-struct namebuf {
- char *n_dname; /* domain name */
- u_int n_hashval; /* hash value of n_dname */
- struct namebuf *n_next; /* linked list */
- struct databuf *n_data; /* data records */
- struct namebuf *n_parent; /* parent domain */
- struct hashbuf *n_hash; /* hash table for children */
-};
-
-struct invbuf {
- struct invbuf *i_next; /* linked list */
- struct namebuf *i_dname[INVBLKSZ]; /* domain name */
-};
-
-struct hashbuf {
- int h_size; /* size of hash table */
- int h_cnt; /* number of entries */
- struct namebuf *h_tab[1]; /* malloc'ed as needed */
-};
-#define HASHSIZE(s) (s*sizeof(struct namebuf *) + 2*sizeof(int))
-
-#define HASHSHIFT 3
-#define HASHMASK 0x1f
-
-/*
- * Flags to updatedb
- */
-#define DB_NODATA 0x01 /* data should not exist */
-#define DB_MEXIST 0x02 /* data must exist */
-#define DB_DELETE 0x04 /* delete data if it exists */
-#define DB_NOTAUTH 0x08 /* must not update authoritative data */
-#define DB_NOHINTS 0x10 /* don't reflect update in fcachetab */
-
-#define DB_Z_CACHE (0) /* cache-zone-only db_dump() */
-#define DB_Z_ALL (-1) /* normal db_dump() */
-
-/*
- * Error return codes
- */
-#define OK 0
-#define NONAME -1
-#define NOCLASS -2
-#define NOTYPE -3
-#define NODATA -4
-#define DATAEXISTS -5
-#define NODBFILE -6
-#define TOOMANYZONES -7
-#define GOODDB -8
-#define NEWDB -9
-#define AUTH -10
-
-extern struct hashbuf *hashtab; /* root hash table */
-extern struct invbuf *invtab[]; /* inverse hash table */
-extern struct hashbuf *fcachetab; /* hash table for cache read from file*/
-
-extern struct namebuf *nlookup();
-extern struct namebuf *savename();
-extern struct databuf *savedata();
-extern struct databuf *rm_datum();
-extern struct hashbuf *savehash();
-extern struct invbuf *saveinv();
-extern char *savestr();
-extern char *malloc(), *realloc(), *calloc();
diff --git a/usr.sbin/named/db_dump.c b/usr.sbin/named/db_dump.c
deleted file mode 100644
index c38f5b85e02..00000000000
--- a/usr.sbin/named/db_dump.c
+++ /dev/null
@@ -1,787 +0,0 @@
-/*
- * Copyright (c) 1986, 1988, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)db_dump.c 4.33 (Berkeley) 3/3/91";*/
-static char rcsid[] = "$Id: db_dump.c,v 1.1 1995/10/18 08:47:49 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include "ns.h"
-#include "db.h"
-#include "pathnames.h"
-
-#ifdef DUMPFILE
-char *dumpfile = DUMPFILE;
-#else
-char *dumpfile = _PATH_DUMPFILE;
-#endif
-
-extern char *cache_file;
-
-/*
- * Dump current cache in a format similar to RFC 883.
- *
- * We try to be careful and determine whether the operation succeeded
- * so that the new cache file can be installed.
- */
-
-#define DB_ROOT_TIMBUF 3600
-
-doachkpt()
-{
- extern int errno;
- FILE *fp;
- time_t dumptime;
- char tmpcheckfile[256];
-
- /* nowhere to checkpoint cache... */
- if (cache_file == NULL) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doachkpt(to where?)\n");
-#endif
- return;
- }
-
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doachkpt()\n");
-#endif
-
- (void) sprintf(tmpcheckfile, "%s.chk", cache_file);
- if ((fp = fopen(tmpcheckfile, "w")) == NULL) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doachkpt(can't open %s for write)\n", tmpcheckfile);
-#endif
- return;
- }
-
- (void) gettime(&tt);
- dumptime = tt.tv_sec;
- fprintf(fp, "; Dumped at %s", ctime(&dumptime));
- fflush(fp);
- if (ferror(fp)) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doachkpt(write to checkpoint file failed)\n");
-#endif
- return;
- }
-
- if (fcachetab != NULL) {
- int n;
- if ((n = scan_root(hashtab)) < MINROOTS) {
- syslog(LOG_ERR, "%d root hints... (too low)", n);
- fprintf(fp, "; ---- Root hint cache dump ----\n");
- (void) db_dump(fcachetab, fp, DB_Z_CACHE, "");
- }
- }
-
- if (hashtab != NULL) {
- fprintf(fp, "; ---- Cache dump ----\n");
- if (db_dump(hashtab, fp, DB_Z_CACHE, "") == NODBFILE) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doachkpt(checkpoint failed)\n");
-#endif
- (void) fclose(fp);
- return;
- }
- }
-
- (void) fsync(fileno(fp));
- if (fclose(fp) == EOF) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doachkpt(close failed)\n");
-#endif
- return;
- }
-
- if (rename(tmpcheckfile, cache_file)) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doachkpt(install %s to %s failed, %d)\n",
- tmpcheckfile,cache_file, errno);
-#endif
- }
-}
-
-/*
- * What we do is scan the root hint cache to make sure there are at least
- * MINROOTS root pointers with non-0 TTL's so that the checkpoint will not
- * lose the root. Failing this, all pointers are written out w/ TTL ~0
- * (root pointers timed out and prime_cache() not done or failed).
- */
-#define TIMBUF 300
-
-int
-scan_root(htp)
- struct hashbuf *htp;
-{
- register struct databuf *dp;
- register struct namebuf *np;
- struct timeval soon;
- int roots = 0;
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"scan_root(0x%x)\n", htp);
-#endif
-
- /* metric by which we determine whether a root NS pointer is still */
- /* valid (will be written out if we do a dump). we also add some */
- /* time buffer for safety... */
- (void) gettime(&soon);
- soon.tv_sec += TIMBUF;
-
- for (np = htp->h_tab[0]; np != NULL; np = np->n_next) {
- if (np->n_dname[0] == '\0') {
- dp = np->n_data;
- while (dp != NULL) {
- if (dp->d_type == T_NS &&
- dp->d_ttl > soon.tv_sec) {
- roots++;
- if (roots >= MINROOTS)
- return (roots);
- }
- dp = dp->d_next;
- }
- }
- }
- return (roots);
-}
-
-#ifdef notdef
-mark_cache(htp, ttl)
- struct hashbuf *htp;
- int ttl;
-{
- register struct databuf *dp;
- register struct namebuf *np;
- struct namebuf **npp, **nppend;
- struct timeval soon;
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"mark_cache()\n");
-#endif
-
- (void) gettime(&soon);
- soon.tv_sec += TIMBUF;
-
- npp = htp->h_tab;
- nppend = npp + htp->h_size;
- while (npp < nppend) {
- for (np = *npp++; np != NULL; np = np->n_next) {
- if (np->n_data == NULL)
- continue;
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (dp->d_ttl < soon.tv_sec)
- dp->d_ttl = ttl;
- }
- }
- }
-
- npp = htp->h_tab;
- nppend = npp + htp->h_size;
- while (npp < nppend) {
- for (np = *npp++; np != NULL; np = np->n_next) {
- if (np->n_hash == NULL)
- continue;
- mark_cache(np->n_hash, ttl);
- }
- }
-}
-#endif notdef
-
-/*
- * Dump current data base in a format similar to RFC 883.
- */
-
-doadump()
-{
- FILE *fp;
- time_t dumptime;
-
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doadump()\n");
-#endif
-
- if ((fp = fopen(dumpfile, "w")) == NULL)
- return;
- gettime(&tt);
- dumptime = tt.tv_sec;
- fprintf(fp, "; Dumped at %s", ctime(&dumptime));
- fprintf(fp, "; --- Cache & Data ---\n");
- if (hashtab != NULL)
- (void) db_dump(hashtab, fp, DB_Z_ALL, "");
- fprintf(fp, "; --- Hints ---\n");
- if (fcachetab != NULL)
- (void) db_dump(fcachetab, fp, DB_Z_ALL, "");
- (void) fclose(fp);
-}
-
-#ifdef ALLOW_UPDATES
-/* Create a disk database to back up zones
- */
-zonedump(zp)
- register struct zoneinfo *zp;
-{
- FILE *fp;
- char *fname;
- struct hashbuf *htp;
- char *op;
- struct stat st;
-
- /* Only dump zone if there is a cache specified */
- if (zp->z_source && *(zp->z_source)) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "zonedump(%s)\n", zp->z_source);
-#endif
-
- if ((fp = fopen(zp->z_source, "w")) == NULL)
- return;
- if (op = index(zp->z_origin, '.'))
- op++;
- gettime(&tt);
- htp = hashtab;
- if (nlookup(zp->z_origin, &htp, &fname, 0) != NULL) {
- db_dump(htp, fp, zp-zones, (op == NULL ? "" : op));
-#ifdef ALLOW_UPDATES
- zp->hasChanged = 0; /* Checkpointed */
-#endif ALLOW_UPDATES
- }
- (void) fclose(fp);
- if (stat(zp->z_source, &st) == 0)
- zp->z_ftime = st.st_mtime;
- }
-#ifdef DEBUG
- else if (debug)
- fprintf(ddt, "zonedump: no zone to dump\n");
-#endif
-}
-#endif
-
-int
-db_dump(htp, fp, zone, origin)
- int zone;
- struct hashbuf *htp;
- FILE *fp;
- char *origin;
-{
- register struct databuf *dp;
- register struct namebuf *np;
- struct namebuf **npp, **nppend;
- char dname[MAXDNAME];
- u_long n;
- u_long addr;
- u_short i;
- int j;
- register u_char *cp;
- u_char *end;
- char *proto;
- extern char *inet_ntoa(), *protocolname(), *servicename();
- int found_data, tab, printed_origin = 0;
-
- npp = htp->h_tab;
- nppend = npp + htp->h_size;
- while (npp < nppend) {
- for (np = *npp++; np != NULL; np = np->n_next) {
- if (np->n_data == NULL)
- continue;
- /* Blecch - can't tell if there is data here for the
- * right zone, so can't print name yet
- */
- found_data = 0;
- /* we want a snapshot in time... */
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- /* Is the data for this zone? */
- if (zone != DB_Z_ALL && dp->d_zone != zone)
- continue;
- if (dp->d_zone == DB_Z_CACHE &&
- dp->d_ttl <= tt.tv_sec &&
- (dp->d_flags & DB_F_HINT) == 0)
- continue;
- if (!printed_origin) {
- fprintf(fp, "$ORIGIN %s.\n", origin);
- printed_origin++;
- }
- tab = 0;
- if (!found_data) {
- if (np->n_dname[0] == 0) {
- if (origin[0] == 0)
- fprintf(fp, ".\t");
- else
- fprintf(fp, ".%s.\t", origin); /* ??? */
- } else
- fprintf(fp, "%s\t", np->n_dname);
- if (strlen(np->n_dname) < 8)
- tab = 1;
- found_data++;
- } else {
- (void) putc('\t', fp);
- tab = 1;
- }
- if (dp->d_zone == DB_Z_CACHE) {
- if (dp->d_flags & DB_F_HINT &&
- (long)(dp->d_ttl - tt.tv_sec) < DB_ROOT_TIMBUF)
- fprintf(fp, "%d\t", DB_ROOT_TIMBUF);
- else
- fprintf(fp, "%d\t",
- (int)(dp->d_ttl - tt.tv_sec));
- } else if (dp->d_ttl != 0 &&
- dp->d_ttl != zones[dp->d_zone].z_minimum)
- fprintf(fp, "%d\t", (int)dp->d_ttl);
- else if (tab)
- (void) putc('\t', fp);
- fprintf(fp, "%s\t%s\t", p_class(dp->d_class),
- p_type(dp->d_type));
- cp = (u_char *)dp->d_data;
- /*
- * Print type specific data
- */
- switch (dp->d_type) {
- case T_A:
- switch (dp->d_class) {
- case C_IN:
- case C_HS:
- GETLONG(n, cp);
- n = htonl(n);
- fprintf(fp, "%s",
- inet_ntoa(*(struct in_addr *)&n));
- break;
- }
- if (dp->d_nstime)
- fprintf(fp, "\t; %d", dp->d_nstime);
- fprintf(fp, "\n");
- break;
- case T_CNAME:
- case T_MB:
- case T_MG:
- case T_MR:
- case T_PTR:
- if (cp[0] == '\0')
- fprintf(fp, ".\n");
- else
- fprintf(fp, "%s.\n", cp);
- break;
-
- case T_NS:
- cp = (u_char *)dp->d_data;
- if (cp[0] == '\0')
- fprintf(fp, ".\t");
- else
- fprintf(fp, "%s.", cp);
- if (dp->d_nstime)
- fprintf(fp, "\t; %d???", dp->d_nstime);
- fprintf(fp, "\n");
- break;
-
- case T_HINFO:
- if (n = *cp++) {
- fprintf(fp, "\"%.*s\"", (int)n, cp);
- cp += n;
- } else
- fprintf(fp, "\"\"");
- if (n = *cp++)
- fprintf(fp, " \"%.*s\"", (int)n, cp);
- else
- fprintf(fp, " \"\"");
- (void) putc('\n', fp);
- break;
-
- case T_SOA:
- fprintf(fp, "%s.", cp);
- cp += strlen((char *)cp) + 1;
- fprintf(fp, " %s. (\n", cp);
- cp += strlen((char *)cp) + 1;
- GETLONG(n, cp);
- fprintf(fp, "\t\t%lu", n);
- GETLONG(n, cp);
- fprintf(fp, " %lu", n);
- GETLONG(n, cp);
- fprintf(fp, " %lu", n);
- GETLONG(n, cp);
- fprintf(fp, " %lu", n);
- GETLONG(n, cp);
- fprintf(fp, " %lu )\n", n);
- break;
-
- case T_MX:
- GETSHORT(n, cp);
- fprintf(fp,"%lu", n);
- fprintf(fp," %s.\n", cp);
- break;
-
- case T_TXT:
- end = (u_char *)dp->d_data + dp->d_size;
- (void) putc('"', fp);
- while (cp < end) {
- if (n = *cp++) {
- for (j = n ; j > 0 && cp < end ; j--)
- if (*cp == '\n') {
- (void) putc('\\', fp);
- (void) putc(*cp++, fp);
- } else
- (void) putc(*cp++, fp);
- }
- }
- (void) fputs("\"\n", fp);
- break;
-
- case T_UINFO:
- fprintf(fp, "\"%s\"\n", cp);
- break;
-
- case T_UID:
- case T_GID:
- if (dp->d_size == sizeof(u_long)) {
- GETLONG(n, cp);
- fprintf(fp, "%lu\n", n);
- }
- break;
-
- case T_WKS:
- GETLONG(addr, cp);
- addr = htonl(addr);
- fprintf(fp,"%s ",
- inet_ntoa(*(struct in_addr *)&addr));
- proto = protocolname(*cp);
- cp += sizeof(char);
- fprintf(fp, "%s ", proto);
- i = 0;
- while(cp < (u_char *)dp->d_data + dp->d_size) {
- j = *cp++;
- do {
- if (j & 0200)
- fprintf(fp," %s",
- servicename(i, proto));
- j <<= 1;
- } while(++i & 07);
- }
- fprintf(fp,"\n");
- break;
-
- case T_MINFO:
- fprintf(fp, "%s.", cp);
- cp += strlen((char *)cp) + 1;
- fprintf(fp, " %s.\n", cp);
- break;
-#ifdef ALLOW_T_UNSPEC
- case T_UNSPEC:
- /* Dump binary data out in an ASCII-encoded
- format */
- {
- /* Allocate more than enough space:
- * actually need 5/4 size + 20 or so
- */
- int TmpSize = 2 * dp->d_size + 30;
- char *TmpBuf = (char *) malloc(TmpSize);
- if (TmpBuf == NULL) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "Dump T_UNSPEC: malloc returned NULL\n");
-#endif DEBUG
- syslog(LOG_ERR, "Dump T_UNSPEC: malloc: %m");
- }
- if (btoa(cp, dp->d_size, TmpBuf,
- TmpSize) == CONV_OVERFLOW) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "Dump T_UNSPEC: Output buffer overflow\n");
-#endif DEBUG
- syslog(LOG_ERR, "Dump T_UNSPEC: Output buffer overflow\n");
- } else
- fprintf(fp, "%s\n", TmpBuf);
- }
- break;
-#endif ALLOW_T_UNSPEC
- default:
- fprintf(fp, "???\n");
- }
- }
- }
- }
- if (ferror(fp))
- return(NODBFILE);
-
- npp = htp->h_tab;
- nppend = npp + htp->h_size;
- while (npp < nppend) {
- for (np = *npp++; np != NULL; np = np->n_next) {
- if (np->n_hash == NULL)
- continue;
- getname(np, dname, sizeof(dname));
- if (db_dump(np->n_hash, fp, zone, dname) == NODBFILE)
- return(NODBFILE);
- }
- }
- return(OK);
-}
-
-#ifdef ALLOW_T_UNSPEC
-/*
- * Subroutines to convert between 8 bit binary bytes and printable ASCII.
- * Computes the number of bytes, and three kinds of simple checksums.
- * Incoming bytes are collected into 32-bit words, then printed in base 85:
- * exp(85,5) > exp(2,32)
- * The ASCII characters used are between '!' and 'u';
- * 'z' encodes 32-bit zero; 'x' is used to mark the end of encoded data.
- *
- * Originally by Paul Rutter (philabs!per) and Joe Orost (petsd!joe) for
- * the atob/btoa programs, released with the compress program, in mod.sources.
- * Modified by Mike Schwartz 8/19/86 for use in BIND.
- */
-
-/* Make sure global variable names are unique */
-#define Ceor T_UNSPEC_Ceor
-#define Csum T_UNSPEC_Csum
-#define Crot T_UNSPEC_Crot
-#define word T_UNSPEC_word
-#define bcount T_UNSPEC_bcount
-
-static long int Ceor, Csum, Crot, word, bcount;
-
-#define EN(c) ((int) ((c) + '!'))
-#define DE(c) ((c) - '!')
-#define AddToBuf(bufp, c) **bufp = c; (*bufp)++;
-#define streq(s0, s1) strcmp(s0, s1) == 0
-#define times85(x) ((((((x<<2)+x)<<2)+x)<<2)+x)
-
-
-/* Decode ASCII-encoded byte c into binary representation and
- * place into *bufp, advancing bufp
- */
-static int
-byte_atob(c, bufp)
- register c;
- char **bufp;
-{
- if (c == 'z') {
- if (bcount != 0)
- return(CONV_BADFMT);
- else {
- putbyte(0, bufp);
- putbyte(0, bufp);
- putbyte(0, bufp);
- putbyte(0, bufp);
- }
- } else if ((c >= '!') && (c < ('!' + 85))) {
- if (bcount == 0) {
- word = DE(c);
- ++bcount;
- } else if (bcount < 4) {
- word = times85(word);
- word += DE(c);
- ++bcount;
- } else {
- word = times85(word) + DE(c);
- putbyte((int)((word >> 24) & 255), bufp);
- putbyte((int)((word >> 16) & 255), bufp);
- putbyte((int)((word >> 8) & 255), bufp);
- putbyte((int)(word & 255), bufp);
- word = 0;
- bcount = 0;
- }
- } else
- return(CONV_BADFMT);
- return(CONV_SUCCESS);
-}
-
-/* Compute checksum info and place c into *bufp, advancing bufp */
-static
-putbyte(c, bufp)
- register c;
- char **bufp;
-{
- Ceor ^= c;
- Csum += c;
- Csum += 1;
- if ((Crot & 0x80000000)) {
- Crot <<= 1;
- Crot += 1;
- } else {
- Crot <<= 1;
- }
- Crot += c;
- AddToBuf(bufp, c);
-}
-
-/* Read the ASCII-encoded data from inbuf, of length inbuflen, and convert
- it into T_UNSPEC (binary data) in outbuf, not to exceed outbuflen bytes;
- outbuflen must be divisible by 4. (Note: this is because outbuf is filled
- in 4 bytes at a time. If the actual data doesn't end on an even 4-byte
- boundary, there will be no problem...it will be padded with 0 bytes, and
- numbytes will indicate the correct number of bytes. The main point is
- that since the buffer is filled in 4 bytes at a time, even if there is
- not a full 4 bytes of data at the end, there has to be room to 0-pad the
- data, so the buffer must be of size divisible by 4). Place the number of
- output bytes in numbytes, and return a failure/success status */
-int
-atob(inbuf, inbuflen, outbuf, outbuflen, numbytes)
- char *inbuf;
- int inbuflen;
- char *outbuf;
- int outbuflen;
- int *numbytes;
-{
- int inc, nb;
- long int oeor, osum, orot;
- char *inp, *outp = outbuf, *endoutp = &outbuf[outbuflen];
-
- if ( (outbuflen % 4) != 0)
- return(CONV_BADBUFLEN);
- Ceor = Csum = Crot = word = bcount = 0;
- for (inp = inbuf, inc = 0; inc < inbuflen; inp++, inc++) {
- if (outp > endoutp)
- return(CONV_OVERFLOW);
- if (*inp == 'x') {
- inp +=2;
- break;
- } else {
- if (byte_atob(*inp, &outp) == CONV_BADFMT)
- return(CONV_BADFMT);
- }
- }
-
- /* Get byte count and checksum information from end of buffer */
- if(sscanf(inp, "%ld %lx %lx %lx", numbytes, &oeor, &osum, &orot) != 4)
- return(CONV_BADFMT);
- if ((oeor != Ceor) || (osum != Csum) || (orot != Crot))
- return(CONV_BADCKSUM);
- return(CONV_SUCCESS);
-}
-
-/* Encode binary byte c into ASCII representation and place into *bufp,
- advancing bufp */
-static
-byte_btoa(c, bufp)
- register c;
- char **bufp;
-{
- Ceor ^= c;
- Csum += c;
- Csum += 1;
- if ((Crot & 0x80000000)) {
- Crot <<= 1;
- Crot += 1;
- } else {
- Crot <<= 1;
- }
- Crot += c;
-
- word <<= 8;
- word |= c;
- if (bcount == 3) {
- if (word == 0) {
- AddToBuf(bufp, 'z');
- } else {
- register int tmp = 0;
- register long int tmpword = word;
-
- if (tmpword < 0) {
- /* Because some don't support unsigned long */
- tmp = 32;
- tmpword -= (long)(85 * 85 * 85 * 85 * 32);
- }
- if (tmpword < 0) {
- tmp = 64;
- tmpword -= (long)(85 * 85 * 85 * 85 * 32);
- }
- AddToBuf(bufp,
- EN((tmpword / (long)(85 * 85 * 85 * 85)) + tmp));
- tmpword %= (long)(85 * 85 * 85 * 85);
- AddToBuf(bufp, EN(tmpword / (85 * 85 * 85)));
- tmpword %= (85 * 85 * 85);
- AddToBuf(bufp, EN(tmpword / (85 * 85)));
- tmpword %= (85 * 85);
- AddToBuf(bufp, EN(tmpword / 85));
- tmpword %= 85;
- AddToBuf(bufp, EN(tmpword));
- }
- bcount = 0;
- } else {
- bcount += 1;
- }
-}
-
-
-/*
- * Encode the binary data from inbuf, of length inbuflen, into a
- * null-terminated ASCII representation in outbuf, not to exceed outbuflen
- * bytes. Return success/failure status
- */
-int
-btoa(inbuf, inbuflen, outbuf, outbuflen)
- char *inbuf;
- int inbuflen;
- char *outbuf;
- int outbuflen;
-{
- long int inc, nb;
- long int oeor, osum, orot;
- char *inp, *outp = outbuf, *endoutp = &outbuf[outbuflen -1];
-
- Ceor = Csum = Crot = word = bcount = 0;
- for (inp = inbuf, inc = 0; inc < inbuflen; inp++, inc++) {
- byte_btoa((unsigned char) (*inp), &outp);
- if (outp >= endoutp)
- return(CONV_OVERFLOW);
- }
- while (bcount != 0) {
- byte_btoa(0, &outp);
- if (outp >= endoutp)
- return(CONV_OVERFLOW);
- }
- /* Put byte count and checksum information at end of buffer, delimited
- by 'x' */
- (void) sprintf(outp, "x %ld %lx %lx %lx", inbuflen, Ceor, Csum, Crot);
- if (&outp[strlen(outp) - 1] >= endoutp)
- return(CONV_OVERFLOW);
- else
- return(CONV_SUCCESS);
-}
-#endif ALLOW_T_UNSPEC
diff --git a/usr.sbin/named/db_glue.c b/usr.sbin/named/db_glue.c
deleted file mode 100644
index de113390586..00000000000
--- a/usr.sbin/named/db_glue.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (c) 1986, 1988 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)db_glue.c 4.4 (Berkeley) 6/1/90";*/
-static char rcsid[] = "$Id: db_glue.c,v 1.1 1995/10/18 08:47:49 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <netinet/in.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <ctype.h>
-#include <netdb.h>
-#include <arpa/nameser.h>
-#include "ns.h"
-#include "db.h"
-
-struct valuelist {
- struct valuelist *next, *prev;
- char *name;
- char *proto;
- short port;
-} *servicelist, *protolist;
-
-buildservicelist()
-{
- struct servent *sp;
- struct valuelist *slp;
-
- setservent(1);
- while (sp = getservent()) {
- slp = (struct valuelist *)malloc(sizeof(struct valuelist));
- slp->name = savestr(sp->s_name);
- slp->proto = savestr(sp->s_proto);
- slp->port = ntohs((u_short)sp->s_port);
- slp->next = servicelist;
- slp->prev = NULL;
- if (servicelist)
- servicelist->prev = slp;
- servicelist = slp;
- }
- endservent();
-}
-
-buildprotolist()
-{
- struct protoent *pp;
- struct valuelist *slp;
-
- setprotoent(1);
- while (pp = getprotoent()) {
- slp = (struct valuelist *)malloc(sizeof(struct valuelist));
- slp->name = savestr(pp->p_name);
- slp->port = pp->p_proto;
- slp->next = protolist;
- slp->prev = NULL;
- if (protolist)
- protolist->prev = slp;
- protolist = slp;
- }
- endprotoent();
-}
-
-/*
- * Convert service name or (ascii) number to int.
- */
-servicenumber(p)
- char *p;
-{
-
- return (findservice(p, &servicelist));
-}
-
-/*
- * Convert protocol name or (ascii) number to int.
- */
-protocolnumber(p)
- char *p;
-{
-
- return (findservice(p, &protolist));
-}
-
-findservice(s, list)
- register char *s;
- register struct valuelist **list;
-{
- register struct valuelist *lp = *list;
- int n;
-
- for (; lp != NULL; lp = lp->next)
- if (strcasecmp(lp->name, s) == 0) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- return(lp->port);
- }
- if (sscanf(s, "%d", &n) != 1 || n <= 0)
- n = -1;
- return(n);
-}
-
-struct servent *
-cgetservbyport(port, proto)
- u_short port;
- char *proto;
-{
- register struct valuelist **list = &servicelist;
- register struct valuelist *lp = *list;
- static struct servent serv;
-
- port = htons(port);
- for (; lp != NULL; lp = lp->next) {
- if (port != lp->port)
- continue;
- if (strcasecmp(lp->proto, proto) == 0) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- serv.s_name = lp->name;
- serv.s_port = htons((u_short)lp->port);
- serv.s_proto = lp->proto;
- return(&serv);
- }
- }
- return(0);
-}
-
-struct protoent *
-cgetprotobynumber(proto)
- register int proto;
-{
-
- register struct valuelist **list = &protolist;
- register struct valuelist *lp = *list;
- static struct protoent prot;
-
- for (; lp != NULL; lp = lp->next)
- if (lp->port == proto) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- prot.p_name = lp->name;
- prot.p_proto = lp->port;
- return(&prot);
- }
- return(0);
-}
-
-char *
-protocolname(num)
- int num;
-{
- static char number[8];
- struct protoent *pp;
-
- pp = cgetprotobynumber(num);
- if(pp == 0) {
- (void) sprintf(number, "%d", num);
- return(number);
- }
- return(pp->p_name);
-}
-
-char *
-servicename(port, proto)
- u_short port;
- char *proto;
-{
- static char number[8];
- struct servent *ss;
-
- ss = cgetservbyport(htons(port), proto);
- if(ss == 0) {
- (void) sprintf(number, "%d", port);
- return(number);
- }
- return(ss->s_name);
-}
diff --git a/usr.sbin/named/db_load.c b/usr.sbin/named/db_load.c
deleted file mode 100644
index fb65b892729..00000000000
--- a/usr.sbin/named/db_load.c
+++ /dev/null
@@ -1,969 +0,0 @@
-/*
- * Copyright (c) 1986, 1988, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)db_load.c 4.38 (Berkeley) 3/2/91";*/
-static char rcsid[] = "$Id: db_load.c,v 1.1 1995/10/18 08:47:49 deraadt Exp $";
-#endif /* not lint */
-
-/*
- * Load data base from ascii backupfile. Format similar to RFC 883.
- */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <netinet/in.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <ctype.h>
-#include <netdb.h>
-#include <arpa/nameser.h>
-#include "ns.h"
-#include "db.h"
-
-extern char *index();
-extern int max_cache_ttl;
-
-/*
- * Map class and type names to number
- */
-struct map {
- char token[8];
- int val;
-};
-
-struct map m_class[] = {
- "in", C_IN,
-#ifdef notdef
- "any", C_ANY, /* any is a QCLASS, not CLASS */
-#endif
- "chaos", C_CHAOS,
- "hs", C_HS,
-};
-#define NCLASS (sizeof(m_class)/sizeof(struct map))
-
-struct map m_type[] = {
- "a", T_A,
- "ns", T_NS,
- "cname", T_CNAME,
- "soa", T_SOA,
- "mb", T_MB,
- "mg", T_MG,
- "mr", T_MR,
- "null", T_NULL,
- "wks", T_WKS,
- "ptr", T_PTR,
- "hinfo", T_HINFO,
- "minfo", T_MINFO,
- "mx", T_MX,
- "uinfo", T_UINFO,
- "txt", T_TXT,
- "uid", T_UID,
- "gid", T_GID,
-#ifdef notdef
- "any", T_ANY, /* any is a QTYPE, not TYPE */
-#endif
-#ifdef ALLOW_T_UNSPEC
- "unspec", T_UNSPEC,
-#endif ALLOW_T_UNSPEC
-};
-#define NTYPE (sizeof(m_type)/sizeof(struct map))
-
-/*
- * Parser token values
- */
-#define CURRENT 1
-#define DOT 2
-#define AT 3
-#define DNAME 4
-#define INCLUDE 5
-#define ORIGIN 6
-#define ERROR 7
-
-int lineno; /* current line number */
-
-/*
- * Load the database from 'filename'. Origin is appended to all domain
- * names in the file.
- */
-db_load(filename, in_origin, zp, doinginclude)
- char *filename, *in_origin;
- struct zoneinfo *zp;
-{
- register u_char *cp;
- register struct map *mp;
- char domain[MAXDNAME];
- char origin[MAXDNAME];
- char tmporigin[MAXDNAME];
- u_char buf[MAXDATA];
- u_char data[MAXDATA];
- u_char *cp1;
- char *op;
- int c;
- int class, type, ttl, dbflags, dataflags;
- int read_soa = 0; /* number of soa's read */
- struct databuf *dp;
- FILE *fp;
- int slineno, i, errs = 0, didinclude = 0;
- register u_long n;
- struct stat sb;
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"db_load(%s, %s, %d, %d)\n",
- filename, in_origin, zp - zones, doinginclude);
-#endif
-
- (void) strcpy(origin, in_origin);
- if ((fp = fopen(filename, "r")) == NULL) {
- syslog(LOG_ERR, "%s: %m", filename);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"db_load: error opening file %s\n", filename);
-#endif
- return (-1);
- }
- if (zp->z_type == Z_CACHE) {
- dbflags = DB_NODATA | DB_NOHINTS;
- dataflags = DB_F_HINT;
- } else {
- dbflags = DB_NODATA;
- dataflags = 0;
- }
- gettime(&tt);
- if (fstat(fileno(fp), &sb) < 0) {
- syslog(LOG_ERR, "%s: %m", filename);
- sb.st_mtime = (int)tt.tv_sec;
- }
- slineno = lineno;
- lineno = 1;
- domain[0] = '\0';
- class = C_IN;
- zp->z_state &= ~(Z_INCLUDE|Z_DB_BAD);
- while ((c = gettoken(fp)) != EOF) {
- switch (c) {
- case INCLUDE:
- if (!getword(buf, sizeof(buf), fp)) /* file name */
- break;
- if (!getword(tmporigin, sizeof(tmporigin), fp))
- strcpy(tmporigin, origin);
- else {
- makename(tmporigin, origin);
- endline(fp);
- }
- didinclude = 1;
- errs += db_load(buf, tmporigin, zp, 1);
- continue;
-
- case ORIGIN:
- (void) strcpy((char *)buf, origin);
- if (!getword(origin, sizeof(origin), fp))
- break;
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,"db_load: origin %s, buf %s\n",
- origin, buf);
-#endif
- makename(origin, buf);
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,"db_load: origin now %s\n", origin);
-#endif
- continue;
-
- case DNAME:
- if (!getword(domain, sizeof(domain), fp))
- break;
- n = strlen(domain) - 1;
- if (domain[n] == '.')
- domain[n] = '\0';
- else if (*origin) {
- (void) strcat(domain, ".");
- (void) strcat(domain, origin);
- }
- goto gotdomain;
-
- case AT:
- (void) strcpy(domain, origin);
- goto gotdomain;
-
- case DOT:
- domain[0] = '\0';
- /* fall thru ... */
- case CURRENT:
- gotdomain:
- if (!getword(buf, sizeof(buf), fp)) {
- if (c == CURRENT)
- continue;
- break;
- }
- cp = buf;
- ttl = 0;
- if (isdigit(*cp)) {
- n = 0;
- do
- n = n * 10 + (*cp++ - '0');
- while (isdigit(*cp));
- if (zp->z_type == Z_CACHE) {
- /* this allows the cache entry to age */
- /* while sitting on disk (powered off) */
- if (n > max_cache_ttl)
- n = max_cache_ttl;
- n += sb.st_mtime;
- }
- ttl = n;
- if (!getword(buf, sizeof(buf), fp))
- break;
- }
- for (mp = m_class; mp < m_class+NCLASS; mp++)
- if (!strcasecmp((char *)buf, mp->token)) {
- class = mp->val;
- (void) getword(buf, sizeof(buf), fp);
- break;
- }
- for (mp = m_type; mp < m_type+NTYPE; mp++)
- if (!strcasecmp((char *)buf, mp->token)) {
- type = mp->val;
- goto fndtype;
- }
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"Line %d: Unknown type: %s.\n",
- lineno, buf);
-#endif
- errs++;
- syslog(LOG_ERR, "Line %d: Unknown type: %s.\n",
- lineno, buf);
- break;
- fndtype:
-#ifdef ALLOW_T_UNSPEC
- /* Don't do anything here for T_UNSPEC...
- * read input separately later
- */
- if (type != T_UNSPEC) {
-#endif ALLOW_T_UNSPEC
- if (!getword(buf, sizeof(buf), fp))
- break;
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,
- "d='%s', c=%d, t=%d, ttl=%d, data='%s'\n",
- domain, class, type, ttl, buf);
-#endif
-#ifdef ALLOW_T_UNSPEC
- }
-#endif ALLOW_T_UNSPEC
- /*
- * Convert the ascii data 'buf' to the proper format
- * based on the type and pack into 'data'.
- */
- switch (type) {
- case T_A:
- n = ntohl((u_long)inet_addr((char *)buf));
- cp = data;
- PUTLONG(n, cp);
- n = sizeof(u_long);
- break;
-
- case T_HINFO:
- n = strlen((char *)buf);
- if (n > 255) {
- syslog(LOG_WARNING,
- "%s: line %d: CPU type too long",
- filename, lineno);
- n = 255;
- }
- data[0] = n;
- bcopy(buf, (char *)data + 1, (int)n);
- n++;
- if (!getword(buf, sizeof(buf), fp))
- break;
- i = strlen((char *)buf);
- if (i > 255) {
- syslog(LOG_WARNING,
- "%s: line %d: OS type too long",
- filename, lineno);
- i = 255;
- }
- data[n] = i;
- bcopy(buf, data + n + 1, i);
- n += i + 1;
- endline(fp);
- break;
-
- case T_SOA:
- case T_MINFO:
- (void) strcpy((char *)data, (char *)buf);
- makename(data, origin);
- cp = data + strlen((char *)data) + 1;
- if (!getword(cp,
- sizeof(data) - (cp - data),fp)) {
- n = cp - data;
- break;
- }
- makename(cp, origin);
- cp += strlen((char *)cp) + 1;
- if (type == T_MINFO) {
- n = cp - data;
- break;
- }
- if (getnonblank(fp) != '(')
- goto err;
- zp->z_serial = getnum(fp);
- n = (u_long) zp->z_serial;
- PUTLONG(n, cp);
- zp->z_refresh = getnum(fp);
- n = (u_long) zp->z_refresh;
- PUTLONG(n, cp);
- if (zp->z_type == Z_SECONDARY)
- zp->z_time = sb.st_mtime + zp->z_refresh;
- zp->z_retry = getnum(fp);
- n = (u_long) zp->z_retry;
- PUTLONG(n, cp);
- zp->z_expire = getnum(fp);
- n = (u_long) zp->z_expire;
- PUTLONG (n, cp);
- zp->z_minimum = getnum(fp);
- n = (u_long) zp->z_minimum;
- PUTLONG (n, cp);
- n = cp - data;
- if (getnonblank(fp) != ')')
- goto err;
- read_soa++;
- endline(fp);
- break;
-
- case T_UID:
- case T_GID:
- n = 0;
- cp = buf;
- while (isdigit(*cp))
- n = n * 10 + (*cp++ - '0');
- if (cp == buf)
- goto err;
- cp = data;
- PUTLONG(n, cp);
- n = sizeof(long);
- break;
-
- case T_WKS:
- /* Address */
- n = ntohl((u_long)inet_addr((char *)buf));
- cp = data;
- PUTLONG(n, cp);
- *cp = getprotocol(fp, filename);
- /* Protocol */
- n = sizeof(u_long) + sizeof(char);
- /* Services */
- n = getservices((int)n, data, fp, filename);
- break;
-
- case T_NS:
- case T_CNAME:
- case T_MB:
- case T_MG:
- case T_MR:
- case T_PTR:
- (void) strcpy((char *)data, (char *)buf);
- makename(data, origin);
- n = strlen((char *)data) + 1;
- break;
-
- case T_UINFO:
- cp = (u_char *)index((char *)buf, '&');
- bzero(data, sizeof(data));
- if ( cp != NULL) {
- (void) strncpy((char *)data,
- (char *)buf, cp - buf);
- op = index(domain, '.');
- if ( op != NULL)
- (void) strncat((char *)data,
- domain,op-domain);
- else
- (void) strcat((char *)data,
- domain);
- (void) strcat((char *)data,
- (char *)++cp);
- } else
- (void) strcpy((char *)data,
- (char *)buf);
- n = strlen((char *)data) + 1;
- break;
- case T_MX:
- n = 0;
- cp = buf;
- while (isdigit(*cp))
- n = n * 10 + (*cp++ - '0');
- /* catch bad values */
- if ((cp == buf) || (n > 65535))
- goto err;
-
- cp = data;
- PUTSHORT((u_short)n, cp);
-
- if (!getword(buf, sizeof(buf), fp))
- break;
- (void) strcpy((char *)cp, (char *)buf);
- makename(cp, origin);
- /* get pointer to place in data */
- cp += strlen((char *)cp) +1;
-
- /* now save length */
- n = (cp - data);
- break;
-
- case T_TXT:
- i = strlen((char *)buf);
- cp = data;
- cp1 = buf;
- /*
- * there is expansion here so make sure we
- * don't overflow data
- */
- if (i > sizeof(data) * 255 / 256) {
- syslog(LOG_WARNING,
- "%s: line %d: TXT record truncated",
- filename, lineno);
- i = sizeof(data) * 255 / 256;
- }
- while (i > 255) {
- *cp++ = 255;
- bcopy(cp1, cp, 255);
- cp += 255;
- cp1 += 255;
- i -= 255;
- }
- *cp++ = i;
- bcopy(cp1, cp, i);
- cp += i;
- n = cp - data;
- endline(fp);
- break;
-#ifdef ALLOW_T_UNSPEC
- case T_UNSPEC:
- {
- int rcode;
- fgets(buf, sizeof(buf), fp);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "loading T_UNSPEC\n");
-#endif DEBUG
- if (rcode = atob(buf,
- strlen((char *)buf), data,
- sizeof(data), &n)) {
- if (rcode == CONV_OVERFLOW) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "Load T_UNSPEC: input buffer overflow\n");
-#endif DEBUG
- errs++;
- syslog(LOG_ERR,
- "Load T_UNSPEC: input buffer overflow");
- } else {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "Load T_UNSPEC: Data in bad atob format\n");
-#endif DEBUG
- errs++;
- syslog(LOG_ERR,
- "Load T_UNSPEC: Data in bad atob format");
- }
- }
- }
- break;
-#endif ALLOW_T_UNSPEC
-
- default:
- goto err;
- }
- dp = savedata(class, type, (u_long)ttl, data, (int)n);
- dp->d_zone = zp - zones;
- dp->d_flags = dataflags;
- if ((c = db_update(domain, dp, dp, dbflags,
- (zp->z_type == Z_CACHE)? fcachetab : hashtab)) < 0) {
-#ifdef DEBUG
- if (debug && (c != DATAEXISTS))
- fprintf(ddt,"update failed\n");
-#endif
- }
- continue;
-
- case ERROR:
- break;
- }
- err:
- errs++;
- syslog(LOG_ERR, "%s: line %d: database format error (%s)",
- filename, lineno, buf);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"%s: line %d: database format error ('%s', %d)\n",
- filename, lineno, buf, n);
-#endif
- while ((c = getc(fp)) != EOF && c != '\n')
- ;
- if (c == '\n')
- lineno++;
- }
- (void) fclose(fp);
- lineno = slineno;
- if (doinginclude == 0) {
- if (didinclude) {
- zp->z_state |= Z_INCLUDE;
- zp->z_ftime = 0;
- } else
- zp->z_ftime = sb.st_mtime;
- zp->z_lastupdate = sb.st_mtime;
- if (zp->z_type != Z_CACHE && read_soa != 1) {
- errs++;
- if (read_soa == 0)
- syslog(LOG_ERR, "%s: no SOA record", filename);
- else
- syslog(LOG_ERR, "%s: multiple SOA records",
- filename);
- }
- }
- if (errs)
- zp->z_state |= Z_DB_BAD;
- return (errs);
-}
-
-int gettoken(fp)
- register FILE *fp;
-{
- register int c;
- char op[32];
-
- for (;;) {
- c = getc(fp);
- top:
- switch (c) {
- case EOF:
- return (EOF);
-
- case '$':
- if (getword(op, sizeof(op), fp)) {
- if (!strcasecmp("include", op))
- return (INCLUDE);
- if (!strcasecmp("origin", op))
- return (ORIGIN);
- }
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"Line %d: Unknown $ option: $%s\n",
- lineno, op);
-#endif
- syslog(LOG_ERR,"Line %d: Unknown $ option: $%s\n",
- lineno, op);
- return (ERROR);
-
- case ';':
- while ((c = getc(fp)) != EOF && c != '\n')
- ;
- goto top;
-
- case ' ':
- case '\t':
- return (CURRENT);
-
- case '.':
- return (DOT);
-
- case '@':
- return (AT);
-
- case '\n':
- lineno++;
- continue;
-
- default:
- (void) ungetc(c, fp);
- return (DNAME);
- }
- }
-}
-
-/*
- * Get next word, skipping blanks & comments.
- */
-getword(buf, size, fp)
- char *buf;
- int size;
- FILE *fp;
-{
- register char *cp;
- register int c;
-
- for (cp = buf; (c = getc(fp)) != EOF; ) {
- if (c == ';') {
- while ((c = getc(fp)) != EOF && c != '\n')
- ;
- c = '\n';
- }
- if (c == '\n') {
- if (cp != buf)
- ungetc(c, fp);
- else
- lineno++;
- break;
- }
- if (isspace(c)) {
- while (isspace(c = getc(fp)) && c != '\n')
- ;
- ungetc(c, fp);
- if (cp != buf) /* Trailing whitespace */
- break;
- continue; /* Leading whitespace */
- }
- if (c == '"') {
- while ((c = getc(fp)) != EOF && c != '"' && c != '\n') {
- if (c == '\\') {
- if ((c = getc(fp)) == EOF)
- c = '\\';
- if (c == '\n')
- lineno++;
- }
- if (cp >= buf+size-1)
- break;
- *cp++ = c;
- }
- if (c == '\n') {
- lineno++;
- break;
- }
- continue;
- }
- if (c == '\\') {
- if ((c = getc(fp)) == EOF)
- c = '\\';
- if (c == '\n')
- lineno++;
- }
- if (cp >= buf+size-1)
- break;
- *cp++ = c;
- }
- *cp = '\0';
- return (cp != buf);
-}
-
-getnum(fp)
- FILE *fp;
-{
- register int c, n;
- int seendigit = 0;
- int seendecimal = 0;
-
- for (n = 0; (c = getc(fp)) != EOF; ) {
- if (isspace(c)) {
- if (c == '\n')
- lineno++;
- if (seendigit)
- break;
- continue;
- }
- if (c == ';') {
- while ((c = getc(fp)) != EOF && c != '\n')
- ;
- if (c == '\n')
- lineno++;
- if (seendigit)
- break;
- continue;
- }
- if (!isdigit(c)) {
- if (c == ')' && seendigit) {
- (void) ungetc(c, fp);
- break;
- }
- if (seendecimal || c != '.') {
- syslog(LOG_ERR, "line %d: expected a number",
- lineno);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"line %d: expected a number",
- lineno);
-#endif
- exit(1); /* XXX why exit */
- } else {
- if (!seendigit)
- n = 1;
- n = n * 1000 ;
- seendigit = 1;
- seendecimal = 1;
- }
- continue;
- }
- n = n * 10 + (c - '0');
- seendigit = 1;
- }
- return (n);
-}
-
-getnonblank(fp)
- FILE *fp;
-{
- register int c;
-
- while ( (c = getc(fp)) != EOF ) {
- if (isspace(c)) {
- if (c == '\n')
- lineno++;
- continue;
- }
- if (c == ';') {
- while ((c = getc(fp)) != EOF && c != '\n')
- ;
- if (c == '\n')
- lineno++;
- continue;
- }
- return(c);
- }
- syslog(LOG_ERR, "line %d: unexpected EOF", lineno);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "line %d: unexpected EOF", lineno);
-#endif
- return (EOF);
-}
-
-/*
- * Take name and fix it according to following rules:
- * "." means root.
- * "@" means current origin.
- * "name." means no changes.
- * "name" means append origin.
- */
-makename(name, origin)
- char *name, *origin;
-{
- int n;
-
- if (origin[0] == '.')
- origin++;
- n = strlen(name);
- if (n == 1) {
- if (name[0] == '.') {
- name[0] = '\0';
- return;
- }
- if (name[0] == '@') {
- (void) strcpy(name, origin);
- return;
- }
- }
- if (n > 0) {
- if (name[n - 1] == '.')
- name[n - 1] = '\0';
- else if (origin[0] != '\0') {
- name[n] = '.';
- (void) strcpy(name + n + 1, origin);
- }
- }
-}
-
-endline(fp)
- register FILE *fp;
-{
- register int c;
- while (c = getc(fp))
- if (c == '\n') {
- (void) ungetc(c,fp);
- break;
- } else if (c == EOF)
- break;
-}
-
-#define MAXPORT 256
-#define MAXLEN 24
-
-getprotocol(fp, src)
- FILE *fp;
- char *src;
-{
- int k;
- char b[MAXLEN];
-
- (void) getword(b, sizeof(b), fp);
-
- k = protocolnumber(b);
- if(k == -1)
- syslog(LOG_ERR, "%s: line %d: unknown protocol: %s.",
- src, lineno, b);
- return(k);
-}
-
-int
-getservices(n, data, fp, src)
- int n;
- char *data, *src;
- FILE *fp;
-{
- int j, ch;
- int k;
- int maxl;
- int bracket;
- char b[MAXLEN];
- char bm[MAXPORT/8];
-
- for (j = 0; j < MAXPORT/8; j++)
- bm[j] = 0;
- maxl = 0;
- bracket = 0;
- while (getword(b, sizeof(b), fp) || bracket) {
- if (feof(fp) || ferror(fp))
- break;
- if (strlen(b) == 0)
- continue;
- if ( b[0] == '(') {
- bracket++;
- continue;
- }
- if ( b[0] == ')') {
- bracket = 0;
- while ((ch = getc(fp)) != EOF && ch != '\n')
- ;
- if (ch == '\n')
- lineno++;
- break;
- }
- k = servicenumber(b);
- if (k == -1) {
- syslog(LOG_WARNING, "%s: line %d: Unknown service '%s'",
- src, lineno, b);
- continue;
- }
- if ((k < MAXPORT) && (k)) {
- bm[k/8] |= (0x80>>(k%8));
- if (k > maxl)
- maxl=k;
- }
- else {
- syslog(LOG_WARNING,
- "%s: line %d: port no. (%d) too big\n",
- src, lineno, k);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "%s: line %d: port no. (%d) too big\n",
- src, lineno, k);
-#endif
- }
- }
- if (bracket)
- syslog(LOG_WARNING, "%s: line %d: missing close paren\n",
- src, lineno);
- maxl = maxl/8+1;
- bcopy(bm, data+n, maxl);
- return(maxl+n);
-}
-
-get_sort_list(fp)
- FILE *fp;
-{
- extern struct netinfo **enettab;
- register struct netinfo *ntp, **end = enettab;
- extern struct netinfo *findnetinfo();
- struct in_addr addr;
- char buf[BUFSIZ];
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"sortlist ");
-#endif
- while (getword(buf, sizeof(buf), fp)) {
- if (strlen(buf) == 0)
- break;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt," %s",buf);
-#endif
- addr.s_addr = inet_addr(buf);
- if (addr.s_addr == (unsigned)-1) {
- /* resolve name to address - XXX */
- continue;
- }
- /* Check for duplicates, then add to linked list */
- if (findnetinfo(addr))
- continue;
- ntp = (struct netinfo *)malloc(sizeof(struct netinfo));
- ntp->my_addr = addr;
- ntp->next = NULL;
- ntp->mask = net_mask(ntp->my_addr);
- ntp->net = ntp->my_addr.s_addr & ntp->mask;
- if (ntp->net != addr.s_addr) {
- struct in_addr tmpaddr;
-
- tmpaddr.s_addr = ntp->net;
- syslog(LOG_WARNING, "sortlist: addr %s != %s", buf,
- inet_ntoa(tmpaddr));
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "\nsortlist: addr %s != %s\n", buf,
- inet_ntoa(tmpaddr));
-#endif
- }
-
- *end = ntp;
- end = &ntp->next;
- }
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"\n");
- if (debug > 2)
- printnetinfo(*enettab);
- if (debug > 4) {
- extern struct netinfo *nettab;
-
- fprintf(ddt, "\nFull sort list:\n");
- printnetinfo(nettab);
- }
-#endif
-}
-
-free_sort_list()
-{
- extern struct netinfo **enettab;
- register struct netinfo *ntp, *next;
-
- for (ntp = *enettab; ntp != NULL; ntp = next) {
- next = ntp->next;
- free((char *)ntp);
- }
- *enettab = NULL;
-}
diff --git a/usr.sbin/named/db_lookup.c b/usr.sbin/named/db_lookup.c
deleted file mode 100644
index 62280fb9030..00000000000
--- a/usr.sbin/named/db_lookup.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (c) 1986 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)db_lookup.c 4.18 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: db_lookup.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-/*
- * Table lookup routines.
- */
-
-#include <sys/param.h>
-#include <arpa/nameser.h>
-#include <stdio.h>
-#include "db.h"
-
-struct hashbuf *hashtab; /* root hash table */
-struct hashbuf *fcachetab; /* hash table of cache read from file */
-
-#ifdef DEBUG
-extern int debug;
-extern FILE *ddt;
-#endif
-
-/*
- * Lookup 'name' and return a pointer to the namebuf;
- * NULL otherwise. If 'insert', insert name into tables.
- * Wildcard lookups are handled.
- */
-struct namebuf *
-nlookup(name, htpp, fname, insert)
- char *name;
- struct hashbuf **htpp;
- char **fname;
- int insert;
-{
- register struct namebuf *np;
- register char *cp;
- register int c;
- register unsigned hval;
- register struct hashbuf *htp;
- struct namebuf *parent = NULL;
-
- htp = *htpp;
- hval = 0;
- *fname = "???";
- for (cp = name; c = *cp++; ) {
- if (c == '.') {
- parent = np = nlookup(cp, htpp, fname, insert);
- if (np == NULL)
- return (NULL);
- if (*fname != cp)
- return (np);
- if ((htp = np->n_hash) == NULL) {
- if (!insert) {
- if (np->n_dname[0] == '*' &&
- np->n_dname[1] == '\0')
- *fname = name;
- return (np);
- }
- htp = savehash((struct hashbuf *)NULL);
- np->n_hash = htp;
- }
- *htpp = htp;
- break;
- }
- hval <<= HASHSHIFT;
- hval += c & HASHMASK;
- }
- c = *--cp;
- *cp = '\0';
- /*
- * Lookup this label in current hash table.
- */
- for (np = htp->h_tab[hval % htp->h_size]; np != NULL; np = np->n_next) {
- if (np->n_hashval == hval &&
- strcasecmp(name, np->n_dname) == 0) {
- *cp = c;
- *fname = name;
- return (np);
- }
- }
- if (!insert) {
- /*
- * Look for wildcard in this hash table.
- * Don't use a cached "*" name as a wildcard,
- * only authoritative.
- */
- hval = ('*' & HASHMASK) % htp->h_size;
- for (np = htp->h_tab[hval]; np != NULL; np = np->n_next) {
- if (np->n_dname[0] == '*' && np->n_dname[1] == '\0' &&
- np->n_data && np->n_data->d_zone != 0) {
- *cp = c;
- *fname = name;
- return (np);
- }
- }
- *cp = c;
- return (parent);
- }
- np = savename(name);
- np->n_parent = parent;
- np->n_hashval = hval;
- hval %= htp->h_size;
- np->n_next = htp->h_tab[hval];
- htp->h_tab[hval] = np;
- /* increase hash table size */
- if (++htp->h_cnt > htp->h_size * 2) {
- *htpp = savehash(htp);
- if (parent == NULL) {
- if (htp == hashtab)
- hashtab = *htpp;
- else
- fcachetab = *htpp;
- }
- else
- parent->n_hash = *htpp;
- htp = *htpp;
- }
- *cp = c;
- *fname = name;
- return (np);
-}
-
-/*
- * Does the data record match the class and type?
- */
-match(dp, class, type)
- register struct databuf *dp;
- register int class, type;
-{
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"match(0x%x, %d, %d) %d, %d\n", dp, class, type,
- dp->d_class, dp->d_type);
-#endif
- if (dp->d_class != class && class != C_ANY)
- return (0);
- if (dp->d_type != type && type != T_ANY)
- return (0);
- return (1);
-}
diff --git a/usr.sbin/named/db_reload.c b/usr.sbin/named/db_reload.c
deleted file mode 100644
index 3f3b0d241b4..00000000000
--- a/usr.sbin/named/db_reload.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 1986, 1988 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)db_reload.c 4.22 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: db_reload.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <stdio.h>
-#include <syslog.h>
-#include "ns.h"
-#include "db.h"
-
-extern time_t resettime;
-
-/*
- * Flush and reload data base.
- */
-
-db_reload()
-{
- extern char *bootfile;
-
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"reload()\n");
-#endif
- syslog(LOG_NOTICE, "reloading nameserver\n");
-
- qflush();
- sqflush();
- fwdtab_free();
- free_sort_list();
- getnetconf();
- ns_init(bootfile);
- time(&resettime);
-}
-
-db_free(htp)
- struct hashbuf *htp;
-{
- register struct databuf *dp, *nextdp;
- register struct namebuf *np, *nextnp;
- struct namebuf **npp, **nppend;
-
- npp = htp->h_tab;
- nppend = npp + htp->h_size;
- while (npp < nppend) {
- for (np = *npp++; np != NULL; np = nextnp) {
- if (np->n_hash != NULL)
- db_free(np->n_hash);
- (void) free((char *)np->n_dname);
- for (dp = np->n_data; dp != NULL; ) {
- nextdp = dp->d_next;
- (void) free((char *)dp);
- dp = nextdp;
- }
- nextnp = np->n_next;
- free((char *)np);
- }
- }
- (void) free((char *)htp);
-}
-
-db_inv_free()
-{
- register struct invbuf *ip;
- register int i, j;
-
- for (i = 0; i < INVHASHSZ; i++)
- for (ip = invtab[i]; ip != NULL; ip = ip->i_next)
- for (j = 0; j < INVBLKSZ; j++)
- ip->i_dname[j] = NULL;
-}
-
-fwdtab_free()
-{
- extern struct fwdinfo *fwdtab;
- struct fwdinfo *fp, *nextfp;
-
- for (fp = fwdtab; fp != NULL; fp = nextfp) {
- nextfp = fp->next;
- free((char *)fp);
- }
- fwdtab = NULL;
-}
diff --git a/usr.sbin/named/db_save.c b/usr.sbin/named/db_save.c
deleted file mode 100644
index d70ecf31f87..00000000000
--- a/usr.sbin/named/db_save.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (c) 1986 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)db_save.c 4.16 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: db_save.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-/*
- * Buffer allocation and deallocation routines.
- */
-
-#include <sys/param.h>
-#include <arpa/nameser.h>
-#include <syslog.h>
-#include <stdio.h>
-#include <string.h>
-#include "db.h"
-
-#ifdef DEBUG
-extern int debug;
-extern FILE *ddt;
-#endif
-
-/*
- * Allocate a name buffer & save name.
- */
-struct namebuf *
-savename(name)
- char *name;
-{
- register struct namebuf *np;
-
- np = (struct namebuf *) malloc(sizeof(struct namebuf));
- if (np == NULL) {
- syslog(LOG_ERR, "savename: %m");
- exit(1);
- }
- np->n_dname = savestr(name);
- np->n_next = NULL;
- np->n_data = NULL;
- np->n_hash = NULL;
- return (np);
-}
-
-/*
- * Allocate a data buffer & save data.
- */
-struct databuf *
-savedata(class, type, ttl, data, size)
- int class, type;
- u_long ttl;
- char *data;
- int size;
-{
- register struct databuf *dp;
-
- if (type == T_NS)
- dp = (struct databuf *)
- malloc((unsigned)DATASIZE(size)+sizeof(u_long));
- else
- dp = (struct databuf *) malloc((unsigned)DATASIZE(size));
- if (dp == NULL) {
- syslog(LOG_ERR, "savedata: %m");
- exit(1);
- }
- dp->d_next = NULL;
- dp->d_type = type;
- dp->d_class = class;
- dp->d_ttl = ttl;
- dp->d_size = size;
- dp->d_mark = 0;
- dp->d_flags = 0;
- dp->d_nstime = 0;
- bcopy(data, dp->d_data, dp->d_size);
- return (dp);
-}
-
-int hashsizes[] = { /* hashtable sizes */
- 2,
- 11,
- 113,
- 337,
- 977,
- 2053,
- 4073,
- 8011,
- 16001,
- 0
-};
-
-/*
- * Allocate a data buffer & save data.
- */
-struct hashbuf *
-savehash(oldhtp)
- register struct hashbuf *oldhtp;
-{
- register struct hashbuf *htp;
- register struct namebuf *np, *nnp, **hp;
- register int n;
- int newsize;
-
- if (oldhtp == NULL)
- newsize = hashsizes[0];
- else {
- for (n = 0; newsize = hashsizes[n++]; )
- if (oldhtp->h_size == newsize) {
- newsize = hashsizes[n];
- break;
- }
- if (newsize == 0)
- newsize = oldhtp->h_size * 2 + 1;
- }
-#ifdef DEBUG
- if(debug > 3)
- fprintf(ddt, "savehash GROWING to %d\n", newsize);
-#endif
- htp = (struct hashbuf *) malloc((unsigned)HASHSIZE(newsize));
- if (htp == NULL) {
- syslog(LOG_ERR, "savehash: %m");
- exit(1);
- }
- htp->h_size = newsize;
- bzero((char *) htp->h_tab, newsize * sizeof(struct hashbuf *));
- if (oldhtp == NULL) {
- htp->h_cnt = 0;
- return (htp);
- }
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,"savehash(%#x) cnt=%d, sz=%d, newsz=%d\n",
- oldhtp, oldhtp->h_cnt, oldhtp->h_size, newsize);
-#endif
- htp->h_cnt = oldhtp->h_cnt;
- for (n = 0; n < oldhtp->h_size; n++) {
- for (np = oldhtp->h_tab[n]; np != NULL; np = nnp) {
- nnp = np->n_next;
- hp = &htp->h_tab[np->n_hashval % htp->h_size];
- np->n_next = *hp;
- *hp = np;
- }
- }
- free((char *) oldhtp);
- return (htp);
-}
-
-/*
- * Allocate an inverse query buffer.
- */
-struct invbuf *
-saveinv()
-{
- register struct invbuf *ip;
-
- ip = (struct invbuf *) malloc(sizeof(struct invbuf));
- if (ip == NULL) {
- syslog(LOG_ERR, "saveinv: %m");
- exit(1);
- }
- ip->i_next = NULL;
- bzero((char *)ip->i_dname, sizeof(ip->i_dname));
- return (ip);
-}
-
-/*
- * Make a copy of a string and return a pointer to it.
- */
-char *
-savestr(str)
- char *str;
-{
- char *cp;
-
- cp = malloc((unsigned)strlen(str) + 1);
- if (cp == NULL) {
- syslog(LOG_ERR, "savestr: %m");
- exit(1);
- }
- (void) strcpy(cp, str);
- return (cp);
-}
diff --git a/usr.sbin/named/db_update.c b/usr.sbin/named/db_update.c
deleted file mode 100644
index 60702cc5d9e..00000000000
--- a/usr.sbin/named/db_update.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright (c) 1986, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)db_update.c 4.28 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: db_update.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <stdio.h>
-#include <syslog.h>
-#include "ns.h"
-#include "db.h"
-
-extern struct timeval tt;
-extern FILE *ddt;
-extern struct sockaddr_in from_addr; /* Source addr of last packet */
-extern int needs_prime_cache;
-
-int max_cache_ttl = (7*24*60*60); /* ONE_WEEK maximum ttl */
-int min_cache_ttl = (5*60); /* 5 minute minimum ttl */
-
-/*
- * Update data base. Flags control the action.
- * Inverse query tables modified.
- */
-db_update(name, odp, newdp, flags, htp)
- char name[];
- struct databuf *odp, *newdp;
- int flags;
- struct hashbuf *htp;
-{
- register struct namebuf *np;
- register struct databuf *dp, *pdp;
- char *fname;
- int foundRR = 0;
-
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"db_update(%s, 0x%x, 0x%x, 0%o, 0x%x)%s\n",
- name, odp, newdp, flags, htp,
- (odp && (odp->d_flags&DB_F_HINT)) ? " hint":"" );
-#endif
- np = nlookup(name, &htp, &fname, newdp != NULL);
- if (np == NULL || fname != name)
- return (NONAME);
-
- /* Reflect certain updates in hint cache also... */
- /* Don't stick data we are authoritative for in hints. */
- if (!(flags & DB_NOHINTS) && (odp != NULL) &&
- (odp->d_zone <= 0) && !(odp->d_flags & DB_F_HINT) &&
- ((name[0] == '\0' && odp->d_type == T_NS) ||
- (odp->d_type == T_A)))
- {
- register struct databuf *dp;
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"db_update: hint '%s' %d\n",
- name, odp->d_ttl);
-#endif
- dp = savedata(odp->d_class, odp->d_type, odp->d_ttl,
- odp->d_data, odp->d_size);
- dp->d_zone = DB_Z_CACHE;
- dp->d_flags = DB_F_HINT;
- if (db_update(name, dp,dp, (flags|DB_NOHINTS), fcachetab) != OK) {
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt, "db_update: hint %x freed\n", dp);
-#endif
- (void) free((char *)dp);
- }
- }
-
- if (odp != NULL) {
- pdp = NULL;
- for (dp = np->n_data; dp != NULL; ) {
- if (!match(dp, odp->d_class, odp->d_type)) {
- if ((dp->d_type == T_CNAME ||
- odp->d_type == T_CNAME) &&
- odp->d_mark == dp->d_mark &&
- zones[odp->d_zone].z_type != Z_CACHE) {
- syslog(LOG_ERR,
- "%s has CNAME and other data (illegal)\n",
- name);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "db_update: %s: CNAME and more (%d, %d)\n",
- name, odp->d_type, dp->d_type);
-#endif
- }
- goto skip;
- }
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"db_update: flags = %#x, sizes = %d, %d (%d)\n",
- flags, odp->d_size, dp->d_size,
- db_cmp(dp, odp));
-#endif
- if (flags & DB_NOTAUTH && dp->d_zone) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "%s attempted update to auth zone %d '%s'\n",
- inet_ntoa(from_addr.sin_addr),
- dp->d_zone, zones[dp->d_zone].z_origin);
-#endif
- return (AUTH);
- }
- if ((flags & DB_NODATA) && !db_cmp(dp, odp)) {
- /* refresh ttl if cache entry */
- if (dp->d_zone == 0) {
- if (odp->d_zone != 0) { /* XXX */
- /* changing cache->auth */
- dp->d_zone = odp->d_zone;
- dp->d_ttl = odp->d_ttl;
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,
- "db_update: cache entry now in auth zone\n");
-#endif
- return (DATAEXISTS);
- }
- fixttl(odp);
- if (odp->d_ttl > dp->d_ttl)
- dp->d_ttl = odp->d_ttl;
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"db_update: new ttl %d, +%d\n",
- dp->d_ttl, dp->d_ttl - tt.tv_sec);
-#endif
- }
- return (DATAEXISTS);
- }
- /*
- * If the old databuf has some data, check that the
- * data matches that in the new databuf (so UPDATED
- * will delete only the matching RR)
- */
- if (odp->d_size > 0) {
- if (db_cmp(dp, odp))
- goto skip;
- }
- foundRR = 1;
- if (flags & DB_DELETE)
- dp = rm_datum(dp, np, pdp);
- else {
-skip: pdp = dp;
- dp = dp->d_next;
- }
- }
- if (!foundRR) {
- if (flags & DB_DELETE)
- return(NODATA);
- if (flags & DB_MEXIST)
- return(NODATA);
- }
- }
- if (newdp == NULL)
- return (OK);
- fixttl(newdp);
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"db_update: adding%s %x\n",
- (newdp->d_flags&DB_F_HINT) ? " hint":"", newdp);
-#endif
- if (!(newdp->d_flags & DB_F_HINT))
- addinv(np, newdp); /* modify inverse query tables */
-
- /* Add to end of list, generally preserving order */
- newdp->d_next = NULL;
- if ((dp = np->n_data) == NULL) {
- np->n_data = newdp;
- return (OK);
- }
- /* XXX: need to check for duplicate WKS records and flag error */
- while (dp->d_next != NULL) {
- if ((flags & DB_NODATA) && !db_cmp(dp, newdp))
- return (DATAEXISTS);
- dp = dp->d_next;
- }
- if ((flags & DB_NODATA) && !db_cmp(dp, newdp))
- return (DATAEXISTS);
- dp->d_next = newdp;
- return (OK);
-}
-
-fixttl(dp)
-register struct databuf *dp;
-{
- if (dp->d_zone == 0 && !(dp->d_flags & DB_F_HINT)) {
- if (dp->d_ttl <= tt.tv_sec)
- return;
- else if (dp->d_ttl < tt.tv_sec+min_cache_ttl)
- dp->d_ttl = tt.tv_sec+min_cache_ttl;
- else if (dp->d_ttl > tt.tv_sec+max_cache_ttl)
- dp->d_ttl = tt.tv_sec+max_cache_ttl;
- }
- return;
-}
-
-struct invbuf *invtab[INVHASHSZ]; /* Inverse query hash table */
-
-/*
- * Add data 'dp' to inverse query tables for name 'np'.
- */
-addinv(np, dp)
- struct namebuf *np;
- struct databuf *dp;
-{
- register struct invbuf *ip;
- register int hval, i;
-
- switch (dp->d_type) {
- case T_A:
- case T_UID:
- case T_GID:
- break;
-
- default:
- return;
- }
-
- hval = dhash(dp->d_data, dp->d_size);
- for (ip = invtab[hval]; ip != NULL; ip = ip->i_next)
- for (i = 0; i < INVBLKSZ; i++)
- if (ip->i_dname[i] == NULL) {
- ip->i_dname[i] = np;
- return;
- }
- ip = saveinv();
- ip->i_next = invtab[hval];
- invtab[hval] = ip;
- ip->i_dname[0] = np;
-}
-
-/*
- * Remove data 'odp' from inverse query table.
- */
-rminv(odp)
- struct databuf *odp;
-{
- register struct invbuf *ip;
- register struct databuf *dp;
- struct namebuf *np;
- register int i;
-
- for (ip = invtab[dhash(odp->d_data, odp->d_size)]; ip != NULL;
- ip = ip->i_next) {
- for (i = 0; i < INVBLKSZ; i++) {
- if ((np = ip->i_dname[i]) == NULL)
- break;
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (!match(dp, odp->d_class, odp->d_type))
- continue;
- if (db_cmp(dp, odp))
- continue;
- while (i < INVBLKSZ-1) {
- ip->i_dname[i] = ip->i_dname[i+1];
- i++;
- }
- ip->i_dname[i] = NULL;
- return;
- }
- }
- }
-}
-
-/*
- * Compute hash value from data.
- */
-dhash(dp, dlen)
- char *dp;
- int dlen;
-{
- register char *cp;
- register unsigned hval;
- register int n;
-
- n = dlen;
- if (n > 8)
- n = 8;
- hval = 0;
- for (cp = dp; --n >= 0; ) {
- hval <<= 1;
- hval += *cp++;
- }
- return (hval % INVHASHSZ);
-}
-
-/*
- * Compare type, class and data from databufs for equivalence.
- * Must be case insensitive for some domain names.
- * Return 0 if equivalent, nonzero otherwise.
- */
-db_cmp(dp1, dp2)
- register struct databuf *dp1, *dp2;
-
-{
- register char *cp1, *cp2;
- int len;
-
- if (dp1->d_type != dp2->d_type || dp1->d_class != dp2->d_class)
- return(1);
- if (dp1->d_size != dp2->d_size)
- return(1);
- if (dp1->d_mark != dp2->d_mark)
- return(1); /* old and new RR's are distinct */
- switch (dp1->d_type) {
-
- case T_A:
- case T_UID:
- case T_GID:
- case T_WKS:
- case T_NULL:
-#ifdef ALLOW_T_UNSPEC
- case T_UNSPEC:
-#endif ALLOW_T_UNSPEC
- return(bcmp(dp1->d_data, dp2->d_data, dp1->d_size));
-
- case T_NS:
- case T_CNAME:
- case T_PTR:
- case T_MB:
- case T_MG:
- case T_MR:
- case T_UINFO:
- return(strcasecmp(dp1->d_data, dp2->d_data));
-
- case T_HINFO:
- cp1 = dp1->d_data;
- cp2 = dp2->d_data;
- len = *cp1;
- if (strncasecmp(++cp1, ++cp2, len))
- return(1);
- cp1 += len;
- cp2 += len;
- len = *cp1;
- return(strncasecmp(++cp1, ++cp2, len));
-
- case T_SOA:
- case T_MINFO:
- if (strcasecmp(dp1->d_data, dp2->d_data))
- return(1);
- cp1 = dp1->d_data + strlen(dp1->d_data) + 1;
- cp2 = dp2->d_data + strlen(dp2->d_data) + 1;
- if (dp1->d_type != T_SOA)
- return(strcasecmp(cp1, cp2));
- if (strcasecmp(cp1, cp2))
- return(1);
- cp1 += strlen(cp1) + 1;
- cp2 += strlen(cp2) + 1;
- return(bcmp(cp1, cp2, sizeof(u_long) * 5));
-
- case T_MX:
- cp1 = dp1->d_data;
- cp2 = dp2->d_data;
- if (*cp1++ != *cp2++ || *cp1++ != *cp2++) /* cmp prio */
- return(1);
- return(strcasecmp(cp1, cp2));
-
- case T_TXT:
- if (dp1->d_size != dp2->d_size)
- return(1);
- return(bcmp(dp1->d_data, dp2->d_data, dp1->d_size));
-
- default:
- return (1);
- }
-}
diff --git a/usr.sbin/named/named.8 b/usr.sbin/named/named.8
deleted file mode 100644
index 06a9b089088..00000000000
--- a/usr.sbin/named/named.8
+++ /dev/null
@@ -1,440 +0,0 @@
-.\" Copyright (c) 1985, 1991 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)named.8 6.9 (Berkeley) 3/16/91
-.\" $Id: named.8,v 1.1 1995/10/18 08:47:50 deraadt Exp $
-.\"
-.Dd March 16, 1991
-.Dt NAMED 8
-.Os BSD 4
-.Sh NAME
-.Nm named
-.Nd Internet domain name server
-.Sh SYNOPSIS
-.Nm named
-.Op Fl d Ar debuglevel
-.Op Fl p Ar port#
-.Oo Op Fl b
-.Ar bootfile Oc
-.Sh DESCRIPTION
-.Nm Named
-is the Internet domain name server.
-See
-.%T RFC883
-for more information on the Internet name-domain system.
-Without any arguments,
-.Nm named
-will read the default boot file
-.Pa /etc/named.boot ,
-read any initial data and listen for queries.
-.Pp
-Options are:
-.Bl -tag -width Ds
-.It Fl d
-Print debugging information.
-A number after the
-.Fl d
-determines the level of
-messages printed.
-.It Fl p
-Use a different port number. The default is the standard port number
-as listed in
-.Pa /etc/services .
-.It Fl b
-Use an alternate boot file. This is optional and allows you to
-specify a file with a leading dash.
-.El
-.Pp
-Any additional argument is taken as the name of the boot file.
-The boot file contains information about where the name server is to get
-its initial data. If multiple boot files are specified, only the last
-is used.
-Lines in the boot file cannot be continued on subsequent lines.
-The following is a small example:
-.Bd -literal
-;
-; boot file for name server
-;
-directory /etc/namedb
-
-; type domain source host/file backup file
-
-cache . root.cache
-primary Berkeley.EDU berkeley.edu.zone
-primary 32.128.IN-ADDR.ARPA ucbhosts.rev
-secondary CC.Berkeley.EDU 128.32.137.8 128.32.137.3 cc.zone.bak
-secondary 6.32.128.IN-ADDR.ARPA 128.32.137.8 128.32.137.3 cc.rev.bak
-primary 0.0.127.IN-ADDR.ARPA localhost.rev
-forwarders 10.0.0.78 10.2.0.78
-; slave
-.Ed
-.Pp
-The ``directory'' line causes the server to change its
-working directory to the directory specified. This can
-be important for the correct processing of
-.Li $INCLUDE
-files
-in primary zone files.
-.Pp
-The
-.Dq cache
-line specifies that data in
-.Dq Pa root.cache
-is to be
-placed in the backup cache.
-Its main use is to specify data such as locations of root domain servers.
-This cache is not used during normal operation,
-but is used as
-.Dq hints
-to find the current root servers.
-The file
-.Dq Pa root.cache
-is in the same format as
-.Dq Pa berkeley.edu.zone .
-There can be more than one
-.Dq cache
-file specified.
-.\"The first such file will be updated under certain conditions to snapshot the
-.\"cache (see
-.\" .Dv SIGQUIT
-.\" below).
-.\"The cache line can also have an optional interval argument after
-.\"the filename.
-.\"If an interval is listed,
-.\"it requests the nameserver to dump the cache contents
-.\"at that interval (in seconds).
-.\"The example above requests the nameserver to dump the cache content
-.\"every 3600 seconds (once an hour).
-.\"The use of automatic cache file updates is not currently recommended
-.\"because of the way the cache is currently managed by the server;
-.\"although the entire cache will be dumped for later reloading,
-.\"most of the cache contents will be ignored when reloaded.
-.\"The exact dump interval will vary
-.\"based on the minimum maintence interval time which is typically about
-.\"5 minutes.
-The cache files are processed in such a way as to preserve the
-time-to-live's
-of data dumped out. Data for the root nameservers is kept artificially
-valid if necessary.
-.Pp
-The first
-.Dq primary
-line states that the file
-.Dq Pa berkeley.edu.zone
-contains
-authoritative data for the
-.Dq Berkeley. Ns Em EDU
-zone.
-The file
-.Dq Pa berkeley.edu.zone
-contains data in the master file format described in
-.%T RFC883 .
-All domain names are relative to the origin, in this
-case,
-.Dq Berkeley. Ns Em EDU
-(see below for a more detailed description).
-The second
-.Dq primary
-line states that the file
-.Dq Pa ucbhosts.rev
-contains
-authoritative data for the domain
-.Dq 32.128.IN-ADDR.ARPA ,
-which is used
-to translate addresses in network 128.32 to hostnames.
-Each master file should begin with an
-.Tn SOA
-record for the zone
-(see below).
-.Pp
-The first ``secondary'' line specifies that all authoritative data
-under
-.Dq CC.Berkeley. Ns Em EDU
-is to be transferred from the name server
-at 128.32.137.8. If the transfer fails it will try 128.32.137.3 and
-continue trying the addresses, up to 10, listed on this line.
-The secondary copy is also authoritative for the specified domain.
-The first non-dotted-quad address on this line will be taken
-as a filename in which to backup the transfered zone.
-The name server will load the zone from this backup file if it exists
-when it boots, providing a complete copy even if the master servers
-are unreachable.
-Whenever a new copy of the domain is received by automatic zone transfer
-from one of the master servers, this file will be updated.
-The second
-.Dq secondary
-line states that the address-to-hostname
-mapping for the subnet 128.32.136 should be obtained from the same list
-of master servers as the previous zone.
-.Pp
-The
-.Dq forwarders
-line specifies the addresses of sitewide servers
-that will accept recursive queries from other servers.
-If the boot file specifies one or more forwarders, then the
-server will send all queries for data not in the cache to the forwarders first.
-Each forwarder will be asked in turn until an answer is returned
-or the list is exhausted. If no answer is forthcoming from a
-forwarder, the server will continue as it would have without
-the forwarders line unless it is in ``slave'' mode.
-The forwarding facility is useful
-to cause a large sitewide cache to be generated on a master,
-and to reduce traffic over links to outside servers.
-It can also be used to allow servers to run that do not have
-access directly to the Internet, but wish to act as though
-they do.
-.Pp
-The ``slave'' line (shown commented out) is used to put the server
-in slave mode. In this mode, the server will only make queries to
-forwarders. This option is normally used on machine that wish to
-run a server but for physical or administrative reasons cannot
-be given access to the Internet, but have access to a host that
-does have access.
-.Pp
-The ``sortlist'' line can be used to indicate networks that are to be
-preferred over other, unlisted networks.
-Queries for host addresses from hosts on the same network as the server
-will receive responses with local network addresses listed first,
-then addresses on the sort list, then other addresses.
-This line is only acted on at initial startup.
-When reloading the nameserver with
-a
-.Dv SIGHUP ,
-this line will be ignored.
-.Pp
-The master file consists of control information
-and a list of resource records for objects in the zone
-of the forms:
-.Bd -literal
-$INCLUDE <filename> <opt_domain>
-$ORIGIN <domain>
-<domain> <opt_ttl> <opt_class> <type> <resource_record_data>
-.Ed
-.Pp
-where
-.Em domain
-is
-.Ql \&.
-for root,
-.Ql \&@
-for the current origin, or a standard domain
-name. If
-.Em domain
-is a standard domain name that does not end with
-.Ql \&. ,
-the current origin
-is appended to the domain. Domain names ending with
-.Ql \&.
-are
-unmodified.
-The
-.Em opt_domain
-field is used to define an origin for the data in an included file.
-It is equivalent to placing a
-.Li $ORIGIN
-statement before the first
-line of the included file. The field is optional.
-Neither the
-.Em opt_domain
-field nor
-.Li $ORIGIN
-statements in the included file modify the current origin
-for this file.
-The
-.Em opt_ttl
-field is an optional integer number for the time-to-live field.
-It defaults to zero, meaning the minimum value specified in the
-SOA record for the zone.
-The
-.Em opt_class
-field is the object address type; currently only one type is supported,
-.Sy IN ,
-for objects connected to the
-.Tn DARPA
-Internet.
-The
-.Em type
-field contains one of the following tokens; the data expected in the
-.Em resource_record_data
-field is in parentheses.
-.Bl -tag -width Fl
-.It A
-a host address (dotted quad)
-.It \&NS
-an authoritative name server (domain)
-.It \&MX
-a mail exchanger (domain)
-.It CNAME
-the canonical name for an alias (domain)
-.It SOA
-marks the start of a zone of authority (domain of originating host,
-domain address of maintainer, a serial number and the following
-parameters in seconds: refresh, retry, expire and minimum TTL
-(see
-.%T RFC883 ) )
-.It \&MB
-a mailbox domain name (domain)
-.It \&MG
-a mail group member (domain)
-.It \&MR
-a mail rename domain name (domain)
-.It NULL
-ra null resource record (no format or data)
-.It \&WKS
-a well know service description (not implemented yet)
-.It \&PTR
-a domain name pointer (domain)
-.It HINFO
-host information (cpu_type OS_type )
-.It MINFO
-mailbox or mail list information (request_domain error_domain)
-.El
-.Pp
-Resource records normally end at the end of a line,
-but may be continued across lines between opening and closing parentheses.
-Comments are introduced by semicolons and continue to the end of the line.
-.Pp
-Each master zone file should begin with an SOA
-record for the zone.
-An example SOA
-record is as follows:
-.Bd -literal
-@ IN SOA ucbvax.Berkeley.EDU. rwh.ucbvax.Berkeley.EDU. (
- 2.89 ; serial
- 10800 ; refresh
- 3600 ; retry
- 3600000 ; expire
- 86400 ) ; minimum
-.Ed
-.Pp
-The SOA
-lists a serial number, which should be changed each time the master
-file is changed.
-Secondary servers check the serial number at intervals specified by the refresh
-time in seconds; if the serial number changes, a zone transfer will be done
-to load the new data.
-If a master server cannot be contacted when a refresh is due, the retry time
-specifies the interval at which refreshes should be attempted until successful.
-If a master server cannot be contacted within the interval given by the
-expire time, all data from the zone is discarded by secondary servers.
-The minimum value is the time-to-live used by records in the file
-with no explicit time-to-live value.
-.Sh NOTES
-The boot file directives ``domain'' and ``suffixes'' have been
-obsoleted by a more useful resolver based implementation of
-suffixing for partially qualified domain names. The prior mechanisms
-could fail under a number of situations, especially when then local
-nameserver did not have complete information.
-.Pp
-The following signals have the specified effect when sent to the
-server process using the
-.Xr kill 1
-command.
-.Bl -tag -width Fl
-.It Dv SIGHUP
-Causes server to read
-.Pa named.boot
-and reload database.
-.It Dv SIGINT
-Dumps current data base and cache to
-.Pa /var/tmp/named_dump.db
-.\".IP
-.\" .Dv SIGQUIT
-.\"Causes the server to checkpoint the cache into the first ``cache'' file.
-.It Dv SIGIOT
-Dumps statistics data into
-.Pa /var/tmp/named.stats
-if the server is
-compiled
-.Dv \-DSTATS .
-Statistics data is appended to the file.
-.It Dv SIGSYS
-Dumps the profiling data in
-.Pa /var/tmp
-if the server is compiled
-with profiling (server forks, chdirs and exits).
-.It Dv SIGTERM
-Dumps the primary and secondary database files.
-Used to save modified data on shutdown if the
-server is compiled with dynamic updating enabled.
-.It Dv SIGUSR1
-Turns on debugging; each
-.Dv SIGUSR1
-increments debug level.
-.Pf ( Dv SIGEMT
-on older systems without
-.Dv SIGUSR1 )
-.It Dv SIGUSR2
-Turns off debugging completely.
-.Pf ( Dv SIGFPE
-on older systems without
-.Dv SIGUSR2 )
-.El
-.Sh FILES
-.Bl -tag -width /var/tmp/named_dump.db -compact
-.It Pa /etc/named.boot
-name server configuration boot file
-.It Pa /var/run/named.pid
-the process id
-.It Pa /var/tmp/named.run
-debug output
-.It Pa /var/tmp/named_dump.db
-dump of the name server database
-.It Pa /var/tmp/named.stats
-nameserver statistics data
-.El
-.Sh SEE ALSO
-.Xr kill 1 ,
-.Xr gethostbyname 3 ,
-.Xr signal 3 ,
-.Xr resolver 3 ,
-.Xr resolv.conf 5 ,
-.Xr hostname 7 ,
-.Rs
-.%T RFC882
-.Re
-.Rs
-.%T RFC883
-.Re
-.Rs
-.%T RFC973
-.Re
-.Rs
-.%T RFC974
-.Re
-.Rs
-.%T "Name Server Operations Guide for BIND"
-.Re
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 .
diff --git a/usr.sbin/named/named.reload b/usr.sbin/named/named.reload
deleted file mode 100644
index d0c45eb9cfb..00000000000
--- a/usr.sbin/named/named.reload
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -
-#
-# @(#)named.reload 5.2 (Berkeley) 6/27/89
-#
-
-kill -s HUP `cat /var/run/named.pid`
diff --git a/usr.sbin/named/named.restart b/usr.sbin/named/named.restart
deleted file mode 100644
index dc215fd1926..00000000000
--- a/usr.sbin/named/named.restart
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh -
-#
-# @(#)named.restart 5.4 (Berkeley) 6/27/89
-#
-
-PATH=/bin:/sbin:/usr/sbin:/usr/bin
-
-kill -s KILL `cat /var/run/named.pid`
-named
diff --git a/usr.sbin/named/ns.h b/usr.sbin/named/ns.h
deleted file mode 100644
index 92c5cd34d5b..00000000000
--- a/usr.sbin/named/ns.h
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (c) 1985, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: @(#)ns.h 4.33 (Berkeley) 8/23/90
- * $Id: ns.h,v 1.1 1995/10/18 08:47:50 deraadt Exp $
- */
-
-/*
- * Global definitions and variables for the name server.
- */
-
-#include <arpa/inet.h>
-#include <string.h>
-
-/*
- * Timeout time should be around 1 minute or so. Using the
- * the current simplistic backoff strategy, the sequence
- * retrys after 4, 8, and 16 seconds. With 3 servers, this
- * dies out in a little more than a minute.
- * (sequence RETRYBASE, 2*RETRYBASE, 4*RETRYBASE... for MAXRETRY)
- */
-#define MINROOTS 2 /* min number of root hints */
-#define NSMAX 16 /* max number of NS addrs to try */
-#define RETRYBASE 4 /* base time between retries */
-#define MAXRETRY 3 /* max number of retries per addr */
-#define MAXCNAMES 8 /* max # of CNAMES tried per addr */
-#define MAXQUERIES 20 /* max # of queries to be made */
- /* (prevent "recursive" loops) */
-#define INIT_REFRESH 600 /* retry time for initial secondary */
- /* contact (10 minutes) */
-
-#define ALPHA 0.7 /* How much to preserver of old response time */
-#define BETA 1.2 /* How much to penalize response time on failure */
-#define GAMMA 0.98 /* How much to decay unused response times */
-
-struct zoneinfo {
- int z_type; /* type of zone */
- int z_auth; /* zone is authoritative */
- char *z_origin; /* root domain name of zone */
- time_t z_time; /* time for next refresh */
- time_t z_lastupdate; /* time of last refresh */
- u_long z_refresh; /* refresh interval */
- u_long z_retry; /* refresh retry interval */
- u_long z_expire; /* expiration time for cached info */
- u_long z_minimum; /* minimum TTL value */
- u_long z_serial; /* changes if zone modified */
- char *z_source; /* source location of data */
- time_t z_ftime; /* modification time of source file */
- int z_addrcnt; /* address count */
- struct in_addr z_addr[NSMAX]; /* list of master servers for zone */
- int z_state; /* state bits; see below */
- u_short z_xferpid; /* xfer child pid */
-#ifdef ALLOW_UPDATES
- int hasChanged; /* non-zero if zone has been updated
- * since last checkpoint
- */
-#endif ALLOW_UPDATES
-};
-
- /* zone types (z_type) */
-#define Z_PRIMARY 1
-#define Z_SECONDARY 2
-#define Z_CACHE 3
-
- /* zone state bits */
-#define Z_AUTH 0x01 /* should replace z_auth */
-#define Z_NEED_XFER 0x02 /* waiting to do xfer */
-#define Z_XFER_RUNNING 0x04 /* asynch. xfer is running */
-#define Z_NEED_RELOAD 0x08 /* waiting to do reload */
-#define Z_SYSLOGGED 0x10 /* have logged timeout */
-#define Z_CHANGED 0x20 /* should replace hasChanged */
-#define Z_FOUND 0x40 /* found in boot file when reloading */
-#define Z_INCLUDE 0x80 /* set if include used in file */
-#define Z_DB_BAD 0x100 /* errors when loading file */
-#define Z_TMP_FILE 0x200 /* backup file for xfer is temporary */
-#ifdef ALLOW_UPDATES
-#define Z_DYNAMIC 0x400 /* allow dynamic updates */
-#define Z_DYNADDONLY 0x800 /* dynamic mode: add new data only */
-#endif ALLOW_UPDATES
-
- /* xfer exit codes */
-#define XFER_UPTODATE 0 /* zone is up-to-date */
-#define XFER_SUCCESS 1 /* performed transfer successfully */
-#define XFER_TIMEOUT 2 /* no server reachable/xfer timeout */
-#define XFER_FAIL 3 /* other failure, has been logged */
-
-/*
- * Structure for recording info on forwarded queries.
- */
-struct qinfo {
- u_short q_id; /* id of query */
- u_short q_nsid; /* id of forwarded query */
- int q_dfd; /* UDP file descriptor */
- struct sockaddr_in q_from; /* requestor's address */
- char *q_msg; /* the message */
- int q_msglen; /* len of message */
- int q_naddr; /* number of addr's in q_addr */
- int q_curaddr; /* last addr sent to */
- struct fwdinfo *q_fwd; /* last forwarder used */
- time_t q_time; /* time to retry */
- struct qinfo *q_next; /* rexmit list (sorted by time) */
- struct qinfo *q_link; /* storage list (random order) */
- struct qserv {
- struct sockaddr_in ns_addr; /* addresses of NS's */
- struct databuf *ns; /* databuf for NS record */
- struct databuf *nsdata; /* databuf for server address */
- struct timeval stime; /* time first query started */
- int nretry; /* # of times addr retried */
- } q_addr[NSMAX]; /* addresses of NS's */
- struct databuf *q_usedns[NSMAX]; /* databuf for NS that we've tried */
- int q_nusedns;
- int q_cname; /* # of cnames found */
- int q_nqueries; /* # of queries required */
- char *q_cmsg; /* the cname message */
- int q_cmsglen; /* len of cname message */
- struct qstream *q_stream; /* TCP stream, null if UDP */
- int q_system; /* boolean, system query */
-};
-
-#define Q_NEXTADDR(qp,n) \
- (((qp)->q_fwd == (struct fwdinfo *)0) ? \
- &(qp)->q_addr[n].ns_addr : &(qp)->q_fwd->fwdaddr)
-
-#define PRIMING_CACHE 42
-#define QINFO_NULL ((struct qinfo *)0)
-
-#ifndef XFER
-extern struct qinfo *qfindid();
-extern struct qinfo *qnew();
-extern struct qinfo *retryqp; /* next query to retry */
-#endif /* XFER */
-
-/*
- * Return codes from ns_forw:
- */
-#define FW_OK 0
-#define FW_DUP 1
-#define FW_NOSERVER 2
-#define FW_SERVFAIL 3
-
-struct qstream {
- int s_rfd; /* stream file descriptor */
- int s_size; /* expected amount of data to recive */
- int s_bufsize; /* amount of data recived in s_buf */
- char *s_buf; /* buffer of recived data */
- char *s_bufp; /* pointer into s_buf of recived data */
- struct qstream *s_next; /* next stream */
- struct sockaddr_in s_from; /* address query came from */
- u_long s_time; /* time stamp of last transaction */
- int s_refcnt; /* number of outstanding queries */
- u_short s_tempsize; /* temporary for size from net */
-};
-
-#define QSTREAM_NULL ((struct qstream *)0)
-extern struct qstream *streamq; /* stream queue */
-
-struct qdatagram {
- int dq_dfd; /* datagram file descriptor */
- struct qdatagram *dq_next; /* next datagram */
- struct in_addr dq_addr; /* address of interface */
-};
-
-#define QDATAGRAM_NULL ((struct qdatagram *)0)
-extern struct qdatagram *datagramq; /* datagram queue */
-
-struct netinfo {
- struct netinfo *next;
- u_long net;
- u_long mask;
- struct in_addr my_addr;
-};
-
-struct fwdinfo {
- struct fwdinfo *next;
- struct sockaddr_in fwdaddr;
-};
-
-struct nets {
- char *name;
- long net;
- struct nets *next;
-};
-
-/*
- * Statistics Defines
- */
-struct stats {
- unsigned long cnt;
- char *description;
-};
-
-/* gross count of UDP packets in and out */
-#define S_INPKTS 0
-#define S_OUTPKTS 1
-/* gross count of queries and inverse queries received */
-#define S_QUERIES 2
-#define S_IQUERIES 3
-#define S_DUPQUERIES 4
-#define S_RESPONSES 5
-#define S_DUPRESP 6
-#define S_RESPOK 7
-#define S_RESPFAIL 8
-#define S_RESPFORMERR 9
-#define S_SYSQUERIES 10
-#define S_PRIMECACHE 11
-#define S_CHECKNS 12
-#define S_BADRESPONSES 13
-#define S_MARTIANS 14
-#define S_NSTATS 15 /* Careful! */
-#ifdef STATS
-extern struct stats stats[S_NSTATS];
-extern unsigned long typestats[T_ANY+1];
-#endif
-
-/*
- * Attempt to configure for type of function returned by signal-catching
- * functions (which signal and sigvec.sv_handler take a pointer to).
- * This can guess for BSD; otherwise, define SIG_FN externally.
- */
-#ifndef SIG_FN
-#ifdef BSD
-#if BSD >= 199006
-#define SIG_FN void /* signal-catching functions return void */
-#else
-#define SIG_FN int /* signal-catching functions return int */
-#endif
-#else /* BSD */
-#define SIG_FN void /* signal-catching functions return void */
-#endif /* BSD */
-#endif
-
-
-#ifdef DEBUG
-extern int debug; /* debug flag */
-extern FILE *ddt; /* debug file discriptor */
-#endif
-#ifndef XFER
-extern int ds; /* datagram socket */
-extern struct qdatagram *dqp;
-extern struct timeval tt; /* place to store time */
-
-extern struct itimerval ival; /* maintenance interval */
-extern struct zoneinfo *zones; /* zone information */
-extern int nzones; /* number of zones in use */
-
-extern int forward_only; /* true on slave server */
-#endif /* XFER */
-
-#define MAX_XFER_TIME 60 * 60 * 2 /* max seconds for an xfer */
-#define XFER_TIME_FUDGE 10 /* MAX_XFER_TIME fudge */
-
-#ifndef XFER
-extern int xfer_running_cnt; /* number of xfers running */
-extern int xfer_deferred_cnt; /* number of deferred xfers */
-#define MAX_XFERS_RUNNING 4 /* max value of xfer_running_cnt */
-#endif /* XFER */
diff --git a/usr.sbin/named/ns_forw.c b/usr.sbin/named/ns_forw.c
deleted file mode 100644
index 9f2e8202050..00000000000
--- a/usr.sbin/named/ns_forw.c
+++ /dev/null
@@ -1,579 +0,0 @@
-/*-
- * Copyright (c) 1986 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)ns_forw.c 4.32 (Berkeley) 3/3/91";*/
-static char rcsid[] = "$Id: ns_forw.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <syslog.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include <stdio.h>
-#include "ns.h"
-#include "db.h"
-
-struct qinfo *qhead = QINFO_NULL; /* head of allocated queries */
-struct qinfo *retryqp = QINFO_NULL; /* list of queries to retry */
-struct fwdinfo *fwdtab; /* list of forwarding hosts */
-
-int nsid; /* next forwarded query id */
-extern int forward_only; /* you are only a slave */
-extern int errno;
-extern u_short ns_port;
-
-time_t retrytime();
-
-/*
- * Forward the query to get the answer since its not in the database.
- * Returns FW_OK if a request struct is allocated and the query sent.
- * Returns FW_DUP if this is a duplicate of a pending request.
- * Returns FW_NOSERVER if there were no addresses for the nameservers.
- * Returns FW_SERVFAIL on malloc error.
- * (no action is taken on errors and qpp is not filled in.)
- */
-ns_forw(nsp, msg, msglen, fp, qsp, dfd, qpp)
- struct databuf *nsp[];
- char *msg;
- int msglen;
- struct sockaddr_in *fp;
- struct qstream *qsp;
- int dfd;
- struct qinfo **qpp;
-{
- register struct qinfo *qp;
- HEADER *hp;
- u_short id;
- extern char *calloc();
-
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"ns_forw()\n");
-#endif
-
- /* Don't forward if we're already working on it. */
- hp = (HEADER *) msg;
- id = hp->id;
- /* Look at them all */
- for (qp = qhead; qp!=QINFO_NULL; qp = qp->q_link) {
- if (qp->q_id == id &&
- bcmp((char *)&qp->q_from, fp, sizeof(qp->q_from)) == 0 &&
- ((qp->q_cmsglen == 0 && qp->q_msglen == msglen &&
- bcmp((char *)qp->q_msg+2, msg+2, msglen-2) == 0) ||
- (qp->q_cmsglen == msglen &&
- bcmp((char *)qp->q_cmsg+2, msg+2, msglen-2) == 0))) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"forw: dropped DUP id=%d\n", ntohs(id));
-#endif
-#ifdef STATS
- stats[S_DUPQUERIES].cnt++;
-#endif
- return (FW_DUP);
- }
- }
-
- qp = qnew();
- if (nslookup(nsp, qp) == 0) {
-#ifdef DEBUG
- if (debug >= 2)
- fprintf(ddt,"forw: no nameservers found\n");
-#endif
- qfree(qp);
- return (FW_NOSERVER);
- }
- qp->q_stream = qsp;
- qp->q_curaddr = 0;
- qp->q_fwd = fwdtab;
- qp->q_dfd = dfd;
- qp->q_id = id;
- hp->id = qp->q_nsid = htons((u_short)++nsid);
- hp->ancount = 0;
- hp->nscount = 0;
- hp->arcount = 0;
- qp->q_from = *fp;
- if ((qp->q_msg = malloc((unsigned)msglen)) == NULL) {
- syslog(LOG_ERR, "forw: %m");
- qfree(qp);
- return (FW_SERVFAIL);
- }
- bcopy(msg, qp->q_msg, qp->q_msglen = msglen);
- if (!qp->q_fwd) {
- hp->rd = 0;
- qp->q_addr[0].stime = tt;
- }
-
- schedretry(qp, retrytime(qp));
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "forw: forw -> %s %d (%d) nsid=%d id=%d %dms retry %d sec\n",
- inet_ntoa(Q_NEXTADDR(qp,0)->sin_addr),
- ds, ntohs(Q_NEXTADDR(qp,0)->sin_port),
- ntohs(qp->q_nsid), ntohs(qp->q_id),
- qp->q_addr[0].nsdata->d_nstime,
- qp->q_time - tt.tv_sec);
- if ( debug >= 10)
- fp_query(msg, ddt);
-#endif
- if (sendto(ds, msg, msglen, 0, (struct sockaddr *)Q_NEXTADDR(qp,0),
- sizeof(struct sockaddr_in)) < 0){
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"error returning msg errno=%d\n",errno);
-#endif
- }
-#ifdef STATS
- stats[S_OUTPKTS].cnt++;
-#endif
- if (qpp)
- *qpp = qp;
- hp->rd = 1;
- return (0);
-}
-
-/*
- * Lookup the address for each nameserver in `nsp' and add it to
- * the list saved in the qinfo structure.
- */
-nslookup(nsp, qp)
- struct databuf *nsp[];
- register struct qinfo *qp;
-{
- register struct namebuf *np;
- register struct databuf *dp, *nsdp;
- register struct qserv *qs;
- register int n, i;
- struct hashbuf *tmphtp;
- char *dname, *fname;
- int oldn, naddr, class, found_arr;
- time_t curtime;
- int qcomp();
-
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"nslookup(nsp=x%x,qp=x%x)\n",nsp,qp);
-#endif
-
- naddr = n = qp->q_naddr;
- curtime = (u_long) tt.tv_sec;
- while ((nsdp = *nsp++) != NULL) {
- class = nsdp->d_class;
- dname = nsdp->d_data;
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"nslookup: NS %s c%d t%d (x%x)\n",
- dname, class, nsdp->d_type, nsdp->d_flags);
-#endif
- /* don't put in people we have tried */
- for (i = 0; i < qp->q_nusedns; i++)
- if (qp->q_usedns[i] == nsdp) {
-#ifdef DEBUG
- if (debug >= 2)
-fprintf(ddt, "skipping used NS w/name %s\n", nsdp->d_data);
-#endif DEBUG
- goto skipserver;
- }
-
- tmphtp = ((nsdp->d_flags & DB_F_HINT) ? fcachetab : hashtab);
- np = nlookup(dname, &tmphtp, &fname, 1);
- if (np == NULL || fname != dname) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"%s: not found %s %x\n",dname,fname,np);
-#endif
- continue;
- }
- found_arr = 0;
- oldn = n;
- /* look for name server addresses */
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (dp->d_type != T_A || dp->d_class != class)
- continue;
- /*
- * Don't use records that may become invalid to
- * reference later when we do the rtt computation.
- * Never delete our safety-belt information!
- */
- if ((dp->d_zone == 0) &&
- (dp->d_ttl < (curtime+900)) &&
- !(dp->d_flags & DB_F_HINT) )
- {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"nslookup: stale entry '%s'\n",
- np->n_dname);
-#endif
- /* Cache invalidate the NS RR's */
- if (dp->d_ttl < curtime)
- delete_all(np, class, T_A);
- n = oldn;
- break;
- }
-
- found_arr++;
- /* don't put in duplicates */
- qs = qp->q_addr;
- for (i = 0; i < n; i++, qs++)
- if (bcmp((char *)&qs->ns_addr.sin_addr,
- dp->d_data, sizeof(struct in_addr)) == 0)
- goto skipaddr;
- qs->ns_addr.sin_family = AF_INET;
- qs->ns_addr.sin_port = ns_port;
- qs->ns_addr.sin_addr =
- *(struct in_addr *)dp->d_data;
- qs->ns = nsdp;
- qs->nsdata = dp;
- qp->q_addr[n].nretry = 0;
- n++;
- if (n >= NSMAX)
- goto out;
- skipaddr: ;
- }
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"nslookup: %d ns addrs\n", n);
-#endif
- if (found_arr == 0 && qp->q_system == 0)
- (void) sysquery(dname, class, T_A);
-skipserver: ;
- }
-out:
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"nslookup: %d ns addrs total\n", n);
-#endif
- qp->q_naddr = n;
- if (n > 1)
- qsort((char *)qp->q_addr, n, sizeof(struct qserv), qcomp);
- return (n - naddr);
-}
-
-qcomp(qs1, qs2)
- struct qserv *qs1, *qs2;
-{
-
- return (qs1->nsdata->d_nstime - qs2->nsdata->d_nstime);
-}
-
-/*
- * Arrange that forwarded query (qp) is retried after t seconds.
- */
-schedretry(qp, t)
- struct qinfo *qp;
- time_t t;
-{
- register struct qinfo *qp1, *qp2;
-
-#ifdef DEBUG
- if (debug > 3) {
- fprintf(ddt,"schedretry(%#x, %dsec)\n", qp, t);
- if (qp->q_time)
- fprintf(ddt,"WARNING: schedretry(%x,%d) q_time already %d\n", qp->q_time);
- }
-#endif
- t += (u_long) tt.tv_sec;
- qp->q_time = t;
-
- if ((qp1 = retryqp) == NULL) {
- retryqp = qp;
- qp->q_next = NULL;
- return;
- }
- if (t < qp1->q_time) {
- qp->q_next = qp1;
- retryqp = qp;
- return;
- }
- while ((qp2 = qp1->q_next) != NULL && qp2->q_time < t)
- qp1 = qp2;
- qp1->q_next = qp;
- qp->q_next = qp2;
-}
-
-/*
- * Unsched is called to remove a forwarded query entry.
- */
-unsched(qp)
- struct qinfo *qp;
-{
- register struct qinfo *np;
-
-#ifdef DEBUG
- if (debug > 3) {
- fprintf(ddt,"unsched(%#x, %d )\n", qp, ntohs(qp->q_id));
- }
-#endif
- if( retryqp == qp ) {
- retryqp = qp->q_next;
- } else {
- for( np=retryqp; np->q_next != QINFO_NULL; np = np->q_next ) {
- if( np->q_next != qp)
- continue;
- np->q_next = qp->q_next; /* dequeue */
- break;
- }
- }
- qp->q_next = QINFO_NULL; /* sanity check */
- qp->q_time = 0;
-}
-
-/*
- * Retry is called to retransmit query 'qp'.
- */
-retry(qp)
- register struct qinfo *qp;
-{
- register int n;
- register HEADER *hp;
-
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,"retry(x%x) id=%d\n", qp, ntohs(qp->q_id));
-#endif
- if((HEADER *)qp->q_msg == NULL) { /*** XXX ***/
- qremove(qp);
- return;
- } /*** XXX ***/
-
- /* try next address */
- n = qp->q_curaddr;
- if (qp->q_fwd) {
- qp->q_fwd = qp->q_fwd->next;
- if (qp->q_fwd)
- goto found;
- /* out of forwarders, try direct queries */
- } else
- ++qp->q_addr[n].nretry;
- if (!forward_only) {
- do {
- if (++n >= qp->q_naddr)
- n = 0;
- if (qp->q_addr[n].nretry < MAXRETRY)
- goto found;
- } while (n != qp->q_curaddr);
- }
- /*
- * Give up. Can't reach destination.
- */
- hp = (HEADER *)(qp->q_cmsg ? qp->q_cmsg : qp->q_msg);
- if (qp->q_system == PRIMING_CACHE) {
- /* Can't give up priming */
- unsched(qp);
- schedretry(qp, (time_t)60*60); /* 1 hour */
- hp->rcode = NOERROR; /* Lets be safe, reset the query */
- hp->qr = hp->aa = 0;
- qp->q_fwd = fwdtab;
- for (n = 0; n < qp->q_naddr; n++)
- qp->q_addr[n].nretry = 0;
- return;
- }
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"give up\n");
-#endif
- n = ((HEADER *)qp->q_cmsg ? qp->q_cmsglen : qp->q_msglen);
- hp->id = qp->q_id;
- hp->qr = 1;
- hp->ra = 1;
- hp->rd = 1;
- hp->rcode = SERVFAIL;
-#ifdef DEBUG
- if (debug >= 10)
- fp_query(qp->q_msg, ddt);
-#endif
- if (send_msg((char *)hp, n, qp)) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"gave up retry(x%x) nsid=%d id=%d\n",
- qp, ntohs(qp->q_nsid), ntohs(qp->q_id));
-#endif
- }
- qremove(qp);
- return;
-
-found:
- if (qp->q_fwd == 0 && qp->q_addr[n].nretry == 0)
- qp->q_addr[n].stime = tt;
- qp->q_curaddr = n;
- hp = (HEADER *)qp->q_msg;
- hp->rd = (qp->q_fwd ? 1 : 0);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"%s(addr=%d n=%d) -> %s %d (%d) nsid=%d id=%d %dms\n",
- (qp->q_fwd ? "reforw" : "resend"),
- n, qp->q_addr[n].nretry,
- inet_ntoa(Q_NEXTADDR(qp,n)->sin_addr),
- ds, ntohs(Q_NEXTADDR(qp,n)->sin_port),
- ntohs(qp->q_nsid), ntohs(qp->q_id),
- qp->q_addr[n].nsdata->d_nstime);
- if ( debug >= 10)
- fp_query(qp->q_msg, ddt);
-#endif
- /* NOSTRICT */
- if (sendto(ds, qp->q_msg, qp->q_msglen, 0,
- (struct sockaddr *)Q_NEXTADDR(qp,n),
- sizeof(struct sockaddr_in)) < 0){
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,"error resending msg errno=%d\n",errno);
-#endif
- }
- hp->rd = 1; /* leave set to 1 for dup detection */
-#ifdef STATS
- stats[S_OUTPKTS].cnt++;
-#endif
- unsched(qp);
- schedretry(qp, qp->q_fwd ? (2*RETRYBASE) : retrytime(qp));
-}
-
-/*
- * Compute retry time for the next server for a query.
- * Use a minimum time of RETRYBASE (4 sec.) or twice the estimated
- * service time; * back off exponentially on retries, but place a 45-sec.
- * ceiling on retry times for now. (This is because we don't hold a reference
- * on servers or their addresses, and we have to finish before they time out.)
- */
-time_t
-retrytime(qp)
-register struct qinfo *qp;
-{
- time_t t;
- struct qserv *ns = &qp->q_addr[qp->q_curaddr];
-
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,"retrytime: nstime %dms.\n",
- ns->nsdata->d_nstime / 1000);
-#endif
- t = (time_t) MAX(RETRYBASE, 2 * ns->nsdata->d_nstime / 1000);
- t <<= ns->nretry;
- t = MIN(t, 45); /* max. retry timeout for now */
-#ifdef notdef
- if (qp->q_system)
- return ((2 * t) + 5); /* system queries can wait. */
-#endif
- return (t);
-}
-
-qflush()
-{
- while (qhead)
- qremove(qhead);
- qhead = QINFO_NULL;
-}
-
-qremove(qp)
-register struct qinfo *qp;
-{
-#ifdef DEBUG
- if(debug > 3)
- fprintf(ddt,"qremove(x%x)\n", qp);
-#endif
- unsched(qp); /* get off queue first */
- qfree(qp);
-}
-
-struct qinfo *
-qfindid(id)
-register u_short id;
-{
- register struct qinfo *qp;
-
-#ifdef DEBUG
- if(debug > 3)
- fprintf(ddt,"qfindid(%d)\n", ntohs(id));
-#endif
- for (qp = qhead; qp!=QINFO_NULL; qp = qp->q_link) {
- if (qp->q_nsid == id)
- return(qp);
- }
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"qp not found\n");
-#endif
- return(NULL);
-}
-
-struct qinfo *
-qnew()
-{
- register struct qinfo *qp;
-
- if ((qp = (struct qinfo *)calloc(1, sizeof(struct qinfo))) == NULL) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"qnew: calloc error\n");
-#endif
- syslog(LOG_ERR, "forw: %m");
- exit(12);
- }
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"qnew(x%x)\n", qp);
-#endif
- qp->q_link = qhead;
- qhead = qp;
- return( qp );
-}
-
-qfree(qp)
-struct qinfo *qp;
-{
- register struct qinfo *np;
-
-#ifdef DEBUG
- if(debug > 3)
- fprintf(ddt,"qfree( x%x )\n", qp);
- if(debug && qp->q_next)
- fprintf(ddt,"WARNING: qfree of linked ptr x%x\n", qp);
-#endif
- if (qp->q_msg)
- free(qp->q_msg);
- if (qp->q_cmsg)
- free(qp->q_cmsg);
- if( qhead == qp ) {
- qhead = qp->q_link;
- } else {
- for( np=qhead; np->q_link != QINFO_NULL; np = np->q_link ) {
- if( np->q_link != qp ) continue;
- np->q_link = qp->q_link; /* dequeue */
- break;
- }
- }
- (void)free((char *)qp);
-}
diff --git a/usr.sbin/named/ns_init.c b/usr.sbin/named/ns_init.c
deleted file mode 100644
index 0e99b972d35..00000000000
--- a/usr.sbin/named/ns_init.c
+++ /dev/null
@@ -1,704 +0,0 @@
-/*-
- * Copyright (c) 1986, 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)ns_init.c 4.38 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: ns_init.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <syslog.h>
-#include <signal.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <errno.h>
-#include <ctype.h>
-#include <string.h>
-#undef nsaddr
-#include "pathnames.h"
-#include "ns.h"
-#include "db.h"
-
-struct zoneinfo *zones; /* zone information */
-int nzones; /* number of zones in use */
-int forward_only = 0; /* run only as a slave */
-char *cache_file;
-char *localdomain; /* "default" for non-dotted names */
-int maint_interval = 15*60; /* minimum ns_maint() interval */
-
-extern int lineno;
-
-
-/*
- * Read boot file for configuration info.
- */
-
-ns_init(bootfile)
- char *bootfile;
-{
- register struct zoneinfo *zp;
- struct zoneinfo *find_zone();
- char buf[BUFSIZ], obuf[BUFSIZ], *source;
- extern char *calloc();
- FILE *fp;
- int type;
- extern int needmaint;
- struct stat f_time;
- static int loads = 0; /* number of times loaded */
- static int tmpnum = 0; /* unique number for tmp zone files */
-#ifdef ALLOW_UPDATES
- char *cp, *flag;
-#endif
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"\nns_init(%s)\n", bootfile);
-#endif
- gettime(&tt);
-
- if ((fp = fopen(bootfile, "r")) == NULL) {
- syslog(LOG_ERR, "%s: %m", bootfile);
- exit(1);
- }
- lineno = 0;
- if (loads == 0) {
- if ((zones =
- (struct zoneinfo *)calloc(64, sizeof(struct zoneinfo)))
- == NULL) {
- syslog(LOG_ERR,
- "Not enough memory to allocate initial zones array");
- exit(1);
- }
- nzones = 1; /* zone zero is cache data */
- /* allocate cache hash table, formerly the root hash table. */
- hashtab = savehash((struct hashbuf *)NULL);
-
- /* allocate root-hints/file-cache hash table */
- fcachetab = savehash((struct hashbuf *)NULL);
- /* init zone data */
- zones[0].z_type = Z_CACHE;
- } else {
- /* Mark previous zones as not yet found in boot file. */
- for (zp = &zones[1]; zp < &zones[nzones]; zp++)
- zp->z_state &= ~Z_FOUND;
- if (localdomain)
- free(localdomain);
- localdomain = NULL;
- free_forwarders();
- forward_only = 0;
- }
-
-#ifdef DEBUG
- if (debug >= 3) {
- fprintf(ddt,"\n content of zones before loading \n");
- content_zone(nzones - 1);
- }
-#endif
- while (!feof(fp) && !ferror(fp)) {
- if (!getword(buf, sizeof(buf), fp))
- continue;
- /* read named.boot keyword and process args */
- if (strcasecmp(buf, "directory") == 0) {
- (void) getword(buf, sizeof(buf), fp);
- if (chdir(buf) < 0) {
- syslog(LOG_CRIT, "directory %s: %m\n",
- buf);
- exit(1);
- }
- continue;
- } else if (strcasecmp(buf, "sortlist") == 0) {
- get_sort_list(fp);
- continue;
- } else if (strcasecmp(buf, "forwarders") == 0) {
- get_forwarders(fp);
- continue;
- } else if (strcasecmp(buf, "slave") == 0) {
- forward_only++;
- endline(fp);
- continue;
- } else if (strcasecmp(buf, "domain") == 0) {
- if (getword(buf, sizeof(buf), fp))
- localdomain = savestr(buf);
- endline(fp);
- continue;
- } else if (strcasecmp(buf, "cache") == 0)
- type = Z_CACHE;
- else if (strcasecmp(buf, "primary") == 0)
- type = Z_PRIMARY;
- else if (strcasecmp(buf, "secondary") == 0)
- type = Z_SECONDARY;
- else {
- syslog(LOG_ERR, "%s: line %d: unknown field '%s'\n",
- bootfile, lineno, buf);
- endline(fp);
- continue;
- }
-
- /*
- * read zone origin
- */
- if (!getword(obuf, sizeof(obuf), fp)) {
- syslog(LOG_ERR, "%s: line %d: missing origin\n",
- bootfile, lineno);
- continue;
- }
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "zone origin %s", obuf);
-#endif
- if (obuf[0] == '.' && obuf[1] == '\0')
- obuf[0] = '\0';
- /*
- * read source file or host address
- */
- if (!getword(buf, sizeof(buf), fp)) {
- syslog(LOG_ERR,
- "%s: line %d: missing source or addr\n",
- bootfile, lineno);
- continue;
- }
-
- /* check for previous instance of this zone (reload) */
- if ((zp = find_zone(obuf, type)) == 0) {
- if (type == Z_CACHE) {
- zp = &zones[0];
- zp->z_origin = "";
- goto gotzone;
- }
- for (zp = &zones[1]; zp < &zones[nzones]; zp++)
- if (zp->z_type == 0)
- goto gotzone;
- /*
- * this code assume that nzones never decreases
- */
- if (nzones % 64 == 0) {
-#ifdef DEBUG
- if (debug > 1)
- fprintf(ddt, "Reallocating zones structure\n");
-#endif DEBUG
- /*
- * Realloc() not used since it might damage zones
- * if an error occurs
- */
- if ((zp = (struct zoneinfo *)
- malloc((64 + nzones) * sizeof(struct zoneinfo)))
- == NULL) {
- syslog(LOG_ERR, "no memory for more zones");
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "Out of memory for new zones\n");
-#endif DEBUG
- endline(fp);
- continue;
- }
- bcopy((char *)zones, (char *)zp,
- nzones * sizeof(struct zoneinfo));
- bzero((char *)&zp[nzones],
- 64 * sizeof(struct zoneinfo));
- free(zones);
- zones = zp;
- }
- zp = &zones[nzones++];
- gotzone:
- zp->z_origin = savestr(obuf);
- zp->z_type = type;
- }
- zp->z_addrcnt = 0;
-
- switch (type) {
- case Z_CACHE:
- source = savestr(buf);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,", source = %s\n", source);
-#endif
- zp->z_refresh = 0; /* by default, no dumping */
- if (getword(buf, sizeof(buf), fp)) {
-#ifdef notyet
- zp->z_refresh = atoi(buf);
- if (zp->z_refresh <= 0) {
- syslog(LOG_ERR,
- "%s: line %d: bad refresh time '%s', ignored\n",
- bootfile, lineno, buf);
- zp->z_refresh = 0;
- } else if (cache_file == NULL)
- cache_file = source;
-#else
- syslog(LOG_WARNING,
- "%s: line %d: cache refresh ignored\n",
- bootfile, lineno);
-#endif
- endline(fp);
- }
- /*
- * If we've loaded this file, and the file has
- * not been modified and contains no $include,
- * then there's no need to reload.
- */
- if (zp->z_source && strcmp(source, zp->z_source) == 0 &&
- (zp->z_state & Z_INCLUDE) == 0 &&
- stat(zp->z_source, &f_time) == 0 &&
- zp->z_ftime == f_time.st_mtime) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "cache is up to date\n");
-#endif
- break; /* zone is already up to date */
- }
-
- /* file has changed, or hasn't been loaded yet */
- if (zp->z_source) {
- free(zp->z_source);
- remove_zone(fcachetab, 0);
- }
- zp->z_source = source;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "reloading zone\n");
-#endif
- (void) db_load(zp->z_source, zp->z_origin, zp, 0);
- break;
-
- case Z_PRIMARY:
- source = savestr(buf);
-#ifdef ALLOW_UPDATES
- if (getword(buf, sizeof(buf), fp)) {
- endline(fp);
- flag = buf;
- while (flag) {
- cp = index(flag, ',');
- if (cp)
- *cp++ = 0;
- if (strcasecmp(flag, "dynamic") == 0)
- zp->z_state |= Z_DYNAMIC;
- else if (strcasecmp(flag, "addonly") == 0)
- zp->z_state |= Z_DYNADDONLY;
- else {
- syslog(LOG_ERR,
- "%s: line %d: bad flag '%s'\n",
- bootfile, lineno, flag);
- }
- flag = cp;
- }
- }
-#else ALLOW_UPDATES
- endline(fp);
-#endif
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,", source = %s\n", source);
-#endif
- /*
- * If we've loaded this file, and the file has
- * not been modified and contains no $include,
- * then there's no need to reload.
- */
- if (zp->z_source && strcmp(source, zp->z_source) == 0 &&
- (zp->z_state & Z_INCLUDE) == 0 &&
- stat(zp->z_source, &f_time) == 0 &&
- zp->z_ftime == f_time.st_mtime) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "zone is up to date\n");
-#endif
- break; /* zone is already up to date */
- }
- if (zp->z_source) {
- free(zp->z_source);
- remove_zone(hashtab, zp - zones);
- }
- zp->z_source = source;
- zp->z_auth = 0;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "reloading zone\n");
-#endif
- if (db_load(zp->z_source, zp->z_origin, zp, 0) == 0)
- zp->z_auth = 1;
-#ifdef ALLOW_UPDATES
- /* Guarantee calls to ns_maint() */
- zp->z_refresh = maint_interval;
-#else ALLOW_UPDATES
- zp->z_refresh = 0; /* no maintenance needed */
- zp->z_time = 0;
-#endif ALLOW_UPDATES
- break;
-
- case Z_SECONDARY:
- source = 0;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"\n\taddrs: ");
-#endif
- do {
- zp->z_addr[zp->z_addrcnt].s_addr =
- inet_addr(buf);
- if (zp->z_addr[zp->z_addrcnt].s_addr ==
- (u_long)-1) {
- source = savestr(buf);
- endline(fp);
- break;
- }
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"%s, ",buf);
-#endif
- if (++zp->z_addrcnt > NSMAX - 1) {
- zp->z_addrcnt = NSMAX - 1;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "\nns.h NSMAX reached\n");
-#endif
- }
- } while (getword(buf, sizeof(buf), fp));
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"addrcnt = %d\n", zp->z_addrcnt);
-#endif
- if (source == 0) {
- /*
- * We will always transfer this zone again
- * after a reload.
- */
- sprintf(buf, "/%s/NsTmp%d", _PATH_TMPDIR,
- tmpnum++);
- source = savestr(buf);
- zp->z_state |= Z_TMP_FILE;
- } else
- zp->z_state &= ~Z_TMP_FILE;
- /*
- * If we had a backup file name, and it was changed,
- * free old zone and start over. If we don't have
- * current zone contents, try again now in case
- * we have a new server on the list.
- */
- if (zp->z_source && strcmp(source, zp->z_source)) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"backup file changed\n");
-#endif
- free(zp->z_source);
- zp->z_source = 0;
- zp->z_auth = 0;
- zp->z_serial = 0; /* force xfer */
- remove_zone(hashtab, zp - zones);
- }
- if (zp->z_source)
- free(source);
- else
- zp->z_source = source;
- if (zp->z_auth == 0)
- zoneinit(zp);
- break;
-
- }
- zp->z_state |= Z_FOUND;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"zone[%d] type %d: '%s'",
- zp-zones, type,
- *(zp->z_origin) == '\0' ? "." : zp->z_origin);
-#endif
- if (zp->z_refresh && zp->z_time == 0)
- zp->z_time = zp->z_refresh + tt.tv_sec;
- if (zp->z_time <= tt.tv_sec)
- needmaint = 1;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, " z_time %d, z_refresh %d\n",
- zp->z_time, zp->z_refresh);
-#endif
- }
- (void) fclose(fp);
- /* erase all old zones that were not found */
- for (zp = &zones[1]; zp < &zones[nzones]; zp++)
- if (zp->z_type && (zp->z_state & Z_FOUND) == 0) {
- remove_zone(hashtab, zp - zones);
- bzero((char *) zp, sizeof(*zp));
-#ifdef DEBUG
- if(debug >=2)
- fprintf(ddt,"\n zone no %d was removed \n", zp - zones);
-#endif
- }
-#ifdef DEBUG
- if(debug >= 2) {
- fprintf(ddt,"\n content of zones after loading \n");
- content_zone(nzones-1);
- }
-#endif
-
- /*
- * Schedule calls to ns_maint().
- */
- if (needmaint == 0)
- sched_maint();
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"exit ns_init()%s\n", needmaint ?
- ", need maintenance immediately" : "");
-#endif
- loads++;
-}
-
-zoneinit(zp)
- register struct zoneinfo *zp;
-{
- extern int needmaint;
- struct stat sb;
-
- /*
- * Try to load zone from backup file,
- * if one was specified and it exists.
- * If not, or if the data are out of date,
- * we will refresh the zone from a primary
- * immediately.
- */
- if (zp->z_source == NULL)
- return;
- if (stat(zp->z_source, &sb) == -1 ||
- db_load(zp->z_source, zp->z_origin, zp, 0) != 0) {
- /*
- * Set zone to be refreshed immediately.
- */
- zp->z_refresh = INIT_REFRESH;
- zp->z_retry = INIT_REFRESH;
- zp->z_time = tt.tv_sec;
- needmaint = 1;
- } else
- zp->z_auth = 1;
-}
-
-#ifdef ALLOW_UPDATES
-/*
- * Look for the authoritative zone with the longest matching RHS of dname
- * and return its zone # or zero if not found.
- */
-findzone(dname, class)
- char *dname;
- int class;
-{
- char *dZoneName, *zoneName, *index();
- int dZoneNameLen, zoneNameLen;
- int maxMatchLen = 0;
- int maxMatchZoneNum = 0;
- int zoneNum;
-
-#ifdef DEBUG
- if (debug >= 4)
- fprintf(ddt, "findzone(dname=%s, class=%d)\n", dname, class);
- if (debug >= 5) {
- fprintf(ddt, "zone dump:\n");
- for (zoneNum = 1; zoneNum < nzones; zoneNum++)
- printzoneinfo(zoneNum);
- }
-#endif DEBUG
-
- dZoneName = index(dname, '.');
- if (dZoneName == NULL)
- dZoneName = ""; /* root */
- else
- dZoneName++; /* There is a '.' in dname, so use remainder of
- string as the zone name */
- dZoneNameLen = strlen(dZoneName);
- for (zoneNum = 1; zoneNum < nzones; zoneNum++) {
- zoneName = (zones[zoneNum]).z_origin;
- zoneNameLen = strlen(zoneName);
- /* The zone name may or may not end with a '.' */
- if (zoneName[zoneNameLen - 1] == '.')
- zoneNameLen--;
- if (dZoneNameLen != zoneNameLen)
- continue;
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt, "about to strncasecmp('%s', '%s', %d)\n",
- dZoneName, zoneName, dZoneNameLen);
-#endif
- if (strncasecmp(dZoneName, zoneName, dZoneNameLen) == 0) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt, "match\n");
-#endif
- /*
- * See if this is as long a match as any so far.
- * Check if "<=" instead of just "<" so that if
- * root domain (whose name length is 0) matches,
- * we use it's zone number instead of just 0
- */
- if (maxMatchLen <= zoneNameLen) {
- maxMatchZoneNum = zoneNum;
- maxMatchLen = zoneNameLen;
- }
- }
-#ifdef DEBUG
- else
- if (debug >= 5)
- fprintf(ddt, "no match\n");
-#endif
- }
-#ifdef DEBUG
- if (debug >= 4)
- fprintf(ddt, "findzone: returning %d\n", maxMatchZoneNum);
-#endif DEBUG
- return (maxMatchZoneNum);
-}
-#endif ALLOW_UPDATES
-
-soa_zinfo(zp, cp, eom)
- register struct zoneinfo *zp;
- register u_char *cp;
- u_char *eom;
-{
- cp += 3 * sizeof(u_short);
- cp += sizeof(u_long);
- cp += dn_skipname(cp, eom);
- cp += dn_skipname(cp, eom);
- GETLONG(zp->z_serial, cp);
- GETLONG(zp->z_refresh, cp);
- gettime(&tt);
- zp->z_time = tt.tv_sec + zp->z_refresh;
- GETLONG(zp->z_retry, cp);
- GETLONG(zp->z_expire, cp);
- GETLONG(zp->z_minimum, cp);
-}
-
-get_forwarders(fp)
- FILE *fp;
-{
- char buf[BUFSIZ];
- register struct fwdinfo *fip = NULL, *ftp = NULL;
- extern struct sockaddr_in nsaddr;
- extern struct fwdinfo *fwdtab;
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"forwarders ");
-#endif
-
- /* on mulitple forwarder lines, move to end of the list */
- if (fwdtab != NULL)
- for (fip = fwdtab; fip->next != NULL; fip = fip->next)
- ;
-
- while (getword(buf, sizeof(buf), fp)) {
- if (strlen(buf) == 0)
- break;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt," %s",buf);
-#endif
- if (ftp == NULL)
- ftp = (struct fwdinfo *)malloc(sizeof(struct fwdinfo));
- if (isdigit(buf[0]) &&
- (ftp->fwdaddr.sin_addr.s_addr = inet_addr(buf)) !=
- (u_long)-1) {
- ftp->fwdaddr.sin_port = nsaddr.sin_port;
- ftp->fwdaddr.sin_family = AF_INET;
- } else {
- syslog(LOG_ERR, "'%s' (ignored, NOT dotted quad)", buf);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt," (ignored, NOT dotted quad)");
-#endif
- continue;
- }
- ftp->next = NULL;
- if (fwdtab == NULL)
- fwdtab = ftp; /* First time only */
- else
- fip->next = ftp;
- fip = ftp;
- ftp = NULL;
- }
- if (ftp)
- free((char *)ftp);
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"\n");
- if (debug > 2)
- for (ftp = fwdtab; ftp != NULL; ftp = ftp->next)
- fprintf(ddt,"ftp x%x %s next x%x\n", ftp,
- inet_ntoa(ftp->fwdaddr.sin_addr), ftp->next);
-#endif
-}
-
-free_forwarders()
-{
- extern struct fwdinfo *fwdtab;
- register struct fwdinfo *ftp, *fnext;
-
- for (ftp = fwdtab; ftp != NULL; ftp = fnext) {
- fnext = ftp->next;
- free((char *)ftp);
- }
- fwdtab = NULL;
-}
-
-struct zoneinfo *
-find_zone(name, type)
- char *name;
- int type;
-{
- register struct zoneinfo *zp;
-
- for (zp = &zones[1]; zp < &zones[nzones]; zp++)
- if (zp->z_type == type && strcasecmp(name, zp->z_origin) == 0) {
-#ifdef DEBUG
- if (debug > 1)
- fprintf(ddt, ", old zone (%d)", zp - zones);
-#endif
- return (zp);
- }
-#ifdef DEBUG
- if(debug > 1)
- fprintf(ddt, ", new zone");
-#endif
- return ((struct zoneinfo *)NULL);
-}
-
-/* prints out the content of zones */
-content_zone(end)
- int end;
-{
- int i;
- for (i = 1; i <= end; i++)
- printzoneinfo(i);
-}
diff --git a/usr.sbin/named/ns_main.c b/usr.sbin/named/ns_main.c
deleted file mode 100644
index ec0c429b002..00000000000
--- a/usr.sbin/named/ns_main.c
+++ /dev/null
@@ -1,1301 +0,0 @@
-/*
- * Copyright (c) 1986, 1989, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1986, 1989, 1990 Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)ns_main.c 4.55 (Berkeley) 7/1/91";*/
-static char rcsid[] = "$Id: ns_main.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-/*
-* Internet Name server (see rfc883 & others).
-*/
-
-#include <sys/param.h>
-#if defined(SYSV)
-#include <fcntl.h>
-#endif SYSV
-#include <sys/file.h>
-#include <sys/time.h>
-#if !defined(SYSV)
-#include <sys/wait.h>
-#endif !SYSV
-#include <sys/resource.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <net/if.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <errno.h>
-#include <signal.h>
-#include <netdb.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-#include <resolv.h>
-#undef nsaddr /* XXX */
-#include "ns.h"
-#include "db.h"
-#include "pathnames.h"
-
-#ifdef BOOTFILE /* default boot file */
-char *bootfile = BOOTFILE;
-#else
-char *bootfile = _PATH_BOOT;
-#endif
-
-#ifdef DEBUGFILE /* default debug output file */
-char *debugfile = DEBUGFILE;
-#else
-char *debugfile = _PATH_DEBUG;
-#endif
-
-#ifdef PIDFILE /* file to store current named PID */
-char *PidFile = PIDFILE;
-#else
-char *PidFile = _PATH_PIDFILE;
-#endif
-
-#ifndef FD_SET
-#define NFDBITS 32
-#define FD_SETSIZE 32
-#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
-#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
-#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
-#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
-#endif
-
-FILE *fp; /* file descriptor for pid file */
-
-#ifdef DEBUG
-FILE *ddt;
-#endif
-
-int debug = 0; /* debugging flag */
-int ds; /* datagram socket */
-int needreload = 0; /* received SIGHUP, need to reload db */
-int needmaint = 0; /* need to call ns_maint()*/
-int needzoneload = 0; /* need to reload secondary zone(s) */
-int needToDoadump = 0; /* need to dump database */
-int needToChkpt = 0; /* need to checkpoint cache */
-int needStatsDump = 0; /* need to dump statistics */
-#ifdef ALLOW_UPDATES
-int needToExit = 0; /* need to exit (may need to doadump
- * first, if database has changed since
- * it was last dumped/booted). Gets
- * set by shutdown signal handler
- * (onintr)
- */
-#endif ALLOW_UPDATES
-
-int priming = 0; /* is cache being primed */
-
-#ifdef SO_RCVBUF
-int rbufsize = 8 * 1024; /* UDP recive buffer size */
-#endif
-
-struct qstream *streamq = QSTREAM_NULL; /* list of open streams */
-struct qdatagram *datagramq = QDATAGRAM_NULL; /* list of datagram interfaces */
-struct sockaddr_in nsaddr;
-struct timeval tt;
-/*
- * We keep a list of favored networks headed by nettab.
- * There are three (possibly empty) parts to this list, in this order:
- * 1. directly attached (sub)nets.
- * 2. logical networks for directly attached subnetted networks.
- * 3. networks from the sort list.
- * The value (*elocal) points at the first entry in the second part of the list,
- * if any, while (*enettab) points at the first entry in the sort list.
- */
-struct netinfo *nettab = NULL;
-struct netinfo **elocal = &nettab;
-struct netinfo **enettab = &nettab;
-struct netinfo netloop;
-struct netinfo *findnetinfo();
-u_long net_mask();
-u_short ns_port;
-struct sockaddr_in from_addr; /* Source addr of last packet */
-int from_len; /* Source addr size of last packet */
-time_t boottime, resettime; /* Used by ns_stats */
-static fd_set mask; /* select mask of open descriptors */
-static int nfds; /* number of fds for select */
-static int vs; /* listening TCP socket */
-
-char **Argv = NULL; /* pointer to argument vector */
-char *LastArg = NULL; /* end of argv */
-
-extern int errno;
-
-#if defined(SYSV)
-getdtablesize()
-{
- return(FD_SETSIZE);
-}
-#endif SYSV
-
-main(argc, argv, envp)
- int argc;
- char *argv[], *envp[];
-{
- register int n, udpcnt;
- register char *arg;
- register struct qstream *sp;
- register struct qdatagram *dqp;
- struct qstream *nextsp;
- int on = 1;
- int rfd, size;
- u_long lasttime, maxctime;
- char buf[BUFSIZ];
-#ifndef SYSV
- struct sigvec vec;
-#endif
-
- fd_set tmpmask;
-
- struct timeval t, *tp;
- struct qstream *candidate = QSTREAM_NULL;
- extern SIG_FN onintr(), maint_alarm(), endxfer();
- extern SIG_FN setdumpflg(), onhup();
- extern SIG_FN setIncrDbgFlg(), setNoDbgFlg(), sigprof();
- extern SIG_FN setchkptflg(), setstatsflg();
- extern int loadxfer();
- extern struct qstream *sqadd();
- extern struct qinfo *qhead;
- extern char Version[];
-
- ns_port = htons(NAMESERVER_PORT);
-
- /*
- ** Save start and extent of argv for setproctitle.
- */
-
- Argv = argv;
- if (envp == 0 || *envp == 0)
- envp = argv;
- while (*envp)
- envp++;
- LastArg = envp[-1] + strlen(envp[-1]);
-
- (void) umask(022);
- while (--argc > 0) {
- arg = *++argv;
- if (*arg == '-') {
- while (*++arg)
- switch (*arg) {
- case 'b':
- if (--argc <= 0)
- usage();
- bootfile = *++argv;
- break;
-
- case 'd':
- ++argv;
-
- if (*argv != 0) {
- if (**argv == '-') {
- argv--;
- break;
- }
- debug = atoi(*argv);
- --argc;
- }
- if (debug <= 0)
- debug = 1;
- setdebug(1);
- break;
-
- case 'p':
- if (--argc <= 0)
- usage();
- ns_port = htons((u_short)atoi(*++argv));
- break;
-
- default:
- usage();
- }
- } else
- bootfile = *argv;
- }
-
- if (!debug)
- for (n = getdtablesize() - 1; n > 2; n--)
- (void) close(n);
-#ifdef DEBUG
- else {
- fprintf(ddt,"Debug turned ON, Level %d\n",debug);
- fprintf(ddt,"Version = %s\t",Version);
- fprintf(ddt,"bootfile = %s\n",bootfile);
- }
-#endif
-
-#ifdef LOG_DAEMON
- openlog("named", LOG_PID|LOG_CONS|LOG_NDELAY, LOG_DAEMON);
-#else
- openlog("named", LOG_PID);
-#endif
-
- /* tuck my process id away */
- fp = fopen(PidFile, "w");
- if (fp != NULL) {
- fprintf(fp, "%d\n", getpid());
- (void) fclose(fp);
- }
- syslog(LOG_NOTICE, "restarted\n");
-
- _res.options &= ~(RES_DEFNAMES | RES_DNSRCH | RES_RECURSE);
-
- nsaddr.sin_family = AF_INET;
- nsaddr.sin_addr.s_addr = INADDR_ANY;
- nsaddr.sin_port = ns_port;
-
- /*
- ** Open stream port.
- */
- if ((vs = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- syslog(LOG_ERR, "socket(SOCK_STREAM): %m");
- exit(1);
- }
- (void)setsockopt(vs, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
- if (bind(vs, (struct sockaddr *)&nsaddr, sizeof(nsaddr))) {
- syslog(LOG_ERR, "bind(vs, %s[%d]): %m",
- inet_ntoa(nsaddr.sin_addr), ntohs(nsaddr.sin_port));
- exit(1);
- }
- (void) listen(vs, 5);
-
- /*
- * Get list of local addresses and set up datagram sockets.
- */
- getnetconf();
-
- /*
- ** Initialize and load database.
- */
- gettime(&tt);
- buildservicelist();
- buildprotolist();
- ns_init(bootfile);
-#ifdef DEBUG
- if (debug) {
- fprintf(ddt, "Network and sort list:\n");
- printnetinfo(nettab);
- }
-#endif DEBUG
-
- time(&boottime);
- resettime = boottime;
-
- (void) signal(SIGHUP, onhup);
-#if defined(SYSV)
- (void) signal(SIGCLD, endxfer);
- (void) signal(SIGALRM, maint_alarm);
-#else
- bzero((char *)&vec, sizeof(vec));
- vec.sv_handler = maint_alarm;
- vec.sv_mask = sigmask(SIGCHLD);
- (void) sigvec(SIGALRM, &vec, (struct sigvec *)NULL);
-
- vec.sv_handler = endxfer;
- vec.sv_mask = sigmask(SIGALRM);
- (void) sigvec(SIGCHLD, &vec, (struct sigvec *)NULL);
-#endif SYSV
- (void) signal(SIGPIPE, SIG_IGN);
- (void) signal(SIGSYS, sigprof);
- (void) signal(SIGINT, setdumpflg);
- (void) signal(SIGQUIT, setchkptflg);
- (void) signal(SIGIOT, setstatsflg);
-
-#ifdef ALLOW_UPDATES
- /* Catch SIGTERM so we can dump the database upon shutdown if it
- has changed since it was last dumped/booted */
- (void) signal(SIGTERM, onintr);
-#endif ALLOW_UPDATES
-
-#if defined(SIGUSR1) && defined(SIGUSR2)
- (void) signal(SIGUSR1, setIncrDbgFlg);
- (void) signal(SIGUSR2, setNoDbgFlg);
-#else SIGUSR1&&SIGUSR2
- (void) signal(SIGEMT, setIncrDbgFlg);
- (void) signal(SIGFPE, setNoDbgFlg);
-#endif SIGUSR1&&SIGUSR2
-
-#ifdef DEBUG
- if (debug) {
- fprintf(ddt,"database initialized\n");
- }
-#endif
-
- t.tv_usec = 0;
-
- /*
- * Fork and go into background now that
- * we've done any slow initialization
- * and are ready to answer queries.
- */
- if (!debug) {
-#if defined(BSD) && BSD >= 199006
- daemon(1, 0);
-#else
- if (fork() > 0)
- exit(0);
- n = open(_PATH_DEVNULL, O_RDONLY);
- (void) dup2(n, 0);
- (void) dup2(n, 1);
- (void) dup2(n, 2);
- if (n > 2)
- (void) close(n);
-#ifdef SYSV
- setpgrp();
-#else
- {
- struct itimerval ival;
-
- /*
- * The open below may hang on pseudo ttys if the person
- * who starts named logs out before this point.
- *
- * needmaint may get set inapropriately if the open
- * hangs, but all that will happen is we will see that
- * no maintenance is required.
- */
- bzero((char *)&ival, sizeof(ival));
- ival.it_value.tv_sec = 120;
- (void) setitimer(ITIMER_REAL, &ival,
- (struct itimerval *)NULL);
- n = open(_PATH_TTY, O_RDWR);
- ival.it_value.tv_sec = 0;
- (void) setitimer(ITIMER_REAL, &ival,
- (struct itimerval *)NULL);
- if (n > 0) {
- (void) ioctl(n, TIOCNOTTY, (char *)NULL);
- (void) close(n);
- }
- }
-#endif /* SYSV */
-#endif /* BSD > 199006 */
- }
- /* tuck my process id away again */
- fp = fopen(PidFile, "w");
- if (fp != NULL) {
- fprintf(fp, "%d\n", getpid());
- (void) fclose(fp);
- }
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"Ready to answer queries.\n");
-#endif
- prime_cache();
- FD_ZERO(&mask);
- FD_SET(vs, &mask);
- if (vs >= nfds)
- nfds = vs + 1;
- for (dqp = datagramq; dqp != QDATAGRAM_NULL; dqp = dqp->dq_next) {
- FD_SET(dqp->dq_dfd, &mask);
- if (dqp->dq_dfd >= nfds)
- nfds = dqp->dq_dfd + 1;
- }
- for (;;) {
-#ifdef DEBUG
- if (ddt && debug == 0) {
- fprintf(ddt,"Debug turned OFF\n");
- (void) fclose(ddt);
- ddt = 0;
- }
-#endif
-#ifdef ALLOW_UPDATES
- if (needToExit) {
- struct zoneinfo *zp;
- sigblock(~0); /*
- * Block all blockable signals
- * to ensure a consistant
- * state during final dump
- */
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "Received shutdown signal\n");
-#endif DEBUG
- for (zp = zones; zp < &zones[nzones]; zp++) {
- if (zp->hasChanged)
- zonedump(zp);
- }
- exit(0);
- }
-#endif ALLOW_UPDATES
- if (needreload) {
- needreload = 0;
- db_reload();
- }
-#ifdef STATS
- if (needStatsDump) {
- needStatsDump = 0;
- ns_stats();
- }
-#endif STATS
- if (needzoneload) {
- needzoneload = 0;
- loadxfer();
- }
- if (needmaint) {
- needmaint = 0;
- ns_maint();
- }
- if(needToChkpt) {
- needToChkpt = 0;
- doachkpt();
- }
- if(needToDoadump) {
- needToDoadump = 0;
- doadump();
- }
- /*
- ** Wait until a query arrives
- */
- if (retryqp != NULL) {
- gettime(&tt);
- t.tv_sec = (long) retryqp->q_time - tt.tv_sec;
- if (t.tv_sec <= 0) {
- retry(retryqp);
- continue;
- }
- tp = &t;
- } else
- tp = NULL;
- tmpmask = mask;
- n = select(nfds, &tmpmask, (fd_set *)NULL, (fd_set *)NULL, tp);
- if (n < 0) {
- if (errno == EINTR)
- continue;
- syslog(LOG_ERR, "select: %m");
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"select error\n");
-#endif
- ;
- }
- if (n == 0)
- continue;
-
- for (dqp = datagramq; dqp != QDATAGRAM_NULL;
- dqp = dqp->dq_next) {
- if (FD_ISSET(dqp->dq_dfd, &tmpmask))
- for(udpcnt = 0; udpcnt < 25; udpcnt++) {
- from_len = sizeof(from_addr);
- if ((n = recvfrom(dqp->dq_dfd, buf, sizeof(buf), 0,
- (struct sockaddr *)&from_addr, &from_len)) < 0)
- {
- if ((n == -1) && (errno == EWOULDBLOCK))
- break;
- syslog(LOG_WARNING, "recvfrom: %m");
- break;
- }
-#ifdef STATS
- stats[S_INPKTS].cnt++;
-#endif
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "\ndatagram from %s port %d, fd %d, len %d\n",
- inet_ntoa(from_addr.sin_addr),
- ntohs(from_addr.sin_port), dqp->dq_dfd, n);
- if (debug >= 10)
- fp_query(buf, ddt);
-#endif
- /*
- * Consult database to get the answer.
- */
- gettime(&tt);
- ns_req(buf, n, PACKETSZ, QSTREAM_NULL, &from_addr,
- dqp->dq_dfd);
- }
- }
- /*
- ** Process stream connection
- */
- if (FD_ISSET(vs, &tmpmask)) {
- from_len = sizeof(from_addr);
- rfd = accept(vs, (struct sockaddr *)&from_addr, &from_len);
- gettime(&tt);
- if (rfd < 0 && errno == EMFILE && streamq != NULL) {
- maxctime = 0;
- candidate = QSTREAM_NULL;
- for (sp = streamq; sp != QSTREAM_NULL;
- sp = nextsp) {
- nextsp = sp->s_next;
- if (sp->s_refcnt != 0)
- continue;
- lasttime = tt.tv_sec - sp->s_time;
- if (lasttime >= 900)
- sqrm(sp);
- else if (lasttime > maxctime) {
- candidate = sp;
- maxctime = lasttime;
- }
- }
- rfd = accept(vs, (struct sockaddr *)&from_addr, &from_len);
- if ((rfd < 0) && (errno == EMFILE) &&
- candidate != QSTREAM_NULL) {
- sqrm(candidate);
- rfd = accept(vs, (struct sockaddr *)&from_addr, &from_len);
- }
- }
- if (rfd < 0) {
- syslog(LOG_WARNING, "accept: %m");
- continue;
- }
- (void) fcntl(rfd, F_SETFL, O_NONBLOCK);
- (void) setsockopt(rfd, SOL_SOCKET, SO_KEEPALIVE,
- (char *)&on, sizeof(on));
- if ((sp = sqadd()) == QSTREAM_NULL) {
- (void) close(rfd);
- continue;
- }
- sp->s_rfd = rfd; /* stream file descriptor */
- sp->s_size = -1; /* amount of data to receive */
- gettime(&tt);
- sp->s_time = tt.tv_sec; /* last transaction time */
- sp->s_from = from_addr; /* address to respond to */
- sp->s_bufp = (char *)&sp->s_tempsize;
- FD_SET(rfd, &mask);
- FD_SET(rfd, &tmpmask);
- if (rfd >= nfds)
- nfds = rfd + 1;
-#ifdef DEBUG
- if (debug) {
- fprintf(ddt,
- "\nTCP connection from %s port %d (fd %d)\n",
- inet_ntoa(sp->s_from.sin_addr),
- ntohs(sp->s_from.sin_port), rfd);
- }
-#endif
- }
-#ifdef DEBUG
- if (debug > 2 && streamq)
- fprintf(ddt,"streamq = x%x\n",streamq);
-#endif
- if (streamq != NULL) {
- for (sp = streamq; sp != QSTREAM_NULL; sp = nextsp) {
- nextsp = sp->s_next;
- if (FD_ISSET(sp->s_rfd, &tmpmask)) {
-#ifdef DEBUG
- if (debug > 5) {
- fprintf(ddt,
- "sp x%x rfd %d size %d time %d ",
- sp, sp->s_rfd, sp->s_size,
- sp->s_time );
- fprintf(ddt," next x%x \n", sp->s_next );
- fprintf(ddt,"\tbufsize %d",sp->s_bufsize);
- fprintf(ddt," buf x%x ",sp->s_buf);
- fprintf(ddt," bufp x%x\n",sp->s_bufp);
- }
-#endif DEBUG
- if (sp->s_size < 0) {
- size = sizeof(u_short) -
- (sp->s_bufp - (char *)&sp->s_tempsize);
- while (size > 0 &&
- (n = read(sp->s_rfd, sp->s_bufp, size)) > 0){
- sp->s_bufp += n;
- size -= n;
- }
- if ((n == -1) && (errno == EWOULDBLOCK))
- continue;
- if (n <= 0) {
- sqrm(sp);
- continue;
- }
- if ((sp->s_bufp - (char *)&sp->s_tempsize) ==
- sizeof(u_short)) {
- sp->s_size = htons(sp->s_tempsize);
- if (sp->s_bufsize == 0) {
- if ( (sp->s_buf = malloc(BUFSIZ))
- == NULL) {
- sp->s_buf = buf;
- sp->s_size = sizeof(buf);
- } else {
- sp->s_bufsize = BUFSIZ;
- }
- }
- if (sp->s_size > sp->s_bufsize &&
- sp->s_bufsize != 0) {
- if ((sp->s_buf = realloc(
- (char *)sp->s_buf,
- (unsigned)sp->s_size)) == NULL){
- sp->s_buf = buf;
- sp->s_bufsize = 0;
- sp->s_size = sizeof(buf);
- } else {
- sp->s_bufsize = sp->s_size;
- }
- }
- sp->s_bufp = sp->s_buf;
- }
- }
- gettime(&tt);
- sp->s_time = tt.tv_sec;
- while (sp->s_size > 0 &&
- (n = read(sp->s_rfd, sp->s_bufp, sp->s_size)) > 0)
- {
- sp->s_bufp += n;
- sp->s_size -= n;
- }
- /*
- * we don't have enough memory for the query.
- * if we have a query id, then we will send an
- * error back to the user.
- */
- if (sp->s_bufsize == 0 &&
- (sp->s_bufp - sp->s_buf > sizeof(u_short))) {
- HEADER *hp;
-
- hp = (HEADER *)sp->s_buf;
- hp->qr = 1;
- hp->ra = 1;
- hp->ancount = 0;
- hp->qdcount = 0;
- hp->nscount = 0;
- hp->arcount = 0;
- hp->rcode = SERVFAIL;
- (void) writemsg(sp->s_rfd, sp->s_buf,
- sizeof(HEADER));
- continue;
- }
- if ((n == -1) && (errno == EWOULDBLOCK))
- continue;
- if (n <= 0) {
- sqrm(sp);
- continue;
- }
- /*
- * Consult database to get the answer.
- */
- if (sp->s_size == 0) {
- sq_query(sp);
- ns_req(sp->s_buf,
- sp->s_bufp - sp->s_buf,
- sp->s_bufsize, sp,
- &sp->s_from, -1);
- sp->s_bufp = (char *)&sp->s_tempsize;
- sp->s_size = -1;
- continue;
- }
- }
- }
- }
- }
- /* NOTREACHED */
-}
-
-usage()
-{
- fprintf(stderr, "Usage: named [-d #] [-p port] [{-b} bootfile]\n");
- exit(1);
-}
-
-getnetconf()
-{
- register struct netinfo *ntp;
- struct netinfo *ontp;
- struct ifconf ifc;
- struct ifreq ifreq, *ifr;
- struct qdatagram *dqp;
- static int first = 1;
- char buf[BUFSIZ], *cp, *cplim;
- u_long nm;
-
- ifc.ifc_len = sizeof(buf);
- ifc.ifc_buf = buf;
- if (ioctl(vs, SIOCGIFCONF, (char *)&ifc) < 0) {
- syslog(LOG_ERR, "get interface configuration: %m");
- exit(1);
- }
- ntp = NULL;
-#ifdef AF_LINK
-#define max(a, b) (a > b ? a : b)
-#define size(p) max((p).sa_len, sizeof(p))
-#else
-#define size(p) (sizeof (p))
-#endif
- cplim = buf + ifc.ifc_len; /*skip over if's with big ifr_addr's */
- for (cp = buf; cp < cplim;
- cp += sizeof (ifr->ifr_name) + size(ifr->ifr_addr)) {
-#undef size
- ifr = (struct ifreq *)cp;
- if (ifr->ifr_addr.sa_family != AF_INET ||
- ((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr.s_addr == 0)
- continue;
- ifreq = *ifr;
- /*
- * Don't test IFF_UP, packets may still be received at this
- * address if any other interface is up.
- */
- if (ioctl(vs, SIOCGIFADDR, (char *)&ifreq) < 0) {
- syslog(LOG_ERR, "get interface addr: %m");
- continue;
- }
- /* build datagram queue */
- /*
- * look for an already existing source interface address.
- * This happens mostly when reinitializing. Also, if
- * the machine has multiple point to point interfaces, then
- * the local address may appear more than once.
- */
- for (dqp=datagramq; dqp != NULL; dqp = dqp->dq_next)
- if (((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr.s_addr
- == dqp->dq_addr.s_addr) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "dup interface address %s on %s\n",
- inet_ntoa(dqp->dq_addr), ifreq.ifr_name);
-#endif
- break;
- }
- if (dqp != NULL)
- continue;
-
- if ((dqp = (struct qdatagram *)calloc(1,
- sizeof(struct qdatagram))) == NULL) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"getnetconf: malloc error\n");
-#endif
- syslog(LOG_ERR, "getnetconf: Out Of Memory");
- exit(12);
- }
- dqp->dq_next = datagramq;
- datagramq = dqp;
- dqp->dq_addr = ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr;
- opensocket(dqp);
-
- /*
- * Add interface to list of directly-attached (sub)nets
- * for use in sorting addresses.
- */
- if (ntp == NULL)
- ntp = (struct netinfo *)malloc(sizeof(struct netinfo));
- ntp->my_addr =
- ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr;
-#ifdef SIOCGIFNETMASK
- if (ioctl(vs, SIOCGIFNETMASK, (char *)&ifreq) < 0) {
- syslog(LOG_ERR, "get netmask: %m");
- ntp->mask = net_mask(ntp->my_addr);
- } else
- ntp->mask = ((struct sockaddr_in *)
- &ifreq.ifr_addr)->sin_addr.s_addr;
-#else
- /* 4.2 does not support subnets */
- ntp->mask = net_mask(ntp->my_addr);
-#endif
- if (ioctl(vs, SIOCGIFFLAGS, (char *)&ifreq) < 0) {
- syslog(LOG_ERR, "get interface flags: %m");
- continue;
- }
-#ifdef IFF_LOOPBACK
- if (ifreq.ifr_flags & IFF_LOOPBACK)
-#else
- /* test against 127.0.0.1 (yuck!!) */
- if (ntp->my_addr.s_addr == htonl(0x7F000001))
-#endif
- {
- if (netloop.my_addr.s_addr == 0) {
- netloop.my_addr = ntp->my_addr;
- netloop.mask = 0xffffffff;
- netloop.net = ntp->my_addr.s_addr;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"loopback address: x%lx\n",
- netloop.my_addr.s_addr);
-#endif DEBUG
- }
- continue;
- } else if ((ifreq.ifr_flags & IFF_POINTOPOINT)) {
- if (ioctl(vs, SIOCGIFDSTADDR, (char *)&ifreq) < 0) {
- syslog(LOG_ERR, "get dst addr: %m");
- continue;
- }
- ntp->mask = 0xffffffff;
- ntp->net = ((struct sockaddr_in *)
- &ifreq.ifr_addr)->sin_addr.s_addr;
- } else {
- ntp->net = ntp->mask & ntp->my_addr.s_addr;
- }
- /*
- * Place on end of list of locally-attached (sub)nets,
- * but before logical nets for subnetted nets.
- */
- ntp->next = *elocal;
- *elocal = ntp;
- if (elocal == enettab)
- enettab = &ntp->next;
- elocal = &ntp->next;
- ntp = NULL;
- }
- if (ntp)
- (void) free((char *)ntp);
-
- /*
- * Create separate qdatagram structure for socket
- * wildcard address.
- */
- if (first) {
- if ((dqp = (struct qdatagram *)calloc(1, sizeof(*dqp))) == NULL) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"getnetconf: malloc error\n");
-#endif
- syslog(LOG_ERR, "getnetconf: Out Of Memory");
- exit(12);
- }
- dqp->dq_next = datagramq;
- datagramq = dqp;
- dqp->dq_addr.s_addr = INADDR_ANY;
- opensocket(dqp);
- ds = dqp->dq_dfd; /* used externally */
- }
-
- /*
- * Compute logical networks to which we're connected
- * based on attached subnets;
- * used for sorting based on network configuration.
- */
- for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
- nm = net_mask(ntp->my_addr);
- if (nm != ntp->mask) {
- if (findnetinfo(ntp->my_addr))
- continue;
- ontp = (struct netinfo *)malloc(sizeof(struct netinfo));
- if (ontp == NULL) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"getnetconf: malloc error\n");
-#endif
- syslog(LOG_ERR, "getnetconf: Out Of Memory");
- exit(12);
- }
- ontp->my_addr = ntp->my_addr;
- ontp->mask = nm;
- ontp->net = ontp->my_addr.s_addr & nm;
- ontp->next = *enettab;
- *enettab = ontp;
- enettab = &ontp->next;
- }
- }
- first = 0;
-}
-
-/*
- * Find netinfo structure for logical network implied by address "addr",
- * if it's on list of local/favored networks.
- */
-struct netinfo *
-findnetinfo(addr)
- struct in_addr addr;
-{
- register struct netinfo *ntp;
- u_long net, mask;
-
- mask = net_mask(addr);
- net = addr.s_addr & mask;
- for (ntp = nettab; ntp != NULL; ntp = ntp->next)
- if (ntp->net == net && ntp->mask == mask)
- return (ntp);
- return ((struct netinfo *) NULL);
-}
-
-#ifdef DEBUG
-printnetinfo(ntp)
- register struct netinfo *ntp;
-{
- for ( ; ntp != NULL; ntp = ntp->next) {
- fprintf(ddt,"net x%lx mask x%lx", ntp->net, ntp->mask);
- fprintf(ddt," my_addr x%lx", ntp->my_addr.s_addr);
- fprintf(ddt," %s\n", inet_ntoa(ntp->my_addr));
- }
-}
-#endif
-
-opensocket(dqp)
- register struct qdatagram *dqp;
-{
- int on = 1;
-
- /*
- * Open datagram sockets bound to interface address.
- */
- if ((dqp->dq_dfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- syslog(LOG_ERR, "socket(SOCK_DGRAM): %m");
- exit(1);
- }
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"dqp->dq_addr %s d_dfd %d\n",
- inet_ntoa(dqp->dq_addr), dqp->dq_dfd);
-#endif DEBUG
- (void)setsockopt(dqp->dq_dfd, SOL_SOCKET, SO_REUSEADDR,
- (char *)&on, sizeof(on));
-#ifdef SO_RCVBUF
- (void)setsockopt(dqp->dq_dfd, SOL_SOCKET, SO_RCVBUF,
- (char *)&rbufsize, sizeof(rbufsize));
-#endif SO_RCVBUF
- (void) fcntl(dqp->dq_dfd, F_SETFL, O_NONBLOCK);
- /*
- * NOTE: Some versions of SunOS have problems with the following
- * call to bind. Bind still seems to function on these systems
- * if you comment out the exit inside the if. This may cause
- * Suns with multiple interfaces to reply strangely.
- */
- nsaddr.sin_addr = dqp->dq_addr;
- if (bind(dqp->dq_dfd, (struct sockaddr *)&nsaddr, sizeof(nsaddr))) {
- syslog(LOG_ERR, "bind(dfd %d, %s[%d]): %m",
- dqp->dq_dfd, inet_ntoa(nsaddr.sin_addr),
- ntohs(nsaddr.sin_port));
-#if !defined(sun)
- exit(1);
-#endif
- }
-}
-
-/*
-** Set flag saying to reload database upon receiving SIGHUP.
-** Must make sure that someone isn't walking through a data
-** structure at the time.
-*/
-
-SIG_FN
-onhup()
-{
-#if defined(SYSV)
- (void)signal(SIGHUP, onhup);
-#endif SYSV
- needreload = 1;
-}
-
-/*
-** Set flag saying to call ns_maint()
-** Must make sure that someone isn't walking through a data
-** structure at the time.
-*/
-
-SIG_FN
-maint_alarm()
-{
-#if defined(SYSV)
- (void)signal(SIGALRM, maint_alarm);
-#endif SYSV
- needmaint = 1;
- }
-
-
-#ifdef ALLOW_UPDATES
-/*
- * Signal handler to schedule shutdown. Just set flag, to ensure a consistent
- * state during dump.
- */
-SIG_FN
-onintr()
-{
- needToExit = 1;
-}
-#endif ALLOW_UPDATES
-
-/*
- * Signal handler to schedule a data base dump. Do this instead of dumping the
- * data base immediately, to avoid seeing it in a possibly inconsistent state
- * (due to updates), and to avoid long disk I/O delays at signal-handler
- * level
- */
-SIG_FN
-setdumpflg()
-{
-#if defined(SYSV)
- (void)signal(SIGINT, setdumpflg);
-#endif SYSV
- needToDoadump = 1;
-}
-
-/*
-** Turn on or off debuging by open or closeing the debug file
-*/
-
-setdebug(code)
-int code;
-{
-#if defined(lint) && !defined(DEBUG)
- code = code;
-#endif
-#ifdef DEBUG
-
- if (code) {
- ddt = freopen(debugfile, "w+", stderr);
- if ( ddt == NULL) {
- syslog(LOG_WARNING, "can't open debug file %s: %m",
- debugfile);
- debug = 0;
- } else {
-#if defined(SYSV)
- setvbuf(ddt, NULL, _IOLBF, BUFSIZ);
-#else
- setlinebuf(ddt);
-#endif
- (void) fcntl(fileno(ddt), F_SETFL, FAPPEND);
- }
- } else
- debug = 0;
- /* delay closing ddt, we might interrupt someone */
-#endif
-}
-
-/*
-** Catch a special signal and set debug level.
-**
-** If debuging is off then turn on debuging else increment the level.
-**
-** Handy for looking in on long running name servers.
-*/
-
-SIG_FN
-setIncrDbgFlg()
-{
-#if defined(SYSV)
- (void)signal(SIGUSR1, setIncrDbgFlg);
-#endif SYSV
-#ifdef DEBUG
- if (debug == 0) {
- debug++;
- setdebug(1);
- }
- else {
- debug++;
- }
- fprintf(ddt,"Debug turned ON, Level %d\n",debug);
-#endif
-}
-
-/*
-** Catch a special signal to turn off debugging
-*/
-
-SIG_FN
-setNoDbgFlg()
-{
-#if defined(SYSV)
- (void)signal(SIGUSR2, setNoDbgFlg);
-#endif SYSV
- setdebug(0);
-}
-
-/*
-** Set flag for statistics dump
-*/
-SIG_FN
-setstatsflg()
-{
-#if defined(SYSV)
- (void)signal(SIGIOT, setstatsflg);
-#endif SYSV
- needStatsDump = 1;
-}
-
-SIG_FN
-setchkptflg()
-{
-#if defined(SYSV)
- (void)signal(SIGQUIT, setchkptflg);
-#endif SYSV
- needToChkpt = 1;
-}
-
-/*
-** Catch a special signal SIGSYS
-**
-** this is setup to fork and exit to drop to /usr/tmp/gmon.out
-** and keep the server running
-*/
-
-SIG_FN
-sigprof()
-{
-#if defined(SYSV)
- (void)signal(SIGSYS, sigprof);
-#endif SYSV
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"sigprof()\n");
-#endif
- if ( fork() == 0)
- {
- (void) chdir(_PATH_TMPDIR);
- exit(1);
- }
-}
-
-/*
-** Routines for managing stream queue
-*/
-
-struct qstream *
-sqadd()
-{
- register struct qstream *sqp;
-
- if ((sqp = (struct qstream *)calloc(1, sizeof(struct qstream)))
- == NULL ) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"sqadd: malloc error\n");
-#endif
- syslog(LOG_ERR, "sqadd: Out Of Memory");
- return(QSTREAM_NULL);
- }
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,"sqadd(x%x)\n", sqp);
-#endif
-
- sqp->s_next = streamq;
- streamq = sqp;
- return(sqp);
-}
-
-/*
- * Remove stream queue structure.
- * No current queries may refer to this stream when it is removed.
- */
-sqrm(qp)
- register struct qstream *qp;
-{
- register struct qstream *qsp;
-
-#ifdef DEBUG
- if (debug > 1) {
- fprintf(ddt,"sqrm(%#x, %d ) rfcnt=%d\n",
- qp, qp->s_rfd, qp->s_refcnt);
- }
-#endif
-
- if (qp->s_bufsize != 0)
- (void) free(qp->s_buf);
- FD_CLR(qp->s_rfd, &mask);
- (void) close(qp->s_rfd);
- if (qp == streamq) {
- streamq = qp->s_next;
- } else {
- for (qsp = streamq; qsp->s_next != qp; qsp = qsp->s_next)
- ;
- qsp->s_next = qp->s_next;
- }
- (void)free((char *)qp);
-}
-
-sqflush()
-{
- register struct qstream *sp, *spnext;
-
- for (sp = streamq; sp != QSTREAM_NULL; sp = spnext) {
- spnext = sp->s_next;
- sqrm(sp);
- }
-}
-
-/*
- * Initiate query on stream;
- * mark as referenced and stop selecting for input.
- */
-sq_query(sp)
- register struct qstream *sp;
-{
- sp->s_refcnt++;
- FD_CLR(sp->s_rfd, &mask);
-}
-
-/*
- * Note that the current request on a stream has completed,
- * and that we should continue looking for requests on the stream.
- */
-sq_done(sp)
- register struct qstream *sp;
-{
-
- sp->s_refcnt = 0;
- sp->s_time = tt.tv_sec;
- FD_SET(sp->s_rfd, &mask);
-}
-
-setproctitle(a, s)
- char *a;
- int s;
-{
- int size;
- register char *cp;
- struct sockaddr_in sin;
- char buf[80];
-
- cp = Argv[0];
- size = sizeof(sin);
- if (getpeername(s, (struct sockaddr *)&sin, &size) == 0)
- (void) sprintf(buf, "-%s [%s]", a, inet_ntoa(sin.sin_addr));
- else {
- syslog(LOG_DEBUG, "getpeername: %m");
- (void) sprintf(buf, "-%s", a);
- }
- (void) strncpy(cp, buf, LastArg - cp);
- cp += strlen(cp);
- while (cp < LastArg)
- *cp++ = ' ';
-}
-
-u_long
-net_mask(in)
-struct in_addr in;
-{
- register u_long i = ntohl(in.s_addr);
-
- if (IN_CLASSA(i))
- return (htonl(IN_CLASSA_NET));
- else if (IN_CLASSB(i))
- return (htonl(IN_CLASSB_NET));
- else
- return (htonl(IN_CLASSC_NET));
-}
-
-gettime(ttp)
-struct timeval *ttp;
-{
- if (gettimeofday(ttp, (struct timezone *)0) < 0)
- syslog(LOG_ERR, "gettimeofday failed: %m");
- return;
-}
diff --git a/usr.sbin/named/ns_maint.c b/usr.sbin/named/ns_maint.c
deleted file mode 100644
index 716be8d1198..00000000000
--- a/usr.sbin/named/ns_maint.c
+++ /dev/null
@@ -1,544 +0,0 @@
-/*
- * Copyright (c) 1986, 1988 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)ns_maint.c 4.39 (Berkeley) 3/2/91";*/
-static char rcsid[] = "$Id: ns_maint.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#if defined(SYSV)
-#include <unistd.h>
-#endif SYSV
-#include <netinet/in.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <signal.h>
-#include <errno.h>
-#include <arpa/nameser.h>
-#include <sys/wait.h>
-#include "ns.h"
-#include "db.h"
-#include "pathnames.h"
-
-extern int errno;
-extern int maint_interval;
-extern int needzoneload;
-extern u_short ns_port;
-extern char *ctime();
-
-int xfers_running; /* number of xfers running */
-int xfers_deferred; /* number of needed xfers not run yet */
-static int alarm_pending;
-
-
-/*
- * Invoked at regular intervals by signal interrupt; refresh all secondary
- * zones from primary name server and remove old cache entries. Also,
- * ifdef'd ALLOW_UPDATES, dump database if it has changed since last
- * dump/bootup.
- */
-ns_maint()
-{
- register struct zoneinfo *zp;
- struct itimerval ival;
- time_t next_refresh = 0;
- int zonenum;
-
- gettime(&tt);
-
-#ifdef DEBUG
- if (debug) {
- time_t now;
-
- now = tt.tv_sec;
- fprintf(ddt,"\nns_maint(); now %s", ctime(&now));
- }
-#endif
-
- xfers_deferred = 0;
- alarm_pending = 0;
- for (zp = zones, zonenum = 0; zp < &zones[nzones]; zp++, zonenum++) {
-#ifdef DEBUG
- if (debug >= 2)
- printzoneinfo(zonenum);
-#endif
- if (tt.tv_sec >= zp->z_time && zp->z_refresh > 0) {
- /*
- * Set default time for next action first,
- * so that it can be changed later if necessary.
- */
- zp->z_time = tt.tv_sec + zp->z_refresh;
-
- switch (zp->z_type) {
-
- case Z_CACHE:
- doachkpt();
- break;
-
- case Z_SECONDARY:
- if ((zp->z_state & Z_NEED_RELOAD) == 0) {
- if (zp->z_state & Z_XFER_RUNNING)
- abortxfer(zp);
- else if (xfers_running < MAX_XFERS_RUNNING)
- startxfer(zp);
- else {
- zp->z_state |= Z_NEED_XFER;
- ++xfers_deferred;
-#ifdef DEBUG
- if (debug > 1)
- fprintf(ddt,
- "xfer deferred for %s\n",
- zp->z_origin);
-#endif
- }
- }
- break;
-#ifdef ALLOW_UPDATES
- case Z_PRIMARY:
- /*
- * Checkpoint the zone if it has changed
- * since we last checkpointed
- */
- if (zp->hasChanged)
- zonedump(zp);
- break;
-#endif ALLOW_UPDATES
- }
- gettime(&tt);
- }
- }
- sched_maint();
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"exit ns_maint()\n");
-#endif
-}
-
-/*
- * Find when the next refresh needs to be and set
- * interrupt time accordingly.
- */
-sched_maint()
-{
- register struct zoneinfo *zp;
- struct itimerval ival;
- time_t next_refresh = 0;
- static time_t next_alarm;
-
- for (zp = zones; zp < &zones[nzones]; zp++)
- if (zp->z_time != 0 &&
- (next_refresh == 0 || next_refresh > zp->z_time))
- next_refresh = zp->z_time;
- /*
- * Schedule the next call to ns_maint.
- * Don't visit any sooner than maint_interval.
- */
- bzero((char *)&ival, sizeof (ival));
- if (next_refresh != 0) {
- if (next_refresh == next_alarm && alarm_pending) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"sched_maint: no schedule change\n");
-#endif
- return;
- }
- ival.it_value.tv_sec = next_refresh - tt.tv_sec;
- if (ival.it_value.tv_sec < maint_interval)
- ival.it_value.tv_sec = maint_interval;
- next_alarm = next_refresh;
- alarm_pending = 1;
- }
- (void) setitimer(ITIMER_REAL, &ival, (struct itimerval *)NULL);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"sched_maint: Next interrupt in %d sec\n",
- ival.it_value.tv_sec);
-#endif
-}
-
-/*
- * Start an asynchronous zone transfer for a zone.
- * Depends on current time being in tt.
- * The caller must call sched_maint after startxfer.
- */
-startxfer(zp)
- struct zoneinfo *zp;
-{
- static char *argv[NSMAX + 20], argv_ns[NSMAX][MAXDNAME];
- int cnt, argc = 0, argc_ns = 0, pid, omask;
- char debug_str[10];
- char serial_str[10];
- char port_str[10];
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"startxfer() %s\n", zp->z_origin);
-#endif
-
- argv[argc++] = "named-xfer";
- argv[argc++] = "-z";
- argv[argc++] = zp->z_origin;
- argv[argc++] = "-f";
- argv[argc++] = zp->z_source;
- argv[argc++] = "-s";
- sprintf(serial_str, "%d", zp->z_serial);
- argv[argc++] = serial_str;
- if (zp->z_state & Z_SYSLOGGED)
- argv[argc++] = "-q";
- argv[argc++] = "-P";
- sprintf(port_str, "%d", ns_port);
- argv[argc++] = port_str;
-#ifdef DEBUG
- if (debug) {
- argv[argc++] = "-d";
- sprintf(debug_str, "%d", debug);
- argv[argc++] = debug_str;
- argv[argc++] = "-l";
- argv[argc++] = "/usr/tmp/xfer.ddt";
- if (debug > 5) {
- argv[argc++] = "-t";
- argv[argc++] = "/usr/tmp/xfer.trace";
- }
- }
-#endif
-
- /*
- * Copy the server ip addresses into argv, after converting
- * to ascii and saving the static inet_ntoa result
- */
- for (cnt = 0; cnt < zp->z_addrcnt; cnt++)
- argv[argc++] = strcpy(argv_ns[argc_ns++],
- inet_ntoa(zp->z_addr[cnt]));
-
- argv[argc] = 0;
-
-#ifdef DEBUG
-#ifdef ECHOARGS
- if (debug) {
- int i;
- for (i = 0; i < argc; i++)
- fprintf(ddt, "Arg %d=%s\n", i, argv[i]);
- }
-#endif /* ECHOARGS */
-#endif /* DEBUG */
-
-#ifdef SYSV
-#define vfork fork
-#else
- gettime(&tt);
- omask = sigblock(sigmask(SIGCHLD));
-#endif
- if ((pid = vfork()) == -1) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "xfer [v]fork: %d\n", errno);
-#endif
- syslog(LOG_ERR, "xfer [v]fork: %m");
-#ifndef SYSV
- (void) sigsetmask(omask);
-#endif
- zp->z_time = tt.tv_sec + 10;
- return;
- }
-
- if (pid) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "started xfer child %d\n", pid);
-#endif
- zp->z_state &= ~Z_NEED_XFER;
- zp->z_state |= Z_XFER_RUNNING;
- zp->z_xferpid = pid;
- xfers_running++;
- zp->z_time = tt.tv_sec + MAX_XFER_TIME;
-#ifndef SYSV
- (void) sigsetmask(omask);
-#endif
- } else {
- execve(_PATH_XFER, argv, NULL);
- syslog(LOG_ERR, "can't exec %s: %m", _PATH_XFER);
- _exit(XFER_FAIL); /* avoid duplicate buffer flushes */
- }
-}
-
-#ifdef DEBUG
-printzoneinfo(zonenum)
-int zonenum;
-{
- struct timeval tt;
- struct zoneinfo *zp = &zones[zonenum];
- char *ZoneType;
-
- if (!debug)
- return; /* Else fprintf to ddt will bomb */
- fprintf(ddt, "printzoneinfo(%d):\n", zonenum);
-
- gettime(&tt);
- switch (zp->z_type) {
- case Z_PRIMARY: ZoneType = "Primary"; break;
- case Z_SECONDARY: ZoneType = "Secondary"; break;
- case Z_CACHE: ZoneType = "Cache"; break;
- default: ZoneType = "Unknown";
- }
- if (zp->z_origin[0] == '\0')
- fprintf(ddt,"origin ='.'");
- else
- fprintf(ddt,"origin ='%s'", zp->z_origin);
- fprintf(ddt,", type = %s", ZoneType);
- fprintf(ddt,", source = %s\n", zp->z_source);
- fprintf(ddt,"z_refresh = %ld", zp->z_refresh);
- fprintf(ddt,", retry = %ld", zp->z_retry);
- fprintf(ddt,", expire = %ld", zp->z_expire);
- fprintf(ddt,", minimum = %ld", zp->z_minimum);
- fprintf(ddt,", serial = %ld\n", zp->z_serial);
- fprintf(ddt,"z_time = %d", zp->z_time);
- if (zp->z_time) {
- fprintf(ddt,", now time : %d sec", tt.tv_sec);
- fprintf(ddt,", time left: %d sec", zp->z_time - tt.tv_sec);
- }
- fprintf(ddt,"; state %x\n", zp->z_state);
-}
-#endif DEBUG
-
-/*
- * remove_zone (htp, zone) --
- * Delete all RR's in the zone "zone" under specified hash table.
- */
-remove_zone(htp, zone)
- register struct hashbuf *htp;
- register int zone;
-{
- register struct databuf *dp, *pdp;
- register struct namebuf *np;
- struct namebuf **npp, **nppend;
-
- nppend = htp->h_tab + htp->h_size;
- for (npp = htp->h_tab; npp < nppend; npp++)
- for (np = *npp; np != NULL; np = np->n_next) {
- for (pdp = NULL, dp = np->n_data; dp != NULL; ) {
- if (dp->d_zone == zone)
- dp = rm_datum(dp, np, pdp);
- else {
- pdp = dp;
- dp = dp->d_next;
- }
- }
- /* Call recursively to remove subdomains. */
- if (np->n_hash)
- remove_zone(np->n_hash, zone);
- }
-}
-
-/*
- * Abort an xfer that has taken too long.
- */
-abortxfer(zp)
- register struct zoneinfo *zp;
-{
-
- kill(zp->z_xferpid, SIGKILL); /* don't trust it at all */
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "Killed child %d (zone %s) due to timeout\n",
- zp->z_xferpid, zp->z_origin);
-#endif /* DEBUG */
- zp->z_time = tt.tv_sec + zp->z_retry;
-}
-
-#ifdef SYSV
-union wait {
- unsigned short w_termsig:7; /* termination signal */
- unsigned short w_coredump:1; /* core dump indicator */
- unsigned short w_retcode:8; /* exit code if w_termsig==0 */
-};
-#endif
-
-/*
- * SIGCHLD signal handler: process exit of xfer's.
- * (Note: also called when outgoing transfer completes.)
- */
-SIG_FN
-endxfer()
-{
- register struct zoneinfo *zp;
- int pid, xfers = 0;
- union wait status;
-
- gettime(&tt);
-#if defined(SYSV)
- { int stat;
- pid = wait(&stat);
- status.w_termsig = stat & 0x7f;
- status.w_retcode = stat >> 8;
- }
-#else /* SYSV */
- while ((pid =
- wait3((int *)&status, WNOHANG, (struct rusage *)NULL)) > 0) {
-#endif /* SYSV */
- for (zp = zones; zp < &zones[nzones]; zp++)
- if (zp->z_xferpid == pid) {
- xfers++;
- xfers_running--;
- zp->z_xferpid = 0;
- zp->z_state &= ~Z_XFER_RUNNING;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "\nendxfer: child %d zone %s returned status=%d termsig=%d\n",
- pid, zp->z_origin, status.w_retcode,
- status.w_termsig);
-#endif
- if (status.w_termsig != 0) {
- if (status.w_termsig != SIGKILL) {
- syslog(LOG_ERR,
- "named-xfer exited with signal %d\n",
- status.w_termsig);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "\tchild termination with signal %d\n",
- status.w_termsig);
-#endif
- }
- zp->z_time = tt.tv_sec + zp->z_retry;
- } else switch (status.w_retcode) {
- case XFER_UPTODATE:
- zp->z_state &= ~Z_SYSLOGGED;
- zp->z_lastupdate = tt.tv_sec;
- zp->z_time = tt.tv_sec + zp->z_refresh;
- /*
- * Restore z_auth in case expired,
- * but only if there were no errors
- * in the zone file.
- */
- if ((zp->z_state & Z_DB_BAD) == 0)
- zp->z_auth = 1;
- if (zp->z_source) {
-#if defined(SYSV)
- struct utimbuf t;
-
- t.actime = tt.tv_sec;
- t.modtime = tt.tv_sec;
- (void) utime(zp->z_source, &t);
-#else
- struct timeval t[2];
-
- t[0] = tt;
- t[1] = tt;
- (void) utimes(zp->z_source, t);
-#endif /* SYSV */
- }
- break;
-
- case XFER_SUCCESS:
- zp->z_state |= Z_NEED_RELOAD;
- zp->z_state &= ~Z_SYSLOGGED;
- needzoneload++;
- break;
-
- case XFER_TIMEOUT:
-#ifdef DEBUG
- if (debug) fprintf(ddt,
- "zoneref: Masters for secondary zone %s unreachable\n",
- zp->z_origin);
-#endif
- if ((zp->z_state & Z_SYSLOGGED) == 0) {
- zp->z_state |= Z_SYSLOGGED;
- syslog(LOG_WARNING,
- "zoneref: Masters for secondary zone %s unreachable",
- zp->z_origin);
- }
- zp->z_time = tt.tv_sec + zp->z_retry;
- break;
-
- default:
- if ((zp->z_state & Z_SYSLOGGED) == 0) {
- zp->z_state |= Z_SYSLOGGED;
- syslog(LOG_ERR,
- "named-xfer exit code %d",
- status.w_retcode);
- }
- /* FALLTHROUGH */
- case XFER_FAIL:
- zp->z_state |= Z_SYSLOGGED;
- zp->z_time = tt.tv_sec + zp->z_retry;
- break;
- }
- break;
- }
-#ifndef SYSV
- }
-#endif /* SYSV */
- if (xfers) {
- for (zp = zones;
- xfers_deferred != 0 && xfers_running < MAX_XFERS_RUNNING &&
- zp < &zones[nzones]; zp++)
- if (zp->z_state & Z_NEED_XFER) {
- xfers_deferred--;
- startxfer(zp);
- }
- sched_maint();
- }
-#if defined(SYSV)
- (void)signal(SIGCLD, endxfer);
-#endif
-}
-
-/*
- * Reload zones whose transfers have completed.
- */
-loadxfer()
-{
- register struct zoneinfo *zp;
-
- gettime(&tt);
- for (zp = zones; zp < &zones[nzones]; zp++)
- if (zp->z_state & Z_NEED_RELOAD) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "loadxfer() '%s'\n",
- zp->z_origin[0] ? zp->z_origin : ".");
-#endif
- zp->z_state &= ~Z_NEED_RELOAD;
- zp->z_auth = 0;
- remove_zone(hashtab, zp - zones);
- if (db_load(zp->z_source, zp->z_origin, zp, 0) == 0)
- zp->z_auth = 1;
- if (zp->z_state & Z_TMP_FILE)
- (void) unlink(zp->z_source);
- }
- sched_maint();
-}
diff --git a/usr.sbin/named/ns_req.c b/usr.sbin/named/ns_req.c
deleted file mode 100644
index 50e40d6b00e..00000000000
--- a/usr.sbin/named/ns_req.c
+++ /dev/null
@@ -1,1353 +0,0 @@
-/*
- * Copyright (c) 1986, 1988, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)ns_req.c 4.47 (Berkeley) 7/1/91";*/
-static char rcsid[] = "$Id: ns_req.c,v 1.1 1995/10/18 08:47:50 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/uio.h>
-#include <sys/time.h>
-#include <sys/file.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <syslog.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include <stdio.h>
-#include "ns.h"
-#include "db.h"
-
-#define NADDRECS 20
-
-extern int debug;
-extern FILE *ddt;
-
-struct addinfo {
- char *a_dname; /* domain name */
- u_short a_class; /* class for address */
-};
-
-struct addinfo addinfo[NADDRECS]; /* additional info records */
-int addcount; /* number of names in addinfo */
-int xfr_disabled = 0; /* set to disable zone xfrs */
-int needs_prime_cache = 0; /* set if we need a priming */
-
-u_char *dnptrs[20]; /* ptrs to dnames in message for dn_comp */
-
-extern time_t retrytime();
-extern struct qinfo *sysquery();
-extern char *localdomain; /* XXX */
-extern int errno;
-/*
- * Process request using database; assemble and send response.
- */
-ns_req(msg, msglen, buflen, qsp, from, dfd)
- u_char *msg;
- int msglen, buflen;
- struct qstream *qsp;
- struct sockaddr_in *from;
- int dfd;
-{
- register HEADER *hp;
- register u_char *cp;
- struct namebuf *np;
- register struct databuf *dp;
- struct hashbuf *htp;
- struct netinfo *lp;
- char *fname, *answers;
- u_char *eom, *omsg;
- char dnbuf[MAXDNAME], *dname;
- u_char **dpp;
- int n, class, type, count, foundname, founddata, omsglen, cname = 0;
- u_short id;
- struct databuf *nsp[NSMAX];
- struct qinfo *qp;
- extern struct qinfo *qhead;
- extern struct netinfo *local();
- extern int nsid;
-
-#ifdef DEBUG
- if (debug > 3) {
- fprintf(ddt,"ns_req()\n");
- fp_query((char *)msg, ddt);
- }
-#endif
-
- hp = (HEADER *) msg;
- if (hp->qr) {
- ns_resp(msg, msglen);
-
- /* Now is a safe time for housekeeping */
- if (needs_prime_cache)
- prime_cache();
- return;
- }
-
- hp->rcode = NOERROR;
- cp = msg + sizeof(HEADER);
- eom = msg + msglen;
- dpp = dnptrs;
- *dpp++ = msg;
- addcount = 0;
-
- switch (hp->opcode) {
- case QUERY:
-#ifdef STATS
- stats[S_QUERIES].cnt++;
-#endif
- if (ntohs(hp->qdcount) != 1 ||
- hp->ancount || hp->nscount || hp->arcount) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR Query header counts wrong\n");
-#endif
- hp->qdcount = 0;
- hp->ancount = 0;
- hp->nscount = 0;
- hp->arcount = 0;
- hp->rcode = FORMERR;
- goto finish;
- }
- /*
- * Get domain name, class, and type.
- */
- if ((*cp & INDIR_MASK) == 0)
- *dpp++ = cp; /* remember name for compression */
- *dpp = NULL;
- if ((n = dn_expand(msg, eom, cp, (u_char *)dnbuf,
- sizeof(dnbuf))) < 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR Query expand name failed\n");
-#endif
- hp->rcode = FORMERR;
- goto finish;
- }
- cp += n;
- GETSHORT(type, cp);
- GETSHORT(class, cp);
- if (cp > eom) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR Query message length short\n");
-#endif
- hp->rcode = FORMERR;
- goto finish;
- }
-#ifdef DEBUG
- if (cp < eom)
- if (debug > 5)
- fprintf(ddt,"message length > received message\n");
-#endif
-
-#ifdef STATS
- if ((type > T_ANY) || (type < 0))
- typestats[0]++; /* Bad type */
- else
- typestats[type]++;
-#endif
- /*
- * Process query.
- */
- if (type == T_AXFR) {
- /* refuse request if not a TCP connection */
- if (qsp == QSTREAM_NULL || xfr_disabled) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"T_AXFR via UDP refused\n");
-#endif
- hp->rcode = REFUSED;
- goto finish;
- }
- dnptrs[0] = NULL; /* don't compress names */
- hp->rd = 0; /* recursion not possible */
- }
- buflen -= msglen;
- count = 0;
- foundname = 0;
- founddata = 0;
- dname = dnbuf;
-try_again:
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"req: nlookup(%s) id %d type=%d\n",
- dname, hp->id, type);
-#endif
- htp = hashtab; /* lookup relative to root */
- if ((np = nlookup(dname, &htp, &fname, 0)) == NULL)
- fname = "";
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"req: %s '%s' as '%s' (cname=%d)\n",
- np == NULL ? "missed" : "found",
- dname, fname, cname);
-#endif
- /* START XXX */
- /*
- * if nlookup failed to find address then
- * see if there are any '.''s in the name
- * if not then add local domain name to the
- * name and try again.
- */
- if (np == NULL && localdomain && index(dname, '.') == NULL) {
- (void) strcat(dname,".");
- (void) strcat(dname, localdomain);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"req: nlookup(%s) type=%d\n",
- dname, type);
-#endif
- htp = hashtab;
- np = nlookup(dname, &htp, &fname, 0);
- }
- /* END XXX */
- if (np == NULL || fname != dname)
- goto fetchns;
-
- foundname++;
- answers = (char *)cp;
- count = cp - msg;
- n = finddata(np, class, type, hp, &dname, &buflen, &count);
- if (n == 0)
- goto fetchns; /* NO data available */
- cp += n;
- buflen -= n;
- msglen += n;
- hp->ancount += count;
- if (fname != dname && type != T_CNAME && type != T_ANY) {
- if (cname++ >= MAXCNAMES) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,
- "resp: leaving, MAXCNAMES exceeded\n");
-#endif
- hp->rcode = SERVFAIL;
- goto finish;
- }
- goto try_again;
- }
- founddata = 1;
-#ifdef DEBUG
- if (debug >= 3) {
- fprintf(ddt,"req: foundname = %d count = %d ", foundname, count);
- fprintf(ddt,"founddata = %d cname = %d\n",founddata, cname);
- }
-#endif
- if ((lp = local(from)) != NULL)
- sort_response(answers, count, lp, cp);
- if (type == T_AXFR) {
- if (founddata) {
- hp->ancount = htons(hp->ancount);
- startxfr(qsp, np, msg, cp - msg);
- return;
- }
- hp->rcode = REFUSED; /* No go if unauthoritative */
- goto finish;
- }
-#ifdef notdef
- /*
- * If we found an authoritative answer,
- * we're done.
- */
- if (hp->aa)
- goto finish;
-#endif
-
-fetchns:
- /*
- * Look for name servers to refer to and fill in the authority
- * section or record the address for forwarding the query
- * (recursion desired).
- */
- nsp[0] = NULL;
- switch (findns(&np, class, nsp, &count)) {
- case NXDOMAIN:
- if (!foundname)
- hp->rcode = NXDOMAIN;
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"req: leaving (%s, rcode %d)\n",
- dname, hp->rcode);
-#endif
- if (class != C_ANY) {
- hp->aa = 1;
- /* XXX
- * should return SOA if founddata == 0,
- * but old named's are confused by an SOA
- * in the auth. section if there's no error.
- */
- if (foundname == 0 && np) {
- n = doaddauth(hp, cp, buflen, np, nsp[0]);
- cp += n;
- buflen -= n;
- }
- }
- goto finish;
-
- case SERVFAIL:
- if (!founddata) {
- hp->rcode = SERVFAIL;
- goto finish;
- }
- }
-
- /*
- * If we successfully found the answer in the cache
- * or this is not a recursive query, then add the
- * nameserver references here and return.
- */
- if (founddata || (!hp->rd)) {
- n = add_data(np, nsp, cp, buflen);
- if (n < 0) {
- hp->tc = 1;
- n = (-n);
- }
- cp += n;
- buflen -= n;
- hp->nscount = htons((u_short)count);
- goto finish;
- }
-
- /*
- * At this point, we don't have the answer, but we do
- * have some NS's to try. If the user would like us
- * to recurse, create the initial query. If a cname
- * is involved, we need to build a new query and save
- * the old one in cmsg/cmsglen.
- */
- if (cname) {
- omsg = (u_char *)malloc((unsigned)msglen);
- if (omsg == (u_char *)NULL) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"ns_req: malloc fail\n");
-#endif
- syslog(LOG_ERR, "ns_req: Out Of Memory");
- hp->rcode = SERVFAIL;
- break;
- }
- id = hp->id;
- hp->ancount = htons(hp->ancount);
- bcopy(msg, omsg, omsglen = msglen);
- msglen = res_mkquery(QUERY, dname, class, type,
- (char *)NULL, 0, NULL, (char *)msg,
- msglen+buflen);
- }
- n = ns_forw(nsp, msg, msglen, from, qsp, dfd, &qp);
- if (n != FW_OK && cname)
- free(omsg);
- switch (n) {
- case FW_OK:
- if (cname) {
- qp->q_cname = cname;
- qp->q_cmsg = (char *)omsg;
- qp->q_cmsglen = omsglen;
- qp->q_id = id;
- }
- break;
- case FW_DUP:
- break; /* Duplicate request dropped */
- case FW_NOSERVER:
- if(np)
- np = np->n_parent;
- goto fetchns; /* Try again. */
- case FW_SERVFAIL:
- hp->rcode = SERVFAIL;
- goto finish;
- }
- /* Now is a safe time for housekeeping */
- if (needs_prime_cache)
- prime_cache();
- return;
-
- case IQUERY: {
- register struct invbuf *ip;
- register int i;
- int dlen, alen;
- char anbuf[PACKETSZ], *data;
-
-#ifdef STATS
- stats[S_IQUERIES].cnt++;
-#endif
- hp->ancount = htons(hp->ancount);
- if (hp->ancount != 1 ||
- hp->qdcount || hp->nscount || hp->arcount) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR IQuery header counts wrong\n");
-#endif
- hp->qdcount = 0;
- hp->ancount = 0;
- hp->nscount = 0;
- hp->arcount = 0;
- hp->rcode = FORMERR;
- goto finish;
- }
- /*
- * Skip domain name, get class, and type.
- */
- if ((n = dn_skipname(cp, eom)) < 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR IQuery packet name problem\n");
-#endif
- hp->rcode = FORMERR;
- goto finish;
- }
- cp += n;
- GETSHORT(type, cp);
- GETSHORT(class, cp);
- cp += sizeof(u_long);
- GETSHORT(dlen, cp);
- cp += dlen;
- if (cp != eom) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR IQuery message length off\n");
-#endif
- hp->rcode = FORMERR;
- goto finish;
- }
- /* not all inverse queries are handled. */
- switch (type) {
- case T_A:
- case T_UID:
- case T_GID:
- break;
-
- default:
- hp->rcode = REFUSED;
- goto finish;
- }
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"req: IQuery class %d type %d\n",
- class, type);
-#endif
- fname = (char *)msg + sizeof(HEADER);
- bcopy(fname, anbuf, alen = (char *)cp - fname);
- data = anbuf + alen - dlen;
- cp = (u_char *)fname;
- buflen -= sizeof(HEADER);
- count = 0;
- for (ip = invtab[dhash(data, dlen)]; ip != NULL;
- ip = ip->i_next) {
- for (i = 0; i < INVBLKSZ; i++) {
- if ((np = ip->i_dname[i]) == NULL)
- break;
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"dname = %d\n", np->n_dname);
-#endif
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (!match(dp, class, type))
- continue;
- if (dp->d_size != dlen ||
- bcmp(dp->d_data, data, dlen))
- continue;
- getname(np, dnbuf, sizeof(dnbuf));
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt,"req: IQuery found %s\n",
- dnbuf);
-#endif
- buflen -= QFIXEDSZ;
- if ((n = dn_comp((u_char *)dnbuf, cp, buflen,
- (u_char **)NULL, (u_char **)NULL)) < 0)
- {
- hp->tc = 1;
- goto finish;
- }
- cp += n;
- PUTSHORT((u_short)dp->d_type, cp);
- PUTSHORT((u_short)dp->d_class, cp);
- buflen -= n;
- count++;
- }
- }
- }
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"req: IQuery %d records\n", count);
-#endif
- hp->qdcount = htons((u_short)count);
- if (alen > buflen) {
- hp->tc = 1;
- break;
- }
- bcopy(anbuf, cp, alen);
- cp += alen;
- break;
- }
-
-#ifdef ALLOW_UPDATES
-/*
- * In a sense the following constant should be defined in <arpa/nameser.h>,
- * since it is returned here in place of a response code if the update was
- * forwarded, and the response codes are defined in nameser.h. On the other
- * hand, though, this constant is only seen in this file. The assumption
- * here is that none of the other return codes equals this one (a good
- * assumption, since they only occupy 4 bits over-the-wire)
- */
-#define FORWARDED 1000
- /* Call InitDynUpdate for all dynamic update requests */
- case UPDATEM:
- case UPDATEMA:
- case UPDATED:
- case UPDATEDA:
- case UPDATEA:
- n = InitDynUpdate(hp, nsp, msg, msglen, cp, from, qsp, dfd);
- if (n == FORWARDED)
- return; /* Return directly because InitDynUpdate
- * forwarded the query to the primary, so we
- * will send response later
- */
- else
- break; /* Either sucessful primary update or failure;
- * return response code to client
- */
-#endif ALLOW_UPDATES
-
- case ZONEREF:
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"Refresh Zone\n");
-#endif
-
- default:
-#ifdef DEBUG
- if (debug >= 2)
- fprintf(ddt,"Opcode %d not implemented\n", hp->opcode);
-#endif
- hp->qdcount = 0;
- hp->ancount = 0;
- hp->nscount = 0;
- hp->arcount = 0;
- hp->rcode = NOTIMP;
- }
-finish:
-#ifdef STATS
- switch(hp->rcode) {
- case NOERROR:
- stats[S_RESPOK].cnt++;
- break;
- case FORMERR:
- stats[S_RESPFORMERR].cnt++;
- break;
- default:
- stats[S_RESPFAIL].cnt++;
- break;
- }
-#endif
- hp->qr = 1; /* set Response flag */
- hp->ra = 1; /* Recursion is Available */
- hp->ancount = htons(hp->ancount);
- if (addcount) {
- n = doaddinfo(hp, cp, buflen);
- cp += n;
- buflen -= n;
- }
-
-#ifdef DEBUG
- if (debug) {
- fprintf(ddt,"req: answer -> %s %d (%d) id=%d %s\n",
- inet_ntoa(from->sin_addr),
- qsp == QSTREAM_NULL ? dfd : qsp->s_rfd,
- ntohs(from->sin_port),
- ntohs(hp->id), local(from) == NULL ? "Remote" : "Local");
- }
- if (debug >= 10)
- fp_query((char *)msg, ddt);
-#endif DEBUG
- if (qsp == QSTREAM_NULL) {
- if (sendto(dfd, msg, cp-msg, 0, (struct sockaddr *)from,
- sizeof(*from))< 0){
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"error returning msg errno=%d\n",errno);
-#endif DEBUG
- }
-#ifdef STATS
- stats[S_OUTPKTS].cnt++;
-#endif
- } else {
- (void) writemsg(qsp->s_rfd, msg, cp - msg);
- sq_done(qsp);
- }
- if (needs_prime_cache)
- prime_cache(); /* Now is a safe time */
-}
-
-fwritemsg(rfp, msg, msglen)
- FILE *rfp;
- char *msg;
- int msglen;
-{
- u_short len = htons((u_short)msglen);
-
- if (fwrite((char *)&len, sizeof(len), 1, rfp) != 1 ||
- fwrite(msg, msglen, 1, rfp) != 1) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"fwrite failed %d\n", errno);
-#endif
- }
- return;
-}
-
-writemsg(rfd, msg, msglen)
- int rfd;
- char *msg;
- int msglen;
-{
- struct iovec iov[2];
- u_short len = htons((u_short)msglen);
-
- iov[0].iov_base = (caddr_t)&len;
- iov[0].iov_len = sizeof(len);
- iov[1].iov_base = msg;
- iov[1].iov_len = msglen;
- if (writev(rfd, iov, 2) != sizeof(len) + msglen) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"write failed %d\n", errno);
-#endif
- return (-1);
- }
- return (0);
-}
-
-/*
- * Test a datum for validity and return non-zero if it is out of date.
- */
-stale(dp)
-register struct databuf *dp;
-{
- register struct zoneinfo *zp = &zones[dp->d_zone];
-
- switch (zp->z_type) {
-
- case Z_PRIMARY:
- return (0);
-
- case Z_SECONDARY:
- /*
- * Check to see whether a secondary zone
- * has expired; if so clear authority flag
- * for zone and return true. If lastupdate
- * is in the future, assume zone is up-to-date.
- */
- if ((long)(tt.tv_sec - zp->z_lastupdate) > (long)zp->z_expire) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "stale: secondary zone %s expired\n",
- zp->z_origin);
-#endif
- syslog(LOG_ERR, "secondary zone \"%s\" expired\n",
- zp->z_origin);
- zp->z_auth = 0;
- return (1);
- }
- return (0);
-
- case Z_CACHE:
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"stale: ttl %d %d (x%x)\n",
- dp->d_ttl, dp->d_ttl - tt.tv_sec, dp->d_flags);
-#endif
- if (dp->d_flags & DB_F_HINT)
- return(0);
- return(dp->d_ttl < tt.tv_sec);
-
- }
- /* NOTREACHED */
-}
-
-/*
- * Copy databuf into a resource record for replies.
- * Return size of RR if OK, -1 if buffer is full.
- */
-make_rr(name, dp, buf, buflen, doadd)
- char *name;
- register struct databuf *dp;
- char *buf;
- int buflen, doadd;
-{
- register char *cp;
- char *cp1, *sp;
- struct zoneinfo *zp;
- register long n;
- register long ttl;
- u_char **edp = dnptrs + sizeof(dnptrs)/sizeof(dnptrs[0]);
-
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"make_rr(%s, %x, %x, %d, %d) %d zone %d ttl %d\n",
- name, dp, buf,
- buflen, doadd, dp->d_size, dp->d_zone, dp->d_ttl);
-#endif
-
- zp = &zones[dp->d_zone];
- /* check for outdated RR before updating dnptrs by dn_comp() (???) */
- if (zp->z_type == Z_CACHE) {
- ttl = dp->d_ttl - (u_long) tt.tv_sec;
- if ((dp->d_flags & DB_F_HINT) || (ttl < 0)) {
-#ifdef DEBUG
-/*XXX*/if (debug >= 3) fprintf(ddt,"make_rr: %d=>0, x%x\n", ttl, dp->d_flags);
-#endif
- ttl = 0;
- }
- } else {
- if (dp->d_ttl)
- ttl = dp->d_ttl;
- else
- ttl = zp->z_minimum; /* really default */
-#ifdef notdef /* don't decrease ttl based on time since verification */
- if (zp->z_type == Z_SECONDARY) {
- /*
- * Set ttl to value received from primary,
- * less time since we verified it (but never
- * less than a small positive value).
- */
- ttl -= tt.tv_sec - zp->z_lastupdate;
- if (ttl <= 0)
- ttl = 120;
- }
-#endif
- }
-
- buflen -= RRFIXEDSZ;
- if ((n = dn_comp((u_char *)name, (u_char *)buf, buflen,
- (u_char **)dnptrs, (u_char **)edp)) < 0)
- return (-1);
- cp = buf + n;
- buflen -= n;
- PUTSHORT((u_short)dp->d_type, cp);
- PUTSHORT((u_short)dp->d_class, cp);
- PUTLONG(ttl, cp);
- sp = cp;
- cp += sizeof(u_short);
- switch (dp->d_type) {
- case T_CNAME:
- case T_MG:
- case T_MR:
- case T_PTR:
- if ((n = dn_comp((u_char *)dp->d_data, (u_char *)cp, buflen,
- (u_char **)dnptrs, (u_char **)edp)) < 0)
- return (-1);
- PUTSHORT((u_short)n, sp);
- cp += n;
- break;
-
- case T_MB:
- case T_NS:
- /* Store domain name in answer */
- if ((n = dn_comp((u_char *)dp->d_data, (u_char *)cp, buflen,
- (u_char **)dnptrs, (u_char **)edp)) < 0)
- return (-1);
- PUTSHORT((u_short)n, sp);
- cp += n;
- if (doadd)
- addname(dp->d_data, dp->d_class);
- break;
-
- case T_SOA:
- case T_MINFO:
- cp1 = dp->d_data;
- if ((n = dn_comp((u_char *)cp1, (u_char *)cp, buflen,
- (u_char **)dnptrs, (u_char **)edp)) < 0)
- return (-1);
- cp += n;
- buflen -= dp->d_type == T_MINFO ? n : n + 5 * sizeof(u_long);
- cp1 += strlen(cp1) + 1;
- if ((n = dn_comp((u_char *)cp1, (u_char *)cp, buflen,
- (u_char **)dnptrs, (u_char **)edp)) < 0)
- return (-1);
- cp += n;
- if (dp->d_type == T_SOA) {
- cp1 += strlen(cp1) + 1;
- bcopy(cp1, cp,
- (int)(n = dp->d_size - (cp1 - dp->d_data)));
- cp += n;
- }
- n = (u_short)(cp - sp) - sizeof(u_short);
- PUTSHORT((u_short)n, sp);
- break;
-
- case T_MX:
- /* cp1 == our data/ cp == data of RR */
- cp1 = dp->d_data;
-
- /* copy preference */
- bcopy(cp1,cp,sizeof(u_short));
- cp += sizeof(u_short);
- cp1 += sizeof(u_short);
- buflen -= sizeof(u_short);
-
- if ((n = dn_comp((u_char *)cp1, (u_char *)cp, buflen,
- (u_char **)dnptrs, (u_char **)edp)) < 0)
- return(-1);
- cp += n;
-
- /* save data length */
- n = (u_short)(cp - sp) - sizeof(u_short);
- PUTSHORT((u_short)n, sp);
- if (doadd)
- addname(cp1, dp->d_class);
- break;
-
- default:
- if (dp->d_size > buflen)
- return (-1);
- bcopy(dp->d_data, cp, dp->d_size);
- PUTSHORT((u_short)dp->d_size, sp);
- cp += dp->d_size;
- }
- return (cp - buf);
-}
-
-addname(name, class)
-register char *name;
-short class;
-{
- register struct addinfo *ap;
- register int n;
-
- for (ap = addinfo, n = addcount; --n >= 0; ap++)
- if (strcasecmp(ap->a_dname, name) == 0)
- return;
- /* add domain name to additional section */
- if (addcount < NADDRECS) {
- addcount++;
- ap->a_dname = name;
- ap->a_class = class;
- }
-}
-
-/*
- * Lookup addresses for names in addinfo and put into the message's
- * additional section.
- */
-doaddinfo(hp, msg, msglen)
- HEADER *hp;
- char *msg;
- int msglen;
-{
- register struct namebuf *np;
- register struct databuf *dp;
- register struct addinfo *ap;
- register char *cp;
- struct hashbuf *htp;
- char *fname;
- int n, count, foundstale;
-
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"doaddinfo() addcount = %d\n", addcount);
-#endif
-
- count = 0;
- cp = msg;
- for (ap = addinfo; --addcount >= 0; ap++) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"do additional '%s'\n", ap->a_dname);
-#endif
- htp = hashtab; /* because "nlookup" stomps on arg. */
- np = nlookup(ap->a_dname, &htp, &fname, 0);
- if (np == NULL || fname != ap->a_dname)
- continue;
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"found it\n");
-#endif
- foundstale = 0;
- /* look for the data */
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (!match(dp, (int)ap->a_class, T_A))
- continue;
- if (stale(dp)) {
- foundstale++;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"doaddinfo: stale entry '%s'%s\n",
- np->n_dname,
- (dp->d_flags&DB_F_HINT) ? " hint":"" );
-#endif
- continue;
- }
- /*
- * Should be smart and eliminate duplicate
- * data here. XXX
- */
- if ((n = make_rr(ap->a_dname, dp, cp, msglen, 0)) < 0)
- break;
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"addinfo: adding address data n = %d\n",
- n);
-#endif
- cp += n;
- msglen -= n;
- count++;
- }
- if (foundstale) {
- /* Cache invalidate the address RR's */
- delete_all(np, (int)ap->a_class, T_A);
- (void) sysquery(ap->a_dname, (int)ap->a_class, T_A);
- }
- }
- hp->arcount = htons((u_short)count);
- return (cp - msg);
-}
-
-doaddauth(hp, cp, buflen, np, dp)
- register HEADER *hp;
- char *cp;
- int buflen;
- struct namebuf *np;
- struct databuf *dp;
-{
- char dnbuf[MAXDNAME];
- int n;
-
- getname(np, dnbuf, sizeof(dnbuf));
- if (stale(dp) || (n = make_rr(dnbuf, dp, cp, buflen, 1)) <= 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"doaddauth: can't add '%s' (%d)\n",
- dnbuf, buflen);
-#endif
- return(0);
- } else {
- hp->nscount = htons(1);
- return(n);
- }
-}
-
-
-/*
- * Get the domain name of 'np' and put in 'buf'. Bounds checking is done.
- */
-getname(np, buf, buflen)
- struct namebuf *np;
- char *buf;
- int buflen;
-{
- register char *cp;
- register int i;
-
- cp = buf;
- while (np != NULL) {
- if ((i = strlen(np->n_dname))+1 >= buflen) {
- *cp = '\0';
- syslog(LOG_ERR, "domain name too long: %s...\n", buf);
- strcpy(buf, "Name_Too_Long");
- return;
- }
- if (cp != buf)
- *cp++ = '.';
- (void) strcpy(cp, np->n_dname);
- cp += i;
- buflen -= (i+1);
- np = np->n_parent;
- }
- *cp = '\0';
-}
-
-/*
- * Do a zone transfer. SOA record already sent.
- */
-doaxfr(np, rfp, isroot)
- register struct namebuf *np;
- FILE *rfp;
- int isroot;
-{
- register struct databuf *dp;
- register int n;
- struct hashbuf *htp;
- struct databuf *gdp; /* glue databuf */
- struct namebuf *gnp; /* glue namebuf */
- struct namebuf **npp, **nppend;
- char msg[PACKETSZ];
- char *cp;
- char *fname;
- char dname[MAXDNAME];
- HEADER *hp = (HEADER *) msg;
- int fndns;
-
-#ifdef DEBUG
- if (debug && isroot)
- fprintf(ddt,"doaxfr()\n");
-#endif
- fndns = 0;
- hp->id = 0;
- hp->opcode = QUERY;
- hp->aa = hp->tc = hp->ra = hp->pr = hp->rd = 0;
- hp->qr = 1;
- hp->rcode = NOERROR;
- hp->qdcount = 0;
- hp->ancount = htons(1);
- hp->nscount = 0;
- hp->arcount = 0;
- cp = msg + sizeof(HEADER);
- getname(np, dname, sizeof(dname));
-
- /* first do data records */
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- /*
- * Skip the root SOA record (marks end of data);
- * don't send SOA for subdomains, as we're not sending them.
- */
- if (dp->d_type == T_SOA)
- continue;
- if (dp->d_type == T_NS)
- fndns = 1;
- if (dp->d_zone == 0 || stale(dp))
- continue;
- if ((n = make_rr(dname, dp, cp, sizeof(msg)-sizeof(HEADER), 0)) < 0)
- continue;
- fwritemsg(rfp, msg, n + sizeof(HEADER));
-
- if (dp->d_type == T_NS) {
- /* Glue the sub domains together by sending
- * the address records for the sub domain
- * name servers along.
- */
- htp = hashtab;
- cp = msg + sizeof(HEADER);
- gnp = nlookup(dp->d_data, &htp, &fname, 0);
- if (gnp == NULL || fname != dp->d_data)
- continue;
- for(gdp=gnp->n_data; gdp != NULL; gdp=gdp->d_next) {
- if (gdp->d_type != T_A || stale(gdp))
- continue;
- if ((n = make_rr(fname, gdp, cp,
- sizeof(msg)-sizeof(HEADER), 0)) < 0)
- continue;
- fwritemsg(rfp, msg, n + sizeof(HEADER));
- }
- }
- }
-
- /* next do subdomains, unless delegated */
- if ((isroot == 0 && fndns) || np->n_hash == NULL)
- return;
- npp = np->n_hash->h_tab;
- nppend = npp + np->n_hash->h_size;
- while (npp < nppend) {
- for (np = *npp++; np != NULL; np = np->n_next) {
- doaxfr(np, rfp, 0);
- }
- }
-#ifdef DEBUG
- if (debug && isroot)
- fprintf(ddt,"exit doaxfr()\n");
-#endif
-}
-
-#ifdef ALLOW_UPDATES
-/*
- * Called by UPDATE{A,D,DA,M,MA} to initiate a dynamic update. If this is the
- * primary server for the zone being updated, we update the zone's serial
- * number and then call doupdate directly. If this is a secondary, we just
- * forward the update; this way, if the primary update fails (e.g., if the
- * primary is unavailable), we don't update the secondary; if the primary
- * update suceeds, ns_resp will get called with the response (when it comes
- * in), and then update the secondary's copy.
- */
-InitDynUpdate(hp, nsp, msg, msglen, startcp, from, qsp, dfd)
- register HEADER *hp;
- struct databuf *nsp[];
- char *msg;
- int msglen;
- u_char *startcp;
- struct sockaddr_in *from;
- struct qstream *qsp;
- int dfd;
-{
- struct zoneinfo *zp;
- char dnbuf[MAXDNAME];
- struct hashbuf *htp = hashtab; /* lookup relative to root */
- struct namebuf *np;
- struct databuf *olddp, *newdp, *dp;
- struct databuf **nspp;
- char *fname;
- register u_char *cp = startcp;
- short class, type;
- int n, size, zonenum;
- char ZoneName[MAXDNAME], *znp;
-
- if ((n = dn_expand(msg, msg + msglen, cp, dnbuf, sizeof(dnbuf))) < 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR InitDynUpdate expand name failed\n");
-#endif
- hp->rcode = FORMERR;
- return(FORMERR);
- }
- cp += n;
- GETSHORT(type, cp);
- if (type == T_SOA) { /* T_SOA updates not allowed */
- hp->rcode = REFUSED;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "InitDynUpdate: REFUSED - SOA update\n");
-#endif
- return(REFUSED);
- }
- GETSHORT(class, cp);
- cp += sizeof(u_long);
- GETSHORT(size, cp);
-/****XXX - need bounds checking here ****/
- cp += size;
-
- if ((zonenum = findzone(dnbuf, class)) == 0) { /* zone not found */
- hp->rcode = NXDOMAIN;
- return(NXDOMAIN);
- }
- zp = &zones[zonenum];
-
- /* Disallow updates for which we aren't authoratative. Note: the
- following test doesn't work right: If it's for a non-local zone,
- we will think it's a primary but be unable to lookup the namebuf,
- thus returning 'NXDOMAIN' */
- if (zp->z_type != Z_PRIMARY && zp->z_type != Z_SECONDARY) {
- hp->rcode = REFUSED;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "InitDynUpdate: REFUSED - non-primary, non-sedondary update\n");
-#endif
- return(REFUSED);
- }
- if (!(zp->z_state & Z_DYNAMIC)) {
- hp->rcode = REFUSED;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "InitDynUpdate: REFUSED - dynamic flag not set for zone\n");
-#endif
- return(REFUSED);
- }
-
- /*
- * Lookup the zone namebuf. Lookup "xyz" not "xyz.", since
- * otherwise the lookup fails, because '.' may have a nil n_hash
- * associated with it.
- */
- strcpy(ZoneName, zp->z_origin);
- znp = &ZoneName[strlen(ZoneName) - 1];
- if (*znp == '.')
- *znp = NULL;
- np = nlookup(ZoneName, &htp, &fname, 0);
- if ((np == NULL) || (fname != ZoneName)) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "InitDynUpdate: lookup failed on zone (%s)\n",
- ZoneName);
-#endif DEBUG
- syslog(LOG_ERR, "InitDynUpdate: lookup failed on zone (%s)\n",
- ZoneName);
- hp->rcode = NXDOMAIN;
- return(NXDOMAIN);
- }
-
- /*
- * If this is the primary copy increment the serial number. Don't
- * increment the serial number if this is a secondary; this way, if 2
- * different secondaries both update the primary, they will both have
- * lower serial numbers than the primary has, and hence eventually
- * refresh and get all updates and become consistent.
- *
- * Note that the serial number must be incremented in both the zone
- * data structure and the zone's namebuf.
- */
- switch (zp->z_type) {
- case Z_SECONDARY: /* forward update to primary */
- nspp = nsp;
- dp = np->n_data;
- while (dp != NULL) {
- if (match(dp, class, T_NS)) {
- if (nspp < &nsp[NSMAX-1])
- *nspp++ = dp;
- else
- break;
- }
- dp = dp->d_next;
- }
- *nspp = NULL; /* Delimiter */
- if (ns_forw(nsp, msg, msglen, from, qsp, dfd, NULL) < 0) {
- hp->rcode = SERVFAIL;
- return(SERVFAIL);
- }
- return(FORWARDED);
-
- case Z_PRIMARY:
- zp->z_serial++;
- olddp = np->n_data; /* old databuf */
- /* Find the SOA record */
- for (olddp = np->n_data; olddp != NULL; olddp = olddp->d_next)
- if (match(olddp, class, T_SOA))
- break;
- if (olddp == NULL) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"InitDynUpdate: Couldn't find SOA record for '%s'\n",
- ZoneName);
-#endif DEBUG
- syslog(LOG_ERR,
- "InitDynUpdate: Couldn't find SOA record for '%s'\n"
-,
- ZoneName);
- hp->rcode = NXDOMAIN;
- return(NXDOMAIN);
- }
- newdp = savedata(olddp->d_class, olddp->d_type, olddp->d_ttl,
- olddp->d_data, olddp->d_size);
- newdp->d_zone = olddp->d_zone;
- cp = (u_char *)newdp->d_data;
- cp += strlen(cp) + 1; /* skip origin string */
- cp += strlen(cp) + 1; /* skip in-charge string */
- putlong((u_long)(zp->z_serial), cp);
-#ifdef DEBUG
- if (debug >= 4) {
- fprintf(ddt, "after stuffing data into newdp:\n");
- printSOAdata(newdp);
- }
-#endif DEBUG
-
- if ((n = db_update(ZoneName, olddp, newdp, DB_DELETE,
- hashtab)) != NOERROR) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"InitDynUpdate: SOA update failed\n");
-#endif DEBUG
- hp->rcode = NOCHANGE;
- return(NOCHANGE);
- }
-
- /* Now update the RR itself */
- if (doupdate(msg, msglen, msg + sizeof(HEADER),
- zonenum, (struct databuf *)0, DB_NODATA) < 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"InitDynUpdate: doupdate failed\n");
-#endif DEBUG
- /* doupdate fills in rcode */
- return(hp->rcode);
- }
- zp->hasChanged++;
- return(NOERROR);
- }
-}
-
-#ifdef DEBUG
-/*
- * Print the contents of the data in databuf pointed to by dp for an SOA record
- */
-printSOAdata(dp)
- struct databuf *dp;
-{
- register u_char *cp;
-
- if (!debug)
- return; /* Otherwise fprintf to ddt will bomb */
- cp = (u_char *)dp->d_data;
- fprintf(ddt, "printSOAdata(%x): origin(%x)='%s'\n", dp, cp, cp);
- cp += strlen(cp) + 1; /* skip origin string */
- fprintf(ddt, "printSOAdata: in-charge(%x)='%s'\n", cp, cp);
- cp += strlen(cp) + 1; /* skip in-charge string */
- fprintf(ddt, "printSOAdata: serial(%x)=%d\n", cp, _getlong(cp));
-}
-#endif DEBUG
-#endif ALLOW_UPDATES
-
-struct databuf *
-rm_datum(dp, np, pdp)
-register struct databuf *pdp, *dp;
-register struct namebuf *np;
-{
- register struct databuf *ndp = dp->d_next;
-
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt, "rm_datum(%x, %x, %x) -> %x\n",
- dp, np->n_data, pdp, ndp);
-#endif DEBUG
- if (pdp == NULL)
- np->n_data = ndp;
- else
- pdp->d_next = ndp;
- rminv(dp);
- (void) free((char *)dp);
- return(ndp);
-}
-
-startxfr(qsp, np, msg, msglen)
- struct qstream *qsp;
- struct namebuf *np;
- char *msg;
- int msglen;
-{
- register FILE *rfp;
- int fdstat;
-
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"startxfr()\n");
-#endif
- /*
- * child does the work while
- * the parent continues
- */
- if (fork() == 0) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt,"startxfr: child pid %d\n", getpid());
-#endif
- rfp = fdopen(qsp->s_rfd, "w");
- setproctitle("zone XFR to", qsp->s_rfd);
- fdstat = fcntl(qsp->s_rfd, F_GETFL, 0);
- if (fdstat != -1)
- (void) fcntl(qsp->s_rfd, F_SETFL, fdstat & ~O_NONBLOCK);
- fwritemsg(rfp, msg, msglen);
- doaxfr(np, rfp, 1);
- fwritemsg(rfp, msg, msglen);
- (void) fflush(rfp);
- exit(0);
- }
- sqrm(qsp);
-}
diff --git a/usr.sbin/named/ns_resp.c b/usr.sbin/named/ns_resp.c
deleted file mode 100644
index 4a8f786b5ca..00000000000
--- a/usr.sbin/named/ns_resp.c
+++ /dev/null
@@ -1,1704 +0,0 @@
-/*
- * Copyright (c) 1986, 1988, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)ns_resp.c 4.65 (Berkeley) 3/3/91";*/
-static char rcsid[] = "$Id: ns_resp.c,v 1.1 1995/10/18 08:47:51 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/file.h>
-#include <netinet/in.h>
-#include <syslog.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include <stdio.h>
-#include "ns.h"
-#include "db.h"
-
-extern int debug;
-extern FILE *ddt;
-extern int errno;
-extern u_char *dnptrs[];
-extern time_t retrytime();
-extern struct fwdinfo *fwdtab;
-extern struct sockaddr_in from_addr; /* Source addr of last packet */
-extern int needs_prime_cache;
-extern int priming;
-
-struct qinfo *sysquery();
-
-ns_resp(msg, msglen)
- u_char *msg;
- int msglen;
-{
- register struct qinfo *qp;
- register HEADER *hp;
- register struct qserv *qs;
- register struct databuf *ns, *ns2;
- register u_char *cp;
- struct databuf *nsp[NSMAX], **nspp;
- int i, c, n, ancount, aucount, nscount, arcount;
- int type, class, dbflags;
- int cname = 0; /* flag for processing cname response */
- int count, founddata, foundname;
- int buflen;
- int newmsglen;
- char name[MAXDNAME], *dname;
- char *fname;
- u_char newmsg[BUFSIZ];
- u_char **dpp, *tp;
- time_t rtrip;
-
- struct hashbuf *htp;
- struct namebuf *np;
- struct netinfo *lp;
- extern struct netinfo *local();
- extern int nsid;
- extern int addcount;
- struct fwdinfo *fwd;
-
-#ifdef STATS
- stats[S_RESPONSES].cnt++;
-#endif
- hp = (HEADER *) msg;
- if ((qp = qfindid(hp->id)) == NULL ) {
-#ifdef DEBUG
- if (debug > 1)
- fprintf(ddt,"DUP? dropped (id %d)\n", ntohs(hp->id));
-#endif
-#ifdef STATS
- stats[S_DUPRESP].cnt++;
-#endif
- return;
- }
-
-#ifdef DEBUG
- if (debug >= 2)
- fprintf(ddt,"%s response nsid=%d id=%d\n",
- qp->q_system ? "SYSTEM" : "USER",
- ntohs(qp->q_nsid), ntohs(qp->q_id));
-#endif
-
- /*
- * Here we handle bad responses from servers.
- * Several possibilities come to mind:
- * The server is sick and returns SERVFAIL
- * The server returns some garbage opcode (its sick)
- * The server can't understand our query and return FORMERR
- * In all these cases, we simply drop the packet and force
- * a retry. This will make him look bad due to unresponsiveness.
- * Be sure not to include authoritative NXDOMAIN
- */
- if ((hp->rcode != NOERROR && hp->rcode != NXDOMAIN)
- || (hp->rcode == NXDOMAIN && !hp->aa)
- || hp->opcode != QUERY) {
-#ifdef DEBUG
- if (debug >= 2)
- fprintf(ddt,"resp: error (ret %d, op %d), dropped\n",
- hp->rcode, hp->opcode);
-#endif
-#ifdef STATS
- stats[S_BADRESPONSES].cnt++;
-#endif
- return;
- }
-
-#ifdef ALLOW_UPDATES
- if ( (hp->rcode == NOERROR) &&
- (hp->opcode == UPDATEA || hp->opcode == UPDATED ||
- hp->opcode == UPDATEDA || hp->opcode == UPDATEM ||
- hp->opcode == UPDATEMA) ) {
- /*
- * Update the secondary's copy, now that the primary
- * successfully completed the update. Zone doesn't matter
- * for dyn. update -- doupdate calls findzone to find it
- */
- doupdate(qp->q_msg, qp->q_msglen, qp->q_msg + sizeof(HEADER),
- 0, (struct databuf *)0, 0);
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"resp: leaving, UPDATE*\n");
-#endif
- /* return code filled in by doupdate */
- goto return_msg;
- }
-#endif ALLOW_UPDATES
-
- /*
- * Determine if the response came from a forwarder. Packets from
- * anyplace not listed as a forwarder or as a server to whom we
- * might have forwarded the query will be dropped.
- */
- for (fwd = fwdtab; fwd != (struct fwdinfo *)NULL; fwd = fwd->next)
- if (bcmp((char *)&fwd->fwdaddr.sin_addr, &from_addr.sin_addr,
- sizeof(struct in_addr)) == 0)
- break;
- /*
- * If we were using nameservers, find the qinfo pointer and update
- * the rtt and fact that we have called on this server before.
- */
- if (fwd == (struct fwdinfo *)NULL) {
- struct timeval *stp;
-
- for (n = 0, qs = qp->q_addr; n < qp->q_naddr; n++, qs++)
- if (bcmp((char *)&qs->ns_addr.sin_addr,
- &from_addr.sin_addr, sizeof(struct in_addr)) == 0)
- break;
- if (n >= qp->q_naddr) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "Response from unexpected source %s\n",
- inet_ntoa(from_addr.sin_addr));
-#endif DEBUG
-#ifdef STATS
- stats[S_MARTIANS].cnt++;
-#endif
- /*
- * We don't know who this response came from so it
- * gets dropped on the floor.
- */
- return;
- }
- stp = &qs->stime;
-
- /* Handle response from different (untried) interface */
- if (stp->tv_sec == 0) {
- ns = qs->ns;
- while (qs > qp->q_addr &&
- (qs->stime.tv_sec == 0 || qs->ns != ns))
- qs--;
- *stp = qs->stime;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "Response from unused address %s, assuming %s\n",
- inet_ntoa(from_addr.sin_addr),
- inet_ntoa(qs->ns_addr.sin_addr));
-#endif DEBUG
- }
-
- /* compute query round trip time */
- rtrip = ((tt.tv_sec - stp->tv_sec) * 1000 +
- (tt.tv_usec - stp->tv_usec) / 1000);
-
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt,"stime %d/%d now %d/%d rtt %d\n",
- stp->tv_sec, stp->tv_usec,
- tt.tv_sec, tt.tv_usec, rtrip);
-#endif
- /* prevent floating point overflow, limit to 1000 sec */
- if (rtrip > 1000000)
- rtrip = 1000000;
- ns = qs->nsdata;
- /*
- * Don't update nstime if this doesn't look
- * like an address databuf now. XXX
- */
- if (ns->d_type == T_A && ns->d_class == qs->ns->d_class) {
- if (ns->d_nstime == 0)
- ns->d_nstime = (u_long)rtrip;
- else
- ns->d_nstime = ns->d_nstime * ALPHA +
- (1-ALPHA) * (u_long)rtrip;
- /* prevent floating point overflow, limit to 1000 sec */
- if (ns->d_nstime > 1000000)
- ns->d_nstime = 1000000;
- }
-
- /*
- * Record the source so that we do not use this NS again.
- */
- if(qp->q_nusedns < NSMAX) {
- qp->q_usedns[qp->q_nusedns++] = qs->ns;
-#ifdef DEBUG
- if(debug > 1)
- fprintf(ddt, "NS #%d addr %s used, rtt %d\n",
- n, inet_ntoa(qs->ns_addr.sin_addr),
- ns->d_nstime);
-#endif DEBUG
- }
-
- /*
- * Penalize those who had earlier chances but failed
- * by multiplying round-trip times by BETA (>1).
- * Improve nstime for unused addresses by applying GAMMA.
- * The GAMMA factor makes unused entries slowly
- * improve, so they eventually get tried again.
- * GAMMA should be slightly less than 1.
- * Watch out for records that may have timed out
- * and are no longer the correct type. XXX
- */
-
- for (n = 0, qs = qp->q_addr; n < qp->q_naddr; n++, qs++) {
- ns2 = qs->nsdata;
- if (ns2 == ns)
- continue;
- if (ns2->d_type != T_A ||
- ns2->d_class != qs->ns->d_class) /* XXX */
- continue;
- if (qs->stime.tv_sec) {
- if (ns2->d_nstime == 0)
- ns2->d_nstime = rtrip * BETA;
- else
- ns2->d_nstime =
- ns2->d_nstime * BETA + (1-ALPHA) * rtrip;
- if (ns2->d_nstime > 1000000)
- ns2->d_nstime = 1000000;
- } else
- ns2->d_nstime = ns2->d_nstime * GAMMA;
-#ifdef DEBUG
- if(debug > 1)
- fprintf(ddt, "NS #%d %s rtt now %d\n", n,
- inet_ntoa(qs->ns_addr.sin_addr),
- ns2->d_nstime);
-#endif DEBUG
- }
- }
-
- /*
- * Skip query section
- */
- addcount = 0;
- cp = msg + sizeof(HEADER);
- dpp = dnptrs;
- *dpp++ = msg;
- if ((*cp & INDIR_MASK) == 0)
- *dpp++ = cp;
- *dpp = NULL;
- if (hp->qdcount) {
- n = dn_skipname(cp, msg + msglen);
- if (n <= 0)
- goto formerr;
- cp += n;
- GETSHORT(type, cp);
- GETSHORT(class, cp);
- if (cp - msg > msglen)
- goto formerr;
- }
-
- /*
- * Save answers, authority, and additional records for future use.
- */
- ancount = ntohs(hp->ancount);
- aucount = ntohs(hp->nscount);
- arcount = ntohs(hp->arcount);
- nscount = 0;
- tp = cp;
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"resp: ancount %d, aucount %d, arcount %d\n",
- ancount, aucount, arcount);
-#endif
-
- /*
- * If there's an answer, check if it's a CNAME response;
- * if no answer but aucount > 0, see if there is an NS
- * or just an SOA. (NOTE: ancount might be 1 with a CNAME,
- * and NS records may still be in the authority section;
- * we don't bother counting them, as we only use nscount
- * if ancount == 0.)
- */
- if (ancount == 1 || (ancount == 0 && aucount > 0)) {
- c = aucount;
- do {
- if (tp - msg >= msglen)
- goto formerr;
- n = dn_skipname(tp, msg + msglen);
- if (n <= 0)
- goto formerr;
- tp += n; /* name */
- GETSHORT(i, tp); /* type */
- tp += sizeof(u_short); /* class */
- tp += sizeof(u_long); /* ttl */
- GETSHORT(count, tp); /* dlen */
- if (tp - msg > msglen - count)
- goto formerr;
- tp += count;
- if (ancount && i == T_CNAME) {
- cname++;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"CNAME - needs more processing\n");
-#endif
- if (!qp->q_cmsglen) {
- qp->q_cmsg = qp->q_msg;
- qp->q_cmsglen = qp->q_msglen;
- qp->q_msg = NULL;
- qp->q_msglen = 0;
- }
- }
- /*
- * See if authority record is a nameserver.
- */
- if (ancount == 0 && i == T_NS)
- nscount++;
- } while (--c > 0);
- tp = cp;
- }
-
- /*
- * Add the info received in the response to the Data Base
- */
- c = ancount + aucount + arcount;
-#ifdef notdef
- /*
- * If the request was for a CNAME that doesn't exist,
- * but the name is valid, fetch any other data for the name.
- * DON'T do this now, as it will requery if data are already
- * in the cache (maybe later with negative caching).
- */
- if (hp->qdcount && type == T_CNAME && c == 0 && hp->rcode == NOERROR &&
- !qp->q_system) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"resp: leaving, no CNAME\n");
-#endif
- /* Cause us to put it in the cache later */
- prime(class, T_ANY, qp);
-
- /* Nothing to store, just give user the answer */
- goto return_msg;
- }
-#endif /* notdef */
-
- nspp = nsp;
- if (qp->q_system)
- dbflags = DB_NOTAUTH | DB_NODATA;
- else
- dbflags = DB_NOTAUTH | DB_NODATA | DB_NOHINTS;
- for (i = 0; i < c; i++) {
- struct databuf *ns3;
-
- if (cp >= msg + msglen)
- goto formerr;
- ns3 = 0;
- if ((n = doupdate(msg, msglen, cp, 0, &ns3, dbflags)) < 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"resp: leaving, doupdate failed\n");
-#endif
- /* return code filled in by doupdate */
- goto return_msg;
- }
- /*
- * Remember nameservers from the authority section
- * for referrals.
- * (This is usually overwritten by findns below(?). XXX
- */
- if (ns3 && i >= ancount && i < ancount + aucount &&
- nspp < &nsp[NSMAX-1])
- *nspp++ = ns3;
- cp += n;
- }
-
- if (qp->q_system && ancount) {
- if (qp->q_system == PRIMING_CACHE)
- check_root();
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt,"resp: leaving, SYSQUERY ancount %d\n", ancount);
-#endif
- qremove(qp);
- return;
- }
-
- if (cp > msg + msglen)
- goto formerr;
-
- /*
- * If there are addresses and this is a local query,
- * sort them appropriately for the local context.
- */
- if (ancount > 1 && (lp = local(&qp->q_from)) != NULL)
- sort_response(tp, ancount, lp, msg + msglen);
-
- /*
- * An answer to a T_ANY query or a successful answer to a
- * regular query with no indirection, then just return answer.
- */
- if ((hp->qdcount && type == T_ANY && ancount) ||
- (!cname && !qp->q_cmsglen && ancount)) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"resp: got as much answer as there is\n");
-#endif
- goto return_msg;
- }
-
- /*
- * Eventually we will want to cache this negative answer.
- */
- if (ancount == 0 && nscount == 0 &&
- (hp->aa || fwd || class == C_ANY)) {
- /* We have an authoritative NO */
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"resp: leaving auth NO\n");
-#endif
- if (qp->q_cmsglen) {
- msg = (u_char *)qp->q_cmsg;
- msglen = qp->q_cmsglen;
- hp = (HEADER *)msg;
- }
- goto return_msg;
- }
-
- /*
- * All messages in here need further processing. i.e. they
- * are either CNAMEs or we got referred again.
- */
- count = 0;
- founddata = 0;
- foundname = 0;
- dname = name;
- if (!cname && qp->q_cmsglen && ancount) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"Cname second pass\n");
-#endif
- newmsglen = qp->q_cmsglen;
- bcopy(qp->q_cmsg, newmsg, newmsglen);
- } else {
- newmsglen = msglen;
- bcopy(msg, newmsg, newmsglen);
- }
- hp = (HEADER *) newmsg;
- hp->ancount = 0;
- hp->nscount = 0;
- hp->arcount = 0;
- dnptrs[0] = newmsg;
- dnptrs[1] = NULL;
- cp = newmsg + sizeof(HEADER);
- if (cname)
- cp += dn_skipname(cp, newmsg + newmsglen) + QFIXEDSZ;
- if ((n = dn_expand(newmsg, newmsg + newmsglen,
- cp, (u_char *)dname, sizeof(name))) < 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"dn_expand failed\n" );
-#endif
- goto servfail;
- }
- if (!cname)
- cp += n + QFIXEDSZ;
- buflen = sizeof(newmsg) - (cp - newmsg);
-
-try_again:
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"resp: nlookup(%s) type=%d\n",dname, type);
-#endif
- fname = "";
- htp = hashtab; /* lookup relative to root */
- np = nlookup(dname, &htp, &fname, 0);
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"resp: %s '%s' as '%s' (cname=%d)\n",
- np == NULL ? "missed" : "found", dname, fname, cname);
-#endif
- if (np == NULL || fname != dname)
- goto fetch_ns;
-
- foundname++;
- count = cp - newmsg;
- n = finddata(np, class, type, hp, &dname, &buflen, &count);
- if (n == 0)
- goto fetch_ns; /* NO data available */
- cp += n;
- buflen -= n;
- hp->ancount += count;
- if (fname != dname && type != T_CNAME && type != T_ANY) {
- cname++;
- goto try_again;
- }
- founddata = 1;
-
-#ifdef DEBUG
- if (debug >= 3) {
- fprintf(ddt,"resp: foundname = %d count = %d ", foundname, count);
- fprintf(ddt,"founddata = %d cname = %d\n", founddata, cname);
- }
-#endif
-
-fetch_ns:
- hp->ancount = htons(hp->ancount);
- /*
- * Look for name servers to refer to and fill in the authority
- * section or record the address for forwarding the query
- * (recursion desired).
- */
- switch (findns(&np, class, nsp, &count)) {
- case NXDOMAIN: /* shouldn't happen */
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"req: leaving (%s, rcode %d)\n",
- dname, hp->rcode);
-#endif
- if (!foundname)
- hp->rcode = NXDOMAIN;
- if (class != C_ANY) {
- hp->aa = 1;
- /*
- * should return SOA if founddata == 0,
- * but old named's are confused by an SOA
- * in the auth. section if there's no error.
- */
- if (foundname == 0 && np) {
- n = doaddauth(hp, cp, buflen, np, nsp[0]);
- cp += n;
- buflen -= n;
- }
- }
- goto return_newmsg;
-
- case SERVFAIL:
- goto servfail;
- }
-
- if (founddata) {
- hp = (HEADER *)newmsg;
- n = add_data(np, nsp, cp, buflen);
- if (n < 0) {
- hp->tc = 1;
- n = (-n);
- }
- cp += n;
- buflen -= n;
- hp->nscount = htons((u_short)count);
- goto return_newmsg;
- }
-
- /*
- * If we get here, we don't have the answer yet and are about
- * to iterate to try and get it. First, infinite loop avoidance.
- */
- if (qp->q_nqueries++ > MAXQUERIES) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"resp: MAXQUERIES exceeded (%s, class %d, type %d)\n",
- dname, class, type);
-#endif
- syslog(LOG_NOTICE,
- "MAXQUERIES exceeded, possible data loop in resolving (%s)",
- dname);
- goto servfail;
- }
-
- /* Reset the query control structure */
- qp->q_naddr = 0;
- qp->q_curaddr = 0;
- qp->q_fwd = fwdtab;
- if (nslookup(nsp, qp) == 0) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"resp: no addrs found for NS's\n");
-#endif
- goto servfail;
- }
- for (n = 0; n < qp->q_naddr; n++)
- qp->q_addr[n].stime.tv_sec = 0;
- if (!qp->q_fwd)
- qp->q_addr[0].stime = tt;
- if (cname) {
- if (qp->q_cname++ == MAXCNAMES) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"resp: leaving, MAXCNAMES exceeded\n");
-#endif
- goto servfail;
- }
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"q_cname = %d\n",qp->q_cname);
- if (debug >= 3)
- fprintf(ddt,"resp: building recursive query; nslookup\n");
-#endif
- if (qp->q_msg)
- (void) free(qp->q_msg);
- if ((qp->q_msg = malloc(BUFSIZ)) == NULL) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"resp: malloc error\n");
-#endif
- goto servfail;
- }
- qp->q_msglen = res_mkquery(QUERY, dname, class,
- type, (char *)NULL, 0, NULL, qp->q_msg, BUFSIZ);
- hp = (HEADER *) qp->q_msg;
- hp->rd = 0;
- } else
- hp = (HEADER *)qp->q_msg;
- hp->id = qp->q_nsid = htons((u_short)++nsid);
- if (qp->q_fwd)
- hp->rd = 1;
- unsched(qp);
- schedretry(qp, retrytime(qp));
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"resp: forw -> %s %d (%d) nsid=%d id=%d %dms\n",
- inet_ntoa(Q_NEXTADDR(qp,0)->sin_addr),
- ds, ntohs(Q_NEXTADDR(qp,0)->sin_port),
- ntohs(qp->q_nsid), ntohs(qp->q_id),
- qp->q_addr[0].nsdata->d_nstime);
- if ( debug >= 10)
- fp_query((char *)msg, ddt);
-#endif
- if (sendto(ds, qp->q_msg, qp->q_msglen, 0,
- (struct sockaddr *)Q_NEXTADDR(qp,0),
- sizeof(struct sockaddr_in)) < 0) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt, "sendto error = %d\n", errno);
-#endif
- }
- hp->rd = 0; /* leave set to 0 for dup detection */
-#ifdef STATS
- stats[S_OUTPKTS].cnt++;
-#endif
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"resp: Query sent.\n");
-#endif
- return;
-
-formerr:
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR resp() from %s size err %d, msglen %d\n",
- inet_ntoa(from_addr.sin_addr),
- cp-msg, msglen);
-#endif
- syslog(LOG_INFO, "Malformed response from %s\n",
- inet_ntoa(from_addr.sin_addr));
-#ifdef STATS
- stats[S_RESPFORMERR].cnt++;
-#endif
- return;
-
-return_msg:
-#ifdef STATS
- stats[S_RESPOK].cnt++;
-#endif
- /* The "standard" return code */
- hp->qr = 1;
- hp->id = qp->q_id;
- hp->rd = 1;
- hp->ra = 1;
- (void) send_msg(msg, msglen, qp);
- qremove(qp);
- return;
-
-return_newmsg:
-#ifdef STATS
- stats[S_RESPOK].cnt++;
-#endif
- if (addcount) {
- n = doaddinfo(hp, cp, buflen);
- cp += n;
- buflen -= n;
- }
-
- hp->id = qp->q_id;
- hp->rd = 1;
- hp->ra = 1;
- hp->qr = 1;
- (void) send_msg(newmsg, cp - newmsg, qp);
- qremove(qp);
- return;
-
-servfail:
-#ifdef STATS
- stats[S_RESPFAIL].cnt++;
-#endif
- hp = (HEADER *)(cname ? qp->q_cmsg : qp->q_msg);
- hp->rcode = SERVFAIL;
- hp->id = qp->q_id;
- hp->rd = 1;
- hp->ra = 1;
- hp->qr = 1;
- (void) send_msg((char *)hp, (cname ? qp->q_cmsglen : qp->q_msglen), qp);
- qremove(qp);
- return;
-}
-
-/*
- * Decode the resource record 'rrp' and update the database.
- * If savens is true, record pointer for forwarding queries a second time.
- */
-doupdate(msg, msglen, rrp, zone, savens, flags)
- char *msg;
- u_char *rrp;
- struct databuf **savens;
- int msglen, zone, flags;
-{
- register u_char *cp;
- register int n;
- int class, type, dlen, n1;
- u_long ttl;
- struct databuf *dp;
- char dname[MAXDNAME];
- u_char *cp1;
- u_char data[BUFSIZ];
- register HEADER *hp = (HEADER *) msg;
-#ifdef ALLOW_UPDATES
- int zonenum;
-#endif
-
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt,"doupdate(zone %d, savens %x, flags %x)\n",
- zone, savens, flags);
-#endif
-
- cp = rrp;
- if ((n = dn_expand((u_char *)msg, (u_char *)msg + msglen, cp,
- (u_char *)dname, sizeof(dname))) < 0) {
- hp->rcode = FORMERR;
- return (-1);
- }
- cp += n;
- GETSHORT(type, cp);
- GETSHORT(class, cp);
- GETLONG(ttl, cp);
- GETSHORT(dlen, cp);
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt,"doupdate: dname %s type %d class %d ttl %d\n",
- dname, type, class, ttl);
-#endif
- /*
- * Convert the resource record data into the internal
- * database format.
- */
- switch (type) {
- case T_A:
- case T_WKS:
- case T_HINFO:
- case T_UINFO:
- case T_UID:
- case T_GID:
- case T_TXT:
-#ifdef ALLOW_T_UNSPEC
- case T_UNSPEC:
-#endif ALLOW_T_UNSPEC
- cp1 = cp;
- n = dlen;
- cp += n;
- break;
-
- case T_CNAME:
- case T_MB:
- case T_MG:
- case T_MR:
- case T_NS:
- case T_PTR:
- if ((n = dn_expand((u_char *)msg, (u_char *)msg + msglen,
- cp, data, sizeof(data))) < 0) {
- hp->rcode = FORMERR;
- return (-1);
- }
- cp += n;
- cp1 = data;
- n = strlen((char *)data) + 1;
- break;
-
- case T_MINFO:
- case T_SOA:
- if ((n = dn_expand((u_char *)msg, (u_char *)msg + msglen,
- cp, data, sizeof(data))) < 0) {
- hp->rcode = FORMERR;
- return (-1);
- }
- cp += n;
- cp1 = data + (n = strlen((char *)data) + 1);
- n1 = sizeof(data) - n;
- if (type == T_SOA)
- n1 -= 5 * sizeof(u_long);
- if ((n = dn_expand((u_char *)msg, (u_char *)msg + msglen,
- cp, cp1, n1)) < 0) {
- hp->rcode = FORMERR;
- return (-1);
- }
- cp += n;
- cp1 += strlen((char *)cp1) + 1;
- if (type == T_SOA) {
- bcopy(cp, cp1, n = 5 * sizeof(u_long));
- cp += n;
- cp1 += n;
- }
- n = cp1 - data;
- cp1 = data;
- break;
-
- case T_MX:
- /* grab preference */
- bcopy(cp,data,sizeof(u_short));
- cp1 = data + sizeof(u_short);
- cp += sizeof(u_short);
-
- /* get name */
- if ((n = dn_expand((u_char *)msg, (u_char *)msg + msglen,
- cp, cp1, sizeof(data) - sizeof(u_short))) < 0)
- return(-1);
- cp += n;
-
- /* compute end of data */
- cp1 += strlen((char *)cp1) + 1;
- /* compute size of data */
- n = cp1 - data;
- cp1 = data;
- break;
-
- default:
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"unknown type %d\n", type);
-#endif
- return ((cp - rrp) + dlen);
- }
- if (n > MAXDATA) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,
- "update type %d: %d bytes is too much data\n",
- type, n);
-#endif
- hp->rcode = NOCHANGE; /* XXX - FORMERR ??? */
- return(-1);
- }
-
-#ifdef ALLOW_UPDATES
- /*
- * If this is a dynamic update request, process it specially; else,
- * execute normal update code.
- */
- switch(hp->opcode) {
-
- /* For UPDATEM and UPDATEMA, do UPDATED/UPDATEDA followed by UPDATEA */
- case UPDATEM:
- case UPDATEMA:
-
- /*
- * The named code for UPDATED and UPDATEDA is the same except that for
- * UPDATEDA we we ignore any data that was passed: we just delete all
- * RRs whose name, type, and class matches
- */
- case UPDATED:
- case UPDATEDA:
- if (type == T_SOA) { /* Not allowed */
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "UDPATE: REFUSED - SOA delete\n");
-#endif
- hp->rcode = REFUSED;
- return(-1);
- }
- /*
- * Don't check message length if doing UPDATEM/UPDATEMA,
- * since the whole message wont have been demarshalled until
- * we reach the code for UPDATEA
- */
- if ( (hp->opcode == UPDATED) || (hp->opcode == UPDATEDA) ) {
- if (cp != (u_char *)(msg + msglen)) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR UPDATE message length off\n");
-#endif
- hp->rcode = FORMERR;
- return(-1);
- }
- }
- if ((zonenum = findzone(dname, class)) == 0) {
- hp->rcode = NXDOMAIN;
- return(-1);
- }
- if (zones[zonenum].z_state & Z_DYNADDONLY) {
- hp->rcode = NXDOMAIN;
- return(-1);
- }
- if ( (hp->opcode == UPDATED) || (hp->opcode == UPDATEM) ) {
- /* Make a dp for use in db_update, as old dp */
- dp = savedata(class, type, 0, cp1, n);
- dp->d_zone = zonenum;
- n = db_update(dname, dp, NULL, DB_MEXIST | DB_DELETE,
- hashtab);
- if (n != OK) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"UPDATE: db_update failed\n");
-#endif DEBUG
- free( (struct databuf *) dp);
- hp->rcode = NOCHANGE;
- return(-1);
- }
- } else { /* UPDATEDA or UPDATEMA */
- int DeletedOne = 0;
- /* Make a dp for use in db_update, as old dp */
- dp = savedata(class, type, 0, NULL, 0);
- dp->d_zone = zonenum;
- do { /* Loop and delete all matching RR(s) */
- n = db_update(dname, dp, NULL, DB_DELETE,
- hashtab);
- if (n != OK)
- break;
- DeletedOne++;
- } while (1);
- free( (struct databuf *) dp);
- /* Ok for UPDATEMA not to have deleted any RRs */
- if (!DeletedOne && hp->opcode == UPDATEDA) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"UPDATE: db_update failed\n");
-#endif DEBUG
- hp->rcode = NOCHANGE;
- return(-1);
- }
- }
- if ( (hp->opcode == UPDATED) || (hp->opcode == UPDATEDA) )
- return (cp - rrp);;
- /*
- * Else unmarshal the RR to be added and continue on to
- * UPDATEA code for UPDATEM/UPDATEMA
- */
- if ((n =
- dn_expand(msg, msg+msglen, cp, dname, sizeof(dname))) < 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR UPDATE expand name failed\n");
-#endif
- hp->rcode = FORMERR;
- return(-1);
- }
- cp += n;
- GETSHORT(type, cp);
- GETSHORT(class, cp);
- GETLONG(ttl, cp);
- GETSHORT(n, cp);
- cp1 = cp;
-/**** XXX - need bounds checking here ****/
- cp += n;
-
- case UPDATEA:
- if (n > MAXDATA) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"UPDATE: too much data\n");
-#endif
- hp->rcode = NOCHANGE;
- return(-1);
- }
- if (cp != (u_char *)(msg + msglen)) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"FORMERR UPDATE message length off\n");
-#endif
- hp->rcode = FORMERR;
- return(-1);
- }
- if ((zonenum = findzone(dname, class)) == 0) {
- hp->rcode = NXDOMAIN;
- return(-1);
- }
- if (zones[zonenum].z_state & Z_DYNADDONLY) {
- struct hashbuf *htp = hashtab;
- char *fname;
- if (nlookup(dname, &htp, &fname, 0) &&
- !strcmp(dname, fname)) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"refusing add of existing name\n");
-#endif
- hp->rcode = REFUSED;
- return(-1);
- }
- }
- dp = savedata(class, type, ttl, cp1, n);
- dp->d_zone = zonenum;
- if ((n = db_update(dname, NULL, dp, DB_NODATA,
- hashtab)) != OK) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"UPDATE: db_update failed\n");
-#endif
- hp->rcode = NOCHANGE;
- return (-1);
- }
- else
- return (cp - rrp);
- }
-#endif ALLOW_UPDATES
-
- if (zone == 0)
- ttl += tt.tv_sec;
- dp = savedata(class, type, ttl, cp1, n);
- dp->d_zone = zone;
- if ((n = db_update(dname, dp, dp, flags, hashtab)) < 0) {
-#ifdef DEBUG
- if (debug && (n != DATAEXISTS))
- fprintf(ddt,"update failed (%d)\n", n);
- else if (debug >= 3)
- fprintf(ddt,"update failed (DATAEXISTS)\n");
-#endif
- (void) free((char *)dp);
- } else if (type == T_NS && savens != NULL)
- *savens = dp;
- return (cp - rrp);
-}
-
-send_msg(msg, msglen, qp)
- char *msg;
- int msglen;
- struct qinfo *qp;
-{
- extern struct qinfo *qhead;
-#ifdef DEBUG
- struct qinfo *tqp;
-#endif DEBUG
-
- if (qp->q_system)
- return(1);
-#ifdef DEBUG
- if (debug) {
- fprintf(ddt,"send_msg -> %s (%s %d %d) id=%d\n",
- inet_ntoa(qp->q_from.sin_addr),
- qp->q_stream == QSTREAM_NULL ? "UDP" : "TCP",
- qp->q_stream == QSTREAM_NULL ? qp->q_dfd
- : qp->q_stream->s_rfd,
- ntohs(qp->q_from.sin_port),
- ntohs(qp->q_id));
- }
- if (debug>4)
- for (tqp = qhead; tqp!=QINFO_NULL; tqp = tqp->q_link) {
- fprintf(ddt, "qp %x q_id: %d q_nsid: %d q_msglen: %d ",
- tqp, tqp->q_id,tqp->q_nsid,tqp->q_msglen);
- fprintf(ddt,"q_naddr: %d q_curaddr: %d\n", tqp->q_naddr,
- tqp->q_curaddr);
- fprintf(ddt,"q_next: %x q_link: %x\n", qp->q_next,
- qp->q_link);
- }
- if (debug >= 10)
- fp_query(msg, ddt);
-#endif DEBUG
- if (qp->q_stream == QSTREAM_NULL) {
- if (sendto(qp->q_dfd, msg, msglen, 0,
- (struct sockaddr *)&qp->q_from, sizeof(qp->q_from)) < 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "sendto error errno= %d\n",errno);
-#endif
- return(1);
- }
-#ifdef STATS
- stats[S_OUTPKTS].cnt++;
-#endif
- } else {
- (void) writemsg(qp->q_stream->s_rfd, msg, msglen);
- sq_done(qp->q_stream);
- }
- return(0);
-}
-
-prime(class, type, oqp)
- int class, type;
- register struct qinfo *oqp;
-{
- char dname[BUFSIZ];
-
- if (oqp->q_msg == NULL)
- return;
- if (dn_expand((u_char *)oqp->q_msg,
- (u_char *)oqp->q_msg + oqp->q_msglen,
- (u_char *)oqp->q_msg + sizeof(HEADER), (u_char *)dname,
- sizeof(dname)) < 0)
- return;
-#ifdef DEBUG
- if (debug >= 2)
- fprintf(ddt,"prime: %s\n", dname);
-#endif
- (void) sysquery(dname, class, type);
-}
-
-
-prime_cache()
-{
- register struct qinfo *qp;
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"prime_cache: priming = %d\n", priming);
-#endif
-#ifdef STATS
- stats[S_PRIMECACHE].cnt++;
-#endif
- if (!priming && fcachetab->h_tab[0] != NULL && !forward_only) {
- priming++;
- if ((qp = sysquery("", C_IN, T_NS)) == NULL)
- priming = 0;
- else
- qp->q_system = PRIMING_CACHE;
- }
- needs_prime_cache = 0;
- return;
-}
-
-struct qinfo *
-sysquery(dname, class, type)
- char *dname;
- int class, type;
-{
- extern struct qinfo *qhead;
- extern int nsid;
- register struct qinfo *qp, *oqp;
- register HEADER *hp;
- struct namebuf *np;
- struct databuf *nsp[NSMAX];
- struct hashbuf *htp;
- char *fname;
- int count;
-
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt,"sysquery(%s, %d, %d)\n", dname, class, type);
-#endif
-#ifdef STATS
- stats[S_SYSQUERIES].cnt++;
-#endif
- htp = hashtab;
- if (priming && dname[0] == '\0')
- np = NULL;
- else if ((np = nlookup(dname, &htp, &fname, 1)) == NULL) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"sysquery: nlookup error on %s?\n", dname);
-#endif
- return(0);
- }
-
- switch (findns(&np, class, nsp, &count)) {
- case NXDOMAIN:
- case SERVFAIL:
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"sysquery: findns error on %s?\n", dname);
-#endif
- return(0);
- }
-
- /* build new qinfo struct */
- qp = qnew();
- qp->q_cmsg = qp->q_msg = NULL;
- qp->q_dfd = ds;
- qp->q_fwd = fwdtab;
- qp->q_system++;
-
- if ((qp->q_msg = malloc(BUFSIZ)) == NULL) {
- qfree(qp);
- return(0);
- }
- qp->q_msglen = res_mkquery(QUERY, dname, class,
- type, (char *)NULL, 0, NULL, qp->q_msg, BUFSIZ);
- hp = (HEADER *) qp->q_msg;
- hp->id = qp->q_nsid = htons((u_short)++nsid);
- hp->rd = (qp->q_fwd ? 1 : 0);
-
- /* First check for an already pending query for this data */
- for (oqp = qhead; oqp!=QINFO_NULL; oqp = oqp->q_link) {
- if (oqp != qp && oqp->q_msglen == qp->q_msglen &&
- bcmp((char *)oqp->q_msg+2, qp->q_msg+2, qp->q_msglen-2) == 0) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt, "sysquery: duplicate\n");
-#endif
- qfree(qp);
- return(0);
- }
- }
-
- if (nslookup(nsp, qp) == 0) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"resp: no addrs found for NS's\n");
-#endif
- qfree(qp);
- return(0);
- }
-
- schedretry(qp, retrytime(qp));
- if (qp->q_fwd == 0)
- qp->q_addr[0].stime = tt;
-
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"sysquery: send -> %s %d (%d), nsid=%d id=%d %dms\n",
- inet_ntoa(Q_NEXTADDR(qp,0)->sin_addr),
- qp->q_dfd, ntohs(Q_NEXTADDR(qp,0)->sin_port),
- ntohs(qp->q_nsid), ntohs(qp->q_id),
- qp->q_addr[0].nsdata->d_nstime);
- if ( debug >= 10)
- fp_query(qp->q_msg, ddt);
-#endif
- if (sendto(qp->q_dfd, qp->q_msg, qp->q_msglen, 0,
- (struct sockaddr *)Q_NEXTADDR(qp,0),
- sizeof(struct sockaddr_in)) < 0){
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "sendto error errno= %d\n",errno);
-#endif
- }
-#ifdef STATS
- stats[S_OUTPKTS].cnt++;
-#endif
- return(qp);
-}
-
-/*
- * Check the list of root servers after receiving a response
- * to a query for the root servers.
- */
-check_root()
-{
- register struct databuf *dp, *pdp;
- register struct namebuf *np;
- int count = 0;
-
- priming = 0;
- for (np = hashtab->h_tab[0]; np != NULL; np = np->n_next)
- if (np->n_dname[0] == '\0')
- break;
- if (np == NULL) {
- syslog(LOG_ERR, "check_root: Can't find root!\n");
- return;
- }
- for (dp = np->n_data; dp != NULL; dp = dp->d_next)
- if (dp->d_type == T_NS)
- count++;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"%d root servers\n", count);
-#endif
- if (count < MINROOTS) {
- syslog(LOG_WARNING,
- "check_root: %d root servers after query to root server < min",
- count);
- return;
- }
- pdp = NULL;
- dp = np->n_data;
- while (dp != NULL) {
- if (dp->d_type == T_NS && dp->d_zone == 0 &&
- dp->d_ttl < tt.tv_sec) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"deleting old root server '%s'\n",
- dp->d_data);
-#endif
- dp = rm_datum(dp, np, pdp);
- /* SHOULD DELETE FROM HINTS ALSO */
- continue;
- }
- pdp = dp;
- dp = dp->d_next;
- }
- check_ns();
-}
-
-/*
- * Check the root to make sure that for each NS record we have a A RR
- */
-check_ns()
-{
- register struct databuf *dp, *tdp;
- register struct namebuf *np, *tnp;
- struct hashbuf *htp;
- char *dname;
- int found_arr;
- char *fname;
- time_t curtime;
-
-#ifdef DEBUG
- if (debug >= 2)
- fprintf(ddt,"check_ns()\n");
-#endif
-#ifdef STATS
- stats[S_CHECKNS].cnt++;
-#endif
-
- curtime = (u_long) tt.tv_sec;
- for (np = hashtab->h_tab[0]; np != NULL; np = np->n_next) {
- if (np->n_dname[0] != 0)
- continue;
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (dp->d_type != T_NS)
- continue;
-
- /* look for A records */
- dname = dp->d_data;
- htp = hashtab;
- tnp = nlookup(dname, &htp, &fname, 0);
- if (tnp == NULL || fname != dname) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"check_ns: %s: not found %s %x\n",
- dname, fname, tnp);
-#endif
- (void) sysquery(dname, dp->d_class, T_A);
- continue;
- }
- /* look for name server addresses */
- found_arr = 0;
- for (tdp=tnp->n_data; tdp!=NULL; tdp=tdp->d_next) {
- if (tdp->d_type != T_A ||
- tdp->d_class != dp->d_class)
- continue;
- if ((tdp->d_zone == 0) &&
- (tdp->d_ttl < curtime)) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"check_ns: stale entry '%s'\n",
- tnp->n_dname);
-#endif
- /* Cache invalidate the address RR's */
- delete_all(tnp, dp->d_class, T_A);
- found_arr = 0;
- break;
- }
- found_arr++;
- }
- if (!found_arr)
- (void) sysquery(dname, dp->d_class, T_A);
- }
- }
-}
-
-#define MAXCLASS 255 /* belongs elsewhere */
-int norootlogged[MAXCLASS];
-
-/*
- * Find NS's or an SOA for the given dname (np) and fill in the
- * nsp array. Returns OK on success, and SERVFAIL on error.
- * We return NXDOMAIN to indicate we are authoritative.
- */
-findns(npp, class, nsp, countp)
- register struct namebuf **npp;
- struct databuf **nsp;
- int *countp;
-{
- register struct namebuf *np = *npp;
- register struct databuf *dp;
- register struct databuf **nspp;
- struct hashbuf *htp = hashtab;
-
- if (priming && (np == NULL || np->n_dname[0] == '\0'))
- htp = fcachetab;
-try_again:
- if (htp == fcachetab)
- needs_prime_cache = 1;
- while (np == NULL && htp != NULL) {
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt, "findns: using %s\n", htp == hashtab ?
- "cache" : "hints");
-#endif
- for (np = htp->h_tab[0]; np != NULL; np = np->n_next)
- if (np->n_dname[0] == '\0')
- break;
- htp = (htp == hashtab ? fcachetab : NULL); /* Fallback */
- }
- while(np != NULL) {
-#ifdef DEBUG
- if (debug >= 5)
- fprintf(ddt, "findns: np 0x%x\n", np);
-#endif
- /* Look first for SOA records. */
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (dp->d_zone != 0 && match(dp, class, T_SOA)) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"findns: SOA found\n");
-#endif
- if (zones[dp->d_zone].z_auth) {
- *npp = np;
- nsp[0] = dp;
- return(NXDOMAIN);
- } else
- return (SERVFAIL);
- }
- }
-
- /* If no SOA records, look for NS records. */
- nspp = &nsp[0];
- *nspp = NULL;
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (dp->d_type != T_NS ||
- (dp->d_class != class && class != C_ANY))
- continue;
- /*
- * Don't use records that may become invalid to
- * reference later when we do the rtt computation.
- * Never delete our safety-belt information!
- */
- if ((dp->d_zone == 0) &&
- (dp->d_ttl < (tt.tv_sec+900)) &&
- !(dp->d_flags & DB_F_HINT)) {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"findns: stale entry '%s'\n",
- np->n_dname);
-#endif
- /* Cache invalidate the NS RR's */
- if (dp->d_ttl < tt.tv_sec)
- delete_all(np, class, T_NS);
- goto try_parent;
- }
- if (nspp < &nsp[NSMAX-1])
- *nspp++ = dp;
- }
-
- *countp = nspp - nsp;
- if (*countp > 0) {
-#ifdef DEBUG
- if (debug >= 3)
- fprintf(ddt,"findns: %d NS's added for '%s'\n",
- *countp, np->n_dname);
-#endif
- *nspp = NULL;
- *npp = np;
- return(OK); /* Success, got some NS's */
- }
-try_parent:
- np = np->n_parent;
- }
- if (htp)
- goto try_again;
-#ifdef DEBUG
- if (debug)
- fprintf(ddt, "findns: No root nameservers for class %d?\n",
- class);
-#endif
- if ((unsigned)class < MAXCLASS && norootlogged[class] == 0) {
- norootlogged[class] = 1;
- syslog(LOG_ERR, "No root nameservers for class %d\n", class);
- }
- return(SERVFAIL);
-}
-
-/*
- * Extract RR's from the given node that match class and type.
- * Return number of bytes added to response.
- * If no matching data is found, then 0 is returned.
- */
-finddata(np, class, type, hp, dnamep, lenp, countp)
- struct namebuf *np;
- int class, type;
- register HEADER *hp;
- char **dnamep;
- int *lenp, *countp;
-{
- register struct databuf *dp;
- register char *cp;
- int buflen, n, count = 0, foundstale = 0;
-
- buflen = *lenp;
- cp = ((char *)hp) + *countp;
- for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
- if (!wanted(dp, class, type)) {
- if (type == T_CNAME && class == dp->d_class) {
- /* any data means no CNAME exists */
- *countp = 0;
- return(0);
- }
- continue;
- }
- if (stale(dp)) {
- /*
- * Don't use stale data.
- * Would like to call delete_all here
- * and continue, but the data chain would get
- * munged; can't restart, as make_rr has side
- * effects (leaving pointers in dnptr).
- * Just skip this entry for now
- * and call delete_all at the end.
- */
-#ifdef DEBUG
- if (debug >=3)
- fprintf(ddt,"finddata: stale entry '%s'\n",np->n_dname);
-#endif
- if (dp->d_zone == 0)
- foundstale++;
- continue;
- }
- if ((n = make_rr(*dnamep, dp, cp, buflen, 1)) < 0) {
- hp->tc = 1;
- *countp = count;
- return(*lenp - buflen);
- }
-
- cp += n;
- buflen -= n;
- count++;
-#ifdef notdef
- /* this isn't right for glue records, aa is set in ns_req */
- if (dp->d_zone && zones[dp->d_zone].z_auth && class != C_ANY)
- hp->aa = 1; /* XXX */
-#endif
- if (dp->d_type == T_CNAME) {
- if (type != T_ANY) { /* or T_NS? */
- *dnamep = dp->d_data;
- if (dp->d_zone && zones[dp->d_zone].z_auth &&
- class != C_ANY) /* XXX */
- hp->aa = 1; /* XXX */
- }
- break;
- }
- }
- /*
- * Cache invalidate the other RR's of same type
- * if some have timed out
- */
- if (foundstale)
- delete_all(np, class, type);
-#ifdef DEBUG
- if (debug >=3)
- fprintf(ddt,"finddata: added %d class %d type %d RRs\n",
- count, class, type);
-#endif
- *countp = count;
- return(*lenp - buflen);
-}
-
-/*
- * Do we want this data record based on the class and type?
- */
-wanted(dp, class, type)
- struct databuf *dp;
- int class, type;
-{
-
-#ifdef DEBUG
- if (debug > 3)
- fprintf(ddt,"wanted(%x, %d, %d) %d, %d\n", dp, class, type,
- dp->d_class, dp->d_type);
-#endif
-
- if (dp->d_class != class && class != C_ANY)
- return (0);
- if (type == dp->d_type)
- return (1);
- switch (dp->d_type) {
- case T_ANY:
- case T_CNAME:
- return (1);
- }
- switch (type) {
- case T_ANY:
- return (1);
-
- case T_MAILB:
- switch (dp->d_type) {
- case T_MR:
- case T_MB:
- case T_MG:
- case T_MINFO:
- return (1);
- }
- break;
-
- case T_AXFR:
- if (dp->d_type == T_SOA)
- return (1);
- }
- return (0);
-}
-
-/*
- * Add RR entries from dpp array to a query/response.
- * Return the number of bytes added or negative the amount
- * added if truncation was required. Typically you are
- * adding NS records to a response.
- */
-add_data(np, dpp, cp, buflen)
- struct namebuf *np;
- struct databuf **dpp;
- register char *cp;
- int buflen;
-{
- register struct databuf *dp;
- char dname[MAXDNAME];
- register int n, count = 0;
-
- getname(np, dname, sizeof(dname));
- for(dp = *dpp++; dp != NULL; dp = *dpp++) {
- if (stale(dp))
- continue; /* ignore old cache entry */
- if ((n = make_rr(dname, dp, cp, buflen, 1)) < 0)
- return(-count); /* Truncation */
- cp += n;
- buflen -= n;
- count += n;
- }
- return(count);
-}
-
-/*
- * This is best thought of as a "cache invalidate" function.
- * It is called whenever a piece of data is determined to have
- * timed out. It is better to have no information, than to
- * have partial information you pass off as complete.
- */
-delete_all(np, class, type)
-register struct namebuf *np;
-int class, type;
-{
- register struct databuf *dp, *pdp;
-
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt,"delete_all: '%s' 0x%x class %d type %d\n",
- np->n_dname, np, class, type);
-#endif
- pdp = NULL;
- dp = np->n_data;
- while (dp != NULL) {
- if ((dp->d_zone == 0) && !(dp->d_flags & DB_F_HINT)
- && match(dp, class, type)) {
- dp = rm_datum(dp, np, pdp);
- continue;
- }
- pdp = dp;
- dp = dp->d_next;
- }
-}
diff --git a/usr.sbin/named/ns_sort.c b/usr.sbin/named/ns_sort.c
deleted file mode 100644
index ea30eb5c3f5..00000000000
--- a/usr.sbin/named/ns_sort.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 1986, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)ns_sort.c 4.10 (Berkeley) 3/3/91";*/
-static char rcsid[] = "$Id: ns_sort.c,v 1.1 1995/10/18 08:47:51 deraadt Exp $";
-#endif /* not lint */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/file.h>
-#include <netinet/in.h>
-#include <syslog.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include "ns.h"
-#include "db.h"
-
-extern int debug;
-extern FILE *ddt;
-
-struct netinfo*
-local(from)
- struct sockaddr_in *from;
-{
- extern struct netinfo *nettab, netloop, **enettab;
- struct netinfo *ntp;
-
- if (from->sin_addr.s_addr == netloop.my_addr.s_addr)
- return( &netloop);
- for (ntp = nettab; ntp != *enettab; ntp = ntp->next) {
- if (ntp->net == (from->sin_addr.s_addr & ntp->mask))
- return(ntp);
- }
- return(NULL);
-}
-
-
-sort_response(cp, ancount, lp, eom)
- register char *cp;
- register int ancount;
- struct netinfo *lp;
- u_char *eom;
-{
- register struct netinfo *ntp;
- extern struct netinfo *nettab;
-
-#ifdef DEBUG
- if (debug > 2)
- fprintf(ddt,"sort_response(%d)\n", ancount);
-#endif DEBUG
- if (ancount > 1) {
- if (sort_rr(cp, ancount, lp, eom))
- return;
- for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
- if ((ntp->net == lp->net) && (ntp->mask == lp->mask))
- continue;
- if (sort_rr(cp, ancount, ntp, eom))
- break;
- }
- }
-}
-
-int
-sort_rr(cp, count, ntp, eom)
- register u_char *cp;
- int count;
- register struct netinfo *ntp;
- u_char *eom;
-{
- int type, class, dlen, n, c;
- struct in_addr inaddr;
- u_char *rr1;
-
-#ifdef DEBUG
- if (debug > 2) {
- inaddr.s_addr = ntp->net;
- fprintf(ddt,"sort_rr( x%x, %d, %s)\n",cp, count,
- inet_ntoa(inaddr));
- }
-#endif DEBUG
- rr1 = NULL;
- for (c = count; c > 0; --c) {
- n = dn_skipname(cp, eom);
- if (n < 0)
- return (1); /* bogus, stop processing */
- cp += n;
- if (cp + QFIXEDSZ > eom)
- return (1);
- GETSHORT(type, cp);
- GETSHORT(class, cp);
- cp += sizeof(u_long);
- GETSHORT(dlen, cp);
- if (dlen > eom - cp)
- return (1); /* bogus, stop processing */
- switch (type) {
- case T_A:
- switch (class) {
- case C_IN:
- case C_HS:
- bcopy(cp, (char *)&inaddr, sizeof(inaddr));
- if (rr1 == NULL)
- rr1 = cp;
- if ((ntp->mask & inaddr.s_addr) == ntp->net) {
-#ifdef DEBUG
- if (debug > 1) {
- fprintf(ddt,"net %s best choice\n",
- inet_ntoa(inaddr));
- }
-#endif DEBUG
- if (rr1 != cp) {
- bcopy(rr1, cp, sizeof(inaddr));
- bcopy((char *)&inaddr, rr1, sizeof(inaddr));
- }
- return(1);
- }
- break;
- }
- break;
- }
- cp += dlen;
- }
- return(0);
-}
diff --git a/usr.sbin/named/ns_stats.c b/usr.sbin/named/ns_stats.c
deleted file mode 100644
index 9a222f312e6..00000000000
--- a/usr.sbin/named/ns_stats.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 1986 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)ns_stats.c 4.10 (Berkeley) 6/27/90";*/
-static char rcsid[] = "$Id: ns_stats.c,v 1.1 1995/10/18 08:47:51 deraadt Exp $";
-#endif /* not lint */
-
-/**************************************************************************/
-/* simple monitoring of named behavior */
-/* dumps a bunch of values into a well-know file */
-/* */
-/**************************************************************************/
-
-#ifdef STATS
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <netinet/in.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <arpa/nameser.h>
-#include "ns.h"
-#include "pathnames.h"
-
-#ifdef STATSFILE
-char *statsfile = STATSFILE;
-#else
-char *statsfile = _PATH_STATS;
-#endif /* STATSFILE */
-
-extern time_t boottime, resettime;
-extern int needStatsDump;
-
-/*
- * General statistics gathered
- */
-/* The position in this table must agree with the defines in ns.h */
-struct stats stats[S_NSTATS] = {
- { 0, "input packets" },
- { 0, "output packets" },
- { 0, "queries" },
- { 0, "iqueries" },
- { 0, "duplicate queries" },
- { 0, "responses" },
- { 0, "duplicate responses" },
- { 0, "OK answers" },
- { 0, "FAIL answers" },
- { 0, "FORMERR answers" },
- { 0, "system queries" },
- { 0, "prime cache calls" },
- { 0, "check_ns calls" },
- { 0, "bad responses dropped" },
- { 0, "martian responses" },
-};
-
-/*
- * Statistics for queries (by type)
- */
-unsigned long typestats[T_ANY+1];
-char *typenames[T_ANY+1] = {
- /* 5 types per line */
- "Unknown", "A", "NS", "invalid(MD)", "invalid(MF)",
- "CNAME", "SOA", "MB", "MG", "MR",
- "NULL", "WKS", "PTR", "HINFO", "MINFO",
- "MX", "TXT", 0, 0, 0,
- /* 20 per line */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /* 100 */
- "UINFO", "UID", "GID", "UNSPEC", 0, 0, 0, 0, 0, 0,
- /* 110 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /* 120 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /* 200 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /* 240 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /* 250 */
- 0, 0, "AXFR", "MAILB", "MAILA", "ANY"
-};
-
-ns_stats()
-{
- time_t timenow;
- register FILE *f;
- register int i;
-
- if ((f = fopen(statsfile,"a")) == 0)
- {
-#ifdef DEBUG
- if (debug)
- fprintf(ddt,"can't open stat file, \"%s\"\n",statsfile);
-#endif
- syslog(LOG_ERR, "cannot open stat file, \"%s\"\n",statsfile);
- return;
- }
-
- time(&timenow);
- fprintf(f, "### %s", ctime(&timenow));
- fprintf(f, "%d\ttime since boot (secs)\n", timenow - boottime);
- fprintf(f, "%d\ttime since reset (secs)\n", timenow - resettime);
-
- /* general statistics */
- for (i = 0; i < S_NSTATS; i++)
- fprintf(f,"%lu\t%s\n", stats[i].cnt, stats[i].description);
-
- /* query type statistics */
- fprintf(f, "%d\tUnknown query types\n", typestats[0]);
- for(i=1; i < T_ANY+1; i++)
- if (typestats[i])
- if (typenames[i])
- fprintf(f, "%lu\t%s queries\n", typestats[i],
- typenames[i]);
- else
- fprintf(f, "%lu\ttype %d queries\n",
- typestats[i], i);
- (void) fclose(f);
-}
-#endif STATS
diff --git a/usr.sbin/named/pathnames.h b/usr.sbin/named/pathnames.h
deleted file mode 100644
index 4726d00dc21..00000000000
--- a/usr.sbin/named/pathnames.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: @(#)pathnames.h 5.4 (Berkeley) 6/1/90
- * $Id: pathnames.h,v 1.1 1995/10/18 08:47:51 deraadt Exp $
- */
-
-
-#define _PATH_BOOT "/etc/named.boot"
-
-#if defined(BSD) && BSD >= 198810
-#include <paths.h>
-#define _PATH_XFER "/usr/libexec/named-xfer"
-#define _PATH_DEBUG "/var/tmp/named.run"
-#define _PATH_DUMPFILE "/var/tmp/named_dump.db"
-#define _PATH_PIDFILE "/var/run/named.pid"
-#define _PATH_STATS "/var/tmp/named.stats"
-#define _PATH_TMPXFER "/var/tmp/xfer.ddt.XXXXXX"
-#define _PATH_TMPDIR "/var/tmp"
-
-#else /* BSD */
-#define _PATH_DEVNULL "/dev/null"
-#define _PATH_TTY "/dev/tty"
-#define _PATH_XFER "/etc/named-xfer"
-#define _PATH_DEBUG "/usr/tmp/named.run"
-#define _PATH_DUMPFILE "/usr/tmp/named_dump.db"
-#define _PATH_PIDFILE "/etc/named.pid"
-#define _PATH_STATS "/usr/tmp/named.stats"
-#define _PATH_TMPXFER "/usr/tmp/xfer.ddt.XXXXXX"
-#define _PATH_TMPDIR "/usr/tmp"
-#endif /* BSD */
diff --git a/usr.sbin/named/storage.c b/usr.sbin/named/storage.c
deleted file mode 100644
index eaa18b5ae55..00000000000
--- a/usr.sbin/named/storage.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * S T O R A G E . C
- *
- * Ray Tracing program, storage manager.
- *
- * Functions -
- * rt_malloc Allocate storage, with visibility & checking
- * rt_free Similarly, free storage
- * rt_prmem When debugging, print memory map
- * calloc, cfree Which call rt_malloc, rt_free
- *
- * Author -
- * Michael John Muuss
- *
- * Source -
- * SECAD/VLD Computing Consortium, Bldg 394
- * The U. S. Army Ballistic Research Laboratory
- * Aberdeen Proving Ground, Maryland 21005-5066
- *
- * Copyright Notice -
- * This software is Copyright (C) 1987 by the United States Army.
- * All rights reserved.
- */
-
-#ifndef lint
-static char rcsid[] = "$Id: storage.c,v 1.1 1995/10/18 08:47:51 deraadt Exp $";
-#endif
-
-#include <sys/param.h>
-#if BSD >= 43
-#include <sys/syslog.h>
-#else
-#include <stdio.h>
-#define LOG_ERR 0
-#endif BSD
-
-#undef malloc
-#undef free
-
-#define MDB_SIZE 20000
-#define MDB_MAGIC 0x12348969
-struct memdebug {
- char *mdb_addr;
- char *mdb_str;
- int mdb_len;
-} rt_mdb[MDB_SIZE];
-
-/*
- * R T _ M A L L O C
- */
-char *
-rt_malloc(cnt)
-unsigned int cnt;
-{
- register char *ptr;
- extern char *malloc();
-
- cnt = (cnt+2*sizeof(int)-1)&(~(sizeof(int)-1));
- ptr = malloc(cnt);
-
- if( ptr==(char *)0 ) {
- syslog(LOG_ERR, "rt_malloc: malloc failure");
- abort();
- } else {
- register struct memdebug *mp = rt_mdb;
- for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) {
- if( mp->mdb_len > 0 ) continue;
- mp->mdb_addr = ptr;
- mp->mdb_len = cnt;
- mp->mdb_str = "???";
- goto ok;
- }
- syslog(LOG_ERR, "rt_malloc: memdebug overflow\n");
- }
-ok: ;
- {
- register int *ip = (int *)(ptr+cnt-sizeof(int));
- *ip = MDB_MAGIC;
- }
- return(ptr);
-}
-
-/*
- * R T _ F R E E
- */
-void
-rt_free(ptr)
-char *ptr;
-{
- register struct memdebug *mp = rt_mdb;
- for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) {
- if( mp->mdb_len <= 0 ) continue;
- if( mp->mdb_addr != ptr ) continue;
- {
- register int *ip = (int *)(ptr+mp->mdb_len-sizeof(int));
- if( *ip != MDB_MAGIC ) {
- syslog(LOG_ERR, "ERROR rt_free(x%x, %s) corrupted! x%x!=x%x\n", ptr, "???", *ip, MDB_MAGIC);
- abort();
- }
- }
- mp->mdb_len = 0; /* successful free */
- goto ok;
- }
- syslog(LOG_ERR, "ERROR rt_free(x%x, %s) bad pointer!\n", ptr, "???");
- abort();
-ok: ;
-
- *((int *)ptr) = -1; /* zappo! */
- free(ptr);
-}
-
-/*
- * R T _ P R M E M
- *
- * Print map of memory currently in use.
- */
-void
-rt_prmem(str)
-char *str;
-{
- register struct memdebug *mp = rt_mdb;
- register int *ip;
-
- printf("\nRT memory use\t\t%s\n", str);
- for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) {
- if( mp->mdb_len <= 0 ) continue;
- ip = (int *)(mp->mdb_addr+mp->mdb_len-sizeof(int));
- printf("%7x %5x %s %s\n",
- mp->mdb_addr, mp->mdb_len, mp->mdb_str,
- *ip!=MDB_MAGIC ? "-BAD-" : "" );
- if( *ip != MDB_MAGIC )
- printf("\t%x\t%x\n", *ip, MDB_MAGIC);
- }
-}
-
-char *
-calloc(num, size)
- register unsigned num, size;
-{
- extern char *malloc();
- register char *p;
-
- size *= num;
- if (p = rt_malloc(size))
- bzero(p, size);
- return (p);
-}
-
-cfree(p, num, size)
- char *p;
- unsigned num;
- unsigned size;
-{
- rt_free(p);
-}
-
-#if BSD < 43
-openlog() {}
-
-syslog(x, str, a, b, c, d, e, f)
-int x;
-char *str;
-int a, b, c, d, e, f;
-{
- fprintf(stderr, str, a, b, c, d, e, f);
-}
-#endif BSD
diff --git a/usr.sbin/named/tools/Makefile b/usr.sbin/named/tools/Makefile
deleted file mode 100644
index 4a75abb0df8..00000000000
--- a/usr.sbin/named/tools/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# from: @(#)Makefile 4.10 (Berkeley) 5/29/90
-# $Id: Makefile,v 1.1 1995/10/18 08:47:55 deraadt Exp $
-
-SUBDIR= nslookup nsquery nstest
-
-.include <bsd.subdir.mk>
diff --git a/usr.sbin/named/tools/nslookup/Makefile b/usr.sbin/named/tools/nslookup/Makefile
deleted file mode 100644
index b58a3adbf00..00000000000
--- a/usr.sbin/named/tools/nslookup/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-# from: @(#)Makefile 5.23 (Berkeley) 6/24/90
-# $Id: Makefile,v 1.1 1995/10/18 08:47:55 deraadt Exp $
-
-PROG= nslookup
-SRCS= main.c getinfo.c debug.c send.c skip.c list.c subr.c
-OBJS+= commands.o
-MAN= nslookup.8
-LFLAGS= -I
-CFLAGS+=-I${.CURDIR}
-LDADD= -ll
-DPADD= ${LIBL}
-CLEANFILES+=commands.c lex.yy.c lex.yy.o
-
-beforeinstall:
- install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/nslookup.help \
- ${DESTDIR}/usr/share/misc
-
-.include "../../../Makefile.inc"
-.include <bsd.prog.mk>
diff --git a/usr.sbin/named/tools/nslookup/commands.l b/usr.sbin/named/tools/nslookup/commands.l
deleted file mode 100644
index 4cc757da703..00000000000
--- a/usr.sbin/named/tools/nslookup/commands.l
+++ /dev/null
@@ -1,197 +0,0 @@
-%{
-
-/*-
- * Copyright (c) 1985 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)commands.l 5.13 (Berkeley) 7/24/90";*/
-static char rcsid[] = "$Id: commands.l,v 1.1 1995/10/18 08:47:55 deraadt Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * commands.l
- *
- * Andrew Cherenson CS298-26 Fall 1985
- *
- * Lex input file for the nslookup program command interpreter.
- * When a sequence is recognized, the associated action
- * routine is called. The action routine may need to
- * parse the string for additional information.
- *
- * Recognized commands: (identifiers are shown in uppercase)
- *
- * server NAME - set default server to NAME, using default server
- * lserver NAME - set default server to NAME, using initial server
- * finger [NAME] - finger the optional NAME
- * exit - exit the program
- * root - set default server to the root
- * ls NAME - list the domain NAME
- * view FILE - sorts and view the file with more
- * set OPTION - set an option
- * help - print help information
- * ? - print help information
- * NAME - print info about the host/domain NAME
- * using default server.
- * NAME1 NAME2 - as above, but use NAME2 as server
- *
- *
- * yylex Results:
- * 0 upon end-of-file.
- * 1 after each command.
- *
- *******************************************************************************
- */
-
-#include "res.h"
-extern char rootServerName[];
-
-%}
-WS [ \t]
-FLET [A-Za-z0-9.*\\]
-LET [A-Za-z0-9.*]
-NAME [A-Za-z0-9.*=_/-]
-%%
-^{WS}*server{WS}+{LET}{NAME}*{WS}*$ {
- /*
- * 0 == use current server to find
- * the new one.
- * 1 == use original server to find
- * the new one.
- */
- SetDefaultServer(yytext, 0);
- return(1);
- }
-^{WS}*lserver{WS}+{LET}{NAME}*{WS}*$ {
- SetDefaultServer(yytext, 1);
- return(1);
- }
-^{WS}*exit{WS}*$ {
- return(0);
- }
-^{WS}*root{WS}*$ {
- SetDefaultServer(rootServerName, 1);
- return(1);
- }
-^{WS}*finger({WS}+{LET}{NAME}*)?{WS}+>>?{WS}*{NAME}+{WS}*$ {
- /*
- * 2nd arg.
- * 0 == output to stdout
- * 1 == output to file
- */
- Finger(yytext, 1);
- return(1);
- }
-^{WS}*finger({WS}+{LET}{NAME}*)?{WS}*$ {
- Finger(yytext, 0);
- return(1);
- }
-^{WS}*view{WS}+{NAME}+{WS}*$ {
- ViewList(yytext);
- return(1);
- }
-^{WS}*ls{WS}+(("-a"|"-d"|"-h"|"-m"|"-s"){WS}+)?{LET}{NAME}*{WS}+>>?{WS}+{NAME}+{WS}*$ {
- /*
- * 2nd arg.
- * 0 == output to stdout
- * 1 == output to file
- */
- ListHosts(yytext, 1);
- return(1);
- }
-^{WS}*ls{WS}+(("-a"|"-d"|"-h"|"-m"|"-s"){WS}+)?{LET}{NAME}*{WS}*$ {
- ListHosts(yytext, 0);
- return(1);
- }
-^{WS}*ls{WS}+-t{WS}+({LET}{NAME}*{WS}+)?{LET}{NAME}*{WS}+>>?{WS}+{NAME}+{WS}*$ {
- /*
- * 2nd arg.
- * 0 == output to stdout
- * 1 == output to file
- */
- ListHostsByType(yytext, 1);
- return(1);
- }
-^{WS}*ls{WS}+-t{WS}+({LET}{NAME}*{WS}+)?{LET}{NAME}*{WS}*$ {
- ListHostsByType(yytext, 0);
- return(1);
- }
-^{WS}*set{WS}+{NAME}+{WS}*$ {
- SetOption(yytext);
- return(1);
- }
-^{WS}*help{WS}*$ {
- extern void PrintHelp();
- PrintHelp();
- return(1);
- }
-^{WS}*"?"{WS}*$ {
- extern void PrintHelp();
- PrintHelp();
- return(1);
- }
-^{WS}*{FLET}{NAME}*{WS}+>>?{WS}*{NAME}+{WS}*$ {
- /*
- * 0 == output to stdout
- * 1 == output to file
- */
- LookupHost(yytext, 1);
- return(1);
- }
-^{WS}*{FLET}{NAME}*{WS}*$ {
- LookupHost(yytext, 0);
- return(1);
- }
-^{WS}*{FLET}{NAME}*{WS}+{LET}{NAME}*{WS}+>>?{WS}*{NAME}+{WS}*$ {
- /*
- * 0 == output to stdout
- * 1 == output to file
- */
- LookupHostWithServer(yytext, 1);
- return(1);
- }
-^{WS}*{FLET}{NAME}*{WS}+{LET}{NAME}*{WS}*$ {
- LookupHostWithServer(yytext, 0);
- return(1);
- }
-^{WS}*\n {
- return(1);
- }
-^.*\n {
- printf("Unrecognized command: %s",
- yytext);
- return(1);
- }
-\n { ; }
-%%
diff --git a/usr.sbin/named/tools/nslookup/debug.c b/usr.sbin/named/tools/nslookup/debug.c
deleted file mode 100644
index e025c6af245..00000000000
--- a/usr.sbin/named/tools/nslookup/debug.c
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * Copyright (c) 1985,1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)debug.c 5.26 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: debug.c,v 1.1 1995/10/18 08:47:55 deraadt Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * debug.c --
- *
- * Routines to print out packets received from a name server query.
- *
- * Modified version of 4.3BSD BIND res_debug.c 5.30 6/27/90
- *
- *******************************************************************************
- */
-
-#include <sys/param.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-#include <resolv.h>
-#include <netdb.h>
-#include <stdio.h>
-#include "res.h"
-
-extern char ctime();
-
-/*
- * Imported from res_debug.c
- */
-extern char *_res_resultcodes[];
-extern char *_res_opcodes[];
-
-/*
- * Used to highlight the start of a record when printing it.
- */
-#define INDENT " -> "
-
-
-
-/*
- * Print the contents of a query.
- * This is intended to be primarily a debugging routine.
- */
-
-Print_query(msg, eom, printHeader)
- char *msg, *eom;
- int printHeader;
-{
- Fprint_query(msg, eom, printHeader,stdout);
-}
-
-Fprint_query(msg, eom, printHeader,file)
- char *msg, *eom;
- int printHeader;
- FILE *file;
-{
- register char *cp;
- register HEADER *hp;
- register int n;
- short class;
- short type;
-
- /*
- * Print header fields.
- */
- hp = (HEADER *)msg;
- cp = msg + sizeof(HEADER);
- if (printHeader || (_res.options & RES_DEBUG2)) {
- fprintf(file," HEADER:\n");
- fprintf(file,"\topcode = %s", _res_opcodes[hp->opcode]);
- fprintf(file,", id = %d", ntohs(hp->id));
- fprintf(file,", rcode = %s\n", _res_resultcodes[hp->rcode]);
- fprintf(file,"\theader flags: ");
- if (hp->qr) {
- fprintf(file," response");
- } else {
- fprintf(file," query");
- }
- if (hp->aa)
- fprintf(file,", auth. answer");
- if (hp->tc)
- fprintf(file,", truncation");
- if (hp->rd)
- fprintf(file,", want recursion");
- if (hp->ra)
- fprintf(file,", recursion avail.");
- if (hp->pr)
- fprintf(file,", primary");
- fprintf(file,"\n\tquestions = %d", ntohs(hp->qdcount));
- fprintf(file,", answers = %d", ntohs(hp->ancount));
- fprintf(file,", authority records = %d", ntohs(hp->nscount));
- fprintf(file,", additional = %d\n\n", ntohs(hp->arcount));
- }
-
- /*
- * Print question records.
- */
- if (n = ntohs(hp->qdcount)) {
- fprintf(file," QUESTIONS:\n");
- while (--n >= 0) {
- fprintf(file,"\t");
- cp = Print_cdname(cp, msg, eom, file);
- if (cp == NULL)
- return;
- type = _getshort(cp);
- cp += sizeof(u_short);
- class = _getshort(cp);
- cp += sizeof(u_short);
- fprintf(file,", type = %s", p_type(type));
- fprintf(file,", class = %s\n", p_class(class));
- }
- }
- /*
- * Print authoritative answer records
- */
- if (n = ntohs(hp->ancount)) {
- fprintf(file," ANSWERS:\n");
- while (--n >= 0) {
- fprintf(file, INDENT);
- cp = Print_rr(cp, msg, eom, file);
- if (cp == NULL)
- return;
- }
- }
- /*
- * print name server records
- */
- if (n = ntohs(hp->nscount)) {
- fprintf(file," AUTHORITY RECORDS:\n");
- while (--n >= 0) {
- fprintf(file, INDENT);
- cp = Print_rr(cp, msg, eom, file);
- if (cp == NULL)
- return;
- }
- }
- /*
- * print additional records
- */
- if (n = ntohs(hp->arcount)) {
- fprintf(file," ADDITIONAL RECORDS:\n");
- while (--n >= 0) {
- fprintf(file, INDENT);
- cp = Print_rr(cp, msg, eom, file);
- if (cp == NULL)
- return;
- }
- }
- fprintf(file,"\n------------\n");
-}
-
-
-char *
-Print_cdname_sub(cp, msg, eom, file, format)
- u_char *cp, *msg, *eom;
- FILE *file;
- int format;
-{
- int n;
- u_char name[MAXDNAME];
- extern char *strcpy();
-
- if ((n = dn_expand(msg, eom, cp, name, sizeof(name))) < 0)
- return (NULL);
- if (name[0] == '\0') {
- (void) strcpy(name, "(root)");
- }
- if (format) {
- fprintf(file, "%-30s", name);
- } else {
- fputs((char *)name, file);
- }
- return ((char *)cp + n);
-}
-
-char *
-Print_cdname(cp, msg, eom, file)
- char *cp, *msg, *eom;
- FILE *file;
-{
- return(Print_cdname_sub(cp, msg, eom, file, 0));
-}
-
-char *
-Print_cdname2(cp, msg, eom, file)
- char *cp, *msg, *eom;
- FILE *file;
-{
- return(Print_cdname_sub(cp, msg, eom, file, 1));
-}
-
-/*
- * Print resource record fields in human readable form.
- */
-char *
-Print_rr(cp, msg, eom, file)
- char *cp, *msg, *eom;
- FILE *file;
-{
- int type, class, dlen, n, c;
- unsigned long rrttl, ttl;
- struct in_addr inaddr;
- char *cp1, *cp2;
- int debug;
-
- if ((cp = Print_cdname(cp, msg, eom, file)) == NULL) {
- fprintf(file, "(name truncated?)\n");
- return (NULL); /* compression error */
- }
-
- type = _getshort(cp);
- cp += sizeof(u_short);
- class = _getshort(cp);
- cp += sizeof(u_short);
- rrttl = _getlong(cp);
- cp += sizeof(u_long);
- dlen = _getshort(cp);
- cp += sizeof(u_short);
-
- debug = _res.options & (RES_DEBUG|RES_DEBUG2);
- if (debug) {
- if (_res.options & RES_DEBUG2) {
- fprintf(file,"\n\ttype = %s, class = %s, dlen = %d",
- p_type(type), p_class(class), dlen);
- }
- if (type == T_SOA) {
- fprintf(file,"\n\tttl = %lu (%s)", rrttl, p_time(rrttl));
- }
- (void) putc('\n', file);
- }
-
- cp1 = cp;
-
- /*
- * Print type specific data, if appropriate
- */
- switch (type) {
- case T_A:
- switch (class) {
- case C_IN:
- case C_HS:
- bcopy(cp, (char *)&inaddr, sizeof(inaddr));
- if (dlen == 4) {
- fprintf(file,"\tinternet address = %s\n",
- inet_ntoa(inaddr));
- cp += dlen;
- } else if (dlen == 7) {
- fprintf(file,"\tinternet address = %s",
- inet_ntoa(inaddr));
- fprintf(file,", protocol = %d", cp[4]);
- fprintf(file,", port = %d\n",
- (cp[5] << 8) + cp[6]);
- cp += dlen;
- }
- break;
- default:
- fprintf(file,"\taddress, class = %d, len = %d\n",
- class, dlen);
- cp += dlen;
- }
- break;
-
- case T_CNAME:
- fprintf(file,"\tcanonical name = ");
- goto doname;
-
- case T_MG:
- fprintf(file,"\tmail group member = ");
- goto doname;
- case T_MB:
- fprintf(file,"\tmail box = ");
- goto doname;
- case T_MR:
- fprintf(file,"\tmailbox rename = ");
- goto doname;
- case T_MX:
- fprintf(file,"\tpreference = %u",_getshort(cp));
- cp += sizeof(u_short);
- fprintf(file,", mail exchanger = ");
- goto doname;
- case T_NS:
- fprintf(file,"\tnameserver = ");
- goto doname;
- case T_PTR:
- fprintf(file,"\tname = ");
-doname:
- cp = Print_cdname(cp, msg, eom, file);
- (void) putc('\n', file);
- break;
-
- case T_HINFO:
- if (n = *cp++) {
- fprintf(file,"\tCPU = %.*s", n, cp);
- cp += n;
- }
- if (n = *cp++) {
- fprintf(file,"\tOS = %.*s\n", n, cp);
- cp += n;
- }
- break;
-
- case T_SOA:
- if (!debug)
- (void) putc('\n', file);
- fprintf(file,"\torigin = ");
- cp = Print_cdname(cp, msg, eom, file);
- fprintf(file,"\n\tmail addr = ");
- cp = Print_cdname(cp, msg, eom, file);
- fprintf(file,"\n\tserial = %lu", _getlong(cp));
- cp += sizeof(u_long);
- ttl = _getlong(cp);
- fprintf(file,"\n\trefresh = %lu (%s)", ttl, p_time(ttl));
- cp += sizeof(u_long);
- ttl = _getlong(cp);
- fprintf(file,"\n\tretry = %lu (%s)", ttl, p_time(ttl));
- cp += sizeof(u_long);
- ttl = _getlong(cp);
- fprintf(file,"\n\texpire = %lu (%s)", ttl, p_time(ttl));
- cp += sizeof(u_long);
- ttl = _getlong(cp);
- fprintf(file,
- "\n\tminimum ttl = %lu (%s)\n", ttl, p_time(ttl));
- cp += sizeof(u_long);
- break;
-
- case T_MINFO:
- if (!debug)
- (void) putc('\n', file);
- fprintf(file,"\trequests = ");
- cp = Print_cdname(cp, msg, eom, file);
- fprintf(file,"\n\terrors = ");
- cp = Print_cdname(cp, msg, eom, file);
- (void) putc('\n', file);
- break;
-
- case T_TXT:
- (void) fputs("\ttext = \"", file);
- cp2 = cp1 + dlen;
- while (cp < cp2) {
- if (n = (unsigned char) *cp++) {
- for (c = n; c > 0 && cp < cp2; c--)
- if (*cp == '\n') {
- (void) putc('\\', file);
- (void) putc(*cp++, file);
- } else
- (void) putc(*cp++, file);
- }
- }
- (void) fputs("\"\n", file);
- break;
-
- case T_UINFO:
- fprintf(file,"\tuser info = %s\n", cp);
- cp += dlen;
- break;
-
- case T_UID:
- case T_GID:
- if (dlen == 4) {
- fprintf(file,"\t%cid = %lu\n",type == T_UID ? 'u' : 'g',
- _getlong(cp));
- cp += sizeof(int);
- } else {
- fprintf(file,"\t%cid of length %d?\n",
- type == T_UID ? 'u' : 'g', dlen);
- cp += dlen;
- }
- break;
-
- case T_WKS: {
- struct protoent *protoPtr;
-
- if (dlen < sizeof(u_long) + 1)
- break;
- if (!debug)
- (void) putc('\n', file);
- bcopy(cp, (char *)&inaddr, sizeof(inaddr));
- cp += sizeof(u_long);
- if ((protoPtr = getprotobynumber(*cp)) != NULL) {
- fprintf(file,"\tinet address = %s, protocol = %s\n\t",
- inet_ntoa(inaddr), protoPtr->p_name);
- } else {
- fprintf(file,"\tinet address = %s, protocol = %d\n\t",
- inet_ntoa(inaddr), *cp);
- }
- cp++;
- n = 0;
- while (cp < cp1 + dlen) {
- c = *cp++;
- do {
- struct servent *s;
-
- if (c & 0200) {
- s = getservbyport((int)htons(n),
- protoPtr ? protoPtr->p_name : NULL);
- if (s != NULL) {
- fprintf(file," %s", s->s_name);
- } else {
- fprintf(file," #%d", n);
- }
- }
- c <<= 1;
- } while (++n & 07);
- }
- putc('\n',file);
- }
- break;
-
- case T_NULL:
- fprintf(file, "\tNULL (dlen %d)\n", dlen);
- cp += dlen;
- break;
-
- default:
- fprintf(file,"\t??? unknown type %d ???\n", type);
- cp += dlen;
- }
- if (_res.options & RES_DEBUG && type != T_SOA) {
- fprintf(file,"\tttl = %lu (%s)\n", rrttl, p_time(rrttl));
- }
- if (cp != cp1 + dlen) {
- fprintf(file,
- "\n*** Error: record size incorrect (%d != %d)\n\n",
- cp - cp1, dlen);
- cp = NULL;
- }
- return (cp);
-}
diff --git a/usr.sbin/named/tools/nslookup/getinfo.c b/usr.sbin/named/tools/nslookup/getinfo.c
deleted file mode 100644
index 0c275c14ba0..00000000000
--- a/usr.sbin/named/tools/nslookup/getinfo.c
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
- * Copyright (c) 1985,1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)getinfo.c 5.26 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: getinfo.c,v 1.1 1995/10/18 08:47:55 deraadt Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * getinfo.c --
- *
- * Routines to create requests to name servers
- * and interpret the answers.
- *
- * Adapted from 4.3BSD BIND gethostnamadr.c
- *
- *******************************************************************************
- */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include "res.h"
-
-extern char *_res_resultcodes[];
-extern char *res_skip();
-
-#define MAXALIASES 35
-#define MAXADDRS 35
-#define MAXDOMAINS 35
-#define MAXSERVERS 10
-
-static char *addr_list[MAXADDRS + 1];
-
-static char *host_aliases[MAXALIASES];
-static int host_aliases_len[MAXALIASES];
-static u_char hostbuf[BUFSIZ+1];
-
-typedef struct {
- char *name;
- char *domain[MAXDOMAINS];
- int numDomains;
- char *address[MAXADDRS];
- int numAddresses;
-} ServerTable;
-
-ServerTable server[MAXSERVERS];
-
-typedef union {
- HEADER qb1;
- char qb2[PACKETSZ];
-} querybuf;
-
-typedef union {
- long al;
- char ac;
-} align;
-
-#define GetShort(cp) _getshort(cp); cp += sizeof(unsigned short);
-
-
-/*
- *******************************************************************************
- *
- * GetAnswer --
- *
- * Interprets an answer packet and retrieves the following
- * information:
- *
- * Results:
- * SUCCESS the info was retrieved.
- * NO_INFO the packet did not contain an answer.
- * NONAUTH non-authoritative information was found.
- * ERROR the answer was malformed.
- * Other errors returned in the packet header.
- *
- *******************************************************************************
- */
-
-static int
-GetAnswer(nsAddrPtr, queryType, msg, msglen, iquery, hostPtr, isServer)
- struct in_addr *nsAddrPtr;
- char *msg;
- int queryType;
- int msglen;
- Boolean iquery;
- register HostInfo *hostPtr;
- Boolean isServer;
-{
- register HEADER *headerPtr;
- register u_char *cp;
- querybuf answer;
- char **aliasPtr;
- u_char *eom, *bp;
- char **addrPtr;
- char *namePtr;
- char *dnamePtr;
- int type, class;
- int qdcount, ancount, arcount, nscount, buflen;
- int origClass;
- int numAliases = 0;
- int numAddresses = 0;
- int n, i, j;
- int len;
- int dlen;
- int status;
- int numServers;
- Boolean haveAnswer;
- Boolean printedAnswers = FALSE;
-
-
- /*
- * If the hostPtr was used before, free up the calloc'd areas.
- */
- FreeHostInfoPtr(hostPtr);
-
- status = SendRequest(nsAddrPtr, msg, msglen, (char *) &answer,
- sizeof(answer), &n);
-
- if (status != SUCCESS) {
- if (_res.options & RES_DEBUG2)
- printf("SendRequest failed\n");
- return (status);
- }
- eom = (u_char *) &answer + n;
-
- headerPtr = (HEADER *) &answer;
-
- if (headerPtr->rcode != NOERROR) {
- return (headerPtr->rcode);
- }
-
- qdcount = ntohs(headerPtr->qdcount);
- ancount = ntohs(headerPtr->ancount);
- arcount = ntohs(headerPtr->arcount);
- nscount = ntohs(headerPtr->nscount);
-
- /*
- * If there are no answer, n.s. or additional records
- * then return with an error.
- */
- if (ancount == 0 && nscount == 0 && arcount == 0) {
- return (NO_INFO);
- }
-
-
- bp = hostbuf;
- buflen = sizeof(hostbuf);
- cp = (u_char *) &answer + sizeof(HEADER);
-
- /* Skip over question section. */
- while (qdcount-- > 0) {
- cp += dn_skipname(cp, eom) + QFIXEDSZ;
- }
-
- aliasPtr = host_aliases;
- addrPtr = addr_list;
- haveAnswer = FALSE;
-
- /*
- * Scan through the answer resource records.
- * Answers for address query types are saved.
- * Other query type answers are just printed.
- */
- if (ancount != 0) {
- if (!isServer && !headerPtr->aa) {
- printf("Non-authoritative answer:\n");
- }
-
- if (queryType != T_A && !(iquery && queryType == T_PTR)) {
- while (--ancount >= 0 && cp < eom) {
- if ((cp = (u_char *)Print_rr(cp,
- (char *)&answer, eom, stdout)) == NULL) {
- return(ERROR);
- }
- }
- printedAnswers = TRUE;
- } else {
- while (--ancount >= 0 && cp < eom) {
- if ((n =
- dn_expand((u_char *)&answer, eom, cp, bp, buflen)) < 0) {
- return(ERROR);
- }
- cp += n;
- type = GetShort(cp);
- class = GetShort(cp);
- cp += sizeof(u_long); /* skip TTL */
- dlen = GetShort(cp);
- if (type == T_CNAME) {
- /*
- * Found an alias.
- */
- cp += dlen;
- if (aliasPtr >= &host_aliases[MAXALIASES-1]) {
- continue;
- }
- *aliasPtr++ = (char *)bp;
- n = strlen((char *)bp) + 1;
- host_aliases_len[numAliases] = n;
- numAliases++;
- bp += n;
- buflen -= n;
- continue;
- } else if (type == T_PTR) {
- /*
- * Found a "pointer" to the real name.
- */
- if ((n =
- dn_expand((u_char *)&answer, eom, cp, bp,buflen)) < 0) {
- cp += n;
- continue;
- }
- cp += n;
- len = strlen(bp) + 1;
- hostPtr->name = Calloc(1, len);
- bcopy(bp, hostPtr->name, len);
- haveAnswer = TRUE;
- break;
- } else if (type != T_A) {
- cp += dlen;
- continue;
- }
- if (haveAnswer) {
- /*
- * If we've already got 1 address, we aren't interested
- * in addresses with a different length or class.
- */
- if (dlen != hostPtr->addrLen) {
- cp += dlen;
- continue;
- }
- if (class != origClass) {
- cp += dlen;
- continue;
- }
- } else {
- /*
- * First address: record its length and class so we
- * only save additonal ones with the same attributes.
- */
- hostPtr->addrLen = dlen;
- origClass = class;
- hostPtr->addrType = (class == C_IN) ? AF_INET : AF_UNSPEC;
- len = strlen(bp) + 1;
- hostPtr->name = Calloc(1, len);
- bcopy(bp, hostPtr->name, len);
- }
- bp += (((u_long)bp) % sizeof(align));
-
- if (bp + dlen >= &hostbuf[sizeof(hostbuf)]) {
- if (_res.options & RES_DEBUG) {
- printf("Size (%d) too big\n", dlen);
- }
- break;
- }
- bcopy(cp, *addrPtr++ = (char *)bp, dlen);
- bp +=dlen;
- cp += dlen;
- numAddresses++;
- haveAnswer = TRUE;
- }
- }
- }
-
- if ((queryType == T_A || queryType == T_PTR) && haveAnswer) {
-
- /*
- * Go through the alias and address lists and return them
- * in the hostPtr variable.
- */
-
- if (numAliases > 0) {
- hostPtr->aliases = (char **) Calloc(1 + numAliases, sizeof(char *));
- for (i = 0; i < numAliases; i++) {
- hostPtr->aliases[i] = Calloc(1, host_aliases_len[i]);
- bcopy(host_aliases[i], hostPtr->aliases[i],host_aliases_len[i]);
- }
- hostPtr->aliases[i] = NULL;
- }
- if (numAddresses > 0) {
- hostPtr->addrList = (char **)Calloc(1+numAddresses, sizeof(char *));
- for (i = 0; i < numAddresses; i++) {
- hostPtr->addrList[i] = Calloc(1, hostPtr->addrLen);
- bcopy(addr_list[i], hostPtr->addrList[i], hostPtr->addrLen);
- }
- hostPtr->addrList[i] = NULL;
- }
-#ifdef verbose
- if (headerPtr->aa || nscount == 0) {
- hostPtr->servers = NULL;
- return (SUCCESS);
- }
-#else
- hostPtr->servers = NULL;
- return (SUCCESS);
-#endif
- }
-
- /*
- * At this point, for the T_A query type, only empty answers remain.
- * For other query types, additional information might be found
- * in the additional resource records part.
- */
-
- if (!headerPtr->aa && (queryType != T_A) && (nscount > 0 || arcount > 0)) {
- if (printedAnswers) {
- putchar('\n');
- }
- printf("Authoritative answers can be found from:\n");
- }
-
- cp = (u_char *)res_skip((char *) &answer, 2, eom);
-
- numServers = 0;
- if (queryType != T_A) {
- /*
- * If we don't need to save the record, just print it.
- */
- while (--nscount >= 0 && cp < eom) {
- if ((cp = (u_char *)Print_rr(cp,
- (char *) &answer, eom, stdout)) == NULL) {
- return(ERROR);
- }
- }
- } else {
- while (--nscount >= 0 && cp < eom) {
- /*
- * Go through the NS records and retrieve the names of hosts
- * that serve the requested domain.
- */
-
- if ((n = dn_expand((u_char *) &answer, eom, cp, bp, buflen)) < 0) {
- return(ERROR);
- }
- cp += n;
- len = strlen(bp) + 1;
- dnamePtr = Calloc(1, len); /* domain name */
- bcopy(bp, dnamePtr, len);
-
- type = GetShort(cp);
- class = GetShort(cp);
- cp += sizeof(u_long); /* skip TTL */
- dlen = GetShort(cp);
-
- if (type != T_NS) {
- cp += dlen;
- } else {
- Boolean found;
-
- if ((n =
- dn_expand((u_char *) &answer, eom, cp, bp, buflen)) < 0) {
- return(ERROR);
- }
- cp += n;
- len = strlen(bp) + 1;
- namePtr = Calloc(1, len); /* server host name */
- bcopy(bp, namePtr, len);
-
- /*
- * Store the information keyed by the server host name.
- */
- found = FALSE;
- for (j = 0; j < numServers; j++) {
- if (strcmp(namePtr, server[j].name) == 0) {
- found = TRUE;
- free(namePtr);
- break;
- }
- }
- if (found) {
- server[j].numDomains++;
- if (server[j].numDomains <= MAXDOMAINS) {
- server[j].domain[server[j].numDomains-1] = dnamePtr;
- }
- } else {
- if (numServers >= MAXSERVERS) {
- break;
- }
- server[numServers].name = namePtr;
- server[numServers].domain[0] = dnamePtr;
- server[numServers].numDomains = 1;
- server[numServers].numAddresses = 0;
- numServers++;
- }
- }
- }
- }
-
- /*
- * Additional resource records contain addresses of servers.
- */
- cp = (u_char *)res_skip((char *) &answer, 3, eom);
-
- if (queryType != T_A) {
- /*
- * If we don't need to save the record, just print it.
- */
- while (--arcount >= 0 && cp < eom) {
- if ((cp = (u_char *)Print_rr(cp,
- (char *) &answer, eom, stdout)) == NULL) {
- return(ERROR);
- }
- }
- } else {
- while (--arcount >= 0 && cp < eom) {
- if ((n = dn_expand((u_char *) &answer, eom, cp, bp, buflen)) < 0) {
- break;
- }
- cp += n;
- type = GetShort(cp);
- class = GetShort(cp);
- cp += sizeof(u_long); /* skip TTL */
- dlen = GetShort(cp);
-
- if (type != T_A) {
- cp += dlen;
- continue;
- } else {
- for (j = 0; j < numServers; j++) {
- if (strcmp(bp, server[j].name) == 0) {
- server[j].numAddresses++;
- if (server[j].numAddresses <= MAXADDRS) {
- server[j].address[server[j].numAddresses-1] =
- Calloc(1,dlen);
- bcopy(cp,
- server[j].address[server[j].numAddresses-1],dlen);
- break;
- }
- }
- }
- cp += dlen;
- }
- }
- }
-
- /*
- * If we are returning name server info, transfer it to the hostPtr.
- */
- if (numServers > 0) {
- hostPtr->servers = (ServerInfo **)
- Calloc(numServers+1, sizeof(ServerInfo *));
-
- for (i = 0; i < numServers; i++) {
- hostPtr->servers[i] = (ServerInfo *) Calloc(1, sizeof(ServerInfo));
- hostPtr->servers[i]->name = server[i].name;
-
-
- hostPtr->servers[i]->domains = (char **)
- Calloc(server[i].numDomains+1,sizeof(char *));
- for (j = 0; j < server[i].numDomains; j++) {
- hostPtr->servers[i]->domains[j] = server[i].domain[j];
- }
- hostPtr->servers[i]->domains[j] = NULL;
-
-
- hostPtr->servers[i]->addrList = (char **)
- Calloc(server[i].numAddresses+1,sizeof(char *));
- for (j = 0; j < server[i].numAddresses; j++) {
- hostPtr->servers[i]->addrList[j] = server[i].address[j];
- }
- hostPtr->servers[i]->addrList[j] = NULL;
-
- }
- hostPtr->servers[i] = NULL;
- }
-
- switch (queryType) {
- case T_A:
- return NONAUTH;
- case T_PTR:
- if (iquery)
- return NO_INFO;
- /* fall through */
- default:
- return SUCCESS;
- }
-}
-
-/*
-*******************************************************************************
-*
-* GetHostInfo --
-*
-* Retrieves host name, address and alias information
-* for a domain.
-*
-* Algorithm from res_search().
-*
-* Results:
-* ERROR - res_mkquery failed.
-* + return values from GetAnswer()
-*
-*******************************************************************************
-*/
-
-int
-GetHostInfoByName(nsAddrPtr, queryClass, queryType, name, hostPtr, isServer)
- struct in_addr *nsAddrPtr;
- int queryClass;
- int queryType;
- char *name;
- HostInfo *hostPtr;
- Boolean isServer;
-{
- int n;
- register int result;
- register char *cp, **domain;
- Boolean got_nodata = FALSE;
- struct in_addr ina;
-
- /* Catch explicit addresses */
- if ((queryType == T_A) && IsAddr(name, &ina)) {
- hostPtr->name = Calloc(strlen(name)+3, 1);
- (void)sprintf(hostPtr->name,"[%s]",name);
- hostPtr->aliases = NULL;
- hostPtr->servers = NULL;
- hostPtr->addrType = AF_INET;
- hostPtr->addrLen = sizeof(ina);
- hostPtr->addrList = (char **)Calloc(2, sizeof(char *));
- hostPtr->addrList[0] = Calloc(1, sizeof(ina));
- bcopy((char *)&ina, hostPtr->addrList[0], sizeof(ina));
- hostPtr->addrList[1] = NULL;
- return(SUCCESS);
- }
-
- result = NXDOMAIN;
- for (cp = name, n = 0; *cp; cp++)
- if (*cp == '.')
- n++;
- if (n == 0 && (cp = hostalias(name))) {
- printf("Aliased to \"%s\"\n\n", cp);
- return (GetHostDomain(nsAddrPtr, queryClass, queryType,
- cp, (char *)NULL, hostPtr, isServer));
- }
- /*
- * We do at least one level of search if
- * - there is no dot and RES_DEFNAME is set, or
- * - there is at least one dot, there is no trailing dot,
- * and RES_DNSRCH is set.
- */
- if ((n == 0 && _res.options & RES_DEFNAMES) ||
- (n != 0 && *--cp != '.' && _res.options & RES_DNSRCH))
- for (domain = _res.dnsrch; *domain; domain++) {
- result = GetHostDomain(nsAddrPtr, queryClass, queryType,
- name, *domain, hostPtr, isServer);
- /*
- * If no server present, give up.
- * If name isn't found in this domain,
- * keep trying higher domains in the search list
- * (if that's enabled).
- * On a NO_INFO error, keep trying, otherwise
- * a wildcard entry of another type could keep us
- * from finding this entry higher in the domain.
- * If we get some other error (negative answer or
- * server failure), then stop searching up,
- * but try the input name below in case it's fully-qualified.
- */
- if (result == SUCCESS || result == NO_RESPONSE)
- return result;
- if (result == NO_INFO)
- got_nodata++;
- if ((result != NXDOMAIN && result != NO_INFO) ||
- (_res.options & RES_DNSRCH) == 0)
- break;
- }
- /*
- * If the search/default failed, try the name as fully-qualified,
- * but only if it contained at least one dot (even trailing).
- * This is purely a heuristic; we assume that any reasonable query
- * about a top-level domain (for servers, SOA, etc) will not use
- * res_search.
- */
- if (n && (result = GetHostDomain(nsAddrPtr, queryClass, queryType,
- name, (char *)NULL, hostPtr, isServer)) == SUCCESS)
- return result;
- if (got_nodata)
- result = NO_INFO;
- return (result);
-}
-
-/*
- * Perform a query on the concatenation of name and domain,
- * removing a trailing dot from name if domain is NULL.
- */
-GetHostDomain(nsAddrPtr, queryClass, queryType, name, domain, hostPtr, isServer)
- struct in_addr *nsAddrPtr;
- int queryClass;
- int queryType;
- char *name, *domain;
- HostInfo *hostPtr;
- Boolean isServer;
-{
- querybuf buf;
- char nbuf[2*MAXDNAME+2];
- char *longname = nbuf;
- int n;
-
- if (domain == NULL) {
- /*
- * Check for trailing '.';
- * copy without '.' if present.
- */
- n = strlen(name) - 1;
- if (name[n] == '.' && n < sizeof(nbuf) - 1) {
- bcopy(name, nbuf, n);
- nbuf[n] = '\0';
- } else
- longname = name;
- } else {
- (void)sprintf(nbuf, "%.*s.%.*s",
- MAXDNAME, name, MAXDNAME, domain);
- longname = nbuf;
- }
- n = res_mkquery(QUERY, longname, queryClass, queryType,
- (char *)0, 0, 0, (char *) &buf, sizeof(buf));
- if (n < 0) {
- if (_res.options & RES_DEBUG) {
- printf("Res_mkquery failed\n");
- }
- return (ERROR);
- }
-
- n = GetAnswer(nsAddrPtr, queryType, (char *)&buf, n, 0, hostPtr, isServer);
-
- /*
- * GetAnswer didn't find a name, so set it to the specified one.
- */
- if (n == NONAUTH) {
- if (hostPtr->name == NULL) {
- int len = strlen(longname) + 1;
- hostPtr->name = Calloc(len, sizeof(char));
- bcopy(longname, hostPtr->name, len);
- }
- }
- return(n);
-}
-
-
-/*
-*******************************************************************************
-*
-* GetHostInfoByAddr --
-*
-* Performs an inverse query to find the host name
-* that corresponds to the given address.
-*
-* Results:
-* ERROR - res_mkquery failed.
-* + return values from GetAnswer()
-*
-*******************************************************************************
-*/
-
-int
-GetHostInfoByAddr(nsAddrPtr, address, hostPtr)
- struct in_addr *nsAddrPtr;
- struct in_addr *address;
- HostInfo *hostPtr;
-{
- int n;
- querybuf buf;
- char qbuf[MAXDNAME];
- char *p = (char *) &address->s_addr;
-
- (void)sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa",
- ((unsigned)p[3] & 0xff),
- ((unsigned)p[2] & 0xff),
- ((unsigned)p[1] & 0xff),
- ((unsigned)p[0] & 0xff));
- n = res_mkquery(QUERY, qbuf, C_IN, T_PTR,
- NULL, 0, NULL, (char *) &buf, sizeof(buf));
- if (n < 0) {
- if (_res.options & RES_DEBUG) {
- printf("res_mkquery() failed\n");
- }
- return (ERROR);
- }
- n = GetAnswer(nsAddrPtr, T_PTR, (char *) &buf, n, 1, hostPtr, 1);
- if (n == SUCCESS) {
- hostPtr->addrType = AF_INET;
- hostPtr->addrLen = 4;
- hostPtr->addrList = (char **)Calloc(2, sizeof(char *));
- hostPtr->addrList[0] = Calloc(sizeof(long), sizeof(char));
- bcopy((char *)p, hostPtr->addrList[0], sizeof(struct in_addr));
- hostPtr->addrList[1] = NULL;
- }
- return n;
-}
-
-/*
-*******************************************************************************
-*
-* FreeHostInfoPtr --
-*
-* Deallocates all the calloc'd areas for a HostInfo variable.
-*
-*******************************************************************************
-*/
-
-void
-FreeHostInfoPtr(hostPtr)
- register HostInfo *hostPtr;
-{
- int i, j;
-
- if (hostPtr->name != NULL) {
- free(hostPtr->name);
- hostPtr->name = NULL;
- }
-
- if (hostPtr->aliases != NULL) {
- i = 0;
- while (hostPtr->aliases[i] != NULL) {
- free(hostPtr->aliases[i]);
- i++;
- }
- free((char *)hostPtr->aliases);
- hostPtr->aliases = NULL;
- }
-
- if (hostPtr->addrList != NULL) {
- i = 0;
- while (hostPtr->addrList[i] != NULL) {
- free(hostPtr->addrList[i]);
- i++;
- }
- free((char *)hostPtr->addrList);
- hostPtr->addrList = NULL;
- }
-
- if (hostPtr->servers != NULL) {
- i = 0;
- while (hostPtr->servers[i] != NULL) {
-
- if (hostPtr->servers[i]->name != NULL) {
- free(hostPtr->servers[i]->name);
- }
-
- if (hostPtr->servers[i]->domains != NULL) {
- j = 0;
- while (hostPtr->servers[i]->domains[j] != NULL) {
- free(hostPtr->servers[i]->domains[j]);
- j++;
- }
- free((char *)hostPtr->servers[i]->domains);
- }
-
- if (hostPtr->servers[i]->addrList != NULL) {
- j = 0;
- while (hostPtr->servers[i]->addrList[j] != NULL) {
- free(hostPtr->servers[i]->addrList[j]);
- j++;
- }
- free((char *)hostPtr->servers[i]->addrList);
- }
- free((char *)hostPtr->servers[i]);
- i++;
- }
- free((char *)hostPtr->servers);
- hostPtr->servers = NULL;
- }
-}
diff --git a/usr.sbin/named/tools/nslookup/list.c b/usr.sbin/named/tools/nslookup/list.c
deleted file mode 100644
index 640c7e58c7c..00000000000
--- a/usr.sbin/named/tools/nslookup/list.c
+++ /dev/null
@@ -1,945 +0,0 @@
-/*
- * Copyright (c) 1985,1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)list.c 5.23 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: list.c,v 1.1 1995/10/18 08:47:55 deraadt Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * list.c --
- *
- * Routines to obtain info from name and finger servers.
- *
- * Adapted from 4.3BSD BIND ns_init.c and from finger.c.
- *
- *******************************************************************************
- */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-#include <resolv.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include "res.h"
-
-/*
- * Imported from res_debug.c
- */
-extern char *_res_resultcodes[];
-
-extern int errno;
-
-typedef union {
- HEADER qb1;
- char qb2[PACKETSZ];
-} querybuf;
-
-extern HostInfo *defaultPtr;
-extern HostInfo curHostInfo;
-extern int curHostValid;
-extern int queryType;
-extern int queryClass;
-
-static int sockFD = -1;
-static int ListSubr();
-
-/*
- * During a listing to a file, hash marks are printed
- * every HASH_SIZE records.
- */
-
-#define HASH_SIZE 50
-
-
-/*
- *******************************************************************************
- *
- * ListHosts --
- * ListHostsByType --
- *
- * Requests the name server to do a zone transfer so we
- * find out what hosts it knows about.
- *
- * For ListHosts, there are five types of output:
- * - Internet addresses (default)
- * - cpu type and operating system (-h option)
- * - canonical and alias names (-a option)
- * - well-known service names (-s option)
- * - ALL records (-d option)
- * ListHostsByType prints records of the default type or of a speicific
- * type.
- *
- * To see all types of information sorted by name, do the following:
- * ls -d domain.edu > file
- * view file
- *
- * Results:
- * SUCCESS the listing was successful.
- * ERROR the server could not be contacted because
- * a socket could not be obtained or an error
- * occured while receiving, or the output file
- * could not be opened.
- *
- *******************************************************************************
- */
-
-void
-ListHostsByType(string, putToFile)
- char *string;
- int putToFile;
-{
- int i, qtype, result;
- char *namePtr;
- char name[NAME_LEN];
- char option[NAME_LEN];
-
- /*
- * Parse the command line. It maybe of the form "ls -t domain"
- * or "ls -t type domain".
- */
-
- i = sscanf(string, " ls -t %s %s", option, name);
- if (putToFile && i == 2 && name[0] == '>') {
- i--;
- }
- if (i == 2) {
- qtype = StringToType(option, -1);
- if (qtype == -1)
- return;
- namePtr = name;
- } else if (i == 1) {
- namePtr = option;
- qtype = queryType;
- } else {
- fprintf(stderr, "*** ls: invalid request %s\n",string);
- return;
- }
- result = ListSubr(qtype, namePtr, putToFile ? string : NULL);
- if (result != SUCCESS)
- fprintf(stderr, "*** Can't list domain %s: %s\n",
- namePtr, DecodeError(result));
-}
-
-void
-ListHosts(string, putToFile)
- char *string;
- int putToFile;
-{
- int i, qtype, result;
- char *namePtr;
- char name[NAME_LEN];
- char option[NAME_LEN];
-
- /*
- * Parse the command line. It maybe of the form "ls domain",
- * "ls -X domain".
- */
- i = sscanf(string, " ls %s %s", option, name);
- if (putToFile && i == 2 && name[0] == '>') {
- i--;
- }
- if (i == 2) {
- if (strcmp("-a", option) == 0) {
- qtype = T_CNAME;
- } else if (strcmp("-h", option) == 0) {
- qtype = T_HINFO;
- } else if (strcmp("-m", option) == 0) {
- qtype = T_MX;
- } else if (strcmp("-s", option) == 0) {
- qtype = T_WKS;
- } else if (strcmp("-d", option) == 0) {
- qtype = T_ANY;
- } else {
- qtype = T_A;
- }
- namePtr = name;
- } else if (i == 1) {
- namePtr = option;
- qtype = T_A;
- } else {
- fprintf(stderr, "*** ls: invalid request %s\n",string);
- return;
- }
- result = ListSubr(qtype, namePtr, putToFile ? string : NULL);
- if (result != SUCCESS)
- fprintf(stderr, "*** Can't list domain %s: %s\n",
- namePtr, DecodeError(result));
-}
-
-static int
-ListSubr(qtype, domain, cmd)
- int qtype;
- char *domain;
- char *cmd;
-{
- querybuf buf;
- struct sockaddr_in sin;
- HEADER *headerPtr;
- int msglen;
- int amtToRead;
- int numRead;
- int numAnswers = 0;
- int result;
- int soacnt = 0;
- u_short len;
- char *cp, *nmp;
- char dname[2][NAME_LEN];
- char file[NAME_LEN];
- static char *answer = NULL;
- static int answerLen = 0;
- enum {
- NO_ERRORS,
- ERR_READING_LEN,
- ERR_READING_MSG,
- ERR_PRINTING,
- } error = NO_ERRORS;
-
- /*
- * Create a query packet for the requested domain name.
- */
- msglen = res_mkquery(QUERY, domain, queryClass, T_AXFR,
- (char *)0, 0, 0,
- (char *) &buf, sizeof(buf));
- if (msglen < 0) {
- if (_res.options & RES_DEBUG) {
- fprintf(stderr, "*** ls: res_mkquery failed\n");
- }
- return (ERROR);
- }
-
- bzero((char *)&sin, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_port = htons(nsport);
-
- /*
- * Check to see if we have the address of the server or the
- * address of a server who knows about this domain.
- *
- * For now, just use the first address in the list.
- */
-
- if (defaultPtr->addrList != NULL) {
- sin.sin_addr = *(struct in_addr *) defaultPtr->addrList[0];
- } else {
- sin.sin_addr = *(struct in_addr *)defaultPtr->servers[0]->addrList[0];
- }
-
- /*
- * Set up a virtual circuit to the server.
- */
- if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- perror("ls: socket");
- return(ERROR);
- }
- if (connect(sockFD, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
- int e;
- if (errno == ECONNREFUSED) {
- e = NO_RESPONSE;
- } else {
- perror("ls: connect");
- e = ERROR;
- }
- (void) close(sockFD);
- sockFD = -1;
- return e;
- }
-
- /*
- * Send length & message for zone transfer
- */
-
- len = htons(msglen);
-
- if (write(sockFD, (char *)&len, sizeof(len)) != sizeof(len) ||
- write(sockFD, (char *) &buf, msglen) != msglen) {
- perror("ls: write");
- (void) close(sockFD);
- sockFD = -1;
- return(ERROR);
- }
-
- fprintf(stdout,"[%s]\n",
- (defaultPtr->addrList != NULL) ? defaultPtr->name :
- defaultPtr->servers[0]->name);
-
- if (cmd == NULL) {
- filePtr = stdout;
- } else {
- filePtr = OpenFile(cmd, file);
- if (filePtr == NULL) {
- fprintf(stderr, "*** Can't open %s for writing\n", file);
- (void) close(sockFD);
- sockFD = -1;
- return(ERROR);
- }
- fprintf(filePtr, "> %s\n", cmd);
- fprintf(filePtr,"[%s]\n",
- (defaultPtr->addrList != NULL) ? defaultPtr->name :
- defaultPtr->servers[0]->name);
- }
-
-#if 0
- if (qtype == T_CNAME) {
- fprintf(filePtr, "%-30s", "Alias");
- } else if (qtype == T_TXT) {
- fprintf(filePtr, "%-30s", "Key");
- } else {
- fprintf(filePtr, "%-30s", "Host or domain name");
- }
- switch (qtype) {
- case T_A:
- fprintf(filePtr, " %-30s\n", "Internet Address");
- break;
- case T_HINFO:
- fprintf(filePtr, " %-30s\n", "CPU & OS");
- break;
- case T_CNAME:
- fprintf(filePtr, " %-30s\n", "Canonical Name");
- break;
- case T_MX:
- fprintf(filePtr, " %-30s\n", "Metric & Host");
- break;
- case T_WKS:
- fprintf(filePtr, " %-4s %s\n", "Protocol", "Services");
- break;
- case T_MB:
- fprintf(filePtr, " %-30s\n", "Mailbox");
- break;
- case T_MG:
- fprintf(filePtr, " %-30s\n", "Mail Group");
- break;
- case T_MR:
- fprintf(filePtr, " %-30s\n", "Mail Rename");
- break;
- case T_MINFO:
- fprintf(filePtr, " %-30s\n", "Mail List Requests & Errors");
- break;
- case T_UINFO:
- fprintf(filePtr, " %-30s\n", "User Information");
- break;
- case T_UID:
- fprintf(filePtr, " %-30s\n", "User ID");
- break;
- case T_GID:
- fprintf(filePtr, " %-30s\n", "Group ID");
- break;
- case T_TXT:
- fprintf(filePtr, " %-30s\n", "Text");
- break;
- case T_NS:
- fprintf(filePtr, " %-30s\n", "Name Servers");
- break;
- case T_PTR:
- fprintf(filePtr, " %-30s\n", "Pointers");
- break;
- case T_SOA:
- fprintf(filePtr, " %-30s\n", "Start of Authority");
- break;
- case T_ANY:
- fprintf(filePtr, " %-30s\n", "Resource Record Info.");
- break;
- }
-#endif
-
-
- dname[0][0] = '\0';
- while (1) {
- unsigned short tmp;
-
- /*
- * Read the length of the response.
- */
-
- cp = (char *) &tmp;
- amtToRead = sizeof(u_short);
- while (amtToRead > 0 && (numRead=read(sockFD, cp, amtToRead)) > 0) {
- cp += numRead;
- amtToRead -= numRead;
- }
- if (numRead <= 0) {
- error = ERR_READING_LEN;
- break;
- }
-
- if ((len = htons(tmp)) == 0) {
- break; /* nothing left to read */
- }
-
- /*
- * The server sent too much data to fit the existing buffer --
- * allocate a new one.
- */
- if (len > answerLen) {
- if (answerLen != 0) {
- free(answer);
- }
- answerLen = len;
- answer = Malloc(answerLen);
- }
-
- /*
- * Read the response.
- */
-
- amtToRead = len;
- cp = answer;
- while (amtToRead > 0 && (numRead=read(sockFD, cp, amtToRead)) > 0) {
- cp += numRead;
- amtToRead -= numRead;
- }
- if (numRead <= 0) {
- error = ERR_READING_MSG;
- break;
- }
-
- result = PrintListInfo(filePtr, answer, cp, qtype, dname[0]);
- if (result != SUCCESS) {
- error = ERR_PRINTING;
- break;
- }
-
- numAnswers++;
- if (cmd != NULL && ((numAnswers % HASH_SIZE) == 0)) {
- fprintf(stdout, "#");
- fflush(stdout);
- }
- cp = answer + sizeof(HEADER);
- if (ntohs(((HEADER* )answer)->qdcount) > 0)
- cp += dn_skipname((u_char *)cp,
- (u_char *)answer + len) + QFIXEDSZ;
- nmp = cp;
- cp += dn_skipname((u_char *)cp, (u_char *)answer + len);
- if ((_getshort(cp) == T_SOA)) {
- dn_expand((u_char *)answer, (u_char *)answer + len,
- (u_char *)nmp, (u_char *)dname[soacnt],
- sizeof(dname[0]));
- if (soacnt) {
- if (strcmp(dname[0], dname[1]) == 0)
- break;
- } else
- soacnt++;
- }
- }
-
- if (cmd != NULL) {
- fprintf(stdout, "%sReceived %d record%s.\n",
- (numAnswers >= HASH_SIZE) ? "\n" : "",
- numAnswers,
- (numAnswers != 1) ? "s" : "");
- }
-
- (void) close(sockFD);
- sockFD = -1;
- if (cmd != NULL && filePtr != NULL) {
- fclose(filePtr);
- filePtr = NULL;
- }
-
- switch (error) {
- case NO_ERRORS:
- return (SUCCESS);
-
- case ERR_READING_LEN:
- return(ERROR);
-
- case ERR_PRINTING:
- return(result);
-
- case ERR_READING_MSG:
- headerPtr = (HEADER *) answer;
- fprintf(stderr,"*** ls: error receiving zone transfer:\n");
- fprintf(stderr,
- " result: %s, answers = %d, authority = %d, additional = %d\n",
- _res_resultcodes[headerPtr->rcode],
- ntohs(headerPtr->ancount), ntohs(headerPtr->nscount),
- ntohs(headerPtr->arcount));
- return(ERROR);
- default:
- return(ERROR);
- }
-}
-
-
-/*
- *******************************************************************************
- *
- * PrintListInfo --
- *
- * Used by the ListInfo routine to print the answer
- * received from the name server. Only the desired
- * information is printed.
- *
- * Results:
- * SUCCESS the answer was printed without a problem.
- * NO_INFO the answer packet did not contain an answer.
- * ERROR the answer was malformed.
- * Misc. errors returned in the packet header.
- *
- *******************************************************************************
- */
-
-#define NAME_FORMAT " %-30s"
-
-static Boolean
-strip_domain(string, domain)
- char *string, *domain;
-{
- register char *dot;
-
- if (*domain != '\0') {
- dot = string;
- while ((dot = strchr(dot, '.')) != NULL && strcasecmp(domain, ++dot))
- ;
- if (dot != NULL) {
- dot[-1] = '\0';
- return TRUE;
- }
- }
- return FALSE;
-}
-
-
-PrintListInfo(file, msg, eom, qtype, domain)
- FILE *file;
- u_char *msg, *eom;
- int qtype;
- char *domain;
-{
- register u_char *cp;
- HEADER *headerPtr;
- int type, class, dlen, nameLen;
- u_long ttl;
- int n, pref;
- struct in_addr inaddr;
- char name[NAME_LEN];
- char name2[NAME_LEN];
- Boolean stripped;
-
- /*
- * Read the header fields.
- */
- headerPtr = (HEADER *)msg;
- cp = msg + sizeof(HEADER);
- if (headerPtr->rcode != NOERROR) {
- return(headerPtr->rcode);
- }
-
- /*
- * We are looking for info from answer resource records.
- * If there aren't any, return with an error. We assume
- * there aren't any question records.
- */
-
- if (ntohs(headerPtr->ancount) == 0) {
- return(NO_INFO);
- } else {
- if (ntohs(headerPtr->qdcount) > 0) {
- nameLen = dn_skipname(cp, eom);
- if (nameLen < 0)
- return (ERROR);
- cp += nameLen + QFIXEDSZ;
- }
- if ((nameLen =
- dn_expand(msg, eom, cp, (u_char *)name, sizeof(name))) < 0)
- return (ERROR);
- cp += nameLen;
-
- type = _getshort(cp);
- cp += sizeof(u_short);
-
- if (!(type == qtype || qtype == T_ANY) &&
- !((type == T_NS || type == T_PTR) && qtype == T_A))
- return(SUCCESS);
-
- class = _getshort(cp);
- cp += sizeof(u_short);
- ttl = _getlong(cp);
- cp += sizeof(u_long);
- dlen = _getshort(cp);
- cp += sizeof(u_short);
-
- if (name[0] == 0)
- strcpy(name, "(root)");
-
- /* Strip the domain name from the data, if desired. */
- stripped = FALSE;
- if ((_res.options & RES_DEBUG) == 0) {
- if (type != T_SOA) {
- stripped = strip_domain(name, domain);
- }
- }
- if (!stripped && nameLen < sizeof(name)-1) {
- strcat(name, ".");
- }
-
- fprintf(file, NAME_FORMAT, name);
-
- if (qtype == T_ANY) {
- if (_res.options & RES_DEBUG) {
- fprintf(file,"\t%lu %-5s", ttl, p_class(queryClass));
- }
- fprintf(file," %-5s", p_type(type));
- }
-
- /* XXX merge this into debug.c's print routines */
-
- switch (type) {
- case T_A:
- if (class == C_IN) {
- bcopy(cp, (char *)&inaddr, sizeof(inaddr));
- if (dlen == 4) {
- fprintf(file," %s", inet_ntoa(inaddr));
- } else if (dlen == 7) {
- fprintf(file," %s", inet_ntoa(inaddr));
- fprintf(file," (%d, %d)", cp[4],(cp[5] << 8) + cp[6]);
- } else
- fprintf(file, " (dlen = %d?)", dlen);
- }
- break;
-
- case T_CNAME:
- case T_MB:
- case T_MG:
- case T_MR:
- if ((nameLen = dn_expand(msg, eom,
- cp, (u_char *)name2, sizeof(name2))) < 0) {
- fprintf(file, " ***\n");
- return (ERROR);
- }
- fprintf(file, " %s", name2);
- break;
-
- case T_NS:
- case T_PTR:
- putc(' ', file);
- if (qtype != T_ANY)
- fprintf(file,"%s = ", type == T_PTR ? "host" : "server");
- cp = (u_char *)Print_cdname2(cp, msg, eom, file);
- break;
-
- case T_HINFO:
- if (n = *cp++) {
- (void)sprintf(name,"%.*s", n, cp);
- fprintf(file," %-10s", name);
- cp += n;
- } else {
- fprintf(file," %-10s", " ");
- }
- if (n = *cp++) {
- fprintf(file," %.*s", n, cp);
- cp += n;
- }
- break;
-
- case T_SOA:
- if ((nameLen = dn_expand(msg,
- eom, cp, (u_char *)name2, sizeof(name2))) < 0) {
- fprintf(file, " ***\n");
- return (ERROR);
- }
- cp += nameLen;
- fprintf(file, " %s", name2);
- if ((nameLen = dn_expand(msg,
- eom, cp, (u_char *)name2, sizeof(name2))) < 0) {
- fprintf(file, " ***\n");
- return (ERROR);
- }
- cp += nameLen;
- fprintf(file, " %s. (", name2);
- for (n = 0; n < 5; n++) {
- u_long u;
-
- u = _getlong(cp);
- cp += sizeof(u_long);
- fprintf(file,"%s%lu", n? " " : "", u);
- }
- fprintf(file, ")");
- break;
-
- case T_MX:
- pref = _getshort(cp);
- cp += sizeof(u_short);
- fprintf(file," %-3d ",pref);
- if ((nameLen = dn_expand(msg,
- eom, cp, (u_char *)name2, sizeof(name2))) < 0) {
- fprintf(file, " ***\n");
- return (ERROR);
- }
- fprintf(file, " %s", name2);
- break;
-
- case T_TXT:
- {
- u_char *cp2 = cp + dlen;
- int c;
-
- (void) fputs(" \"", file);
- while (cp < cp2) {
- if (n = (unsigned char) *cp++) {
- for (c = n; c > 0 && cp < cp2; c--)
- if (*cp == '\n') {
- (void) putc('\\', file);
- (void) putc(*cp++, file);
- } else
- (void) putc(*cp++, file);
- }
- }
- (void) putc('"', file);
- }
- break;
-
- case T_MINFO:
- (void) putc(' ', file);
- cp = (u_char *)Print_cdname(cp, msg, eom, file);
- fprintf(file, " ");
- cp = (u_char *)Print_cdname(cp, msg, eom, file);
- break;
-
- case T_UINFO:
- fprintf(file, " %s", cp);
- break;
-
- case T_UID:
- case T_GID:
- fprintf(file, " %lu", _getlong(cp));
- break;
-
- case T_WKS:
- if (class == C_IN) {
- struct protoent *pp;
- struct servent *ss;
- u_short port;
-
- cp += 4; /* skip inet address */
- dlen -= 4;
-
- setprotoent(1);
- setservent(1);
- n = *cp & 0377;
- pp = getprotobynumber(n);
- if (pp == 0)
- fprintf(file," %-3d ", n);
- else
- fprintf(file," %-3s ", pp->p_name);
- cp++; dlen--;
-
- port = 0;
- while (dlen-- > 0) {
- n = *cp++;
- do {
- if (n & 0200) {
- ss = getservbyport((int)htons(port),
- pp->p_name);
- if (ss == 0)
- fprintf(file," %u", port);
- else
- fprintf(file," %s", ss->s_name);
- }
- n <<= 1;
- } while (++port & 07);
- }
- endprotoent();
- endservent();
- }
- break;
- }
- fprintf(file,"\n");
- }
- return(SUCCESS);
-}
-
-
-/*
- *******************************************************************************
- *
- * ViewList --
- *
- * A hack to view the output of the ls command in sorted
- * order using more.
- *
- *******************************************************************************
- */
-
-ViewList(string)
- char *string;
-{
- char file[NAME_LEN];
- char command[NAME_LEN];
-
- sscanf(string, " view %s", file);
- (void)sprintf(command, "grep \"^ \" %s | sort | more", file);
- system(command);
-}
-
-/*
- *******************************************************************************
- *
- * Finger --
- *
- * Connects with the finger server for the current host
- * to request info on the specified person (long form)
- * who is on the system (short form).
- *
- * Results:
- * SUCCESS the finger server was contacted.
- * ERROR the server could not be contacted because
- * a socket could not be obtained or connected
- * to or the service could not be found.
- *
- *******************************************************************************
- */
-
-Finger(string, putToFile)
- char *string;
- int putToFile;
-{
- struct servent *sp;
- struct sockaddr_in sin;
- register FILE *f;
- register int c;
- register int lastc;
- char name[NAME_LEN];
- char file[NAME_LEN];
-
- /*
- * We need a valid current host info to get an inet address.
- */
- if (!curHostValid) {
- fprintf(stderr, "Finger: no current host defined.\n");
- return (ERROR);
- }
-
- if (sscanf(string, " finger %s", name) == 1) {
- if (putToFile && (name[0] == '>')) {
- name[0] = '\0';
- }
- } else {
- name[0] = '\0';
- }
-
- sp = getservbyname("finger", "tcp");
- if (sp == 0) {
- fprintf(stderr, "Finger: unknown service\n");
- return (ERROR);
- }
-
- bzero((char *)&sin, sizeof(sin));
- sin.sin_family = curHostInfo.addrType;
- sin.sin_port = sp->s_port;
- bcopy(curHostInfo.addrList[0], (char *)&sin.sin_addr,
- curHostInfo.addrLen);
-
- /*
- * Set up a virtual circuit to the host.
- */
-
- sockFD = socket(curHostInfo.addrType, SOCK_STREAM, 0);
- if (sockFD < 0) {
- fflush(stdout);
- perror("finger: socket");
- return (ERROR);
- }
-
- if (connect(sockFD, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
- fflush(stdout);
- perror("finger: connect");
- close(sockFD);
- sockFD = -1;
- return (ERROR);
- }
-
- if (!putToFile) {
- filePtr = stdout;
- } else {
- filePtr = OpenFile(string, file);
- if (filePtr == NULL) {
- fprintf(stderr, "*** Can't open %s for writing\n", file);
- close(sockFD);
- sockFD = -1;
- return(ERROR);
- }
- fprintf(filePtr,"> %s\n", string);
- }
- fprintf(filePtr, "[%s]\n", curHostInfo.name);
-
- if (name[0] != '\0') {
- write(sockFD, "/W ", 3);
- }
- write(sockFD, name, strlen(name));
- write(sockFD, "\r\n", 2);
- f = fdopen(sockFD, "r");
- while ((c = getc(f)) != EOF) {
- switch (c) {
- case 0210:
- case 0211:
- case 0212:
- case 0214:
- c -= 0200;
- break;
- case 0215:
- c = '\n';
- break;
- }
- putc(lastc = c, filePtr);
- }
- if (lastc != '\n') {
- putc('\n', filePtr);
- }
- putc('\n', filePtr);
-
- close(sockFD);
- sockFD = -1;
-
- if (putToFile) {
- fclose(filePtr);
- filePtr = NULL;
- }
- return (SUCCESS);
-}
-
-ListHost_close()
-{
- if (sockFD != -1) {
- (void) close(sockFD);
- sockFD = -1;
- }
-}
diff --git a/usr.sbin/named/tools/nslookup/main.c b/usr.sbin/named/tools/nslookup/main.c
deleted file mode 100644
index f49a49cd4d8..00000000000
--- a/usr.sbin/named/tools/nslookup/main.c
+++ /dev/null
@@ -1,1108 +0,0 @@
-/*
- * Copyright (c) 1985,1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1985,1989 Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)main.c 5.42 (Berkeley) 3/3/91";*/
-static char rcsid[] = "$Id: main.c,v 1.1 1995/10/18 08:47:55 deraadt Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * main.c --
- *
- * Main routine and some action routines for the name server
- * lookup program.
- *
- * Andrew Cherenson
- * U.C. Berkeley Computer Science Div.
- * CS298-26, Fall 1985
- *
- *******************************************************************************
- */
-
-#include <sys/param.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-#include <resolv.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "res.h"
-#include "pathnames.h"
-
-/*
- * Default Internet address of the current host.
- */
-
-#if BSD < 43
-#define LOCALHOST "127.0.0.1"
-#endif
-
-
-/*
- * Name of a top-level name server. Can be changed with
- * the "set root" command.
- */
-
-#ifndef ROOT_SERVER
-#define ROOT_SERVER "ns.nic.ddn.mil."
-#endif
-char rootServerName[NAME_LEN] = ROOT_SERVER;
-
-
-/*
- * Info about the most recently queried host.
- */
-
-HostInfo curHostInfo;
-int curHostValid = FALSE;
-
-
-/*
- * Info about the default name server.
- */
-
-HostInfo *defaultPtr = NULL;
-char defaultServer[NAME_LEN];
-struct in_addr defaultAddr;
-
-
-/*
- * Initial name server query type is Address.
- */
-
-int queryType = T_A;
-int queryClass = C_IN;
-
-/*
- * Stuff for Interrupt (control-C) signal handler.
- */
-
-extern void IntrHandler();
-FILE *filePtr;
-jmp_buf env;
-
-static void CvtAddrToPtr();
-static void ReadRC();
-
-
-/*
- *******************************************************************************
- *
- * main --
- *
- * Initializes the resolver library and determines the address
- * of the initial name server. The yylex routine is used to
- * read and perform commands.
- *
- *******************************************************************************
- */
-
-main(argc, argv)
- int argc;
- char **argv;
-{
- char *wantedHost = NULL;
- Boolean useLocalServer;
- int result;
- int i;
- struct hostent *hp;
- extern int h_errno;
-
- /*
- * Initialize the resolver library routines.
- */
-
- if (res_init() == -1) {
- fprintf(stderr,"*** Can't initialize resolver.\n");
- exit(1);
- }
-
- /*
- * Allocate space for the default server's host info and
- * find the server's address and name. If the resolver library
- * already has some addresses for a potential name server,
- * then use them. Otherwise, see if the current host has a server.
- * Command line arguments may override the choice of initial server.
- */
-
- defaultPtr = (HostInfo *) Calloc(1, sizeof(HostInfo));
-
- /*
- * Parse the arguments:
- * no args = go into interactive mode, use default host as server
- * 1 arg = use as host name to be looked up, default host will be server
- * non-interactive mode
- * 2 args = 1st arg:
- * if it is '-', then
- * ignore but go into interactive mode
- * else
- * use as host name to be looked up,
- * go into non-interactive mode
- * 2nd arg: name or inet address of server
- *
- * "Set" options are specified with a leading - and must come before
- * any arguments. For example, to find the well-known services for
- * a host, type "nslookup -query=wks host"
- */
-
- ReadRC(); /* look for options file */
-
- ++argv; --argc; /* skip prog name */
-
- while (argc && *argv[0] == '-' && argv[0][1]) {
- (void) SetOption (&(argv[0][1]));
- ++argv; --argc;
- }
- if (argc > 2) {
- Usage();
- }
- if (argc && *argv[0] != '-') {
- wantedHost = *argv; /* name of host to be looked up */
- }
-
- useLocalServer = FALSE;
- if (argc == 2) {
- struct in_addr addr;
-
- /*
- * Use an explicit name server. If the hostname lookup fails,
- * default to the server(s) in resolv.conf.
- */
-
- if (inet_aton(*++argv, &addr) != 0) {
- _res.nscount = 1;
- _res.nsaddr.sin_addr = addr;
- } else {
- hp = gethostbyname(*argv);
- if (hp == NULL) {
- fprintf(stderr, "*** Can't find server address for '%s': ",
- *argv);
- herror((char *)NULL);
- fputc('\n', stderr);
- } else {
-#if BSD < 43
- bcopy(hp->h_addr, (char *)&_res.nsaddr.sin_addr, hp->h_length);
- _res.nscount = 1;
-#else
- for (i = 0; i < MAXNS && hp->h_addr_list[i] != NULL; i++) {
- bcopy(hp->h_addr_list[i],
- (char *)&_res.nsaddr_list[i].sin_addr,
- hp->h_length);
- }
- _res.nscount = i;
-#endif
- }
- }
- }
-
-
- if (_res.nscount == 0 || useLocalServer) {
- LocalServer(defaultPtr);
- } else {
- for (i = 0; i < _res.nscount; i++) {
- if (_res.nsaddr_list[i].sin_addr.s_addr == INADDR_ANY) {
- LocalServer(defaultPtr);
- break;
- } else {
- result = GetHostInfoByAddr(&(_res.nsaddr_list[i].sin_addr),
- &(_res.nsaddr_list[i].sin_addr),
- defaultPtr);
- if (result != SUCCESS) {
- fprintf(stderr,
- "*** Can't find server name for address %s: %s\n",
- inet_ntoa(_res.nsaddr_list[i].sin_addr),
- DecodeError(result));
- } else {
- defaultAddr = _res.nsaddr_list[i].sin_addr;
- break;
- }
- }
- }
-
- /*
- * If we have exhausted the list, tell the user about the
- * command line argument to specify an address.
- */
-
- if (i == _res.nscount) {
- fprintf(stderr, "*** Default servers are not available\n");
- exit(1);
- }
-
- }
- strcpy(defaultServer, defaultPtr->name);
-
-
-#ifdef DEBUG
-#ifdef DEBUG2
- _res.options |= RES_DEBUG2;
-#endif
- _res.options |= RES_DEBUG;
- _res.retry = 2;
-#endif DEBUG
-
- /*
- * If we're in non-interactive mode, look up the wanted host and quit.
- * Otherwise, print the initial server's name and continue with
- * the initialization.
- */
-
- if (wantedHost != (char *) NULL) {
- LookupHost(wantedHost, 0);
- } else {
- PrintHostInfo(stdout, "Default Server:", defaultPtr);
-
- /*
- * Setup the environment to allow the interrupt handler to return here.
- */
-
- (void) setjmp(env);
-
- /*
- * Return here after a longjmp.
- */
-
- signal(SIGINT, IntrHandler);
- signal(SIGPIPE, SIG_IGN);
-
- /*
- * Read and evaluate commands. The commands are described in commands.l
- * Yylex returns 0 when ^D or 'exit' is typed.
- */
-
- printf("> ");
- fflush(stdout);
- while(yylex()) {
- printf("> ");
- fflush(stdout);
- }
- }
- exit(0);
-}
-
-
-LocalServer(defaultPtr)
- HostInfo *defaultPtr;
-{
- char hostName[NAME_LEN];
-#if BSD < 43
- int result;
-#endif
-
- gethostname(hostName, sizeof(hostName));
-
-#if BSD < 43
- (void) inet_aton(LOCALHOST, &defaultAddr);
- result = GetHostInfoByName(&defaultAddr, C_IN, T_A,
- hostName, defaultPtr, 1);
- if (result != SUCCESS) {
- fprintf(stderr,
- "*** Can't find initialize address for server %s: %s\n",
- defaultServer, DecodeError(result));
- exit(1);
- }
-#else
- defaultAddr.s_addr = htonl(INADDR_ANY);
- (void) GetHostInfoByName(&defaultAddr, C_IN, T_A, "0.0.0.0", defaultPtr, 1);
- free(defaultPtr->name);
- defaultPtr->name = Calloc(1, sizeof(hostName)+1);
- strcpy(defaultPtr->name, hostName);
-#endif
-}
-
-
-/*
- *******************************************************************************
- *
- * Usage --
- *
- * Lists the proper methods to run the program and exits.
- *
- *******************************************************************************
- */
-
-Usage()
-{
- fprintf(stderr, "Usage:\n");
- fprintf(stderr,
-" nslookup [-opt ...] # interactive mode using default server\n");
- fprintf(stderr,
-" nslookup [-opt ...] - server # interactive mode using 'server'\n");
- fprintf(stderr,
-" nslookup [-opt ...] host # just look up 'host' using default server\n");
- fprintf(stderr,
-" nslookup [-opt ...] host server # just look up 'host' using 'server'\n");
- exit(1);
-}
-
-/*
- *******************************************************************************
- *
- * IsAddr --
- *
- * Returns TRUE if the string looks like an Internet address.
- * A string with a trailing dot is not an address, even if it looks
- * like one.
- *
- *******************************************************************************
- */
-
-Boolean
-IsAddr(host, addrPtr)
- char *host;
- struct in_addr *addrPtr; /* If return TRUE, contains IP address */
-{
- register char *cp;
-
- if (isdigit(host[0])) {
- /* Make sure it has only digits and dots. */
- for (cp = host; *cp; ++cp) {
- if (!isdigit(*cp) && *cp != '.')
- return FALSE;
- }
- /* If it has a trailing dot, don't treat it as an address. */
- if (*--cp != '.') {
- if (inet_aton(host, addrPtr) != 0)
- return TRUE;
- }
- }
- return FALSE;
-}
-
-
-/*
- *******************************************************************************
- *
- * SetDefaultServer --
- *
- * Changes the default name server to the one specified by
- * the first argument. The command "server name" uses the current
- * default server to lookup the info for "name". The command
- * "lserver name" uses the original server to lookup "name".
- *
- * Side effects:
- * This routine will cause a core dump if the allocation requests fail.
- *
- * Results:
- * SUCCESS The default server was changed successfully.
- * NONAUTH The server was changed but addresses of
- * other servers who know about the requested server
- * were returned.
- * Errors No info about the new server was found or
- * requests to the current server timed-out.
- *
- *******************************************************************************
- */
-
-int
-SetDefaultServer(string, local)
- char *string;
- Boolean local;
-{
- register HostInfo *newDefPtr;
- struct in_addr *servAddrPtr;
- struct in_addr addr;
- char newServer[NAME_LEN];
- int result;
- int i;
-
- /*
- * Parse the command line. It maybe of the form "server name",
- * "lserver name" or just "name".
- */
-
- if (local) {
- i = sscanf(string, " lserver %s", newServer);
- } else {
- i = sscanf(string, " server %s", newServer);
- }
- if (i != 1) {
- i = sscanf(string, " %s", newServer);
- if (i != 1) {
- fprintf(stderr,"SetDefaultServer: invalid name: %s\n", string);
- return(ERROR);
- }
- }
-
- /*
- * Allocate space for a HostInfo variable for the new server. Don't
- * overwrite the old HostInfo struct because info about the new server
- * might not be found and we need to have valid default server info.
- */
-
- newDefPtr = (HostInfo *) Calloc(1, sizeof(HostInfo));
-
-
- /*
- * A 'local' lookup uses the original server that the program was
- * initialized with.
- *
- * Check to see if we have the address of the server or the
- * address of a server who knows about this domain.
- * XXX For now, just use the first address in the list.
- */
-
- if (local) {
- servAddrPtr = &defaultAddr;
- } else if (defaultPtr->addrList != NULL) {
- servAddrPtr = (struct in_addr *) defaultPtr->addrList[0];
- } else {
- servAddrPtr = (struct in_addr *) defaultPtr->servers[0]->addrList[0];
- }
-
- result = ERROR;
- if (IsAddr(newServer, &addr)) {
- result = GetHostInfoByAddr(servAddrPtr, &addr, newDefPtr);
- /* If we can't get the name, fall through... */
- }
- if (result != SUCCESS && result != NONAUTH) {
- result = GetHostInfoByName(servAddrPtr, C_IN, T_A,
- newServer, newDefPtr, 1);
- }
-
- if (result == SUCCESS || result == NONAUTH) {
- /*
- * Found info about the new server. Free the resources for
- * the old server.
- */
-
- FreeHostInfoPtr(defaultPtr);
- free((char *)defaultPtr);
- defaultPtr = newDefPtr;
- strcpy(defaultServer, defaultPtr->name);
- PrintHostInfo(stdout, "Default Server:", defaultPtr);
- return(SUCCESS);
- } else {
- fprintf(stderr, "*** Can't find address for server %s: %s\n",
- newServer, DecodeError(result));
- free((char *)newDefPtr);
-
- return(result);
- }
-}
-
-/*
- *******************************************************************************
- *
- * DoLoookup --
- *
- * Common subroutine for LookupHost and LookupHostWithServer.
- *
- * Results:
- * SUCCESS - the lookup was successful.
- * Misc. Errors - an error message is printed if the lookup failed.
- *
- *******************************************************************************
- */
-
-static int
-DoLookup(host, servPtr, serverName)
- char *host;
- HostInfo *servPtr;
- char *serverName;
-{
- int result;
- struct in_addr *servAddrPtr;
- struct in_addr addr;
-
- /* Skip escape character */
- if (host[0] == '\\')
- host++;
-
- /*
- * If the user gives us an address for an address query,
- * silently treat it as a PTR query. If the query type is already
- * PTR, then convert the address into the in-addr.arpa format.
- *
- * Use the address of the server if it exists, otherwise use the
- * address of a server who knows about this domain.
- * XXX For now, just use the first address in the list.
- */
-
- if (servPtr->addrList != NULL) {
- servAddrPtr = (struct in_addr *) servPtr->addrList[0];
- } else {
- servAddrPtr = (struct in_addr *) servPtr->servers[0]->addrList[0];
- }
-
- /*
- * RFC1123 says we "SHOULD check the string syntactically for a
- * dotted-decimal number before looking it up [...]" (p. 13).
- */
- if (queryType == T_A && IsAddr(host, &addr)) {
- result = GetHostInfoByAddr(servAddrPtr, &addr, &curHostInfo);
- } else {
- if (queryType == T_PTR) {
- CvtAddrToPtr(host);
- }
- result = GetHostInfoByName(servAddrPtr, queryClass, queryType, host,
- &curHostInfo, 0);
- }
-
- switch (result) {
- case SUCCESS:
- /*
- * If the query was for an address, then the &curHostInfo
- * variable can be used by Finger.
- * There's no need to print anything for other query types
- * because the info has already been printed.
- */
- if (queryType == T_A) {
- curHostValid = TRUE;
- PrintHostInfo(filePtr, "Name:", &curHostInfo);
- }
- break;
-
- /*
- * No Authoritative answer was available but we got names
- * of servers who know about the host.
- */
- case NONAUTH:
- PrintHostInfo(filePtr, "Name:", &curHostInfo);
- break;
-
- case NO_INFO:
- fprintf(stderr, "*** No %s (%s) records available for %s\n",
- DecodeType(queryType), p_type(queryType), host);
- break;
-
- case TIME_OUT:
- fprintf(stderr, "*** Request to %s timed-out\n", serverName);
- break;
-
- default:
- fprintf(stderr, "*** %s can't find %s: %s\n", serverName, host,
- DecodeError(result));
- }
- return result;
-}
-
-/*
- *******************************************************************************
- *
- * LookupHost --
- *
- * Asks the default name server for information about the
- * specified host or domain. The information is printed
- * if the lookup was successful.
- *
- * Results:
- * ERROR - the output file could not be opened.
- * + results of DoLookup
- *
- *******************************************************************************
- */
-
-int
-LookupHost(string, putToFile)
- char *string;
- Boolean putToFile;
-{
- char host[NAME_LEN];
- char file[NAME_LEN];
- int result;
-
- /*
- * Invalidate the current host information to prevent Finger
- * from using bogus info.
- */
-
- curHostValid = FALSE;
-
- /*
- * Parse the command string into the host and
- * optional output file name.
- *
- */
-
- sscanf(string, " %s", host); /* removes white space */
- if (!putToFile) {
- filePtr = stdout;
- } else {
- filePtr = OpenFile(string, file);
- if (filePtr == NULL) {
- fprintf(stderr, "*** Can't open %s for writing\n", file);
- return(ERROR);
- }
- fprintf(filePtr,"> %s\n", string);
- }
-
- PrintHostInfo(filePtr, "Server:", defaultPtr);
-
- result = DoLookup(host, defaultPtr, defaultServer);
-
- if (putToFile) {
- fclose(filePtr);
- filePtr = NULL;
- }
- return(result);
-}
-
-/*
- *******************************************************************************
- *
- * LookupHostWithServer --
- *
- * Asks the name server specified in the second argument for
- * information about the host or domain specified in the first
- * argument. The information is printed if the lookup was successful.
- *
- * Address info about the requested name server is obtained
- * from the default name server. This routine will return an
- * error if the default server doesn't have info about the
- * requested server. Thus an error return status might not
- * mean the requested name server doesn't have info about the
- * requested host.
- *
- * Comments from LookupHost apply here, too.
- *
- * Results:
- * ERROR - the output file could not be opened.
- * + results of DoLookup
- *
- *******************************************************************************
- */
-
-int
-LookupHostWithServer(string, putToFile)
- char *string;
- Boolean putToFile;
-{
- char file[NAME_LEN];
- char host[NAME_LEN];
- char server[NAME_LEN];
- int result;
- static HostInfo serverInfo;
-
- curHostValid = FALSE;
-
- sscanf(string, " %s %s", host, server);
- if (!putToFile) {
- filePtr = stdout;
- } else {
- filePtr = OpenFile(string, file);
- if (filePtr == NULL) {
- fprintf(stderr, "*** Can't open %s for writing\n", file);
- return(ERROR);
- }
- fprintf(filePtr,"> %s\n", string);
- }
-
- result = GetHostInfoByName(
- defaultPtr->addrList ?
- (struct in_addr *) defaultPtr->addrList[0] :
- (struct in_addr *) defaultPtr->servers[0]->addrList[0],
- C_IN, T_A, server, &serverInfo, 1);
-
- if (result != SUCCESS) {
- fprintf(stderr,"*** Can't find address for server %s: %s\n", server,
- DecodeError(result));
- } else {
- PrintHostInfo(filePtr, "Server:", &serverInfo);
-
- result = DoLookup(host, &serverInfo, server);
- }
- if (putToFile) {
- fclose(filePtr);
- filePtr = NULL;
- }
- return(result);
-}
-
-/*
- *******************************************************************************
- *
- * SetOption --
- *
- * This routine is used to change the state information
- * that affect the lookups. The command format is
- * set keyword[=value]
- * Most keywords can be abbreviated. Parsing is very simplistic--
- * A value must not be separated from its keyword by white space.
- *
- * Valid keywords: Meaning:
- * all lists current values of options.
- * ALL lists current values of options, including
- * hidden options.
- * [no]d2 turn on/off extra debugging mode.
- * [no]debug turn on/off debugging mode.
- * [no]defname use/don't use default domain name.
- * [no]search use/don't use domain search list.
- * domain=NAME set default domain name to NAME.
- * [no]ignore ignore/don't ignore trunc. errors.
- * query=value set default query type to value,
- * value is one of the query types in RFC883
- * without the leading T_. (e.g., A, HINFO)
- * [no]recurse use/don't use recursive lookup.
- * retry=# set number of retries to #.
- * root=NAME change root server to NAME.
- * time=# set timeout length to #.
- * [no]vc use/don't use virtual circuit.
- * port TCP/UDP port to server.
- *
- * Deprecated:
- * [no]primary use/don't use primary server.
- *
- * Results:
- * SUCCESS the command was parsed correctly.
- * ERROR the command was not parsed correctly.
- *
- *******************************************************************************
- */
-
-int
-SetOption(option)
- register char *option;
-{
- char type[NAME_LEN];
- char *ptr;
- int tmp;
-
- while (isspace(*option))
- ++option;
- if (strncmp (option, "set ", 4) == 0)
- option += 4;
- while (isspace(*option))
- ++option;
-
- if (*option == 0) {
- fprintf(stderr, "*** Invalid set command\n");
- return(ERROR);
- } else {
- if (strncmp(option, "all", 3) == 0) {
- ShowOptions();
- } else if (strncmp(option, "ALL", 3) == 0) {
- ShowOptions();
- } else if (strncmp(option, "d2", 2) == 0) { /* d2 (more debug) */
- _res.options |= (RES_DEBUG | RES_DEBUG2);
- } else if (strncmp(option, "nod2", 4) == 0) {
- _res.options &= ~RES_DEBUG2;
- printf("d2 mode disabled; still in debug mode\n");
- } else if (strncmp(option, "def", 3) == 0) { /* defname */
- _res.options |= RES_DEFNAMES;
- } else if (strncmp(option, "nodef", 5) == 0) {
- _res.options &= ~RES_DEFNAMES;
- } else if (strncmp(option, "do", 2) == 0) { /* domain */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%s", _res.defdname);
- res_re_init();
- }
- } else if (strncmp(option, "deb", 1) == 0) { /* debug */
- _res.options |= RES_DEBUG;
- } else if (strncmp(option, "nodeb", 5) == 0) {
- _res.options &= ~(RES_DEBUG | RES_DEBUG2);
- } else if (strncmp(option, "ig", 2) == 0) { /* ignore */
- _res.options |= RES_IGNTC;
- } else if (strncmp(option, "noig", 4) == 0) {
- _res.options &= ~RES_IGNTC;
- } else if (strncmp(option, "po", 2) == 0) { /* port */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%hu", &nsport);
- }
-#ifdef deprecated
- } else if (strncmp(option, "pri", 3) == 0) { /* primary */
- _res.options |= RES_PRIMARY;
- } else if (strncmp(option, "nopri", 5) == 0) {
- _res.options &= ~RES_PRIMARY;
-#endif
- } else if (strncmp(option, "q", 1) == 0 || /* querytype */
- strncmp(option, "ty", 2) == 0) { /* type */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%s", type);
- queryType = StringToType(type, queryType);
- }
- } else if (strncmp(option, "cl", 2) == 0) { /* query class */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%s", type);
- queryClass = StringToClass(type, queryClass);
- }
- } else if (strncmp(option, "rec", 3) == 0) { /* recurse */
- _res.options |= RES_RECURSE;
- } else if (strncmp(option, "norec", 5) == 0) {
- _res.options &= ~RES_RECURSE;
- } else if (strncmp(option, "ret", 3) == 0) { /* retry */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%d", &tmp);
- if (tmp >= 0) {
- _res.retry = tmp;
- }
- }
- } else if (strncmp(option, "ro", 2) == 0) { /* root */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%s", rootServerName);
- }
- } else if (strncmp(option, "sea", 3) == 0) { /* search list */
- _res.options |= RES_DNSRCH;
- } else if (strncmp(option, "nosea", 5) == 0) {
- _res.options &= ~RES_DNSRCH;
- } else if (strncmp(option, "srchl", 5) == 0) { /* domain search list */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- res_dnsrch(++ptr);
- }
- } else if (strncmp(option, "ti", 2) == 0) { /* timeout */
- ptr = strchr(option, '=');
- if (ptr != NULL) {
- sscanf(++ptr, "%d", &tmp);
- if (tmp >= 0) {
- _res.retrans = tmp;
- }
- }
- } else if (strncmp(option, "v", 1) == 0) { /* vc */
- _res.options |= RES_USEVC;
- } else if (strncmp(option, "nov", 3) == 0) {
- _res.options &= ~RES_USEVC;
- } else {
- fprintf(stderr, "*** Invalid option: %s\n", option);
- return(ERROR);
- }
- }
- return(SUCCESS);
-}
-
-/*
- * Fake a reinitialization when the domain is changed.
- */
-res_re_init()
-{
- register char *cp, **pp;
- int n;
-
- /* find components of local domain that might be searched */
- pp = _res.dnsrch;
- *pp++ = _res.defdname;
- for (cp = _res.defdname, n = 0; *cp; cp++)
- if (*cp == '.')
- n++;
- cp = _res.defdname;
- for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDFLSRCH; n--) {
- cp = strchr(cp, '.');
- *pp++ = ++cp;
- }
- *pp = 0;
- _res.options |= RES_INIT;
-}
-
-#define SRCHLIST_SEP '/'
-
-res_dnsrch(cp)
- register char *cp;
-{
- register char **pp;
- int n;
-
- (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
- if ((cp = strchr(_res.defdname, '\n')) != NULL)
- *cp = '\0';
- /*
- * Set search list to be blank-separated strings
- * on rest of line.
- */
- cp = _res.defdname;
- pp = _res.dnsrch;
- *pp++ = cp;
- for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) {
- if (*cp == SRCHLIST_SEP) {
- *cp = '\0';
- n = 1;
- } else if (n) {
- *pp++ = cp;
- n = 0;
- }
- }
- if ((cp = strchr(pp[-1], SRCHLIST_SEP)) != NULL) {
- *cp = '\0';
- }
- *pp = NULL;
-}
-
-
-/*
- *******************************************************************************
- *
- * ShowOptions --
- *
- * Prints out the state information used by the resolver
- * library and other options set by the user.
- *
- *******************************************************************************
- */
-
-void
-ShowOptions()
-{
- register char **cp;
-
- PrintHostInfo(stdout, "Default Server:", defaultPtr);
- if (curHostValid) {
- PrintHostInfo(stdout, "Host:", &curHostInfo);
- }
-
- printf("Set options:\n");
- printf(" %sdebug \t", (_res.options & RES_DEBUG) ? "" : "no");
- printf(" %sdefname\t", (_res.options & RES_DEFNAMES) ? "" : "no");
- printf(" %ssearch\t", (_res.options & RES_DNSRCH) ? "" : "no");
- printf(" %srecurse\n", (_res.options & RES_RECURSE) ? "" : "no");
-
- printf(" %sd2\t\t", (_res.options & RES_DEBUG2) ? "" : "no");
- printf(" %svc\t\t", (_res.options & RES_USEVC) ? "" : "no");
- printf(" %signoretc\t", (_res.options & RES_IGNTC) ? "" : "no");
- printf(" port=%u\n", nsport);
-
- printf(" querytype=%s\t", p_type(queryType));
- printf(" class=%s\t", p_class(queryClass));
- printf(" timeout=%d\t", _res.retrans);
- printf(" retry=%d\n", _res.retry);
- printf(" root=%s\n", rootServerName);
- printf(" domain=%s\n", _res.defdname);
-
- if (cp = _res.dnsrch) {
- printf(" srchlist=%s", *cp);
- for (cp++; *cp; cp++) {
- printf("%c%s", SRCHLIST_SEP, *cp);
- }
- putchar('\n');
- }
- putchar('\n');
-}
-#undef SRCHLIST_SEP
-
-/*
- *******************************************************************************
- *
- * PrintHelp --
- *
- * Prints out the help file.
- * (Code taken from Mail.)
- *
- *******************************************************************************
- */
-
-void
-PrintHelp()
-{
- register int c;
- register FILE *helpFilePtr;
-
- if ((helpFilePtr = fopen(_PATH_HELPFILE, "r")) == NULL) {
- perror(_PATH_HELPFILE);
- return;
- }
- while ((c = getc(helpFilePtr)) != EOF) {
- putchar((char) c);
- }
- fclose(helpFilePtr);
-}
-
-/*
- *******************************************************************************
- *
- * CvtAddrToPtr --
- *
- * Convert a dotted-decimal Internet address into the standard
- * PTR format (reversed address with .in-arpa. suffix).
- *
- * Assumes the argument buffer is large enougth to hold the result.
- *
- *******************************************************************************
- */
-
-static void
-CvtAddrToPtr(name)
- char *name;
-{
- char *p;
- int ip[4];
- struct in_addr addr;
-
- if (IsAddr(name, &addr)) {
- p = inet_ntoa(addr);
- if (sscanf(p, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]) == 4) {
- sprintf(name, "%d.%d.%d.%d.in-addr.arpa.",
- ip[3], ip[2], ip[1], ip[0]);
- }
- }
-}
-
-/*
- *******************************************************************************
- *
- * ReadRC --
- *
- * Use the contents of ~/.nslookuprc as options.
- *
- *******************************************************************************
- */
-
-static void
-ReadRC()
-{
- register FILE *fp;
- register char *cp;
- char buf[NAME_LEN];
-
- if ((cp = getenv("HOME")) != NULL) {
- (void) strcpy(buf, cp);
- (void) strcat(buf, "/.nslookuprc");
-
- if ((fp = fopen(buf, "r")) != NULL) {
- while (fgets(buf, sizeof(buf), fp) != NULL) {
- if ((cp = strchr(buf, '\n')) != NULL) {
- *cp = '\0';
- }
- (void) SetOption(buf);
- }
- (void) fclose(fp);
- }
- }
-}
diff --git a/usr.sbin/named/tools/nslookup/nslookup.8 b/usr.sbin/named/tools/nslookup/nslookup.8
deleted file mode 100644
index fa8f87b3a18..00000000000
--- a/usr.sbin/named/tools/nslookup/nslookup.8
+++ /dev/null
@@ -1,364 +0,0 @@
-.\" Copyright (c) 1986,1990 Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)nslookup.8 5.3 (Berkeley) 6/24/90
-.\" $Id: nslookup.8,v 1.1 1995/10/18 08:47:55 deraadt Exp $
-.\"
-.TH NSLOOKUP 8 "June 24, 1990"
-.UC 6
-.SH NAME
-nslookup \- query Internet name servers interactively
-.SH SYNOPSIS
-.B nslookup
-[
-.I \-option ...
-]
-[
-.I host-to-find
-| \- [
-.I server
-]]
-.SH DESCRIPTION
-.I Nslookup
-is a program to query Internet domain name servers.
-Nslookup has two modes: interactive and non-interactive.
-Interactive mode allows the user to query name servers for
-information about various hosts and domains or to print a list of hosts
-in a domain.
-Non-interactive mode is used to print just the name and requested information
-for a host or domain.
-.sp 1
-.SH ARGUMENTS
-Interactive mode is entered in the following cases:
-.IP a) 4
-when no arguments are given (the default name server will be used),
-.IP b) 4
-when the first argument is a hyphen (\-) and the second argument
-is the host name or Internet address of a name server.
-.LP
-Non-interactive mode is used when the name or Internet address
-of the host to be looked up
-is given as the first argument. The optional second argument specifies
-the host name or address of a name server.
-.LP
-The options listed under the ``set'' command below can be specified in
-the .nslookuprc file in the user's home directory if they are listed
-one per line. Options can also be specified
-on the command line if they precede the arguments and are prefixed with
-a hyphen. For example, to change the default query type to host information,
-and the initial timeout to 10 seconds, type:
-.sp .5v
- nslookup \-query=hinfo \-timeout=10
-.sp .5v
-.SH "INTERACTIVE COMMANDS"
-Commands may be interrupted at any time by typing a control-C.
-To exit, type a control-D (EOF) or type exit.
-The command line length must be less than 256 characters.
-To treat a built-in command as a host name,
-precede it with an escape character (\e).
-\fBN.B.\fP an unrecognized command will be interpreted as a host name.
-.sp .5v
-.IP "\fIhost\fP [\fIserver\fP]"
-Look up information for \fIhost\fP using the current default server
-or using \fIserver\fP if specified.
-If \fIhost\fP is an Internet address and the query type is A or PTR, the
-name of the host is returned.
-If \fIhost\fP is a name and does not have a trailing period, the default
-domain name is appended to the name. (This behavior depends on the state of the
-\fBset\fP options \fBdomain\fP, \fBsrchlist\fP,
-\fBdefname\fP, and \fBsearch\fP).
-To look up a host not in the current domain, append a period to
-the name.
-.sp 1
-.IP "\fBserver\fP \fIdomain\fP"
-.ns
-.IP "\fBlserver\fP \fIdomain\fP"
-Change the default server to \fIdomain\fP.
-\fBLserver\fP uses the initial server to look up
-information about \fIdomain\fP while \fBserver\fP
-uses the current default server.
-If an authoritative answer can't be found, the names of servers
-that might have the answer are returned.
-.sp 1
-.IP \fBroot\fP
-Changes the default server to the server for the root of the domain name space.
-Currently, the host ns.nic.ddn.mil is used.
-(This command is a synonym for \fBlserver ns.nic.ddn.mil.\fP)
-The name of the root server can be changed with the \fBset root\fP command.
-.sp 1
-.IP "\fBfinger\fP [\fIname\fP] [\fB>\fP \fIfilename\fP]"
-.ns
-.IP "\fBfinger\fP [\fIname\fP] [\fB>>\fP \fIfilename\fP]"
-Connects with the finger server on the current host.
-The current host is defined when a previous lookup for a host
-was successful and returned address information (see the
-\fBset querytype=A\fP command).
-\fIName\fP is optional.
-\fB>\fP and \fB>>\fP can be used to redirect output in the
-usual manner.
-.sp 1
-.IP "\fBls\fR [\fIoption\fR] \fIdomain\fR [\fB>\fR \fIfilename\fR]"
-.ns
-.IP "\fBls\fR [\fIoption\fR] \fIdomain\fR [\fB>>\fR \fIfilename\fR]"
-List the information available for \fIdomain\fP, optionally creating
-or appending to \fIfilename\fP.
-The default output contains host names and their Internet addresses.
-.I Option
-can be one of the following:
-.RS
-.IP "\fB\-t \fIquerytype\fP" 4
-lists all records of the specified type (see \fIquerytype\fP below).
-.IP \fB\-a\fP 4
-lists aliases of hosts in the domain.
-synonym for \fB\-t\ \ CNAME\fP.
-.IP \fB\-d\fP 4
-lists all records for the domain.
-synonym for \fB\-t\ \ ANY\fP.
-.IP \fB\-h\fP 4
-lists CPU and operating system information for the domain.
-synonym for \fB\-t\ \ HINFO\fP.
-.IP \fB\-s\fP 4
-lists well-known services of hosts in the domain.
-synonym for \fB\-t\ \ WKS\fP.
-.P
-When output is directed to a file, hash marks are printed for every
-50 records received from the server.
-.RE
-.sp 1
-.IP "\fBview\fP \fIfilename\fP"
-Sorts and lists the output of previous \fBls\fP command(s) with \fImore\fP(1).
-.sp 1
-.ne 4
-.IP "\fBhelp\fP"
-.ns
-.IP "\fB?\fP"
-Prints a brief summary of commands.
-.sp 1
-.IP "\fBexit\fP"
-Exits the program.
-.sp 1
-.IP "\fBset\fP \fIkeyword\fP[=\fIvalue\fP]"
-This command is used to change state information that affects the lookups.
-Valid keywords are:
-.RS
-.IP "\fBall\fP"
-Prints the current values of the frequently-used options to \fBset\fP.
-Information about the current default server and host is also printed.
-.IP "\fBclass=\fIvalue\fR"
-Change the query class to one of:
-.RS
-.IP IN 10
-the Internet class.
-.IP CHAOS 10
-the Chaos class.
-.IP HESIOD 10
-the MIT Athena Hesiod class.
-.IP ANY 10
-wildcard (any of the above).
-.P
-The class specifies the protocol group of the information.
-.br
-(Default = IN, abbreviation = cl)
-.RE
-.IP "\fB[no]debug\fP"
-Turn debugging mode on. A lot more information is printed about the
-packet sent to the server and the resulting answer.
-.br
-(Default = nodebug, abbreviation = [no]deb)
-.IP "\fB[no]d2\fP"
-Turn exhaustive debugging mode on.
-Essentially all fields of every packet are printed.
-.br
-(Default = nod2)
-.IP "\fBdomain=\fIname\fR"
-Change the default domain name to \fIname\fP.
-The default domain name is appended to a lookup request depending on the
-state of the \fBdefname\fP and \fBsearch\fP options.
-The domain search list contains the parents of the default domain if it has
-at least two components in its name.
-For example, if the default domain
-is CC.Berkeley.EDU, the search list is CC.Berkeley.EDU and Berkeley.EDU.
-Use the \fBset srchlist\fP command to specify a different list.
-Use the \fBset all\fP command to display the list.
-.br
-(Default = value from hostname, /etc/resolv.conf or LOCALDOMAIN,
-abbreviation = do)
-.IP "\fBsrchlist=\fIname1/name2/...\fR"
-Change the default domain name to \fIname1\fP and the domain search list
-to \fIname1\fP, \fIname2\fP, etc. A maximum of 6 names separated by slashes (/)
-can be specified.
-For example,
-.sp .5v
- set\ srchlist=lcs.MIT.EDU/ai.MIT.EDU/MIT.EDU
-.sp .5v
-sets the domain to lcs.MIT.EDU and the search list to the three names.
-This command overrides the
-default domain name and search list of the \fBset domain\fP command.
-Use the \fBset all\fP command to display the list.
-.br
-(Default = value based on hostname, /etc/resolv.conf or LOCALDOMAIN,
-abbreviation = srchl)
-.IP "\fB[no]defname\fP"
-If set, append the default domain name to a single-component lookup request
-(i.e., one that does not contain a period).
-.br
-(Default = defname, abbreviation = [no]def)
-.IP "\fB[no]search\fP"
-If the lookup request contains at least one period but doesn't end
-with a trailing period,
-append the domain names in the domain search list
-to the request until an answer is received.
-.br
-(Default = search, abbreviation = [no]sea)
-.IP "\fBport=\fIvalue\fR"
-Change the default TCP/UDP name server port to \fIvalue\fP.
-.br
-(Default = 53, abbreviation = po)
-.IP "\fBquerytype=\fIvalue\fR"
-.ns
-.IP "\fBtype=\fIvalue\fR"
-.ns
-Change the type of information query to one of:
-.RS
-.IP A 10
-the host's Internet address.
-.IP CNAME 10
-the canonical name for an alias.
-.IP HINFO 10
-the host CPU and operating system type.
-.IP MINFO 10
-the mailbox or mail list information.
-.IP MX 10
-the mail exchanger.
-.IP NS 10
-the name server for the named zone.
-.IP PTR 10
-the host name if the query is an Internet address,
-otherwise the pointer to other information.
-.IP SOA 10
-the domain's ``start-of-authority'' information.
-.IP TXT 10
-the text information.
-.IP UINFO 10
-the user information.
-.IP WKS 10
-the supported well-known services.
-.P
-Other types (ANY, AXFR, MB, MD, MF, NULL) are described in the
-RFC-1035 document.
-.br
-(Default = A, abbreviations = q, ty)
-.RE
-.IP "\fB[no]recurse\fP"
-Tell the name server to query other servers if it does not have the
-information.
-.br
-(Default = recurse, abbreviation = [no]rec)
-.IP \fBretry=\fInumber\fR
-Set the number of retries to \fInumber\fP.
-When a reply to a request is not received within a certain
-amount of time (changed with \fBset timeout\fP),
-the timeout period is doubled and the request is resent.
-The retry value controls how many times a request is resent before giving up.
-.br
-(Default = 4, abbreviation = ret)
-.IP \fBroot=\fIhost\fR
-Change the name of the root server to \fIhost\fP. This
-affects the \fBroot\fP command.
-.br
-(Default = ns.nic.ddn.mil., abbreviation = ro)
-.IP \fBtimeout=\fInumber\fR
-Change the initial timeout interval
-for waiting for a reply
-to \fInumber\fP seconds.
-Each retry doubles the timeout period.
-.br
-(Default = 5 seconds, abbreviation = ti)
-.IP "\fB[no]vc\fP"
-Always use a virtual circuit when sending requests to the server.
-.br
-(Default = novc, abbreviation = [no]v)
-.IP "\fB[no]ignoretc\fP"
-Ignore packet truncation errors.
-.br
-(Default = noignoretc, abbreviation = [no]ig)
-.RE
-.SH DIAGNOSTICS
-If the lookup request was not successful, an error message is printed.
-Possible errors are:
-.IP "Timed out" 5
-The server did not respond to a request after a certain amount of
-time (changed with \fBset timeout=\fIvalue\fR)
-and a certain number of retries (changed with \fBset retry=\fIvalue\fR).
-.IP "No response from server" 5
-No name server is running on the server machine.
-.IP "No records" 5
-The server does not have resource records of the current query type for the
-host, although the host name is valid.
-The query type is specified with the \fBset querytype\fP command.
-.IP "Non-existent domain" 5
-The host or domain name does not exist.
-.IP "Connection refused" 5
-.ns
-.IP "Network is unreachable" 5
-The connection to the name or finger server could not be made
-at the current time.
-This error commonly occurs with \fBls\fP and \fBfinger\fP requests.
-.IP "Server failure" 5
-The name server found an internal inconsistency in its database
-and could not return a valid answer.
-.IP "Refused" 5
-The name server refused to service the request.
-.IP "Format error" 5
-The name server found that the request packet was not in the proper format.
-It may indicate an error in \fInslookup\fP.
-.sp 1
-.SH FILES
-.ta \w'/usr/share/misc/nslookup.helpXXX'u
-/etc/resolv.conf initial domain name and
- name server addresses.
-.br
-$HOME/.nslookuprc user's initial options.
-.br
-/usr/share/misc/nslookup.help summary of commands.
-.SH ENVIRONMENT
-.ta \w'HOSTALIASESXXXX'u
-HOSTALIASES file containing host aliases.
-.br
-LOCALDOMAIN overrides default domain.
-.SH SEE ALSO
-resolver(3), resolv.conf(5), named(8),
-.br
-RFC-1034 ``Domain Names \- Concepts and Facilities''
-.br
-RFC-1035 ``Domain Names \- Implementation and Specification''
-.SH AUTHOR
-Andrew Cherenson
diff --git a/usr.sbin/named/tools/nslookup/nslookup.help b/usr.sbin/named/tools/nslookup/nslookup.help
deleted file mode 100644
index 9c92635ebc1..00000000000
--- a/usr.sbin/named/tools/nslookup/nslookup.help
+++ /dev/null
@@ -1,31 +0,0 @@
-Commands: (identifiers are shown in uppercase, [] means optional)
-NAME - print info about the host/domain NAME using default server
-NAME1 NAME2 - as above, but use NAME2 as server
-help or ? - print info on common commands; see nslookup(1) for details
-set OPTION - set an option
- all - print options, current server and host
- [no]debug - print debugging information
- [no]d2 - print exhaustive debugging information
- [no]defname - append domain name to each query
- [no]recurse - ask for recursive answer to query
- [no]vc - always use a virtual circuit
- domain=NAME - set default domain name to NAME
- srchlist=N1[/N2/.../N6] - set domain to N1 and search list to N1,N2, etc.
- root=NAME - set root server to NAME
- retry=X - set number of retries to X
- timeout=X - set initial time-out interval to X seconds
- querytype=X - set query type, e.g., A,ANY,CNAME,HINFO,MX,NS,PTR,SOA,WKS
- type=X - synonym for querytype
- class=X - set query class to one of IN (Internet), CHAOS, HESIOD or ANY
-server NAME - set default server to NAME, using current default server
-lserver NAME - set default server to NAME, using initial server
-finger [USER] - finger the optional NAME at the current default host
-root - set current default server to the root
-ls [opt] DOMAIN [> FILE] - list addresses in DOMAIN (optional: output to FILE)
- -a - list canonical names and aliases
- -h - list HINFO (CPU type and operating system)
- -s - list well-known services
- -d - list all records
- -t TYPE - list records of the given type (e.g., A,CNAME,MX, etc.)
-view FILE - sort an 'ls' output file and view it with more
-exit - exit the program, ^D also exits
diff --git a/usr.sbin/named/tools/nslookup/pathnames.h b/usr.sbin/named/tools/nslookup/pathnames.h
deleted file mode 100644
index 6c681ad8355..00000000000
--- a/usr.sbin/named/tools/nslookup/pathnames.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: @(#)pathnames.h 5.1 (Berkeley) 5/28/90
- * $Id: pathnames.h,v 1.1 1995/10/18 08:47:55 deraadt Exp $
- */
-
-#define _PATH_HELPFILE "/usr/share/misc/nslookup.help"
diff --git a/usr.sbin/named/tools/nslookup/res.h b/usr.sbin/named/tools/nslookup/res.h
deleted file mode 100644
index 639a6b6a4d2..00000000000
--- a/usr.sbin/named/tools/nslookup/res.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 1985,1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: @(#)res.h 5.10 (Berkeley) 6/1/90
- * $Id: res.h,v 1.1 1995/10/18 08:47:55 deraadt Exp $
- */
-
-/*
- *******************************************************************************
- *
- * res.h --
- *
- * Definitions used by modules of the name server lookup program.
- *
- * Copyright (c) 1985
- * Andrew Cherenson
- * U.C. Berkeley
- * CS298-26 Fall 1985
- *
- *******************************************************************************
- */
-
-#define TRUE 1
-#define FALSE 0
-typedef int Boolean;
-
-/*
- * Define return statuses in addtion to the ones defined in namserv.h
- * let SUCCESS be a synonym for NOERROR
- *
- * TIME_OUT - a socket connection timed out.
- * NO_INFO - the server didn't find any info about the host.
- * ERROR - one of the following types of errors:
- * dn_expand, res_mkquery failed
- * bad command line, socket operation failed, etc.
- * NONAUTH - the server didn't have the desired info but
- * returned the name(s) of some servers who should.
- * NO_RESPONSE - the server didn't respond.
- *
- */
-
-#define SUCCESS 0
-#define TIME_OUT -1
-#define NO_INFO -2
-#define ERROR -3
-#define NONAUTH -4
-#define NO_RESPONSE -5
-
-/*
- * Define additional options for the resolver state structure.
- *
- * RES_DEBUG2 more verbose debug level
- */
-
-#define RES_DEBUG2 0x80000000
-
-/*
- * Maximum length of server, host and file names.
- */
-
-#define NAME_LEN 256
-
-
-/*
- * Modified struct hostent from <netdb.h>
- *
- * "Structures returned by network data base library. All addresses
- * are supplied in host order, and returned in network order (suitable
- * for use in system calls)."
- */
-
-typedef struct {
- char *name; /* official name of host */
- char **domains; /* domains it serves */
- char **addrList; /* list of addresses from name server */
-} ServerInfo;
-
-typedef struct {
- char *name; /* official name of host */
- char **aliases; /* alias list */
- char **addrList; /* list of addresses from name server */
- int addrType; /* host address type */
- int addrLen; /* length of address */
- ServerInfo **servers;
-} HostInfo;
-
-
-/*
- * FilePtr is used for directing listings to a file.
- * It is global so the Control-C handler can close it.
- */
-
-extern FILE *filePtr;
-
-/*
- * TCP/UDP port of server.
- */
-extern unsigned short nsport;
-
-/*
- * External routines:
- */
-
-extern Boolean IsAddr();
-extern int Print_query();
-extern char *Print_cdname();
-extern char *Print_cdname2(); /* fixed width */
-extern char *Print_rr();
-extern char *DecodeType(); /* descriptive version of p_type */
-extern char *DecodeError();
-extern char *Calloc();
-extern char *Malloc();
-extern void NsError();
-extern void PrintServer();
-extern void PrintHostInfo();
-extern void ShowOptions();
-extern void FreeHostInfoPtr();
-extern FILE *OpenFile();
-extern char *res_skip();
diff --git a/usr.sbin/named/tools/nslookup/send.c b/usr.sbin/named/tools/nslookup/send.c
deleted file mode 100644
index 688d2ad13bd..00000000000
--- a/usr.sbin/named/tools/nslookup/send.c
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * Copyright (c) 1985, 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)send.c 5.18 (Berkeley) 3/2/91";*/
-static char rcsid[] = "$Id: send.c,v 1.1 1995/10/18 08:47:55 deraadt Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * send.c --
- *
- * Routine to send request packets to a name server.
- *
- * Based on "@(#)res_send.c 6.25 (Berkeley) 6/1/90".
- *
- *******************************************************************************
- */
-
-
-/*
- * Send query to name server and wait for reply.
- */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <stdio.h>
-#include <errno.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-#include <resolv.h>
-#include "res.h"
-
-extern int errno;
-
-static int s = -1; /* socket used for communications */
-
-
-#ifndef FD_SET
-#define NFDBITS 32
-#define FD_SETSIZE 32
-#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
-#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
-#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
-#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
-#endif
-
-#define SR 1 /* SendRequest style */
-
-#ifndef DEBUG
-#define DEBUG
-#endif
-
-unsigned short nsport = NAMESERVER_PORT;
-
-
-
-/*
- *******************************************************************************
- *
- * SendRequest --
- *
- * Sends a request packet to a name server whose address
- * is specified by the first argument and returns with
- * the answer packet.
- *
- * Results:
- * SUCCESS - the request was sent and an answer
- * was received.
- * TIME_OUT - the virtual circuit connection timed-out
- * or a reply to a datagram wasn't received.
- *
- *
- *******************************************************************************
- */
-
-int
-SendRequest(nsAddrPtr, buf, buflen, answer, anslen, trueLenPtr)
- struct in_addr *nsAddrPtr;
- char *buf;
- int buflen;
- char *answer;
- u_int anslen;
- int *trueLenPtr;
-{
- register int n;
- int try, v_circuit, resplen, ns;
- int gotsomewhere = 0, connected = 0;
- int connreset = 0;
- u_short id, len;
- char *cp;
- fd_set dsmask;
- struct timeval timeout;
- HEADER *hp = (HEADER *) buf;
- HEADER *anhp = (HEADER *) answer;
- struct iovec iov[2];
- int terrno = ETIMEDOUT;
- char junk[512];
-
-#if SR
- struct sockaddr_in sin;
-
- if (_res.options & RES_DEBUG2) {
- printf("------------\nSendRequest(), len %d\n", buflen);
- Print_query(buf, buf+buflen, 1);
- }
- sin.sin_family = AF_INET;
- sin.sin_port = htons(nsport);
- sin.sin_addr = *nsAddrPtr;
-#else
-#ifdef DEBUG
- if (_res.options & RES_DEBUG) {
- printf("res_send()\n");
- p_query(buf);
- }
-#endif DEBUG
- if (!(_res.options & RES_INIT))
- if (res_init() == -1) {
- return(-1);
- }
-#endif /* SR */
- v_circuit = (_res.options & RES_USEVC) || buflen > PACKETSZ;
- id = hp->id;
- /*
- * Send request, RETRY times, or until successful
- */
- for (try = 0; try < _res.retry; try++) {
-#if !SR
- for (ns = 0; ns < _res.nscount; ns++) {
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- printf("Querying server (# %d) address = %s\n", ns+1,
- inet_ntoa(_res.nsaddr_list[ns].sin_addr));
-#endif DEBUG
-#endif /* !SR */
- usevc:
- if (v_circuit) {
- int truncated = 0;
-
- /*
- * Use virtual circuit;
- * at most one attempt per server.
- */
- try = _res.retry;
- if (s < 0) {
- s = socket(AF_INET, SOCK_STREAM, 0);
- if (s < 0) {
- terrno = errno;
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("socket (vc) failed");
-#endif DEBUG
- continue;
- }
-#if SR
- if (connect(s, (struct sockaddr *)&sin,
-#else
- if (connect(s,
- (struct sockaddr *)&(_res.nsaddr_list[ns]),
-#endif
- sizeof(struct sockaddr)) < 0) {
- terrno = errno;
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("connect failed");
-#endif DEBUG
- (void) close(s);
- s = -1;
- continue;
- }
- }
- /*
- * Send length & message
- */
- len = htons((u_short)buflen);
- iov[0].iov_base = (caddr_t)&len;
- iov[0].iov_len = sizeof(len);
- iov[1].iov_base = buf;
- iov[1].iov_len = buflen;
- if (writev(s, iov, 2) != sizeof(len) + buflen) {
- terrno = errno;
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("write failed");
-#endif DEBUG
- (void) close(s);
- s = -1;
- continue;
- }
- /*
- * Receive length & response
- */
- cp = answer;
- len = sizeof(short);
- while (len != 0 &&
- (n = read(s, (char *)cp, (int)len)) > 0) {
- cp += n;
- len -= n;
- }
- if (n <= 0) {
- terrno = errno;
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("read failed");
-#endif DEBUG
- (void) close(s);
- s = -1;
- /*
- * A long running process might get its TCP
- * connection reset if the remote server was
- * restarted. Requery the server instead of
- * trying a new one. When there is only one
- * server, this means that a query might work
- * instead of failing. We only allow one reset
- * per query to prevent looping.
- */
- if (terrno == ECONNRESET && !connreset) {
- connreset = 1;
- ns--;
- }
- continue;
- }
- cp = answer;
- if ((resplen = ntohs(*(u_short *)cp)) > anslen) {
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- fprintf(stderr, "response truncated\n");
-#endif DEBUG
- len = anslen;
- truncated = 1;
- } else
- len = resplen;
- while (len != 0 &&
- (n = read(s, (char *)cp, (int)len)) > 0) {
- cp += n;
- len -= n;
- }
- if (n <= 0) {
- terrno = errno;
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("read failed");
-#endif DEBUG
- (void) close(s);
- s = -1;
- continue;
- }
- if (truncated) {
- /*
- * Flush rest of answer
- * so connection stays in synch.
- */
- anhp->tc = 1;
- len = resplen - anslen;
- while (len != 0) {
- n = (len > sizeof(junk) ?
- sizeof(junk) : len);
- if ((n = read(s, junk, n)) > 0)
- len -= n;
- else
- break;
- }
- }
- } else {
- /*
- * Use datagrams.
- */
- if (s < 0) {
- s = socket(AF_INET, SOCK_DGRAM, 0);
- if (s < 0) {
- terrno = errno;
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("socket (dg) failed");
-#endif DEBUG
- continue;
- }
- }
-#if SR
- /*
- * Special case the send code below
- * since we have just 1 server.
- */
-#if BSD >= 43
- if (connected == 0) {
- if (connect(s, (struct sockaddr *)&sin,
- sizeof(struct sockaddr)) < 0) {
- if (_res.options & RES_DEBUG)
- perror("connect");
- continue;
- }
- connected = 1;
- }
- if (send(s, buf, buflen, 0) != buflen) {
- if (_res.options & RES_DEBUG)
- perror("send");
- continue;
- }
-#else /* BSD */
- if (sendto(s, buf, buflen, 0, &sin,
- sizeof(struct sockaddr)) != buflen) {
- if (_res.options & RES_DEBUG)
- perror("sendto");
- continue;
- }
-#endif
-#else /* SR */
-#if BSD >= 43
- /*
- * I'm tired of answering this question, so:
- * On a 4.3BSD+ machine (client and server,
- * actually), sending to a nameserver datagram
- * port with no nameserver will cause an
- * ICMP port unreachable message to be returned.
- * If our datagram socket is "connected" to the
- * server, we get an ECONNREFUSED error on the next
- * socket operation, and select returns if the
- * error message is received. We can thus detect
- * the absence of a nameserver without timing out.
- * If we have sent queries to at least two servers,
- * however, we don't want to remain connected,
- * as we wish to receive answers from the first
- * server to respond.
- */
- if (_res.nscount == 1 || (try == 0 && ns == 0)) {
- /*
- * Don't use connect if we might
- * still receive a response
- * from another server.
- */
- if (connected == 0) {
- if (connect(s, &_res.nsaddr_list[ns],
- sizeof(struct sockaddr)) < 0) {
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("connect");
-#endif DEBUG
- continue;
- }
- connected = 1;
- }
- if (send(s, buf, buflen, 0) != buflen) {
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("send");
-#endif DEBUG
- continue;
- }
- } else {
- /*
- * Disconnect if we want to listen
- * for responses from more than one server.
- */
- if (connected) {
- (void) connect(s, &no_addr,
- sizeof(no_addr));
- connected = 0;
- }
-#endif BSD
- if (sendto(s, buf, buflen, 0,
- &_res.nsaddr_list[ns],
- sizeof(struct sockaddr)) != buflen) {
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("sendto");
-#endif DEBUG
- continue;
- }
-#if BSD >= 43
- }
-#endif
-#endif /* SR */
-
- /*
- * Wait for reply
- */
- timeout.tv_sec = (_res.retrans << try);
-#if !SR
- if (try > 0)
- timeout.tv_sec /= _res.nscount;
-#endif /* SR */
- if (timeout.tv_sec <= 0)
- timeout.tv_sec = 1;
- timeout.tv_usec = 0;
-wait:
- FD_ZERO(&dsmask);
- FD_SET(s, &dsmask);
- n = select(s+1, &dsmask, (fd_set *)NULL,
- (fd_set *)NULL, &timeout);
- if (n < 0) {
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("select");
-#endif DEBUG
- continue;
- }
- if (n == 0) {
- /*
- * timeout
- */
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- printf("timeout (%d secs)\n",
- timeout.tv_sec);
-#endif DEBUG
-#if BSD >= 43
- gotsomewhere = 1;
-#endif
- continue;
- }
- if ((resplen = recv(s, answer, anslen, 0)) <= 0) {
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- perror("recvfrom");
-#endif DEBUG
- continue;
- }
- gotsomewhere = 1;
- if (id != anhp->id) {
- /*
- * response from old query, ignore it
- */
-#if SR
- if (_res.options & RES_DEBUG2) {
- printf("------------\nOld answer:\n");
- Print_query(answer, answer+resplen, 1);
- }
-#else
-#ifdef DEBUG
- if (_res.options & RES_DEBUG) {
- printf("old answer:\n");
- p_query(answer);
- }
-#endif DEBUG
-#endif
- goto wait;
- }
- if (!(_res.options & RES_IGNTC) && anhp->tc) {
- /*
- * get rest of answer;
- * use TCP with same server.
- */
-#ifdef DEBUG
- if (_res.options & RES_DEBUG)
- printf("truncated answer\n");
-#endif DEBUG
- (void) close(s);
- s = -1;
- v_circuit = 1;
- goto usevc;
- }
- }
-#if SR
- if (_res.options & RES_DEBUG) {
- if (_res.options & RES_DEBUG2)
- printf("------------\nGot answer (%d bytes):\n",
- resplen);
- else
- printf("------------\nGot answer:\n");
- Print_query(answer, answer+resplen, 1);
- }
- (void) close(s);
- s = -1;
- *trueLenPtr = resplen;
- return (SUCCESS);
-#else
-#ifdef DEBUG
- if (_res.options & RES_DEBUG) {
- printf("got answer:\n");
- p_query(answer);
- }
-#endif DEBUG
- /*
- * If using virtual circuits, we assume that the first server
- * is preferred * over the rest (i.e. it is on the local
- * machine) and only keep that one open.
- * If we have temporarily opened a virtual circuit,
- * or if we haven't been asked to keep a socket open,
- * close the socket.
- */
- if ((v_circuit &&
- ((_res.options & RES_USEVC) == 0 || ns != 0)) ||
- (_res.options & RES_STAYOPEN) == 0) {
- (void) close(s);
- s = -1;
- }
- return (resplen);
- }
-#endif /* SR */
- }
- if (s >= 0) {
- (void) close(s);
- s = -1;
- }
-#if SR
- if (v_circuit == 0)
- if (gotsomewhere == 0)
- return NO_RESPONSE; /* no nameservers found */
- else
- return TIME_OUT; /* no answer obtained */
- else
- if (errno == ECONNREFUSED)
- return NO_RESPONSE;
- else
- return ERROR;
-#else
- if (v_circuit == 0)
- if (gotsomewhere == 0)
- errno = ECONNREFUSED; /* no nameservers found */
- else
- errno = ETIMEDOUT; /* no answer obtained */
- else
- errno = terrno;
- return (-1);
-#endif
-}
-
-/*
- * This routine is for closing the socket if a virtual circuit is used and
- * the program wants to close it.
- *
- * Called from the interrupt handler.
- */
-SendRequest_close()
-{
- if (s != -1) {
- (void) close(s);
- s = -1;
- }
-}
diff --git a/usr.sbin/named/tools/nslookup/skip.c b/usr.sbin/named/tools/nslookup/skip.c
deleted file mode 100644
index 6f72f810f18..00000000000
--- a/usr.sbin/named/tools/nslookup/skip.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (c) 1985 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)skip.c 5.12 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: skip.c,v 1.1 1995/10/18 08:47:55 deraadt Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * skip.c --
- *
- * Routines to skip over portions of a query buffer.
- *
- * Note: this file has been submitted for inclusion in
- * BIND resolver library. When this has been done, this file
- * is no longer necessary (assuming there haven't been any
- * changes).
- *
- * Adapted from 4.3BSD BIND res_debug.c
- *
- *******************************************************************************
- */
-
-#include <sys/param.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include <stdio.h>
-
-char *res_skip_rr();
-
-
-/*
- *******************************************************************************
- *
- * res_skip --
- *
- * Skip the contents of a query.
- *
- * Interpretation of numFieldsToSkip argument:
- * res_skip returns pointer to:
- * 1 -> start of question records.
- * 2 -> start of authoritative answer records.
- * 3 -> start of additional records.
- * 4 -> first byte after end of additional records.
- *
- * Results:
- * (address) - success operation.
- * NULL - a resource record had an incorrect format.
- *
- *******************************************************************************
- */
-
-char *
-res_skip(msg, numFieldsToSkip, eom)
- char *msg;
- int numFieldsToSkip;
- char *eom;
-{
- register char *cp;
- register HEADER *hp;
- register int tmp;
- register int n;
-
- /*
- * Skip the header fields.
- */
- hp = (HEADER *)msg;
- cp = msg + sizeof(HEADER);
-
- /*
- * skip question records.
- */
- if (n = ntohs(hp->qdcount) ) {
- while (--n >= 0 && cp < eom) {
- tmp = dn_skipname((u_char *)cp, (u_char *)eom);
- if (tmp == -1) return(NULL);
- cp += tmp;
- cp += sizeof(u_short); /* type */
- cp += sizeof(u_short); /* class */
- }
- }
- if (--numFieldsToSkip <= 0) return(cp);
-
- /*
- * skip authoritative answer records
- */
- if (n = ntohs(hp->ancount)) {
- while (--n >= 0 && cp < eom) {
- cp = res_skip_rr(cp, eom);
- if (cp == NULL) return(NULL);
- }
- }
- if (--numFieldsToSkip == 0) return(cp);
-
- /*
- * skip name server records
- */
- if (n = ntohs(hp->nscount)) {
- while (--n >= 0 && cp < eom) {
- cp = res_skip_rr(cp, eom);
- if (cp == NULL) return(NULL);
- }
- }
- if (--numFieldsToSkip == 0) return(cp);
-
- /*
- * skip additional records
- */
- if (n = ntohs(hp->arcount)) {
- while (--n >= 0 && cp < eom) {
- cp = res_skip_rr(cp, eom);
- if (cp == NULL) return(NULL);
- }
- }
-
- return(cp);
-}
-
-
-/*
- *******************************************************************************
- *
- * res_skip_rr --
- *
- * Skip over resource record fields.
- *
- * Results:
- * (address) - success operation.
- * NULL - a resource record had an incorrect format.
- *******************************************************************************
- */
-
-char *
-res_skip_rr(cp, eom)
- char *cp;
- char *eom;
-{
- int tmp;
- int dlen;
-
- if ((tmp = dn_skipname((u_char *)cp, (u_char *)eom)) == -1)
- return (NULL); /* compression error */
- cp += tmp;
- if ((cp + RRFIXEDSZ) > eom)
- return (NULL);
- cp += sizeof(u_short); /* type */
- cp += sizeof(u_short); /* class */
- cp += sizeof(u_long); /* ttl */
- dlen = _getshort(cp);
- cp += sizeof(u_short); /* dlen */
- cp += dlen;
- if (cp > eom)
- return (NULL);
- return (cp);
-}
diff --git a/usr.sbin/named/tools/nslookup/subr.c b/usr.sbin/named/tools/nslookup/subr.c
deleted file mode 100644
index b0f3759f7aa..00000000000
--- a/usr.sbin/named/tools/nslookup/subr.c
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * Copyright (c) 1985,1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)subr.c 5.24 (Berkeley) 3/2/91";*/
-static char rcsid[] = "$Id: subr.c,v 1.1 1995/10/18 08:47:56 deraadt Exp $";
-#endif /* not lint */
-
-/*
- *******************************************************************************
- *
- * subr.c --
- *
- * Miscellaneous subroutines for the name server
- * lookup program.
- *
- * Copyright (c) 1985
- * Andrew Cherenson
- * U.C. Berkeley
- * CS298-26 Fall 1985
- *
- *******************************************************************************
- */
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "res.h"
-
-
-
-/*
- *******************************************************************************
- *
- * IntrHandler --
- *
- * This routine is called whenever a control-C is typed.
- * It performs three main functions:
- * - closes an open socket connection,
- * - closes an open output file (used by LookupHost, et al.),
- * - jumps back to the main read-eval loop.
- *
- * If a user types a ^C in the middle of a routine that uses a socket,
- * the routine would not be able to close the socket. To prevent an
- * overflow of the process's open file table, the socket and output
- * file descriptors are closed by the interrupt handler.
- *
- * Side effects:
- * Open file descriptors are closed.
- * If filePtr is valid, it is closed.
- * Flow of control returns to the main() routine.
- *
- *******************************************************************************
- */
-
-void
-IntrHandler()
-{
- extern jmp_buf env;
-#if defined(BSD) && BSD >= 199006
- extern FILE *yyin; /* scanner input file */
- extern void yyrestart(); /* routine to restart scanner after interrupt */
-#endif
-
- SendRequest_close();
- ListHost_close();
- if (filePtr != NULL && filePtr != stdout) {
- fclose(filePtr);
- filePtr = NULL;
- }
- printf("\n");
-#if defined(BSD) && BSD >= 199006
- yyrestart(yyin);
-#endif
- longjmp(env, 1);
-}
-
-
-/*
- *******************************************************************************
- *
- * Malloc --
- * Calloc --
- *
- * Calls the malloc library routine with SIGINT blocked to prevent
- * corruption of malloc's data structures. We need to do this because
- * a control-C doesn't kill the program -- it causes a return to the
- * main command loop.
- *
- * NOTE: This method doesn't prevent the pointer returned by malloc
- * from getting lost, so it is possible to get "core leaks".
- *
- * If malloc fails, the program exits.
- *
- * Results:
- * (address) - address of new buffer.
- *
- *******************************************************************************
- */
-
-char *
-Malloc(size)
- int size;
-{
- char *ptr;
-
-#ifdef SYSV
-#ifdef SVR3
- sighold(SIGINT);
- ptr = malloc((unsigned) size);
- sigrelse(SIGINT);
-#else
- { int (*old)();
- old = signal(SIGINT, SIG_IGN);
- ptr = malloc((unsigned) size);
- signal(SIGINT, old);
- }
-#endif
-#else
- { int saveMask;
- saveMask = sigblock(sigmask(SIGINT));
- ptr = malloc((unsigned) size);
- (void) sigsetmask(saveMask);
- }
-#endif
- if (ptr == NULL) {
- fflush(stdout);
- fprintf(stderr, "*** Can't allocate memory\n");
- fflush(stderr);
- abort();
- /*NOTREACHED*/
- } else {
- return(ptr);
- }
-}
-
-char *
-Calloc(num, size)
- register int num, size;
-{
- char *ptr = Malloc(num*size);
- bzero(ptr, num*size);
- return(ptr);
-}
-
-
-/*
- *******************************************************************************
- *
- * PrintHostInfo --
- *
- * Prints out the HostInfo structure for a host.
- *
- *******************************************************************************
- */
-
-void
-PrintHostInfo(file, title, hp)
- FILE *file;
- char *title;
- register HostInfo *hp;
-{
- register char **cp;
- register ServerInfo **sp;
- char comma;
- int i;
-
- fprintf(file, "%-7s %s", title, hp->name);
-
- if (hp->addrList != NULL) {
- if (hp->addrList[1] != NULL) {
- fprintf(file, "\nAddresses:");
- } else {
- fprintf(file, "\nAddress:");
- }
- comma = ' ';
- i = 0;
- for (cp = hp->addrList; cp && *cp; cp++) {
- i++;
- if (i > 4) {
- fprintf(file, "\n\t");
- comma = ' ';
- i = 0;
- }
- fprintf(file,"%c %s", comma, inet_ntoa(*(struct in_addr *)*cp));
- comma = ',';
- }
- }
-
- if (hp->aliases != NULL) {
- fprintf(file, "\nAliases:");
- comma = ' ';
- i = 10;
- for (cp = hp->aliases; cp && *cp && **cp; cp++) {
- i += strlen(*cp) + 2;
- if (i > 75) {
- fprintf(file, "\n\t");
- comma = ' ';
- i = 10;
- }
- fprintf(file, "%c %s", comma, *cp);
- comma = ',';
- }
- }
-
- if (hp->servers != NULL) {
- fprintf(file, "\nServed by:\n");
- for (sp = hp->servers; *sp != NULL ; sp++) {
-
- fprintf(file, "- %s\n\t", (*sp)->name);
-
- comma = ' ';
- i = 0;
- for (cp = (*sp)->addrList; cp && *cp && **cp; cp++) {
- i++;
- if (i > 4) {
- fprintf(file, "\n\t");
- comma = ' ';
- i = 0;
- }
- fprintf(file,
- "%c %s", comma, inet_ntoa(*(struct in_addr *)*cp));
- comma = ',';
- }
- fprintf(file, "\n\t");
-
- comma = ' ';
- i = 10;
- for (cp = (*sp)->domains; cp && *cp && **cp; cp++) {
- i += strlen(*cp) + 2;
- if (i > 75) {
- fprintf(file, "\n\t");
- comma = ' ';
- i = 10;
- }
- fprintf(file, "%c %s", comma, *cp);
- comma = ',';
- }
- fprintf(file, "\n");
- }
- }
-
- fprintf(file, "\n\n");
-}
-
-/*
- *******************************************************************************
- *
- * OpenFile --
- *
- * Parses a command string for a file name and opens
- * the file.
- *
- * Results:
- * file pointer - the open was successful.
- * NULL - there was an error opening the file or
- * the input string was invalid.
- *
- *******************************************************************************
- */
-
-FILE *
-OpenFile(string, file)
- char *string;
- char *file;
-{
- char *redirect;
- FILE *tmpPtr;
-
- /*
- * Open an output file if we see '>' or >>'.
- * Check for overwrite (">") or concatenation (">>").
- */
-
- redirect = strchr(string, '>');
- if (redirect == NULL) {
- return(NULL);
- }
- if (redirect[1] == '>') {
- sscanf(redirect, ">> %s", file);
- tmpPtr = fopen(file, "a+");
- } else {
- sscanf(redirect, "> %s", file);
- tmpPtr = fopen(file, "w");
- }
-
- if (tmpPtr != NULL) {
- redirect[0] = '\0';
- }
-
- return(tmpPtr);
-}
-
-/*
- *******************************************************************************
- *
- * DecodeError --
- *
- * Converts an error code into a character string.
- *
- *******************************************************************************
- */
-
-char *
-DecodeError(result)
- int result;
-{
- switch (result) {
- case NOERROR: return("Success"); break;
- case FORMERR: return("Format error"); break;
- case SERVFAIL: return("Server failed"); break;
- case NXDOMAIN: return("Non-existent domain"); break;
- case NOTIMP: return("Not implemented"); break;
- case REFUSED: return("Query refused"); break;
- case NOCHANGE: return("No change"); break;
- case TIME_OUT: return("Timed out"); break;
- case NO_INFO: return("No information"); break;
- case ERROR: return("Unspecified error"); break;
- case NONAUTH: return("Non-authoritative answer"); break;
- case NO_RESPONSE: return("No response from server"); break;
- default: break;
- }
- return("BAD ERROR VALUE");
-}
-
-
-int
-StringToClass(class, dflt)
- char *class;
- int dflt;
-{
- if (strcasecmp(class, "IN") == 0)
- return(C_IN);
- if (strcasecmp(class, "HESIOD") == 0 ||
- strcasecmp(class, "HS") == 0)
- return(C_HS);
- if (strcasecmp(class, "CHAOS") == 0)
- return(C_CHAOS);
- if (strcasecmp(class, "ANY") == 0)
- return(C_ANY);
- fprintf(stderr, "unknown query class: %s\n", class);
- return(dflt);
-}
-
-
-/*
- *******************************************************************************
- *
- * StringToType --
- *
- * Converts a string form of a query type name to its
- * corresponding integer value.
- *
- *******************************************************************************
- */
-
-int
-StringToType(type, dflt)
- char *type;
- int dflt;
-{
- if (strcasecmp(type, "A") == 0)
- return(T_A);
- if (strcasecmp(type, "NS") == 0)
- return(T_NS); /* authoritative server */
- if (strcasecmp(type, "MX") == 0)
- return(T_MX); /* mail exchanger */
- if (strcasecmp(type, "CNAME") == 0)
- return(T_CNAME); /* canonical name */
- if (strcasecmp(type, "SOA") == 0)
- return(T_SOA); /* start of authority zone */
- if (strcasecmp(type, "MB") == 0)
- return(T_MB); /* mailbox domain name */
- if (strcasecmp(type, "MG") == 0)
- return(T_MG); /* mail group member */
- if (strcasecmp(type, "MR") == 0)
- return(T_MR); /* mail rename name */
- if (strcasecmp(type, "WKS") == 0)
- return(T_WKS); /* well known service */
- if (strcasecmp(type, "PTR") == 0)
- return(T_PTR); /* domain name pointer */
- if (strcasecmp(type, "HINFO") == 0)
- return(T_HINFO); /* host information */
- if (strcasecmp(type, "MINFO") == 0)
- return(T_MINFO); /* mailbox information */
- if (strcasecmp(type, "AXFR") == 0)
- return(T_AXFR); /* zone transfer */
- if (strcasecmp(type, "MAILA") == 0)
- return(T_MAILA); /* mail agent */
- if (strcasecmp(type, "MAILB") == 0)
- return(T_MAILB); /* mail box */
- if (strcasecmp(type, "ANY") == 0)
- return(T_ANY); /* matches any type */
- if (strcasecmp(type, "UINFO") == 0)
- return(T_UINFO); /* user info */
- if (strcasecmp(type, "UID") == 0)
- return(T_UID); /* user id */
- if (strcasecmp(type, "GID") == 0)
- return(T_GID); /* group id */
- if (strcasecmp(type, "TXT") == 0)
- return(T_TXT); /* text */
- fprintf(stderr, "unknown query type: %s\n", type);
- return(dflt);
-}
-
-/*
- *******************************************************************************
- *
- * DecodeType --
- *
- * Converts a query type to a descriptive name.
- * (A more verbose form of p_type.)
- *
- *
- *******************************************************************************
- */
-
-static char nbuf[20];
-
-char *
-DecodeType(type)
- int type;
-{
- switch (type) {
- case T_A:
- return("address");
- case T_NS:
- return("name server");
- case T_CNAME:
- return("canonical name");
- case T_SOA:
- return("start of authority");
- case T_MB:
- return("mailbox");
- case T_MG:
- return("mail group member");
- case T_MR:
- return("mail rename");
- case T_NULL:
- return("null");
- case T_WKS:
- return("well-known service");
- case T_PTR:
- return("domain name pointer");
- case T_HINFO:
- return("host information");
- case T_MINFO:
- return("mailbox information");
- case T_MX:
- return("mail exchanger");
- case T_TXT:
- return("text");
- case T_UINFO:
- return("user information");
- case T_UID:
- return("user ID");
- case T_GID:
- return("group ID");
- case T_AXFR:
- return("zone transfer");
- case T_MAILB:
- return("mailbox-related data");
- case T_MAILA:
- return("mail agent");
- case T_ANY:
- return("\"any\"");
- default:
- (void) sprintf(nbuf, "%d", type);
- return (nbuf);
- }
-}
diff --git a/usr.sbin/named/tools/nsquery/Makefile b/usr.sbin/named/tools/nsquery/Makefile
deleted file mode 100644
index a0cb559106a..00000000000
--- a/usr.sbin/named/tools/nsquery/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# from: @(#)Makefile 5.1 (Berkeley) 5/28/90
-# $Id: Makefile,v 1.1 1995/10/18 08:47:56 deraadt Exp $
-
-PROG= nsquery
-NOMAN= noman
-
-.include "../../../Makefile.inc"
-.include <bsd.prog.mk>
diff --git a/usr.sbin/named/tools/nsquery/nsquery.c b/usr.sbin/named/tools/nsquery/nsquery.c
deleted file mode 100644
index a40a0fe7429..00000000000
--- a/usr.sbin/named/tools/nsquery/nsquery.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 1986 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1986 Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)nsquery.c 4.8 (Berkeley) 6/1/90";*/
-static char rcsid[] = "$Id: nsquery.c,v 1.1 1995/10/18 08:47:56 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <arpa/nameser.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <resolv.h>
-#include <stdio.h>
-
-main(argc, argv)
- int argc;
- char **argv;
-{
- register struct hostent *hp;
- register char *s;
-
- if (argc >= 2 && strcmp(argv[1], "-d") == 0) {
- _res.options |= RES_DEBUG;
- argc--;
- argv++;
- }
- if (argc < 2) {
- fprintf(stderr, "usage: nsquery [-d] host [server]\n");
- exit(1);
- }
- if (argc == 3) {
- hp = gethostbyname(argv[2]);
- if (hp == NULL) {
- fprintf(stderr, "nsquery:");
- herror(argv[2]);
- exit(1);
- }
- printf("\nServer:\n");
- printanswer(hp);
- _res.nsaddr.sin_addr = *(struct in_addr *)hp->h_addr;
- }
-
- hp = gethostbyname(argv[1]);
- if (hp == NULL) {
- fprintf(stderr, "nsquery: %s: ", argv[1]);
- herror((char *)NULL);
- exit(1);
- }
- printanswer(hp);
- exit(0);
-}
-
-printanswer(hp)
- register struct hostent *hp;
-{
- register char **cp;
- extern char *inet_ntoa();
-
- printf("Name: %s\n", hp->h_name);
-#if BSD >= 43 || defined(h_addr)
- printf("Addresses:");
- for (cp = hp->h_addr_list; cp && *cp; cp++)
- printf(" %s", inet_ntoa(*(struct in_addr *)(*cp)));
- printf("\n");
-#else
- printf("Address: %s\n", inet_ntoa(*(struct in_addr *)hp->h_addr));
-#endif
- printf("Aliases:");
- for (cp = hp->h_aliases; cp && *cp && **cp; cp++)
- printf(" %s", *cp);
- printf("\n\n");
-}
diff --git a/usr.sbin/named/tools/nstest/Makefile b/usr.sbin/named/tools/nstest/Makefile
deleted file mode 100644
index 033b534565d..00000000000
--- a/usr.sbin/named/tools/nstest/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# from: @(#)Makefile 5.1 (Berkeley) 5/28/90
-# $Id: Makefile,v 1.1 1995/10/18 08:47:56 deraadt Exp $
-
-PROG= nstest
-NOMAN= noman
-
-.include "../../../Makefile.inc"
-.include <bsd.prog.mk>
diff --git a/usr.sbin/named/tools/nstest/nstest.c b/usr.sbin/named/tools/nstest/nstest.c
deleted file mode 100644
index 84c32a899d0..00000000000
--- a/usr.sbin/named/tools/nstest/nstest.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * Copyright (c) 1986, 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1986 Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)nstest.c 4.15 (Berkeley) 3/21/91";*/
-static char rcsid[] = "$Id: nstest.c,v 1.1 1995/10/18 08:47:56 deraadt Exp $";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-extern char *inet_ntoa();
-char *progname;
-FILE *log;
-#define MAXDATA 256 /* really should get definition from named/db.h */
-main(argc, argv)
- char **argv;
-{
- register char *cp;
- struct hostent *hp;
- u_short port = htons(NAMESERVER_PORT);
- char buf[BUFSIZ];
- char packet[PACKETSZ];
- char answer[PACKETSZ];
- struct rrec NewRR;
- char OldRRData[MAXDATA];
- int n, dump_packet;
-
- NewRR.r_data = (char *) malloc(MAXDATA);
- NewRR.r_data = (char *) malloc(MAXDATA);
- progname = argv[0];
- dump_packet = 0;
- _res.options |= RES_DEBUG|RES_RECURSE;
- (void) res_init();
- while (argc > 1 && argv[1][0] == '-') {
- argc--;
- cp = *++argv;
- while (*++cp)
- switch (*cp) {
- case 'p':
- if (--argc <= 0)
- usage();
- port = htons(atoi(*++argv));
- break;
-
- case 'i':
- _res.options |= RES_IGNTC;
- break;
-
- case 'v':
- _res.options |= RES_USEVC|RES_STAYOPEN;
- break;
-
- case 'r':
- _res.options &= ~RES_RECURSE;
- break;
-
- case 'd':
- dump_packet++;
- break;
-
- default:
- usage();
- }
- }
- _res.nsaddr.sin_family = AF_INET;
- _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
- _res.nsaddr.sin_port = port;
- if (argc > 1) {
- _res.nsaddr.sin_addr.s_addr = inet_addr(argv[1]);
- if (_res.nsaddr.sin_addr.s_addr == (u_long) -1)
- usage();
- }
- if (argc > 2) {
- log = fopen(argv[2],"w");
- if (log == NULL) perror(argv[2]);
- }
- for (;;) {
- printf("> ");
- fflush(stdout);
- if ((cp = (char *)gets(buf)) == NULL)
- break;
- switch (*cp++) {
- case 'a':
- n = res_mkquery(QUERY, cp, C_IN, T_A, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'A':
- n = ntohl(inet_addr(cp));
- putlong((u_long)n, (u_char *)cp);
- n = res_mkquery(IQUERY, "", C_IN, T_A, cp, sizeof(long),
- NULL, packet, sizeof(packet));
- break;
-
- case 'f':
- n = res_mkquery(QUERY, cp, C_ANY, T_UINFO, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'g':
- n = res_mkquery(QUERY, cp, C_ANY, T_GID, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'G':
- *(int *)cp = htonl(atoi(cp));
- n = res_mkquery(IQUERY, "", C_ANY, T_GID, cp,
- sizeof(int), NULL, packet, sizeof(packet));
- break;
-
- case 'c':
- n = res_mkquery(QUERY, cp, C_IN, T_CNAME, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'h':
- n = res_mkquery(QUERY, cp, C_IN, T_HINFO, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'm':
- n = res_mkquery(QUERY, cp, C_IN, T_MX, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'M':
- n = res_mkquery(QUERY, cp, C_IN, T_MAILB, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'n':
- n = res_mkquery(QUERY, cp, C_IN, T_NS, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'p':
- n = res_mkquery(QUERY, cp, C_IN, T_PTR, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 's':
- n = res_mkquery(QUERY, cp, C_IN, T_SOA, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'T':
- n = res_mkquery(QUERY, cp, C_IN, T_TXT, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'u':
- n = res_mkquery(QUERY, cp, C_ANY, T_UID, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'U':
- *(int *)cp = htonl(atoi(cp));
- n = res_mkquery(IQUERY, "", C_ANY, T_UID, cp,
- sizeof(int), NULL, packet, sizeof(packet));
- break;
-
- case 'x':
- n = res_mkquery(QUERY, cp, C_IN, T_AXFR, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'w':
- n = res_mkquery(QUERY, cp, C_IN, T_WKS, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'b':
- n = res_mkquery(QUERY, cp, C_IN, T_MB, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'B':
- n = res_mkquery(QUERY, cp, C_IN, T_MG, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'i':
- n = res_mkquery(QUERY, cp, C_IN, T_MINFO, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case 'r':
- n = res_mkquery(QUERY, cp, C_IN, T_MR, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
- case '*':
- n = res_mkquery(QUERY, cp, C_IN, T_ANY, (char *)0, 0,
- NULL, packet, sizeof(packet));
- break;
-
-#ifdef ALLOW_UPDATES
- case '^':
- {
- char IType[10], TempStr[50];
- int Type, oldnbytes, nbytes, i;
-#ifdef ALLOW_T_UNSPEC
- printf("Data type (a = T_A, u = T_UNSPEC): ");
- gets(IType);
- if (IType[0] == 'u') {
- Type = T_UNSPEC;
- printf("How many data bytes? ");
- gets(TempStr); /* Throw away CR */
- sscanf(TempStr, "%d", &nbytes);
- for (i = 0; i < nbytes; i++) {
- (NewRR.r_data)[i] = (char) i;
- }
- } else {
-#endif ALLOW_T_UNSPEC
- Type = T_A;
- nbytes = sizeof(u_long);
- printf("Inet addr for new dname (e.g., 192.4.3.2): ");
- gets(TempStr);
- putlong(ntohl(inet_addr(TempStr)),
- NewRR.r_data);
-#ifdef ALLOW_T_UNSPEC
- }
-#endif ALLOW_T_UNSPEC
- NewRR.r_class = C_IN;
- NewRR.r_type = Type;
- NewRR.r_size = nbytes;
- NewRR.r_ttl = 99999999;
- printf("Add, modify, or modify all (a/m/M)? ");
- gets(TempStr);
- if (TempStr[0] == 'a') {
- n = res_mkquery(UPDATEA, cp, C_IN, Type,
- OldRRData, nbytes,
- &NewRR, packet,
- sizeof(packet));
- } else {
- if (TempStr[0] == 'm') {
- printf("How many data bytes in old RR? ");
- gets(TempStr); /* Throw away CR */
- sscanf(TempStr, "%d", &oldnbytes);
- for (i = 0; i < oldnbytes; i++) {
- OldRRData[i] = (char) i;
- }
- n = res_mkquery(UPDATEM, cp, C_IN, Type,
- OldRRData, oldnbytes,
- &NewRR, packet,
- sizeof(packet));
- } else { /* Modify all */
- n = res_mkquery(UPDATEMA, cp,
- C_IN, Type, NULL, 0,
- &NewRR, packet,
- sizeof(packet));
-
- }
- }
- }
- break;
-
-#ifdef ALLOW_T_UNSPEC
- case 'D':
- n = res_mkquery(UPDATEDA, cp, C_IN, T_UNSPEC, (char *)0,
- 0, NULL, packet, sizeof(packet));
- break;
-
- case 'd':
- {
- char TempStr[100];
- int nbytes, i;
- printf("How many data bytes in oldrr data? ");
- gets(TempStr); /* Throw away CR */
- sscanf(TempStr, "%d", &nbytes);
- for (i = 0; i < nbytes; i++) {
- OldRRData[i] = (char) i;
- }
- n = res_mkquery(UPDATED, cp, C_IN, T_UNSPEC,
- OldRRData, nbytes, NULL, packet,
- sizeof(packet));
- }
- break;
-#endif ALLOW_T_UNSPEC
-#endif ALLOW_UPDATES
-
- default:
- printf("a{host} - query T_A\n");
- printf("A{addr} - iquery T_A\n");
- printf("b{user} - query T_MB\n");
- printf("B{user} - query T_MG\n");
- printf("f{host} - query T_UINFO\n");
- printf("g{host} - query T_GID\n");
- printf("G{gid} - iquery T_GID\n");
- printf("h{host} - query T_HINFO\n");
- printf("i{host} - query T_MINFO\n");
- printf("p{host} - query T_PTR\n");
- printf("m{host} - query T_MX\n");
- printf("M{host} - query T_MAILB\n");
- printf("n{host} - query T_NS\n");
- printf("r{host} - query T_MR\n");
- printf("s{host} - query T_SOA\n");
- printf("T{host} - query T_TXT\n");
- printf("u{host} - query T_UID\n");
- printf("U{uid} - iquery T_UID\n");
- printf("x{host} - query T_AXFR\n");
- printf("w{host} - query T_WKS\n");
- printf("c{host} - query T_CNAME\n");
- printf("*{host} - query T_ANY\n");
-#ifdef ALLOW_UPDATES
- printf("^{host} - add/mod/moda (T_A/T_UNSPEC)\n");
-#ifdef ALLOW_T_UNSPEC
- printf("D{host} - deletea T_UNSPEC\n");
- printf("d{host} - delete T_UNSPEC\n");
-#endif ALLOW_T_UNSPEC
-#endif ALLOW_UPDATES
- continue;
- }
- if (n < 0) {
- printf("res_mkquery: buffer too small\n");
- continue;
- }
- if (log) {
- fprintf(log,"SEND QUERY\n");
- fp_query(packet, log);
- }
- n = res_send(packet, n, answer, sizeof(answer));
- if (n < 0) {
- printf("res_send: send error\n");
- if (log) fprintf(log, "res_send: send error\n");
- }
- else {
- if (dump_packet) {
- int f;
- f = creat("ns_packet.dump", 0644);
- write(f, answer, n);
- (void) close(f);
- }
- if (log) {
- fprintf(log, "GOT ANSWER\n");
- fp_query(answer, log);
- }
- }
- }
-}
-
-usage()
-{
- fprintf(stderr, "Usage: %s [-v] [-i] [-r] [-d] [-p port] hostaddr\n",
- progname);
- exit(1);
-}