1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-25 16:13:17 +00:00

Old files moved/replaced/obsoleted by bind-8

This commit is contained in:
Peter Wemm 1998-05-03 04:44:20 +00:00
parent ccee498fca
commit 2cc7b06671
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=35633
108 changed files with 0 additions and 45044 deletions

View File

@ -1,412 +0,0 @@
OPTIONS
Original: Paul Vixie, 28Mar92
Revised: $Id: OPTIONS,v 8.6 1996/05/21 07:32:31 vixie Exp $
Options available in this version of BIND are controlled by conf/options.h,
rather than by $(DEFS) in the Makefile. The options are:
DEBUG (origin: U C Berkeley)
enables the -d command line option, and allows SIGUSR1 to increment
and SIGUSR2 to clear the internal variable "debug", which in turn controls
hundreds of fprintf()'s out to /usr/tmp/named.run.
you probably want this. it makes the binary bigger but not slower (or
at least not much slower), but SIGUSR[12] are the only way you'll track down
misconfigured name servers that hose you down with billions of bogus requests.
you may need this, it is on by default.
ALLOW_T_UNSPEC (origin: MIT Project Athena)
enables the "unspec" RR type for ancient Athena software that does not
know about TXT RR's.
you probably do not care about this, it is off by default.
ALLOW_UPDATES (origin: Mike Schwartz, University of Washington)
enables "dynamic updates", described in "doc/DynamicUpdate". this lets
you update named's in-memory database on the fly if you have the right client.
there is absolutely no security around this; if you enable it, anyone who can
reach your server can update your database.
this code doesn't compile any more and will be removed shortly.
INVQ (origin: U C Berkeley, with #ifdef's by Paul Vixie)
enables "inverse queries", which in all of the internet only one
client ever uses: ancient nslookup. if you build named with INVQ defined,
you get the time-honored behaviour of supporting this whole class of queries
for no real purpose other than to waste a few hundred kilobytes of your
memory and about 3% of named's total CPU time. if you build with INVQ
undefined, old nslookups will not be able to reach your server in their
startup phase, and you will have to use the "server" command after it fails
over to some other server, or use "nslookup - 0" to get in from the shell.
if you need to support old nslookups try "options fake-iquery"
instead of enabling this option.
you probably do not want this.
DSTORAGE (origin: U C Berkeley, with #ifdef's by Paul Vixie)
enables a malloc-debugger that checks for overruns on both ends of
each allocated block of memory. used when debugging since C has no bounds
or type checking.
you probably do not want this, it is off by default.
DMALLOC (origin: Paul Vixie of Digital)
enables a malloc-debugger that traces all allocated blocks of memory
such that SIGIOT's output (see STATS option) includes a list of all mallocs
in the program, how many times each has been called, how many blocks of memory
allocated by that malloc are not yet free, and how many bytes they use up.
under each one will be a list of each free/realloc that has deallocated a block
of that malloc's memory, and how many times it has done so.
this is extremely helpful for finding memory leaks. as such, you
probably do not want this unless you are debugging named.
you probably do not need this, it is off by default.
XFRNETS (origin: Paul Vixie of Digital)
enables the "xfrnets" command in named.boot. this has the same
syntax as "forwarders" and "sortlist" -- that is, a list of dotted quads.
each one is a network (16.0.0.0 and 130.180.0.0 are examples) or a host.
if you put any xfrnets commands into your named.boot, then zone transfers
will only be honored if they come from inside one of the specified
networks. this is very useful if you want to keep people outside from
being able to trivially map your entire network, but it doesn't stop them
from iterating so it's more annoying than secure.
this feature was once called "tcplist" out of ignorance on my part,
but with advice from phil almquist i decided to rename it "xfrnets" and make
it only control zone transfers -- previously it controlled all TCP connections
which made certain TCP-only resolvers unable to use our servers. the "tcplist"
syntax still works; it is a synonym for "xfrnets".
it is also nice if you want to keep the outside world from making your
nameserver fork and swap trying to do unauthorized zone transfers. if you have
large zone files or use BIND for TXT records you will find this useful.
you probably want this, it is on by default.
PID_FIX (origin: Don Lewis of Harris)
tells named that if it starts up but can't keep going because another
nameserver is already running (and sitting on the server port), it should
put the /etc/named.pid (/var/run/named.pid) file back the way it found it.
you probably want this, it is on by default.
FWD_LOOP (origin: Don Lewis of Harris)
tells named that if you list any of your own IP addresses in a
"forwarders" command in your named.boot file, you should be scolded.
you probably want this, it is on by default.
NO_GLUE (origin: Don Lewis of Harris, and Andrew Partan of UUNET)
tells named-xfer that incoming zone transfers should be checked
for "glue" that comes from a zone outside the zone being transfered, and
comment this garbage out in the zone file so that when named reads in the
zone file after named-xfer exits, the garbage will not be entered into the
memory-resident database.
also tells named that when it is performing an outgoing zone
transfer, it should not send any of these "glue" records.
you definitely want this, it is on by default.
BOGUSNS (origin: Piet Beertema of EUNet)
enables the "bogusns" command in named.boot. this has the same
syntax as forwarders and sortlist. any NS RR's that come in whose addresses
are on the list of "bogusns" addresses will be ignored. this is the last
resort when someone is bogusly advertising themselves as a root server.
just in case, though you won't use it often.
you probably want this, it is on by default.
QRYLOG (origin: Bryan Beecher of UMich)
enables "query logging", such that SIGWINCH toggles tracing of all
incoming queries. the trace is sent to syslog, and is huge, but when you
need this you will need it bad and it does not slow named down or make it
larger.
If you define QRYLOG you may also start up named in query logging
mode by using the -q flag. If you do so you will probably want to analyze
the logs produced, the dnsstats and lamers scrips (in the contrib/umich
and contrib/lamers directories) will do it for you.
you probably want this, it is on by default.
LOGFAC (origin: various people)
If you start up named with the -q flag you will be logging
large amounts of data, and probably will not want them logged to the
default logging facility, which is LOG_DAEMON. You will want to
redefine LOGFAC, presumably to LOC_LOCALn (0 <= n <= 7). Remember to
modify /etc/syslog.conf appropriately.
This only works on a system with a modern syslogd.
as such, it is on by default.
YPKLUDGE (origin: Piet Beertema of EUNet)
certain versions of NIS/YP are capable of using the DNS for names
that cannot be found in the YP servers. of these, certain versions can't
tell the difference between a dotted quad and a domain name, and they send
queries to the DNS for dotted quads as if they were domain names. if your
named does not do anything special with these queries, they will end up
getting forwarded to other servers, effectively hosing all of you down with
endless useless network traffic. YPKLUDGE enables some checking in named
that lets it catch these bogus queries and send back immediate errors.
If you run "ypserv -i" you definitely want this, as a malconfigured
NIS server can cause DNS "flood" queries otherwise. Trust me.
this is off by default.
TRACEROOT (origin: pma@cnd.hp.com and Bryan Beecher of UMich)
enables some checking in named for bogus root nameservers. This
code has been in use at U-M for years, so it is pretty well tested, plus we
have never been burned by the "bogus root NS scares" that have plagued the
DNS off and on.
this feature people will very much want to use, it is on by default.
LOCALDOM (origin: Berkeley)
if set, the "domain" directive is recognized in the named.boot file.
this causes us to retry queries with the specified domain appended to the
name if the first lookup fails. this is a very bad idea since a given name
server will often be used by clients in more than one domain -- a name server
should _not_ make any presumptions as to the "home domain" of a requestor.
you almost certainly do not want this, it is off by default.
SLAVE_FORWARD (origin: pma@sdd.hp.com)
if set, "slave" servers behave in an arguably more-correct way. this
is an experimental addition to BIND 4.9 that causes slaves to time out queries
in 60/N seconds where N is the number of forwarders defined. previously a
query would time out almost immediately, which caused a lot of unnecessary
network traffic.
you probably want this, it is on by default.
FORCED_RELOAD (origin: pma@sdd.hp.com)
if set, then when a HUP signal is received, all secondary zones are
scheduled for serial-number comparison with the primaries. this has the effect
that if you HUP your server, it will refresh any zones which have changed,
even if those zones' refresh times have not been reached.
you probably want this, it is on by default.
WANT_PIDFILE (origin: berkeley, parameterized by arc@sgi)
if set, a file called named.pid will be created in /etc or /var/run
when the name server has started. this file can be used to send signals to
BIND, as in "kill -HUP `cat /etc/named.pid`".
unless you are only on an SGI (where killall(1M) makes the pid file
unnecessary);
you probably want this, it is on by default.
DOTTED_SERIAL (origin: berkeley; parameterized by vixie)
if set, allows a somewhat arcane n.m syntax in the serial number
field of an SOA. this is officially deprecated for 4.9; you should use
straight integer values and find an encoding that does not depend on
scaled-integer pseudodecimals. i suggest YYYYMMDDnn where YYYY is the
four-digit year, MM is the two-digit month, DD is the two-digit day-of-month,
and nn is a daily version number in case you change your serial number more
than once in a day. this encoding will overflow in the year 4294 gregorian.
you almost certainly do not want this, but if you have old zone files
lying around and you don't want to think your way through converting their
serial numbers, this deprecated behaviour is available.
graciously, it is on by default.
SENSIBLE_DOTS (origin: kagotani@cs.titech.ac.jp; parameterized by vixie)
if set, changes the semantics of an "n.m" serial number from
n*10^(3+int(0.9+log10(m))) + m
to
n*10000+m
if you are using DOTTED_SERIAL in spite of its deprecated status,
and you are interested in a more predictable and sensible interpretation of
dotted numbers, then you probably want this.
it is off by default.
VALIDATE (origin: USC/ISI)
enables a validation procedure to provide some security in an
otherwise insecure environment. Any RRs are accepted from a server only if
the server is authoritative over that domain. We consider a server
authoritative (for validation purposes) for even the sub-domains that it has
delegated to others. RRs are validated against the data we have in cache
already. Invalid records are neither cached nor returned.
it is off by default because it is hopeless, and the code will all
be ripped out of BIND in the near future.
NCACHE (origin: USC/ISI)
enables negative caching. We cache only authoritative NXDOMAIN or
authoritative NOERROR with zero RR count. Non-authoritative NXDOMAIN answers
now contain NS records in the authority section. Non-authoritative NOERROR
responses have no authority or additional records to differentiate them from
referrals. They are cached for NTTL secs (currently 10 minutes) and are timed
out when the ttl expires.
you probably want this, it is on by default.
RESOLVSORT (origin: marka@syd.dms.csiro.au)
enable sorting of addresses returned by gethostbyname. Sorting order
is specified by address/netmask pairs. This enables a host to override the
sortlist specified in the nameserver.
you probably want this, it is on by default.
STUBS (origin: marka@syd.dms.csiro.au)
enable transfer and loading of NS records only for a zone.
still experimental. it won't hurt to enable it, but it may not work perfectly
so using it could lead to some confusion.
you probably don't care, it is on by default.
SUNSECURITY (origin: rossc@ucc.su.oz.au)
enable checking of PTR records in gethostbyaddr() to detect
spoofing. Forced on SunOS 4 shared library as rlogin etc. depend on this.
you should probably not set this by hand.
SECURE_ZONES (origin: gshapiro@guest.wpi.edu)
enables support for secure zones. This restricts access to
information in the zone according to the information found in the
secure_zone TXT RR found in the zone. If none is found, the zone is
world-readable. For information on the format of the secure_zone TXT
RR, see the Name Server Operations Guide for BIND.
you probably want this, it is on by default.
ROUND_ROBIN (origin: Marshall Rose of TPC.INT)
if set, causes the databuf list in a namebuf to be rotated by one
slot after each access to it. this has the effect that if multiple RR's
of a given type are present, they will be given in "round robin" order
instead of always being given in the same order.
you probably want this, it is on by default.
ADDAUTH (origin: marka@syd.dms.csiro.au)
if set, cause NS and glue A records to be returned with authoritative
answers. this causes slightly larger replies but less DNS traffic overall.
unless you have Mac's with an older version of Mac/TCP;
you probably want this, it is on by default.
RFC1535 (origin: paul@vix.com)
if set, the resolver's default "search" list will be just the entire
"domain" name rather than the sliding window it had before 4.9.2. this will
make the default search list shorter, so folks who are saying "domain a.b.c"
and relying on the implicit "search a.b.c a.b c" will miss "a.b" and "c".
this option is on for compatibility with RFC 1535.
you should NOT turn it off, it is on by default.
GEN_AXFR (origin: mark@comp.vuw.ac.nz, tytso@ATHENA.MIT.EDU, gdmr@dcs.ed.ac.uk)
if set, allows specification of zones in classes other than "IN" in
the named.boot file. Allows an optional "/class" on the "primary" and
"secondary" directives. Also fixes zone transfers so only data in the class
requested is transfered.
you probably want this, it is on by default.
DATUMREFCNT (origin: mark andrews)
you want this. it will not be optional in future releases.
LAME_DELEGATION (origin: don lewis; reworked by bryan beecher and don lewis)
this will detect the condition where some other server has told you
that a given set of servers is authoritative for some domain, and at least
one of those "delegated" servers disagrees (i.e., answers non-authoritatively).
you probably want this, it is on by default.
LAME_LOGGING (origin: don lewis)
enable logging of lame delegations and set the log level
you may want this, it is on by default.
RETURNSOA (origin: mark andrews)
This allows negative caching to work. Without this, older
pre-4.9.3 nameservers will not accept -ve cached anwsers. We actually
store the SOA record from the authority section rather that what was
requested because it is the existence of the NXDOMAIN that matters not
the type of data. The zone of the SOA record is tagged to the end of
the SOA record to allow it to be reconstructed.
You probably DO NOT WANT THIS, it's experimental and dangerous.
it is off by default.
CLEANCACHE (origin: mark andrews)
Bind consumes memory without bound without this option. This
patch allows bind to periodically remove any stale entries in the
cache. Bind's memory usage should stabilize after approximately 1 day of
operation, as most TTL's are <= 1 day. Without this option stale entries
are only removed when they are looked up.
You probably want this, it is on by default.
PURGE_ZONE (origin: mark andrews)
Various junk below a zone tends to hang around and corrupt future
zone data if a zone grows deeper. PURGE_ZONE will remove all traces of or
data which could be part of zone before loading a new one.
You probably want this, it is on by default.
STATS (origin: Paul Vixie)
Named's internal statistics can take a fair amount of memory and
if you aren't interested in looking at these numbers you should disable
the feature. Future versions may require this.
You probably want this, it is on by default.
RENICE (origin: bp@deins.informatik.uni-dortmund.de)
if set, the process priority of the AXFR subprocesses is changed to
"normal". If you are planning to raise the priority of the main nameserver
process, you will use this.
You probably want this, it is on by default.
GETSER_LOGGING (origin: Paul Vixie)
if set, errors that occur during the fetch of serial numbers for zone
transfer consideration will be syslog()'d. this can lead to a lot of logging,
but is very helpful if you don't know why a zone isn't transfering.
You may not want this, but it is on by default.
SHORT_FNAMES (origin: pma@sdd.hp.com)
on systems whose file names can only be 14 characters long, the temp
files created by named-xfer need to be constructed somewhat differently. this
should probably become the default since it is harmless.
you probably don't care one way or the other, it is off by default.
XSTATS (origin: Benoit.Grange@inria.fr)
if set, the name server keeps more STATS about requests
received, and logs to syslog total counters from time to time. If you
aren't interested in looking at these numbers you should not enable
the feature. Requires STATS.
You may want this, but it is off by default.
BIND_NOTIFY (origin: paul@vix.com)
experimental at this time; an internet draft is circulating. this
option informs slaves ("secondary" servers in BIND's erroneous terminology)
instantly when the master (primary, or another slave) loads a new zone. it
works fine and seems to cause no problems with slaves that don't support it,
but it does not implement the current internet draft (it lacks some necessary
delays) and causes a lot of extra syslog traffic, especially at startup. if
you don't mind running code that will absolutely NOT be compatible with the
eventual standard when the RFC is released, go ahead and turn this on.
vendors should not enable this in versions shipped to customers.
You will want this when it becomes compliant, it is off by default.
LOC_RR (origin: ckd@kei.com)
incorporates support for the (RFC 1876) LOC RR type.
You may want this, it is on by default.
SORT_RESPONSE (legacy)
should responses be sorted in what the server considers an optimal
order for the client? this is on by default but it does very little good.
## ++Copyright++ 1989
## -
## 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.
## -
## Portions Copyright (c) 1993 by Digital Equipment Corporation.
##
## Permission to use, copy, modify, and distribute this software for any
## purpose with or without fee is hereby granted, provided that the above
## copyright notice and this permission notice appear in all copies, and that
## the name of Digital Equipment Corporation not be used in advertising or
## publicity pertaining to distribution of the document or software without
## specific, written prior permission.
##
## THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
## WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
## OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
## CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
## DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
## -
## --Copyright--

View File

@ -1,251 +0,0 @@
#! /bin/sh
## (From INN-1.4, written by Rich Salz)
## $Revision: 8.1 $
## A script to install files and directories.
PROGNAME=`basename $0`
## Paths to programs. CHOWN and WHOAMI are checked below.
CHOWN=chown
CHGRP=chgrp
CHMOD=chmod
CP=cp
LN=ln
MKDIR=mkdir
MV=mv
RM=rm
STRIP=strip
WHOAMI=whoami
## Some systems don't support -x, so we have to use -f.
if [ ${CHOWN} = chown ] ; then
if [ -f /etc/chown ] ; then
CHOWN=/etc/chown
else
if [ -f /usr/etc/chown ] ; then
CHOWN=/usr/etc/chown
fi
fi
fi
if [ ${WHOAMI} = whoami ] ; then
if [ -f /usr/ucb/whoami ] ; then
WHOAMI=/usr/ucb/whoami
fi
fi
## Defaults.
CHOWNIT=false
CHGROUPIT=false
CHMODIT=false
STRIPIT=false
BACKIT=false
TOUCHIT=true
SAVESRC=false
ROOT=unknown
## Process JCL.
MORETODO=true
while ${MORETODO} ; do
case X"$1" in
X-b)
BACKIT=true
BACKUP="$2"
shift
;;
X-b*)
BACKIT=true
BACKUP=`expr "$1" : '-b\(.*\)'`
;;
X-c)
SAVESRC=true
;;
X-g)
GROUP="$2"
CHGROUPIT=true
shift
;;
X-g*)
GROUP=`expr "$1" : '-g\(.*\)'`
CHGROUPIT=true
;;
X-G)
case ${ROOT} in
unknown)
case `${WHOAMI}` in
root)
ROOT=true
;;
*)
ROOT=false
;;
esac
;;
esac
GROUP="$2"
shift
${ROOT} && CHGROUPIT=true
;;
X-G*)
case ${ROOT} in
unknown)
case `${WHOAMI}` in
root)
ROOT=true
;;
*)
ROOT=false
;;
esac
;;
esac
if ${ROOT} ; then
GROUP=`expr "$1" : '-g\(.*\)'`
CHGROUPIT=true
fi
;;
X-m)
MODE="$2"
CHMODIT=true
shift
;;
X-m*)
MODE=`expr "$1" : '-m\(.*\)'`
CHMODIT=true
;;
X-n)
TOUCHIT=false
;;
X-o)
OWNER="$2"
CHOWNIT=true
shift
;;
X-o*)
OWNER=`expr "$1" : '-o\(.*\)'`
CHOWNIT=true
;;
X-O)
case ${ROOT} in
unknown)
case `${WHOAMI}` in
root)
ROOT=true
;;
*)
ROOT=false
;;
esac
;;
esac
OWNER="$2"
shift
${ROOT} && CHOWNIT=true
;;
X-O*)
case ${ROOT} in
unknown)
case `${WHOAMI}` in
root)
ROOT=true
;;
*)
ROOT=false
;;
esac
;;
esac
if ${ROOT} ; then
OWNER=`expr "$1" : '-o\(.*\)'`
CHOWNIT=true
fi
;;
X-s)
STRIPIT=true
;;
X--)
shift
MORETODO=false
;;
X-*)
echo "${PROGNAME}: Unknown flag $1" 1>&2
exit 1
;;
*)
MORETODO=false
;;
esac
${MORETODO} && shift
done
## Process arguments.
if [ $# -ne 2 ] ; then
echo "Usage: ${PROGNAME} [flags] source destination"
exit 1
fi
## Making a directory?
if [ X"$1" = X. ] ; then
DEST="$2"
if [ ! -d "${DEST}" ] ; then
${MKDIR} "${DEST}" || exit 1
fi
if ${CHOWNIT} ; then
${CHOWN} "${OWNER}" "${DEST}" || exit 1
fi
if ${CHGROUPIT} ; then
${CHGRP} "${GROUP}" "${DEST}" || exit 1
fi
if ${CHMODIT} ; then
umask 0
${CHMOD} "${MODE}" "${DEST}" || exit 1
fi
exit 0
fi
## Get the destination and a temp file in the destination diretory.
if [ -d "$2" ] ; then
DEST="$2/$1"
TEMP="$2/$$.tmp"
else
DEST="$2"
TEMP="`expr "$2" : '\(.*\)/.*'`/$$.tmp"
fi
## If not given the same name, we must try to copy.
if [ X"$1" != X"$2" -o $SAVESRC ] ; then
if cmp -s "$1" "${DEST}" ; then
## Files are same; touch or not.
${TOUCHIT} && touch "${DEST}"
else
## If destination exists and we wish to backup, link to backup.
if [ -f "${DEST}" ] ; then
if ${BACKIT} ; then
${RM} -f "${DEST}${BACKUP}"
${LN} "${DEST}" "${DEST}${BACKUP}"
fi
fi
## Copy source to the right dir, then move to right spot.
## Done in two parts so we can hope for atomicity.
${RM} -f "${TEMP}" || exit 1
${CP} "$1" "${TEMP}" || exit 1
${MV} -f "${TEMP}" "${DEST}" || exit 1
fi
fi
## Strip and set the modes.
if ${STRIPIT} ; then
${STRIP} "${DEST}" || exit 1
fi
if ${CHOWNIT} ; then
${CHOWN} "${OWNER}" "${DEST}" || exit 1
fi
if ${CHGROUPIT} ; then
${CHGRP} "${GROUP}" "${DEST}" || exit 1
fi
if ${CHMODIT} ; then
umask 0
${CHMOD} "${MODE}" "${DEST}" || exit 1
fi
exit 0

View File

@ -1,50 +0,0 @@
-
Copyright (c) XYZZY
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.
-
Portions Copyright (c) 1993 by Digital Equipment Corporation.
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies, and that
the name of Digital Equipment Corporation not be used in advertising or
publicity pertaining to distribution of the document or software without
specific, written prior permission.
THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
-

View File

@ -1,45 +0,0 @@
How to add new hosts to the name server data base:
1) Edit 'named.hosts' file:
For each machine you need to enter the following information:
machine name, all its network addresses, host information, and common
aliases for it.
This is the entry for calder.
CALDER IN A 128.32.130.1
IN A 128.32.129.3
IN HINFO VAX-11/750 UNIX
UCBCALDER IN CNAME CALDER
For the machine you are adding:
1) replace 'CALDER' with the new machine name
2) replace '128.32.130.1' with the new machines address
if there is more then one address for the machine
then add lines like the one with '128.32.129.3'
3) replace 'VAX-11/750' with the machine type
4) If it doesn't run 'UNIX' then replace UNIX with its
operating system.
2) Edit 'named.rev' file:
For each address of a machine you need to enter the reverse
address notation for the machine:
For calder the lines look as follows:
12.0 IN PTR CALDER.BERKELEY.EDU.
3.129 IN PTR CALDER.BERKELEY.EDU.
Calder has two address '128.32.0.12' and '128.32.129.3'
You take the two numbers after 128.32 and reverse them.
Then replace CALDER with the new machine name.
*** Note the trailing "." on "EDU." it needs to be there. Otherwise
BIND will add the current $ORIGIN to this name, which won't work.
***
3) Increment the serial number on both files.

View File

@ -1,18 +0,0 @@
;
; @(#)named.boot.slave 1.13 (Berkeley) 87/07/21
;
; boot file for secondary name server
; Note that there should be one primary entry for each SOA record.
;
;
sortlist 10.0.0.0
directory /usr/local/adm/named
; type domain source host/file backup file
cache . root.cache
secondary Berkeley.EDU 128.32.137.8 128.32.137.3 ucbhosts.bak
secondary 32.128.IN-ADDR.ARPA 128.32.137.8 128.32.137.3 ucbhosts.rev.bak
primary 0.0.127.IN-ADDR.ARPA localhost.rev

View File

@ -1,16 +0,0 @@
;
; boot file for authoritive master name server for Berkeley.EDU
; Note that there should be one primary entry for each SOA record.
;
;
sortlist 10.0.0.0
directory /usr/local/adm/named
; type domain source host/file backup file
cache . root.cache
primary Berkeley.EDU berkeley.zone
primary 32.128.IN-ADDR.ARPA berkeley.rev
primary 0.0.127.IN-ADDR.ARPA localhost.rev

View File

@ -1,22 +0,0 @@
; Authoritative data for Berkeley.EDU (ORIGIN assumed Berkeley.EDU)
;
@ IN SOA ucbvax.berkeley.edu kjd.ucbvax.berkeley.edu (
1986020501 ; Serial
10800 ; Refresh 3 hours
3600 ; Retry 1 hour
3600000 ; Expire 1000 hours
86400 ) ; Minimum 24 hours
IN MX 10 ucb-vax
IN NS monet
localhost IN A 127.1
ucb-arpa IN A 10.0.0.78
IN A 128.32.0.4
IN HINFO VAX-11/780 UNIX
arpa IN CNAME ucbarpa
ucb-vax 9999 IN A 10.2.0.78
IN A 128.32.0.10
IN HINFO VAX-11/750 UNIX
ucbvax IN CNAME ucb-vax
monet IN A 128.32.0.7
IN HINFO VAX-11/750 UNIX
ucbmonet IN CNAME monet

View File

@ -1,13 +0,0 @@
;
; @(#)named.local 1.1 (Berkeley) 86/01/21
;
@ IN SOA ucbvax.Berkeley.EDU. kjd.ucbvax.Berkeley.EDU. (
1986012101 ; Serial
3600 ; Refresh
300 ; Retry
3600000 ; Expire
14400 ) ; Minimum
IN NS ucbvax.Berkeley.EDU.
0 IN PTR loopback.ucbvax.Berkeley.EDU.
1 IN PTR localhost.

View File

@ -1,30 +0,0 @@
;
; @(#)named.rev 1.1 (Berkeley) 86/02/05
;
@ IN SOA ucbvax.berkeley.edu kjd.ucbvax.berkeley.edu (
1986020501 ; Serial
10800 ; Refresh 3 hours
3600 ; Retry 1 hour
3600000 ; Expire 1000 hours
86400 ) ; Minimum 24 hours
IN NS ucbvax.Berkeley.EDU.
; RFC 1101 stuff
0.0 IN PTR Berkeley-net.Berkeley.EDU.
IN A 255.255.255.0
; real hosts
0.130 IN PTR csdiv-net.Berkeley.EDU.
2.129 IN PTR monet.Berkeley.EDU.
2.140 IN PTR ucbarpa.Berkeley.EDU.
3.132 IN PTR cad.Berkeley.EDU.
4.0 IN PTR ucbarpa.Berkeley.EDU.
5.0 IN PTR cad.Berkeley.EDU.
6.0 IN PTR ernie.Berkeley.EDU.
6.130 IN PTR monet-cs.Berkeley.EDU.
7.0 IN PTR monet.Berkeley.EDU.
7.130 IN PTR kim.Berkeley.EDU.
9.0 IN PTR esvax.Berkeley.EDU.
10.0 IN PTR ucbvax.Berkeley.EDU.
11.0 IN PTR kim.Berkeley.EDU.
11.156 IN PTR esvax-156.Berkeley.EDU.
38.131 IN PTR monet.Berkeley.EDU.

View File

@ -1,63 +0,0 @@
; This file holds the information on root name servers needed to
; initialize cache of Internet domain name servers
; (e.g. reference this file in the "cache . <file>"
; configuration file of BIND domain name servers).
;
; This file is made available by InterNIC registration services
; under anonymous FTP as
; file /domain/named.root
; on server FTP.RS.INTERNIC.NET
; -OR- under Gopher at RS.INTERNIC.NET
; under menu InterNIC Registration Services (NSI)
; submenu InterNIC Registration Archives
; file named.root
;
; last update: Nov 8, 1995
; related version of root zone: 1995110800
;
;
; formerly NS.INTERNIC.NET
;
. 3600000 IN NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
;
; formerly NS1.ISI.EDU
;
. 3600000 NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107
;
; formerly C.PSI.NET
;
. 3600000 NS C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
;
; formerly TERP.UMD.EDU
;
. 3600000 NS D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
;
; formerly NS.NASA.GOV
;
. 3600000 NS E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
;
; formerly NS.ISC.ORG
;
. 3600000 NS F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
;
; formerly NS.NIC.DDN.MIL
;
. 3600000 NS G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
;
; formerly AOS.ARL.ARMY.MIL
;
. 3600000 NS H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
;
; formerly NIC.NORDU.NET
;
. 3600000 NS I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
; End of File

View File

@ -1,158 +0,0 @@
/* options.h - specify the conditionally-compiled features
* vix 28mar92 [moved out of the Makefile because they were getting too big]
*
* $Id: options.h,v 8.12 1996/11/11 06:36:43 vixie Exp $
*/
/*
* ++Copyright++
* -
* Copyright (c)
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
/* Key:
* ucb = U C Berkeley 4.8.3 release
* vix = Paul Vixie of Digital
* del = Don Lewis of Harris
* mcsun = Piet Beertema of EUNet
* asp = Andrew Partan of UUNet
* pma = Paul Albitz of Hewlett Packard
* bb = Bryan Beecher of UMich
* mpa = Mark Andrews of CSIRO - DMS
* rossc = Ross Cartlidge of The Univeritsy of Sydney
* mtr = Marshall Rose of TPC.INT
* bg = Benoit Grange of INRIA
* ckd = Christopher Davis of Kapor Enterprises
* gns = Greg Shapiro of WPI
*/
#define DEBUG /* enable -d flag and SIGUSR[12] support (ucb) */
/*#define ALLOW_T_UNSPEC /* enable the "unspec" RR type for old athena (ucb) */
/*#define INVQ /* enable inverse queries (nslookup) (ucb/vix) */
/*#define DSTORAGE /* debug malloc overruns using storage.o (ucb/vix) */
/*#define DMALLOC /* trace malloc orphans using dmalloc.o (vix) */
#define XFRNETS /* enable "xfrnets" command in named.boot (vix) */
#define PID_FIX /* be careful about overwriting named.pid file (del) */
#define FWD_LOOP /* try to break out of forwarding loops (del) */
#define NO_GLUE /* don't accept or send out-of-zone glue (del) */
#define BOGUSNS /* detect bogus nameservers (mcsun) */
#define QRYLOG /* enable SIGWINCH for query logging (bb) */
/*#define YPKLUDGE /* deal effectively with broken "ypserv -i" (mcsun) */
#define TRACEROOT /* trace bogus root servers and ignore them (pma,bb) */
/*#define LOCALDOM /* permit "domain" directive in named.boot (ucb) */
#define FORCED_RELOAD /* refresh secondary zones on SIGHUP (pma) */
#define SLAVE_FORWARD /* use sensible timeouts on slave forwarders (pma) */
#define WANT_PIDFILE /* if you want the named.pid file (ucb/arc) */
#define DOTTED_SERIAL /* if you want to be able to specify dotted serial#s */
#define SENSIBLE_DOTS /* if you want dotted serial#s to make numeric sense */
#define NCACHE /* negative caching (anant@isi.edu) */
/*#define VALIDATE /* validation procedure (anant@isi.edu) (BUGGY!) */
/*#define SHORT_FNAMES /* file names used in named-xfer need to be short */
#define RESOLVSORT /* allow sorting of addresses in gethostbyname (mpa) */
#define STUBS /* allow transfers of NS only for a zone (mpa) */
#ifndef LOGFAC
#define LOGFAC LOG_DAEMON /* what syslog facility should named use? */
#endif
#define SECURE_ZONES /* if you want to inhibit world access to zones (gns)*/
#define ROUND_ROBIN /* rotate databuf list after each access (mtr) */
#define ADDAUTH /* return NS and glue w/ authorative answers (mpa) */
#define RFC1535 /* use RFC 1535 default for "search" list (vix) */
#define GEN_AXFR /* distinct zones within each class */
#define LAME_DELEGATION /* lame delegations (original-del,reworked-bb&del)*/
#define LAME_LOGGING LOG_DEBUG /* log lame delegations, set log level */
#define GETSER_LOGGING LOG_INFO /* log errors/timeouts getting serial number */
#define RETURNSOA /* good code that the world might be ready for now */
#define CLEANCACHE /* useful and necessary in the face of NCACHE */
#define PURGE_ZONE /* remove all traces of a zone when reloading (mpa) */
#define STATS /* keep nameserver statistics; uses more memory */
#define RENICE /* named-xfer should run at normal priority */
/*#define XSTATS /* extended statistics, syslogged periodically (bg) */
/*#define BIND_NOTIFY /* experimental - do not enable in customer products */
#define LOC_RR /* support for LOC record parsing (ckd/vix) */
#define SORT_RESPONSE /* should we try to sort responses optimally? (vix) */
/*--------------------------------------------*
* no user-servicable parts beyond this point *
*--------------------------------------------*/
/* if DSTORAGE is defined, we need to disable DMALLOC and remap
* malloc and free to storage.o's exported names. storage.o also
* includes a calloc and a realloc, but once we drag in its malloc
* and free we'll get the others automatically and so will never
* pull in those routines from libc.a.
*/
#ifdef DSTORAGE
# ifdef DMALLOC
# undef DMALLOC
# endif /*DMALLOC*/
# define malloc rt_malloc
# define free rt_free
#endif /*DSTORAGE*/
/* if DMALLOC is defined, grab the header file which will remap
* all the malloc-style names to those exported by dmalloc.o. note
* that DMALLOC also changes the function signatures of several
* functions in private named source modules, and that this file
* (options.h) must be included before any other private *.h files
* since those *.h files have some conditional remapping to do.
*/
#ifdef DMALLOC
# include "dmalloc.h"
#endif
#ifdef LAME_LOGGING
# define LAME_DELEGATION
#endif
#if defined(XSTATS) && !defined(STATS)
# define STATS
#endif

View File

@ -1,650 +0,0 @@
/* portability.h - include or define things that aren't present on all systems
* vixie@decwrl 26dec92 [new]
*
* $Id: portability.h,v 8.21 1997/06/01 20:34:27 vixie Exp $
*/
/*
* Copyright (c)
* 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.
*/
/*
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/*
* Portions Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#ifndef __BIND_PORTABILITY_H
#define __BIND_PORTABILITY_H
#include <sys/types.h>
#include <sys/param.h>
#include <signal.h>
#include <string.h>
#ifndef TIME_H_INCLUDED
# include <sys/time.h>
# define TIME_H_INCLUDED
#endif
/* (ISC = INTERACTIVE Systems Corporation in the next #ifdef, btw.) */
#ifdef ISC
# ifndef _POSIX_SOURCE
# define _POSIX_SOURCE
# endif
# define SYSV
# define SVR3
# define _SYSV3
# define NEED_STRTOUL
# define NEED_FTRUNCATE
# define USE_POSIX
# include <sys/bsdtypes.h>
# include <sys/sioctl.h>
# include <sys/stream.h>
# include <net/errno.h>
#endif
#if defined(__convex__)
# if !defined(_POSIX_SOURCE)
# define _POSIX_SOURCE
# endif
# define USE_UTIME
# define NEED_PUTENV
#endif
#if defined(_CRAY)
# if !defined(_POSIX_SOURCE)
# define _POSIX_SOURCE
# endif
# define writev(a,b,c) __writev(a,b,c)
# define setitimer(a,b,c) __setitimer(a,b,c)
#endif
/* This is for AIX 4.1.x */
#ifdef _AIX41
# include <sys/select.h>
# include <sys/time.h>
# include <time.h>
# define vfork fork
#endif
/* This is defined in the Makefile for INTERACTIVE compiles. */
#if defined(ISC)
# define ftruncate(a,b) __ftruncate(a,b)
# define USE_MEMCPY
# define USE_UTIME
# define HAVE_FCHMOD 0
#endif
/* SCO UNIX defines only this unique symbol, apparently. */
#if defined(M_UNIX)
# define POSIX_SIGNALS
# if !defined(_SCO_DS)
/* This section is for 3.2v4.2/ODT3.0 and maybe also for 3.2v4.1/3.2v4.0 */
/* XXX - why is this POSIX_SOURCE instead of _POSIX_SOURCE? */
# undef POSIX_SOURCE
# define HAVE_FCHMOD 0
# define NEED_WRITEV
# define writev(a,b,c) __writev(a,b,c)
# define ftruncate(a,b) __ftruncate(a,b)
# endif
#endif
#ifdef NeXT
# define NEED_PUTENV
# define NEED_SETENV
# define HAVE_STDLIB_H
# define NEED_STRDUP
# define inet_addr(a) __inet_addr(a)
#endif
#if defined(__sgi)
# define BSD 43
# define vfork fork
#endif
#if defined(SUNOS4)
# define BSD 43
# define NEED_STRTOUL
#endif
#if defined(__osf__) && defined(__alpha) && defined(BSD) && (BSD < 199103)
# undef BSD
# define BSD 199103
#endif
#if defined(_AUX_SOURCE)
# define vfork fork
# define NEED_STRERROR
# define NEED_STRTOUL
# define SIG_FN void
# define USE_MEMCPY
#endif
#if defined(apollo)
# define HAVE_STDLIB_H
#endif
#if defined(SVR4) && !defined(SYSV)
# define SYSV
#endif
#if defined(_POSIX_SOURCE) || defined(__sgi) || defined(__ultrix) || \
defined(__hpux) || (defined(BSD) && (BSD >= 199103)) || \
defined(sun) || defined(__m88k__)
# define USE_POSIX
#endif
#if defined(__ultrix) && !defined(BSD)
# define BSD 42
#endif
#if defined(host_mips) && defined(SYSTYPE_BSD43)
# define RISCOS_BSD
#endif
#if defined(SYSV) || defined(__ultrix) || defined(__osf__) \
|| (defined(BSD) && BSD >= 199306) || defined(linux)
# define USE_UTIME
# define HAVE_SETVBUF
#endif
#if defined(SYSV) && !defined(SVR4)
# define vfork fork
#endif
#if defined(sun) || defined(SVR4)
# define NETREAD_BROKEN
#endif
#if defined(BSD) && BSD >= 199006 && !defined(i386) && !defined(RISCOS_BSD)
# define HAVE_DAEMON
#endif
#if !defined(BSD) || (BSD <= 199006)
# if !defined(NeXT)
# define NEED_INETADDR
# endif
# define NEED_INETATON
#endif
#if defined(__hpux)
# if defined(__STDC__)
# define select(a,b,c,d,e) select(a, (int *)b, (int *)c, (int *)d, e)
# define ctime(x) ctime((const time_t *)x)
# endif /*__STDC__*/
# if !defined(SYSV)
# define USE_UTIME
# define setlinebuf(x) setvbuf(x, NULL, _IOLBF, BUFSIZ)
# if !defined(SIGWINCH) /*pre 9.0*/
# define SIGWINCH SIGWINDOW
# endif
# endif /*SYSV*/
/* XXX: better autodetection of the need for "struct linger" would be nice */
# if 0
struct linger {
int l_onoff; /* option on/off */
int l_linger; /* linger time */
};
# endif
#endif /*__hpux*/
#if defined(_SEQUENT_)
# include <netinet/in_systm.h>
# define USE_UTIME
# define USE_POSIX
# define NEED_GETTIMEOFDAY
# define _TIMEZONE timezoneBSD
struct timezoneBSD {
int tz_minuteswest;
int tz_dsttime;
};
#endif
#ifndef __P
# if defined(__STDC__) || defined(__GNUC__)
# define __P(x) x
# else
# define __P(x) ()
# endif
#endif
#ifndef _TIMEZONE
# define _TIMEZONE timezone
#endif
#if defined(USE_POSIX) || defined(HAVE_STDLIB_H)
# include <stdlib.h>
# if defined(__ultrix)
# define NEED_STRDUP
# endif
#else
# if !defined(_SCO_DS)
# define NEED_STRDUP
# define NEED_STRTOUL
# endif
# ifndef NeXT
extern char *getenv __P((char *));
# else
extern char *getenv __P((const char *));
# endif
# if !defined(DMALLOC) && !defined(NeXT)
extern char *malloc(), *realloc(), *calloc();
extern void free();
# endif
#endif /*HAVE_STDLIB_H*/
#if defined(USE_POSIX)
# include <unistd.h>
# include <limits.h>
#else
# define STDIN_FILENO 0
# define STDOUT_FILENO 1
# define STDERR_FILENO 2
extern int errno;
extern int getdtablesize __P((void));
# ifdef SHORT_FNAMES
extern long pathconf __P((const char *path, int name));
# endif
#endif /*USE_POSIX*/
#ifndef UINT_MAX
# ifdef __STDC__
# define UINT_MAX 4294967295u /* max value of an "u_int" */
# else
# define UINT_MAX ((unsigned)4294967295) /* max value of an "u_int" */
# endif
# define ULONG_MAX UINT_MAX /* max decimal value of a "u_long" */
#endif
#ifndef INT_MAX
# define INT_MAX 2147483647 /* max decimal value of an "int" */
#endif
#ifndef RAND_MAX
# define RAND_MAX 0x7fffffff
#endif
#ifndef IN_LOOPBACKNET
# define IN_LOOPBACKNET 127
#endif
#ifndef INADDR_NONE
# define INADDR_NONE 0xffffffff
#endif
#if defined(apollo)
/* Defined in /usr/include/netinet/in.h but doesn't work */
#undef IP_OPTIONS
#endif
#if !defined(__STDC__) && !defined(const)
# define const /*constant*/
#endif
#if !defined(__convex__) && (!defined(BSD) || (BSD < 199103))
int strcasecmp __P((const char *, const char *));
#endif
/* is USE_POSIX the right thing to use here? */
#if (!defined(BSD) || (BSD <= 43)) && \
!defined(NeXT) && \
!defined(__convex__) && \
!defined(USE_POSIX)
# if !defined(NCR)
extern void syslog();
# endif
extern char *ctime __P((const time_t *clock));
# if !defined(M_UNIX)
extern int close(), setitimer(), recv(), sendto(), sigsetmask(),
atoi(), getpid(), fork(), read(), ioctl(),
setsockopt(), socket(), bind();
# endif
#endif
#if !defined(bcopy) /* some machines have their own macros for this */
# if (defined(USE_POSIX) && !defined(SUNOS4)) || \
(defined(__STDC__) && !defined(sun) && !defined(sequent) \
&& !defined(M_UNIX))
/* use ANSI C3.159-1989 (``ANSI C'') functions if possible;
* ideally we would change the code to use them and then
* define them in terms of bcopy et al if !defined(__STDC__)
* but that's more work.
*/
#if defined(USE_MEMCPY)
# define bcopy(a,b,c) memcpy(b,a,c)
#else
# define bcopy(a,b,c) memmove(b,a,c)
#endif
# define bzero(a,b) memset(a,0,b)
# define bcmp(a,b,c) memcmp(a,b,c)
# else
extern void bcopy();
extern void bzero();
extern int bcmp();
# endif /* BSD */
#endif /* bcopy */
#if (!defined(BSD) || (BSD < 43) || defined(RISCOS_BSD)) \
&& !defined(USE_POSIX) && !defined(apollo) && !defined(sequent) \
&& !defined(M_UNIX)
# define NEED_STRERROR
#if !defined(ultrix) && !defined(NCR)
# define NEED_PUTENV
#endif
#endif
#if defined(SUNOS4)
# define NEED_STRERROR
# if defined(sun386)
# define pid_t int
# define NEED_STRCASECMP
# endif
#endif
#if (!defined(BSD) || (BSD < 43)) && !defined(__hpux)
# define NEED_MKSTEMP
# if !defined(__ultrix) && !defined(apollo)
# if !defined(_SCO_DS)
# define NEED_STRCASECMP
# define NEED_MKTEMP
# if !defined(SVR4)
# define NEED_STRPBRK
# endif
# endif
# endif
#endif
#if defined(USE_POSIX)
# define POSIX_SIGNALS
#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) || defined(NeXT) || defined(__osf__) || defined(sun) \
|| defined(__ultrix) || defined(apollo) || defined(POSIX_SIGNALS)
# 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
#if !defined(SIGUSR1) && !defined(SIGUSR2)
# define SIGUSR1 SIGEMT
# define SIGUSR2 SIGFPE
#endif
#if !defined(SIGCHLD)
# define SIGCHLD SIGCLD
#endif
#if !defined(ntohl) && !defined(htonl) && defined(BSD) && (BSD <= 43)
/* if these aren't null macros in netinet/in.h, extern them here. */
extern u_short htons __P((u_short)), ntohs __P((u_short));
extern u_long htonl __P((u_long)), ntohl __P((u_long));
#endif
#if defined(USE_POSIX) && !defined(sun) && !defined(__sgi) \
&& !defined(__convex__) && !defined(__ultrix) && !defined(_AUX_SOURCE)
# define PORT_NONBLOCK O_NONBLOCK
# define PORT_WOULDBLK EAGAIN
#else
# define PORT_NONBLOCK O_NDELAY
# define PORT_WOULDBLK EWOULDBLOCK
#endif
#if defined(USE_POSIX)
# define USE_SETSID
#endif
#if defined(USE_POSIX) || !defined(SYSV)
#define USE_WAITPID
#endif
#if !defined(USE_POSIX)
#define waitpid(x,y,z) (wait3(y,z,(struct rusage *)NULL))
#endif
#if defined(NeXT) || defined(_AIX) || defined(sun386)
# undef WIFEXITED
# undef WEXITSTATUS
# undef WIFSIGNALED
# undef WTERMSIG
#endif /* NeXT */
#if defined(sequent)
#define WEXITSTATUS(x) ((x).w_retcode)
#define WTERMSIG(x) ((x).w_termsig)
#endif /* sequent */
#if !defined(WIFEXITED)
# define WIFEXITED(x) (!(x & 0177))
#endif
#if !defined(WEXITSTATUS)
# define WEXITSTATUS(x) (x >> 8)
#endif
#if !defined(WIFSIGNALED)
# define WIFSIGNALED(x) ((x & 0177) && ((x & 0377) != 0177))
#endif
#if !defined(WTERMSIG)
# define WTERMSIG(x) (x & 0177)
#endif
#ifndef S_ISDIR
# ifndef S_IFMT
# define S_IFMT 0170000
# endif
# ifndef S_IFDIR
# define S_IFDIR 0040000
# endif
# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
#endif
#ifndef S_ISREG
# ifndef S_IFMT
# define S_IFMT 0170000
# endif
# ifndef S_IFREG
# define S_IFREG 0100000
# endif
# define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
#endif
#ifndef S_ISFIFO
# ifndef S_IFMT
# define S_IFMT 0170000
# endif
# ifndef S_IFIFO
# define S_IFIFO 0010000
# endif
# define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
#endif
#if defined(NEED_STRTOUL) && \
(defined(__ultrix) || defined(__osf__) || defined(NeXT))
# undef NEED_STRTOUL
#endif
#if defined(__ultrix) || defined(__osf__)
# define MAYBE_HESIOD
#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
#ifndef MIN
# define MIN(x, y) ((x > y) ?y :x)
#endif
#ifndef MAX
# define MAX(x, y) ((x > y) ?x :y)
#endif
#if !defined(PATH_MAX)
# if defined(_POSIX_PATH_MAX)
# define PATH_MAX _POSIX_PATH_MAX
# else
# if defined(MAXPATHLEN)
# define PATH_MAX MAXPATHLEN
# endif
# endif
#endif
#if defined(BSD) || defined(__osf__) || defined(__convex__)
# define HAVE_GETRUSAGE
#endif
/* May be set in the Makefile. */
#if defined(HAVE_GETRUSAGE)
# include <sys/resource.h>
#endif
/*
* Because Convex has true library function feof() which is
* patently wrong (it test bit _IOREAD) we need feof() as
* a macro.
*/
#if defined(__convex__) && !defined(feof)
# define feof(p) ((p)->_flag&_IOEOF)
#endif
#if defined(M_UNIX) || defined(linux)
# define SPURIOUS_ECONNREFUSED
#endif
/*
* Assume that a system has fchmod() unless something above says otherwise.
*/
#if !defined(HAVE_FCHMOD)
# define HAVE_FCHMOD 1
#endif
/*
* Some systems need _res to be linked into text rather than bss.
*/
#if defined(__m88k__)
# define __BIND_RES_TEXT
#endif
/*
* Motorola FH40.43 and FH40.44 need specific macros for
* get/settimeofday as only one argument seems to be accepted
* by the compiler. NULL generates compile errors
*/
#if defined(__m88k__) && defined(__unix__)
# define gettimeofday(tp, tzp) gettimeofday(tp)
# define settimeofday(tp, tzp) settimeofday(tp)
#endif
/*
* We need to know the IPv6 address family number even on IPv4-only systems.
* Note that this is NOT a protocol constant, and that if the system has its
* own AF_INET6, different from ours below, all of BIND's libraries and
* executables will need to be recompiled after the system <sys/socket.h>
* has had this type added. The type number below is correct on most BSD-
* derived systems for which AF_INET6 is defined.
*/
#ifndef AF_INET6
#define AF_INET6 24
#endif
/*
* Prototype the functions we'll be supplying.
*/
#ifdef NEED_PUTENV
extern int putenv __P((char *));
#endif
#ifdef NEED_GETTIMEOFDAY
extern int gettimeofday __P((struct timeval *, struct _TIMEZONE *));
#endif
#if defined(SVR4) && defined(sun)
extern int gethostname __P((char *, size_t));
#endif
#ifdef NEED_STRDUP
extern char *strdup __P((const char *));
#endif
#endif /*__BIND_PORTABILITY_H*/

View File

@ -1,72 +0,0 @@
IPv6 notes for BIND 4.9.3 Patch 2 Candidate 5 (and later?)
Paul Vixie, May 20, 1996
doc/misc/IPv6
*** Introduction ***
The IPv6 support in this release is latent, in that its presence is not
documented. The support is not optional, since its presence ought not to
affect anyone who does not go looking for it. The support includes:
inet_ntop() new function.
inet_pton() new function.
RES_USE_INET6 causes gethostby*() to return either real IPv6
addresses (if available) or mapped (::FFFF:a.b.c.d)
addresses if only IPv4 address records are found.
gethostbyname() can search for T_AAAA in preference to T_A.
gethostbyaddr() can search in IP6.INT for PTR RR's.
named can load, transfer, cache, and dump T_AAAA RRs.
*** Some notes on the new functions ***
The inet_pton() and inet_ntop() functions differ from the current (as of
this writing) IPv6 BSD API draft. Discussions were held, primarily between
myself and Rich Stevens, on the ipng@sunroof.eng.sun.com mailing list, and
the BIND definitions of these functions are likely to go into the next draft.
(If not, and BIND has to change its definitions of these functions, then you
will know why I chose not to document them yet!)
These functions can return error values, and as such the process of porting
code that used inet_aton() to use inet_pton() is not just syntactic. Not all
nonzero values indicate success; consider "-1". Likewise, inet_ntoa() is not
just smaller than inet_ntop() -- it's a whole new approach. Inet_ntop() does
not return a static pointer, the caller has to supply a sized buffer. Also,
inet_ntop() can return NULL, so you should only printf() the result if you
have verified that your arguments will be seen as error free.
The inet_pton() function is much pickier about its input format than the old
inet_aton() function has been. You can't abbreviate 10.0.0.53 as 10.53 any
more. Hexadecimal isn't accepted. You have to supply four decimal numeric
strings, each of whose value is within the range from 0 to 255. No spaces
are allowed either before, after, or within an address. If you need the older
functionality with all the shortcuts and exceptions, continue using inet_aton()
for your IPv4 address parsing needs.
*** Some notes on RES_USE_INET6 ***
You can set this by modifying _res.options after calling res_init(), or you
can turn it on globally by setting "options inet6" in /etc/resolv.conf. This
latter option ought to be used carefully, since _all_ applications will then
receive IPv6 style h_addr_list's from their gethostby*() calls. Once you know
that every application on your system can cope with IPv6 addressing, it is safe
and reasonable to turn on the global option. Otherwise, don't do it.
*** Some notes on mapped IPv4 addresses ***
There are two IPv6 prefixes set aside for IPv4 address encapsulation. See
RFC 1884 for a detailed explaination. The ::a.b.c.d form is used for
tunnelling, which means wrapping an IPv4 header around IPv6 packets and using
the existing IPv4 routing infrastructure to reach what are actually IPv6
endpoints. The ::FFFF:a.b.c.d form can be used on dual-stack (IPv4 and IPv6)
hosts to signal a predominantly IPv6 stack that it should use ``native'' IPv4
to reach a given destination, even though the socket's address family is
AF_INET6.
BIND supports both of these address forms, to the extent that inet_pton() will
parse them, inet_ntop() will generate them, gethostby*() will map IPv4 into
IPv6 if the RES_USE_INET6 option is set, and gethostbyaddr() will search the
IN-ADDR.ARPA domain rather than the IP6.INT domain when it needs a PTR RR.
This last bit of behaviour is still under discussion and it's not clear that
tunnelled addresses should be mapped using IN-ADDR.ARPA. In other words, this
bit of behaviour may change in a subsequent BIND release. So now you know
another reason why none of this stuff is ``officially'' documented.

View File

@ -1,451 +0,0 @@
#
# Makefile to install the BIND 4.9 manual entries.
#
# Default Configuration:
# There are a set of default assignments immediately following this
# note. These defaults are for BSD4.4, BSD/386, other net2-alikes,
# and will install manual entries with following characteristics:
# o They will be catable (i.e., passed through nroff)
# o They will be installed in the directories
# /usr/share/man/catN, where N is 1, 3, 5, 7, 8
# o They will have an extension of `.0'
#
# Don't change these defaults. Instead, following the default configuration
# are sets of commented values for particular systems that can be used
# to override the default values.
#
#
# Target directory for the manual directory tree. Eg., may be used to
# specify the path of an NFS-mounted directory for common files.
#
DESTDIR=
#
# Default location for manual section directories.
#
DESTMAN= /usr/share/man
#
# Install manuals in ${MANDIR}N. For systems that generate catable manual
# entries on the fly, use
# MANDIR = man
#
MANDIR = cat
#
# Default extension for manual entries. To install the manual entries under
# their `real' extensions use
# CATEXT = $$N
#
CATEXT = 0
#
# Command to install manual entries
#
INSTALL= install
#
# `install' options to set Owner and Group for manual entries. Eg. for
# BSD `install' use
# MAN_OWNER = -o bin
# MAN_GROUP = -g bin
#
MAN_OWNER =
MAN_GROUP =
SHELL= /bin/sh
INDOT=
XFER_INDOT=
#
# Uppercase versions of the above variables (`INDOT_U' and `XFER_INDOT_U')
# are defined for use in `.TH' lines.
#
#
# Command used to generate a manual entry. By default this produces catable
# manual entries.
#
# For systems that store manuals in source form (eg SunOS 4.x and SunOS 5.x)
# and generate catable manual entries on the fly the following assignment
# can be used.
# MANROFF = cat
#
MANROFF = ( tbl | nroff -man )
#
# Default extensions for installed manual entries. The following variables
# have been defined to allow BIND's manual entries to be installed in the
# right place for a given platform.
#
# CMD_EXT = extension for user commands (eg, dig)
# LIB_NETWORK_EXT = extension for network library routines (eg,
# gethostbyname)
# FORMAT_EXT = extension for files describing file formats
# (eg, resolver)
# DESC_EXT = extension for descriptive files (eg, mailaddr)
# SYS_OPS_EXT = extension system operation and maintenance commands
# and applications. (eg, named, named-xfer, syslog)
#
# Associated with each variable is an additional variable with the suffix
# `_DIR' that specifies the suffix to ${MANDIR}. It's needed because on
# some systems, eg., Ultrix, multiple subsections (eg 3x, 3m 3n) are
# stored in generic manual section directories (eg., man3).
#
# Associated with each variable is an additional variable with the suffix
# `_U' which gives the upper case form of the variable for use in `.TH'
# commands. Useful for platforms (such as Solaris 2) that include letters
# in manual sections.
#
CMD_EXT = 1
CMD_EXT_DIR = ${CMD_EXT}
LIB_NETWORK_EXT = 3
LIB_NETWORK_EXT_DIR = ${LIB_NETWORK_EXT}
FORMAT_EXT = 5
FORMAT_EXT_DIR = ${FORMAT_EXT}
DESC_EXT = 7
DESC_EXT_DIR = ${DESC_EXT}
SYS_OPS_EXT = 8
SYS_OPS_EXT_DIR = ${SYS_OPS_EXT}
#
# Additional variables are defined for cross-references within manual
# entries:
# SYSCALL_EXT = extension for system calls
# BSD_SYSCALL_EXT = extension for BSD-specifc system calls. On some
# systems (eg Ultrix) these appear in section 2.
# On other system (eg SunOS 5) these are implemented
# via a BSD-compatibility library and appear in
# section 3.
# LIB_C_EXT = extension for C library routines (eg, signal)
#
SYSCALL_EXT = 2
SYSCALL_EXT_DIR = ${SYSCALL_EXT}
BSD_SYSCALL_EXT = 2
BSD_SYSCALL_EXT_DIR = ${BSD_SYSCALL_EXT}
LIB_C_EXT = 3
LIB_C_EXT_DIR = ${LIB_C_EXT}
#
# Platform specific assignments start here:
#
#
# (CRAY)
#
#
# (DEC AXP OSF/1)
#
#DESTMAN= /usr/share/man
#MANDIR = man
#CATEXT = $$N
#MAN_OWNER = -o root
#MAN_GROUP = -g root
#INSTALL = installbsd
#MANROFF = cat
## Extensions for DEC AXP OSF/1 manual entries
#CMD_EXT = 1
#SYS_OPS_EXT = 8
#LIB_NETWORK_EXT = 3
#FORMAT_EXT = 4
#DESC_EXT = 5
#
#SYSCALL_EXT = 2
#BSD_SYSCALL_EXT = 2
#LIB_C_EXT = 3
#
# (irix4)
#
#
# (irix5)
#
#
# (sunos4.x)
#
#
# (ULTRIX, sunos, other 4.[23]bsd-alikes)
#
#DESTMAN= /usr/man
#MANDIR = man
#CATEXT = $$N
#MAN_OWNER = -o root
#MAN_GROUP = -g root
#INSTALL = install
#MANROFF = cat
## Extensions for ULTRIX, sunos, other 4.[23]bsd-alikes manual entries
#CMD_EXT = 1
#SYS_OPS_EXT = 8
#LIB_NETWORK_EXT = 3n
#LIB_NETWORK_EXT_DIR = 3
#FORMAT_EXT = 5
#DESC_EXT = 7
#
#SYSCALL_EXT = 2
#BSD_SYSCALL_EXT = 2
#LIB_C_EXT = 3
#
# SunOS 5.x (Solaris 2.x)
#
#DESTMAN= /usr/share/man
#MANDIR = man
#CATEXT = $$N
#MAN_OWNER = -o bin
#MAN_GROUP = -g bin
#INSTALL = /usr/ucb/install
#MANROFF = cat
#INDOT = in.
#XFER_INDOT =
## Extensions for Solaris 2.x manual entries
#CMD_EXT = 1
#SYS_OPS_EXT = 1m
#LIB_NETWORK_EXT = 3n
#FORMAT_EXT = 4
#DESC_EXT = 5
#
#SYSCALL_EXT = 2
#BSD_SYSCALL_EXT = 3b
#LIB_C_EXT = 3c
#
# (hpux9.0)
#
#
# (apollo domainos)
#
#
# (AIX3)
#
#
# (ConvexOS-10.x)
#
#
# (NEC EWS4800 EWS-UX/V Rel4.0/Rel4.2)
#
#
# SCO Unix 3.4.2 / ODT 3.0
#
#
# (NeXTstep 2.1 and 3.0)
#
#
# (Sequent Dynix/PTX)
#
######################################################################
#
# No user changes needed past this point.
#
######################################################################
#
# This sed command is used to update the manual entries so they refer to
# the appropriate section of the manual for a given platform.
#
EXT_SED_CMD = INDOT_U=`echo "${INDOT}"|tr "[a-z]" "[A-Z]"`; \
export INDOT_U; \
XFER_INDOT_U=`echo "${XFER_INDOT}"|tr "[a-z]" "[A-Z]"`; \
export XFER_INDOT_U; \
CMD_EXT_U=`echo "${CMD_EXT}"|tr "[a-z]" "[A-Z]"`; \
export CMD_EXT_U; \
SYS_OPS_EXT_U=`echo "${SYS_OPS_EXT}"|tr "[a-z]" "[A-Z]"`; \
export SYS_OPS_EXT_U; \
LIB_NETWORK_EXT_U=`echo "${LIB_NETWORK_EXT}"|tr "[a-z]" "[A-Z]"`; \
export LIB_NETWORK_EXT_U; \
FORMAT_EXT_U=`echo "${FORMAT_EXT}"|tr "[a-z]" "[A-Z]"`; \
export FORMAT_EXT_U; \
DESC_EXT_U=`echo "${DESC_EXT}"|tr "[a-z]" "[A-Z]"`; \
export DESC_EXT_U; \
SYSCALL_EXT_U=`echo "${SYSCALL_EXT}"|tr "[a-z]" "[A-Z]"`; \
export SYSCALL_EXT_U; \
BSD_SYSCALL_EXT_U=`echo "${BSD_SYSCALL_EXT}"|tr "[a-z]" "[A-Z]"`; \
export BSD_SYSCALL_EXT_U; \
LIB_C_EXT_U=`echo "${LIB_C_EXT}"|tr "[a-z]" "[A-Z]"`; \
export LIB_C_EXT_U; \
sed -e "s/@INDOT@/${INDOT}/g" \
-e "s/@INDOT_U@/$${INDOT_U}/g" \
-e "s/@XFER_INDOT@/${XFER_INDOT}/g" \
-e "s/@XFER_INDOT_U@/$${XFER_INDOT_U}/g" \
-e "s/@CMD_EXT@/${CMD_EXT}/g" \
-e "s/@CMD_EXT_U@/$${CMD_EXT_U}/g" \
-e "s/@LIB_NETWORK_EXT@/${LIB_NETWORK_EXT}/g" \
-e "s/@LIB_NETWORK_EXT_U@/$${LIB_NETWORK_EXT_U}/g" \
-e "s/@FORMAT_EXT@/${FORMAT_EXT}/g" \
-e "s/@FORMAT_EXT_U@/$${FORMAT_EXT_U}/g" \
-e "s/@DESC_EXT@/${DESC_EXT}/g" \
-e "s/@DESC_EXT_U@/$${DESC_EXT_U}/g" \
-e "s/@SYS_OPS_EXT@/${SYS_OPS_EXT}/g" \
-e "s/@SYS_OPS_EXT_U@/$${SYS_OPS_EXT_U}/g" \
-e "s/@SYSCALL_EXT@/${SYSCALL_EXT}/g" \
-e "s/@SYSCALL_EXT_U@/$${SYSCALL_EXT_U}/g" \
-e "s/@BSD_SYSCALL_EXT@/${BSD_SYSCALL_EXT}/g" \
-e "s/@BSD_SYSCALL_EXT_U@/$${BSD_SYSCALL_EXT_U}/g" \
-e "s/@LIB_C_EXT@/${LIB_C_EXT}/g" \
-e "s/@LIB_C_EXT_U@/$${LIB_C_EXT_U}/g"
#
# Command used to produce manual entries
#
MK_MANFILE = ( ${EXT_SED_CMD} | ${MANROFF} )
#
# Extensions for the generated manual entries
#
CMD_OUT_EXT = out${CMD_EXT}
LIB_NETWORK_OUT_EXT = out${LIB_NETWORK_EXT}
FORMAT_OUT_EXT = out${FORMAT_EXT}
DESC_OUT_EXT = out${DESC_EXT}
SYS_OPS_OUT_EXT = out${SYS_OPS_EXT}
#
# User command manual entries
#
CMD_BASE = dig host dnsquery
CMD_SRC_EXT = 1
CMD_SRC = dig.${CMD_SRC_EXT} host.${CMD_SRC_EXT} dnsquery.${CMD_SRC_EXT}
CMD_OUT = dig.${CMD_OUT_EXT} host.${CMD_OUT_EXT} dnsquery.${CMD_OUT_EXT}
#
# named manual entries
#
NAMED_BASE = named named.reload named.restart ndc
SYS_OPS_SRC_EXT = 8
NAMED_SRC = named.${SYS_OPS_SRC_EXT} named.reload.${SYS_OPS_SRC_EXT} \
named.restart.${SYS_OPS_SRC_EXT} ndc.${SYS_OPS_SRC_EXT}
NAMED_OUT = named.${SYS_OPS_OUT_EXT} named.reload.${SYS_OPS_OUT_EXT} \
named.restart.${SYS_OPS_OUT_EXT} ndc.${SYS_OPS_OUT_EXT}
#
# named-xfer manual entry
#
NAMED_XFER_BASE = named-xfer
NAMED_XFER_SRC = named-xfer.${SYS_OPS_SRC_EXT}
NAMED_XFER_OUT = named-xfer.${SYS_OPS_OUT_EXT}
#
# nslookup manual entry
#
NSLOOKUP_BASE = nslookup
NSLOOKUP_SRC = nslookup.${SYS_OPS_SRC_EXT}
NSLOOKUP_OUT = nslookup.${SYS_OPS_OUT_EXT}
#
# Network library routines manual entries
#
LIB_NETWORK_BASE = gethostbyname resolver getnetent
LIB_NETWORK_SRC_EXT = 3
LIB_NETWORK_SRC = gethostbyname.${LIB_NETWORK_SRC_EXT} \
resolver.${LIB_NETWORK_SRC_EXT} \
getnetent.${LIB_NETWORK_SRC_EXT}
LIB_NETWORK_OUT = gethostbyname.${LIB_NETWORK_OUT_EXT} \
resolver.${LIB_NETWORK_OUT_EXT} \
getnetent.${LIB_NETWORK_OUT_EXT}
#
# File format manual entries
#
FORMAT_BASE = resolver
FORMAT_SRC_EXT = 5
FORMAT_SRC = resolver.${FORMAT_SRC_EXT}
FORMAT_OUT = resolver.${FORMAT_OUT_EXT}
#
# Feature Description manual entries
#
DESC_BASE = hostname mailaddr
DESC_SRC_EXT = 7
DESC_SRC = hostname.${DESC_SRC_EXT} mailaddr.${DESC_SRC_EXT}
DESC_OUT = hostname.${DESC_OUT_EXT} mailaddr.${DESC_OUT_EXT}
.SUFFIXES: .${CMD_SRC_EXT} .${CMD_OUT_EXT} \
.${SYS_OPS_SRC_EXT} .${SYS_OPS_OUT_EXT} \
.${LIB_NETWORK_SRC_EXT} .${LIB_NETWORK_OUT_EXT} \
.${FORMAT_SRC_EXT} .${FORMAT_OUT_EXT} \
.${DESC_SRC_EXT} .${DESC_OUT_EXT}
.${CMD_SRC_EXT}.${CMD_OUT_EXT}:
${MK_MANFILE} <$*.${CMD_SRC_EXT} >$*.${CMD_OUT_EXT}
.${SYS_OPS_SRC_EXT}.${SYS_OPS_OUT_EXT}:
${MK_MANFILE} <$*.${SYS_OPS_SRC_EXT} >$*.${SYS_OPS_OUT_EXT}
.${LIB_NETWORK_SRC_EXT}.${LIB_NETWORK_OUT_EXT}:
${MK_MANFILE} <$*.${LIB_NETWORK_SRC_EXT} >$*.${LIB_NETWORK_OUT_EXT}
.${FORMAT_SRC_EXT}.${FORMAT_OUT_EXT}:
${MK_MANFILE} <$*.${FORMAT_SRC_EXT} >$*.${FORMAT_OUT_EXT}
.${DESC_SRC_EXT}.${DESC_OUT_EXT}:
${MK_MANFILE} <$*.${DESC_SRC_EXT} >$*.${DESC_OUT_EXT}
OUTFILES = ${CMD_OUT} ${NAMED_OUT} ${NAMED_XFER_OUT} ${NSLOOKUP_OUT} \
${LIB_NETWORK_OUT} ${FORMAT_OUT} ${DESC_OUT}
all: ${OUTFILES}
install: ${OUTFILES} \
${DESTDIR}${DESTMAN}/${MANDIR}${CMD_EXT_DIR} \
${DESTDIR}${DESTMAN}/${MANDIR}${SYS_OPS_EXT_DIR} \
${DESTDIR}${DESTMAN}/${MANDIR}${LIB_NETWORK_EXT_DIR} \
${DESTDIR}${DESTMAN}/${MANDIR}${FORMAT_EXT_DIR} \
${DESTDIR}${DESTMAN}/${MANDIR}${DESC_EXT_DIR}
@set -x; N=${CMD_EXT}; for f in ${CMD_BASE}; do \
${INSTALL} -c -m 444 ${MAN_OWNER} ${MAN_GROUP} \
$${f}.${CMD_OUT_EXT} \
${DESTDIR}${DESTMAN}/${MANDIR}${CMD_EXT_DIR}/$${f}.${CATEXT}; \
done
@set -x; N=${SYS_OPS_EXT}; for f in ${NAMED_BASE}; do \
${INSTALL} -c -m 444 ${MAN_OWNER} ${MAN_GROUP} \
$${f}.${SYS_OPS_OUT_EXT} \
${DESTDIR}${DESTMAN}/${MANDIR}${SYS_OPS_EXT_DIR}/${INDOT}$${f}.${CATEXT}; \
done
@set -x; N=${SYS_OPS_EXT}; for f in ${NAMED_XFER_BASE}; do \
${INSTALL} -c -m 444 ${MAN_OWNER} ${MAN_GROUP} \
$${f}.${SYS_OPS_OUT_EXT} \
${DESTDIR}${DESTMAN}/${MANDIR}${SYS_OPS_EXT_DIR}/${XFER_INDOT}$${f}.${CATEXT}; \
done
@set -x; N=${SYS_OPS_EXT}; for f in ${NSLOOKUP_BASE}; do \
${INSTALL} -c -m 444 ${MAN_OWNER} ${MAN_GROUP} \
$${f}.${SYS_OPS_OUT_EXT} \
${DESTDIR}${DESTMAN}/${MANDIR}${SYS_OPS_EXT_DIR}/$${f}.${CATEXT}; \
done
@set -x; N=${LIB_NETWORK_EXT}; for f in ${LIB_NETWORK_BASE}; do \
${INSTALL} -c -m 444 ${MAN_OWNER} ${MAN_GROUP} \
$${f}.${LIB_NETWORK_OUT_EXT} \
${DESTDIR}${DESTMAN}/${MANDIR}${LIB_NETWORK_EXT_DIR}/$${f}.${CATEXT}; \
done
@set -x; N=${FORMAT_EXT}; for f in ${FORMAT_BASE}; do \
${INSTALL} -c -m 444 ${MAN_OWNER} ${MAN_GROUP} \
$${f}.${FORMAT_OUT_EXT} \
${DESTDIR}${DESTMAN}/${MANDIR}${FORMAT_EXT_DIR}/$${f}.${CATEXT}; \
done
@set -x; N=${DESC_EXT}; for f in ${DESC_BASE}; do \
${INSTALL} -c -m 444 ${MAN_OWNER} ${MAN_GROUP} \
$${f}.${DESC_OUT_EXT} \
${DESTDIR}${DESTMAN}/${MANDIR}${DESC_EXT_DIR}/$${f}.${CATEXT}; \
done
${DESTDIR}${DESTMAN}/${MANDIR}${CMD_EXT_DIR} \
${DESTDIR}${DESTMAN}/${MANDIR}${SYS_OPS_EXT_DIR} \
${DESTDIR}${DESTMAN}/${MANDIR}${LIB_NETWORK_EXT_DIR} \
${DESTDIR}${DESTMAN}/${MANDIR}${FORMAT_EXT_DIR} \
${DESTDIR}${DESTMAN}/${MANDIR}${DESC_EXT_DIR}:
mkdir $@
depend:
clean:
rm -f *~ *.BAK *.CKP *.orig
rm -f ${OUTFILES}

View File

@ -1,364 +0,0 @@
.\" $Id: dig.1,v 8.2 1997/06/01 20:34:33 vixie Exp $
.\"
.\" ++Copyright++ 1993
.\" -
.\" Copyright (c) 1993
.\" 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.
.\" -
.\" Portions Copyright (c) 1993 by Digital Equipment Corporation.
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies, and that
.\" the name of Digital Equipment Corporation not be used in advertising or
.\" publicity pertaining to distribution of the document or software without
.\" specific, written prior permission.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
.\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
.\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
.\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
.\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\" -
.\" --Copyright--
.\"
.\" Distributed with 'dig' version 2.0 from University of Southern
.\" California Information Sciences Institute (USC-ISI).
.\"
.\" dig.1 2.0 (USC-ISI) 8/30/90
.\"
.\" Man page reformatted for this release by Andrew Cherenson
.\" (arc@sgi.com)
.\"
.TH DIG @CMD_EXT_U@ "August 30, 1990"
.SH NAME
dig \- send domain name query packets to name servers
.SH SYNOPSIS
.B dig
.RI [ @\fIserver\fP ]
.I domain
.RI [ "<query-type>" ]
.RI [ "<query-class>" ]
.RI [ "+<query-option>" ]
.RI [ "\-<dig-option>" ]
.RI [ "%comment" ]
.SH DESCRIPTION
\fIDig\fP (domain information groper) is a flexible command line tool
which can be used to gather information from the Domain
Name System servers. \fIDig\fP has two modes: simple interactive mode
which makes a single query, and batch which executes a query for
each in a list of several query lines. All query options are
accessible from the command line.
.PP
The usual simple use of \fIdig\fP will take the form:
.sp 1
dig @server domain query-type query-class
.sp 1
where:
.IP \fIserver\fP
may be either a domain name or a dot-notation
Internet address. If this optional field is omitted, \fIdig\fP
will attempt to use the default name server for your machine.
.sp 1
\fBNote:\fP If a domain name is specified, this will be resolved
using the domain name system resolver (i.e., BIND). If your
system does not support DNS, you may \fIhave\fP to specify a
dot-notation address. Alternatively, if there is a server
at your disposal somewhere, all that is required is that
/etc/resolv.conf be present and indicate where the default
name servers reside, so that \fIserver\fP itself can be
resolved. See
.IR resolver (@FORMAT_EXT@)
for information on /etc/resolv.conf.
(WARNING: Changing /etc/resolv.conf will affect
the standard resolver library and potentially several
programs which use it.) As an option, the user may set the
environment variable LOCALRES to name a file which is to
be used instead of /etc/resolv.conf (LOCALRES is specific
to the \fIdig\fP resolver and not referenced by the standard
resolver). If the LOCALRES variable is not set or the file
is not readable then /etc/resolv.conf will be used.
.IP \fIdomain\fP
is the domain name for which you are requesting information.
See OPTIONS [-x] for convenient way to specify inverse address
query.
.IP \fIquery-type\fP
is the type of information (DNS query type) that
you are requesting. If omitted, the default is "a" (T_A = address).
The following types are recognized:
.sp 1
.ta \w'hinfoXX'u +\w'T_HINFOXX'u
.nf
a T_A network address
any T_ANY all/any information about specified domain
mx T_MX mail exchanger for the domain
ns T_NS name servers
soa T_SOA zone of authority record
hinfo T_HINFO host information
axfr T_AXFR zone transfer
(must ask an authoritative server)
txt T_TXT arbitrary number of strings
.fi
.sp 1
(See RFC 1035 for the complete list.)
.IP \fIquery-class\fP
is the network class requested in the query. If
omitted, the default is "in" (C_IN = Internet).
The following classes are recognized:
.sp 1
.ta \w'hinfoXX'u +\w'T_HINFOXX'u
.nf
in C_IN Internet class domain
any C_ANY all/any class information
.fi
.sp 1
(See RFC 1035 for the complete list.)
.sp 1
\fBNote:\fP
"Any" can be used to specify a class and/or a type of
query. \fIDig\fP will parse the first occurrence of "any"
to mean query-type = T_ANY. To specify query-class =
C_ANY you must either specify "any" twice, or set
query-class using "\-c" option (see below).
.SH OTHER OPTIONS
.IP "%ignored-comment"
"%" is used to included an argument that is simply not
parsed. This may be useful if running \fIdig\fP in batch
mode. Instead of resolving every @server-domain-name in
a list of queries, you can avoid the overhead of doing
so, and still have the domain name on the command line
as a reference. Example:
.sp 1
dig @128.9.0.32 %venera.isi.edu mx isi.edu
.sp 1
.IP "\-<dig option>"
"\-" is used to specify an option which effects the
operation of \fIdig\fP. The following options are currently
available (although not guaranteed to be useful):
.RS
.IP "\-x \fIdot-notation-address\fP"
Convenient form to specify inverse address mapping.
Instead of "dig 32.0.9.128.in-addr.arpa" one can
simply "dig -x 128.9.0.32".
.IP "\-f \fIfile\fP"
File for \fIdig\fP batch mode. The file contains a list
of query specifications (\fIdig\fP command lines) which
are to be executed successively. Lines beginning
with ';', '#', or '\\n' are ignored. Other options
may still appear on command line, and will be in
effect for each batch query.
.IP "\-T \fItime\fP"
Time in seconds between start of successive
queries when running in batch mode. Can be used
to keep two or more batch \fIdig\fP commands running
roughly in sync. Default is zero.
.IP "\-p \fIport\fP"
Port number. Query a name server listening to a
non-standard port number. Default is 53.
.IP "\-P[\fIping-string\fP]"
After query returns, execute a
.IR ping (@SYS_OPS_EXT@)
command
for response time comparison. This rather
inelegantly makes a call to the shell. The last
three lines of statistics is printed for the
command:
.sp 1
ping \-s server_name 56 3
.sp 1
If the optional "ping string" is present, it
replaces "ping \-s" in the shell command.
.IP "\-t \fIquery-type\fP"
Specify type of query. May specify either an
integer value to be included in the type field
or use the abbreviated mnemonic as discussed
above (i.e., mx = T_MX).
.IP "\-c \fIquery-class\fP"
Specify class of query. May specify either an
integer value to be included in the class field
or use the abbreviated mnemonic as discussed
above (i.e., in = C_IN).
.IP "\-envsav"
This flag specifies that the \fIdig\fP environment
(defaults, print options, etc.), after
all of the arguments are parsed, should be saved
to a file to become the default environment.
Useful if you do not like the standard set of
defaults and do not desire to include a
large number of options each time \fIdig\fP is used.
The environment consists of resolver state
variable flags, timeout, and retries as well as
the flags detailing \fIdig\fP output (see below).
If the shell environment variable LOCALDEF is set
to the name of a file, this is where the default
\fIdig\fP environment is saved. If not, the file
"DiG.env" is created in the current working directory.
.sp 1
\fBNote:\fP LOCALDEF is specific to the \fIdig\fP resolver,
and will not affect operation of the standard
resolver library.
.sp 1
Each time \fIdig\fP is executed, it looks for "./DiG.env"
or the file specified by the shell environment variable
LOCALDEF. If such file exists and is readable, then the
environment is restored from this file
before any arguments are parsed.
.IP "\-envset"
This flag only affects
batch query runs. When "\-envset" is
specified on a line in a \fIdig\fP batch file,
the \fIdig\fP environment after the arguments are parsed,
becomes the default environment for the duration of
the batch file, or until the next line which specifies
"\-envset".
.IP "\-[no]stick"
This flag only affects batch query runs.
It specifies that the \fIdig\fP environment (as read initially
or set by "\-envset" switch) is to be restored before each query
(line) in a \fIdig\fP batch file.
The default "\-nostick" means that the \fIdig\fP environment
does not stick, hence options specified on a single line
in a \fIdig\fP batch file will remain in effect for
subsequent lines (i.e. they are not restored to the
"sticky" default).
.RE
.IP "+<query option>"
"+" is used to specify an option to be changed in the
query packet or to change \fIdig\fP output specifics. Many
of these are the same parameters accepted by
.IR nslookup (@SYS_OPS_EXT@).
If an option requires a parameter, the form is as
follows:
.sp 1
+keyword[=value]
.sp 1
Most keywords can be abbreviated. Parsing of the "+"
options is very simplistic \(em a value must not be
separated from its keyword by white space. The following
keywords are currently available:
.sp 1
.nf
.ta \w'domain=NAMEXX'u +\w'(deb)XXX'u
Keyword Abbrev. Meaning [default]
[no]debug (deb) turn on/off debugging mode [deb]
[no]d2 turn on/off extra debugging mode [nod2]
[no]recurse (rec) use/don't use recursive lookup [rec]
retry=# (ret) set number of retries to # [4]
time=# (ti) set timeout length to # seconds [4]
[no]ko keep open option (implies vc) [noko]
[no]vc use/don't use virtual circuit [novc]
[no]defname (def) use/don't use default domain name [def]
[no]search (sea) use/don't use domain search list [sea]
domain=NAME (do) set default domain name to NAME
[no]ignore (i) ignore/don't ignore trunc. errors [noi]
[no]primary (pr) use/don't use primary server [nopr]
[no]aaonly (aa) authoritative query only flag [noaa]
[no]sort (sor) sort resource records [nosor]
[no]cmd echo parsed arguments [cmd]
[no]stats (st) print query statistics [st]
[no]Header (H) print basic header [H]
[no]header (he) print header flags [he]
[no]ttlid (tt) print TTLs [tt]
[no]cl print class info [nocl]
[no]qr print outgoing query [noqr]
[no]reply (rep) print reply [rep]
[no]ques (qu) print question section [qu]
[no]answer (an) print answer section [an]
[no]author (au) print authoritative section [au]
[no]addit (ad) print additional section [ad]
pfdef set to default print flags
pfmin set to minimal default print flags
pfset=# set print flags to #
(# can be hex/octal/decimal)
pfand=# bitwise and print flags with #
pfor=# bitwise or print flags with #
.fi
.sp 1
The retry and time options affect the retransmission strategy used by resolver
library when sending datagram queries. The algorithm is as follows:
.sp 1
.in +5n
.nf
for i = 0 to retry \- 1
for j = 1 to num_servers
send_query
wait((time * (2**i)) / num_servers)
end
end
.fi
.in -5n
.sp 1
(Note: \fIdig\fP always uses a value of 1 for num_servers.)
.SH DETAILS
\fIDig\fP once required a slightly modified version of the BIND
.IR resolver (@LIB_NETWORK_EXT@)
library. BIND's resolver has (as of BIND 4.9) been augmented to work
properly with \fIDig\fP. Essentially, \fIDig\fP is a straight-forward
(albeit not pretty) effort of parsing arguments and setting appropriate
parameters. \fIDig\fP uses resolver routines res_init(), res_mkquery(),
res_send() as well as accessing _res structure.
.SH FILES
.ta \w'/etc/resolv.confXX'u
/etc/resolv.conf initial domain name and name server
\./DiG.env default save file for default options
.br
addresses
.SH ENVIRONMENT
LOCALRES file to use in place of /etc/resolv.conf
.br
LOCALDEF default environment file
.SH AUTHOR
Steve Hotz
hotz@isi.edu
.SH ACKNOWLEDGMENTS
\fIDig\fP uses functions from
.IR nslookup (@SYS_OPS_EXT@)
authored by Andrew Cherenson.
.SH BUGS
\fIDig\fP has a serious case of "creeping featurism" -- the result of
considering several potential uses during it's development. It would
probably benefit from a rigorous diet. Similarly, the print flags
and granularity of the items they specify make evident their
rather ad hoc genesis.
.PP
\fIDig\fP does not consistently exit nicely (with appropriate status)
when a problem occurs somewhere in the resolver (NOTE: most of the common
exit cases are handled). This is particularly annoying when running in
batch mode. If it exits abnormally (and is not caught), the entire
batch aborts; when such an event is trapped, \fIdig\fP simply
continues with the next query.
.SH SEE ALSO
@INDOT@named(@SYS_OPS_EXT@), resolver(@LIB_NETWORK_EXT@), resolver(@FORMAT_EXT@), nslookup(@SYS_OPS_EXT@)

View File

@ -1,164 +0,0 @@
.TH DNSQUERY @CMD_EXT_U@ "10 March 1990"
.UC 6
.SH NAME
dnsquery \- query domain name servers using resolver
.SH SYNOPSIS
.B dnsquery
[-n
.I nameserver]
[-t
.I type]
[-c
.I class]
[-r
.I retry]
[-p
.I retry period]
[-d] [-s] [-v] host
.SH DESCRIPTION
The
.IR dnsquery
program is a general interface to nameservers via
BIND resolver library calls. The program supports
queries to the nameserver with an opcode of QUERY.
This program is intended to be a replacement or
supplement to programs like nstest, nsquery and
nslookup. All arguments except for
.IR host
and
.IR ns
are treated without case-sensitivity.
.SH OPTIONS
.TP 1i
.B \-n
The nameserver to be used in the query. Nameservers can appear as either
Internet addresses of the form w.x.y.z or can appear as domain names.
(default: as specified in /etc/resolv.conf)
.TP 1i
.B \-t
The type of resource record of interest. Types include:
.RS 1.5i
.TP 1i
A
address
.PD 0
.TP 1i
NS
nameserver
.TP 1i
CNAME
canonical name
.TP 1i
PTR
domain name pointer
.TP 1i
SOA
start of authority
.TP 1i
WKS
well-known service
.TP 1i
HINFO
host information
.TP 1i
MINFO
mailbox information
.TP 1i
MX
mail exchange
.TP 1i
RP
responsible person
.TP 1i
MG
mail group member
.TP 1i
AFSDB
DCE or AFS server
.TP 1i
ANY
wildcard
.RE
.PD
.IP
Note that any case may be used. (default: ANY)
.TP 1i
.B \-c
The class of resource records of interest.
Classes include:
.RS 2i
.TP 1i
IN
Internet
.PD 0
.TP 1i
HS
Hesiod
.TP 1i
CHAOS
Chaos
.TP 1i
ANY
wildcard
.RE
.PD
.IP
Note that any case may be used. (default: IN)
.TP 1i
.B \-r
The number of times to retry if the nameserver is
not responding. (default: 4)
.TP 1i
.B \-p
Period to wait before timing out. (default: RES_TIMEOUT)
.IR options
field. (default: any answer)
.TP 1i
.B \-d
Turn on debugging. This sets the RES_DEBUG bit of the resolver's
.IR options
field. (default: no debugging)
.TP 1i
.B \-s
Use a
.IR stream
rather than a packet. This uses a TCP stream connection with
the nameserver rather than a UDP datagram. This sets the
RES_USEVC bit of the resolver's
.IR options
field. (default: UDP)
.TP 1i
.B \-v
Synonym for the 's' flag.
.TP 1i
.B host
The name of the host (or domain) of interest.
.SH FILES
/etc/resolv.conf to get the default ns and search lists
.br
<arpa/nameser.h> list of usable RR types and classes
.br
<resolv.h> list of resolver flags
.SH "SEE ALSO"
nslookup(@SYS_OPS_EXT@), nstest(@CMD_EXT@), nsquery(@CMD_EXT@),
named(@SYS_OPS_EXT@), resolver(@FORMAT_EXT@)
.SH DIAGNOSTICS
If the resolver fails to answer the query and debugging has not been
turned on,
.IR dnsquery
will simply print a message like:
.TP 1i
Query failed (rc = 1) : Unknown host
.LP
The value of the return code is supplied by h_errno.
.SH BUGS
Queries of a class other than IN can have interesting results
since ordinarily a nameserver only has a list of root nameservers
for class IN resource records.
.PP
Query uses a call to inet_addr() to determine if the argument
for the '-n' option is a valid Internet address. Unfortunately,
inet_addr() seems to cause a segmentation fault with some (bad)
addresses (e.g. 1.2.3.4.5).
.SH AUTHOR
Bryan Beecher

View File

@ -1,228 +0,0 @@
.\" Copyright (c) 1983, 1987 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms are permitted provided
.\" that: (1) source distributions retain this entire copyright notice and
.\" comment, and (2) distributions including binaries display the following
.\" acknowledgement: ``This product includes software developed by the
.\" University of California, Berkeley and its contributors'' in the
.\" documentation or other materials provided with the distribution and in
.\" all advertising materials mentioning features or use of this software.
.\" 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
.\"
.\" @(#)gethostbyname.3 6.12 (Berkeley) 6/23/90
.\"
.TH GETHOSTBYNAME @LIB_NETWORK_EXT_U@ "June 23, 1990"
.UC 5
.SH NAME
gethostbyname, gethostbyaddr, gethostent, sethostent, endhostent, herror \- get network host entry
.SH SYNOPSIS
.B "#include <netdb.h>
.PP
.B "extern int h_errno;
.PP
.B "struct hostent *gethostbyname(name)
.br
.B "char *name;
.PP
.B "struct hostent *gethostbyname2(name, af)
.br
.B "char *name; int af;
.PP
.B "struct hostent *gethostbyaddr(addr, len, type)
.br
.B "char *addr; int len, type;
.PP
.B "struct hostent *gethostent()
.PP
.B "sethostent(stayopen)
.br
.B "int stayopen;
.PP
.B "endhostent()
.PP
.B "herror(string)
.br
.B "char *string;
.PP
.SH DESCRIPTION
.IR Gethostbyname ,
.IR gethostbyname2 ,
and
.I gethostbyaddr
each return a pointer to an object with the
following structure describing an internet host
referenced by name or by address, respectively.
This structure contains either the information obtained from the name server,
.IR @INDOT@named (@SYS_OPS_EXT@),
or broken-out fields from a line in
.IR /etc/hosts .
If the local name server is not running these routines do a lookup in
.IR /etc/hosts .
.RS
.PP
.nf
struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses from name server */
};
#define h_addr h_addr_list[0] /* address, for backward compatibility */
.ft R
.ad
.fi
.RE
.PP
The members of this structure are:
.TP \w'h_addr_list'u+2n
h_name
Official name of the host.
.TP \w'h_addr_list'u+2n
h_aliases
A zero terminated array of alternate names for the host.
.TP \w'h_addr_list'u+2n
h_addrtype
The type of address being returned; usually AF_INET.
.TP \w'h_addr_list'u+2n
h_length
The length, in bytes, of the address.
.TP \w'h_addr_list'u+2n
h_addr_list
A zero terminated array of network addresses for the host.
Host addresses are returned in network byte order.
.TP \w'h_addr_list'u+2n
h_addr
The first address in h_addr_list; this is for backward compatibility.
.PP
When using the nameserver,
.I gethostbyname
will search for the named host in each parent domain given in the ``search''
directive of
.IR resolv.conf (5)
unless the name contains a dot.
If the name contains no dot, and if the environment variable ``HOSTALAIASES''
contains the name of an alias file, the alias file will first be searched
for an alias matching the input name.
See
.IR hostname (@DESC_EXT@)
for the domain search procedure and the alias file format.
.PP
.I Gethostbyname2
is an evolution of
.I gethostbyname
intended to allow lookups in address families other than AF_INET, for example
AF_INET6. Currently the
.I af
argument must be specified as
.I AF_INET
else the function will return \s-2NULL\s+2 after having set
.I h_errno
to \s-2NETDB_INTERNAL\s+2.
.PP
.I Sethostent
may be used to request the use of a connected TCP socket for queries.
If the
.I stayopen
flag is non-zero,
this sets the option to send all queries to the name server using TCP
and to retain the connection after each call to
.I gethostbyname
or
.IR gethostbyaddr .
Otherwise, queries are performed using UDP datagrams.
.PP
.I Endhostent
closes the TCP connection.
.SH DIAGNOSTICS
.PP
Error return status from
.I gethostbyname
and
.I gethostbyaddr
is indicated by return of a null pointer.
The external integer
.IR h_errno
may then be checked to see whether this is a temporary failure
or an invalid or unknown host.
The routine
.I herror
can be used to print an error message describing the failure.
If its argument
.I string
is non-NULL, it is printed, followed by a colon and a space.
The error message is printed with a trailing newline.
.PP
.IR h_errno
can have the following values:
.RS
.IP NETDB_INTERNAL \w'HOST_NOT_FOUND'u+2n
This indicates an internal error in the library, unrelated to the network
or name service.
.I errno
will be valid in this case; see
.IR perror (3).
.IP HOST_NOT_FOUND \w'HOST_NOT_FOUND'u+2n
No such host is known.
.IP TRY_AGAIN \w'HOST_NOT_FOUND'u+2n
This is usually a temporary error
and means that the local server did not receive
a response from an authoritative server.
A retry at some later time may succeed.
.IP NO_RECOVERY \w'HOST_NOT_FOUND'u+2n
Some unexpected server failure was encountered.
This is a non-recoverable error.
.IP NO_DATA \w'HOST_NOT_FOUND'u+2n
The requested name is valid but does not have an IP address;
this is not a temporary error.
This means that the name is known to the name server but there is no address
associated with this name.
Another type of request to the name server using this domain name
will result in an answer;
for example, a mail-forwarder may be registered for this domain.
.RE
.SH FILES
/etc/hosts
.SH "SEE ALSO"
resolver(@LIB_NETWORK_EXT@), hosts(@FORMAT_EXT@), hostname(@DESC_EXT@), @INDOT@named(@SYS_OPS_EXT@)
.SH CAVEAT
.PP
.I Gethostent
is defined, and
.I sethostent
and
.I endhostent
are redefined,
when
.IR libc
is built to use only the routines to lookup in
.IR /etc/hosts
and not the name server.
.PP
.I Gethostent
reads the next line of
.IR /etc/hosts ,
opening the file if necessary.
.PP
.I Sethostent
is redefined to open and rewind the file. If the
.I stayopen
argument is non-zero,
the hosts data base will not be closed after each call to
.I gethostbyname
or
.IR gethostbyaddr .
.I Endhostent
is redefined to close the file.
.SH BUGS
All information
is contained in a static area
so it must be copied if it is
to be saved. Only the Internet
address format is currently understood.

View File

@ -1,133 +0,0 @@
.\" $Id: getnetent.3,v 8.2 1996/05/09 05:59:10 vixie Exp $
.TH getnetent @LIB_NETWORK_EXT_U@
.SH NAME
getnetent, getnetbyaddr, getnetbyname, setnetent, endnetent \- get networks
entry
.SH SYNTAX
.nf
.B #include <netdb.h>
.PP
.B struct netent *getnetent()
.PP
.B struct netent *getnetbyname(\fIname\fP)
.B char *\fIname\fP;
.PP
.B struct netent *getnetbyaddr(\fInet\fP, \fItype\fP)
.B unsigned long \fInet\fP; int \fItype\fP;
.PP
.B void setnetent(\fIstayopen\fP)
.B int \fIstayopen\fP;
.PP
.B void endnetent()
.fi
.SH DESCRIPTION
The
.IR getnetent ,
.IR getnetbyname ,
and
.I getnetbyaddr
subroutines
each return a pointer to an object with the
following structure
containing the broken-out
fields of a line in the
.I networks
database.
.RS
.PP
.nf
struct netent {
char *n_name; /* official name of net */
char **n_aliases; /* alias list */
int n_addrtype; /* net number type */
long n_net; /* net number */
};
.ft R
.ad
.fi
.RE
.PP
The members of this structure are:
.TP \w'n_addrtype'u+2n
n_name
The official name of the network.
.TP \w'n_addrtype'u+2n
n_aliases
A zero terminated list of alternate names for the network.
.TP \w'n_addrtype'u+2n
n_addrtype
The type of the network number returned: AF_INET.
.TP \w'n_addrtype'u+2n
n_net
The network number. Network numbers are returned in machine byte
order.
.PP
If the
.I stayopen
flag on a
.I setnetent
subroutine is NULL, the
.I networks
database is opened. Otherwise the
.I setnetent
has the effect of rewinding the
.I networks
database.
The
.I endnetent
may be called to
close the
.I networks
database when processing is complete.
.PP
The
.I getnetent
subroutine simply reads the next
line while
.I getnetbyname
and
.I getnetbyaddr
search until a matching
.I name
or
.I net
number is found
(or until EOF is encountered). The \fItype\fP must be AF_INET.
The
.I getnetent
subroutine keeps a pointer in the database, allowing
successive calls to be used
to search the entire file.
.PP
A call to
.I setnetent
must be made before a
.I while
loop using
.I getnetent
in order to perform initialization and an
.I endnetent
must be used after the loop. Both
.I getnetbyname
and
.I getnetbyaddr
make calls to
.I setnetent
and
.I endnetent .
.SH FILES
.I /etc/networks
.SH DIAGNOSTICS
Null pointer (0) returned on EOF or error.
.SH SEE ALSO
.nf
networks(@FORMAT_EXT@)
RFC 1101
.SH HISTORY
The getnetent(), getnetbyaddr(), getnetbyname(), setnetent(), and
endnetent() functions appeared in 4.2BSD.
.SH BUGS
The data space used by these functions is static; if future use requires the
data, it should be copied before any subsequent calls to these functions
overwrite it. Only Internet network numbers are currently understood.
Expecting network numbers to fit in no more than 32 bits is probably naive.

View File

@ -1,207 +0,0 @@
.\" ++Copyright++ 1993
.\" -
.\" Copyright (c) 1993
.\" 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.
.\" -
.\" Portions Copyright (c) 1993 by Digital Equipment Corporation.
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies, and that
.\" the name of Digital Equipment Corporation not be used in advertising or
.\" publicity pertaining to distribution of the document or software without
.\" specific, written prior permission.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
.\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
.\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
.\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
.\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\" -
.\" --Copyright--
.\" $Id: host.1,v 8.1 1994/12/15 06:24:10 vixie Exp $
.TH HOST @CMD_EXT_U@
.SH NAME
host \- look up host names using domain server
.SH SYNOPSIS
host [-l] [-v] [-w] [-r] [-d] [-t querytype] [-a] host [ server ]
.SH DESCRIPTION
.I Host
looks for information about Internet hosts. It gets this information
from a set of interconnected servers that are spread across the
country. By default, it simply converts between host names and
Internet addresses. However with the -t or -a options, it can be used
to find all of the information about this host that is maintained
by the domain server.
.PP
The arguments can be either host names or host numbers. The program
first attempts to interpret them as host numbers. If this fails,
it will treat them as host names. A host number consists of
first decimal numbers separated by dots, e.g. 128.6.4.194
A host name
consists of names separated by dots, e.g. topaz.rutgers.edu.
Unless the name ends in a dot, the local domain
is automatically tacked on the end. Thus a Rutgers user can say
"host topaz", and it will actually look up "topaz.rutgers.edu".
If this fails, the name is tried unchanged (in this case, "topaz").
This same convention is used for mail and other network utilities.
The actual suffix to tack on the end is obtained
by looking at the results of a "hostname" call, and using everything
starting at the first dot. (See below for a description of
how to customize the host name lookup.)
.PP
The first argument is the host name you want to look up.
If this is a number, an "inverse query" is done, i.e. the domain
system looks in a separate set of databases used to convert numbers
to names.
.PP
The second argument is optional. It
allows you to specify a particular server to query. If you don't
specify this argument, the default server (normally the local machine)
is used.
.PP
If a name is specified, you may see output of three different kinds.
Here is an example that shows all of them:
.br
% host sun4
.br
sun4.rutgers.edu is a nickname for ATHOS.RUTGERS.EDU
.br
ATHOS.RUTGERS.EDU has address 128.6.5.46
.br
ATHOS.RUTGERS.EDU has address 128.6.4.4
.br
ATHOS.RUTGERS.EDU mail is handled by ARAMIS.RUTGERS.EDU
.br
The user has typed the command "host sun4". The first line indicates
that the name "sun4.rutgers.edu" is actually a nickname. The official
host name is "ATHOS.RUTGERS.EDU'. The next two lines show the
address. If a system has more than one network interface, there
will be a separate address for each. The last line indicates
that ATHOS.RUTGERS.EDU does not receive its own mail. Mail for
it is taken by ARAMIS.RUTGERS.EDU. There may be more than one
such line, since some systems have more than one other system
that will handle mail for them. Technically, every system that
can receive mail is supposed to have an entry of this kind. If
the system receives its own mail, there should be an entry
the mentions the system itself, for example
"XXX mail is handled by XXX". However many systems that receive
their own mail do not bother to mention that fact. If a system
has a "mail is handled by" entry, but no address, this indicates
that it is not really part of the Internet, but a system that is
on the network will forward mail to it. Systems on Usenet, Bitnet,
and a number of other networks have entries of this kind.
.PP
There are a number of options that can be used before the
host name. Most of these options are meaningful only to the
staff who have to maintain the domain database.
.PP
The option -w causes host to wait forever for a response. Normally
it will time out after around a minute.
.PP
The option -v causes printout to be in a "verbose" format. This
is the official domain master file format, which is documented
in the man page for "named". Without this option, output still follows
this format in general terms, but some attempt is made to make it
more intelligible to normal users. Without -v,
"a", "mx", and "cname" records
are written out as "has address", "mail is handled by", and
"is a nickname for", and TTL and class fields are not shown.
.PP
The option -r causes recursion to be turned off in the request.
This means that the name server will return only data it has in
its own database. It will not ask other servers for more
information.
.PP
The option -d turns on debugging. Network transactions are shown
in detail.
.PP
The option -t allows you to specify a particular type of information
to be looked up. The arguments are defined in the man page for
"named". Currently supported types are a, ns, md, mf, cname,
soa, mb, mg, mr, null, wks, ptr, hinfo, minfo, mx, uinfo,
uid, gid, unspec, and the wildcard, which may be written
as either "any" or "*". Types must be given in lower case.
Note that the default is to look first for "a", and then "mx", except
that if the verbose option is turned on, the default is only "a".
.PP
The option -a (for "all") is equivalent to "-v -t any".
.PP
The option -l causes a listing of a complete domain. E.g.
.br
host -l rutgers.edu
.br
will give a listing of all hosts in the rutgers.edu domain. The -t
option is used to filter what information is presented, as you
would expect. The default is address information, which also
include PTR and NS records. The command
.br
host -l -v -t any rutgers.edu
.br
will give a complete download of the zone data for rutgers.edu,
in the official master file format. (However the SOA record is
listed twice, for arcane reasons.) NOTE: -l is implemented by
doing a complete zone transfer and then filtering out the information
the you have asked for. This command should be used only if it
is absolutely necessary.
.SH CUSTOMIZING HOST NAME LOOKUP
In general, if the name supplied by the user does not
have any dots in it, a default domain is appended to the end.
This domain can be defined in /etc/resolv.conf, but is normally derived
by taking the local hostname after its first dot. The user can override
this, and specify a different default domain, using the environment
variable
.IR LOCALDOMAIN .
In addition, the user can supply his own abbreviations for host names.
They should be in a file consisting of one line per abbreviation.
Each line contains an abbreviation, a space, and then the full
host name. This file must be pointed to by an environment variable
.IR HOSTALIASES ,
which is the name of the file.
.SH "See Also"
@INDOT@named (@SYS_OPS_EXT@)
.SH BUGS
Unexpected effects can happen when you type a name that is not
part of the local domain. Please always keep in mind the
fact that the local domain name is tacked onto the end of every
name, unless it ends in a dot. Only if this fails is the name
used unchanged.
.PP
The -l option only tries the first name server listed for the
domain that you have requested. If this server is dead, you
may need to specify a server manually. E.g. to get a listing
of foo.edu, you could try "host -t ns foo.edu" to get a list
of all the name servers for foo.edu, and then try "host -l foo.edu xxx"
for all xxx on the list of name servers, until you find one that
works.

View File

@ -1,108 +0,0 @@
.\" Copyright (c) 1987 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms are permitted
.\" provided that the above copyright notice and this paragraph are
.\" duplicated in all such forms and that any documentation,
.\" advertising materials, and other materials related to such
.\" distribution and use acknowledge that the software was developed
.\" by the University of California, Berkeley. The name of the
.\" University may not be used to endorse or promote products derived
.\" from this software without specific prior written permission.
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
.\"
.\" @(#)hostname.7 6.4 (Berkeley) 1/16/90
.\"
.TH HOSTNAME @DESC_EXT_U@ "February 16, 1994"
.UC 5
.SH NAME
hostname \- host name resolution description
.SH DESCRIPTION
Hostnames are domains. A domain is a hierarchical, dot-separated list
of subdomains. For example, the machine \fImonet\fP, in the \fIBerkeley\fP
subdomain of the \fIEDU\fP subdomain of the Internet Domain Name System
would be represented as
.br
\fImonet\fP.\fIBerkeley\fP.\fIEDU\fP
.br
(with no trailing dot).
.PP
Hostnames are often used with network client and server programs,
which must generally translate the name to an address for use.
(This task is usually performed by the library routine
.IR gethostbyname (@LIB_NETWORK_EXT@).)
The default method for resolving hostnames by the Internet name resolver is
to follow \s-1RFC\s+1 1535's security recommendations. Actions can be taken
by the administrator to override these recommendations and to have the
resolver behave the same as earlier, non-\s-1RFC\s+1 1535 resolvers.
.PP
The default method (using \s-1RFC\s+1 1535 guidelines) follows:
.PP
If the name consists of a single component, i.e. contains no dot, and if the
environment variable ``\s-1HOSTALIASES\s+1'' is set to the name of a file,
that file is searched for a string matching the input hostname. The file
should consist of lines made up of two strings separated by white-space, the
first of which is the hostname alias, and the second of which is the complete
hostname to be substituted for that alias. If a case-insensitive match is
found between the hostname to be resolved and the first field of a line in
the file, the substituted name is looked up with no further processing.
.PP
If there is at least one dot in the name, then the name is first tried as
is. The number of dots to cause this action is configurable by setting the
threshold using the ``\fIndots\fP'' option in
.I /etc/resolv.conf
(default: \fI1\fP). If the name ends with a dot, the trailing dot is
removed, and the remaining name is looked up (regardless of the setting of
the 'ndots' option) and no further processing is done.
.PP
If the input name does not end with a trailing dot, it is looked up by
searching through a list of domains until a match is found. If neither the
search option in the
.I /etc/resolv.conf
file or the ``\s-1LOCALDOMAIN\s+1'' environment variable is used, then the
search list of domains contains only the full domain specified by the domain
option (in
.IR /etc/resolv.conf )
or the domain used in the local hostname (see
.IR hostname (@CMD_EXT@)
and
.IR resolver (@FORMAT_EXT@)).
For example, if the ``\fIdomain\fP'' option is set to \fICS.Berkeley.EDU\fP,
then only CS.Berkeley.EDU will be in the search list and will be the only
domain appended to the partial hostname, for example, ``\fIlithium\fP'',
making \fIlithium.CS.Berkeley.EDU\fP the only name to be tried using the
search list.
.PP
If the search option is used in
.I /etc/resolv.conf
or the environment variable, ``\s-1LOCALDOMAIN\s+1'' is set by the user, then
the search list will include what is set by these methods. For
example, if the ``\fIsearch\fP'' option contained
.br
\fICS.Berkeley.EDU CChem.Berkeley.EDU Berkeley.EDU\fP
.br
then the partial hostname (e.g., ``\fIlithium\fP'') will be tried with each
domainname appended (in the same order specified). The resulting hostnames
that would be tried are:
.nf
\fIlithium.CS.Berkeley.EDU\fP
\fIlithium.CChem.Berkeley.EDU\fP
\fIlithium.Berkeley.EDU\fP
.fi
.PP
The environment variable ``\s-1LOCALDOMAIN\s+1'' overrides the
``\fIsearch\fP'' and ``\fIdomain\fP'' options, and if both search and domain
options are present in the resolver configuration file, then only the last
one listed is used (see
.IR resolver (@FORMAT_EXT@)).
.PP
If the name was not previously tried ``as is'' (i.e., it fell below the
``\fIndots\fP'' threshold or did not contain a dot), then the name as
originally provided is attempted.
.SH SEE ALSO
.IR gethostbyname (@LIB_NETWORK_EXT@),
.IR resolver (@FORMAT_EXT@),
.IR mailaddr (@DESC_EXT@),
.IR @INDOT@named (@SYS_OPS_EXT@)

View File

@ -1,135 +0,0 @@
.\" Copyright (c) 1983, 1987 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms are permitted
.\" provided that the above copyright notice and this paragraph are
.\" duplicated in all such forms and that any documentation,
.\" advertising materials, and other materials related to such
.\" distribution and use acknowledge that the software was developed
.\" by the University of California, Berkeley. The name of the
.\" University may not be used to endorse or promote products derived
.\" from this software without specific prior written permission.
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
.\"
.\" @(#)mailaddr.7 6.5 (Berkeley) 2/14/89
.\"
.TH MAILADDR @DESC_EXT_U@ "February 14, 1989"
.UC 5
.SH NAME
mailaddr \- mail addressing description
.SH DESCRIPTION
Mail addresses are based on the ARPANET protocol listed at the end of this
manual page. These addresses are in the general format
.PP
user@domain
.PP
where a domain is a hierarchical dot separated list of subdomains. For
example, the address
.PP
eric@monet.berkeley.edu
.PP
is normally interpreted from right to left: the message should go to the
ARPA name tables (which do not correspond exactly to the physical ARPANET),
then to the Berkeley gateway, after which it should go to the local host
monet. When the message reaches monet it is delivered to the user ``eric''.
.PP
Unlike some other forms of addressing, this does not imply any routing.
Thus, although this address is specified as an ARPA address, it might
travel by an alternate route if that were more convenient or efficient.
For example, at Berkeley, the associated message would probably go directly
to monet over the Ethernet rather than going via the Berkeley ARPANET
gateway.
.SS Abbreviation.
.PP
Under certain circumstances it may not be necessary to type the entire
domain name. In general, anything following the first dot may be omitted
if it is the same as the domain from which you are sending the message.
For example, a user on ``calder.berkeley.edu'' could send to ``eric@monet''
without adding the ``berkeley.edu'' since it is the same on both sending
and receiving hosts.
.PP
Certain other abbreviations may be permitted as special cases. For
example, at Berkeley, ARPANET hosts may be referenced without adding
the ``berkeley.edu'' as long as their names do not conflict with a local
host name.
.SS Compatibility.
.PP
Certain old address formats are converted to the new format to provide
compatibility with the previous mail system. In particular,
.PP
user@host.ARPA
.PP
is allowed and
.PP
host:user
.PP
is converted to
.PP
user@host
.PP
to be consistent with the \fIrcp\fP(@CMD_EXT@) command.
.PP
Also, the syntax
.PP
host!user
.PP
is converted to:
.PP
user@host.UUCP
.PP
This is normally converted back to the ``host!user'' form before being sent
on for compatibility with older UUCP hosts.
.PP
The current implementation is not able to route messages automatically through
the UUCP network. Until that time you must explicitly tell the mail system
which hosts to send your message through to get to your final destination.
.SS Case Distinctions.
.PP
Domain names (i.e., anything after the ``@'' sign) may be given in any mixture
of upper and lower case with the exception of UUCP hostnames. Most hosts
accept any combination of case in user names, with the notable exception of
MULTICS sites.
.SS Route-addrs.
.PP
Under some circumstances it may be necessary to route a message through
several hosts to get it to the final destination. Normally this routing
is done automatically, but sometimes it is desirable to route the message
manually. Addresses which show these relays are termed ``route-addrs.''
These use the syntax:
.PP
<@hosta,@hostb:user@hostc>
.PP
This specifies that the message should be sent to hosta, from there to hostb,
and finally to hostc. This path is forced even if there is a more efficient
path to hostc.
.PP
Route-addrs occur frequently on return addresses, since these are generally
augmented by the software at each host. It is generally possible to ignore
all but the ``user@domain'' part of the address to determine the actual
sender.
.SS Postmaster.
.PP
Every site is required to have a user or user alias designated ``postmaster''
to which problems with the mail system may be addressed.
.SS Other Networks.
.PP
Some other networks can be reached by giving the name of the network as the
last component of the domain. \fIThis is not a standard feature\fP and may
not be supported at all sites. For example, messages to CSNET or BITNET sites
can often be sent to ``user@host.CSNET'' or ``user@host.BITNET'' respectively.
.SH BUGS
The RFC822 group syntax (``group:user1,user2,user3;'') is not supported
except in the special case of ``group:;'' because of a conflict with old
berknet-style addresses.
.PP
Route-Address syntax is grotty.
.PP
UUCP- and ARPANET-style addresses do not coexist politely.
.SH SEE ALSO
mail(@CMD_EXT@), sendmail(@SYS_OPS_EXT@);
Crocker, D. H.,
.ul
Standard for the Format of Arpa Internet Text Messages,
RFC822.

View File

@ -1,146 +0,0 @@
.\" ++Copyright++ 1985
.\" -
.\" 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.
.\" -
.\" Portions Copyright (c) 1993 by Digital Equipment Corporation.
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies, and that
.\" the name of Digital Equipment Corporation not be used in advertising or
.\" publicity pertaining to distribution of the document or software without
.\" specific, written prior permission.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
.\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
.\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
.\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
.\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\" -
.\" --Copyright--
.\"
.\" from named.8 6.6 (Berkeley) 2/14/89
.\"
.TH @XFER_INDOT_U@NAMED-XFER @SYS_OPS_EXT_U@ "June 26, 1993"
.UC 4
.SH NAME
@XFER_INDOT@named-xfer \- ancillary agent for inbound zone transfers
.SH SYNOPSIS
.B named-xfer
.B \-z
.I zone_to_transfer
.B \-f
.I db_file
.B \-s
.I serial_no
[
.B \-d
.I debuglevel
] [
.B \-l
.I debug_log_file
] [
.B \-t
.I trace_file
] [
.B \-p
.I port#
] [
.B \-S
]
.I nameserver
...
.SH DESCRIPTION
.I Named-xfer
is an ancillary program executed by
.IR @INDOT@named (@SYS_OPS_EXT@)
to perform an inbound zone transfer. It is rarely executed directly, and
only by system administrators who are trying to debug a zone transfer problem.
See RFC's 1033, 1034, and 1035 for more information on the Internet
name-domain system.
.PP
Options are:
.TP
.B \-z
specifies the name of the zone to be transferred.
.TP
.B \-f
specifies the name of the file into which the zone should be dumped
when it is received from the primary server.
.TP
.B \-s
specifies the serial number of our current copy of this zone. If the
\s-1SOA RR\s+1 we get from the primary server does not have a serial
number higher than this, the transfer will be aborted.
.TP
.B \-d
Print debugging information.
A number after the ``d'' determines the level of
messages printed.
.TP
.B \-l
Specifies a log file for debugging messages. The default is system-
dependent but is usually in
.I /var/tmp
or
.IR /usr/tmp .
Note that this only applies if
.I \-d
is also specified.
.TP
.B \-t
Specifies a trace file which will contain a protocol trace of the zone
transfer. This is probably only of interest to people debugging the name
server itself.
.TP
.B \-p
Use a different port number. The default is the standard port number
as returned by getservbyname(@LIB_NETWORK_EXT@) for service ``domain''.
.TP
.B \-S
Perform a restricted transfer of only the SOA, NS records and glue A records
for the zone. The SOA record will not be loaded by named but will be used to
determine when to verify the NS records. See the ``stubs'' directive in
.IR @INDOT@named (@SYS_OPS_EXT@)
for more information.
.PP
Additional arguments are taken as name server addresses in so-called
``dotted-quad'' syntax only; no host name are allowed here. At least
one address must be specified. Any additional addresses will be tried
in order if the first one fails to transfer to us successfully.
.SH "SEE ALSO"
@INDOT@named(@SYS_OPS_EXT@), resolver(@LIB_NETWORK_EXT@), resolver(@FORMAT_EXT@), hostname(@DESC_EXT@),
RFC 882, RFC 883, RFC 973, RFC 974, RFC 1033, RFC 1034, RFC 1035, RFC 1123,
\fIName Server Operations Guide for \s-1BIND\s+1\fR

View File

@ -1,441 +0,0 @@
.\" ++Copyright++ 1985
.\" -
.\" 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.
.\" -
.\" Portions Copyright (c) 1993 by Digital Equipment Corporation.
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies, and that
.\" the name of Digital Equipment Corporation not be used in advertising or
.\" publicity pertaining to distribution of the document or software without
.\" specific, written prior permission.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
.\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
.\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
.\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
.\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\" -
.\" --Copyright--
.\"
.\" @(#)named.8 6.6 (Berkeley) 2/14/89
.\"
.TH @INDOT_U@NAMED @SYS_OPS_EXT_U@ "June 20, 1995"
.UC 4
.SH NAME
@INDOT@named \- Internet domain name server
.SH SYNOPSIS
.B @INDOT@named
[
.B \-d
.I debuglevel
] [
.B \-p
.IR port# [\fB/\fP\fIlocalport#\fP]
] [{\-b}
.I bootfile
] [
.B \-q
] [
.B \-r
]
.SH DESCRIPTION
.I Named
is the Internet domain name server.
See RFC's 1033, 1034, and 1035 for more information on the Internet
name-domain system. Without any arguments,
.I named
will read the default boot file
.IR /etc/named.boot ,
read any initial data and listen for queries.
.PP
Options are:
.TP
.B \-d
Print debugging information.
A number after the ``d'' determines the level of
messages printed.
.TP
.B \-p
Use nonstandard port numbers. The default is the standard port number
as returned by getservbyname(@LIB_NETWORK_EXT@) for service ``domain''.
The argument can specify two port numbers separated by a slash (``\fB/\fP'')
in which case the first port is that used when contacting remote servers,
and the second one is the service port bound by the local instance of
.IR named .
This is used mostly for debugging purposes.
.TP
.B \-b
Use an alternate boot file. This is optional and allows you to
specify a file with a leading dash.
.TP
.B \-q
Trace all incoming queries if \fInamed\fP has been compiled with
\fIQRYLOG\fP defined. \fINOTE:\fP this option is deprecated in favour
of the boot file directive ``options query-log''.
.TP
.B \-r
Turns recursion off in the server. Answers can come only from local
(primary or secondary) zones. This can be used on root servers.
\fINOTE:\fP this option is deprecated in favour
of the boot file directive ``options no-recursion''.
.PP
Any additional argument is taken as the name of the boot file.
If multiple boot files are specified, only the last is used.
.PP
The boot file contains information about where the name server is to get
its initial data.
Lines in the boot file cannot be continued on subsequent lines.
The following is a small example:
.in +2m
.nf
;
; boot file for name server
;
directory /usr/local/adm/named
.ta \w'check-names\ 'u +\w'6.32.128.IN-ADDR.ARPA\ 'u +\w'128.32.137.8 128.32.137.3\ 'u
; 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
limit transfers-in 10
limit datasize 64M
limit files 256
options forward-only query-log fake-iquery
check-names primary fail
check-names secondary warn
check-names response ignore
.DT
.fi
.in
The ``directory'' line causes the server to change its working directory to
the directory specified. This can be important for the correct processing
of \s-1$INCLUDE\s+1 files in primary zone files.
.LP
The ``cache'' line specifies that data in ``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 ``hints'' to find the current root servers. The file ``root.cache'' is
in the same format as ``berkeley.edu.zone''. There can be more than one
``cache'' file specified. The ``root.cache'' file should be retrieved
periodically from \s-1FTP.RS.INTERNIC.NET\s+1 since it contains a list of
root servers, and this list changes periodically.
.LP
The first example ``primary'' line states that the file
``berkeley.edu.zone'' contains authoritative data for the ``Berkeley.EDU''
zone. The file ``berkeley.edu.zone'' contains data in the master file
format described in RFC 883. All domain names are relative to the origin, in
this case, ``Berkeley.EDU'' (see below for a more detailed description).
The second ``primary'' line states that the file ``ucbhosts.rev'' contains
authoritative data for the domain ``32.128.IN-ADDR.ARPA,'' which is used to
translate addresses in network 128.32 to hostnames. Each master file should
begin with an SOA record for the zone (see below).
.LP
The first example ``secondary'' line specifies that all authoritative data
under ``CC.Berkeley.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
transferred 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. If no file name is given, a temporary file will be used, and will
be deleted after each successful zone transfer. This is not recommended
since it is a needless waste of bandwidth. The second example ``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.
.LP
The ``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 ``forward-only'' 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 direct access
to the Internet, but wish to look up exterior names anyway.
.LP
The ``slave'' line (deprecated) is allowed for backward compatibility. Its
meaning is identical to ``options forward-only''.
.LP
The ``sortlist'' line can be used to indicate networks that are to be
preferred over other 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.
.LP
The ``xfrnets'' directive (not shown) can be used to implement primitive
access control. If this directive is given, then your name server will
only answer zone transfer requests from hosts which are on networks listed
in your ``xfrnets'' directives. This directive may also be given as
``tcplist'' for compatibility with older, interim servers.
.LP
The ``include'' directive (not shown) can be used to process the contents
of some other file as though they appeared in place of the ``include''
directive. This is useful if you have a lot of zones or if you have
logical groupings of zones which are maintained by different people.
The ``include'' directive takes one argument, that being the name of the
file whose contents are to be included. No quotes are necessary around
the file name.
.LP
The ``bogusns'' directive (not shown) tells \s-1BIND\s+1 that no queries
are to be sent to the specified name server addresses (which are specified
as dotted quads, not as domain names). This is useful when you know that
some popular server has bad data in a zone or cache, and you want to avoid
contamination while the problem is being fixed.
.LP
The ``limit'' directive can be used to change \s-1BIND\s+1's internal limits,
some of which (\fBdatasize\fP, for example) are implemented by the system and
others (like \fBtransfers-in\fP) by \s-1BIND\s+1 itself. The number following
the limit name can be scaled by postfixing a ``k,'' ``m,'' or ``g'' for
kilobytes, megabytes, and gigabytes respectively.
\fBdatasize\fP's argument sets the process data size enforced by the kernel.
\fINote:\fP not all systems provide a call to implement this -- on such
systems, the use of the \fBdatasize\fP parameter of ``limit'' will result in
a warning message.
\fBtransfers-in\fP's argument is the number of \fInamed-xfer\fP subprocesses
which \s-1BIND\s+1 will spawn at any one time.
\fBtransfers-per-ns\fP's argument is the maximum number of zone transfers to
be simultaneously initiated to any given remote name server.
\fBfiles\fP's argument sets the number of file descriptors available to
the process. \fINote:\fP not all systems provide a call to implement
this -- on such systems, the use of the \fBfiles\fP parameter of ``limit''
will result in a warning message.
.LP
The ``options'' directive introduces a boolean specifier that changes the
behaviour of \s-1BIND\s+1. More than one option can be specified in a single
directive. The currently defined options are as follows:
\fBno-recursion\fP, which will cause \s-1BIND\s+1 to answer with a referral
rather than actual data whenever it receives a query for a name it is not
authoritative for -- don't set this on a server that is listed in any host's
\fIresolv.conf\fP file;
\fBno-fetch-glue\fP, which keeps \s-1BIND\s+1 from fetching missing glue when
constructing the ``additional data'' section of a response; this can be used
in conjunction with \fBno-recursion\fP to prevent \s-1BIND\s+1's cache from
ever growing in size or becoming corrupted;
\fBquery-log\fP, which causes all queries to be logged via
syslog(@SYS_OPS_EXT@) -- this is a lot of data, don't turn it on lightly;
\fBforward-only\fP, which causes the server to query only its forwarders --
this option is normally used on machine that wishes to run a server but for
physical or administrative reasons cannot be given access to the Internet;
and \fBfake-iquery\fP, which tells \s-1BIND\s+1 to send back a useless and
bogus reply to ``inverse queries'' rather than responding with an error --
this is helpful if you have a lot of microcomputers or SunOS hosts or both.
.LP
The ``check-names'' directive tells \s-1BIND\s+1 to check names in either
``primary'' or ``secondary'' zone files, or in messages (``response'')
received during recursion (for example, those which would be forwarded back
to a firewalled requestor). For each type of name,
\s-1BIND\s+1 can be told to ``fail'', such that a zone would not be loaded
or a response would not be cached or forwarded, or merely ``warn'' which
would cause a message to be emitted in the system operations logs, or to
``ignore'' the badness of a name and process it in the traditional fashion.
Names are considered good if they match RFC 952's expectations (if they are
host names), or if they consist only of printable \s-1ASCII\s+1 characters
(if they are not host names).
.LP
The ``max-fetch'' directive (not shown) is allowed for backward compatibility;
its meaning is identical to ``limit transfers-in''.
.PP
The master file consists of control information and a list of resource
records for objects in the zone of the forms:
.RS
.nf
$INCLUDE <filename> <opt_domain>
$ORIGIN <domain>
<domain> <opt_ttl> <opt_class> <type> <resource_record_data>
.fi
.RE
where
.I domain
is "." for root, "@" for the current origin, or a standard domain
name. If
.I domain
is a standard domain name that does not end with ``.'', the current origin
is appended to the domain. Domain names ending with ``.'' are
unmodified.
The
.I opt_domain
field is used to define an origin for the data in an included file.
It is equivalent to placing a $ORIGIN statement before the first
line of the included file. The field is optional.
Neither the
.I opt_domain
field nor $ORIGIN statements in the included file modify the current origin
for this file.
The
.I 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
.I opt_class
field is the object address type; currently only one type is supported,
.BR IN ,
for objects connected to the DARPA Internet.
The
.I type
field contains one of the following tokens; the data expected in the
.I resource_record_data
field is in parentheses.
.TP "\w'MINFO 'u"
A
a host address (dotted quad)
.IP NS
an authoritative name server (domain)
.IP MX
a mail exchanger (domain), preceded by a preference value (0..32767),
with lower numeric values representing higher logical preferences.
.IP CNAME
the canonical name for an alias (domain)
.IP 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 RFC 883)).
.IP NULL
a null resource record (no format or data)
.IP RP
a Responsible Person for some domain name (mailbox, TXT-referral)
.IP PTR
a domain name pointer (domain)
.IP HINFO
host information (cpu_type OS_type)
.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
Note that there are other resource record types, not shown here. You should
consult the \s-1BIND\s+1 Operations Guide (``\s-1BOG\s+1'') for the complete
list. Some resource record types may have been standardized in newer RFC's
but not yet implemented in this version of \s-1BIND\s+1.
.PP
Each master zone file should begin with an SOA record for the zone.
An example SOA record is as follows:
.LP
.nf
@ IN SOA ucbvax.Berkeley.EDU. rwh.ucbvax.Berkeley.EDU. (
.ta \w'x\ IN\ SOA\ 'u +\w'1989020501\ 'u
1989020501 ; serial
10800 ; refresh
3600 ; retry
3600000 ; expire
86400 ) ; minimum
.fi
.LP
The SOA specifies a serial number, which should be changed each time the
master file is changed. Note that the serial number can be given as a
dotted number, but this is a \fIvery\fP unwise thing to do since the
translation to normal integers is via concatenation rather than
multiplication and addition. You can spell out the year, month, day of
month, and 0..99 version number and still fit inside the unsigned 32-bit
size of this field. It's true that we will have to rethink this strategy in
the year 4294 (Greg.) but we're not worried about it. 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.
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 (``\s-1TTL\s+1'') 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.
.sp
The following signals have the specified effect when sent to the
server process using the
.IR kill (@CMD_EXT@)
command.
.IP SIGHUP
Causes server to read named.boot and reload the database. If the server
is built with the FORCED_RELOAD compile-time option, then SIGHUP will
also cause the server to check the serial number on all secondary zones.
Normally the serial numbers are only checked at the SOA-specified intervals.
.IP SIGINT
Dumps the current data base and cache to /var/tmp/named_dump.db
.IP SIGIOT
Dumps statistics data into /var/tmp/named.stats if the server is
compiled with -DSTATS. Statistics data is appended to the file. Some
systems use SIGABRT rather than SIGIOT for this.
.IP SIGSYS
Dumps the profiling data in /var/tmp if the server is compiled
with profiling (server forks, chdirs and exits).
.IP SIGTERM
Dumps the primary and secondary database files.
Used to save modified data on shutdown if the
server is compiled with dynamic updating enabled.
.IP SIGUSR1
Turns on debugging; each SIGUSR1 increments debug level.
(SIGEMT on older systems without SIGUSR1)
.IP SIGUSR2
Turns off debugging completely.
(SIGFPE on older systems without SIGUSR2)
.IP SIGWINCH
Toggles logging of all incoming queries via syslog(@SYS_OPS_EXT@)
(requires server to have been built with the QRYLOG option).
.SH FILES
.nf
.ta \w'/var/tmp/named_dump.db 'u
/etc/named.boot name server configuration boot file
/etc/named.pid the process id (on older systems)
/var/run/named.pid the process id (on newer systems)
/var/tmp/named_dump.db dump of the name server database
/var/tmp/named.run debug output
/var/tmp/named.stats nameserver statistics data
.fi
.SH "SEE ALSO"
kill(@CMD_EXT@), gethostbyname(@LIB_NETWORK_EXT@), signal(@SYSCALL_EXT@),
resolver(@LIB_NETWORK_EXT@), resolver(@FORMAT_EXT@), hostname(@DESC_EXT@),
RFC 882, RFC 883, RFC 973, RFC 974, RFC 1033, RFC 1034, RFC 1035, RFC 1123,
\fIName Server Operations Guide for \s-1BIND\s+1\fR

View File

@ -1,69 +0,0 @@
.\" ++Copyright++ 1987, 1993
.\" -
.\" Copyright (c) 1987, 1993
.\" 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.
.\" -
.\" Portions Copyright (c) 1993 by Digital Equipment Corporation.
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies, and that
.\" the name of Digital Equipment Corporation not be used in advertising or
.\" publicity pertaining to distribution of the document or software without
.\" specific, written prior permission.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
.\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
.\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
.\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
.\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\" -
.\" --Copyright--
.\"
.\" from hostname.7 6.4 (Berkeley) 1/16/90
.\"
.TH @INDOT_U@NAMED.RELOAD @SYS_OPS_EXT_U@ "June 26, 1993"
.UC 5
.SH NAME
@INDOT@named.reload \- cause the name server to synchronize its database
.SH DESCRIPTION
This command sends a \s-1SIGHUP\s+1 to the running name server. This
signal is documented in
.IR named (@SYS_OPS_EXT@).
.SH BUGS
Does not check to see if the name server is actually running, and could
use a stale PID cache file which may result in the death of an unrelated
process.
.SH SEE ALSO
@INDOT@named(@SYS_OPS_EXT@), @INDOT@named.restart(@SYS_OPS_EXT@)

View File

@ -1,73 +0,0 @@
.\" ++Copyright++ 1987, 1993
.\" -
.\" Copyright (c) 1987, 1993
.\" 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.
.\" -
.\" Portions Copyright (c) 1993 by Digital Equipment Corporation.
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies, and that
.\" the name of Digital Equipment Corporation not be used in advertising or
.\" publicity pertaining to distribution of the document or software without
.\" specific, written prior permission.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
.\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
.\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
.\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
.\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\" -
.\" --Copyright--
.\"
.\" from hostname.7 6.4 (Berkeley) 1/16/90
.\"
.TH @INDOT_U@NAMED.RESTART @SYS_OPS_EXT_U@ "June 26, 1993"
.UC 5
.SH NAME
@INDOT@named.restart \- stop and restart the name server
.SH DESCRIPTION
This command sends a \s-1SIGKILL\s+1 to the running name server and then
starts a new one.
.SH BUGS
Does not check to see if the name server is actually running, and could
use a stale PID cache file which may result in the death of an unrelated
process.
.PP
Does not wait after killing the old server before starting a new one; since
the server could take some time to die and the new one will experience a
fatal error if the old one isn't gone by the time it starts, you can be left
in a situation where you have no name server at all.
.SH SEE ALSO
@INDOT@named(@SYS_OPS_EXT@), @INDOT@named.reload(@SYS_OPS_EXT@)

View File

@ -1,127 +0,0 @@
.\" Copyright (c) 1994
.\" 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.
.\"
.TH @INDOT_U@NDC @SYS_OPS_EXT_U@ "November 27, 1994"
.UC 5
.SH NAME
@INDOT@ndc \- name daemon control interface
.SH SYNOPSIS
.B @INDOT@ndc
.I directive
[ ... ]
.SH DESCRIPTION
This command allows the name server administrator to send various signals
to the name server, or to restart it. Zero or more directives may be given,
from the following list:
.TP
.B status
Displays the current status of
.B @INDOT@named
as shown by
.BR ps (1).
.TP
.B dumpdb
Causes
.B @INDOT@named
to dump its database and cache to
.B /var/tmp/named_dump.db
(uses the INT signal.)
.TP
.B reload
Causes
.B @INDOT@named
to check the serial numbers of all primary and secondary zones
and to reload those that have changed (uses the HUP signal.)
.TP
.B stats
Causes
.B @INDOT@named
to dump its statistics to
.B /var/tmp/named.stats
(uses the IOT or ABRT signal.)
.TP
.B trace
Causes
.B @INDOT@named
to increment its ``tracing level'' by one. Whenever the tracing level
is nonzero, trace information will be written to
.BR /var/tmp/named.run .
Higher tracing levels result in more detailed information.
(Uses the USR1 signal.)
.TP
.B notrace
Causes
.B @INDOT@named
to set its ``tracing level'' to zero, closing
.B /var/tmp/named.run
if it is open (uses the USR2 signal.)
.TP
.B querylog
Causes
.B @INDOT@named
to toggle the ``query logging'' feature, which while on will result in a
.BR syslog (3)
of each incoming query (uses the WINCH signal.) Note that query logging
consumes quite a lot of log file space. This directive may also be given as
.BR qrylog .
.TP
.B start
Causes
.B @INDOT@named
to be started, as long as it isn't already running.
.TP
.B stop
Causes
.B @INDOT@named
to be stopped, if it is running.
.TP
.B restart
Causes
.B @INDOT@named
to be killed and restarted.
.SH BUGS
Arguments to
.B @INDOT@named
are not preserved by
.BR restart ,
or known by
.BR start .
Some mechanism for controlling the parameters and environment should exist.
.PP
Implemented as a
.BR sh (1)
script.
.SH AUTHOR
Paul Vixie (Internet Software Consortium)
.SH SEE ALSO
@INDOT@named(@SYS_OPS_EXT@),
@INDOT@named.reload(@SYS_OPS_EXT@),
@INDOT@named.restart(@SYS_OPS_EXT@)

View File

@ -1,387 +0,0 @@
.\"
.\" ++Copyright++ 1985, 1989
.\" -
.\" Copyright (c) 1985, 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.
.\" -
.\" Portions Copyright (c) 1993 by Digital Equipment Corporation.
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies, and that
.\" the name of Digital Equipment Corporation not be used in advertising or
.\" publicity pertaining to distribution of the document or software without
.\" specific, written prior permission.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
.\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
.\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
.\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
.\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\" -
.\" --Copyright--
.\"
.\" @(#)nslookup.8 5.3 (Berkeley) 6/24/90
.\"
.TH NSLOOKUP @SYS_OPS_EXT_U@ "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.internic.net is used.
(This command is a synonym for \fBlserver ns.internic.net.\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(@CMD_EXT@).
.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.internic.net., 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(@LIB_NETWORK_EXT@), resolver(@FORMAT_EXT@), @INDOT@named(@SYS_OPS_EXT@),
.br
RFC-1034 ``Domain Names \- Concepts and Facilities''
.br
RFC-1035 ``Domain Names \- Implementation and Specification''
.SH AUTHOR
Andrew Cherenson

View File

@ -1,339 +0,0 @@
.\" Copyright (c) 1985, 1995 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms are permitted provided
.\" that: (1) source distributions retain this entire copyright notice and
.\" comment, and (2) distributions including binaries display the following
.\" acknowledgement: ``This product includes software developed by the
.\" University of California, Berkeley and its contributors'' in the
.\" documentation or other materials provided with the distribution and in
.\" all advertising materials mentioning features or use of this software.
.\" 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
.\"
.\" @(#)resolver.3 6.5 (Berkeley) 6/23/90
.\" $Id: resolver.3,v 8.4 1996/05/09 05:59:10 vixie Exp $
.\"
.TH RESOLVER @LIB_NETWORK_EXT_U@ "December 11, 1995
.UC 4
.SH NAME
res_query, res_search, res_mkquery, res_send, res_init, dn_comp, dn_expand \- resolver routines
.SH SYNOPSIS
.B #include <sys/types.h>
.br
.B #include <netinet/in.h>
.br
.B #include <arpa/nameser.h>
.br
.B #include <resolv.h>
.PP
.B "res_query(dname, class, type, answer, anslen)"
.br
.B const char *dname;
.br
.B int class, type;
.br
.B u_char *answer;
.br
.B int anslen;
.PP
.B "res_search(dname, class, type, answer, anslen)"
.br
.B const char *dname;
.br
.B int class, type;
.br
.B u_char *answer;
.br
.B int anslen;
.PP
.B "res_mkquery(op, dname, class, type, data, datalen, newrr, buf, buflen)"
.br
.B int op;
.br
.B const char *dname;
.br
.B int class, type;
.br
.B const char *data;
.br
.B int datalen;
.br
.B struct rrec *newrr;
.br
.B u_char *buf;
.br
.B int buflen;
.PP
.B res_send(msg, msglen, answer, anslen)
.br
.B const u_char *msg;
.br
.B int msglen;
.br
.B u_char *answer;
.br
.B int anslen;
.PP
.B res_init()
.PP
.B dn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr)
.br
.B const char *exp_dn;
.br
.B u_char *comp_dn;
.br
.B int length;
.br
.B u_char **dnptrs, **lastdnptr;
.PP
.B dn_expand(msg, eomorig, comp_dn, exp_dn, length)
.br
.B const u_char *msg, *eomorig, *comp_dn;
.br
.B char *exp_dn;
.br
.B int length;
.PP
.B herror(const char *s)
.PP
.B hstrerror(int err)
.SH DESCRIPTION
These routines are used for making, sending and interpreting
query and reply messages with Internet domain name servers.
.PP
Global configuration and state information that is used by the
resolver routines is kept in the structure
.IR _res .
Most of the values have reasonable defaults and can be ignored.
Options
stored in
.I _res.options
are defined in
.I resolv.h
and are as follows.
Options are stored as a simple bit mask containing the bitwise ``or''
of the options enabled.
.IP RES_INIT
True if the initial name server address and default domain name are
initialized (i.e.,
.I res_init
has been called).
.IP RES_DEBUG
Print debugging messages.
.IP RES_AAONLY
Accept authoritative answers only.
With this option,
.I res_send
should continue until it finds an authoritative answer or finds an error.
Currently this is not implemented.
.IP RES_USEVC
Use TCP connections for queries instead of UDP datagrams.
.IP RES_STAYOPEN
Used with RES_USEVC to keep the TCP connection open between
queries.
This is useful only in programs that regularly do many queries.
UDP should be the normal mode used.
.IP RES_IGNTC
Unused currently (ignore truncation errors, i.e., don't retry with TCP).
.IP RES_RECURSE
Set the recursion-desired bit in queries.
This is the default.
(\c
.I res_send
does not do iterative queries and expects the name server
to handle recursion.)
.IP RES_DEFNAMES
If set,
.I res_search
will append the default domain name to single-component names
(those that do not contain a dot).
This option is enabled by default.
.IP RES_DNSRCH
If this option is set,
.I res_search
will search for host names in the current domain and in parent domains; see
.IR hostname (@DESC_EXT@).
This is used by the standard host lookup routine
.IR gethostbyname (@LIB_NETWORK_EXT@).
This option is enabled by default.
.IP RES_NOALIASES
This option turns off the user level aliasing feature controlled by
the HOSTALIASES environment variable. Network daemons should set this option.
.PP
The
.I res_init
routine
reads the configuration file (if any; see
.IR resolver (@FORMAT_EXT@))
to get the default domain name,
search list and
the Internet address of the local name server(s).
If no server is configured, the host running
the resolver is tried.
The current domain name is defined by the hostname
if not specified in the configuration file;
it can be overridden by the environment variable LOCALDOMAIN.
This environment variable may contain several blank-separated
tokens if you wish to override the
.I "search list"
on a per-process basis. This is similar to the
.I search
command in the configuration file.
Another environment variable (``RES_OPTIONS'') can be set to
override certain internal resolver options which are otherwise
set by changing fields in the
.I _res
structure or are inherited from the configuration file's
.I options
command. The syntax of the ``RES_OPTIONS'' environment variable
is explained in
.IR resolver (@FORMAT_EXT@).
Initialization normally occurs on the first call
to one of the other resolver routines.
.PP
The
.I res_query
function provides an interface to the server query mechanism.
It constructs a query, sends it to the local server,
awaits a response, and makes preliminary checks on the reply.
The query requests information of the specified
.I type
and
.I class
for the specified fully-qualified domain name
.I dname .
The reply message is left in the
.I answer
buffer with length
.I anslen
supplied by the caller.
.PP
The
.I res_search
routine makes a query and awaits a response like
.IR res_query ,
but in addition, it implements the default and search rules
controlled by the RES_DEFNAMES and RES_DNSRCH options.
It returns the first successful reply.
.PP
The remaining routines are lower-level routines used by
.IR res_query .
The
.I res_mkquery
function
constructs a standard query message and places it in
.IR buf .
It returns the size of the query, or \-1 if the query is
larger than
.IR buflen .
The query type
.I op
is usually QUERY, but can be any of the query types defined in
.IR <arpa/nameser.h> .
The domain name for the query is given by
.IR dname .
.I Newrr
is currently unused but is intended for making update messages.
.PP
The
.I res_send
routine
sends a pre-formatted query and returns an answer.
It will call
.I res_init
if RES_INIT is not set, send the query to the local name server, and
handle timeouts and retries.
The length of the reply message is returned, or
\-1 if there were errors.
.PP
The
.I dn_comp
function
compresses the domain name
.I exp_dn
and stores it in
.IR comp_dn .
The size of the compressed name is returned or \-1 if there were errors.
The size of the array pointed to by
.I comp_dn
is given by
.IR length .
The compression uses
an array of pointers
.I dnptrs
to previously-compressed names in the current message.
The first pointer points to
to the beginning of the message and the list ends with NULL.
The limit to the array is specified by
.IR lastdnptr .
A side effect of
.I dn_comp
is to update the list of pointers for
labels inserted into the message
as the name is compressed.
If
.I dnptr
is NULL, names are not compressed.
If
.I lastdnptr
is NULL, the list of labels is not updated.
.PP
The
.I dn_expand
entry
expands the compressed domain name
.I comp_dn
to a full domain name
The compressed name is contained in a query or reply message;
.I msg
is a pointer to the beginning of the message.
The uncompressed name is placed in the buffer indicated by
.I exp_dn
which is of size
.IR length .
The size of compressed name is returned or \-1 if there was an error.
.PP
The external variable
.B h_errno
is set whenever an error occurs during resolver operation. The following
definitions are given in
.BR <netdb.h> :
.PP
.nf
#define NETDB_INTERNAL -1 /* see errno */
#define NETDB_SUCCESS 0 /* no problem */
#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */
#define TRY_AGAIN 2 /* Non-Authoritive not found, or SERVFAIL */
#define NO_RECOVERY 3 /* Nonrecoverable: FORMERR, REFUSED, NOTIMP */
#define NO_DATA 4 /* Valid name, no data for requested type */
.ft R
.ad
.fi
.PP
The
.B herror
function writes a message to the diagnostic output consisting of the string
parameter
.BR s ,
the constant string ": ", and a message corresponding to the value of
.BR h_errno .
.PP
The
.B hstrerror
function returns a string which is the message text corresponding to the
value of the
.B err
parameter.
.SH FILES
/etc/resolv.conf see resolver(@FORMAT_EXT@)
.SH "SEE ALSO"
gethostbyname(@LIB_NETWORK_EXT@), @INDOT@named(@SYS_OPS_EXT@), resolver(@FORMAT_EXT@), hostname(@DESC_EXT@),
.br
RFC1032, RFC1033, RFC1034, RFC1035, RFC974,
.br
SMM:11 Name Server Operations Guide for BIND

View File

@ -1,133 +0,0 @@
.\" Copyright (c) 1986 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms are permitted
.\" provided that the above copyright notice and this paragraph are
.\" duplicated in all such forms and that any documentation,
.\" advertising materials, and other materials related to such
.\" distribution and use acknowledge that the software was developed
.\" by the University of California, Berkeley. The name of the
.\" University may not be used to endorse or promote products derived
.\" from this software without specific prior written permission.
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
.\"
.\" @(#)resolver.5 5.9 (Berkeley) 12/14/89
.\" $Id: resolver.5,v 8.3 1995/12/06 20:34:35 vixie Exp $
.\"
.TH RESOLVER @FORMAT_EXT_U@ ""November 11, 1993""
.UC 4
.SH NAME
resolver \- resolver configuration file
.SH SYNOPSIS
/etc/resolv.conf
.SH DESCRIPTION
.LP
The
.I resolver
is a set of routines in the C library (\c
.IR resolv (@LIB_NETWORK_EXT@))
that provide access to the Internet Domain Name System.
The resolver configuration file contains information that is read
by the resolver routines the first time they are invoked by a process.
The file is designed to be human readable and contains a list of
keywords with values that provide various types of resolver information.
.LP
On a normally configured system this file should not be necessary.
The only name server to be queried will be on the local machine,
the domain name is determined from the host name,
and the domain search path is constructed from the domain name.
.LP
The different configuration options are:
.TP
\fBnameserver\fP
Internet address (in dot notation) of a name server
that the resolver should query.
Up to MAXNS (currently 3) name servers may be listed,
one per keyword.
If there are multiple servers,
the resolver library queries them in the order listed.
If no \fBnameserver\fP entries are present,
the default is to use the name server on the local machine.
(The algorithm used is to try a name server, and if the query times out,
try the next, until out of name servers,
then repeat trying all the name servers
until a maximum number of retries are made).
.TP
\fBdomain\fP
Local domain name.
Most queries for names within this domain can use short names
relative to the local domain.
If no \fBdomain\fP entry is present, the domain is determined
from the local host name returned by
\fIgethostname\fP\|(@BSD_SYSCALL_EXT@);
the domain part is taken to be everything after the first `.'.
Finally, if the host name does not contain a domain part, the root
domain is assumed.
.TP
\fBsearch\fP
Search list for host-name lookup.
The search list is normally determined from the local domain name;
by default, it contains only the local domain name.
This may be changed by listing the desired domain search path
following the \fIsearch\fP keyword with spaces or tabs separating
the names.
Most resolver queries will be attempted using each component
of the search path in turn until a match is found.
Note that this process may be slow and will generate a lot of network
traffic if the servers for the listed domains are not local,
and that queries will time out if no server is available
for one of the domains.
.IP
The search list is currently limited to six domains
with a total of 256 characters.
.TP
\fBsortlist\fP
Sortlist allows addresses returned by gethostbyname to be sorted.
A sortlist is specified by IP address netmask pairs. The netmask is
optional and defaults to the natural netmask of the net. The IP address
and optional network pairs are separated by slashes. Up to 10 pairs may
be specified.
.IP
e.g. sortlist 130.155.160.0/255.255.240.0 130.155.0.0
.TP
\fBoptions\fP
Options allows certain internal resolver variables to be modified.
The syntax is
.IP
\fBoptions\fP \fIoption\fP \fI...\fP
.IP
where \fIoption\fP is one of the following:
.IP
\fBdebug\fP \(em sets RES_DEBUG in _res.options.
.IP
\fBndots:\fP\fIn\fP \(em sets a threshold for the number of dots which
must appear in a name given to \fBres_query\fP (see \fIresolver\fP(@LIB_NETWORK_EXT@))
before an \fIinitial absolute query\fP will be made. The default for
\fIn\fP is ``1'', meaning that if there are any dots in a name, the name
will be tried first as an absolute name before any \fIsearch list\fP
elements are appended to it.
.LP
The \fIdomain\fP and \fIsearch\fP keywords are mutually exclusive.
If more than one instance of these keywords is present,
the last instance wins.
.LP
The \fIsearch\fP keyword of a system's \fIresolv.conf\fP file can be
overridden on a per-process basis by setting the environment variable
``\s-1LOCALDOMAIN\s+1'' to a space-separated list of search domains.
.LP
The \fIoptions\fP keyword of a system's \fIresolv.conf\fP file can be
amended on a per-process basis by setting the environment variable
``\s-1RES_OPTIONS\s+1'' to a space-separated list of resolver options
as explained above under \fBoptions\fP.
.LP
The keyword and value must appear on a single line, and the keyword
(e.g. \fBnameserver\fP) must start the line. The value follows
the keyword, separated by white space.
.SH FILES
.I /etc/resolv.conf
.SH SEE ALSO
gethostbyname(@LIB_NETWORK_EXT@), resolver(@LIB_NETWORK_EXT@), hostname(@DESC_EXT@), @INDOT@named(@SYS_OPS_EXT@)
.br
Name Server Operations Guide for BIND

View File

@ -1,197 +0,0 @@
#
# @(#)Makefile.dist 5.4 (Berkeley) 8/15/90
# $Id: Makefile,v 8.10 1996/09/22 00:13:10 vixie Exp $
#
## ++Copyright++ 1987, 1988, 1990
## -
## Copyright (c) 1987, 1988, 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.
## -
## Portions Copyright (c) 1993 by Digital Equipment Corporation.
##
## Permission to use, copy, modify, and distribute this software for any
## purpose with or without fee is hereby granted, provided that the above
## copyright notice and this permission notice appear in all copies, and that
## the name of Digital Equipment Corporation not be used in advertising or
## publicity pertaining to distribution of the document or software without
## specific, written prior permission.
##
## THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
## WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
## OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
## CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
## DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
## -
## --Copyright--
## NOTE: customizing this Makefile is almost certainly the wrong thing to do.
## unless you are a developer and intend to run "make" here a lot of times
## per day, you should just run "make" from the top-level directory after
## configuring _that_ Makefile with the right system-dependent values.
VER = LOCAL-`date +%y%m%d.%H%M%S`
SHELL = /bin/sh
DESTDIR =
INDOT=
XFER_INDOT=
#(sunos)
#INDOT=in.
#XFER_INDOT=in.
HOSTNAMECMD = hostname || uname -n
#(these defaults are reasonable for a BSD/OS test environment;
# for real configuration, edit ../Makefile and run make from there.)
COMPINCL = ../compat/include
INCL= ../include
RES= ../res/libresolv.a
DESTSBIN = ${DESTDIR}/usr/sbin
DESTEXEC = ${DESTDIR}/usr/libexec
PIDDIR = /var/run
CC= cc
#CC= gcc2 -Wimplicit -Wunused -Wreturn-type
SHELL= /bin/sh
CDEBUG= -g
LIBS=
COMPLIB= ../compat/lib/lib44bsd.a
PATH_XFER = ${DESTEXEC}/${XFER_INDOT}named-xfer
DEFS = -D_PATH_XFER=\"${PATH_XFER}\" -D_PATH_PIDFILE=\"${PIDDIR}/named.pid\" \
-DKSYMS=\"${KSYMS}\" -DKMEM=\"${KMEM}\" -DUDPSUM=\"${UDPSUM}\"
INSTALL = install
PS=ps
IOT=ABRT
CFLAGS = ${CDEBUG} -I${INCL} -I${COMPINCL} ${DEFS}
HDRS= db_defs.h db_glob.h ns_defs.h ns_glob.h named.h pathnames.h tree.h
SRCS= db_dump.c db_load.c db_lookup.c db_reload.c db_save.c db_update.c \
db_secure.c db_glue.c \
ns_forw.c ns_init.c ns_main.c ns_maint.c ns_req.c ns_resp.c \
ns_sort.c ns_stats.c ns_validate.c ns_ncache.c \
storage.c tree.c ns_udp.c
OBJS= db_dump.o db_load.o db_lookup.o db_reload.o db_save.o db_update.o \
db_secure.o db_glue.o \
ns_forw.o ns_init.o ns_main.o ns_maint.o ns_req.o ns_resp.o \
ns_sort.o ns_stats.o ns_validate.o ns_ncache.o \
storage.o tree.o ns_udp.o
XFERSRCS= named-xfer.c
XFEROBJ= named-xfer.o db_glue.o storage.o version.o
all: named named-xfer named.reload named.restart ndc
named: ${OBJS} ${RES} ${COMPLIB} version.o
${CC} ${CDEBUG} ${LDFLAGS} -o $@ version.o ${OBJS} \
${RES} ${COMPLIB} ${LIBS}
version.o: version.c
version.c: Version.c Makefile ../Makefile ${SRCS} ${HDRS}
(u=$${USER-root} d=`pwd` h=`${HOSTNAMECMD}` t=`date`; \
sed -e "s|%WHEN%|$${t}|" -e "s|%VERSION%|"${VER}"|" \
-e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \
< Version.c > version.c)
named.reload: named.reload.sh Makefile
sed -e "s|%INDOT%|${INDOT}|" \
-e "s|%DESTSBIN%|${DESTSBIN}|" \
< named.reload.sh > named.reload
chmod +x named.reload
named.restart: named.restart.sh Makefile
sed -e "s|%INDOT%|${INDOT}|" \
-e "s|%DESTSBIN%|${DESTSBIN}|" \
< named.restart.sh > named.restart
chmod +x named.restart
ndc: ndc.sh Makefile
sed -e "s|%PIDDIR%|${PIDDIR}|" \
-e "s|%INDOT%|${INDOT}|" \
-e "s|%PS%|${PS}|" \
-e "s|%IOTPS%|${IOT}|" \
-e "s|%DESTSBIN%|${DESTSBIN}|" \
-e "s|%IOT%|${IOT}|" \
< ndc.sh > ndc
chmod +x ndc
named-xfer: ${XFEROBJ} ${RES} ${COMPLIB}
${CC} ${CDEBUG} ${LDFLAGS} -o $@ ${XFEROBJ} \
${RES} ${COMPLIB} ${LIBS}
centerline_named:
#load -I${INCL} -I${COMPINCL} ${CFLAGS} ${SRCS} \
version.c ${RES} ${COMPLIB} ${LIBS}
centerline_obj:
#load -I${INCL} -I${COMPINCL} ${CFLAGS} ${OBJS} \
version.o ${RES} ${COMPLIB} ${LIBS}
centerline_xfer:
#load -DXFER ${CFLAGS} ${XFERSRCS} ${RES} ${COMPLIB} ${LIBS}
clean:
rm -f ${OBJS} ${XFEROBJ} core named named-xfer version.o version.c
rm -f *~ *.BAK *.CKP
rm -f tags .depend core named.reload named.restart ndc
rm -f *.orig
depend .depend: ${SRCS} ${XFERSRCS}
mkdep ${CPPFLAGS} -I${INCL} -I${COMPINCL} ${SRCS} ${XFERSRCS}
install:
${INSTALL} -c -s -o bin -g bin -m 555 \
named ${DESTDIR}${DESTSBIN}/${INDOT}named
${INSTALL} -c -s -o bin -g bin -m 555 \
named-xfer ${DESTDIR}${PATH_XFER}
${INSTALL} -c -o bin -g bin -m 555 \
named.restart ${DESTDIR}${DESTSBIN}/${INDOT}named.restart
${INSTALL} -c -o bin -g bin -m 555 \
named.reload ${DESTDIR}${DESTSBIN}/${INDOT}named.reload
${INSTALL} -c -o bin -g bin -m 555 \
ndc ${DESTDIR}${DESTSBIN}/${INDOT}ndc
@echo "*** Install symlinks if needed ***"
lint: ${SRCS} ${HDRS} ${XFERSRCS}
lint -x -Dlint ${CFLAGS} ${SRCS} ${XFERSRCS} 2>&1 \
| grep -v 'warning: nested comments not supported'
tags: ${SRCS} ${XFERSRCS} Makefile
ctags -t `echo ${SRCS} ${HDRS} ${XFERSRCS}|tr ' ' '\012'|sort -u`
$(SRCS):: $(HDRS)
# DO NOT DELETE THIS LINE -- mkdep uses it.
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.

View File

@ -1,83 +0,0 @@
#
# @(#)Makefile 5.8 (Berkeley) 7/28/90
# $Id: Makefile.reno,v 8.1 1994/12/15 06:24:14 vixie Exp $
#
## ++Copyright++ 1985, 1989
## -
## Copyright (c) 1985, 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.
## -
## Portions Copyright (c) 1993 by Digital Equipment Corporation.
##
## Permission to use, copy, modify, and distribute this software for any
## purpose with or without fee is hereby granted, provided that the above
## copyright notice and this permission notice appear in all copies, and that
## the name of Digital Equipment Corporation not be used in advertising or
## publicity pertaining to distribution of the document or software without
## specific, written prior permission.
##
## THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
## WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
## OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
## CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
## DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
## -
## --Copyright--
### -DALLOW_T_UNSPEC -Dmalloc=rt_malloc -Dfree=rt_free
### ALLOC=storage.o
PROG= named
MAN8= named.0
CFLAGS= -O -DDEBUG -DSTATS
LDADD= -lutil
SRCS= db_dump.c db_glue.c db_load.c db_lookup.c db_reload.c db_save.c \
db_update.c ns_forw.c ns_init.c ns_main.c ns_maint.c ns_req.c \
ns_resp.c ns_sort.c ns_stats.c
OBJS+= version.o
CLEANFILES+=version.c version.o
SUBDIR= tools xfer
version.c: ${.CURDIR}/Version.c
(u=$${USER-root} d=`pwd |sed -e 's|/obj/|/src/|'` \
h=`hostname` t=`date`; \
sed -e "s|%WHEN%|$${t}|" \
-e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \
< ${.CURDIR}/Version.c > version.c)
afterinstall:
install -c -o ${BINOWN} -g ${BINGRP} -m 555 ${.CURDIR}/named.restart \
${.CURDIR}/named.reload ${DESTDIR}${BINDIR}
.include <bsd.prog.mk>

View File

@ -1,89 +0,0 @@
/*
* @(#)Version.c 4.9 (Berkeley) 7/21/90
* $Id: Version.c,v 8.2 1997/06/01 20:34:34 vixie Exp $
*/
#ifndef lint
char sccsid[] = "@(#)named %VERSION% %WHEN% %WHOANDWHERE%";
char rcsid[] = "$Id: Version.c,v 8.2 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
char Version[] = "named %VERSION% %WHEN%\n\t%WHOANDWHERE%";
char ShortVersion[] = "%VERSION%";
#ifdef COMMENT
SCCS/s.Version.c:
D 4.8.3 90/06/27 17:05:21 bloom 37 35 00031/00028/00079
Version distributed with 4.3 Reno tape (June 1990)
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 4.14 (Berkeley) 2/28/88
db.h
db.h 4.13 (Berkeley) 2/17/88
db_dump.c
db_dump.c 4.20 (Berkeley) 2/17/88
db_load.c
db_load.c 4.26 (Berkeley) 2/28/88
db_lookup.c
db_lookup.c 4.14 (Berkeley) 2/17/88
db_reload.c
db_reload.c 4.15 (Berkeley) 2/28/88
db_save.c
db_save.c 4.13 (Berkeley) 2/17/88
db_update.c
db_update.c 4.16 (Berkeley) 2/28/88
ns_forw.c
ns_forw.c 4.26 (Berkeley) 3/28/88
ns_init.c
ns_init.c 4.23 (Berkeley) 2/28/88
ns_main.c
Copyright (c) 1986 Regents of the University of California.\n\
ns_main.c 4.30 (Berkeley) 3/7/88
ns_maint.c
ns_maint.c 4.23 (Berkeley) 2/28/88
ns_req.c
ns_req.c 4.32 (Berkeley) 3/31/88
ns_resp.c
ns_resp.c 4.50 (Berkeley) 4/7/88
ns_sort.c
ns_sort.c 4.3 (Berkeley) 2/17/88
ns_stats.c
ns_stats.c 4.3 (Berkeley) 2/17/88
newvers.sh
newvers.sh 4.4 (Berkeley) 3/28/88
#endif /* COMMENT */

View File

@ -1,183 +0,0 @@
/*
* from db.h 4.16 (Berkeley) 6/1/90
* $Id: db_defs.h,v 8.6 1997/06/01 20:34:34 vixie Exp $
*/
/*
* ++Copyright++ 1985, 1990
* -
* Copyright (c) 1985, 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
/*
* Global definitions 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
#define DB_ROOT_TIMBUF 3600
#define TIMBUF 300
/*
* Hash table structures.
*/
struct databuf {
struct databuf *d_next; /* linked list */
#ifdef STATS
struct nameser *d_ns; /* NS from whence this came */
#endif
u_int32_t d_ttl; /* time to live */
/* if d_zone == DB_Z_CACHE, then
* d_ttl is actually the time when
* the record will expire.
* otherwise (for authoritative
* primary and secondary zones),
* d_ttl is the time to live.
*/
unsigned d_flags :7; /* see below */
unsigned d_cred :3; /* DB_C_{??????} */
unsigned d_clev :6;
int16_t d_zone; /* zone number or 0 for the cache */
int16_t d_class; /* class number */
int16_t d_type; /* type number */
int16_t d_size; /* size of data area */
u_int32_t d_rcnt;
#ifdef NCACHE
unsigned d_rcode :4; /* rcode added for negative caching */
#endif
u_int16_t d_nstime; /* NS response time, milliseconds */
u_char d_data[sizeof(char*)]; /* malloc'd (padded) */
};
#define DATASIZE(n) (sizeof(struct databuf) - sizeof(char*) + n)
/*
* d_flags definitions
*/
#define DB_F_HINT 0x01 /* databuf belongs to fcachetab */
#define DB_F_ACTIVE 0x02 /* databuf is linked into a cache */
/*
* d_cred definitions
*/
#define DB_C_ZONE 4 /* authoritative zone - best */
#define DB_C_AUTH 3 /* authoritative answer */
#define DB_C_ANSWER 2 /* non-authoritative answer */
#define DB_C_ADDITIONAL 1 /* additional data */
#define DB_C_CACHE 0 /* cache - worst */
struct namebuf {
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 */
char _n_name[sizeof(void*)]; /* Counted str, malloc'ed. */
};
#define NAMESIZE(n) (sizeof(struct namebuf) - sizeof(void*) + 1 + n + 1)
#define NAMELEN(nb) ((nb)._n_name[0])
#define NAME(nb) ((nb)._n_name + 1)
#ifdef INVQ
struct invbuf {
struct invbuf *i_next; /* linked list */
struct namebuf *i_dname[INVBLKSZ]; /* domain name */
};
#endif
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_PRIMING 0x20 /* is this update the result of priming? */
#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
/*
* getnum() options
*/
#define GETNUM_NONE 0x00 /* placeholder */
#define GETNUM_SERIAL 0x01 /* treat as serial number */
#define GETNUM_SCALED 0x02 /* permit "k", "m" suffixes, scale result */

File diff suppressed because it is too large Load Diff

View File

@ -1,104 +0,0 @@
/* db_proc.h - prototypes for functions in db_*.c
*
* $Id: db_func.h,v 8.13 1997/06/01 20:34:34 vixie Exp $
*/
/* ++from db_update.c++ */
extern int db_update __P((char name[],
struct databuf *odp,
struct databuf *newdp,
int flags,
struct hashbuf *htp)),
db_cmp __P((struct databuf *,struct databuf *)),
findMyZone __P((struct namebuf *np, int class));
extern void fixttl __P((struct databuf *dp));
/* --from db_update.c-- */
/* ++from db_reload.c++ */
extern void db_reload __P((void));
/* --from db_reload.c-- */
/* ++from db_save.c++ */
extern struct namebuf *savename __P((const char *, int));
extern struct databuf *savedata __P((int, int, u_int32_t, u_char *, int));
extern struct hashbuf *savehash __P((struct hashbuf *));
/* --from db_save.c-- */
/* ++from db_dump.c++ */
extern int db_dump __P((struct hashbuf *, FILE *, int, char *)),
zt_dump __P((FILE *)),
atob __P((char *, int, char *, int, int *));
extern void doachkpt __P((void)),
doadump __P((void));
extern u_int db_getclev __P((const char *));
/* --from db_dump.c-- */
/* ++from db_load.c++ */
extern void endline __P((FILE *)),
get_netlist __P((FILE *, struct netinfo **,
int, char *)),
free_netlist __P((struct netinfo **));
extern int getword __P((char *, int, FILE *, int)),
getnum __P((FILE *, const char *, int)),
db_load __P((const char *, const char *,
struct zoneinfo *, const char *)),
position_on_netlist __P((struct in_addr,
struct netinfo *));
extern struct netinfo *addr_on_netlist __P((struct in_addr,
struct netinfo *));
/* --from db_load.c-- */
/* ++from db_glue.c++ */
extern const char *sin_ntoa __P((const struct sockaddr_in *));
extern void panic __P((int, const char *)),
buildservicelist __P((void)),
buildprotolist __P((void)),
gettime __P((struct timeval *)),
getname __P((struct namebuf *, char *, int));
extern int servicenumber __P((char *)),
protocolnumber __P((char *)),
my_close __P((int)),
my_fclose __P((FILE *)),
#ifdef GEN_AXFR
get_class __P((char *)),
#endif
writemsg __P((int, u_char *, int)),
dhash __P((const u_char *, int)),
nhash __P((const char *)),
samedomain __P((const char *, const char *));
extern char *protocolname __P((int)),
*servicename __P((u_int16_t, char *)),
*savestr __P((const char *));
#ifndef BSD
extern int getdtablesize __P((void));
#endif
extern struct databuf *rm_datum __P((struct databuf *,
struct namebuf *,
struct databuf *));
extern struct namebuf *rm_name __P((struct namebuf *,
struct namebuf **,
struct namebuf *));
#ifdef INVQ
extern void addinv __P((struct namebuf *, struct databuf *)),
rminv __P((struct databuf *));
struct invbuf *saveinv __P((void));
#endif
extern char * ctimel __P((long));
extern struct in_addr data_inaddr __P((const u_char *data));
extern void setsignal __P((int, int, SIG_FN (*)())),
resignal __P((int, int, SIG_FN (*)()));
extern void db_free __P((struct databuf *));
/* --from db_glue.c-- */
/* ++from db_lookup.c++ */
extern struct namebuf *nlookup __P((const char *, struct hashbuf **,
const char **, int));
extern struct namebuf *np_parent __P((struct namebuf *));
extern int match __P((struct databuf *, int, int));
/* --from db_lookup.c-- */
/* ++from db_secure.c++ */
#ifdef SECURE_ZONES
extern int build_secure_netlist __P((struct zoneinfo *));
#endif
/* --from db_secure.c-- */

View File

@ -1,93 +0,0 @@
/*
* from db.h 4.16 (Berkeley) 6/1/90
* $Id: db_glob.h,v 8.4 1996/08/27 08:33:23 vixie Exp $
*/
/*
* ++Copyright++ 1985, 1990
* -
* Copyright (c) 1985, 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
/*
* Global variables for data base routines.
*/
/* ONE_WEEK maximum ttl */
DECL u_int max_cache_ttl INIT(7*24*60*60);
/* no minimum ttl */
DECL u_int min_cache_ttl INIT(0);
/* current line number */
DECL int lineno;
#ifdef DUMPFILE
DECL char *dumpfile INIT(DUMPFILE);
#else
DECL char *dumpfile INIT(_PATH_DUMPFILE);
#endif
/* root hash table */
DECL struct hashbuf *hashtab INIT(NULL);
/* hash table of cache read from file */
DECL struct hashbuf *fcachetab INIT(NULL);
#ifdef INVQ
/* Inverse query hash table */
DECL struct invbuf *invtab[INVHASHSZ];
#endif
#ifdef FORCED_RELOAD
DECL int reloading INIT(0);
#endif /* FORCED_RELOAD */

View File

@ -1,909 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_glue.c 4.4 (Berkeley) 6/1/90";
static char rcsid[] = "$Id: db_glue.c,v 8.16 1996/09/22 00:13:10 vixie Exp $";
#endif /* not lint */
/*
* ++Copyright++ 1986, 1988
* -
* Copyright (c) 1986, 1988
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <syslog.h>
#include <ctype.h>
#include <netdb.h>
#include <resolv.h>
#include <errno.h>
#include <signal.h>
#include "named.h"
struct valuelist {
struct valuelist *next, *prev;
char *name;
char *proto;
int port;
};
static struct valuelist *servicelist, *protolist;
#if defined(ultrix)
/* ultrix 4.0 has some icky packaging details. work around them here.
* since this module is linked into named and named-xfer, we end up
* forcing both to drag in our own res_send rather than ultrix's hesiod
* version of that.
*/
static const int (*unused_junk)__P((const u_char *, int, u_char *, int)) =
res_send;
;
#endif
/*XXX: sin_ntoa() should probably be in libc*/
const char *
sin_ntoa(sin)
const struct sockaddr_in *sin;
{
static char ret[sizeof "[111.222.333.444].55555"];
if (!sin)
strcpy(ret, "[sin_ntoa(NULL)]");
else
sprintf(ret, "[%s].%u",
inet_ntoa(sin->sin_addr),
ntohs(sin->sin_port));
return (ret);
}
/*
* XXX: some day we'll make this a varargs function
*/
void
panic(err, msg)
int err;
const char *msg;
{
if (err == -1)
syslog(LOG_CRIT, "%s - ABORT", msg);
else
syslog(LOG_CRIT, "%s: %s - ABORT", msg, strerror(err));
signal(SIGIOT, SIG_DFL); /* no POSIX needed here. */
abort();
}
void
buildservicelist()
{
struct servent *sp;
struct valuelist *slp;
#ifdef MAYBE_HESIOD
setservent(0);
#else
setservent(1);
#endif
while (sp = getservent()) {
slp = (struct valuelist *)malloc(sizeof(struct valuelist));
if (!slp)
panic(errno, "malloc(servent)");
slp->name = savestr(sp->s_name);
slp->proto = savestr(sp->s_proto);
slp->port = ntohs((u_int16_t)sp->s_port); /* host byt order */
slp->next = servicelist;
slp->prev = NULL;
if (servicelist)
servicelist->prev = slp;
servicelist = slp;
}
endservent();
}
void
buildprotolist()
{
struct protoent *pp;
struct valuelist *slp;
#ifdef MAYBE_HESIOD
setprotoent(0);
#else
setprotoent(1);
#endif
while (pp = getprotoent()) {
slp = (struct valuelist *)malloc(sizeof(struct valuelist));
if (!slp)
panic(errno, "malloc(protoent)");
slp->name = savestr(pp->p_name);
slp->port = pp->p_proto; /* host byte order */
slp->next = protolist;
slp->prev = NULL;
if (protolist)
protolist->prev = slp;
protolist = slp;
}
endprotoent();
}
static int
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); /* host byte order */
}
if (sscanf(s, "%d", &n) != 1 || n <= 0)
n = -1;
return (n);
}
/*
* Convert service name or (ascii) number to int.
*/
int
servicenumber(p)
char *p;
{
return (findservice(p, &servicelist));
}
/*
* Convert protocol name or (ascii) number to int.
*/
int
protocolnumber(p)
char *p;
{
return (findservice(p, &protolist));
}
#if defined(__STDC__) || defined(__GNUC__)
static struct servent *
cgetservbyport(u_int16_t port, /* net byte order */
char *proto)
#else
static struct servent *
cgetservbyport(port, proto)
u_int16_t port; /* net byte order */
char *proto;
#endif
{
register struct valuelist **list = &servicelist;
register struct valuelist *lp = *list;
static struct servent serv;
port = ntohs(port);
for (; lp != NULL; lp = lp->next) {
if (port != (u_int16_t)lp->port) /* host byte order */
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_int16_t)lp->port);
serv.s_proto = lp->proto;
return (&serv);
}
}
return (0);
}
static struct protoent *
cgetprotobynumber(proto)
register int proto; /* host byte order */
{
register struct valuelist **list = &protolist;
register struct valuelist *lp = *list;
static struct protoent prot;
for (; lp != NULL; lp = lp->next)
if (lp->port == proto) { /* host byte order */
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; /* host byte order */
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);
}
#if defined(__STDC__) || defined(__GNUC__)
char *
servicename(u_int16_t port, char *proto) /* host byte order */
#else
char *
servicename(port, proto)
u_int16_t port; /* host byte order */
char *proto;
#endif
{
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);
}
u_int
db_getclev(origin)
const char *origin;
{
u_int lev = 0;
dprintf(12, (ddt, "db_getclev of \"%s\"", origin));
if (origin && *origin)
lev++;
while (origin && (origin = strchr(origin, '.'))) {
origin++;
lev++;
}
dprintf(12, (ddt, " = %d\n", lev));
return (lev);
}
void
gettime(ttp)
struct timeval *ttp;
{
if (gettimeofday(ttp, NULL) < 0)
syslog(LOG_ERR, "gettimeofday: %m");
return;
}
#if !defined(BSD)
int
getdtablesize()
{
#if defined(USE_POSIX)
int j = (int) sysconf(_SC_OPEN_MAX);
if (j >= 0)
return (j);
#endif /* POSIX */
return (FD_SETSIZE);
}
#endif /* BSD */
int
my_close(fd)
int fd;
{
int s;
do {
errno = 0;
s = close(fd);
} while (s < 0 && errno == EINTR);
if (s < 0 && errno != EBADF)
syslog(LOG_INFO, "close(%d) failed: %m", fd);
else
dprintf(3, (ddt, "close(%d) succeeded\n", fd));
return (s);
}
#ifdef GEN_AXFR
/*
* Map class names to number
*/
struct map {
char *token;
int val;
};
static struct map map_class[] = {
{ "in", C_IN },
{ "chaos", C_CHAOS },
{ "hs", C_HS },
{ NULL, 0 }
};
int
get_class(class)
char *class;
{
struct map *mp;
if (isdigit(*class))
return (atoi(class));
for (mp = map_class; mp->token != NULL; mp++)
if (strcasecmp(class, mp->token) == 0)
return (mp->val);
return (C_IN);
}
#endif
int
my_fclose(fp)
FILE *fp;
{
int fd = fileno(fp),
s = fclose(fp);
if (s < 0)
syslog(LOG_INFO, "fclose(%d) failed: %m", fd);
else
dprintf(3, (ddt, "fclose(%d) succeeded\n", fd));
return (s);
}
/*
* Make a copy of a string and return a pointer to it.
*/
char *
savestr(str)
const char *str;
{
char *cp = strdup(str);
if (!cp)
panic(errno, "malloc(savestr)");
return (cp);
}
int
writemsg(rfd, msg, msglen)
int rfd;
u_char *msg;
int msglen;
{
struct iovec iov[2];
u_char len[INT16SZ];
__putshort(msglen, len);
iov[0].iov_base = (char *)len;
iov[0].iov_len = INT16SZ;
iov[1].iov_base = (char *)msg;
iov[1].iov_len = msglen;
if (writev(rfd, iov, 2) != INT16SZ + msglen) {
dprintf(1, (ddt, "write failed %d\n", errno));
return (-1);
}
return (0);
}
/* rm_datum(dp, np, pdp)
* remove datum 'dp' from name 'np'. pdp is previous data pointer.
* return value:
* "next" field from removed datum, suitable for relinking
*/
struct databuf *
rm_datum(dp, np, pdp)
register struct databuf *dp;
register struct namebuf *np;
register struct databuf *pdp;
{
register struct databuf *ndp = dp->d_next;
dprintf(3, (ddt, "rm_datum(%lx, %lx, %lx) -> %lx\n",
(u_long)dp, (u_long)np->n_data, (u_long)pdp, (u_long)ndp));
#ifdef INVQ
rminv(dp);
#endif
if (pdp == NULL)
np->n_data = ndp;
else
pdp->d_next = ndp;
if ((dp->d_flags & DB_F_ACTIVE) == 0)
panic(-1, "rm_datum: DB_F_ACTIVE not set");
dp->d_flags &= ~DB_F_ACTIVE;
dp->d_next = NULL;
if (--(dp->d_rcnt)) {
#ifdef DEBUG
int32_t ii;
#endif
switch(dp->d_type) {
case T_NS:
dprintf(1, (ddt, "rm_datum: %s rcnt = %d\n",
dp->d_data, dp->d_rcnt));
break;
case T_A:
#ifdef DEBUG
bcopy(dp->d_data, &ii, sizeof(ii));
#endif
dprintf(1, (ddt, "rm_datum: %08.8X rcnt = %d\n",
ii, dp->d_rcnt));
break;
default:
dprintf(1, (ddt, "rm_datum: rcnt = %d\n", dp->d_rcnt));
}
} else
db_free(dp);
return (ndp);
}
/* rm_name(np, he, pnp)
* remove name 'np' from parent 'pp'. pnp is previous name pointer.
* return value:
* "next" field from removed name, suitable for relinking
*/
struct namebuf *
rm_name(np, pp, pnp)
struct namebuf *np, **pp, *pnp;
{
struct namebuf *nnp = np->n_next;
char *msg;
/* verify */
if ( (np->n_data && (msg = "data"))
|| (np->n_hash && (msg = "hash"))
) {
syslog(LOG_ERR,
"rm_name(%#lx(%s)): non-nil %s pointer\n",
(u_long)np, NAME(*np), msg);
panic(-1, "rm_name");
}
/* unlink */
if (pnp) {
pnp->n_next = nnp;
} else {
*pp = nnp;
}
/* deallocate */
free((char*) np);
/* done */
return (nnp);
}
/*
* Get the domain name of 'np' and put in 'buf'. Bounds checking is done.
*/
void
getname(np, buf, buflen)
struct namebuf *np;
char *buf;
int buflen;
{
register char *cp;
register int i;
cp = buf;
while (np != NULL) {
i = (int) NAMELEN(*np);
if (i + 1 >= buflen) {
*cp = '\0';
syslog(LOG_INFO, "domain name too long: %s...\n", buf);
strcpy(buf, "Name_Too_Long");
return;
}
if (cp != buf)
*cp++ = '.';
bcopy(NAME(*np), cp, i);
cp += i;
buflen -= i + 1;
np = np->n_parent;
}
*cp = '\0';
}
#ifdef INVQ
/*
* Add data 'dp' to inverse query tables for name 'np'.
*/
void
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.
*/
void
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 (dp != odp)
continue;
while (i < INVBLKSZ-1) {
ip->i_dname[i] = ip->i_dname[i+1];
i++;
}
ip->i_dname[i] = NULL;
return;
}
}
}
}
/*
* Allocate an inverse query buffer.
*/
struct invbuf *
saveinv()
{
register struct invbuf *ip;
ip = (struct invbuf *) malloc(sizeof(struct invbuf));
if (!ip)
panic(errno, "malloc(saveinv)");
ip->i_next = NULL;
bzero((char *)ip->i_dname, sizeof(ip->i_dname));
return (ip);
}
/*
* Compute hash value from data.
*/
int
dhash(dp, dlen)
register const u_char *dp;
int dlen;
{
register u_char *cp;
register unsigned hval;
register int n;
n = dlen;
if (n > 8)
n = 8;
hval = 0;
while (--n >= 0) {
hval <<= 1;
hval += *dp++;
}
return (hval % INVHASHSZ);
}
#endif /*INVQ*/
/* int
* nhash(name)
* compute hash for this name and return it; ignore case differences
*/
int
nhash(name)
register const char *name;
{
register u_char ch;
register unsigned hval;
hval = 0;
while ((ch = (u_char)*name++) != (u_char)'\0') {
if (isascii(ch) && isupper(ch))
ch = tolower(ch);
hval <<= 1;
hval += ch;
}
return (hval % INVHASHSZ);
}
/*
** SAMEDOMAIN -- Check whether a name belongs to a domain
** ------------------------------------------------------
**
** Returns:
** TRUE if the given name lies in the domain.
** FALSE otherwise.
**
** Trailing dots are first removed from name and domain.
** Always compare complete subdomains, not only whether the
** domain name is the trailing string of the given name.
**
** "host.foobar.top" lies in "foobar.top" and in "top" and in ""
** but NOT in "bar.top"
**
** this implementation of samedomain() is thanks to Bob Heiney.
*/
int
samedomain(a, b)
const char *a, *b;
{
size_t la, lb;
int diff, i, escaped;
const char *cp;
la = strlen(a);
lb = strlen(b);
/* ignore a trailing label separator (i.e. an unescaped dot) in 'a' */
if (la && a[la-1] == '.') {
escaped = 0;
/* note this loop doesn't get executed if la==1 */
for (i = la - 2; i >= 0; i--)
if (a[i] == '\\') {
if (escaped)
escaped = 0;
else
escaped = 1;
} else {
break;
}
if (!escaped)
la--;
}
/* ignore a trailing label separator (i.e. an unescaped dot) in 'b' */
if (lb && b[lb-1] == '.') {
escaped = 0;
/* note this loop doesn't get executed if lb==1 */
for (i = lb - 2; i >= 0; i--)
if (b[i] == '\\') {
if (escaped)
escaped = 0;
else
escaped = 1;
} else {
break;
}
if (!escaped)
lb--;
}
/* lb==0 means 'b' is the root domain, so 'a' must be in 'b'. */
if (lb == 0)
return (1);
/* 'b' longer than 'a' means 'a' can't be in 'b'. */
if (lb > la)
return (0);
/* We use strncasecmp because we might be trying to
* ignore a trailing dot. */
if (lb == la)
return (strncasecmp(a, b, lb) == 0);
/* Ok, we know la > lb. */
diff = la - lb;
/* If 'a' is only 1 character longer than 'b', then it can't be
a subdomain of 'b' (because of the need for the '.' label
separator). */
if (diff < 2)
return (0);
/* If the character before the last 'lb' characters of 'b'
isn't '.', then it can't be a match (this lets us avoid
having "foobar.com" match "bar.com"). */
if (a[diff-1] != '.')
return (0);
/* We're not sure about that '.', however. It could be escaped
and thus not a really a label separator. */
escaped=0;
for (i = diff-2; i >= 0; i--)
if (a[i] == '\\') {
if (escaped)
escaped = 0;
else
escaped = 1;
}
else
break;
if (escaped)
return (0);
/* We use strncasecmp because we might be trying to
* ignore trailing dots. */
cp = a + diff;
return (strncasecmp(cp, b, lb) == 0);
}
/*
* Since the fields in a "struct timeval" are longs, and the argument to ctime
* is a pointer to a time_t (which might not be a long), here's a bridge.
*/
char *
ctimel(l)
long l;
{
time_t t = (time_t)l;
return (ctime(&t));
}
/*
* This is nec'y for systems that croak when deref'ing unaligned pointers.
* SPARC is an example. Note that in_addr.s_addr needn't be a 32-bit int,
* so we want to avoid bcopy and let the compiler do the casting for us.
*/
struct in_addr
data_inaddr(data)
const u_char *data;
{
struct in_addr ret;
u_int32_t tmp;
GETLONG(tmp, data);
ret.s_addr = htonl(tmp);
return (ret);
}
/* Signal abstraction. */
void
setsignal(catch, block, handler)
int catch, block;
SIG_FN (*handler)();
{
#ifdef POSIX_SIGNALS
/* Modern system - preferred. */
struct sigaction sa;
memset(&sa, 0, sizeof sa);
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
if (block != -1)
sigaddset(&sa.sa_mask, block);
(void) sigaction(catch, &sa, NULL);
#else /*POSIX_SIGNALS*/
#ifdef SYSV
/* Ancient system - ugly. */
if (block != -1)
syslog(LOG_DEBUG, "danger - unable to block signal %d from %d",
block, catch);
(void) signal(catch, handler);
#else /*SYSV*/
/* BSD<=4.3 system - odd. */
struct sigvec sv;
bzero(&sv, sizeof sv);
sv.sv_handler = handler;
sv.sv_mask = sigmask(block);
(void) sigvec(catch, &sv, NULL);
#endif /*SYSV*/
#endif /*POSIX_SIGNALS*/
}
void
resignal(catch, block, handler)
int catch, block;
SIG_FN (*handler)();
{
#if !defined(POSIX_SIGNALS) && defined(SYSV)
/* Unreliable signals. Set it back up again. */
setsignal(catch, block, handler);
#endif
}
void
db_free(dp)
struct databuf *dp;
{
int bytes = DATASIZE(dp->d_size);
if (dp->d_rcnt != 0)
panic(-1, "db_free: d_rcnt != 0");
if (dp->d_flags & DB_F_ACTIVE)
panic(-1, "db_free: DB_F_ACTIVE set");
if (dp->d_next)
panic(-1, "db_free: d_next != 0");
memset(dp, 0x5E, bytes);
free((char*)dp);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,250 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_lookup.c 4.18 (Berkeley) 3/21/91";
static char rcsid[] = "$Id: db_lookup.c,v 8.9 1996/09/22 00:13:10 vixie Exp $";
#endif /* not lint */
/*
* ++Copyright++ 1986
* -
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
/*
* Table lookup routines.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <ctype.h>
#include <stdio.h>
#include <syslog.h>
#include "named.h"
/*
* 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)
const char *name;
struct hashbuf **htpp;
const char **fname;
int insert;
{
register struct namebuf *np;
register const char *cp;
register int c;
register unsigned hval;
register struct hashbuf *htp;
struct namebuf *parent = NULL;
int escaped = 0;
htp = *htpp;
hval = 0;
*fname = "???";
for (cp = name; c = *cp++; ) {
if (!escaped && (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 (ns_wildcard(NAME(*np)))
*fname = name;
return (np);
}
htp = savehash((struct hashbuf *)NULL);
np->n_hash = htp;
}
*htpp = htp;
break;
}
/* rotate left HASHSHIFT */
hval = (hval << HASHSHIFT) |
(hval>>((sizeof(hval)*8)-HASHSHIFT));
hval += ((isascii(c) && isupper(c)) ? tolower(c) : c)
& HASHMASK;
if (escaped)
escaped = 0;
else if (c == '\\')
escaped = 1;
}
cp--;
/*
* 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 &&
((size_t)NAMELEN(*np) == (cp - name)) &&
(strncasecmp(name, NAME(*np), cp - name) == 0)) {
*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 (ns_wildcard(NAME(*np)) &&
np->n_data && np->n_data->d_zone != 0) {
*fname = name;
return (np);
}
}
return (parent);
}
np = savename(name, cp - 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;
}
*fname = name;
return (np);
}
/* struct namebuf *
* np_parent(struct namebuf *np)
* Find the "parent" namebuf of np.
* This is tricky since the parent of "com" is "" and both are stored
* in the same hashbuf.
* See also:
* the AXFR wart description in ns_req.c
*/
struct namebuf *
np_parent(np)
struct namebuf *np;
{
struct hashbuf *htp;
struct namebuf *np2;
if (np->n_parent != NULL || NAME(*np)[0] == '\0')
return (np->n_parent);
/* Try to figure out if np is pointing into the cache or hints. */
/* Try the cache first. */
htp = hashtab;
try_again:
/* Search the hash chain that np should be part of. */
for (np2 = htp->h_tab[np->n_hashval % htp->h_size];
np2 != NULL;
np2 = np2->n_next) {
if (np == np2) { /* found it! */
/* "" hashes into the first bucket */
for (np = htp->h_tab[0]; np ; np=np->n_next) {
if (NAME(*np)[0] == '\0')
/* found the root namebuf */
return (np);
}
dprintf(1, (ddt,
"np_parent(0x%lx) couldn't find root entry\n",
(u_long) np));
return (NULL); /* XXX shouldn't happen */
}
}
/* Try the hints. */
if (htp == hashtab) {
htp = fcachetab;
goto try_again;
}
dprintf(1, (ddt, "np_parent(0x%lx) couldn't namebuf\n", (u_long) np));
return (NULL); /* XXX shouldn't happen */
}
/* int
* match(dp, class, type)
* Does data record `dp' match the class and type?
* return value:
* boolean
*/
int
match(dp, class, type)
register struct databuf *dp;
register int class, type;
{
dprintf(5, (ddt, "match(0x%lx, %d, %d) %d, %d\n",
(u_long)dp, class, type, dp->d_class, dp->d_type));
if (dp->d_class != class && class != C_ANY)
return (0);
if (dp->d_type != type && type != T_ANY)
return (0);
return (1);
}

View File

@ -1,126 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_reload.c 4.22 (Berkeley) 3/21/91";
static char rcsid[] = "$Id: db_reload.c,v 8.3 1996/08/27 08:33:23 vixie Exp $";
#endif /* not lint */
/*
* ++Copyright++ 1986, 1988
* -
* Copyright (c) 1986, 1988
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <syslog.h>
#include "named.h"
/*
* Flush and reload data base.
*/
void
db_reload()
{
dprintf(3, (ddt, "reload()\n"));
syslog(LOG_NOTICE, "reloading nameserver\n");
qflush();
sqflush(NULL);
getnetconf();
#ifdef FORCED_RELOAD
reloading = 1; /* to force transfer if secondary and backing up */
#endif
ns_init(bootfile);
time(&resettime);
#ifdef FORCED_RELOAD
reloading = 0;
if (!needmaint)
sched_maint();
#endif /* FORCED_RELOAD */
dprintf(1, (ddt, "Ready to answer queries.\n"));
syslog(LOG_NOTICE, "Ready to answer queries.\n");
}
#if 0
/* someday we'll need this.. (untested since before 1990) */
void
ht_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;
db_free(dp);
dp = nextdp;
}
nextnp = np->n_next;
free((char *)np);
}
}
(void) free((char *)htp);
}
#endif

View File

@ -1,195 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_save.c 4.16 (Berkeley) 3/21/91";
static char rcsid[] = "$Id: db_save.c,v 8.6 1996/09/22 00:13:10 vixie Exp $";
#endif /* not lint */
/*
* ++Copyright++ 1986
* -
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
/*
* Buffer allocation and deallocation routines.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <syslog.h>
#include <stdio.h>
#include <errno.h>
#include <assert.h>
#include "named.h"
/*
* Allocate a name buffer & save name.
*/
struct namebuf *
savename(name, len)
const char *name;
int len;
{
register struct namebuf *np;
assert(len >= 0 && len <= (MAXLABEL * 4));
np = (struct namebuf *) malloc(NAMESIZE(len));
if (np == NULL)
panic(errno, "savename: malloc");
bzero((char*)np, NAMESIZE(len));
NAMELEN(*np) = (unsigned)len;
bcopy(name, NAME(*np), len);
NAME(*np)[len] = '\0';
return (np);
}
/*
* Allocate a data buffer & save data.
*/
struct databuf *
savedata(class, type, ttl, data, size)
int class, type;
u_int32_t ttl;
u_char *data;
int size;
{
register struct databuf *dp;
int bytes = DATASIZE(size);
dp = (struct databuf *)malloc(bytes);
if (dp == NULL)
panic(errno, "savedata: malloc");
bzero((char*)dp, bytes);
dp->d_next = NULL;
dp->d_type = type;
dp->d_class = class;
dp->d_ttl = ttl;
dp->d_size = size;
dp->d_flags = 0;
dp->d_cred = 0;
dp->d_clev = 0;
#ifdef NCACHE
dp->d_rcode = NOERROR;
#endif
#ifdef STATS
dp->d_ns = NULL;
#endif
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;
}
dprintf(4, (ddt, "savehash GROWING to %d\n", newsize));
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 namebuf *));
if (oldhtp == NULL) {
htp->h_cnt = 0;
return (htp);
}
dprintf(4, (ddt, "savehash(%#lx) cnt=%d, sz=%d, newsz=%d\n",
(u_long)oldhtp, oldhtp->h_cnt, oldhtp->h_size, newsize));
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);
}

View File

@ -1,153 +0,0 @@
#ifndef LINT
static char rcsid[] = "$Id: db_secure.c,v 8.7 1997/06/01 20:34:34 vixie Exp $";
#endif
/* this file was contributed by Gregory Neil Shapiro of WPI in August 1993 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <arpa/inet.h>
#include <syslog.h>
#include <errno.h>
#include "named.h"
#ifdef SECURE_ZONES
#ifndef SECURE_ZONE_RR
#define SECURE_ZONE_RR "secure_zone"
#endif
#ifndef MASK_SEP
#define MASK_SEP ':'
#endif
int
build_secure_netlist(zp)
struct zoneinfo *zp;
{
struct netinfo *ntp = NULL, **netlistp, **end;
char buf[MAXDNAME];
struct hashbuf *htp;
struct namebuf *snp;
struct databuf *dp;
const char *fname;
char *dname, dnbuf[MAXDNAME];
int errs = 0, securezone = 0;
if (zp->secure_nets) {
free_netlist(&zp->secure_nets);
}
netlistp = &zp->secure_nets;
end = netlistp;
strcat(strcat(strcpy(dnbuf, SECURE_ZONE_RR), "."), zp->z_origin);
dname = dnbuf;
htp = hashtab;
if ((snp = nlookup(dname, &htp, &fname, 0)) == NULL) {
dprintf(1, (ddt,
"build_secure_netlist(%s): FAIL on nlookup %s\n",
zp->z_origin, dname));
zp->secure_nets=NULL;
return(0);
}
/* A parent's RR's aren't valid */
if (strcasecmp(NAME(*snp), SECURE_ZONE_RR)) {
zp->secure_nets=NULL;
return(0);
}
/* Collect secure nets into secure_nets */
for (dp = snp->n_data; dp != NULL; dp = dp->d_next) {
char *maskptr = NULL;
if (!match(dp, zp->z_class, T_TXT)) {
continue;
}
bzero(buf, sizeof(buf));
bcopy(dp->d_data+1, buf, dp->d_size-1);
maskptr=strchr(buf, MASK_SEP);
if (maskptr) {
*maskptr++ = 0;
}
dprintf(3, (ddt,
"build_secure_netlist(%s): Found secure zone %s\n",
zp->z_origin, buf));
if (ntp == NULL) {
ntp = (struct netinfo *)malloc(sizeof(struct netinfo));
if (!ntp)
panic(errno, "malloc(netinfo)");
}
if (!inet_aton(buf, &ntp->my_addr)) {
syslog(LOG_INFO,
"build_secure_netlist (%s): Bad address: %s",
zp->z_origin, buf);
errs++;
continue;
}
if (maskptr && *maskptr) {
if (*maskptr == 'h' || *maskptr == 'H') {
ntp->mask = (u_int32_t)-1;
} else {
if (!inet_aton(maskptr,
(struct in_addr *)&ntp->mask)) {
dprintf(1, (ddt,
"build_secure_netlist (%s): Bad mask: %s\n",
zp->z_origin, maskptr));
syslog(LOG_INFO,
"build_secure_netlist (%s): Bad mask: %s",
zp->z_origin, maskptr);
errs++;
continue;
}
}
} else {
ntp->mask = net_mask(ntp->my_addr);
}
if (ntp->my_addr.s_addr & ~(ntp->mask)) {
syslog(LOG_INFO,
"build_secure_netlist (%s): addr (%s) is not in mask (%#lx)",
zp->z_origin,
inet_ntoa(ntp->my_addr),
(u_long)ntp->mask);
errs++;
}
ntp->next = NULL;
ntp->addr = ntp->my_addr.s_addr & ntp->mask;
/* Check for duplicates */
if (addr_on_netlist(ntp->my_addr, *netlistp)) {
syslog(LOG_INFO,
"build_secure_netlist (%s): duplicate address %s\n",
zp->z_origin, inet_ntoa(ntp->my_addr));
errs++;
continue;
}
*end = ntp;
end = &ntp->next;
ntp = NULL;
securezone++;
}
if (ntp) {
free((char *)ntp);
}
if (!securezone) {
zp->secure_nets=NULL;
}
#ifdef DEBUG
if (debug > 1) {
for (ntp = *netlistp; ntp != NULL; ntp = ntp->next) {
fprintf(ddt, "ntp x%lx addr x%lx mask x%lx",
(u_long)ntp, (u_long)ntp->addr,
(u_long)ntp->mask);
fprintf(ddt, " my_addr %#lx",
(u_long)ntp->my_addr.s_addr);
fprintf(ddt, " %s", inet_ntoa(ntp->my_addr));
fprintf(ddt, " next x%lx\n", (u_long)ntp->next);
}
}
#endif
return (errs);
}
#endif /*SECURE_ZONES*/

View File

@ -1,815 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_update.c 4.28 (Berkeley) 3/21/91";
static char rcsid[] = "$Id: db_update.c,v 8.19 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
* ++Copyright++ 1986, 1990
* -
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#include <stdio.h>
#include <syslog.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include "named.h"
/* int
* isRefByNS(name, htp)
* recurse through all of `htp' looking for NS RR's that refer to `name'.
* returns:
* nonzero if at least one such NS RR exists
* cautions:
* this is very expensive; probably you only want to use on fcachetab.
*/
static int
isRefByNS(name, htp)
char name[];
struct hashbuf *htp;
{
register struct namebuf *np;
register struct databuf *dp;
for (np = htp->h_tab[0]; np != NULL; np = np->n_next) {
for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
if ((dp->d_class == C_ANY ||
dp->d_class == C_IN ||
dp->d_class == C_HS) &&
dp->d_type == T_NS &&
#ifdef NCACHE
!dp->d_rcode &&
#endif
!strcasecmp(name, (char *)dp->d_data)) {
return (1);
}
}
if (np->n_hash && isRefByNS(name, np->n_hash))
return (1);
}
return (0);
}
/* int
* findMyZone(struct namebuf *np, int class)
* surf the zone cuts and find this zone the hard way
* return value:
* zone number or DB_Z_CACHE if it's outside a zone
* interesting cases:
* DEC.COM SOA (primary)
* CRL.DEC.COM NS (in primary)
* if you start at CRL.. here, you find the DEC.COM zone
* if you start at NS.CRL.. here, you're in the cache
* DEC.COM SOA (primary)
* CRL.DEC.COM NS (in primary)
* CRL.DEC.COM SOA (secondary)
* CRL.DEC.COM NS (in secondary)
* if you start at CRL.. here, you find the CRL.DEC.COM zone
* if you start at NS.CRL.. here, you're in the CRL.. zone
*/
int
findMyZone(np, class)
struct namebuf *np;
register int class;
{
for (; np; np = np_parent(np)) {
register struct databuf *dp;
/* if we encounter an SOA, we're in its zone (which can be
* the cache or an authoritative zone, depending).
*/
for (dp = np->n_data; dp; dp = dp->d_next)
if (match(dp, class, T_SOA))
return (dp->d_zone);
/* if we find an NS at some node without having seen an SOA
* (above), then we're out in the cache somewhere.
*/
for (dp = np->n_data; dp; dp = dp->d_next)
if (match(dp, class, T_NS))
return (DB_Z_CACHE);
}
/* getting all the way to the root without finding an NS or SOA
* probably means that we are in deep dip, but we'll treat it as
* being in the cache. (XXX?)
*/
return (DB_Z_CACHE);
}
#ifdef NO_GLUE
#define ISVALIDGLUE(xdp) ((xdp)->d_type == T_NS || (xdp)->d_type == T_A \
|| (xdp)->d_type == T_AAAA)
#else
#define ISVALIDGLUE(xdp) (1)
#endif /*NO_GLUE*/
/* int
* db_update(name, odp, newdp, flags, htp)
* update data base node at `name'. `flags' controls the action.
* side effects:
* inverse query tables modified, if we're using them.
* return value:
* OK - success
* NONAME - name doesn't exist
* AUTH - you can't do that
* DATAEXISTS - there's something there and DB_NODATA was specified
* NODATA - there's no data, and (DB_DELETE or DB_MEXIST) was spec'd
*
* Policy: How to add data if one more RR is -ve data
*
* NEND NOERROR_NODATA
* NXD NXDOMAIN
*
* match
* old
* Data NEND NXD
* Data Merge Data Data
* new NEND NEND NEND NEND
* NXD NXD NXD NXD
*
* no match
* old
* Data NEND NXD
* Data Merge Merge Data
* new NEND Merge Merge NEND
* NXD NXD NXD NXD
*
*/
/* XXX: this code calls nlookup, which can create namebuf's. if this code
* has to exit with a fatal error, it should scan from the new np upward
* and for each node which has no children and no data it should remove
* the namebuf. design notes: (1) there's no harm in doing this even if
* success occurred; (2) stopping on the first nonremovable np is optimal;
* the code for removal should be taken out of remove_zone() and made
* general enough for this use, and for remove_zone()'s continued use.
* vix, 21jul94
*/
int
db_update(name, odp, newdp, flags, htp)
char name[];
struct databuf *odp, *newdp;
int flags;
struct hashbuf *htp;
{
register struct databuf *dp, *pdp;
register struct namebuf *np;
int zn, isHintNS;
int check_ttl = 0;
const char *fname;
dprintf(3, (ddt, "db_update(%s, 0x%lx, 0x%lx, 0%o, 0x%lx)%s\n",
name, (u_long)odp, (u_long)newdp, flags, (u_long)htp,
(odp && (odp->d_flags&DB_F_HINT)) ? " hint":"" ));
np = nlookup(name, &htp, &fname, newdp != NULL);
if (np == NULL || fname != name)
return (NONAME);
if (newdp && zones[newdp->d_zone].z_type == Z_PRIMARY)
check_ttl = 1;
/* don't let nonauthoritative updates write in authority zones */
if (newdp && ((zn = findMyZone(np, newdp->d_class)) != DB_Z_CACHE) &&
#ifdef STUBS
(zones[zn].z_type != Z_STUB) &&
#endif
(flags & DB_NOTAUTH)) {
int foundRR = 0;
/*
* Don't generate the warning if the update
* would have been harmless (identical data).
*/
for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
if (!db_cmp(dp, newdp)) {
foundRR++;
break;
}
}
if (!foundRR)
dprintf(5, (ddt,
"[%s].%d update? to auth zone \"%s\" (%s)",
inet_ntoa(from_addr.sin_addr),
ntohs(from_addr.sin_port),
zones[zn].z_origin,
name));
return (AUTH);
}
if (newdp && zn && !(flags & DB_NOTAUTH)) {
if (db_getclev(zones[zn].z_origin) > newdp->d_clev) {
dprintf(5,(ddt, "attempted update child zone %s, %s\n",
zones[zn].z_origin, name));
return(AUTH);
}
}
/* some special checks for root NS' A RR's */
isHintNS = isRefByNS(name, fcachetab);
#ifdef DEPRECATED
if (newdp && isHintNS && newdp->d_type == T_A) {
/* upgrade credibility of additional data for rootsrv addrs */
if (newdp->d_cred == DB_C_ADDITIONAL) {
dprintf(3, (ddt,
"upgrading credibility for A RR (%s)\n",
name));
/* XXX: should copy NS RR's, but we really just want
* to prevent deprecation later so this will do.
*/
newdp->d_cred = DB_C_ANSWER;
newdp->d_clev = 0;
}
}
#endif
/* Reflect certain updates in hint cache also... */
/* Don't stick data we are authoritative for in hints. */
if (!(flags & DB_NOHINTS) &&
(flags & DB_PRIMING) &&
(odp != NULL) &&
(htp != fcachetab) &&
(odp->d_zone <= 0) &&
!(odp->d_flags & DB_F_HINT) &&
#ifdef NCACHE
(!newdp || !newdp->d_rcode) &&
#endif
((name[0] == '\0' && odp->d_type == T_NS) ||
(odp->d_type == T_A && isHintNS)
)
)
{
dprintf(3, (ddt, "db_update: hint '%s' %d\n",
name, odp->d_ttl));
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;
dp->d_cred = DB_C_CACHE;
dp->d_clev = 0;
if (db_update(name,
dp, dp,
(flags|DB_NOHINTS),
fcachetab)
!= OK) {
dprintf(3, (ddt, "db_update: hint %lx freed\n",
(u_long)dp));
db_free(dp);
}
}
if (odp != NULL) {
int foundRR = 0;
pdp = NULL;
for (dp = np->n_data; dp != NULL; ) {
if (!match(dp, odp->d_class, odp->d_type)) {
/* {class,type} doesn't match. these are
* the aggregation cases.
*/
/* Check that CNAMEs are only accompanied by
* Secure DNS RR's (KEY, SIG, and NXT).
*/
if (((dp->d_type == T_CNAME &&
odp->d_type != T_KEY &&
odp->d_type != T_SIG &&
odp->d_type != T_NXT) ||
(odp->d_type == T_CNAME &&
dp->d_type != T_KEY &&
dp->d_type != T_SIG &&
dp->d_type != T_NXT)) &&
odp->d_class == dp->d_class &&
#ifdef NCACHE
/* neither the odp nor the new dp are
* negatively cached records...
*/
!dp->d_rcode &&
!odp->d_rcode &&
#endif /*NCACHE*/
zones[odp->d_zone].z_type != Z_CACHE) {
syslog(LOG_INFO,
"%s has CNAME and other data (invalid)\n",
name);
goto skip;
}
if (!newdp || newdp->d_class != dp->d_class)
goto skip;
/* if the new data is authorative
* remove any data for this domain with
* the same class that isn't as credable
*/
if (newdp->d_cred == DB_C_ZONE &&
newdp->d_cred > dp->d_cred)
/* better credibility and the old datum
* was not from a zone file. remove
* the old datum.
*/
goto delete;
#if 0 /* caught by findMyZone() now. */
/* if we have authoritative data for a
* node, don't add in other data.
*/
if (dp->d_cred == DB_C_ZONE &&
newdp->d_cred < dp->d_cred)
return (AUTH);
#endif
/* if the new data is authoritative but
* but isn't as credible, reject it.
*/
if (newdp->d_cred == DB_C_ZONE &&
dp->d_cred == DB_C_ZONE) {
/* Both records are from a zone file.
* If their credibility levels differ,
* we're dealing with a zone cut. The
* record with lower clev is from the
* upper zone's file and is therefore
* glue.
*/
if (newdp->d_clev < dp->d_clev) {
if (!ISVALIDGLUE(newdp)) {
syslog(LOG_INFO,
"domain %s %s record in zone %s should be in zone %s, ignored",
name, p_type(newdp->d_type),
zones[newdp->d_zone].z_origin,
zones[dp->d_zone].z_origin);
}
return (AUTH);
}
if (newdp->d_clev > dp->d_clev) {
if (!ISVALIDGLUE(dp)) {
syslog(LOG_INFO,
"domain %s %s record in zone %s should be in zone %s, deleted",
name, p_type(dp->d_type),
zones[dp->d_zone].z_origin,
zones[newdp->d_zone].z_origin);
}
goto delete;
}
}
#ifdef NCACHE
/* process NXDOMAIN */
/* policy */
if (newdp->d_rcode == NXDOMAIN) {
if (dp->d_cred < DB_C_AUTH)
goto delete;
else
return (DATAEXISTS);
}
if (dp->d_rcode == NXDOMAIN)
goto delete;
/* process NOERROR_NODATA */
/* NO PROCESSING REQUIRED */
#endif /*NCACHE*/
goto skip;
} /*if {class,type} did not match*/
/* {type,class} did match. this is the replace case.
*/
dprintf(5, (ddt,
"db_update: flags = %#x, sizes = %d, %d (cmp %d)\n",
flags, odp->d_size, dp->d_size,
db_cmp(dp, odp)));
if (newdp) {
dprintf(4, (ddt,
"credibility for %s is %d(%d) from [%s].%d, is %d(%d) in cache\n",
*name? name : ".",
newdp->d_cred,
newdp->d_clev,
inet_ntoa(from_addr.sin_addr),
ntohs(from_addr.sin_port),
dp->d_cred,
dp->d_clev));
if (newdp->d_cred > dp->d_cred) {
/* better credibility.
* remove the old datum.
*/
goto delete;
}
if (newdp->d_cred < dp->d_cred) {
/* credibility is worse. ignore it. */
return (AUTH);
}
if (newdp->d_cred == DB_C_ZONE &&
dp->d_cred == DB_C_ZONE ) {
/* Both records are from a zone file.
* If their credibility levels differ,
* we're dealing with a zone cut. The
* record with lower clev is from the
* upper zone's file and is therefore
* glue.
*/
/* XXX - Tricky situation here is you
* have 2 zones a.b.c and sub.a.b.c
* being served by the same server.
* named will send NS records for
* sub.a.b.c during zone transfer of
* a.b.c zone. If we're secondary for
* both zones, and we reload zone
* a.b.c, we'll get the NS records
* (and possibly A records to go with
* them?) for sub.a.b.c as part of the
* a.b.c zone transfer. But we've
* already got a more credible record
* from the sub.a.b.c zone. So we want
* to ignore the new record, but we
* shouldn't syslog because there's
* nothing the user can do to prevent
* the situation. Perhaps we should
* only complain when we are primary?
*/
if (newdp->d_clev < dp->d_clev) {
if (!ISVALIDGLUE(newdp)) {
syslog(LOG_INFO,
"domain %s %s record in zone %s should be in zone %s, ignored",
name, p_type(newdp->d_type),
zones[newdp->d_zone].z_origin,
zones[dp->d_zone].z_origin);
}
return (AUTH);
}
if (newdp->d_clev > dp->d_clev) {
if (!ISVALIDGLUE(dp)) {
syslog(LOG_INFO,
"domain %s %s record in zone %s should be in zone %s, deleted",
name, p_type(dp->d_type),
zones[dp->d_zone].z_origin,
zones[newdp->d_zone].z_origin);
}
goto delete;
}
}
/* credibility is the same.
* let it aggregate in the normal way.
*/
#ifdef NCACHE
/*
* if the new or old RR is -ve, delete old.
*/
if (dp->d_rcode || newdp->d_rcode) {
/* XXX: how can a zone rr be neg? */
if (dp->d_cred != DB_C_ZONE)
goto delete;
else
return (DATAEXISTS);
}
#endif
/*
* Some RR types should not be aggregated.
*/
if (dp->d_type == T_SOA)
goto delete;
if (dp->d_type == T_WKS &&
!bcmp(dp->d_data, newdp->d_data,
INT32SZ + sizeof(u_char)))
goto delete;
if (check_ttl) {
if (newdp->d_ttl != dp->d_ttl)
syslog(LOG_WARNING,
"%s %s %s differing ttls: corrected",
name[0]?name:".",
p_class(dp->d_class),
p_type(dp->d_type));
if (newdp->d_ttl > dp->d_ttl) {
newdp->d_ttl = dp->d_ttl;
} else {
dp->d_ttl = newdp->d_ttl;
}
}
}
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;
dprintf(4, (ddt,
"db_update: cache entry now in auth zone\n"
));
return (DATAEXISTS);
}
fixttl(odp);
if (odp->d_ttl > dp->d_ttl)
dp->d_ttl = odp->d_ttl;
dprintf(3, (ddt,
"db_update: new ttl %ld +%ld\n",
(u_long)dp->d_ttl,
(u_long)
(dp->d_ttl - tt.tv_sec)));
}
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;
if (odp->d_clev < dp->d_clev)
goto skip;
if (odp->d_cred < dp->d_cred)
goto skip;
foundRR = 1;
if (flags & DB_DELETE) {
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);
/* XXX: empty nodes bypass credibility checks above; should check
* response source address here if flags&NOTAUTH.
*/
fixttl(newdp);
dprintf(3, (ddt, "db_update: adding%s %lx\n",
(newdp->d_flags&DB_F_HINT) ? " hint":"", (u_long)newdp));
#ifdef INVQ
if (!(newdp->d_flags & DB_F_HINT))
addinv(np, newdp); /* modify inverse query tables */
#endif
#ifdef STATS
if (!newdp->d_zone && !(newdp->d_flags & DB_F_HINT))
newdp->d_ns = nameserFind(from_addr.sin_addr, NS_F_INSERT);
#endif
/* Add to end of list, generally preserving order */
newdp->d_next = NULL;
if ((dp = np->n_data) == NULL) {
newdp->d_rcnt = 1;
if (newdp->d_flags & DB_F_ACTIVE)
panic(-1, "db_update: DB_F_ACTIVE set");
newdp->d_flags |= DB_F_ACTIVE;
np->n_data = newdp;
return (OK);
}
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);
newdp->d_rcnt = 1;
if (newdp->d_flags & DB_F_ACTIVE)
panic(-1, "db_update: DB_F_ACTIVE set");
newdp->d_flags |= DB_F_ACTIVE;
dp->d_next = newdp;
return (OK);
}
void
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;
}
/*
* Compare type, class and data from databufs for equivalence.
* Must be case insensitive for some domain names.
* Return 0 if equivalent, nonzero otherwise.
*/
int
db_cmp(dp1, dp2)
register struct databuf *dp1, *dp2;
{
register u_char *cp1, *cp2;
int len, len2;
if (dp1->d_type != dp2->d_type || dp1->d_class != dp2->d_class)
return (1);
if (dp1->d_size != dp2->d_size)
return (1);
#ifdef NCACHE
if (dp1->d_rcode && dp2->d_rcode)
return ((dp1->d_rcode == dp1->d_rcode)?0:1);
if (dp1->d_rcode || dp2->d_rcode)
return (1);
#endif
switch (dp1->d_type) {
case T_SIG:
case T_KEY:
case T_A:
case T_UID:
case T_GID:
case T_WKS:
case T_NULL:
case T_NSAP:
case T_AAAA:
case T_LOC:
#ifdef ALLOW_T_UNSPEC
case T_UNSPEC:
#endif
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((char *)dp1->d_data, (char *)dp2->d_data));
case T_HINFO:
case T_ISDN:
cp1 = dp1->d_data;
cp2 = dp2->d_data;
len = *cp1;
len2 = *cp2;
if (len != len2)
return (1);
if (strncasecmp((char *)++cp1, (char *)++cp2, len))
return (1);
cp1 += len;
cp2 += len;
len = *cp1;
len2 = *cp2;
if (len != len2)
return (1);
return (strncasecmp((char *)++cp1, (char *)++cp2, len));
case T_SOA:
case T_MINFO:
case T_RP:
if (strcasecmp((char *)dp1->d_data, (char *)dp2->d_data))
return (1);
cp1 = dp1->d_data + strlen((char *)dp1->d_data) + 1;
cp2 = dp2->d_data + strlen((char *)dp2->d_data) + 1;
if (dp1->d_type != T_SOA)
return (strcasecmp((char *)cp1, (char *)cp2));
if (strcasecmp((char *)cp1, (char *)cp2))
return (1);
cp1 += strlen((char *)cp1) + 1;
cp2 += strlen((char *)cp2) + 1;
return (bcmp(cp1, cp2, INT32SZ * 5));
case T_NAPTR: {
int t1,t2;
if (dp1->d_size != dp2->d_size)
return (1);
cp1 = dp1->d_data;
cp2 = dp2->d_data;
/* Order */
if (*cp1++ != *cp2++ || *cp1++ != *cp2++)
return (1);
/* Preference */
if (*cp1++ != *cp2++ || *cp1++ != *cp2++)
return (1);
/* Flags */
t1 = *cp1++; t2 = *cp2++;
if (t1 != t2 || bcmp(cp1, cp2, t1))
return (1);
cp1 += t1; cp2 += t2;
/* Services */
t1 = *cp1++; t2 = *cp2++;
if (t1 != t2 || bcmp(cp1, cp2, t1))
return (1);
cp1 += t1; cp2 += t2;
/* Regexp */
t1 = *cp1++; t2 = *cp2++;
if (t1 != t2 || bcmp(cp1, cp2, t1))
return (1);
cp1 += t1; cp2 += t2;
/* Replacement */
t1 = strlen((char *)cp1); t2 = strlen((char *)cp2);
if (t1 != t2 || bcmp(cp1, cp2, t1))
return (1);
cp1 += t1 + 1; cp2 += t2 + 1;
/* they all checked out! */
return (0);
}
case T_MX:
case T_AFSDB:
case T_RT:
case T_SRV:
cp1 = dp1->d_data;
cp2 = dp2->d_data;
if (*cp1++ != *cp2++ || *cp1++ != *cp2++) /* cmp prio */
return (1);
if (dp1->d_type == T_SRV) {
if (*cp1++ != *cp2++ || *cp1++ != *cp2++) /* weight */
return (1);
if (*cp1++ != *cp2++ || *cp1++ != *cp2++) /* port */
return (1);
}
return (strcasecmp((char *)cp1, (char *)cp2));
case T_PX:
cp1 = dp1->d_data;
cp2 = dp2->d_data;
if (*cp1++ != *cp2++ || *cp1++ != *cp2++) /* cmp prio */
return (1);
if (strcasecmp((char *)cp1, (char *)cp2))
return (1);
cp1 += strlen((char *)cp1) + 1;
cp2 += strlen((char *)cp2) + 1;
return (strcasecmp((char *)cp1, (char *)cp2));
case T_TXT:
case T_X25:
if (dp1->d_size != dp2->d_size)
return (1);
return (bcmp(dp1->d_data, dp2->d_data, dp1->d_size));
default:
return (1);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +0,0 @@
/* named.h - include the local definitions in the right order
* vix 28aug93 [original]
*
* $Id: named.h,v 8.1 1994/12/15 06:24:14 vixie Exp $
*/
#include "../conf/portability.h"
#include "../conf/options.h"
#include "pathnames.h"
#include "ns_defs.h"
#include "db_defs.h"
#include "ns_glob.h"
#include "db_glob.h"
#include "ns_func.h"
#include "db_func.h"

View File

@ -1,7 +0,0 @@
#!/bin/sh -
#
# from named.reload 5.2 (Berkeley) 6/27/89
# $Id: named.reload.sh,v 8.1 1994/12/15 06:24:14 vixie Exp $
#
exec %DESTSBIN%/%INDOT%ndc reload

View File

@ -1,7 +0,0 @@
#!/bin/sh -
#
# from named.restart 5.4 (Berkeley) 6/27/89
# $Id: named.restart.sh,v 8.1 1994/12/15 06:24:14 vixie Exp $
#
exec %DESTSBIN%/%INDOT%ndc restart

View File

@ -1,83 +0,0 @@
#!/bin/sh
USAGE='echo \
"usage: $0 \
(status|dumpdb|reload|stats|trace|notrace|querylog|start|stop|restart) \
... \
"; exit 1'
PATH=%DESTSBIN%:/bin:/usr/bin:/usr/ucb:$PATH
PIDFILE=%PIDDIR%/named.pid
if [ -f $PIDFILE ]
then
PID=`cat $PIDFILE`
PS=`%PS% $PID | tail -1 | grep $PID`
RUNNING=1
[ `echo $PS | wc -w` -ne 0 ] || {
PS="named (pid $PID?) not running"
RUNNING=0
}
else
PS="named (no pid file) not running"
RUNNING=0
fi
for ARG
do
case $ARG in
start|stop|restart)
;;
*)
[ $RUNNING -eq 0 ] && {
echo $PS
exit 1
}
esac
case $ARG in
status) echo "$PS";;
dumpdb) kill -INT $PID && echo Dumping Database;;
reload) kill -HUP $PID && echo Reloading Database;;
stats) kill -%IOT% $PID && echo Dumping Statistics;;
trace) kill -USR1 $PID && echo Trace Level Incremented;;
notrace) kill -USR2 $PID && echo Tracing Cleared;;
querylog|qrylog) kill -WINCH $PID && echo Query Logging Toggled;;
start)
[ $RUNNING -eq 1 ] && {
echo "$0: start: named (pid $PID) already running"
continue
}
rm -f $PIDFILE
%INDOT%named && {
sleep 5
echo Name Server Started
}
;;
stop)
[ $RUNNING -eq 0 ] && {
echo "$0: stop: named not running"
continue
}
kill $PID && {
sleep 5
rm -f $PIDFILE
echo Name Server Stopped
}
;;
restart)
[ $RUNNING -eq 1 ] && {
kill $PID && sleep 5
}
rm -f $PIDFILE
%INDOT%named && {
sleep 5
echo Name Server Restarted
}
;;
*) eval "$USAGE";;
esac
done
test -z "$ARG" && eval "$USAGE"
exit 0

View File

@ -1,393 +0,0 @@
/*
* from ns.h 4.33 (Berkeley) 8/23/90
* $Id: ns_defs.h,v 8.8 1996/09/22 00:13:10 vixie Exp $
*/
/*
* ++Copyright++ 1986
* -
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
/*
* Global definitions for the name server.
*/
/*
* Effort has been expended here to make all structure members 32 bits or
* larger land on 32-bit boundaries; smaller structure members have been
* deliberately shuffled and smaller integer sizes chosen where possible
* to make sure this happens. This is all meant to avoid structure member
* padding which can cost a _lot_ of memory when you have hundreds of
* thousands of entries in your cache.
*/
/*
* 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 ([0..255]) */
#define RETRYBASE 4 /* base time between retries */
#define MAXCLASS 255 /* XXX - may belong elsewhere */
#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 */
#define MAXQSERIAL 4 /* max # of outstanding QSERIAL's */
/* (prevent "recursive" loops) */
#define INIT_REFRESH 600 /* retry time for initial secondary */
/* contact (10 minutes) */
#define NADDRECS 20 /* max addt'l rr's per resp */
#define XFER_TIMER 120 /* named-xfer's connect timeout */
#define MAX_XFER_TIME 60*60*2 /* max seconds for an xfer */
#define XFER_TIME_FUDGE 10 /* MAX_XFER_TIME fudge */
#define MAX_XFERS_RUNNING 10 /* default max value of xfers_running */
#define MAX_XFERS_PER_NS 2 /* max # of xfers per peer nameserver */
#define XFER_BUFSIZE (16*1024) /* arbitrary but bigger than most MTU's */
#define ALPHA 0.7 /* How much to preserve 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 */
#define USE_MINIMUM 0xffffffff
/* sequence-space arithmetic */
#define SEQ_GT(a,b) ((int32_t)((a)-(b)) > 0)
/* cheap garbage collection */
#define FREE_ONCE(p) { if (p) { free(p); p = NULL; } }
/* these fields are ordered to maintain word-alignment;
* be careful about changing them.
*/
struct zoneinfo {
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_int32_t z_refresh; /* refresh interval */
u_int32_t z_retry; /* refresh retry interval */
u_int32_t z_expire; /* expiration time for cached info */
u_int32_t z_minimum; /* minimum TTL value */
u_int32_t z_serial; /* changes if zone modified */
char *z_source; /* source location of data */
time_t z_ftime; /* modification time of source file */
struct in_addr z_xaddr; /* override server for next xfer */
struct in_addr z_addr[NSMAX]; /* list of master servers for zone */
u_char z_addrcnt; /* number of entries in z_addr[] */
u_char z_type; /* type of zone; see below */
u_int16_t z_flags; /* state bits; see below */
pid_t z_xferpid; /* xfer child pid */
int z_class; /* class of zone */
#ifdef SECURE_ZONES
struct netinfo *secure_nets; /* list of secure networks for zone */
#endif
#ifdef BIND_NOTIFY
/* XXX - this will have to move to the name when we do !SOA notify */
struct notify *z_notifylist; /* list of servers we should notify */
#endif
};
#ifdef BIND_NOTIFY
struct notify {
struct in_addr addr; /* of server */
time_t last; /* when they asked */
struct notify *next;
/* XXX - this will need a type field when we do !SOA notify */
};
#endif
/* zone types (z_type) */
#define Z_NIL 0 /* zone slot not in use */
#define Z_PRIMARY 1
#define Z_SECONDARY 2
#define Z_CACHE 3
#define Z_STUB 4
/* zone state bits (16 bits) */
#define Z_AUTH 0x0001 /* zone is authoritative */
#define Z_NEED_XFER 0x0002 /* waiting to do xfer */
#define Z_XFER_RUNNING 0x0004 /* asynch. xfer is running */
#define Z_NEED_RELOAD 0x0008 /* waiting to do reload */
#define Z_SYSLOGGED 0x0010 /* have logged timeout */
#define Z_QSERIAL 0x0020 /* sysquery()'ing for serial number */
#define Z_FOUND 0x0040 /* found in boot file when reloading */
#define Z_INCLUDE 0x0080 /* set if include used in file */
#define Z_DB_BAD 0x0100 /* errors when loading file */
#define Z_TMP_FILE 0x0200 /* backup file for xfer is temporary */
#define Z_XFER_ABORTED 0x0400 /* zone transfer has been aborted */
#define Z_XFER_GONE 0x0800 /* zone transfer process is gone */
/* named_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 */
#include <sys/time.h>
/* XXX - "struct qserv" is deprecated in favor of "struct nameser" */
struct qserv {
struct sockaddr_in
ns_addr; /* address of NS */
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 */
};
/*
* Structure for recording info on forwarded or generated queries.
*/
struct qinfo {
u_int16_t q_id; /* id of query */
u_int16_t q_nsid; /* id of forwarded query */
struct sockaddr_in
q_from; /* requestor's address */
u_char *q_msg, /* the message */
*q_cmsg; /* the cname message */
int16_t q_msglen, /* len of message */
q_cmsglen; /* len of cname message */
int16_t q_dfd; /* UDP file descriptor */
struct fwdinfo *q_fwd; /* last forwarder used */
time_t q_time; /* time to retry */
time_t q_expire; /* time to expire */
struct qinfo *q_next; /* rexmit list (sorted by time) */
struct qinfo *q_link; /* storage list (random order) */
struct databuf *q_usedns[NSMAX]; /* databuf for NS that we've tried */
struct qserv q_addr[NSMAX]; /* addresses of NS's */
#ifdef notyet
struct nameser *q_ns[NSMAX]; /* name servers */
#endif
u_char q_naddr; /* number of addr's in q_addr */
u_char q_curaddr; /* last addr sent to */
u_char q_nusedns; /* number of elements in q_usedns[] */
u_int8_t q_flags; /* see below */
int16_t q_cname; /* # of cnames found */
int16_t q_nqueries; /* # of queries required */
struct qstream *q_stream; /* TCP stream, null if UDP */
struct zoneinfo *q_zquery; /* Zone query is about (Q_ZSERIAL) */
char *q_domain; /* domain of most enclosing zone cut */
char *q_name; /* domain of query */
u_int16_t q_class; /* class of query */
u_int16_t q_type; /* type of query */
#ifdef BIND_NOTIFY
int q_notifyzone; /* zone which needs a sysnotify()
* when the reply to this comes in.
*/
#endif
};
/* q_flags bits (8 bits) */
#define Q_SYSTEM 0x01 /* is a system query */
#define Q_PRIMING 0x02 /* generated during priming phase */
#define Q_ZSERIAL 0x04 /* getting zone serial for xfer test */
#define Q_NEXTADDR(qp,n) \
(((qp)->q_fwd == (struct fwdinfo *)0) ? \
&(qp)->q_addr[n].ns_addr : &(qp)->q_fwd->fwdaddr)
#define RETRY_TIMEOUT 45
#define QINFO_NULL ((struct qinfo *)0)
/*
* 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 */
u_char *s_buf; /* buffer of received data */
u_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_int32_t s_time; /* time stamp of last transaction */
int s_refcnt; /* number of outstanding queries */
u_int16_t s_tempsize; /* temporary for size from net */
};
#define QSTREAM_NULL ((struct qstream *)0)
struct qdatagram {
int dq_dfd; /* datagram file descriptor */
time_t dq_gen; /* generation number */
struct qdatagram
*dq_next; /* next datagram */
struct in_addr dq_addr; /* interface address */
};
#define QDATAGRAM_NULL ((struct qdatagram *)0)
struct netinfo {
struct netinfo *next;
u_int32_t addr;
u_int32_t mask;
struct in_addr my_addr;
};
#define ALLOW_NETS 0x0001
#define ALLOW_HOSTS 0x0002
#define ALLOW_ALL (ALLOW_NETS | ALLOW_HOSTS)
struct fwdinfo {
struct fwdinfo *next;
struct sockaddr_in
fwdaddr;
};
enum nameserStats { nssRcvdR, /* sent us an answer */
nssRcvdNXD, /* sent us a negative response */
nssRcvdFwdR, /* sent us a response we had to fwd */
nssRcvdDupR, /* sent us an extra answer */
nssRcvdFail, /* sent us a SERVFAIL */
nssRcvdFErr, /* sent us a FORMERR */
nssRcvdErr, /* sent us some other error */
nssRcvdAXFR, /* sent us an AXFR */
nssRcvdLDel, /* sent us a lame delegation */
nssRcvdOpts, /* sent us some IP options */
nssSentSysQ, /* sent them a sysquery */
nssSentAns, /* sent them an answer */
nssSentFwdQ, /* fwdd a query to them */
nssSentDupQ, /* sent them a retry */
nssSendtoErr, /* error in sendto */
#ifdef XSTATS
nssRcvdQ, /* sent us a query */
nssRcvdIQ, /* sent us an inverse query */
nssRcvdFwdQ, /* sent us a query we had to fwd */
nssRcvdDupQ, /* sent us a retry */
nssRcvdTCP, /* sent us a query using TCP */
nssSentFwdR, /* fwdd a response to them */
nssSentFail, /* sent them a SERVFAIL */
nssSentFErr, /* sent them a FORMERR */
nssSentNaAns, /* sent them a non autoritative answer */
nssSentNXD, /* sent them a negative response */
#endif
nssLast };
struct nameser {
struct in_addr addr; /* key */
u_long stats[nssLast]; /* statistics */
#ifdef notyet
u_int32_t rtt; /* round trip time */
/* XXX - need to add more stuff from "struct qserv", and use our rtt */
u_int16_t flags; /* see below */
#endif
u_int8_t xfers; /* #/xfers running right now */
};
#ifdef NCACHE
#define NOERROR_NODATA 6 /* only used internally by the server, used for
* -ve $ing non-existence of records. 6 is not
* a code used as yet anyway. anant@isi.edu
*/
#define NTTL 600 /* ttl for negative data: 10 minutes? */
#endif /*NCACHE*/
#define VQEXPIRY 900 /* a VQ entry expires in 15*60 = 900 seconds */
#ifdef VALIDATE
#define INVALID 0
#define VALID_NO_CACHE 1
#define VALID_CACHE 2
#define MAXNAMECACHE 100
#define MAXVQ 100 /* Max number of elements in TO_Validate queue */
struct _nameaddr {
struct in_addr ns_addr;
char *nsname;
};
typedef struct _nameaddr NAMEADDR;
struct _to_validate {
int16_t class; /* Name Class */
int16_t type; /* RR type */
char *data; /* RR data */
char *dname; /* Name */
time_t time; /* time at which inserted in queue */
struct _to_validate
*next,
*prev;
};
typedef struct _to_validate TO_Validate;
#endif /*VALIDATE*/
#ifdef DEBUG
# define dprintf(lev, args) (ddt && (debug >= lev) && fprintf args)
#else
# define dprintf(lev, args)
#endif
#ifdef INIT
error "INIT already defined, check system include files"
#endif
#ifdef DECL
error "DECL already defined, check system include files"
#endif
#ifdef MAIN_PROGRAM
#define INIT(x) = x
#define DECL
#else
#define INIT(x)
#define DECL extern
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,170 +0,0 @@
/* ns_func.h - declarations for ns_*.c's externally visible functions
*
* $Id: ns_func.h,v 8.13 1996/11/11 06:36:49 vixie Exp $
*/
/* ++from ns_resp.c++ */
extern void ns_resp __P((u_char *, int)),
prime_cache __P((void)),
delete_all __P((struct namebuf *, int, int)),
delete_stale __P((struct namebuf *));
extern struct qinfo *sysquery __P((const char *, int, int,
struct in_addr *, int, int));
extern struct notify *findNotifyPeer __P((const struct zoneinfo *,
struct in_addr));
extern void sysnotify __P((const char *, int, int));
extern int doupdate __P((u_char *, int, u_char *, int,
struct databuf **, int, u_int)),
send_msg __P((u_char *, int, struct qinfo *)),
findns __P((struct namebuf **, int,
struct databuf **, int *, int)),
finddata __P((struct namebuf *, int, int, HEADER *,
char **, int *, int *)),
wanted __P((struct databuf *, int, int)),
add_data __P((struct namebuf *,
struct databuf **,
u_char *, int, int *));
/* --from ns_resp.c-- */
/* ++from ns_req.c++ */
extern void ns_req __P((u_char *, int, int,
struct qstream *,
struct sockaddr_in *,
int)),
free_addinfo __P((void)),
free_nsp __P((struct databuf **));
extern int stale __P((struct databuf *)),
make_rr __P((const char *, struct databuf *,
u_char *, int, int)),
doaddinfo __P((HEADER *, u_char *, int)),
doaddauth __P((HEADER *, u_char *, int,
struct namebuf *,
struct databuf *));
#ifdef BIND_NOTIFY
extern int findZonePri __P((const struct zoneinfo *,
const struct sockaddr_in *));
#endif
/* --from ns_req.c-- */
/* ++from ns_forw.c++ */
extern time_t retrytime __P((struct qinfo *));
extern int ns_forw __P((struct databuf *nsp[],
u_char *msg,
int msglen,
struct sockaddr_in *fp,
struct qstream *qsp,
int dfd,
struct qinfo **qpp,
char *dname,
int class, int type,
struct namebuf *np)),
haveComplained __P((const char *, const char *)),
nslookup __P((struct databuf *nsp[],
struct qinfo *qp,
const char *syslogdname,
const char *sysloginfo)),
qcomp __P((struct qserv *, struct qserv *));
extern struct qdatagram *aIsUs __P((struct in_addr));
extern void schedretry __P((struct qinfo *, time_t)),
unsched __P((struct qinfo *)),
retry __P((struct qinfo *)),
qflush __P((void)),
qremove __P((struct qinfo *)),
nsfree __P((struct qinfo *, char *)),
qfree __P((struct qinfo *));
extern struct qinfo *qfindid __P((u_int16_t)),
*qnew __P((const char *, int, int));
/* --from ns_forw.c-- */
/* ++from ns_main.c++ */
extern u_int32_t net_mask __P((struct in_addr));
extern void sqrm __P((struct qstream *)),
sqflush __P((struct qstream *allbut)),
dqflush __P((time_t gen)),
sq_done __P((struct qstream *)),
ns_setproctitle __P((char *, int)),
getnetconf __P((void)),
nsid_init __P((void));
extern u_int16_t nsid_next __P((void));
extern struct netinfo *findnetinfo __P((struct in_addr));
/* --from ns_main.c-- */
/* ++from ns_maint.c++ */
extern void ns_maint __P((void)),
sched_maint __P((void)),
#ifdef CLEANCACHE
remove_zone __P((struct hashbuf *, int, int)),
#else
remove_zone __P((struct hashbuf *, int)),
#endif
#ifdef PURGE_ZONE
purge_zone __P((const char *, struct hashbuf *, int)),
#endif
loadxfer __P((void)),
qserial_query __P((struct zoneinfo *)),
qserial_answer __P((struct qinfo *, u_int32_t));
extern void holdsigchld __P((void));
extern void releasesigchld __P((void));
extern SIG_FN reapchild __P(());
extern void endxfer __P((void));
extern const char * zoneTypeString __P((const struct zoneinfo *));
#ifdef DEBUG
extern void printzoneinfo __P((int));
#endif
/* --from ns_maint.c-- */
/* ++from ns_sort.c++ */
extern struct netinfo *local __P((struct sockaddr_in *));
extern void sort_response __P((u_char *, int,
struct netinfo *,
u_char *));
/* --from ns_sort.c-- */
/* ++from ns_init.c++ */
extern void ns_refreshtime __P((struct zoneinfo *, time_t)),
ns_retrytime __P((struct zoneinfo *, time_t)),
ns_init __P((char *));
extern enum context ns_ptrcontext __P((const char *owner));
extern enum context ns_ownercontext __P((int type, enum transport));
extern int ns_nameok __P((const char *name, int class,
enum transport, enum context,
const char *owner,
struct in_addr source));
extern int ns_wildcard __P((const char *name));
/* --from ns_init.c-- */
/* ++from ns_ncache.c++ */
extern void cache_n_resp __P((u_char *, int));
/* --from ns_ncache.c-- */
/* ++from ns_udp.c++ */
extern void ns_udp __P((void));
/* --from ns_udp.c-- */
/* ++from ns_stats.c++ */
extern void ns_stats __P((void));
#ifdef XSTATS
extern void ns_logstats __P((void));
#endif
extern void qtypeIncr __P((int qtype));
extern struct nameser *nameserFind __P((struct in_addr addr, int flags));
#define NS_F_INSERT 0x0001
extern void nameserIncr __P((struct in_addr addr,
enum nameserStats which));
/* --from ns_stats.c-- */
/* ++from ns_validate.c++ */
extern int
#ifdef NCACHE
validate __P((char *, char *, struct sockaddr_in *,
int, int, char *, int, int)),
#else
validate __P((char *, char *, struct sockaddr_in *,
int, int, char *, int)),
#endif
dovalidate __P((u_char *, int, u_char *, int, int,
char *, struct sockaddr_in *, int *)),
update_msg __P((u_char *, int *, int Vlist[], int));
extern void store_name_addr __P((const char *, struct in_addr,
const char *, const char *));
/* --from ns_validate.c-- */

View File

@ -1,285 +0,0 @@
/*
* from ns.h 4.33 (Berkeley) 8/23/90
* $Id: ns_glob.h,v 8.12 1997/06/01 20:34:34 vixie Exp $
*/
/*
* ++Copyright++ 1986
* -
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
/*
* Global variables for the name server.
*/
#ifdef DEBUG
DECL int debug INIT(0);
DECL FILE *ddt INIT(NULL);
#endif
/* list of open streams */
DECL struct qstream *streamq INIT(QSTREAM_NULL);
/* list of datagram interfaces */
DECL struct qdatagram *datagramq INIT(QDATAGRAM_NULL);
/* often set to the current time */
DECL struct timeval tt;
/* head of allocated queries */
DECL struct qinfo *nsqhead INIT(QINFO_NULL);
/* list of forwarding hosts */
DECL struct fwdinfo *fwdtab INIT(NULL);
/* datagram socket */
DECL int ds INIT(-1);
/* listening TCP socket */
DECL int vs INIT(-1);
/* received SIGHUP, need to reload db */
DECL int needreload INIT(0);
/* need to call ns_maint()*/
DECL int needmaint INIT(0);
/* how often does ns_maint() need to be called, in seconds? */
/* (beware: this is also the upper bound on named_xfer real time) */
DECL int maint_interval INIT(15*60);
#ifdef CLEANCACHE
/* What's the minimum interval between cache cleanings? */
DECL int cache_interval INIT(60*60);
#endif
#ifdef XSTATS
/* What's the minimum interval between stats output? */
DECL int stats_interval INIT(60*60);
#endif
/* need to process finished zone transfers */
DECL int needendxfer INIT(0);
/* need to reload secondary zone(s) */
DECL int needzoneload INIT(0);
/* need to dump database */
DECL int needToDoadump INIT(0);
/* need to checkpoint cache */
DECL int needToChkpt INIT(0);
/* need to dump statistics */
DECL int needStatsDump INIT(0);
#ifdef XSTATS
/* need to exit
* set by shutdown signal handler
* (onintr)
*/
DECL int needToExit INIT(0);
#endif /* XSTATS */
#ifdef QRYLOG
/* is query logging turned on? */
DECL int qrylog INIT(0);
#endif /*QRYLOG*/
/* should this server not recurse? */
DECL int NoRecurse INIT(0);
/* should this server never fetch glue? */
DECL int NoFetchGlue INIT(0);
/*
* 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.
*/
DECL struct netinfo *nettab INIT(NULL);
DECL struct netinfo **elocal INIT(&nettab);
DECL struct netinfo **enettab INIT(&nettab);
#ifdef XFRNETS
/* list of nets we're willing to zone transfer to */
DECL struct netinfo *xfrnets INIT(NULL);
#endif
#ifdef BOGUSNS
/* list of bogus nameservers */
DECL struct netinfo *boglist INIT(NULL);
#endif
/* loopback net */
DECL struct netinfo netloop;
/* port to which we send queries */
DECL u_int16_t ns_port;
/* Source addr of last packet */
DECL struct sockaddr_in from_addr;
/* Used by ns_stats */
DECL time_t boottime,
resettime;
/* next query to retry */
DECL struct qinfo *retryqp INIT(NULL);
/* default boot file */
#ifdef BOOTFILE
DECL char *bootfile INIT(BOOTFILE);
#else
DECL char *bootfile INIT(_PATH_BOOT);
#endif
/* default debug output file */
#ifdef DEBUGFILE
DECL char *debugfile INIT(DEBUGFILE);
#else
DECL char *debugfile INIT(_PATH_DEBUG);
#endif
#ifdef WANT_PIDFILE
/* file to store current named PID */
#ifdef PIDFILE
DECL char *PidFile INIT(PIDFILE);
#else
DECL char *PidFile INIT(_PATH_PIDFILE);
#endif
#endif /*WANT_PIDFILE*/
/* zone information */
DECL struct zoneinfo *zones INIT(NULL);
/* number of zones in use */
DECL int nzones INIT(0);
/* true on slave server */
DECL int forward_only INIT(0);
/* set if we need a priming */
DECL int needs_prime_cache INIT(0);
/* is cache being primed */
DECL int priming INIT(0);
/* ptrs to dnames in msg for dn_comp */
DECL u_char *dnptrs[40];
/* number of names in addinfo */
DECL int addcount;
/* name of cache file */
DECL char *cache_file;
#ifdef LOCALDOM
/* our local domain (deprecated in favor of resolv.conf) */
DECL char *localdomain;
#endif
#ifdef SLAVE_FORWARD
/* retry time when a slave */
DECL int slave_retry INIT(4);
#endif
#ifdef STATSFILE
DECL const char *statsfile INIT(STATSFILE);
#else
DECL const char *statsfile INIT(_PATH_STATS);
#endif
DECL const char sendtoStr[] INIT("sendto");
/* defined in version.c, can't use DECL/INIT */
extern char Version[];
extern char ShortVersion[];
/* max value of xfers_running */
DECL int max_xfers_running INIT(MAX_XFERS_RUNNING);
/* max number of transfers to any given name server */
DECL int max_xfers_per_ns INIT(MAX_XFERS_PER_NS);
#ifndef INVQ
/* should IQUERY be answered bogusly rather than with NOTIMPL? */
DECL int fake_iquery INIT(0);
#endif
enum context { domain_ctx, owner_ctx, mailname_ctx, hostname_ctx };
DECL const char *context_strings[]
#ifdef MAIN_PROGRAM
= { "domain", "owner", "mail", "host", NULL }
#endif
;
enum transport { primary_trans, secondary_trans, response_trans, num_trans };
DECL const char *transport_strings[]
#ifdef MAIN_PROGRAM
= { "primary", "secondary", "response", NULL }
#endif
;
enum severity { ignore, warn, fail };
DECL const char *severity_strings[]
#ifdef MAIN_PROGRAM
= { "ignore", "warn", "fail", NULL }
#endif
;
DECL struct in_addr inaddr_any; /* Inits to 0.0.0.0 */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,183 +0,0 @@
/**************************************************************************
* ns_ncache.c
* author: anant kumar
* last modification: March 17, 1993
*
* implements negative caching
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <syslog.h>
#include <errno.h>
#include <stdio.h>
#include <resolv.h>
#include "named.h"
#ifdef NCACHE
#define BOUNDS_CHECK(ptr, count) \
do { \
if ((ptr) + (count) > eom) { \
return; \
} \
} while (0)
void
cache_n_resp(msg, msglen)
u_char *msg;
int msglen;
{
register struct databuf *dp;
HEADER *hp;
u_char *cp, *eom, *rdatap;
char dname[MAXDNAME];
int n;
int type, class;
#ifdef VALIDATE
int Vcode;
#endif
int flags;
u_int dlen;
nameserIncr(from_addr.sin_addr, nssRcvdNXD);
hp = (HEADER *)msg;
cp = msg+HFIXEDSZ;
eom = msg + msglen;
n = dn_expand(msg, eom, cp, dname, sizeof dname);
if (n < 0) {
dprintf(1, (ddt, "Query expand name failed:cache_n_resp\n"));
hp->rcode = FORMERR;
return;
}
cp += n;
BOUNDS_CHECK(cp, 2 * INT16SZ);
GETSHORT(type, cp);
GETSHORT(class, cp);
dprintf(1, (ddt,
"ncache: dname %s, type %d, class %d\n",
dname, type, class));
#ifdef VALIDATE
Vcode = validate(dname, dname, &from_addr, type, class, NULL, 0,
hp->rcode == NXDOMAIN ? NXDOMAIN : NOERROR_NODATA);
if (Vcode == INVALID || Vcode == VALID_NO_CACHE) {
/*Valid_no_cache should never occur but doesn't hurt to check*/
return;
}
#endif
#ifdef RETURNSOA
if (hp->nscount) {
u_int32_t ttl;
u_int16_t atype;
u_char *tp = cp;
u_char *cp1;
u_char data[MAXDNAME*2 + INT32SZ*5];
size_t len = sizeof data;
/* we store NXDOMAIN as T_SOA regardless of the query type */
if (hp->rcode == NXDOMAIN)
type = T_SOA;
/* store their SOA record */
n = dn_skipname(tp, eom);
if (n < 0) {
dprintf(3, (ddt, "ncache: form error\n"));
return;
}
tp += n;
BOUNDS_CHECK(tp, 3 * INT16SZ + INT32SZ);
GETSHORT(atype, tp); /* type */
if (atype != T_SOA) {
dprintf(3, (ddt,
"ncache: type (%d) != T_SOA\n",atype));
goto no_soa;
}
tp += INT16SZ; /* class */
GETLONG(ttl, tp); /* ttl */
GETSHORT(dlen, tp); /* dlen */
BOUNDS_CHECK(tp, dlen);
rdatap = tp;
/* origin */
n = dn_expand(msg, eom, tp, (char*)data, len);
if (n < 0) {
dprintf(3, (ddt, "ncache: form error 2\n"));
return;
}
tp += n;
n = strlen((char*)data) + 1;
cp1 = data + n;
len -= n;
/* mail */
n = dn_expand(msg, msg + msglen, tp, (char*)cp1, len);
if (n < 0) {
dprintf(3, (ddt, "ncache: form error 2\n"));
return;
}
tp += n;
n = strlen((char*)cp1) + 1;
cp1 += n;
len -= n;
n = 5 * INT32SZ;
BOUNDS_CHECK(tp, n);
bcopy(tp, cp1, n);
/* serial, refresh, retry, expire, min */
cp1 += n;
len -= n;
tp += n;
if (tp != rdatap + dlen) {
dprintf(3, (ddt, "ncache: form error 2\n"));
return;
}
/* store the zone of the soa record */
n = dn_expand(msg, msg + msglen, cp, (char*)cp1, len);
if (n < 0) {
dprintf(3, (ddt, "ncache: form error 2\n"));
return;
}
n = strlen((char*)cp1) + 1;
cp1 += n;
dp = savedata(class, type, MIN(ttl, NTTL) + tt.tv_sec, data,
cp1 - data);
} else {
no_soa:
#endif
dp = savedata(class, type, NTTL + tt.tv_sec, NULL, 0);
#ifdef RETURNSOA
}
#endif
dp->d_zone = DB_Z_CACHE;
dp->d_cred = hp->aa ? DB_C_AUTH : DB_C_ANSWER;
dp->d_clev = 0;
if(hp->rcode == NXDOMAIN) {
dp->d_rcode = NXDOMAIN;
flags = DB_NODATA|DB_NOTAUTH|DB_NOHINTS;
} else {
dp->d_rcode = NOERROR_NODATA;
flags = DB_NOTAUTH|DB_NOHINTS;
}
if ((n = db_update(dname, dp, dp, flags, hashtab)) != OK) {
dprintf(1, (ddt,
"db_update failed return value:%d, cache_n_resp()\n",
n));
db_free(dp);
return;
}
dprintf(4, (ddt,
"ncache succeeded: [%s %s %s] rcode:%d ttl:%ld\n",
dname, p_type(type), p_class(class),
dp->d_rcode, (long)(dp->d_ttl-tt.tv_sec)));
return;
}
#endif /*NCACHE*/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,171 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_sort.c 4.10 (Berkeley) 3/3/91";
static char rcsid[] = "$Id: ns_sort.c,v 8.3 1995/12/22 10:20:30 vixie Exp $";
#endif /* not lint */
/*
* ++Copyright++ 1986, 1990
* -
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <syslog.h>
#include <resolv.h>
#include "named.h"
static int sort_rr __P((u_char *cp, int count, struct netinfo *ntp, u_char *eom));
#ifdef SORT_RESPONSE
struct netinfo *
local(from)
struct sockaddr_in *from;
{
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->addr == (from->sin_addr.s_addr & ntp->mask))
return (ntp);
}
return (NULL);
}
void
sort_response(cp, ancount, lp, eom)
register u_char *cp;
register int ancount;
struct netinfo *lp;
u_char *eom;
{
register struct netinfo *ntp;
dprintf(3, (ddt, "sort_response(%d)\n", ancount));
if (ancount > 1) {
if (sort_rr(cp, ancount, lp, eom))
return;
for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
if ((ntp->addr == lp->addr) && (ntp->mask == lp->mask))
continue;
if (sort_rr(cp, ancount, ntp, eom))
break;
}
}
}
static 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->addr;
fprintf(ddt, "sort_rr(%#lx, %d, [%s])\n",
(u_long)cp, count, inet_ntoa(inaddr));
}
#endif
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 += INT32SZ;
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, INADDRSZ);
if (rr1 == NULL)
rr1 = cp;
if ((ntp->mask & inaddr.s_addr) == ntp->addr) {
dprintf(2, (ddt,"net [%s] best choice\n",
inet_ntoa(inaddr)));
if (rr1 != cp) {
bcopy(rr1, cp, INADDRSZ);
bcopy((char *)&inaddr, rr1, INADDRSZ);
}
return (1);
}
break;
}
break;
}
cp += dlen;
}
return (0);
}
#endif

View File

@ -1,394 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_stats.c 4.10 (Berkeley) 6/27/90";
static char rcsid[] = "$Id: ns_stats.c,v 8.8 1996/09/22 00:13:10 vixie Exp $";
#endif /* not lint */
/*
* ++Copyright++ 1986,1994
* -
* Copyright (c) 1986,1994
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
/**************************************************************************/
/* simple monitoring of named behavior */
/* dumps a bunch of values into a well-known file */
/**************************************************************************/
#include <sys/types.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <syslog.h>
#include <errno.h>
#include "named.h"
#include "tree.h"
static u_long typestats[T_ANY+1];
static const 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", "RP", "AFSDB", "X25",
"ISDN", "RT", "NSAP", "NSAP_PTR", "SIG",
"KEY", "PX", "invalid(GPOS)", "AAAA", "LOC",
0, 0, 0, 0, 0,
0, 0, 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,
/* 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"
};
static void nameserStats __P((FILE *));
void
ns_stats()
{
time_t timenow = time(NULL);
register FILE *f;
register int i;
syslog(LOG_NOTICE, "dumping nameserver stats\n");
if (!(f = fopen(statsfile, "a"))) {
syslog(LOG_NOTICE, "cannot open stat file, \"%s\"\n",
statsfile);
return;
}
fprintf(f, "+++ Statistics Dump +++ (%ld) %s",
(long)timenow, ctime(&timenow));
fprintf(f, "%ld\ttime since boot (secs)\n",
(long)(timenow - boottime));
fprintf(f, "%ld\ttime since reset (secs)\n",
(long)(timenow - resettime));
/* query type statistics */
fprintf(f, "%lu\tUnknown query types\n", (u_long)typestats[0]);
for(i=1; i < T_ANY+1; i++)
if (typestats[i])
if (typenames[i])
fprintf(f, "%lu\t%s queries\n",
(u_long)typestats[i], typenames[i]);
else
fprintf(f, "%lu\ttype %d queries\n",
(u_long)typestats[i], i);
/* name server statistics */
nameserStats(f);
fprintf(f, "--- Statistics Dump --- (%ld) %s",
(long)timenow, ctime(&timenow));
(void) my_fclose(f);
syslog(LOG_NOTICE, "done dumping nameserver stats\n");
}
void
qtypeIncr(qtype)
int qtype;
{
if (qtype < T_A || qtype > T_ANY)
qtype = 0; /* bad type */
typestats[qtype]++;
}
static tree *nameserTree;
static int nameserInit;
#ifdef STATS
static FILE *nameserStatsFile;
static u_long globalStats[nssLast];
static const char *statNames[nssLast] = {
"RR", /* sent us an answer */
"RNXD", /* sent us a negative response */
"RFwdR", /* sent us a response we had to fwd */
"RDupR", /* sent us an extra answer */
"RFail", /* sent us a SERVFAIL */
"RFErr", /* sent us a FORMERR */
"RErr", /* sent us some other error */
"RAXFR", /* sent us an AXFR */
"RLame", /* sent us a lame delegation */
"ROpts", /* sent us some IP options */
"SSysQ", /* sent them a sysquery */
"SAns", /* sent them an answer */
"SFwdQ", /* fwdd a query to them */
"SDupQ", /* sent them a retry */
"SErr", /* sent failed (in sendto) */
#ifdef XSTATS
"RQ", /* sent us a query */
"RIQ", /* sent us an inverse query */
"RFwdQ", /* sent us a query we had to fwd */
"RDupQ", /* sent us a retry */
"RTCP", /* sent us a query using TCP */
"SFwdR", /* fwdd a response to them */
"SFail", /* sent them a SERVFAIL */
"SFErr", /* sent them a FORMERR */
"SNaAns", /* sent them a non autoritative answer */
"SNXD", /* sent them a negative response */
#endif
};
#endif /*STATS*/
static int
nameserCompar(t1, t2)
const tree_t t1, t2;
{
u_int32_t a1 = ntohl(((struct nameser *)t1)->addr.s_addr),
a2 = ntohl(((struct nameser *)t2)->addr.s_addr);
if (a1 < a2)
return (-1);
else if (a1 > a2)
return (1);
else
return (0);
}
struct nameser *
nameserFind(addr, flags)
struct in_addr addr;
int flags;
{
struct nameser dummy;
struct nameser *ns;
if (!nameserInit) {
tree_init(&nameserTree);
nameserInit++;
}
dummy.addr = addr;
ns = (struct nameser *)tree_srch(&nameserTree, nameserCompar,
(tree_t)&dummy);
if (!ns && (flags & NS_F_INSERT)) {
ns = (struct nameser *)malloc(sizeof(struct nameser));
if (!ns) {
nomem: if (!haveComplained("nameserFind complaint", ""))
syslog(LOG_NOTICE,
"nameserFind: malloc failed; %m");
return (NULL);
}
memset(ns, 0, sizeof(struct nameser));
ns->addr = addr;
if (!tree_add(&nameserTree, nameserCompar, (tree_t)ns, NULL)) {
int save = errno;
free(ns);
errno = save;
goto nomem;
}
}
return (ns);
}
void
nameserIncr(addr, which)
struct in_addr addr;
enum nameserStats which;
{
#ifdef STATS
struct nameser *ns = nameserFind(addr, NS_F_INSERT);
if ((int)which < (int)nssLast) {
if (ns)
ns->stats[(int)which]++;
globalStats[(int)which]++;
} else {
syslog(LOG_DEBUG, "nameserIncr([%d], %d): bad 'which'",
inet_ntoa(addr), (int)which);
}
#endif /*STATS*/
}
#ifdef STATS
static void
nameserStatsOut(f, stats)
FILE *f;
u_long stats[];
{
int i;
const char *pre = "\t";
for (i = 0; i < (int)nssLast; i++) {
fprintf(f, "%s%lu", pre, (u_long)stats[i]);
pre = ((i+1) % 5) ? " " : " ";
}
fputc('\n', f);
}
static void
nameserStatsHdr(f)
FILE *f;
{
int i;
const char *pre = "\t";
fprintf(f, "(Legend)\n");
for (i = 0; i < (int)nssLast; i++) {
fprintf(f, "%s%s", pre,
statNames[i] ? statNames[i] : "");
pre = ((i+1) % 5) ? "\t" : "\n\t";
}
fputc('\n', f);
}
static int
nameserStatsTravUAR(t)
tree_t t;
{
struct nameser *ns = (struct nameser *)t;
fprintf(nameserStatsFile, "[%s]\n", /* : rtt %u */
inet_ntoa(ns->addr) /*, ns->rtt*/ );
nameserStatsOut(nameserStatsFile, ns->stats);
return (1);
}
#endif /*STATS*/
static void
nameserStats(f)
FILE *f;
{
#ifndef STATS
fprintf(f, "<<No nameserver statistics in this server>>\n");
#else
nameserStatsFile = f;
fprintf(f, "++ Name Server Statistics ++\n");
nameserStatsHdr(f);
fprintf(f, "(Global)\n");
nameserStatsOut(f, globalStats);
tree_trav(&nameserTree, nameserStatsTravUAR);
fprintf(f, "-- Name Server Statistics --\n");
nameserStatsFile = NULL;
#endif /*STATS*/
}
#ifdef XSTATS
/* Benoit Grange, log minimal statistics, called from ns_maint */
void
ns_logstats()
{
char buffer[1024];
char buffer2[32], header[64];
time_t timenow = time(NULL);
int i;
#ifdef HAVE_GETRUSAGE
# define tv_float(tv) ((tv).tv_sec + ((tv).tv_usec / 1000000.0))
struct rusage usage, childu;
getrusage(RUSAGE_SELF, &usage);
getrusage(RUSAGE_CHILDREN, &childu);
sprintf(buffer, "CPU=%gu/%gs CHILDCPU=%gu/%gs",
tv_float(usage.ru_utime), tv_float(usage.ru_stime),
tv_float(childu.ru_utime), tv_float(childu.ru_stime));
syslog(LOG_INFO, "USAGE %lu %lu %s", (u_long)timenow, (u_long)boottime,
buffer);
# undef tv_float
#endif
sprintf(header, "NSTATS %lu %lu", (u_long)timenow, (u_long)boottime);
strcpy(buffer, header);
for (i = 0; i < T_ANY+1; i++) {
if (typestats[i]) {
if (typenames[i])
sprintf(buffer2, " %s=%lu",
typenames[i], typestats[i]);
else
sprintf(buffer2, " %d=%lu", i, typestats[i]);
if (strlen(buffer) + strlen(buffer2) >
sizeof(buffer) - 1) {
syslog(LOG_INFO, buffer);
strcpy(buffer, header);
}
strcat(buffer, buffer2);
}
}
syslog(LOG_INFO, buffer);
sprintf(header, "XSTATS %lu %lu", (u_long)timenow, (u_long)boottime);
strcpy(buffer, header);
for (i = 0; i < (int)nssLast; i++) {
sprintf(buffer2, " %s=%lu",
statNames[i]?statNames[i]:"?", (u_long)globalStats[i]);
if (strlen(buffer) + strlen(buffer2) > sizeof(buffer) - 1) {
syslog(LOG_INFO, buffer);
strcpy(buffer, header);
}
strcat(buffer, buffer2);
}
syslog(LOG_INFO, buffer);
}
#endif /*XSTATS*/

View File

@ -1,113 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char rcsid[] = "$Id: ns_udp.c,v 8.3 1996/08/27 08:33:23 vixie Exp $";
#endif /* not lint */
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <syslog.h>
#include <netdb.h>
#include <nlist.h>
#include <resolv.h>
#include "named.h"
void
ns_udp() {
#if defined(CHECK_UDP_SUM) || defined(FIX_UDP_SUM)
struct nlist nl[2];
int fd;
int sum;
u_long res, offset;
nl[0].n_name = UDPSUM;
nl[1].n_name = 0;
if (nlist(KSYMS, nl)) {
dprintf(1, (ddt, "ns_udp: nlist (%s,%s) failed\n",
KSYMS, UDPSUM));
return;
}
dprintf(1, (ddt, "ns_udp: %s %d %lu (%ld)\n",
nl[0].n_name, nl[0].n_type, nl[0].n_value,
nl[0].n_value));
if (!nl[0].n_type)
return;
if ((fd = open(KMEM, O_RDWR, 0)) < 0) {
dprintf(1, (ddt, "ns_udp: open %s failed\n", KMEM));
return;
}
offset = nl[0].n_value;
#ifdef KMAP
offset &= ((~0UL)>>1);
#endif
res = lseek(fd, offset, SEEK_SET);
if (res != offset) {
dprintf(1, (ddt, "ns_udp: lseek %ul failed %lu %d\n",
offset, res, errno));
goto cleanup;
}
if (read(fd, &sum, sizeof(sum)) != sizeof(sum)) {
dprintf(1, (ddt, "ns_udp: read failed\n"));
goto cleanup;
}
dprintf(1, (ddt, "ns_udp: %d\n", sum));
if (sum == 0) {
#ifdef FIX_UDP_SUM
sum = 1;
lseek(fd, offset, SEEK_SET);
if (res != offset) {
dprintf(1, (ddt, "ns_udp: lseek %ul failed %lu %d\n",
offset, res, errno));
goto cleanup;
}
if (write(fd, &sum, sizeof(sum)) != sizeof(sum)) {
dprintf(1, (ddt, "ns_udp: write failed\n"));
goto cleanup;
}
dprintf(1, (ddt, "ns_udp: set to 1\n"));
syslog(LOG_WARNING, "ns_udp: check sums turned on");
#else
dprintf(1, (ddt, "ns_udp: Exiting\n"));
syslog(LOG_WARNING, "ns_udp: checksums NOT turned on: Exiting");
exit(1);
#endif
}
cleanup:
close(fd);
#endif
}

File diff suppressed because it is too large Load Diff

View File

@ -1,122 +0,0 @@
/*
* @(#)pathnames.h 5.4 (Berkeley) 6/1/90
* $Id: pathnames.h,v 8.1 1994/12/15 06:24:14 vixie Exp $
*/
/*
* ++Copyright++ 1989
* -
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#ifdef _PATH_XFER
# define _PATH_XFER_PREDEFINED /* probably from Makefile */
#endif
#if defined (__sgi) && !defined(_SYSTYPE_SVR4) && !defined(__SYSTYPE_SVR4)
#define _PATH_BOOT "/usr/etc/named.d/named.boot"
#else
#define _PATH_BOOT "/etc/named.boot"
#endif
#if defined(BSD) && BSD >= 198810
#include <paths.h>
#ifndef _PATH_XFER
# define _PATH_XFER "/usr/libexec/named-xfer"
#endif
#define _PATH_DEBUG "/var/tmp/named.run"
#define _PATH_DUMPFILE "/var/tmp/named_dump.db"
#ifndef _PATH_PIDFILE
# define _PATH_PIDFILE "/var/run/named.pid"
#endif
#define _PATH_STATS "/var/tmp/named.stats"
#define _PATH_XFERTRACE "/var/tmp/xfer.trace"
#define _PATH_XFERDDT "/var/tmp/xfer.ddt"
#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"
#ifndef _PATH_XFER
# define _PATH_XFER "/etc/named-xfer"
#endif
#define _PATH_DEBUG "/usr/tmp/named.run"
#define _PATH_DUMPFILE "/usr/tmp/named_dump.db"
#ifndef _PATH_PIDFILE
# define _PATH_PIDFILE "/etc/named.pid"
#endif
#define _PATH_STATS "/usr/tmp/named.stats"
#define _PATH_XFERTRACE "/usr/tmp/xfer.trace"
#define _PATH_XFERDDT "/usr/tmp/xfer.ddt"
#define _PATH_TMPXFER "/usr/tmp/xfer.ddt.XXXXXX"
#define _PATH_TMPDIR "/usr/tmp"
#endif /* BSD */
#ifndef _PATH_XFER_PREDEFINED
# if defined(__sgi) || defined(NeXT) || defined(__ultrix)
# undef _PATH_XFER
# define _PATH_XFER "/usr/etc/named-xfer"
# endif
# if defined(__osf__)
# undef _PATH_XFER
# define _PATH_XFER "/usr/sbin/named-xfer"
# endif
# ifdef sun
# undef _PATH_XFER
# define _PATH_XFER "/usr/etc/in.named-xfer"
# endif
#else
# undef _PATH_XFER_PREDEFINED
#endif /*_PATH_XFER_PREDEFINED*/

View File

@ -1,205 +0,0 @@
/*
* ++Copyright++ 1985, 1989
* -
* Copyright (c) 1985, 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#include <sys/types.h>
#include <sys/param.h>
#include <syslog.h>
#include "../conf/portability.h"
#include "../conf/options.h"
extern void panic __P((int, const char *));
#ifdef DSTORAGE
/*
* 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 8.2 1996/08/05 08:31:30 vixie Exp $";
#endif
#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;
cnt = (cnt+2*sizeof(int)-1)&(~(sizeof(int)-1));
ptr = malloc(cnt);
if( ptr==(char *)0 ) {
panic(errno, "rt_malloc: malloc failure");
} 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 )
panic(-1, "rt_free: corrupt magic");
}
mp->mdb_len = 0; /* successful free */
goto ok;
}
panic(-1, "rt_free: bad pointer");
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;
{
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);
}
#endif /*DSTORAGE*/

View File

@ -1,570 +0,0 @@
/* tree - balanced binary tree library
*
* vix 05apr94 [removed vixie.h dependencies; cleaned up formatting, names]
* vix 22jan93 [revisited; uses RCS, ANSI, POSIX; has bug fixes]
* vix 23jun86 [added delete uar to add for replaced nodes]
* vix 20jun86 [added tree_delete per wirth a+ds (mod2 v.) p. 224]
* vix 06feb86 [added tree_mung()]
* vix 02feb86 [added tree balancing from wirth "a+ds=p" p. 220-221]
* vix 14dec85 [written]
*/
/* This program text was created by Paul Vixie using examples from the book:
* "Algorithms & Data Structures," Niklaus Wirth, Prentice-Hall, 1986, ISBN
* 0-13-022005-1. Any errors in the conversion from Modula-2 to C are Paul
* Vixie's.
*
* This code and associated documentation is hereby placed in the public
* domain, with the wish that my name and Prof. Wirth's not be removed
* from the source or documentation.
*/
#ifndef LINT
static char RCSid[] = "$Id:";
#endif
/*#define DEBUG "tree"*/
#include <stdio.h>
#ifndef _PATH_XFER
# include <stdlib.h>
#else
# include "../conf/portability.h"
#endif
#include "tree.h"
#ifdef DEBUG
static int debugDepth = 0;
static char *debugFuncs[256];
# define ENTER(proc) { \
debugFuncs[debugDepth] = proc; \
fprintf(stderr, "ENTER(%d:%s.%s)\n", \
debugDepth, DEBUG,
debugFuncs[debugDepth]); \
debugDepth++; \
}
# define RET(value) { \
debugDepth--; \
fprintf(stderr, "RET(%d:%s.%s)\n", \
debugDepth, DEBUG, \
debugFuncs[debugDepth]); \
return (value); \
}
# define RETV { \
debugDepth--; \
fprintf(stderr, "RETV(%d:%s.%s)\n", \
debugDepth, DEBUG, \
debugFuncs[debugDepth]); \
return; \
}
# define MSG(msg) fprintf(stderr, "MSG(%s)\n", msg);
#else
# define ENTER(proc) ;
# define RET(value) return (value);
# define RETV return;
# define MSG(msg) ;
#endif
#ifndef TRUE
# define TRUE 1
# define FALSE 0
#endif
static tree * sprout __P( (tree **, tree_t, int *, int (*)(), void (*)()) );
static int delete __P( (tree **, int (*)(), tree_t, void (*)(),
int *, int *) );
static void del __P( (tree **, int *, tree **, void (*)(), int *) );
static void bal_L __P( (tree **, int *) );
static void bal_R __P( (tree **, int *) );
void
tree_init(ppr_tree)
tree **ppr_tree;
{
ENTER("tree_init")
*ppr_tree = NULL;
RETV
}
tree_t
tree_srch(ppr_tree, pfi_compare, p_user)
tree **ppr_tree;
int (*pfi_compare)();
tree_t p_user;
{
register int i_comp;
ENTER("tree_srch")
if (*ppr_tree) {
i_comp = (*pfi_compare)(p_user, (**ppr_tree).data);
if (i_comp > 0)
RET(tree_srch(&(**ppr_tree).right,
pfi_compare,
p_user))
if (i_comp < 0)
RET(tree_srch(&(**ppr_tree).left,
pfi_compare,
p_user))
/* not higher, not lower... this must be the one.
*/
RET((**ppr_tree).data)
}
/* grounded. NOT found.
*/
RET(NULL)
}
tree_t
tree_add(ppr_tree, pfi_compare, p_user, pfv_uar)
tree **ppr_tree;
int (*pfi_compare)();
tree_t p_user;
void (*pfv_uar)();
{
int i_balance = FALSE;
ENTER("tree_add")
if (!sprout(ppr_tree, p_user, &i_balance, pfi_compare, pfv_uar))
RET(NULL)
RET(p_user)
}
int
tree_delete(ppr_p, pfi_compare, p_user, pfv_uar)
tree **ppr_p;
int (*pfi_compare)();
tree_t p_user;
void (*pfv_uar)();
{
int i_balance = FALSE,
i_uar_called = FALSE;
ENTER("tree_delete");
RET(delete(ppr_p, pfi_compare, p_user, pfv_uar,
&i_balance, &i_uar_called))
}
int
tree_trav(ppr_tree, pfi_uar)
tree **ppr_tree;
int (*pfi_uar)();
{
ENTER("tree_trav")
if (!*ppr_tree)
RET(TRUE)
if (!tree_trav(&(**ppr_tree).left, pfi_uar))
RET(FALSE)
if (!(*pfi_uar)((**ppr_tree).data))
RET(FALSE)
if (!tree_trav(&(**ppr_tree).right, pfi_uar))
RET(FALSE)
RET(TRUE)
}
void
tree_mung(ppr_tree, pfv_uar)
tree **ppr_tree;
void (*pfv_uar)();
{
ENTER("tree_mung")
if (*ppr_tree) {
tree_mung(&(**ppr_tree).left, pfv_uar);
tree_mung(&(**ppr_tree).right, pfv_uar);
if (pfv_uar)
(*pfv_uar)((**ppr_tree).data);
free(*ppr_tree);
*ppr_tree = NULL;
}
RETV
}
static tree *
sprout(ppr, p_data, pi_balance, pfi_compare, pfv_delete)
tree **ppr;
tree_t p_data;
int *pi_balance;
int (*pfi_compare)();
void (*pfv_delete)();
{
tree *p1, *p2, *sub;
int cmp;
ENTER("sprout")
/* are we grounded? if so, add the node "here" and set the rebalance
* flag, then exit.
*/
if (!*ppr) {
MSG("grounded. adding new node, setting h=true")
*ppr = (tree *) malloc(sizeof(tree));
if (*ppr) {
(*ppr)->left = NULL;
(*ppr)->right = NULL;
(*ppr)->bal = 0;
(*ppr)->data = p_data;
*pi_balance = TRUE;
}
RET(*ppr);
}
/* compare the data using routine passed by caller.
*/
cmp = (*pfi_compare)(p_data, (*ppr)->data);
/* if LESS, prepare to move to the left.
*/
if (cmp < 0) {
MSG("LESS. sprouting left.")
sub = sprout(&(*ppr)->left, p_data, pi_balance,
pfi_compare, pfv_delete);
if (sub && *pi_balance) { /* left branch has grown */
MSG("LESS: left branch has grown")
switch ((*ppr)->bal) {
case 1: /* right branch WAS longer; bal is ok now */
MSG("LESS: case 1.. bal restored implicitly")
(*ppr)->bal = 0;
*pi_balance = FALSE;
break;
case 0: /* balance WAS okay; now left branch longer */
MSG("LESS: case 0.. balnce bad but still ok")
(*ppr)->bal = -1;
break;
case -1: /* left branch was already too long. rebal */
MSG("LESS: case -1: rebalancing")
p1 = (*ppr)->left;
if (p1->bal == -1) { /* LL */
MSG("LESS: single LL")
(*ppr)->left = p1->right;
p1->right = *ppr;
(*ppr)->bal = 0;
*ppr = p1;
} else { /* double LR */
MSG("LESS: double LR")
p2 = p1->right;
p1->right = p2->left;
p2->left = p1;
(*ppr)->left = p2->right;
p2->right = *ppr;
if (p2->bal == -1)
(*ppr)->bal = 1;
else
(*ppr)->bal = 0;
if (p2->bal == 1)
p1->bal = -1;
else
p1->bal = 0;
*ppr = p2;
} /*else*/
(*ppr)->bal = 0;
*pi_balance = FALSE;
} /*switch*/
} /*if*/
RET(sub)
} /*if*/
/* if MORE, prepare to move to the right.
*/
if (cmp > 0) {
MSG("MORE: sprouting to the right")
sub = sprout(&(*ppr)->right, p_data, pi_balance,
pfi_compare, pfv_delete);
if (sub && *pi_balance) {
MSG("MORE: right branch has grown")
switch ((*ppr)->bal) {
case -1:
MSG("MORE: balance was off, fixed implicitly")
(*ppr)->bal = 0;
*pi_balance = FALSE;
break;
case 0:
MSG("MORE: balance was okay, now off but ok")
(*ppr)->bal = 1;
break;
case 1:
MSG("MORE: balance was off, need to rebalance")
p1 = (*ppr)->right;
if (p1->bal == 1) { /* RR */
MSG("MORE: single RR")
(*ppr)->right = p1->left;
p1->left = *ppr;
(*ppr)->bal = 0;
*ppr = p1;
} else { /* double RL */
MSG("MORE: double RL")
p2 = p1->left;
p1->left = p2->right;
p2->right = p1;
(*ppr)->right = p2->left;
p2->left = *ppr;
if (p2->bal == 1)
(*ppr)->bal = -1;
else
(*ppr)->bal = 0;
if (p2->bal == -1)
p1->bal = 1;
else
p1->bal = 0;
*ppr = p2;
} /*else*/
(*ppr)->bal = 0;
*pi_balance = FALSE;
} /*switch*/
} /*if*/
RET(sub)
} /*if*/
/* not less, not more: this is the same key! replace...
*/
MSG("FOUND: Replacing data value")
*pi_balance = FALSE;
if (pfv_delete)
(*pfv_delete)((*ppr)->data);
(*ppr)->data = p_data;
RET(*ppr)
}
static int
delete(ppr_p, pfi_compare, p_user, pfv_uar, pi_balance, pi_uar_called)
tree **ppr_p;
int (*pfi_compare)();
tree_t p_user;
void (*pfv_uar)();
int *pi_balance;
int *pi_uar_called;
{
tree *pr_q;
int i_comp, i_ret;
ENTER("delete")
if (*ppr_p == NULL) {
MSG("key not in tree")
RET(FALSE)
}
i_comp = (*pfi_compare)((*ppr_p)->data, p_user);
if (i_comp > 0) {
MSG("too high - scan left")
i_ret = delete(&(*ppr_p)->left, pfi_compare, p_user, pfv_uar,
pi_balance, pi_uar_called);
if (*pi_balance)
bal_L(ppr_p, pi_balance);
} else if (i_comp < 0) {
MSG("too low - scan right")
i_ret = delete(&(*ppr_p)->right, pfi_compare, p_user, pfv_uar,
pi_balance, pi_uar_called);
if (*pi_balance)
bal_R(ppr_p, pi_balance);
} else {
MSG("equal")
pr_q = *ppr_p;
if (pr_q->right == NULL) {
MSG("right subtree null")
*ppr_p = pr_q->left;
*pi_balance = TRUE;
} else if (pr_q->left == NULL) {
MSG("right subtree non-null, left subtree null")
*ppr_p = pr_q->right;
*pi_balance = TRUE;
} else {
MSG("neither subtree null")
del(&pr_q->left, pi_balance, &pr_q,
pfv_uar, pi_uar_called);
if (*pi_balance)
bal_L(ppr_p, pi_balance);
}
if (!*pi_uar_called && pfv_uar)
(*pfv_uar)(pr_q->data);
free(pr_q); /* thanks to wuth@castrov.cuc.ab.ca */
i_ret = TRUE;
}
RET(i_ret)
}
static void
del(ppr_r, pi_balance, ppr_q, pfv_uar, pi_uar_called)
tree **ppr_r;
int *pi_balance;
tree **ppr_q;
void (*pfv_uar)();
int *pi_uar_called;
{
ENTER("del")
if ((*ppr_r)->right != NULL) {
del(&(*ppr_r)->right, pi_balance, ppr_q,
pfv_uar, pi_uar_called);
if (*pi_balance)
bal_R(ppr_r, pi_balance);
} else {
if (pfv_uar)
(*pfv_uar)((*ppr_q)->data);
*pi_uar_called = TRUE;
(*ppr_q)->data = (*ppr_r)->data;
*ppr_q = *ppr_r;
*ppr_r = (*ppr_r)->left;
*pi_balance = TRUE;
}
RETV
}
static void
bal_L(ppr_p, pi_balance)
tree **ppr_p;
int *pi_balance;
{
tree *p1, *p2;
int b1, b2;
ENTER("bal_L")
MSG("left branch has shrunk")
switch ((*ppr_p)->bal) {
case -1:
MSG("was imbalanced, fixed implicitly")
(*ppr_p)->bal = 0;
break;
case 0:
MSG("was okay, is now one off")
(*ppr_p)->bal = 1;
*pi_balance = FALSE;
break;
case 1:
MSG("was already off, this is too much")
p1 = (*ppr_p)->right;
b1 = p1->bal;
if (b1 >= 0) {
MSG("single RR")
(*ppr_p)->right = p1->left;
p1->left = *ppr_p;
if (b1 == 0) {
MSG("b1 == 0")
(*ppr_p)->bal = 1;
p1->bal = -1;
*pi_balance = FALSE;
} else {
MSG("b1 != 0")
(*ppr_p)->bal = 0;
p1->bal = 0;
}
*ppr_p = p1;
} else {
MSG("double RL")
p2 = p1->left;
b2 = p2->bal;
p1->left = p2->right;
p2->right = p1;
(*ppr_p)->right = p2->left;
p2->left = *ppr_p;
if (b2 == 1)
(*ppr_p)->bal = -1;
else
(*ppr_p)->bal = 0;
if (b2 == -1)
p1->bal = 1;
else
p1->bal = 0;
*ppr_p = p2;
p2->bal = 0;
}
}
RETV
}
static void
bal_R(ppr_p, pi_balance)
tree **ppr_p;
int *pi_balance;
{
tree *p1, *p2;
int b1, b2;
ENTER("bal_R")
MSG("right branch has shrunk")
switch ((*ppr_p)->bal) {
case 1:
MSG("was imbalanced, fixed implicitly")
(*ppr_p)->bal = 0;
break;
case 0:
MSG("was okay, is now one off")
(*ppr_p)->bal = -1;
*pi_balance = FALSE;
break;
case -1:
MSG("was already off, this is too much")
p1 = (*ppr_p)->left;
b1 = p1->bal;
if (b1 <= 0) {
MSG("single LL")
(*ppr_p)->left = p1->right;
p1->right = *ppr_p;
if (b1 == 0) {
MSG("b1 == 0")
(*ppr_p)->bal = -1;
p1->bal = 1;
*pi_balance = FALSE;
} else {
MSG("b1 != 0")
(*ppr_p)->bal = 0;
p1->bal = 0;
}
*ppr_p = p1;
} else {
MSG("double LR")
p2 = p1->right;
b2 = p2->bal;
p1->right = p2->left;
p2->left = p1;
(*ppr_p)->left = p2->right;
p2->right = *ppr_p;
if (b2 == -1)
(*ppr_p)->bal = 1;
else
(*ppr_p)->bal = 0;
if (b2 == 1)
p1->bal = -1;
else
p1->bal = 0;
*ppr_p = p2;
p2->bal = 0;
}
}
RETV
}

View File

@ -1,48 +0,0 @@
/* tree.h - declare structures used by tree library
*
* vix 22jan93 [revisited; uses RCS, ANSI, POSIX; has bug fixes]
* vix 27jun86 [broken out of tree.c]
*
* $Id: tree.h,v 8.1 1994/12/15 06:24:14 vixie Exp $
*/
#ifndef _TREE_H_INCLUDED
#define _TREE_H_INCLUDED
#ifndef __P
# if defined(__STDC__) || defined(__GNUC__)
# define __P(x) x
# else
# define __P(x) ()
# endif
#endif
/*
* tree_t is our package-specific anonymous pointer.
*/
#if defined(__STDC__) || defined(__GNUC__)
typedef void *tree_t;
#else
typedef char *tree_t;
#endif
typedef struct tree_s {
tree_t data;
struct tree_s *left, *right;
short bal;
}
tree;
void tree_init __P((tree **));
tree_t tree_srch __P((tree **, int (*)(), tree_t));
tree_t tree_add __P((tree **, int (*)(), tree_t, void (*)()));
int tree_delete __P((tree **, int (*)(), tree_t, void (*)()));
int tree_trav __P((tree **, int (*)()));
void tree_mung __P((tree **, void (*)()));
#endif /* _TREE_H_INCLUDED */

View File

@ -1,154 +0,0 @@
.TH TREE 3 "5 April 1994"
.\" from .TH TREE 3 "22 Jan 1993"
.\" from .TH TREE 2 "23 June 1986"
.UC 4
.SH NAME
tree_init, tree_mung, tree_srch, tree_add, tree_delete, tree_trav
\- balanced binary tree routines
.SH SYNOPSIS
.nf
.B void
.B tree_init(tree)
.B void **tree;
.PP
.B void *
.B tree_srch(tree, compare, data)
.B void **tree;
.B int (*compare)();
.B void *data;
.PP
.B void
.B tree_add(tree, compare, data, del_uar)
.B void **tree;
.B int (*compare)();
.B void *data;
.B void (*del_uar)();
.PP
.B int
.B tree_delete(tree, compare, data, del_uar)
.B void **tree;
.B int (*compare)();
.B void *data;
.B void (*del_uar)();
.PP
.B int
.B tree_trav(tree, trav_uar)
.B void **tree;
.B int (*trav_uar)();
.PP
.B void
.B tree_mung(tree, del_uar)
.B void **tree;
.B void (*del_uar)();
.fi
.SH DESCRIPTION
These functions create and manipulate a balanced binary (AVL) tree. Each node
of the tree contains the expected left & right subtree pointers, a short int
balance indicator, and a pointer to the user data. On a 32 bit system, this
means an overhead of 4+4+2+4 bytes per node (or, on a RISC or otherwise
alignment constrained system with implied padding, 4+4+4+4 bytes per node).
There is no key data type enforced by this package; a caller supplied
compare routine is used to compare user data blocks.
.PP
Balanced binary trees are very fast on searches and replacements, but have a
moderately high cost for additions and deletions. If your application does a
lot more searches and replacements than it does additions and deletions, the
balanced (AVL) binary tree is a good choice for a data structure.
.PP
.I Tree_init
creates an empty tree and binds it to
.I tree
(which for this and all other routines in this package should be declared as
a pointer to void or int, and passed by reference), which can then be used by
other routines in this package. Note that more than one
.I tree
variable can exist at once; thus multiple trees can be manipulated
simultaneously.
.PP
.I Tree_srch
searches a tree for a specific node and returns either
.I NULL
if no node was found, or the value of the user data pointer if the node
was found.
.I compare
is the address of a function to compare two user data blocks. This routine
should work much the way
.IR strcmp (3)
does; in fact,
.I strcmp
could be used if the user data was a \s-2NUL\s+2 terminated string.
.I data
is the address of a user data block to be used by
.I compare
as the search criteria. The tree is searched for a node where
.I compare
returns 0.
.PP
.I Tree_add
inserts or replaces a node in the specified tree. The tree specified by
.I tree
is searched as in
.I tree_srch,
and if a node is found to match
.I data,
then the
.I del_uar
function, if non\-\s-2NULL\s+2, is called with the address of the user data
block for the node (this routine should deallocate any dynamic memory which
is referenced exclusively by the node); the user data pointer for the node
is then replaced by the value of
.I data.
If no node is found to match, a new node is added (which may or may not
cause a transparent rebalance operation), with a user data pointer equal to
.I data.
A rebalance may or may not occur, depending on where the node is added
and what the rest of the tree looks like.
.I Tree_add
will return the
.I data
pointer unless catastrophe occurs in which case it will return \s-2NULL\s+2.
.PP
.I Tree_delete
deletes a node from
.I tree.
A rebalance may or may not occur, depending on where the node is removed from
and what the rest of the tree looks like.
.I Tree_delete
returns TRUE if a node was deleted, FALSE otherwise.
.PP
.I Tree_trav
traverses all of
.I tree,
calling
.I trav_uar
with the address of each user data block. If
.I trav_uar
returns FALSE at any time,
.I tree_trav
will immediately return FALSE to its caller. Otherwise all nodes will be
reached and
.I tree_trav
will return TRUE.
.PP
.I Tree_mung
deletes every node in
.I tree,
calling
.I del_uar
(if it is not \s-2NULL\s+2) with the user data address from each node (see
.I tree_add
and
.I tree_delete
above). The tree is left in the same state that
.I tree_init
leaves it in \- i.e., empty.
.SH BUGS
Should have a way for the caller to specify application specific
.I malloc
and
.I free
functions to be used internally when allocating meta data.
.SH AUTHOR
Paul Vixie, converted and augumented from Modula\-2 examples in
.I Algorithms & Data Structures,
Niklaus Wirth, Prentice\-Hall, ISBN 0\-13\-022005\-1.

View File

@ -1,114 +0,0 @@
#
# from @(#)Makefile 5.16 (Berkeley) 3/14/88
# $Id: Makefile,v 8.14 1997/06/01 20:34:37 vixie Exp $
#
## ++Copyright++ 1988, 1995
## -
## Copyright (c) 1988, 1995
## 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.
## -
## Portions Copyright (c) 1993 by Digital Equipment Corporation.
##
## Permission to use, copy, modify, and distribute this software for any
## purpose with or without fee is hereby granted, provided that the above
## copyright notice and this permission notice appear in all copies, and that
## the name of Digital Equipment Corporation not be used in advertising or
## publicity pertaining to distribution of the document or software without
## specific, written prior permission.
##
## THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
## WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
## OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
## CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
## DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
## -
## --Copyright--
DESTDIR =
DESTLIB = /usr/lib
CC= cc
SHELL= /bin/sh
CDEBUG= -g
INCL = ../include
COMPINCL = ../compat/include
AR= ar cru
RANLIB= ranlib
DEFS=
LOCDEFS= -DUSE_OPTIONS_H
INSTALL= install
AROBJS= ${ARPREF} ${OBJS} ${ARSUFF}
CFLAGS= ${CDEBUG} -I${INCL} -I${COMPINCL} ${DEFS} ${LOCDEFS}
SRCS= base64.c herror.c res_debug.c res_data.c \
res_comp.c res_init.c res_mkquery.c res_query.c res_send.c \
getnetbyaddr.c getnetbyname.c getnetent.c getnetnamadr.c \
gethnamaddr.c sethostent.c nsap_addr.c hostnamelen.c inet_addr.c \
inet_ntop.c inet_neta.c inet_pton.c inet_net_ntop.c inet_net_pton.c
OBJS= base64.o herror.o res_debug.o res_data.o \
res_comp.o res_init.o res_mkquery.o res_query.o res_send.o \
getnetbyaddr.o getnetbyname.o getnetent.o getnetnamadr.o \
gethnamaddr.o sethostent.o nsap_addr.o hostnamelen.o inet_addr.o \
inet_ntop.o inet_neta.o inet_pton.o inet_net_ntop.o inet_net_pton.o
all: libresolv.a
libresolv.a: ${OBJS}
${AR} libresolv.a ${AROBJS}
$(RANLIB) libresolv.a
install: ${DESTDIR}${DESTLIB}/libresolv.a
${DESTDIR}${DESTLIB}/libresolv.a: libresolv.a
${INSTALL} -c -o bin -g bin -m 644 libresolv.a ${DESTDIR}${DESTLIB}/
( cd ${DESTDIR}${DESTLIB} ; $(RANLIB) libresolv.a )
.c.o:
${CC} ${CFLAGS} -c $*.c
-${LDS} ld -x -r $*.o && ${LDS} mv a.out $*.o
clean: FRC
rm -f errs a.out core libresolv.a tags .depend
rm -f *.o *.BAK *.CKP *~ *.orig
depend: FRC
mkdep ${CPPFLAGS} -I${INCL} -I${COMPINCL} ${DEFS} ${SRCS}
FRC:
# DO NOT DELETE THIS LINE -- mkdep uses it.
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.

View File

@ -1,321 +0,0 @@
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/*
* Portions Copyright (c) 1995 by International Business Machines, Inc.
*
* International Business Machines, Inc. (hereinafter called IBM) grants
* permission under its copyrights to use, copy, modify, and distribute this
* Software with or without fee, provided that the above copyright notice and
* all paragraphs of this notice appear in all copies, and that the name of IBM
* not be used in connection with the marketing of any product incorporating
* the Software or modifications thereof, without specific, written prior
* permission.
*
* To the extent it has a right to do so, IBM grants an immunity from suit
* under its patents, if any, for the use, sale or manufacture of products to
* the extent that such products are used for performing Domain Name System
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
* granted for any product per se or for any other function of any product.
*
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <ctype.h>
#include <resolv.h>
#include <stdio.h>
#if defined(BSD) && (BSD >= 199103) && defined(AF_INET6)
# include <stdlib.h>
# include <string.h>
#else
# include "../conf/portability.h"
#endif
#define Assert(Cond) if (!(Cond)) abort()
static const char Base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char Pad64 = '=';
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
The following encoding technique is taken from RFC 1521 by Borenstein
and Freed. It is reproduced here in a slightly edited form for
convenience.
A 65-character subset of US-ASCII is used, enabling 6 bits to be
represented per printable character. (The extra 65th character, "=",
is used to signify a special processing function.)
The encoding process represents 24-bit groups of input bits as output
strings of 4 encoded characters. Proceeding from left to right, a
24-bit input group is formed by concatenating 3 8-bit input groups.
These 24 bits are then treated as 4 concatenated 6-bit groups, each
of which is translated into a single digit in the base64 alphabet.
Each 6-bit group is used as an index into an array of 64 printable
characters. The character referenced by the index is placed in the
output string.
Table 1: The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
Special processing is performed if fewer than 24 bits are available
at the end of the data being encoded. A full encoding quantum is
always completed at the end of a quantity. When fewer than 24 input
bits are available in an input group, zero bits are added (on the
right) to form an integral number of 6-bit groups. Padding at the
end of the data is performed using the '=' character.
Since all base64 input is an integral number of octets, only the
-------------------------------------------------
following cases can arise:
(1) the final quantum of encoding input is an integral
multiple of 24 bits; here, the final unit of encoded
output will be an integral multiple of 4 characters
with no "=" padding,
(2) the final quantum of encoding input is exactly 8 bits;
here, the final unit of encoded output will be two
characters followed by two "=" padding characters, or
(3) the final quantum of encoding input is exactly 16 bits;
here, the final unit of encoded output will be three
characters followed by one "=" padding character.
*/
int
b64_ntop(src, srclength, target, targsize)
u_char const *src;
size_t srclength;
char *target;
size_t targsize;
{
size_t datalength = 0;
u_char input[3];
u_char output[4];
int i;
while (2 < srclength) {
input[0] = *src++;
input[1] = *src++;
input[2] = *src++;
srclength -= 3;
output[0] = input[0] >> 2;
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
output[3] = input[2] & 0x3f;
Assert(output[0] < 64);
Assert(output[1] < 64);
Assert(output[2] < 64);
Assert(output[3] < 64);
if (datalength + 4 > targsize)
return (-1);
target[datalength++] = Base64[output[0]];
target[datalength++] = Base64[output[1]];
target[datalength++] = Base64[output[2]];
target[datalength++] = Base64[output[3]];
}
/* Now we worry about padding. */
if (0 != srclength) {
/* Get what's left. */
input[0] = input[1] = input[2] = '\0';
for (i = 0; i < srclength; i++)
input[i] = *src++;
output[0] = input[0] >> 2;
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
Assert(output[0] < 64);
Assert(output[1] < 64);
Assert(output[2] < 64);
if (datalength + 4 > targsize)
return (-1);
target[datalength++] = Base64[output[0]];
target[datalength++] = Base64[output[1]];
if (srclength == 1)
target[datalength++] = Pad64;
else
target[datalength++] = Base64[output[2]];
target[datalength++] = Pad64;
}
if (datalength >= targsize)
return (-1);
target[datalength] = '\0'; /* Returned value doesn't count \0. */
return (datalength);
}
/* skips all whitespace anywhere.
converts characters, four at a time, starting at (or after)
src from base - 64 numbers into three 8 bit bytes in the target area.
it returns the number of data bytes stored at the target, or -1 on error.
*/
int
b64_pton(src, target, targsize)
char const *src;
u_char *target;
size_t targsize;
{
int tarindex, state, ch;
char *pos;
state = 0;
tarindex = 0;
while ((ch = *src++) != '\0') {
if (isspace(ch)) /* Skip whitespace anywhere. */
continue;
if (ch == Pad64)
break;
pos = strchr(Base64, ch);
if (pos == 0) /* A non-base64 character. */
return (-1);
switch (state) {
case 0:
if (target) {
if (tarindex >= targsize)
return (-1);
target[tarindex] = (pos - Base64) << 2;
}
state = 1;
break;
case 1:
if (target) {
if (tarindex + 1 >= targsize)
return (-1);
target[tarindex] |= (pos - Base64) >> 4;
target[tarindex+1] = ((pos - Base64) & 0x0f)
<< 4 ;
}
tarindex++;
state = 2;
break;
case 2:
if (target) {
if (tarindex + 1 >= targsize)
return (-1);
target[tarindex] |= (pos - Base64) >> 2;
target[tarindex+1] = ((pos - Base64) & 0x03)
<< 6;
}
tarindex++;
state = 3;
break;
case 3:
if (target) {
if (tarindex >= targsize)
return (-1);
target[tarindex] |= (pos - Base64);
}
tarindex++;
state = 0;
break;
default:
abort();
}
}
/*
* We are done decoding Base-64 chars. Let's see if we ended
* on a byte boundary, and/or with erroneous trailing characters.
*/
if (ch == Pad64) { /* We got a pad char. */
ch = *src++; /* Skip it, get next. */
switch (state) {
case 0: /* Invalid = in first position */
case 1: /* Invalid = in second position */
return (-1);
case 2: /* Valid, means one byte of info */
/* Skip any number of spaces. */
for (NULL; ch != '\0'; ch = *src++)
if (!isspace(ch))
break;
/* Make sure there is another trailing = sign. */
if (ch != Pad64)
return (-1);
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */
/* FALLTHROUGH */
case 3: /* Valid, means two bytes of info */
/*
* We know this char is an =. Is there anything but
* whitespace after it?
*/
for (NULL; ch != '\0'; ch = *src++)
if (!isspace(ch))
return (-1);
/*
* Now make sure for cases 2 and 3 that the "extra"
* bits that slopped past the last full byte were
* zeros. If we don't check them, they become a
* subliminal channel.
*/
if (target && target[tarindex] != 0)
return (-1);
}
} else {
/*
* We ended by seeing the end of the string. Make sure we
* have no partial bytes lying around.
*/
if (state != 0)
return (-1);
}
return (tarindex);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,57 +0,0 @@
/*
* Copyright (c) 1983 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.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getnetbyaddr.c 1.1 (Coimbra) 93/06/02";
static char rcsid[] = "$Id: getnetbyaddr.c,v 8.2 1996/05/09 05:59:13 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <netdb.h>
extern int _net_stayopen;
struct netent *
_getnetbyaddr(net, type)
register unsigned long net;
register int type;
{
register struct netent *p;
setnetent(_net_stayopen);
while (p = getnetent())
if (p->n_addrtype == type && p->n_net == net)
break;
if (!_net_stayopen)
endnetent();
return (p);
}

View File

@ -1,64 +0,0 @@
/*
* Copyright (c) 1983, 1993
* 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.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getnetbyname.c 8.1 (Berkeley) 6/4/93";
static char sccsid_[] = "from getnetbyname.c 1.1 (Coimbra) 93/06/02";
static char rcsid[] = "$Id: getnetbyname.c,v 8.2 1995/06/19 08:35:01 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <netdb.h>
#include <string.h>
extern int _net_stayopen;
struct netent *
_getnetbyname(name)
register const char *name;
{
register struct netent *p;
register char **cp;
setnetent(_net_stayopen);
while (p = getnetent()) {
if (strcasecmp(p->n_name, name) == 0)
break;
for (cp = p->n_aliases; *cp != 0; cp++)
if (strcasecmp(*cp, name) == 0)
goto found;
}
found:
if (!_net_stayopen)
endnetent();
return (p);
}

View File

@ -1,163 +0,0 @@
/*
* Copyright (c) 1983 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.
*/
/* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
* Dep. Matematica Universidade de Coimbra, Portugal, Europe
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* from getnetent.c 1.1 (Coimbra) 93/06/02
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getnetent.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: getnetent.c,v 8.4 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <resolv.h>
#include <netdb.h>
#include <string.h>
#ifndef _PATH_NETWORKS
#define _PATH_NETWORKS "/etc/networks"
#endif
#define MAXALIASES 35
static FILE *netf;
static char line[BUFSIZ+1];
static struct netent net;
static char *net_aliases[MAXALIASES];
int _net_stayopen;
void _setnetent __P((int));
void _endnetent __P((void));
void
setnetent(stayopen)
int stayopen;
{
sethostent(stayopen);
_setnetent(stayopen);
}
void
endnetent()
{
endhostent();
_endnetent();
}
void
_setnetent(f)
int f;
{
if (netf == NULL)
netf = fopen(_PATH_NETWORKS, "r" );
else
rewind(netf);
_net_stayopen |= f;
}
void
_endnetent()
{
if (netf) {
fclose(netf);
netf = NULL;
}
_net_stayopen = 0;
}
struct netent *
getnetent()
{
char *p;
register char *cp, **q;
if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL)
return (NULL);
again:
p = fgets(line, sizeof line, netf);
if (p == NULL)
return (NULL);
if (*p == '#')
goto again;
cp = strpbrk(p, "#\n");
if (cp == NULL)
goto again;
*cp = '\0';
net.n_name = p;
cp = strpbrk(p, " \t");
if (cp == NULL)
goto again;
*cp++ = '\0';
while (*cp == ' ' || *cp == '\t')
cp++;
p = strpbrk(cp, " \t");
if (p != NULL)
*p++ = '\0';
net.n_net = inet_network(cp);
net.n_addrtype = AF_INET;
q = net.n_aliases = net_aliases;
if (p != NULL) {
cp = p;
while (cp && *cp) {
if (*cp == ' ' || *cp == '\t') {
cp++;
continue;
}
if (q < &net_aliases[MAXALIASES - 1])
*q++ = cp;
cp = strpbrk(cp, " \t");
if (cp != NULL)
*cp++ = '\0';
}
}
*q = NULL;
return (&net);
}

View File

@ -1,288 +0,0 @@
/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
* Dep. Matematica Universidade de Coimbra, Portugal, Europe
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*/
/*
* Copyright (c) 1983, 1993
* 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.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93";
static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03";
static char rcsid[] = "$Id: getnetnamadr.c,v 8.8 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <netdb.h>
#include <resolv.h>
#include <ctype.h>
#include <errno.h>
#include <string.h>
extern int h_errno;
#if defined(mips) && defined(SYSTYPE_BSD43)
extern int errno;
#endif
struct netent *_getnetbyaddr __P((long net, int type));
struct netent *_getnetbyname __P((const char *name));
#define BYADDR 0
#define BYNAME 1
#define MAXALIASES 35
#if PACKETSZ > 1024
#define MAXPACKET PACKETSZ
#else
#define MAXPACKET 1024
#endif
typedef union {
HEADER hdr;
u_char buf[MAXPACKET];
} querybuf;
typedef union {
long al;
char ac;
} align;
static struct netent *
getnetanswer(answer, anslen, net_i)
querybuf *answer;
int anslen;
int net_i;
{
register HEADER *hp;
register u_char *cp;
register int n;
u_char *eom;
int type, class, buflen, ancount, qdcount, haveanswer, i, nchar;
char aux1[30], aux2[30], ans[30], *in, *st, *pauxt, *bp, **ap,
*paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0;
static struct netent net_entry;
static char *net_aliases[MAXALIASES], netbuf[PACKETSZ];
/*
* find first satisfactory answer
*
* answer --> +------------+ ( MESSAGE )
* | Header |
* +------------+
* | Question | the question for the name server
* +------------+
* | Answer | RRs answering the question
* +------------+
* | Authority | RRs pointing toward an authority
* | Additional | RRs holding additional information
* +------------+
*/
eom = answer->buf + anslen;
hp = &answer->hdr;
ancount = ntohs(hp->ancount); /* #/records in the answer section */
qdcount = ntohs(hp->qdcount); /* #/entries in the question section */
bp = netbuf;
buflen = sizeof(netbuf);
cp = answer->buf + HFIXEDSZ;
if (!qdcount) {
if (hp->aa)
h_errno = HOST_NOT_FOUND;
else
h_errno = TRY_AGAIN;
return (NULL);
}
while (qdcount-- > 0)
cp += __dn_skipname(cp, eom) + QFIXEDSZ;
ap = net_aliases;
*ap = NULL;
net_entry.n_aliases = net_aliases;
haveanswer = 0;
while (--ancount >= 0 && cp < eom) {
n = dn_expand(answer->buf, eom, cp, bp, buflen);
if ((n < 0) || !res_dnok(bp))
break;
cp += n;
ans[0] = '\0';
(void)strcpy(&ans[0], bp);
GETSHORT(type, cp);
GETSHORT(class, cp);
cp += INT32SZ; /* TTL */
GETSHORT(n, cp);
if (class == C_IN && type == T_PTR) {
n = dn_expand(answer->buf, eom, cp, bp, buflen);
if ((n < 0) || !res_hnok(bp)) {
cp += n;
return (NULL);
}
cp += n;
*ap++ = bp;
bp += strlen(bp) + 1;
net_entry.n_addrtype =
(class == C_IN) ? AF_INET : AF_UNSPEC;
haveanswer++;
}
}
if (haveanswer) {
*ap = NULL;
switch (net_i) {
case BYADDR:
net_entry.n_name = *net_entry.n_aliases;
net_entry.n_net = 0L;
break;
case BYNAME:
in = *net_entry.n_aliases;
net_entry.n_name = &ans[0];
aux2[0] = '\0';
for (i = 0; i < 4; i++) {
for (st = in, nchar = 0;
*st != '.';
st++, nchar++)
;
if (nchar != 1 || *in != '0' || flag) {
flag = 1;
(void)strncpy(paux1,
(i==0) ? in : in-1,
(i==0) ?nchar : nchar+1);
paux1[(i==0) ? nchar : nchar+1] = '\0';
pauxt = paux2;
paux2 = strcat(paux1, paux2);
paux1 = pauxt;
}
in = ++st;
}
net_entry.n_net = inet_network(paux2);
break;
}
net_entry.n_aliases++;
return (&net_entry);
}
h_errno = TRY_AGAIN;
return (NULL);
}
struct netent *
getnetbyaddr(net, net_type)
register u_long net;
register int net_type;
{
unsigned int netbr[4];
int nn, anslen;
querybuf buf;
char qbuf[MAXDNAME];
unsigned long net2;
struct netent *net_entry;
if (net_type != AF_INET)
return (_getnetbyaddr(net, net_type));
for (nn = 4, net2 = net; net2; net2 >>= 8)
netbr[--nn] = net2 & 0xff;
switch (nn) {
case 3: /* Class A */
sprintf(qbuf, "0.0.0.%u.in-addr.arpa", netbr[3]);
break;
case 2: /* Class B */
sprintf(qbuf, "0.0.%u.%u.in-addr.arpa", netbr[3], netbr[2]);
break;
case 1: /* Class C */
sprintf(qbuf, "0.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2],
netbr[1]);
break;
case 0: /* Class D - E */
sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2],
netbr[1], netbr[0]);
break;
}
anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
if (anslen < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf("res_query failed\n");
#endif
if (errno == ECONNREFUSED)
return (_getnetbyaddr(net, net_type));
return (NULL);
}
net_entry = getnetanswer(&buf, anslen, BYADDR);
if (net_entry) {
unsigned u_net = net; /* maybe net should be unsigned ? */
/* Strip trailing zeros */
while ((u_net & 0xff) == 0 && u_net != 0)
u_net >>= 8;
net_entry->n_net = u_net;
return (net_entry);
}
return (_getnetbyaddr(net, net_type));
}
struct netent *
getnetbyname(net)
register const char *net;
{
int anslen;
querybuf buf;
char qbuf[MAXDNAME];
struct netent *net_entry;
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
return (NULL);
}
strcpy(&qbuf[0], net);
anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
if (anslen < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf("res_query failed\n");
#endif
if (errno == ECONNREFUSED)
return (_getnetbyname(net));
return (_getnetbyname(net));
}
net_entry = getnetanswer(&buf, anslen, BYNAME);
if (net_entry)
return (net_entry);
return (_getnetbyname(net));
}

View File

@ -1,119 +0,0 @@
/*
* ++Copyright++ 1987, 1993
* -
* Copyright (c) 1987, 1993
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)herror.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: herror.c,v 8.3 1996/08/05 08:31:35 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/uio.h>
#include <netdb.h>
#if defined(BSD) && (BSD >= 199103)
# include <unistd.h>
# include <string.h>
#else
# include "../conf/portability.h"
#endif
const char *h_errlist[] = {
"Resolver Error 0 (no error)",
"Unknown host", /* 1 HOST_NOT_FOUND */
"Host name lookup failure", /* 2 TRY_AGAIN */
"Unknown server error", /* 3 NO_RECOVERY */
"No address associated with name", /* 4 NO_ADDRESS */
};
int h_nerr = { sizeof h_errlist / sizeof h_errlist[0] };
extern int h_errno;
/*
* herror --
* print the error indicated by the h_errno value.
*/
void
herror(s)
const char *s;
{
struct iovec iov[4];
register struct iovec *v = iov;
if (s && *s) {
v->iov_base = (char *)s;
v->iov_len = strlen(s);
v++;
v->iov_base = ": ";
v->iov_len = 2;
v++;
}
v->iov_base = (char *)hstrerror(h_errno);
v->iov_len = strlen(v->iov_base);
v++;
v->iov_base = "\n";
v->iov_len = 1;
writev(STDERR_FILENO, iov, (v - iov) + 1);
}
const char *
hstrerror(err)
int err;
{
if (err < 0)
return ("Resolver internal error");
else if (err < h_nerr)
return (h_errlist[err]);
return ("Unknown resolver error");
}

View File

@ -1,94 +0,0 @@
/*
* ++Copyright++ 1995
* -
* Copyright (c) 1995
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] = "$Id: hostnamelen.c,v 8.2 1995/08/22 05:01:47 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
#if defined(BSD) && (BSD >= 199103)
# include <string.h>
#else
# include "../conf/portability.h"
#endif
#if defined(USE_OPTIONS_H)
# include <../conf/options.h>
#endif
#ifndef ultrix
int __local_hostname_length_unneeded;
#else
int
local_hostname_length(hostname)
const char *hostname;
{
int len_host, len_domain;
if (!*_res.defdname)
res_init();
len_host = strlen(hostname);
len_domain = strlen(_res.defdname);
if (len_host > len_domain &&
!strcasecmp(hostname + len_host - len_domain, _res.defdname) &&
hostname[len_host - len_domain - 1] == '.')
return (len_host - len_domain - 1);
return (0);
}
#endif

View File

@ -1,184 +0,0 @@
/*
* ++Copyright++ 1983, 1990, 1993
* -
* Copyright (c) 1983, 1990, 1993
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
static char rcsid[] = "$Id: inet_addr.c,v 8.5 1996/08/05 08:31:35 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include "../conf/portability.h"
/* these are compatibility routines, not needed on recent BSD releases */
/*
* Ascii internet address interpretation routine.
* The value returned is in network order.
*/
u_long
inet_addr(cp)
register const char *cp;
{
struct in_addr val;
if (inet_aton(cp, &val))
return (val.s_addr);
return (INADDR_NONE);
}
/*
* Check whether "cp" is a valid ascii representation
* of an Internet address and convert to a binary address.
* Returns 1 if the address is valid, 0 if not.
* This replaces inet_addr, the return value from which
* cannot distinguish between failure and a local broadcast address.
*/
int
inet_aton(cp, addr)
register const char *cp;
struct in_addr *addr;
{
register u_long val;
register int base, n;
register char c;
u_int parts[4];
register u_int *pp = parts;
c = *cp;
for (;;) {
/*
* Collect number up to ``.''.
* Values are specified as for C:
* 0x=hex, 0=octal, isdigit=decimal.
*/
if (!isdigit(c))
return (0);
val = 0; base = 10;
if (c == '0') {
c = *++cp;
if (c == 'x' || c == 'X')
base = 16, c = *++cp;
else
base = 8;
}
for (;;) {
if (isascii(c) && isdigit(c)) {
val = (val * base) + (c - '0');
c = *++cp;
} else if (base == 16 && isascii(c) && isxdigit(c)) {
val = (val << 4) |
(c + 10 - (islower(c) ? 'a' : 'A'));
c = *++cp;
} else
break;
}
if (c == '.') {
/*
* Internet format:
* a.b.c.d
* a.b.c (with c treated as 16 bits)
* a.b (with b treated as 24 bits)
*/
if (pp >= parts + 3)
return (0);
*pp++ = val;
c = *++cp;
} else
break;
}
/*
* Check for trailing characters.
*/
if (c != '\0' && (!isascii(c) || !isspace(c)))
return (0);
/*
* Concoct the address according to
* the number of parts specified.
*/
n = pp - parts + 1;
switch (n) {
case 0:
return (0); /* initial nondigit */
case 1: /* a -- 32 bits */
break;
case 2: /* a.b -- 8.24 bits */
if (val > 0xffffff)
return (0);
val |= parts[0] << 24;
break;
case 3: /* a.b.c -- 8.8.16 bits */
if (val > 0xffff)
return (0);
val |= (parts[0] << 24) | (parts[1] << 16);
break;
case 4: /* a.b.c.d -- 8.8.8.8 bits */
if (val > 0xff)
return (0);
val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
break;
}
if (addr)
addr->s_addr = htonl(val);
return (1);
}

View File

@ -1,139 +0,0 @@
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static const char rcsid[] = "$Id: inet_net_ntop.c,v 8.2 1996/08/08 06:54:44 vixie Exp $";
#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef SPRINTF_CHAR
# define SPRINTF(x) strlen(sprintf/**/x)
#else
# define SPRINTF(x) ((size_t)sprintf x)
#endif
static char * inet_net_ntop_ipv4 __P((const u_char *src, int bits,
char *dst, size_t size));
/*
* char *
* inet_net_ntop(af, src, bits, dst, size)
* convert network number from network to presentation format.
* generates CIDR style result always.
* return:
* pointer to dst, or NULL if an error occurred (check errno).
* author:
* Paul Vixie (ISC), July 1996
*/
char *
inet_net_ntop(af, src, bits, dst, size)
int af;
const void *src;
int bits;
char *dst;
size_t size;
{
switch (af) {
case AF_INET:
return (inet_net_ntop_ipv4(src, bits, dst, size));
default:
errno = EAFNOSUPPORT;
return (NULL);
}
}
/*
* static char *
* inet_net_ntop_ipv4(src, bits, dst, size)
* convert IPv4 network number from network to presentation format.
* generates CIDR style result always.
* return:
* pointer to dst, or NULL if an error occurred (check errno).
* note:
* network byte order assumed. this means 192.5.5.240/28 has
* 0x11110000 in its fourth octet.
* author:
* Paul Vixie (ISC), July 1996
*/
static char *
inet_net_ntop_ipv4(src, bits, dst, size)
const u_char *src;
int bits;
char *dst;
size_t size;
{
char *odst = dst;
char *t;
u_int m;
int b;
if (bits < 0 || bits > 32) {
errno = EINVAL;
return (NULL);
}
if (bits == 0) {
if (size < sizeof "0")
goto emsgsize;
*dst++ = '0';
*dst = '\0';
}
/* Format whole octets. */
for (b = bits / 8; b > 0; b--) {
if (size < sizeof "255.")
goto emsgsize;
t = dst;
dst += SPRINTF((dst, "%u", *src++));
if (b > 1) {
*dst++ = '.';
*dst = '\0';
}
size -= (size_t)(dst - t);
}
/* Format partial octet. */
b = bits % 8;
if (b > 0) {
if (size < sizeof ".255")
goto emsgsize;
t = dst;
if (dst != odst)
*dst++ = '.';
m = ((1 << b) - 1) << (8 - b);
dst += SPRINTF((dst, "%u", *src & m));
size -= (size_t)(dst - t);
}
/* Format CIDR /width. */
if (size < sizeof "/32")
goto emsgsize;
dst += SPRINTF((dst, "/%u", bits));
return (odst);
emsgsize:
errno = EMSGSIZE;
return (NULL);
}

View File

@ -1,207 +0,0 @@
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static const char rcsid[] = "$Id: inet_net_pton.c,v 8.3 1996/11/11 06:36:52 vixie Exp $";
#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef SPRINTF_CHAR
# define SPRINTF(x) strlen(sprintf/**/x)
#else
# define SPRINTF(x) ((size_t)sprintf x)
#endif
static int inet_net_pton_ipv4 __P((const char *src, u_char *dst,
size_t size));
/*
* static int
* inet_net_pton(af, src, dst, size)
* convert network number from presentation to network format.
* accepts hex octets, hex strings, decimal octets, and /CIDR.
* "size" is in bytes and describes "dst".
* return:
* number of bits, either imputed classfully or specified with /CIDR,
* or -1 if some failure occurred (check errno). ENOENT means it was
* not a valid network specification.
* author:
* Paul Vixie (ISC), June 1996
*/
int
inet_net_pton(af, src, dst, size)
int af;
const char *src;
void *dst;
size_t size;
{
switch (af) {
case AF_INET:
return (inet_net_pton_ipv4(src, dst, size));
default:
errno = EAFNOSUPPORT;
return (-1);
}
}
/*
* static int
* inet_net_pton_ipv4(src, dst, size)
* convert IPv4 network number from presentation to network format.
* accepts hex octets, hex strings, decimal octets, and /CIDR.
* "size" is in bytes and describes "dst".
* return:
* number of bits, either imputed classfully or specified with /CIDR,
* or -1 if some failure occurred (check errno). ENOENT means it was
* not an IPv4 network specification.
* note:
* network byte order assumed. this means 192.5.5.240/28 has
* 0x11110000 in its fourth octet.
* author:
* Paul Vixie (ISC), June 1996
*/
static int
inet_net_pton_ipv4(src, dst, size)
const char *src;
u_char *dst;
size_t size;
{
static const char
xdigits[] = "0123456789abcdef",
digits[] = "0123456789";
int n, ch, tmp, dirty, bits;
const u_char *odst = dst;
ch = *src++;
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
&& isascii(src[1]) && isxdigit(src[1])) {
/* Hexadecimal: Eat nybble string. */
if (size <= 0)
goto emsgsize;
*dst = 0, dirty = 0;
src++; /* skip x or X. */
while ((ch = *src++) != '\0' &&
isascii(ch) && isxdigit(ch)) {
if (isupper(ch))
ch = tolower(ch);
n = strchr(xdigits, ch) - xdigits;
assert(n >= 0 && n <= 15);
*dst |= n;
if (!dirty++)
*dst <<= 4;
else if (size-- > 0)
*++dst = 0, dirty = 0;
else
goto emsgsize;
}
if (dirty)
size--;
} else if (isascii(ch) && isdigit(ch)) {
/* Decimal: eat dotted digit string. */
for (;;) {
tmp = 0;
do {
n = strchr(digits, ch) - digits;
assert(n >= 0 && n <= 9);
tmp *= 10;
tmp += n;
if (tmp > 255)
goto enoent;
} while ((ch = *src++) != '\0' &&
isascii(ch) && isdigit(ch));
if (size-- <= 0)
goto emsgsize;
*dst++ = (u_char) tmp;
if (ch == '\0' || ch == '/')
break;
if (ch != '.')
goto enoent;
ch = *src++;
if (!isascii(ch) || !isdigit(ch))
goto enoent;
}
} else
goto enoent;
bits = -1;
if (ch == '/' && isascii(src[0]) && isdigit(src[0]) && dst > odst) {
/* CIDR width specifier. Nothing can follow it. */
ch = *src++; /* Skip over the /. */
bits = 0;
do {
n = strchr(digits, ch) - digits;
assert(n >= 0 && n <= 9);
bits *= 10;
bits += n;
} while ((ch = *src++) != '\0' &&
isascii(ch) && isdigit(ch));
if (ch != '\0')
goto enoent;
if (bits > 32)
goto emsgsize;
}
/* Firey death and destruction unless we prefetched EOS. */
if (ch != '\0')
goto enoent;
/* If nothing was written to the destination, we found no address. */
if (dst == odst)
goto enoent;
/* If no CIDR spec was given, infer width from net class. */
if (bits == -1) {
if (*odst >= 240) /* Class E */
bits = 32;
else if (*odst >= 224) /* Class D */
bits = 4;
else if (*odst >= 192) /* Class C */
bits = 24;
else if (*odst >= 128) /* Class B */
bits = 16;
else /* Class A */
bits = 8;
/* If imputed mask is narrower than specified octets, widen. */
if (bits >= 8 && bits < ((dst - odst) * 8))
bits = (dst - odst) * 8;
}
/* Extend network to cover the actual mask. */
while (bits > ((dst - odst) * 8)) {
if (size-- <= 0)
goto emsgsize;
*dst++ = '\0';
}
return (bits);
enoent:
errno = ENOENT;
return (-1);
emsgsize:
errno = EMSGSIZE;
return (-1);
}

View File

@ -1,82 +0,0 @@
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static const char rcsid[] = "$Id: inet_neta.c,v 8.2 1996/08/08 06:54:44 vixie Exp $";
#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#ifdef SPRINTF_CHAR
# define SPRINTF(x) strlen(sprintf/**/x)
#else
# define SPRINTF(x) ((size_t)sprintf x)
#endif
/*
* char *
* inet_neta(src, dst, size)
* format a u_long network number into presentation format.
* return:
* pointer to dst, or NULL if an error occurred (check errno).
* note:
* format of ``src'' is as for inet_network().
* author:
* Paul Vixie (ISC), July 1996
*/
char *
inet_neta(src, dst, size)
u_long src;
char *dst;
size_t size;
{
char *odst = dst;
char *tp;
while (src & 0xffffffff) {
u_char b = (src & 0xff000000) >> 24;
src <<= 8;
if (b) {
if (size < sizeof "255.")
goto emsgsize;
tp = dst;
dst += SPRINTF((dst, "%u", b));
if (src != 0L) {
*dst++ = '.';
*dst = '\0';
}
size -= (size_t)(dst - tp);
}
}
if (dst == odst) {
if (size < sizeof "0.0.0.0")
goto emsgsize;
strcpy(dst, "0.0.0.0");
}
return (odst);
emsgsize:
errno = EMSGSIZE;
return (NULL);
}

View File

@ -1,195 +0,0 @@
/* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] = "$Id: inet_ntop.c,v 8.7 1996/08/05 08:41:18 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include "../conf/portability.h"
#ifdef SPRINTF_CHAR
# define SPRINTF(x) strlen(sprintf/**/x)
#else
# define SPRINTF(x) ((size_t)sprintf x)
#endif
/*
* WARNING: Don't even consider trying to compile this on a system where
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
*/
static const char *inet_ntop4 __P((const u_char *src, char *dst, size_t size));
static const char *inet_ntop6 __P((const u_char *src, char *dst, size_t size));
/* char *
* inet_ntop(af, src, dst, size)
* convert a network format address to presentation format.
* return:
* pointer to presentation format address (`dst'), or NULL (see errno).
* author:
* Paul Vixie, 1996.
*/
const char *
inet_ntop(af, src, dst, size)
int af;
const void *src;
char *dst;
size_t size;
{
switch (af) {
case AF_INET:
return (inet_ntop4(src, dst, size));
case AF_INET6:
return (inet_ntop6(src, dst, size));
default:
errno = EAFNOSUPPORT;
return (NULL);
}
/* NOTREACHED */
}
/* const char *
* inet_ntop4(src, dst, size)
* format an IPv4 address, more or less like inet_ntoa()
* return:
* `dst' (as a const)
* notes:
* (1) uses no statics
* (2) takes a u_char* not an in_addr as input
* author:
* Paul Vixie, 1996.
*/
static const char *
inet_ntop4(src, dst, size)
const u_char *src;
char *dst;
size_t size;
{
static const char fmt[] = "%u.%u.%u.%u";
char tmp[sizeof "255.255.255.255"];
if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) {
errno = ENOSPC;
return (NULL);
}
strcpy(dst, tmp);
return (dst);
}
/* const char *
* inet_ntop6(src, dst, size)
* convert IPv6 binary address into presentation (printable) format
* author:
* Paul Vixie, 1996.
*/
static const char *
inet_ntop6(src, dst, size)
const u_char *src;
char *dst;
size_t size;
{
/*
* Note that int32_t and int16_t need only be "at least" large enough
* to contain a value of the specified size. On some systems, like
* Crays, there is no such thing as an integer variable with 16 bits.
* Keep this in mind if you think this function should have been coded
* to use pointer overlays. All the world's not a VAX.
*/
char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
struct { int base, len; } best, cur;
u_int words[IN6ADDRSZ / INT16SZ];
int i;
/*
* Preprocess:
* Copy the input (bytewise) array into a wordwise array.
* Find the longest run of 0x00's in src[] for :: shorthanding.
*/
memset(words, '\0', sizeof words);
for (i = 0; i < IN6ADDRSZ; i++)
words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
best.base = -1;
cur.base = -1;
for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
if (words[i] == 0) {
if (cur.base == -1)
cur.base = i, cur.len = 1;
else
cur.len++;
} else {
if (cur.base != -1) {
if (best.base == -1 || cur.len > best.len)
best = cur;
cur.base = -1;
}
}
}
if (cur.base != -1) {
if (best.base == -1 || cur.len > best.len)
best = cur;
}
if (best.base != -1 && best.len < 2)
best.base = -1;
/*
* Format the result.
*/
tp = tmp;
for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
/* Are we inside the best run of 0x00's? */
if (best.base != -1 && i >= best.base &&
i < (best.base + best.len)) {
if (i == best.base)
*tp++ = ':';
continue;
}
/* Are we following an initial run of 0x00s or any real hex? */
if (i != 0)
*tp++ = ':';
/* Is this address an encapsulated IPv4? */
if (i == 6 && best.base == 0 &&
(best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)))
return (NULL);
tp += strlen(tp);
break;
}
tp += SPRINTF((tp, "%x", words[i]));
}
/* Was it a trailing run of 0x00's? */
if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
*tp++ = ':';
*tp++ = '\0';
/*
* Check for overflow, copy, and we're done.
*/
if ((size_t)(tp - tmp) > size) {
errno = ENOSPC;
return (NULL);
}
strcpy(dst, tmp);
return (dst);
}

View File

@ -1,215 +0,0 @@
/* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] = "$Id: inet_pton.c,v 8.7 1996/08/05 08:31:35 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <string.h>
#include <errno.h>
#include "../conf/portability.h"
/*
* WARNING: Don't even consider trying to compile this on a system where
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
*/
static int inet_pton4 __P((const char *src, u_char *dst));
static int inet_pton6 __P((const char *src, u_char *dst));
/* int
* inet_pton(af, src, dst)
* convert from presentation format (which usually means ASCII printable)
* to network format (which is usually some kind of binary format).
* return:
* 1 if the address was valid for the specified address family
* 0 if the address wasn't valid (`dst' is untouched in this case)
* -1 if some other error occurred (`dst' is untouched in this case, too)
* author:
* Paul Vixie, 1996.
*/
int
inet_pton(af, src, dst)
int af;
const char *src;
void *dst;
{
switch (af) {
case AF_INET:
return (inet_pton4(src, dst));
case AF_INET6:
return (inet_pton6(src, dst));
default:
errno = EAFNOSUPPORT;
return (-1);
}
/* NOTREACHED */
}
/* int
* inet_pton4(src, dst)
* like inet_aton() but without all the hexadecimal and shorthand.
* return:
* 1 if `src' is a valid dotted quad, else 0.
* notice:
* does not touch `dst' unless it's returning 1.
* author:
* Paul Vixie, 1996.
*/
static int
inet_pton4(src, dst)
const char *src;
u_char *dst;
{
static const char digits[] = "0123456789";
int saw_digit, octets, ch;
u_char tmp[INADDRSZ], *tp;
saw_digit = 0;
octets = 0;
*(tp = tmp) = 0;
while ((ch = *src++) != '\0') {
const char *pch;
if ((pch = strchr(digits, ch)) != NULL) {
u_int new = *tp * 10 + (pch - digits);
if (new > 255)
return (0);
*tp = new;
if (! saw_digit) {
if (++octets > 4)
return (0);
saw_digit = 1;
}
} else if (ch == '.' && saw_digit) {
if (octets == 4)
return (0);
*++tp = 0;
saw_digit = 0;
} else
return (0);
}
if (octets < 4)
return (0);
memcpy(dst, tmp, INADDRSZ);
return (1);
}
/* int
* inet_pton6(src, dst)
* convert presentation level address to network order binary form.
* return:
* 1 if `src' is a valid [RFC1884 2.2] address, else 0.
* notice:
* (1) does not touch `dst' unless it's returning 1.
* (2) :: in a full address is silently ignored.
* credit:
* inspired by Mark Andrews.
* author:
* Paul Vixie, 1996.
*/
static int
inet_pton6(src, dst)
const char *src;
u_char *dst;
{
static const char xdigits_l[] = "0123456789abcdef",
xdigits_u[] = "0123456789ABCDEF";
u_char tmp[IN6ADDRSZ], *tp, *endp, *colonp;
const char *xdigits, *curtok;
int ch, saw_xdigit;
u_int val;
memset((tp = tmp), '\0', IN6ADDRSZ);
endp = tp + IN6ADDRSZ;
colonp = NULL;
/* Leading :: requires some special handling. */
if (*src == ':')
if (*++src != ':')
return (0);
curtok = src;
saw_xdigit = 0;
val = 0;
while ((ch = *src++) != '\0') {
const char *pch;
if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
pch = strchr((xdigits = xdigits_u), ch);
if (pch != NULL) {
val <<= 4;
val |= (pch - xdigits);
if (val > 0xffff)
return (0);
saw_xdigit = 1;
continue;
}
if (ch == ':') {
curtok = src;
if (!saw_xdigit) {
if (colonp)
return (0);
colonp = tp;
continue;
}
if (tp + INT16SZ > endp)
return (0);
*tp++ = (u_char) (val >> 8) & 0xff;
*tp++ = (u_char) val & 0xff;
saw_xdigit = 0;
val = 0;
continue;
}
if (ch == '.' && ((tp + INADDRSZ) <= endp) &&
inet_pton4(curtok, tp) > 0) {
tp += INADDRSZ;
saw_xdigit = 0;
break; /* '\0' was seen by inet_pton4(). */
}
return (0);
}
if (saw_xdigit) {
if (tp + INT16SZ > endp)
return (0);
*tp++ = (u_char) (val >> 8) & 0xff;
*tp++ = (u_char) val & 0xff;
}
if (colonp != NULL) {
/*
* Since some memmove()'s erroneously fail to handle
* overlapping regions, we'll do the shift by hand.
*/
const int n = tp - colonp;
int i;
for (i = 1; i <= n; i++) {
endp[- i] = colonp[n - i];
colonp[n - i] = 0;
}
tp = endp;
}
if (tp != endp)
return (0);
memcpy(dst, tmp, IN6ADDRSZ);
return (1);
}

View File

@ -1,114 +0,0 @@
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] = "$Id: nsap_addr.c,v 8.3 1996/08/05 08:31:35 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <ctype.h>
#include <resolv.h>
#include "../conf/portability.h"
#if !defined(isxdigit) /* XXX - could be a function */
static int
isxdigit(c)
register int c;
{
return ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'F'));
}
#endif
static char
xtob(c)
register int c;
{
return (c - (((c >= '0') && (c <= '9')) ? '0' : '7'));
}
u_int
inet_nsap_addr(ascii, binary, maxlen)
const char *ascii;
u_char *binary;
int maxlen;
{
register u_char c, nib;
u_int len = 0;
while ((c = *ascii++) != '\0' && len < maxlen) {
if (c == '.' || c == '+' || c == '/')
continue;
if (!isascii(c))
return (0);
if (islower(c))
c = toupper(c);
if (isxdigit(c)) {
nib = xtob(c);
if (c = *ascii++) {
c = toupper(c);
if (isxdigit(c)) {
*binary++ = (nib << 4) | xtob(c);
len++;
} else
return (0);
}
else
return (0);
}
else
return (0);
}
return (len);
}
char *
inet_nsap_ntoa(binlen, binary, ascii)
int binlen;
register const u_char *binary;
register char *ascii;
{
register int nib;
int i;
static char tmpbuf[255*3];
char *start;
if (ascii)
start = ascii;
else {
ascii = tmpbuf;
start = tmpbuf;
}
if (binlen > 255)
binlen = 255;
for (i = 0; i < binlen; i++) {
nib = *binary >> 4;
*ascii++ = nib + (nib < 10 ? '0' : '7');
nib = *binary++ & 0x0f;
*ascii++ = nib + (nib < 10 ? '0' : '7');
if (((i % 2) == 0 && (i + 1) < binlen))
*ascii++ = '.';
}
*ascii = '\0';
return (start);
}

View File

@ -1,937 +0,0 @@
/*
* ++Copyright++ 1985, 1993
* -
* Copyright (c) 1985, 1993
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_comp.c,v 8.13 1998/04/07 04:24:06 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <ctype.h>
#include <errno.h>
#include <resolv.h>
#include <stdio.h>
#if defined(BSD) && (BSD >= 199103)
# include <unistd.h>
# include <string.h>
#else
# include "../conf/portability.h"
#endif
static int ns_name_ntop __P((const u_char *, char *, size_t));
static int ns_name_pton __P((const char *, u_char *, size_t));
static int ns_name_unpack __P((const u_char *, const u_char *,
const u_char *, u_char *, size_t));
static int ns_name_pack __P((const u_char *, u_char *, int,
const u_char **, const u_char **));
static int ns_name_uncompress __P((const u_char *, const u_char *,
const u_char *, char *, size_t));
static int ns_name_compress __P((const char *, u_char *, size_t,
const u_char **, const u_char **));
static int ns_name_skip __P((const u_char **, const u_char *));
/*
* Expand compressed domain name 'comp_dn' to full domain name.
* 'msg' is a pointer to the begining of the message,
* 'eomorig' points to the first location after the message,
* 'exp_dn' is a pointer to a buffer of size 'length' for the result.
* Return size of compressed name or -1 if there was an error.
*/
int
dn_expand(const u_char *msg, const u_char *eom, const u_char *src,
char *dst, int dstsiz)
{
int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz);
if (n > 0 && dst[0] == '.')
dst[0] = '\0';
return (n);
}
/*
* Pack domain name 'exp_dn' in presentation form into 'comp_dn'.
* Return the size of the compressed name or -1.
* 'length' is the size of the array pointed to by 'comp_dn'.
*/
int
dn_comp(const char *src, u_char *dst, int dstsiz,
u_char **dnptrs, u_char **lastdnptr)
{
return (ns_name_compress(src, dst, (size_t)dstsiz,
(const u_char **)dnptrs,
(const u_char **)lastdnptr));
}
/*
* Skip over a compressed domain name. Return the size or -1.
*/
int
__dn_skipname(const u_char *ptr, const u_char *eom) {
const u_char *saveptr = ptr;
if (ns_name_skip(&ptr, eom) == -1)
return (-1);
return (ptr - saveptr);
}
/*
* Verify that a domain name uses an acceptable character set.
*/
/*
* Note the conspicuous absence of ctype macros in these definitions. On
* non-ASCII hosts, we can't depend on string literals or ctype macros to
* tell us anything about network-format data. The rest of the BIND system
* is not careful about this, but for some reason, we're doing it right here.
*/
#define PERIOD 0x2e
#define hyphenchar(c) ((c) == 0x2d)
#define bslashchar(c) ((c) == 0x5c)
#define periodchar(c) ((c) == PERIOD)
#define asterchar(c) ((c) == 0x2a)
#define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \
|| ((c) >= 0x61 && (c) <= 0x7a))
#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39)
#define borderchar(c) (alphachar(c) || digitchar(c))
#define middlechar(c) (borderchar(c) || hyphenchar(c))
#define domainchar(c) ((c) > 0x20 && (c) < 0x7f)
int
res_hnok(dn)
const char *dn;
{
int ppch = '\0', pch = PERIOD, ch = *dn++;
while (ch != '\0') {
int nch = *dn++;
if (periodchar(ch)) {
NULL;
} else if (periodchar(pch)) {
if (!borderchar(ch))
return (0);
} else if (periodchar(nch) || nch == '\0') {
if (!borderchar(ch))
return (0);
} else {
if (!middlechar(ch))
return (0);
}
ppch = pch, pch = ch, ch = nch;
}
return (1);
}
/*
* hostname-like (A, MX, WKS) owners can have "*" as their first label
* but must otherwise be as a host name.
*/
int
res_ownok(dn)
const char *dn;
{
if (asterchar(dn[0])) {
if (periodchar(dn[1]))
return (res_hnok(dn+2));
if (dn[1] == '\0')
return (1);
}
return (res_hnok(dn));
}
/*
* SOA RNAMEs and RP RNAMEs can have any printable character in their first
* label, but the rest of the name has to look like a host name.
*/
int
res_mailok(dn)
const char *dn;
{
int ch, escaped = 0;
/* "." is a valid missing representation */
if (*dn == '\0')
return(1);
/* otherwise <label>.<hostname> */
while ((ch = *dn++) != '\0') {
if (!domainchar(ch))
return (0);
if (!escaped && periodchar(ch))
break;
if (escaped)
escaped = 0;
else if (bslashchar(ch))
escaped = 1;
}
if (periodchar(ch))
return (res_hnok(dn));
return(0);
}
/*
* This function is quite liberal, since RFC 1034's character sets are only
* recommendations.
*/
int
res_dnok(dn)
const char *dn;
{
int ch;
while ((ch = *dn++) != '\0')
if (!domainchar(ch))
return (0);
return (1);
}
/*
* Routines to insert/extract short/long's.
*/
u_int16_t
_getshort(msgp)
register const u_char *msgp;
{
register u_int16_t u;
GETSHORT(u, msgp);
return (u);
}
#ifdef NeXT
/*
* nExt machines have some funky library conventions, which we must maintain.
*/
u_int16_t
res_getshort(msgp)
register const u_char *msgp;
{
return (_getshort(msgp));
}
#endif
u_int32_t
_getlong(msgp)
register const u_char *msgp;
{
register u_int32_t u;
GETLONG(u, msgp);
return (u);
}
void
#if defined(__STDC__) || defined(__cplusplus)
__putshort(register u_int16_t s, register u_char *msgp) /* must match proto */
#else
__putshort(s, msgp)
register u_int16_t s;
register u_char *msgp;
#endif
{
PUTSHORT(s, msgp);
}
void
__putlong(l, msgp)
register u_int32_t l;
register u_char *msgp;
{
PUTLONG(l, msgp);
}
/* ++ From BIND 8.1.1. ++ */
/*
* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/*"Id: ns_name.c,v 1.1 1997/12/13 02:41:13 vixie Exp vixie"*/
/*#include "port_before.h"*/
/*#include <sys/types.h>*/
/*#include <netinet/in.h>*/
/*#include <arpa/nameser.h>*/
/*#include <errno.h>*/
/*#include <resolv.h>*/
/*#include <string.h>*/
/*#include "port_after.h"*/
#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */
#define NS_MAXCDNAME 255 /* maximum compressed domain name */
/* Data. */
static char digits[] = "0123456789";
/* Forward. */
static int special(int);
static int printable(int);
static int dn_find(const u_char *, const u_char *,
const u_char * const *,
const u_char * const *);
/* Public. */
/*
* ns_name_ntop(src, dst, dstsiz)
* Convert an encoded domain name to printable ascii as per RFC1035.
* return:
* Number of bytes written to buffer, or -1 (with errno set)
* notes:
* The root is returned as "."
* All other domains are returned in non absolute form
*/
static int
ns_name_ntop(src, dst, dstsiz)
const u_char *src;
char *dst;
size_t dstsiz;
{
const u_char *cp;
char *dn, *eom;
u_char c;
u_int n;
cp = src;
dn = dst;
eom = dst + dstsiz;
while ((n = *cp++) != 0) {
if ((n & NS_CMPRSFLGS) != 0) {
/* Some kind of compression pointer. */
errno = EMSGSIZE;
return (-1);
}
if (dn != dst) {
if (dn >= eom) {
errno = EMSGSIZE;
return (-1);
}
*dn++ = '.';
}
if (dn + n >= eom) {
errno = EMSGSIZE;
return (-1);
}
for ((void)NULL; n > 0; n--) {
c = *cp++;
if (special(c)) {
if (dn + 1 >= eom) {
errno = EMSGSIZE;
return (-1);
}
*dn++ = '\\';
*dn++ = (char)c;
} else if (!printable(c)) {
if (dn + 3 >= eom) {
errno = EMSGSIZE;
return (-1);
}
*dn++ = '\\';
*dn++ = digits[c / 100];
*dn++ = digits[(c % 100) / 10];
*dn++ = digits[c % 10];
} else {
if (dn >= eom) {
errno = EMSGSIZE;
return (-1);
}
*dn++ = (char)c;
}
}
}
if (dn == dst) {
if (dn >= eom) {
errno = EMSGSIZE;
return (-1);
}
*dn++ = '.';
}
if (dn >= eom) {
errno = EMSGSIZE;
return (-1);
}
*dn++ = '\0';
return (dn - dst);
}
/*
* ns_name_pton(src, dst, dstsiz)
* Convert a ascii string into an encoded domain name as per RFC1035.
* return:
* -1 if it fails
* 1 if string was fully qualified
* 0 is string was not fully qualified
* notes:
* Enforces label and domain length limits.
*/
static int
ns_name_pton(src, dst, dstsiz)
const char *src;
u_char *dst;
size_t dstsiz;
{
u_char *label, *bp, *eom;
int c, n, escaped;
char *cp;
escaped = 0;
bp = dst;
eom = dst + dstsiz;
label = bp++;
while ((c = *src++) != 0) {
if (escaped) {
if ((cp = strchr(digits, c)) != NULL) {
n = (cp - digits) * 100;
if ((c = *src++) == 0 ||
(cp = strchr(digits, c)) == NULL) {
errno = EMSGSIZE;
return (-1);
}
n += (cp - digits) * 10;
if ((c = *src++) == 0 ||
(cp = strchr(digits, c)) == NULL) {
errno = EMSGSIZE;
return (-1);
}
n += (cp - digits);
if (n > 255) {
errno = EMSGSIZE;
return (-1);
}
c = n;
}
escaped = 0;
} else if (c == '\\') {
escaped = 1;
continue;
} else if (c == '.') {
c = (bp - label - 1);
if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */
errno = EMSGSIZE;
return (-1);
}
if (label >= eom) {
errno = EMSGSIZE;
return (-1);
}
*label = c;
/* Fully qualified ? */
if (*src == '\0') {
if (c != 0) {
if (bp >= eom) {
errno = EMSGSIZE;
return (-1);
}
*bp++ = '\0';
}
if ((bp - dst) > MAXCDNAME) {
errno = EMSGSIZE;
return (-1);
}
return (1);
}
if (c == 0) {
errno = EMSGSIZE;
return (-1);
}
label = bp++;
continue;
}
if (bp >= eom) {
errno = EMSGSIZE;
return (-1);
}
*bp++ = (u_char)c;
}
c = (bp - label - 1);
if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */
errno = EMSGSIZE;
return (-1);
}
if (label >= eom) {
errno = EMSGSIZE;
return (-1);
}
*label = c;
if (c != 0) {
if (bp >= eom) {
errno = EMSGSIZE;
return (-1);
}
*bp++ = 0;
}
if ((bp - dst) > MAXCDNAME) { /* src too big */
errno = EMSGSIZE;
return (-1);
}
return (0);
}
/*
* ns_name_unpack(msg, eom, src, dst, dstsiz)
* Unpack a domain name from a message, source may be compressed.
* return:
* -1 if it fails, or consumed octets if it succeeds.
*/
static int
ns_name_unpack(msg, eom, src, dst, dstsiz)
const u_char *msg;
const u_char *eom;
const u_char *src;
u_char *dst;
size_t dstsiz;
{
const u_char *srcp, *dstlim;
u_char *dstp;
int n, c, len, checked;
len = -1;
checked = 0;
dstp = dst;
srcp = src;
dstlim = dst + dstsiz;
if (srcp < msg || srcp >= eom) {
errno = EMSGSIZE;
return (-1);
}
/* Fetch next label in domain name. */
while ((n = *srcp++) != 0) {
/* Check for indirection. */
switch (n & NS_CMPRSFLGS) {
case 0:
/* Limit checks. */
if (dstp + n + 1 >= dstlim || srcp + n >= eom) {
errno = EMSGSIZE;
return (-1);
}
checked += n + 1;
*dstp++ = n;
memcpy(dstp, srcp, n);
dstp += n;
srcp += n;
break;
case NS_CMPRSFLGS:
if (srcp >= eom) {
errno = EMSGSIZE;
return (-1);
}
if (len < 0)
len = srcp - src + 1;
srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff));
if (srcp < msg || srcp >= eom) { /* Out of range. */
errno = EMSGSIZE;
return (-1);
}
checked += 2;
/*
* Check for loops in the compressed name;
* if we've looked at the whole message,
* there must be a loop.
*/
if (checked >= eom - msg) {
errno = EMSGSIZE;
return (-1);
}
break;
default:
errno = EMSGSIZE;
return (-1); /* flag error */
}
}
*dstp = '\0';
if (len < 0)
len = srcp - src;
return (len);
}
/*
* ns_name_pack(src, dst, dstsiz, dnptrs, lastdnptr)
* Pack domain name 'domain' into 'comp_dn'.
* return:
* Size of the compressed name, or -1.
* notes:
* 'dnptrs' is an array of pointers to previous compressed names.
* dnptrs[0] is a pointer to the beginning of the message. The array
* ends with NULL.
* 'lastdnptr' is a pointer to the end of the array pointed to
* by 'dnptrs'.
* Side effects:
* The list of pointers in dnptrs is updated for labels inserted into
* the message as we compress the name. If 'dnptr' is NULL, we don't
* try to compress names. If 'lastdnptr' is NULL, we don't update the
* list.
*/
static int
ns_name_pack(src, dst, dstsiz, dnptrs, lastdnptr)
const u_char *src;
u_char *dst;
int dstsiz;
const u_char **dnptrs;
const u_char **lastdnptr;
{
u_char *dstp;
const u_char **cpp, **lpp, *eob, *msg;
const u_char *srcp;
int n, l;
srcp = src;
dstp = dst;
eob = dstp + dstsiz;
lpp = cpp = NULL;
if (dnptrs != NULL) {
if ((msg = *dnptrs++) != NULL) {
for (cpp = dnptrs; *cpp != NULL; cpp++)
(void)NULL;
lpp = cpp; /* end of list to search */
}
} else
msg = NULL;
/* make sure the domain we are about to add is legal */
l = 0;
do {
n = *srcp;
if ((n & NS_CMPRSFLGS) != 0) {
errno = EMSGSIZE;
return (-1);
}
l += n + 1;
if (l > MAXCDNAME) {
errno = EMSGSIZE;
return (-1);
}
srcp += n + 1;
} while (n != 0);
srcp = src;
do {
/* Look to see if we can use pointers. */
n = *srcp;
if (n != 0 && msg != NULL) {
l = dn_find(srcp, msg, (const u_char * const *)dnptrs,
(const u_char * const *)lpp);
if (l >= 0) {
if (dstp + 1 >= eob) {
errno = EMSGSIZE;
return (-1);
}
*dstp++ = (l >> 8) | NS_CMPRSFLGS;
*dstp++ = l % 256;
return (dstp - dst);
}
/* Not found, save it. */
if (lastdnptr != NULL && cpp < lastdnptr - 1 &&
(dstp - msg) < 0x4000) {
*cpp++ = dstp;
*cpp = NULL;
}
}
/* copy label to buffer */
if (n & NS_CMPRSFLGS) { /* Should not happen. */
errno = EMSGSIZE;
return (-1);
}
if (dstp + 1 + n >= eob) {
errno = EMSGSIZE;
return (-1);
}
memcpy(dstp, srcp, n + 1);
srcp += n + 1;
dstp += n + 1;
} while (n != 0);
if (dstp > eob) {
if (msg != NULL)
*lpp = NULL;
errno = EMSGSIZE;
return (-1);
}
return (dstp - dst);
}
/*
* ns_name_uncompress(msg, eom, src, dst, dstsiz)
* Expand compressed domain name to presentation format.
* return:
* Number of bytes read out of `src', or -1 (with errno set).
* note:
* Root domain returns as "." not "".
*/
static int
ns_name_uncompress(msg, eom, src, dst, dstsiz)
const u_char *msg;
const u_char *eom;
const u_char *src;
char *dst;
size_t dstsiz;
{
u_char tmp[NS_MAXCDNAME];
int n;
if ((n = ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1)
return (-1);
if (ns_name_ntop(tmp, dst, dstsiz) == -1)
return (-1);
return (n);
}
/*
* ns_name_compress(src, dst, dstsiz, dnptrs, lastdnptr)
* Compress a domain name into wire format, using compression pointers.
* return:
* Number of bytes consumed in `dst' or -1 (with errno set).
* notes:
* 'dnptrs' is an array of pointers to previous compressed names.
* dnptrs[0] is a pointer to the beginning of the message.
* The list ends with NULL. 'lastdnptr' is a pointer to the end of the
* array pointed to by 'dnptrs'. Side effect is to update the list of
* pointers for labels inserted into the message as we compress the name.
* If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr'
* is NULL, we don't update the list.
*/
static int
ns_name_compress(src, dst, dstsiz, dnptrs, lastdnptr)
const char *src;
u_char *dst;
size_t dstsiz;
const u_char **dnptrs;
const u_char **lastdnptr;
{
u_char tmp[NS_MAXCDNAME];
if (ns_name_pton(src, tmp, sizeof tmp) == -1)
return (-1);
return (ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr));
}
/*
* ns_name_skip(ptrptr, eom)
* Advance *ptrptr to skip over the compressed name it points at.
* return:
* 0 on success, -1 (with errno set) on failure.
*/
static int
ns_name_skip(ptrptr, eom)
const u_char **ptrptr;
const u_char *eom;
{
const u_char *cp;
u_int n;
cp = *ptrptr;
while (cp < eom && (n = *cp++) != 0) {
/* Check for indirection. */
switch (n & NS_CMPRSFLGS) {
case 0: /* normal case, n == len */
cp += n;
continue;
case NS_CMPRSFLGS: /* indirection */
cp++;
break;
default: /* illegal type */
errno = EMSGSIZE;
return (-1);
}
break;
}
if (cp > eom) {
errno = EMSGSIZE;
return (-1);
}
*ptrptr = cp;
return (0);
}
/* Private. */
/*
* special(ch)
* Thinking in noninternationalized USASCII (per the DNS spec),
* is this characted special ("in need of quoting") ?
* return:
* boolean.
*/
static int
special(ch)
int ch;
{
switch (ch) {
case 0x22: /* '"' */
case 0x2E: /* '.' */
case 0x3B: /* ';' */
case 0x5C: /* '\\' */
/* Special modifiers in zone files. */
case 0x40: /* '@' */
case 0x24: /* '$' */
return (1);
default:
return (0);
}
}
/*
* printable(ch)
* Thinking in noninternationalized USASCII (per the DNS spec),
* is this character visible and not a space when printed ?
* return:
* boolean.
*/
static int
printable(ch)
int ch;
{
return (ch > 0x20 && ch < 0x7f);
}
/*
* Thinking in noninternationalized USASCII (per the DNS spec),
* convert this character to lower case if it's upper case.
*/
static int
mklower(ch)
int ch;
{
if (ch >= 0x41 && ch <= 0x5A)
return (ch + 0x20);
return (ch);
}
/*
* dn_find(domain, msg, dnptrs, lastdnptr)
* Search for the counted-label name in an array of compressed names.
* return:
* offset from msg if found, or -1.
* notes:
* dnptrs is the pointer to the first name on the list,
* not the pointer to the start of the message.
*/
static int
dn_find(domain, msg, dnptrs, lastdnptr)
const u_char *domain;
const u_char *msg;
const u_char * const *dnptrs;
const u_char * const *lastdnptr;
{
const u_char *dn, *cp, *sp;
const u_char * const *cpp;
u_int n;
for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
dn = domain;
sp = cp = *cpp;
while ((n = *cp++) != 0) {
/*
* check for indirection
*/
switch (n & NS_CMPRSFLGS) {
case 0: /* normal case, n == len */
if (n != *dn++)
goto next;
for ((void)NULL; n > 0; n--)
if (mklower(*dn++) != mklower(*cp++))
goto next;
/* Is next root for both ? */
if (*dn == '\0' && *cp == '\0')
return (sp - msg);
if (*dn)
continue;
goto next;
case NS_CMPRSFLGS: /* indirection */
cp = msg + (((n & 0x3f) << 8) | *cp);
break;
default: /* illegal type */
errno = EMSGSIZE;
return (-1);
}
}
next: ;
}
errno = ENOENT;
return (-1);
}
/* -- From BIND 8.1.1. -- */

View File

@ -1,115 +0,0 @@
/*
* ++Copyright++ 1995
* -
* Copyright (c) 1995
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] = "$Id: res_data.c,v 8.2 1996/08/05 08:31:35 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <ctype.h>
#include <resolv.h>
#if defined(BSD) && (BSD >= 199103)
# include <unistd.h>
# include <stdlib.h>
# include <string.h>
#else
# include "../conf/portability.h"
#endif
const char *_res_opcodes[] = {
"QUERY",
"IQUERY",
"CQUERYM",
"CQUERYU", /* experimental */
"NOTIFY", /* experimental */
"5",
"6",
"7",
"8",
"UPDATEA",
"UPDATED",
"UPDATEDA",
"UPDATEM",
"UPDATEMA",
"ZONEINIT",
"ZONEREF",
};
const char *_res_resultcodes[] = {
"NOERROR",
"FORMERR",
"SERVFAIL",
"NXDOMAIN",
"NOTIMP",
"REFUSED",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"NOCHANGE",
};

File diff suppressed because it is too large Load Diff

View File

@ -1,655 +0,0 @@
/*
* ++Copyright++ 1985, 1989, 1993
* -
* Copyright (c) 1985, 1989, 1993
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93";
static char rcsid[] = "$Id: res_init.c,v 8.8 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <ctype.h>
#include <resolv.h>
#if defined(BSD) && (BSD >= 199103)
# include <unistd.h>
# include <stdlib.h>
# include <string.h>
#else
# include "../conf/portability.h"
#endif
/*-------------------------------------- info about "sortlist" --------------
* Marc Majka 1994/04/16
* Allan Nathanson 1994/10/29 (BIND 4.9.3.x)
*
* NetInfo resolver configuration directory support.
*
* Allow a NetInfo directory to be created in the hierarchy which
* contains the same information as the resolver configuration file.
*
* - The local domain name is stored as the value of the "domain" property.
* - The Internet address(es) of the name server(s) are stored as values
* of the "nameserver" property.
* - The name server addresses are stored as values of the "nameserver"
* property.
* - The search list for host-name lookup is stored as values of the
* "search" property.
* - The sortlist comprised of IP address netmask pairs are stored as
* values of the "sortlist" property. The IP address and optional netmask
* should be seperated by a slash (/) or ampersand (&) character.
* - Internal resolver variables can be set from the value of the "options"
* property.
*/
#if defined(NeXT)
# include <netinfo/ni.h>
# define NI_PATH_RESCONF "/locations/resolver"
# define NI_TIMEOUT 10
static int netinfo_res_init __P((int *haveenv, int *havesearch));
#endif
#if defined(USE_OPTIONS_H)
# include "../conf/options.h"
#endif
static void res_setoptions __P((char *, char *));
#ifdef RESOLVSORT
static const char sort_mask[] = "/&";
#define ISSORTMASK(ch) (strchr(sort_mask, ch) != NULL)
static u_int32_t net_mask __P((struct in_addr));
#endif
#if !defined(isascii) /* XXX - could be a function */
# define isascii(c) (!(c & 0200))
#endif
/*
* Resolver state default settings.
*/
struct __res_state _res
# if defined(__BIND_RES_TEXT)
= { RES_TIMEOUT, } /* Motorola, et al. */
# endif
;
/*
* Set up default settings. If the configuration file exist, the values
* there will have precedence. Otherwise, the server address is set to
* INADDR_ANY and the default domain name comes from the gethostname().
*
* An interrim version of this code (BIND 4.9, pre-4.4BSD) used 127.0.0.1
* rather than INADDR_ANY ("0.0.0.0") as the default name server address
* since it was noted that INADDR_ANY actually meant ``the first interface
* you "ifconfig"'d at boot time'' and if this was a SLIP or PPP interface,
* it had to be "up" in order for you to reach your own name server. It
* was later decided that since the recommended practice is to always
* install local static routes through 127.0.0.1 for all your network
* interfaces, that we could solve this problem without a code change.
*
* The configuration file should always be used, since it is the only way
* to specify a default domain. If you are running a server on your local
* machine, you should say "nameserver 0.0.0.0" or "nameserver 127.0.0.1"
* in the configuration file.
*
* Return 0 if completes successfully, -1 on error
*/
int
res_init()
{
register FILE *fp;
register char *cp, **pp;
register int n;
char buf[MAXDNAME];
int nserv = 0; /* number of nameserver records read from file */
int haveenv = 0;
int havesearch = 0;
#ifdef RESOLVSORT
int nsort = 0;
char *net;
#endif
#ifndef RFC1535
int dots;
#endif
/*
* These three fields used to be statically initialized. This made
* it hard to use this code in a shared library. It is necessary,
* now that we're doing dynamic initialization here, that we preserve
* the old semantics: if an application modifies one of these three
* fields of _res before res_init() is called, res_init() will not
* alter them. Of course, if an application is setting them to
* _zero_ before calling res_init(), hoping to override what used
* to be the static default, we can't detect it and unexpected results
* will follow. Zero for any of these fields would make no sense,
* so one can safely assume that the applications were already getting
* unexpected results.
*
* _res.options is tricky since some apps were known to diddle the bits
* before res_init() was first called. We can't replicate that semantic
* with dynamic initialization (they may have turned bits off that are
* set in RES_DEFAULT). Our solution is to declare such applications
* "broken". They could fool us by setting RES_INIT but none do (yet).
*/
if (!_res.retrans)
_res.retrans = RES_TIMEOUT;
if (!_res.retry)
_res.retry = 4;
if (!(_res.options & RES_INIT))
_res.options = RES_DEFAULT;
/*
* This one used to initialize implicitly to zero, so unless the app
* has set it to something in particular, we can randomize it now.
*/
if (!_res.id)
_res.id = res_randomid();
#ifdef USELOOPBACK
_res.nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
#else
_res.nsaddr.sin_addr.s_addr = INADDR_ANY;
#endif
_res.nsaddr.sin_family = AF_INET;
_res.nsaddr.sin_port = htons(NAMESERVER_PORT);
_res.nscount = 1;
_res.ndots = 1;
_res.pfcode = 0;
/* Allow user to override the local domain definition */
if ((cp = getenv("LOCALDOMAIN")) != NULL) {
(void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
haveenv++;
/*
* Set search list to be blank-separated strings
* from rest of env value. Permits users of LOCALDOMAIN
* to still have a search list, and anyone to set the
* one that they want to use as an individual (even more
* important now that the rfc1535 stuff restricts searches)
*/
cp = _res.defdname;
pp = _res.dnsrch;
*pp++ = cp;
for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) {
if (*cp == '\n') /* silly backwards compat */
break;
else if (*cp == ' ' || *cp == '\t') {
*cp = 0;
n = 1;
} else if (n) {
*pp++ = cp;
n = 0;
havesearch = 1;
}
}
/* null terminate last domain if there are excess */
while (*cp != '\0' && *cp != ' ' && *cp != '\t' && *cp != '\n')
cp++;
*cp = '\0';
*pp++ = 0;
}
#define MATCH(line, name) \
(!strncmp(line, name, sizeof(name) - 1) && \
(line[sizeof(name) - 1] == ' ' || \
line[sizeof(name) - 1] == '\t'))
#ifdef NeXT
if (netinfo_res_init(&haveenv, &havesearch) == 0)
#endif
if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
/* read the config file */
while (fgets(buf, sizeof(buf), fp) != NULL) {
/* skip comments */
if (*buf == ';' || *buf == '#')
continue;
/* read default domain name */
if (MATCH(buf, "domain")) {
if (haveenv) /* skip if have from environ */
continue;
cp = buf + sizeof("domain") - 1;
while (*cp == ' ' || *cp == '\t')
cp++;
if ((*cp == '\0') || (*cp == '\n'))
continue;
strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
if ((cp = strpbrk(_res.defdname, " \t\n")) != NULL)
*cp = '\0';
havesearch = 0;
continue;
}
/* set search list */
if (MATCH(buf, "search")) {
if (haveenv) /* skip if have from environ */
continue;
cp = buf + sizeof("search") - 1;
while (*cp == ' ' || *cp == '\t')
cp++;
if ((*cp == '\0') || (*cp == '\n'))
continue;
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 == ' ' || *cp == '\t') {
*cp = 0;
n = 1;
} else if (n) {
*pp++ = cp;
n = 0;
}
}
/* null terminate last domain if there are excess */
while (*cp != '\0' && *cp != ' ' && *cp != '\t')
cp++;
*cp = '\0';
*pp++ = 0;
havesearch = 1;
continue;
}
/* read nameservers to query */
if (MATCH(buf, "nameserver") && nserv < MAXNS) {
struct in_addr a;
cp = buf + sizeof("nameserver") - 1;
while (*cp == ' ' || *cp == '\t')
cp++;
if ((*cp != '\0') && (*cp != '\n') && inet_aton(cp, &a)) {
_res.nsaddr_list[nserv].sin_addr = a;
_res.nsaddr_list[nserv].sin_family = AF_INET;
_res.nsaddr_list[nserv].sin_port =
htons(NAMESERVER_PORT);
nserv++;
}
continue;
}
#ifdef RESOLVSORT
if (MATCH(buf, "sortlist")) {
struct in_addr a;
cp = buf + sizeof("sortlist") - 1;
while (nsort < MAXRESOLVSORT) {
while (*cp == ' ' || *cp == '\t')
cp++;
if (*cp == '\0' || *cp == '\n' || *cp == ';')
break;
net = cp;
while (*cp && !ISSORTMASK(*cp) && *cp != ';' &&
isascii(*cp) && !isspace(*cp))
cp++;
n = *cp;
*cp = 0;
if (inet_aton(net, &a)) {
_res.sort_list[nsort].addr = a;
if (ISSORTMASK(n)) {
*cp++ = n;
net = cp;
while (*cp && *cp != ';' &&
isascii(*cp) && !isspace(*cp))
cp++;
n = *cp;
*cp = 0;
if (inet_aton(net, &a)) {
_res.sort_list[nsort].mask = a.s_addr;
} else {
_res.sort_list[nsort].mask =
net_mask(_res.sort_list[nsort].addr);
}
} else {
_res.sort_list[nsort].mask =
net_mask(_res.sort_list[nsort].addr);
}
nsort++;
}
*cp = n;
}
continue;
}
#endif
if (MATCH(buf, "options")) {
res_setoptions(buf + sizeof("options") - 1, "conf");
continue;
}
}
if (nserv > 1)
_res.nscount = nserv;
#ifdef RESOLVSORT
_res.nsort = nsort;
#endif
(void) fclose(fp);
}
if (_res.defdname[0] == 0 &&
gethostname(buf, sizeof(_res.defdname) - 1) == 0 &&
(cp = strchr(buf, '.')) != NULL)
strcpy(_res.defdname, cp + 1);
/* find components of local domain that might be searched */
if (havesearch == 0) {
pp = _res.dnsrch;
*pp++ = _res.defdname;
*pp = NULL;
#ifndef RFC1535
dots = 0;
for (cp = _res.defdname; *cp; cp++)
dots += (*cp == '.');
cp = _res.defdname;
while (pp < _res.dnsrch + MAXDFLSRCH) {
if (dots < LOCALDOMAINPARTS)
break;
cp = strchr(cp, '.') + 1; /* we know there is one */
*pp++ = cp;
dots--;
}
*pp = NULL;
#ifdef DEBUG
if (_res.options & RES_DEBUG) {
printf(";; res_init()... default dnsrch list:\n");
for (pp = _res.dnsrch; *pp; pp++)
printf(";;\t%s\n", *pp);
printf(";;\t..END..\n");
}
#endif /* DEBUG */
#endif /* !RFC1535 */
}
if ((cp = getenv("RES_OPTIONS")) != NULL)
res_setoptions(cp, "env");
_res.options |= RES_INIT;
return (0);
}
static void
res_setoptions(options, source)
char *options, *source;
{
char *cp = options;
int i;
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf(";; res_setoptions(\"%s\", \"%s\")...\n",
options, source);
#endif
while (*cp) {
/* skip leading and inner runs of spaces */
while (*cp == ' ' || *cp == '\t')
cp++;
/* search for and process individual options */
if (!strncmp(cp, "ndots:", sizeof("ndots:") - 1)) {
i = atoi(cp + sizeof("ndots:") - 1);
if (i <= RES_MAXNDOTS)
_res.ndots = i;
else
_res.ndots = RES_MAXNDOTS;
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf(";;\tndots=%d\n", _res.ndots);
#endif
} else if (!strncmp(cp, "debug", sizeof("debug") - 1)) {
#ifdef DEBUG
if (!(_res.options & RES_DEBUG)) {
printf(";; res_setoptions(\"%s\", \"%s\")..\n",
options, source);
_res.options |= RES_DEBUG;
}
printf(";;\tdebug\n");
#endif
} else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) {
_res.options |= RES_USE_INET6;
} else {
/* XXX - print a warning here? */
}
/* skip to next run of spaces */
while (*cp && *cp != ' ' && *cp != '\t')
cp++;
}
}
#ifdef RESOLVSORT
/* XXX - should really support CIDR which means explicit masks always. */
static u_int32_t
net_mask(in) /* XXX - should really use system's version of this */
struct in_addr in;
{
register u_int32_t i = ntohl(in.s_addr);
if (IN_CLASSA(i))
return (htonl(IN_CLASSA_NET));
else if (IN_CLASSB(i))
return (htonl(IN_CLASSB_NET));
return (htonl(IN_CLASSC_NET));
}
#endif
#ifdef NeXT
static int
netinfo_res_init(haveenv, havesearch)
int *haveenv;
int *havesearch;
{
register int n;
void *domain, *parent;
ni_id dir;
ni_status status;
ni_namelist nl;
int nserv = 0;
#ifdef RESOLVSORT
int nsort = 0;
#endif
status = ni_open(NULL, ".", &domain);
if (status == NI_OK) {
ni_setreadtimeout(domain, NI_TIMEOUT);
ni_setabort(domain, 1);
/* climb the NetInfo hierarchy to find a resolver directory */
while (status == NI_OK) {
status = ni_pathsearch(domain, &dir, NI_PATH_RESCONF);
if (status == NI_OK) {
/* found a resolver directory */
if (*haveenv == 0) {
/* get the default domain name */
status = ni_lookupprop(domain, &dir, "domain", &nl);
if (status == NI_OK && nl.ni_namelist_len > 0) {
(void)strncpy(_res.defdname,
nl.ni_namelist_val[0],
sizeof(_res.defdname) - 1);
_res.defdname[sizeof(_res.defdname) - 1] = '\0';
ni_namelist_free(&nl);
*havesearch = 0;
}
/* get search list */
status = ni_lookupprop(domain, &dir, "search", &nl);
if (status == NI_OK && nl.ni_namelist_len > 0) {
(void)strncpy(_res.defdname,
nl.ni_namelist_val[0],
sizeof(_res.defdname) - 1);
_res.defdname[sizeof(_res.defdname) - 1] = '\0';
/* copy */
for (n = 0;
n < nl.ni_namelist_len && n < MAXDNSRCH;
n++) {
/* duplicate up to MAXDNSRCH servers */
char *cp = nl.ni_namelist_val[n];
_res.dnsrch[n] =
strcpy((char *)malloc(strlen(cp) + 1), cp);
}
ni_namelist_free(&nl);
*havesearch = 1;
}
}
/* get list of nameservers */
status = ni_lookupprop(domain, &dir, "nameserver", &nl);
if (status == NI_OK && nl.ni_namelist_len > 0) {
/* copy up to MAXNS servers */
for (n = 0;
n < nl.ni_namelist_len && nserv < MAXNS;
n++) {
struct in_addr a;
if (inet_aton(nl.ni_namelist_val[n], &a)) {
_res.nsaddr_list[nserv].sin_addr = a;
_res.nsaddr_list[nserv].sin_family = AF_INET;
_res.nsaddr_list[nserv].sin_port =
htons(NAMESERVER_PORT);
nserv++;
}
}
ni_namelist_free(&nl);
}
if (nserv > 1)
_res.nscount = nserv;
#ifdef RESOLVSORT
/* get sort order */
status = ni_lookupprop(domain, &dir, "sortlist", &nl);
if (status == NI_OK && nl.ni_namelist_len > 0) {
/* copy up to MAXRESOLVSORT address/netmask pairs */
for (n = 0;
n < nl.ni_namelist_len && nsort < MAXRESOLVSORT;
n++) {
char ch;
char *cp;
const char *sp;
struct in_addr a;
cp = NULL;
for (sp = sort_mask; *sp; sp++) {
char *cp1;
cp1 = strchr(nl.ni_namelist_val[n], *sp);
if (cp && cp1)
cp = (cp < cp1)? cp : cp1;
else if (cp1)
cp = cp1;
}
if (cp != NULL) {
ch = *cp;
*cp = '\0';
break;
}
if (inet_aton(nl.ni_namelist_val[n], &a)) {
_res.sort_list[nsort].addr = a;
if (*cp && ISSORTMASK(ch)) {
*cp++ = ch;
if (inet_aton(cp, &a)) {
_res.sort_list[nsort].mask = a.s_addr;
} else {
_res.sort_list[nsort].mask =
net_mask(_res.sort_list[nsort].addr);
}
} else {
_res.sort_list[nsort].mask =
net_mask(_res.sort_list[nsort].addr);
}
nsort++;
}
}
ni_namelist_free(&nl);
}
_res.nsort = nsort;
#endif
/* get resolver options */
status = ni_lookupprop(domain, &dir, "options", &nl);
if (status == NI_OK && nl.ni_namelist_len > 0) {
res_setoptions(nl.ni_namelist_val[0], "conf");
ni_namelist_free(&nl);
}
ni_free(domain);
return(1); /* using DNS configuration from NetInfo */
}
status = ni_open(domain, "..", &parent);
ni_free(domain);
if (status == NI_OK)
domain = parent;
}
}
return(0); /* if not using DNS configuration from NetInfo */
}
#endif /* NeXT */
u_int
res_randomid()
{
struct timeval now;
gettimeofday(&now, NULL);
return (0xffff & (now.tv_sec ^ now.tv_usec ^ getpid()));
}

View File

@ -1,190 +0,0 @@
/*
* ++Copyright++ 1985, 1993
* -
* Copyright (c) 1985, 1993
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_mkquery.c,v 8.5 1996/08/27 08:33:28 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <netdb.h>
#include <resolv.h>
#if defined(BSD) && (BSD >= 199103)
# include <string.h>
#else
# include "../conf/portability.h"
#endif
#if defined(USE_OPTIONS_H)
# include <../conf/options.h>
#endif
/*
* Form all types of queries.
* Returns the size of the result or -1.
*/
int
res_mkquery(op, dname, class, type, data, datalen, newrr_in, buf, buflen)
int op; /* opcode of query */
const char *dname; /* domain name */
int class, type; /* class and type of query */
const u_char *data; /* resource record data */
int datalen; /* length of data */
const u_char *newrr_in; /* new rr for modify or append */
u_char *buf; /* buffer to put query */
int buflen; /* size of buffer */
{
register HEADER *hp;
register u_char *cp;
register int n;
u_char *dnptrs[20], **dpp, **lastdnptr;
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
return (-1);
}
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf(";; res_mkquery(%d, %s, %d, %d)\n",
op, dname, class, type);
#endif
/*
* Initialize header fields.
*/
if ((buf == NULL) || (buflen < HFIXEDSZ))
return (-1);
bzero(buf, HFIXEDSZ);
hp = (HEADER *) buf;
hp->id = htons(++_res.id);
hp->opcode = op;
hp->rd = (_res.options & RES_RECURSE) != 0;
hp->rcode = NOERROR;
cp = buf + HFIXEDSZ;
buflen -= HFIXEDSZ;
dpp = dnptrs;
*dpp++ = buf;
*dpp++ = NULL;
lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0];
/*
* perform opcode specific processing
*/
switch (op) {
case QUERY: /*FALLTHROUGH*/
case NS_NOTIFY_OP:
if ((buflen -= QFIXEDSZ) < 0)
return (-1);
if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
return (-1);
cp += n;
buflen -= n;
__putshort(type, cp);
cp += INT16SZ;
__putshort(class, cp);
cp += INT16SZ;
hp->qdcount = htons(1);
if (op == QUERY || data == NULL)
break;
/*
* Make an additional record for completion domain.
*/
buflen -= RRFIXEDSZ;
n = dn_comp((char *)data, cp, buflen, dnptrs, lastdnptr);
if (n < 0)
return (-1);
cp += n;
buflen -= n;
__putshort(T_NULL, cp);
cp += INT16SZ;
__putshort(class, cp);
cp += INT16SZ;
__putlong(0, cp);
cp += INT32SZ;
__putshort(0, cp);
cp += INT16SZ;
hp->arcount = htons(1);
break;
case IQUERY:
/*
* Initialize answer section
*/
if (buflen < 1 + RRFIXEDSZ + datalen)
return (-1);
*cp++ = '\0'; /* no domain name */
__putshort(type, cp);
cp += INT16SZ;
__putshort(class, cp);
cp += INT16SZ;
__putlong(0, cp);
cp += INT32SZ;
__putshort(datalen, cp);
cp += INT16SZ;
if (datalen) {
bcopy(data, cp, datalen);
cp += datalen;
}
hp->ancount = htons(1);
break;
default:
return (-1);
}
return (cp - buf);
}

View File

@ -1,403 +0,0 @@
/*
* ++Copyright++ 1988, 1993
* -
* Copyright (c) 1988, 1993
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_query.c,v 8.10 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <netdb.h>
#include <resolv.h>
#include <ctype.h>
#include <errno.h>
#if defined(BSD) && (BSD >= 199306)
# include <stdlib.h>
# include <string.h>
#else
# include "../conf/portability.h"
#endif
#if defined(USE_OPTIONS_H)
# include <../conf/options.h>
#endif
#if PACKETSZ > 1024
#define MAXPACKET PACKETSZ
#else
#define MAXPACKET 1024
#endif
const char *hostalias __P((const char *));
int h_errno;
/*
* Formulate a normal query, send, and await answer.
* Returned answer is placed in supplied buffer "answer".
* Perform preliminary check of answer, returning success only
* if no error is indicated and the answer count is nonzero.
* Return the size of the response on success, -1 on error.
* Error number is left in h_errno.
*
* Caller must parse answer and determine whether it answers the question.
*/
int
res_query(name, class, type, answer, anslen)
const char *name; /* domain name */
int class, type; /* class and type of query */
u_char *answer; /* buffer to put answer */
int anslen; /* size of answer buffer */
{
u_char buf[MAXPACKET];
register HEADER *hp = (HEADER *) answer;
int n;
hp->rcode = NOERROR; /* default */
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
return (-1);
}
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf(";; res_query(%s, %d, %d)\n", name, class, type);
#endif
n = res_mkquery(QUERY, name, class, type, NULL, 0, NULL,
buf, sizeof(buf));
if (n <= 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf(";; res_query: mkquery failed\n");
#endif
h_errno = NO_RECOVERY;
return (n);
}
n = res_send(buf, n, answer, anslen);
if (n < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf(";; res_query: send error\n");
#endif
h_errno = TRY_AGAIN;
return (n);
}
if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf(";; rcode = %d, ancount=%d\n", hp->rcode,
ntohs(hp->ancount));
#endif
switch (hp->rcode) {
case NXDOMAIN:
h_errno = HOST_NOT_FOUND;
break;
case SERVFAIL:
h_errno = TRY_AGAIN;
break;
case NOERROR:
h_errno = NO_DATA;
break;
case FORMERR:
case NOTIMP:
case REFUSED:
default:
h_errno = NO_RECOVERY;
break;
}
return (-1);
}
return (n);
}
/*
* Formulate a normal query, send, and retrieve answer in supplied buffer.
* Return the size of the response on success, -1 on error.
* If enabled, implement search rules until answer or unrecoverable failure
* is detected. Error code, if any, is left in h_errno.
*/
int
res_search(name, class, type, answer, anslen)
const char *name; /* domain name */
int class, type; /* class and type of query */
u_char *answer; /* buffer to put answer */
int anslen; /* size of answer */
{
register const char *cp, * const *domain;
HEADER *hp = (HEADER *) answer;
u_int dots;
int trailing_dot, ret, saved_herrno;
int got_nodata = 0, got_servfail = 0, tried_as_is = 0;
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
return (-1);
}
errno = 0;
h_errno = HOST_NOT_FOUND; /* default, if we never query */
dots = 0;
for (cp = name; *cp; cp++)
dots += (*cp == '.');
trailing_dot = 0;
if (cp > name && *--cp == '.')
trailing_dot++;
/*
* if there aren't any dots, it could be a user-level alias
*/
if (!dots && (cp = __hostalias(name)) != NULL)
return (res_query(cp, class, type, answer, anslen));
/*
* If there are dots in the name already, let's just give it a try
* 'as is'. The threshold can be set with the "ndots" option.
*/
saved_herrno = -1;
if (dots >= _res.ndots) {
ret = res_querydomain(name, NULL, class, type, answer, anslen);
if (ret > 0)
return (ret);
saved_herrno = h_errno;
tried_as_is++;
}
/*
* 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 ((!dots && (_res.options & RES_DEFNAMES)) ||
(dots && !trailing_dot && (_res.options & RES_DNSRCH))) {
int done = 0;
for (domain = (const char * const *)_res.dnsrch;
*domain && !done;
domain++) {
ret = res_querydomain(name, *domain, class, type,
answer, anslen);
if (ret > 0)
return (ret);
/*
* 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_DATA 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 (errno == ECONNREFUSED) {
h_errno = TRY_AGAIN;
return (-1);
}
switch (h_errno) {
case NO_DATA:
got_nodata++;
/* FALLTHROUGH */
case HOST_NOT_FOUND:
/* keep trying */
break;
case TRY_AGAIN:
if (hp->rcode == SERVFAIL) {
/* try next search element, if any */
got_servfail++;
break;
}
/* FALLTHROUGH */
default:
/* anything else implies that we're done */
done++;
}
/* if we got here for some reason other than DNSRCH,
* we only wanted one iteration of the loop, so stop.
*/
if (!(_res.options & RES_DNSRCH))
done++;
}
}
/* if we have not already tried the name "as is", do that now.
* note that we do this regardless of how many dots were in the
* name or whether it ends with a dot.
*/
if (!tried_as_is) {
ret = res_querydomain(name, NULL, class, type, answer, anslen);
if (ret > 0)
return (ret);
}
/* if we got here, we didn't satisfy the search.
* if we did an initial full query, return that query's h_errno
* (note that we wouldn't be here if that query had succeeded).
* else if we ever got a nodata, send that back as the reason.
* else send back meaningless h_errno, that being the one from
* the last DNSRCH we did.
*/
if (saved_herrno != -1)
h_errno = saved_herrno;
else if (got_nodata)
h_errno = NO_DATA;
else if (got_servfail)
h_errno = TRY_AGAIN;
return (-1);
}
/*
* Perform a call on res_query on the concatenation of name and domain,
* removing a trailing dot from name if domain is NULL.
*/
int
res_querydomain(name, domain, class, type, answer, anslen)
const char *name, *domain;
int class, type; /* class and type of query */
u_char *answer; /* buffer to put answer */
int anslen; /* size of answer */
{
char nbuf[MAXDNAME];
const char *longname = nbuf;
int n, d;
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
return (-1);
}
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf(";; res_querydomain(%s, %s, %d, %d)\n",
name, domain?domain:"<Nil>", class, type);
#endif
if (domain == NULL) {
/*
* Check for trailing '.';
* copy without '.' if present.
*/
n = strlen(name);
if (n >= MAXDNAME) {
h_errno = NO_RECOVERY;
return (-1);
}
n--;
if (n >= 0 && name[n] == '.') {
strncpy(nbuf, name, n);
nbuf[n] = '\0';
} else
longname = name;
} else {
n = strlen(name);
d = strlen(domain);
if (n + d + 1 >= MAXDNAME) {
h_errno = NO_RECOVERY;
return (-1);
}
sprintf(nbuf, "%s.%s", name, domain);
}
return (res_query(longname, class, type, answer, anslen));
}
const char *
hostalias(name)
register const char *name;
{
register char *cp1, *cp2;
FILE *fp;
char *file;
char buf[BUFSIZ];
static char abuf[MAXDNAME];
if (_res.options & RES_NOALIASES)
return (NULL);
file = getenv("HOSTALIASES");
if (file == NULL || (fp = fopen(file, "r")) == NULL)
return (NULL);
setbuf(fp, NULL);
buf[sizeof(buf) - 1] = '\0';
while (fgets(buf, sizeof(buf), fp)) {
for (cp1 = buf; *cp1 && !isspace(*cp1); ++cp1)
;
if (!*cp1)
break;
*cp1 = '\0';
if (!strcasecmp(buf, name)) {
while (isspace(*++cp1))
;
if (!*cp1)
break;
for (cp2 = cp1 + 1; *cp2 && !isspace(*cp2); ++cp2)
;
abuf[sizeof(abuf) - 1] = *cp2 = '\0';
strncpy(abuf, cp1, sizeof(abuf) - 1);
fclose(fp);
return (abuf);
}
}
fclose(fp);
return (NULL);
}

View File

@ -1,845 +0,0 @@
/*
* ++Copyright++ 1985, 1989, 1993
* -
* Copyright (c) 1985, 1989, 1993
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_send.c,v 8.14 1998/04/07 04:59:46 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
/* change this to "0"
* if you talk to a lot
* of multi-homed SunOS
* ("broken") name servers.
*/
#define CHECK_SRVR_ADDR 1 /* XXX - should be in options.h */
/*
* Send query to name server and wait for reply.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/uio.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <netdb.h>
#include <errno.h>
#include <resolv.h>
#if defined(BSD) && (BSD >= 199306)
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
#else
# include "../conf/portability.h"
#endif
#if defined(USE_OPTIONS_H)
# include <../conf/options.h>
#endif
static int s = -1; /* socket used for communications */
static int connected = 0; /* is the socket connected */
static int vc = 0; /* is the socket a virtual ciruit? */
#ifndef FD_SET
/* XXX - should be in portability.h */
#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
/* XXX - this should be done in portability.h */
#if (defined(BSD) && (BSD >= 199103)) || defined(linux)
# define CAN_RECONNECT 1
#else
# define CAN_RECONNECT 0
#endif
#ifndef DEBUG
# define Dprint(cond, args) /*empty*/
# define DprintQ(cond, args, query, size) /*empty*/
# define Aerror(file, string, error, address) /*empty*/
# define Perror(file, string, error) /*empty*/
#else
# define Dprint(cond, args) if (cond) {fprintf args;} else {}
# define DprintQ(cond, args, query, size) if (cond) {\
fprintf args;\
__fp_nquery(query, size, stdout);\
} else {}
static void
Aerror(file, string, error, address)
FILE *file;
char *string;
int error;
struct sockaddr_in address;
{
int save = errno;
if (_res.options & RES_DEBUG) {
fprintf(file, "res_send: %s ([%s].%u): %s\n",
string,
inet_ntoa(address.sin_addr),
ntohs(address.sin_port),
strerror(error));
}
errno = save;
}
static void
Perror(file, string, error)
FILE *file;
char *string;
int error;
{
int save = errno;
if (_res.options & RES_DEBUG) {
fprintf(file, "res_send: %s: %s\n",
string, strerror(error));
}
errno = save;
}
#endif
static res_send_qhook Qhook = NULL;
static res_send_rhook Rhook = NULL;
void
res_send_setqhook(hook)
res_send_qhook hook;
{
Qhook = hook;
}
void
res_send_setrhook(hook)
res_send_rhook hook;
{
Rhook = hook;
}
/* int
* res_isourserver(ina)
* looks up "ina" in _res.ns_addr_list[]
* returns:
* 0 : not found
* >0 : found
* author:
* paul vixie, 29may94
*/
int
res_isourserver(inp)
const struct sockaddr_in *inp;
{
struct sockaddr_in ina;
register int ns, ret;
ina = *inp;
ret = 0;
for (ns = 0; ns < _res.nscount; ns++) {
register const struct sockaddr_in *srv = &_res.nsaddr_list[ns];
if (srv->sin_family == ina.sin_family &&
srv->sin_port == ina.sin_port &&
(srv->sin_addr.s_addr == INADDR_ANY ||
srv->sin_addr.s_addr == ina.sin_addr.s_addr)) {
ret++;
break;
}
}
return (ret);
}
/* int
* res_nameinquery(name, type, class, buf, eom)
* look for (name,type,class) in the query section of packet (buf,eom)
* requires:
* buf + HFIXESDZ <= eom
* returns:
* -1 : format error
* 0 : not found
* >0 : found
* author:
* paul vixie, 29may94
*/
int
res_nameinquery(name, type, class, buf, eom)
const char *name;
register int type, class;
const u_char *buf, *eom;
{
register const u_char *cp = buf + HFIXEDSZ;
int qdcount = ntohs(((HEADER*)buf)->qdcount);
while (qdcount-- > 0) {
char tname[MAXDNAME+1];
register int n, ttype, tclass;
n = dn_expand(buf, eom, cp, tname, sizeof tname);
if (n < 0)
return (-1);
cp += n;
if (cp + 2 * INT16SZ > eom)
return (-1);
ttype = _getshort(cp); cp += INT16SZ;
tclass = _getshort(cp); cp += INT16SZ;
if (ttype == type &&
tclass == class &&
strcasecmp(tname, name) == 0)
return (1);
}
return (0);
}
/* int
* res_queriesmatch(buf1, eom1, buf2, eom2)
* is there a 1:1 mapping of (name,type,class)
* in (buf1,eom1) and (buf2,eom2)?
* returns:
* -1 : format error
* 0 : not a 1:1 mapping
* >0 : is a 1:1 mapping
* author:
* paul vixie, 29may94
*/
int
res_queriesmatch(buf1, eom1, buf2, eom2)
const u_char *buf1, *eom1;
const u_char *buf2, *eom2;
{
register const u_char *cp = buf1 + HFIXEDSZ;
int qdcount = ntohs(((HEADER*)buf1)->qdcount);
if (buf1 + HFIXEDSZ > eom1 || buf2 + HFIXEDSZ > eom2)
return (-1);
if (qdcount != ntohs(((HEADER*)buf2)->qdcount))
return (0);
while (qdcount-- > 0) {
char tname[MAXDNAME+1];
register int n, ttype, tclass;
n = dn_expand(buf1, eom1, cp, tname, sizeof tname);
if (n < 0)
return (-1);
cp += n;
if (cp + 2 * INT16SZ > eom1)
return (-1);
ttype = _getshort(cp); cp += INT16SZ;
tclass = _getshort(cp); cp += INT16SZ;
if (!res_nameinquery(tname, ttype, tclass, buf2, eom2))
return (0);
}
return (1);
}
int
res_send(buf, buflen, ans, anssiz)
const u_char *buf;
int buflen;
u_char *ans;
int anssiz;
{
HEADER *hp = (HEADER *) buf;
HEADER *anhp = (HEADER *) ans;
int gotsomewhere, connreset, terrno, try, v_circuit, resplen, ns;
register int n;
u_int badns; /* XXX NSMAX can't exceed #/bits in this var */
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
/* errno should have been set by res_init() in this case. */
return (-1);
}
if (anssiz < HFIXEDSZ) {
errno = EINVAL;
return (-1);
}
DprintQ((_res.options & RES_DEBUG) || (_res.pfcode & RES_PRF_QUERY),
(stdout, ";; res_send()\n"), buf, buflen);
v_circuit = (_res.options & RES_USEVC) || buflen > PACKETSZ;
gotsomewhere = 0;
connreset = 0;
terrno = ETIMEDOUT;
badns = 0;
/*
* Send request, RETRY times, or until successful
*/
for (try = 0; try < _res.retry; try++) {
for (ns = 0; ns < _res.nscount; ns++) {
struct sockaddr_in *nsap = &_res.nsaddr_list[ns];
same_ns:
if (badns & (1 << ns)) {
res_close();
goto next_ns;
}
if (Qhook) {
int done = 0, loops = 0;
do {
res_sendhookact act;
act = (*Qhook)(&nsap, &buf, &buflen,
ans, anssiz, &resplen);
switch (act) {
case res_goahead:
done = 1;
break;
case res_nextns:
res_close();
goto next_ns;
case res_done:
return (resplen);
case res_modified:
/* give the hook another try */
if (++loops < 42) /*doug adams*/
break;
/*FALLTHROUGH*/
case res_error:
/*FALLTHROUGH*/
default:
return (-1);
}
} while (!done);
}
Dprint(_res.options & RES_DEBUG,
(stdout, ";; Querying server (# %d) address = %s\n",
ns + 1, inet_ntoa(nsap->sin_addr)));
if (v_circuit) {
int truncated;
struct iovec iov[2];
u_short len;
u_char *cp;
/*
* Use virtual circuit;
* at most one attempt per server.
*/
try = _res.retry;
truncated = 0;
if ((s < 0) || (!vc)) {
if (s >= 0)
res_close();
s = socket(PF_INET, SOCK_STREAM, 0);
if (s < 0) {
terrno = errno;
Perror(stderr, "socket(vc)", errno);
return (-1);
}
errno = 0;
if (connect(s, (struct sockaddr *)nsap,
sizeof(struct sockaddr)) < 0) {
terrno = errno;
Aerror(stderr, "connect/vc",
errno, *nsap);
badns |= (1 << ns);
res_close();
goto next_ns;
}
vc = 1;
}
/*
* Send length & message
*/
putshort((u_short)buflen, (u_char*)&len);
iov[0].iov_base = (caddr_t)&len;
iov[0].iov_len = INT16SZ;
iov[1].iov_base = (caddr_t)buf;
iov[1].iov_len = buflen;
if (writev(s, iov, 2) != (INT16SZ + buflen)) {
terrno = errno;
Perror(stderr, "write failed", errno);
badns |= (1 << ns);
res_close();
goto next_ns;
}
/*
* Receive length & response
*/
read_len:
cp = ans;
len = INT16SZ;
while ((n = read(s, (char *)cp, (int)len)) > 0) {
cp += n;
if ((len -= n) <= 0)
break;
}
if (n <= 0) {
terrno = errno;
Perror(stderr, "read failed", errno);
res_close();
/*
* 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;
res_close();
goto same_ns;
}
res_close();
goto next_ns;
}
resplen = _getshort(ans);
if (resplen > anssiz) {
Dprint(_res.options & RES_DEBUG,
(stdout, ";; response truncated\n")
);
truncated = 1;
len = anssiz;
} else
len = resplen;
if (len < HFIXEDSZ) {
/*
* Undersized message.
*/
Dprint(_res.options & RES_DEBUG,
(stdout, ";; undersized: %d\n", len));
terrno = EMSGSIZE;
badns |= (1 << ns);
res_close();
goto next_ns;
}
cp = ans;
while (len != 0 &&
(n = read(s, (char *)cp, (int)len)) > 0) {
cp += n;
len -= n;
}
if (n <= 0) {
terrno = errno;
Perror(stderr, "read(vc)", errno);
res_close();
goto next_ns;
}
if (truncated) {
/*
* Flush rest of answer
* so connection stays in synch.
*/
anhp->tc = 1;
len = resplen - anssiz;
while (len != 0) {
char junk[PACKETSZ];
n = (len > sizeof(junk)
? sizeof(junk)
: len);
if ((n = read(s, junk, n)) > 0)
len -= n;
else
break;
}
}
/*
* The calling applicating has bailed out of
* a previous call and failed to arrange to have
* the circuit closed or the server has got
* itself confused. Anyway drop the packet and
* wait for the correct one.
*/
if (hp->id != anhp->id) {
DprintQ((_res.options & RES_DEBUG) ||
(_res.pfcode & RES_PRF_REPLY),
(stdout, ";; old answer (unexpected):\n"),
ans, (resplen>anssiz)?anssiz:resplen);
goto read_len;
}
} else {
/*
* Use datagrams.
*/
struct timeval timeout;
fd_set dsmask;
struct sockaddr_in from;
int fromlen;
if ((s < 0) || vc) {
if (vc)
res_close();
s = socket(PF_INET, SOCK_DGRAM, 0);
if (s < 0) {
#if !CAN_RECONNECT
bad_dg_sock:
#endif
terrno = errno;
Perror(stderr, "socket(dg)", errno);
return (-1);
}
connected = 0;
}
/*
* 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)) {
/*
* Connect only if we are sure we won't
* receive a response from another server.
*/
if (!connected) {
if (connect(s, (struct sockaddr *)nsap,
sizeof(struct sockaddr)
) < 0) {
Aerror(stderr,
"connect(dg)",
errno, *nsap);
badns |= (1 << ns);
res_close();
goto next_ns;
}
connected = 1;
}
if (send(s, (char*)buf, buflen, 0) != buflen) {
Perror(stderr, "send", errno);
badns |= (1 << ns);
res_close();
goto next_ns;
}
} else {
/*
* Disconnect if we want to listen
* for responses from more than one server.
*/
if (connected) {
#if CAN_RECONNECT
struct sockaddr_in no_addr;
no_addr.sin_family = AF_INET;
no_addr.sin_addr.s_addr = INADDR_ANY;
no_addr.sin_port = 0;
(void) connect(s,
(struct sockaddr *)
&no_addr,
sizeof(no_addr));
#else
int s1 = socket(PF_INET, SOCK_DGRAM,0);
if (s1 < 0)
goto bad_dg_sock;
(void) dup2(s1, s);
(void) close(s1);
Dprint(_res.options & RES_DEBUG,
(stdout, ";; new DG socket\n"))
#endif
connected = 0;
errno = 0;
}
if (sendto(s, (char*)buf, buflen, 0,
(struct sockaddr *)nsap,
sizeof(struct sockaddr))
!= buflen) {
Aerror(stderr, "sendto", errno, *nsap);
badns |= (1 << ns);
res_close();
goto next_ns;
}
}
/*
* Wait for reply
*/
timeout.tv_sec = (_res.retrans << try);
if (try > 0)
timeout.tv_sec /= _res.nscount;
if ((long) timeout.tv_sec <= 0)
timeout.tv_sec = 1;
timeout.tv_usec = 0;
wait:
if (s < 0 || s >= FD_SETSIZE) {
Perror(stderr, "s out-of-bounds", EMFILE);
res_close();
goto next_ns;
}
FD_ZERO(&dsmask);
FD_SET(s, &dsmask);
n = select(s+1, &dsmask, (fd_set *)NULL,
(fd_set *)NULL, &timeout);
if (n < 0) {
if (errno == EINTR)
goto wait;
Perror(stderr, "select", errno);
res_close();
goto next_ns;
}
if (n == 0) {
/*
* timeout
*/
Dprint(_res.options & RES_DEBUG,
(stdout, ";; timeout\n"));
gotsomewhere = 1;
res_close();
goto next_ns;
}
errno = 0;
fromlen = sizeof(struct sockaddr_in);
resplen = recvfrom(s, (char*)ans, anssiz, 0,
(struct sockaddr *)&from, &fromlen);
if (resplen <= 0) {
Perror(stderr, "recvfrom", errno);
res_close();
goto next_ns;
}
gotsomewhere = 1;
if (resplen < HFIXEDSZ) {
/*
* Undersized message.
*/
Dprint(_res.options & RES_DEBUG,
(stdout, ";; undersized: %d\n",
resplen));
terrno = EMSGSIZE;
badns |= (1 << ns);
res_close();
goto next_ns;
}
if (hp->id != anhp->id) {
/*
* response from old query, ignore it.
* XXX - potential security hazard could
* be detected here.
*/
DprintQ((_res.options & RES_DEBUG) ||
(_res.pfcode & RES_PRF_REPLY),
(stdout, ";; old answer:\n"),
ans, (resplen>anssiz)?anssiz:resplen);
goto wait;
}
#if CHECK_SRVR_ADDR
if (!(_res.options & RES_INSECURE1) &&
!res_isourserver(&from)) {
/*
* response from wrong server? ignore it.
* XXX - potential security hazard could
* be detected here.
*/
DprintQ((_res.options & RES_DEBUG) ||
(_res.pfcode & RES_PRF_REPLY),
(stdout, ";; not our server:\n"),
ans, (resplen>anssiz)?anssiz:resplen);
goto wait;
}
#endif
if (!(_res.options & RES_INSECURE2) &&
!res_queriesmatch(buf, buf + buflen,
ans, ans + anssiz)) {
/*
* response contains wrong query? ignore it.
* XXX - potential security hazard could
* be detected here.
*/
DprintQ((_res.options & RES_DEBUG) ||
(_res.pfcode & RES_PRF_REPLY),
(stdout, ";; wrong query name:\n"),
ans, (resplen>anssiz)?anssiz:resplen);
goto wait;
}
if (anhp->rcode == SERVFAIL ||
anhp->rcode == NOTIMP ||
anhp->rcode == REFUSED) {
DprintQ(_res.options & RES_DEBUG,
(stdout, "server rejected query:\n"),
ans, (resplen>anssiz)?anssiz:resplen);
badns |= (1 << ns);
res_close();
/* don't retry if called from dig */
if (!_res.pfcode)
goto next_ns;
}
if (!(_res.options & RES_IGNTC) && anhp->tc) {
/*
* get rest of answer;
* use TCP with same server.
*/
Dprint(_res.options & RES_DEBUG,
(stdout, ";; truncated answer\n"));
v_circuit = 1;
res_close();
goto same_ns;
}
} /*if vc/dg*/
Dprint((_res.options & RES_DEBUG) ||
((_res.pfcode & RES_PRF_REPLY) &&
(_res.pfcode & RES_PRF_HEAD1)),
(stdout, ";; got answer:\n"));
DprintQ((_res.options & RES_DEBUG) ||
(_res.pfcode & RES_PRF_REPLY),
(stdout, ""),
ans, (resplen>anssiz)?anssiz:resplen);
/*
* 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) || ns != 0)) ||
!(_res.options & RES_STAYOPEN)) {
res_close();
}
if (Rhook) {
int done = 0, loops = 0;
do {
res_sendhookact act;
act = (*Rhook)(nsap, buf, buflen,
ans, anssiz, &resplen);
switch (act) {
case res_goahead:
case res_done:
done = 1;
break;
case res_nextns:
res_close();
goto next_ns;
case res_modified:
/* give the hook another try */
if (++loops < 42) /*doug adams*/
break;
/*FALLTHROUGH*/
case res_error:
/*FALLTHROUGH*/
default:
return (-1);
}
} while (!done);
}
return (resplen);
next_ns: ;
} /*foreach ns*/
} /*foreach retry*/
res_close();
if (!v_circuit)
if (!gotsomewhere)
errno = ECONNREFUSED; /* no nameservers found */
else
errno = ETIMEDOUT; /* no answer obtained */
else
errno = terrno;
return (-1);
}
/*
* This routine is for closing the socket if a virtual circuit is used and
* the program wants to close it. This provides support for endhostent()
* which expects to close the socket.
*
* This routine is not expected to be user visible.
*/
void
res_close()
{
if (s >= 0) {
(void) close(s);
s = -1;
connected = 0;
vc = 0;
}
}
#ifdef ultrix
/* ultrix 4.0 had some icky packaging in its libc.a. alias for it here.
* there is more gunk of this kind over in res_debug.c.
*/
void
_res_close()
{
res_close();
}
#undef res_send
int
res_send(buf, buflen, ans, anssiz)
const u_char *buf;
int buflen;
u_char *ans;
int anssiz;
{
return (__res_send(buf, buflen, ans, anssiz));
}
#endif /* Ultrix 4.0 hackery */

View File

@ -1,61 +0,0 @@
/*
* Copyright (c) 1985, 1993
* 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.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)sethostent.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: sethostent.c,v 8.5 1996/09/28 06:51:07 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <netdb.h>
#include <resolv.h>
void
sethostent(stayopen)
int stayopen;
{
if ((_res.options & RES_INIT) == 0 && res_init() == -1)
return;
if (stayopen)
_res.options |= RES_STAYOPEN | RES_USEVC;
}
void
endhostent()
{
_res.options &= ~(RES_STAYOPEN | RES_USEVC);
res_close();
}

View File

@ -1,163 +0,0 @@
#
# @(#)Makefile 4.9 (Berkeley) 10/10/88
# $Id: Makefile,v 8.7 1996/05/20 15:10:04 vixie Exp $
#
## ++Copyright++ 1987
## -
## Copyright (c) 1987
## 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.
## -
## Portions Copyright (c) 1993 by Digital Equipment Corporation.
##
## Permission to use, copy, modify, and distribute this software for any
## purpose with or without fee is hereby granted, provided that the above
## copyright notice and this permission notice appear in all copies, and that
## the name of Digital Equipment Corporation not be used in advertising or
## publicity pertaining to distribution of the document or software without
## specific, written prior permission.
##
## THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
## WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
## OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
## CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
## DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
## -
## --Copyright--
DESTDIR=
CC= cc
SHELL= /bin/sh
CDEBUG= -g
INCL = ../include
RES= ../res/libresolv.a
COMPLIB= ../compat/lib/lib44bsd.a
LEX= lex
LIBS= -ll
PIDDIR = /etc
DESTBIN = /usr/bin
DESTSBIN = /usr/etc
DESTEXEC = /usr/etc
DESTMAN = /usr/man
COMPINCL = ../compat/include
DESTHELP= /usr/lib
#(net2 and its descendents)
#LEX = lex -I
#LIBS = -ll -lutil
#PIDDIR = /var/run
#DESTBIN = /usr/bin
#DESTSBIN = /usr/sbin
#DESTEXEC = /usr/libexec
#DESTMAN = /usr/share/man
#COMPINCL = .
#DESTHELP= /usr/share/misc
LDFLAGS=
MARGS = "CC=$(CC)" "LEX=$(LEX)" "CDEBUG=$(CDEBUG)" "SHELL=$(SHELL)" \
"INCL=../$(INCL)" "RES=../$(RES)" "LIBS=$(LIBS)" "LDFLAGS=$(LDFLAGS)" \
"DESTDIR=$(DESTDIR)" "PIDDIR=${PIDDIR}" "DESTMAN=${DESTMAN}" \
"DESTBIN=${DESTBIN}" "DESTSBIN=${DESTSBIN}" "DESTEXEC=${DESTEXEC}" \
"DESTLIB=${DESTLIB}" "DESTINC=${DESTINC}" "RANLIB=${RANLIB}" \
"COMPINCL=../${COMPINCL}" "DESTHELP=${DESTHELP}" \
"COMPLIB=../${COMPLIB}" "INSTALL=${INSTALL}" \
"CPPFLAGS=${CPPFLAGS}"
CFLAGS= $(CDEBUG) -I$(INCL) -I$(COMPINCL)
SRCS= host.c dig.c dnsquery.c addr.c
HOST_O= host.o
DIG_O= dig.o nslookup/list.o nslookup/subr.o nslookup/debug.o nslookup/send.o
DNSQUERY_O= dnsquery.o
ADDR_O= addr.o
SUBDIRS = nslookup
BINARIES = host dig dnsquery addr
all: ${SUBDIRS} ${BINARIES}
host: ${HOST_O} ${RES} ${COMPLIB} Makefile
${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${HOST_O} \
${RES} ${COMPLIB} ${LIBS}
dig: ${DIG_O} ${RES} ${COMPLIB} Makefile
${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${DIG_O} \
${RES} ${COMPLIB} ${LIBS}
dnsquery: ${DNSQUERY_O} ${RES} ${COMPLIB} Makefile
${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${DNSQUERY_O} \
${RES} ${COMPLIB} ${LIBS}
addr: ${ADDR_O} ${RES} ${COMPLIB} Makefile
${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${ADDR_O} \
${RES} ${COMPLIB} ${LIBS}
${SUBDIRS}: FRC
cd $@; ${MAKE} ${MARGS}
clean: FRC
@for x in ${SUBDIRS}; do \
(cd $$x; pwd; ${MAKE} ${MARGS} clean); \
done
rm -f ${BINARIES} core .depend
rm -f *.BAK *.CKP *~ *.o *.orig
depend: ${SRCS}
@for x in ${SUBDIRS}; do \
(cd $$x; pwd; ${MAKE} ${MARGS} depend); \
done
mkdep -p ${CPPFLAGS} -I${INCL} -I${COMPINCL} ${SRCS}
install: FRC
@for x in ${SUBDIRS}; do \
(cd $$x; pwd; ${MAKE} ${MARGS} DESTDIR=${DESTDIR} install); \
done
@set -x; for x in ${BINARIES}; do \
${INSTALL} -s -c -m 755 $$x ${DESTDIR}${DESTBIN}/$$x; \
done
lint: ${SRCS}
@(cd nslookup; pwd; ${MAKE} ${MARGS} lint)
lint ${CFLAGS} ${SRCS}
tags: ${SRCS}
cd nslookup; ${MAKE} ${MARGS} tags
ctags ${SRCS}
FRC:
# DO NOT DELETE THIS LINE -- mkdep uses it.
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.

View File

@ -1,173 +0,0 @@
#if !defined(lint) && !defined(SABER)
static char rcsid[] = "$Id: addr.c,v 8.4 1996/05/23 08:21:28 vixie Exp $";
#endif /* not lint */
/* Copyright (c) 1996 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#include <sys/param.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include "../conf/portability.h"
extern char *optarg;
extern int optind;
extern int opterr;
extern int optopt;
static const char *prog = "addr";
#define BIGGEST_ADDRESS IN6ADDRSZ
static void
usage() {
fprintf(stderr,
"usage: %s [-4] [-6] [-n hexstring] [-p address]\n",
prog);
exit(1);
}
/* Warning: this scribbles on `dst' even if it's going to return `0'. */
static int
hexstring(src, dst, len)
const char *src;
u_char *dst;
int len;
{
static const char xdigits[] = "0123456789abcdef";
u_char *ptr = dst, *end = dst + len;
u_int val;
int ch, digits;
val = 0;
digits = 0;
bzero((void*)dst, len);
while ((ch = *src++) != '\0') {
if (ch == '0' && (*src == 'x' || *src == 'X')) {
src++;
continue;
}
if (isascii(ch) && (isspace(ch) || ispunct(ch))) {
if (digits > 0) {
if (ptr == end)
return (0);
*ptr++ = (u_char) (val & 0xff);
val = 0;
digits = 0;
}
digits = 0;
continue;
}
if (!isascii(ch) || !isxdigit(ch))
return (0);
if (isupper(ch))
ch = tolower(ch);
/* Clock it in using little endian arithmetic. */
val <<= 4;
val |= (strchr(xdigits, ch) - xdigits);
if (++digits == 2) {
if (ptr == end)
return (0);
*ptr++ = (u_char) (val & 0xff);
digits = 0;
val = 0;
}
}
if (digits > 0) {
if (ptr == end)
return (0);
*ptr++ = (u_char) (val & 0xff);
}
return ((ptr - dst) == len);
}
static void
display(input, af, addr, len)
const char *input;
int af;
const u_char *addr;
int len;
{
static int before = 0;
char p[sizeof "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255"];
int i;
if (before)
putchar('\n');
else
before++;
printf("Input: \"%s\"\n", input);
printf("Network: [af%d len%d]", af, len);
for (i = 0; i < len; i++)
printf(" %02x", addr[i]);
putchar('\n');
printf("Presentation: \"%s\"\n", inet_ntop(af, addr, p, sizeof p));
}
int
main(argc, argv)
int argc;
char *argv[];
{
u_char addr[BIGGEST_ADDRESS];
int optchr, af, len;
prog = argv[0];
af = AF_INET;
len = INADDRSZ;
while ((optchr = getopt(argc, argv, "46n:p:")) != -1) {
switch (optchr) {
case '4':
af = AF_INET;
len = INADDRSZ;
break;
case '6':
af = AF_INET6;
len = IN6ADDRSZ;
break;
case 'n':
if (!hexstring(optarg, addr, len)) {
fprintf(stderr, "bad hex string: \"%s\"\n",
optarg);
usage();
/* NOTREACHED */
}
display(optarg, af, addr, len);
break;
case 'p':
if (inet_pton(af, optarg, addr) <= 0) {
fprintf(stderr, "bad address: \"%s\"\n",
optarg);
usage();
/* NOTREACHED */
}
display(optarg, af, addr, len);
break;
default:
usage();
/* NOTREACHED */
}
}
exit(0);
/* NOTREACHED */
}

File diff suppressed because it is too large Load Diff

View File

@ -1,189 +0,0 @@
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <netdb.h>
#include <resolv.h>
#include <errno.h>
#include "../conf/portability.h"
extern int errno;
extern int h_errno;
extern char *h_errlist[];
main(argc, argv)
int argc;
char *argv[];
{
char name[MAXDNAME];
u_char answer[8*1024];
register int c, i = 0;
unsigned long ul;
int nameservers = 0, class, type, len;
struct in_addr q_nsaddr[MAXNS];
struct hostent *q_nsname;
extern int optind, opterr;
extern char *optarg;
HEADER *hp;
int stream = 0, debug = 0;
/* set defaults */
len = MAXDNAME;
gethostname(name, len);
class = C_IN;
type = T_ANY;
/* if no args, exit */
if (argc == 1) {
fprintf(stderr, "Usage: %s [-h] host [-n ns] [-t type] [-c class] [-r retry] [-p period] [-s] [-v] [-d] [-a]\n", argv[0]);
exit(-1);
}
/* handle args */
while ((c = getopt(argc, argv, "c:dh:n:p:r:st:u:v")) != EOF) {
switch (c) {
case 'r' : _res.retry = atoi(optarg);
break;
case 'p' : _res.retrans = atoi(optarg);
break;
case 'h' : strcpy(name, optarg);
break;
case 'c' : {
int success, proto_class;
proto_class = sym_ston(__p_class_syms,
optarg, &success);
if (success)
class = proto_class;
else {
fprintf(stderr, "Bad class (%s)\n", optarg);
exit(-1);
}
}
break;
case 't' : {
int success, proto_type;
proto_type = sym_ston(__p_type_syms,
optarg, &success);
if (success)
type = proto_type;
else {
fprintf(stderr, "Bad type (%s)\n", optarg);
exit(-1);
}
}
break;
case 'd' : debug++;
break;
case 's' :
case 'v' : stream++;
break;
case 'n' :
/*
* If we set some nameservers here without
* using gethostbyname() first, then they will
* get overwritten when we do the first query.
* So, we must init the resolver before any
* of this.
*/
if (!(_res.options & RES_INIT))
if (res_init() == -1) {
fprintf(stderr,
"res_init() failed\n");
exit(-1);
}
if (nameservers >= MAXNS) break;
(void) inet_aton(optarg,
&q_nsaddr[nameservers]);
if (!inet_aton(optarg, &ul)) {
q_nsname = gethostbyname(optarg);
if (q_nsname == 0) {
fprintf(stderr,
"Bad nameserver (%s)\n",
optarg);
exit(-1);
}
bcopy((char *) q_nsname->h_addr,
(char *) &q_nsaddr[nameservers],
INADDRSZ);
}
else
q_nsaddr[nameservers].s_addr = ul;
nameservers++;
break;
default : fprintf(stderr,
"\tUsage: %s [-n ns] [-h host] [-t type] [-c class] [-r retry] [-p period] [-s] [-v] [-d] [-a]\n", argv[0]);
exit(-1);
}
}
if (optind < argc)
strcpy(name, argv[optind]);
len = sizeof(answer);
/*
* set these here so they aren't set for a possible call to
* gethostbyname above
*/
if (debug || stream) {
if (!(_res.options & RES_INIT))
if (res_init() == -1) {
fprintf(stderr, "res_init() failed\n");
exit(-1);
}
if (debug)
_res.options |= RES_DEBUG;
if (stream)
_res.options |= RES_USEVC;
}
/* if the -n flag was used, add them to the resolver's list */
if (nameservers != 0) {
_res.nscount = nameservers;
for (i = nameservers - 1; i >= 0; i--) {
_res.nsaddr_list[i].sin_addr.s_addr = q_nsaddr[i].s_addr;
_res.nsaddr_list[i].sin_family = AF_INET;
_res.nsaddr_list[i].sin_port = htons(NAMESERVER_PORT);
}
}
/*
* if the -h arg is fully-qualified, use res_query() since
* using res_search() will lead to use of res_querydomain()
* which will strip the trailing dot
*/
if (name[strlen(name) - 1] == '.') {
if (res_query(name, class, type, answer, len) < 0) {
hp = (HEADER *) answer;
if ((hp->rcode == 0) && (hp->ancount > 0))
__p_query(answer);
else
fprintf(stderr, "Query failed (h_errno = %d) : %s\n",
h_errno, h_errlist[h_errno]);
exit(-1);
}
}
else if (res_search(name, class, type, answer, len) < 0) {
hp = (HEADER *) answer;
if ((hp->rcode == 0) && (hp->ancount > 0))
__p_query(answer);
else
fprintf(stderr, "Query failed (h_errno = %d) : %s\n",
h_errno, h_errlist[h_errno]);
exit(-1);
}
__p_query(answer);
exit(0);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,129 +0,0 @@
#
# @(#)Makefile 5.20 (Berkeley) 10/2/89
# $Id: Makefile,v 8.4 1995/12/22 10:20:42 vixie Exp $
#
## ++Copyright++ 1987
## -
## Copyright (c) 1987
## 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.
## -
## Portions Copyright (c) 1993 by Digital Equipment Corporation.
##
## Permission to use, copy, modify, and distribute this software for any
## purpose with or without fee is hereby granted, provided that the above
## copyright notice and this permission notice appear in all copies, and that
## the name of Digital Equipment Corporation not be used in advertising or
## publicity pertaining to distribution of the document or software without
## specific, written prior permission.
##
## THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
## WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
## OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
## CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
## DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
## -
## --Copyright--
DESTDIR =
DESTBIN = /usr/bin
COMPINCL = ../../compat/include
CC= cc
SHELL= /bin/sh
CDEBUG= -O
INCL = ../../include
RES= ../../res/libresolv.a
COMPLIB= ../../compat/lib/lib44bsd.a
LDFLAGS =
LIBS = -ll
LEX = lex
DESTHELP= /usr/lib
DEFS= -D_PATH_HELPFILE=\"$(DESTHELP)/nslookup.help\"
#(bsd/386, 4.4bsd, other net2 descendents)
#DESTHELP= /usr/share/misc
#COMPINCL= .
#COMPLIB=
#LIBS = -ll -lutil
#LEX = lex -I
#(sgi irix4)
#DESTHELP= /usr/bsd
#DEFS= -xansi -signed -D__STDC__ -D_BSD_SIGNALS \
# -D_PATH_HELPFILE=\"$(DESTHELP)/nslookup.help\"
#COMPLIB=
#(sgi irix5)
#DESTHELP= /usr/share/misc
#DEFS= -xansi -signed -D__BIT_TYPES_DEFINED__ -D_BSD_SIGNALS \
# -D_PATH_HELPFILE=\"$(DESTHELP)/nslookup.help\"
#COMPLIB=
CFLAGS= ${CDEBUG} -I${INCL} -I${COMPINCL} ${DEFS}
CSRCS= main.c getinfo.c debug.c send.c skip.c list.c subr.c
SRCS= ${CSRCS} commands.l
OBJS= main.o getinfo.o debug.o send.o skip.o list.o subr.o commands.o
all: nslookup
nslookup: ${OBJS} ${RES} ${COMPLIB}
${CC} ${CDEBUG} ${LDFLAGS} -o $@ ${OBJS} \
${RES} ${COMPLIB} ${LIBS}
clean:
rm -f ${OBJS} core nslookup commands.c lex.yy.c lex.yy.o
rm -f *.BAK *.CKP *~
cleandir: clean
rm -f tags .depend
depend: ${SRCS}
mkdep ${CPPFLAGS} -I${INCL} -I${COMPINCL} ${DEFS} ${SRCS}
install:
${INSTALL} -s -c -o bin -g bin -m 755 nslookup ${DESTDIR}${DESTBIN}/
${INSTALL} -c -o bin -g bin -m 444 nslookup.help \
${DESTDIR}${DESTHELP}/
lint: ${CSRCS}
lint ${CSRCS}
tags: ${CSRCS}
ctags ${CSRCS}
commands.c: commands.l
$(LEX) -t $< > $@ || rm $@
# DO NOT DELETE THIS LINE -- mkdep uses it.
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.

View File

@ -1,219 +0,0 @@
%{
/*
* ++Copyright++ 1985
* -
* 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#ifndef lint
static char sccsid[] = "@(#)commands.l 5.13 (Berkeley) 7/24/90";
#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[];
extern void PrintHelp();
%}
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}*$ {
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 { ; }
%%

View File

@ -1,646 +0,0 @@
/*
* ++Copyright++ 1985, 1989
* -
* Copyright (c) 1985, 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#ifndef lint
static char sccsid[] = "@(#)debug.c 5.26 (Berkeley) 3/21/91";
static char rcsid[] = "$Id: debug.c,v 8.10 1996/12/18 04:09:50 vixie 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 <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 "res.h"
#include "../../conf/portability.h"
/*
* 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)
u_char *msg, *eom;
int printHeader;
FILE *file;
{
register u_char *cp;
register HEADER *hp;
register int n;
short class;
short type;
/*
* Print header fields.
*/
hp = (HEADER *)msg;
cp = msg + HFIXEDSZ;
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->unused)
fprintf(file,", UNUSED-QUERY_BIT");
if (hp->ad)
fprintf(file,", authentic data");
if (hp->cd)
fprintf(file,", checking disabled");
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((u_char*)cp);
cp += INT16SZ;
class = _getshort((u_char*)cp);
cp += INT16SZ;
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");
if (type == T_A && n > MAXADDRS) {
printf("Limiting response to MAX Addrs = %d \n",
MAXADDRS);
n = MAXADDRS;
}
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");
}
u_char *
Print_cdname_sub(cp, msg, eom, file, format)
u_char *cp, *msg, *eom;
FILE *file;
int format;
{
int n;
char name[MAXDNAME];
n = dn_expand(msg, eom, cp, name, sizeof name);
if (n < 0)
return (NULL);
if (name[0] == '\0') {
(void) strcpy(name, "(root)");
}
if (format) {
fprintf(file, "%-30s", name);
} else {
fputs(name, file);
}
return (cp + n);
}
u_char *
Print_cdname(cp, msg, eom, file)
u_char *cp, *msg, *eom;
FILE *file;
{
return (Print_cdname_sub(cp, msg, eom, file, 0));
}
u_char *
Print_cdname2(cp, msg, eom, file)
u_char *cp, *msg, *eom;
FILE *file;
{
return (Print_cdname_sub(cp, msg, eom, file, 1));
}
/*
* Print resource record fields in human readable form.
*/
u_char *
Print_rr(ocp, msg, eom, file)
u_char *ocp, *msg, *eom;
FILE *file;
{
int type, class, dlen, n, c;
u_int32_t rrttl, ttl;
struct in_addr inaddr;
u_char *cp, *cp1, *cp2;
int debug;
if ((cp = Print_cdname(ocp, msg, eom, file)) == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
type = _getshort((u_char*)cp);
cp += INT16SZ;
class = _getshort((u_char*)cp);
cp += INT16SZ;
rrttl = _getlong((u_char*)cp);
cp += INT32SZ;
dlen = _getshort((u_char*)cp);
cp += INT16SZ;
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, INADDRSZ);
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((u_char*)cp));
cp += INT16SZ;
fprintf(file,", mail exchanger = ");
goto doname;
case T_NAPTR:
fprintf(file, "\torder = %u",_getshort((u_char*)cp));
cp += INT16SZ;
fprintf(file,", preference = %u\n", _getshort((u_char*)cp));
cp += INT16SZ;
/* Flags */
n = *cp++;
fprintf(file,"\tflags = \"%.*s\"\n", (int)n, cp);
cp += n;
/* Service */
n = *cp++;
fprintf(file,"\tservices = \"%.*s\"\n", (int)n, cp);
cp += n;
/* Regexp */
n = *cp++;
fprintf(file,"\trule = \"%.*s\"\n", (int)n, cp);
cp += n;
/* Replacement */
fprintf(file,"\treplacement = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(replacement truncated?)\n");
return (NULL); /* compression error */
}
(void) putc('\n', file);
break;
case T_SRV:
fprintf(file, "\tpriority = %u",_getshort((u_char*)cp));
cp += INT16SZ;
fprintf(file,", weight = %u", _getshort((u_char*)cp));
cp += INT16SZ;
fprintf(file,", port= %u\n", _getshort((u_char*)cp));
cp += INT16SZ;
fprintf(file,"\thost = ");
goto doname;
case T_PX:
fprintf(file,"\tpreference = %u",_getshort((u_char*)cp));
cp += INT16SZ;
fprintf(file,", RFC 822 = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
fprintf(file,"\nX.400 = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
(void) putc('\n', file);
break;
case T_RT:
fprintf(file,"\tpreference = %u",_getshort((u_char*)cp));
cp += INT16SZ;
fprintf(file,", router = ");
goto doname;
case T_AFSDB:
fprintf(file,"\tsubtype = %d",_getshort((u_char*)cp));
cp += INT16SZ;
fprintf(file,", DCE/AFS server = ");
goto doname;
case T_NS:
fprintf(file,"\tnameserver = ");
goto doname;
case T_PTR:
fprintf(file,"\tname = ");
doname:
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
(void) putc('\n', file);
break;
case T_HINFO:
cp2 = cp + dlen;
if (n = *cp++) {
fprintf(file,"\tCPU = %.*s", n, cp);
cp += n;
}
if ((cp < cp2) && (n = *cp++)) {
fprintf(file,"\tOS = %.*s\n", n, cp);
cp += n;
} else fprintf(file, "\n*** Warning *** OS-type missing\n");
break;
case T_ISDN:
cp2 = cp + dlen;
if (n = *cp++) {
fprintf(file,"\tISDN = \"%.*s", n, cp);
cp += n;
}
if ((cp < cp2) && (n = *cp++)) {
fprintf(file,"-%.*s\"\n", n, cp);
cp += n;
} else fprintf(file,"\"\n");
break;
case T_SOA:
if (!debug)
(void) putc('\n', file);
fprintf(file,"\torigin = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
fprintf(file,"\n\tmail addr = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
fprintf(file,"\n\tserial = %lu", _getlong((u_char*)cp));
cp += INT32SZ;
ttl = _getlong((u_char*)cp);
fprintf(file,"\n\trefresh = %lu (%s)", ttl, p_time(ttl));
cp += INT32SZ;
ttl = _getlong((u_char*)cp);
fprintf(file,"\n\tretry = %lu (%s)", ttl, p_time(ttl));
cp += INT32SZ;
ttl = _getlong((u_char*)cp);
fprintf(file,"\n\texpire = %lu (%s)", ttl, p_time(ttl));
cp += INT32SZ;
ttl = _getlong((u_char*)cp);
fprintf(file,
"\n\tminimum ttl = %lu (%s)\n", ttl, p_time(ttl));
cp += INT32SZ;
break;
case T_MINFO:
if (!debug)
(void) putc('\n', file);
fprintf(file,"\trequests = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
fprintf(file,"\n\terrors = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
(void) putc('\n', file);
break;
case T_RP:
if (!debug)
(void) putc('\n', file);
fprintf(file,"\tmailbox = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
fprintf(file,"\n\ttext = ");
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL) {
fprintf(file, "(name truncated?)\n");
return (NULL); /* compression error */
}
(void) putc('\n', file);
break;
case T_TXT:
(void) fputs("\ttext = ", file);
cp2 = cp1 + dlen;
while (cp < cp2) {
(void) putc('"', file);
if (n = (unsigned char) *cp++) {
for (c = n; c > 0 && cp < cp2; c--) {
if ((*cp == '\n') || (*cp == '"') || (*cp == '\\'))
(void) putc('\\', file);
(void) putc(*cp++, file);
}
}
(void) putc('"', file);
if (cp < cp2)
(void) putc(' ', file);
}
(void) putc('\n', file);
break;
case T_X25:
(void) fputs("\tX25 = \"", 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_NSAP:
fprintf(file, "\tnsap = %s\n", inet_nsap_ntoa(dlen, cp, NULL));
cp += dlen;
break;
case T_AAAA: {
char t[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
fprintf(file, "\tIPv6 address = %s\n",
inet_ntop(AF_INET6, cp, t, sizeof t));
cp += IN6ADDRSZ;
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 = %u\n",type == T_UID ? 'u' : 'g',
_getlong((u_char*)cp));
cp += INT32SZ;
} 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 < INT32SZ + 1)
break;
if (!debug)
(void) putc('\n', file);
bcopy(cp, (char *)&inaddr, INADDRSZ);
cp += INT32SZ;
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,"\trecord type %d, interpreted as:\n", type);
/* Let resolver library try to print it */
p_rr(ocp, msg, file);
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);
}

View File

@ -1,844 +0,0 @@
/*
* ++Copyright++ 1985, 1989
* -
* Copyright (c) 1985, 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.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#ifndef lint
static char sccsid[] = "@(#)getinfo.c 5.26 (Berkeley) 3/21/91";
static char rcsid[] = "$Id: getinfo.c,v 8.6 1996/12/02 09:17:24 vixie 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 <ctype.h>
#include "res.h"
#include "../../conf/portability.h"
extern char *_res_resultcodes[];
extern char *res_skip();
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;
u_char qb2[PACKETSZ*2];
} querybuf;
typedef union {
int32_t al;
char ac;
} align;
#define GetShort(cp) _getshort(cp); cp += INT16SZ;
/*
******************************************************************************
*
* 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 + HFIXEDSZ;
/* 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) {
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
if (n < 0) {
return(ERROR);
}
cp += n;
type = GetShort(cp);
class = GetShort(cp);
cp += INT32SZ; /* 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.
*/
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
if (n < 0) {
cp += n;
continue;
}
cp += n;
len = strlen((char *)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((char *)bp) + 1;
hostPtr->name = Calloc(1, len);
bcopy(bp, hostPtr->name, len);
}
bp += (((u_int32_t)bp) % sizeof(align));
if (bp + dlen >= &hostbuf[sizeof(hostbuf)]) {
if (_res.options & RES_DEBUG) {
printf("Size (%d) too big\n", dlen);
}
break;
}
if (numAddresses >= MAXADDRS) {
printf("MAXADDRS exceeded: skipping address\n");
cp += dlen;
continue;
}
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.
*/
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
if (n < 0) {
return(ERROR);
}
cp += n;
len = strlen((char *)bp) + 1;
dnamePtr = Calloc(1, len); /* domain name */
bcopy(bp, dnamePtr, len);
type = GetShort(cp);
class = GetShort(cp);
cp += INT32SZ; /* skip TTL */
dlen = GetShort(cp);
if (type != T_NS) {
cp += dlen;
} else {
Boolean found;
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
if (n < 0) {
return(ERROR);
}
cp += n;
len = strlen((char *)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) {
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
if (n < 0) {
break;
}
cp += n;
type = GetShort(cp);
class = GetShort(cp);
cp += INT32SZ; /* skip TTL */
dlen = GetShort(cp);
if (type != T_A) {
cp += dlen;
continue;
} else {
for (j = 0; j < numServers; j++) {
if (strcmp((char *)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 **domain;
const char *cp;
Boolean got_nodata = FALSE;
struct in_addr ina;
Boolean tried_as_is = FALSE;
/* 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 = INADDRSZ;
hostPtr->addrList = (char **)Calloc(2, sizeof(char *));
hostPtr->addrList[0] = Calloc(INT32SZ, sizeof(char));
bcopy((char *)&ina, hostPtr->addrList[0], INADDRSZ);
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));
}
/*
* If there are dots in the name already, let's just give it a try
* 'as is'. The threshold can be set with the "ndots" option.
*/
if (n >= (int)_res.ndots) {
result = GetHostDomain(nsAddrPtr, queryClass, queryType,
name, (char *)NULL, hostPtr, isServer);
if (result == SUCCESS)
return (result);
if (result == NO_INFO)
got_nodata++;
tried_as_is++;
}
/*
* 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 we have not already tried the name "as is", do that now.
* note that we do this regardless of how many dots were in the
* name or whether it ends with a dot.
*/
if (!tried_as_is &&
(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,
NULL, 0, 0, buf.qb2, 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 a PTR lookup in in-addr.arpa 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,
buf.qb2, 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(INT32SZ, sizeof(char));
bcopy((char *)p, hostPtr->addrList[0], INADDRSZ);
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;
}
}

Some files were not shown because too many files have changed in this diff Show More