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:
parent
ccee498fca
commit
2cc7b06671
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=35633
@ -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--
|
@ -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
|
@ -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.
|
||||
-
|
@ -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.
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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.
|
@ -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.
|
@ -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
|
@ -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
|
@ -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*/
|
@ -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.
|
@ -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}
|
@ -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@)
|
@ -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
|
@ -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.
|
@ -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.
|
@ -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.
|
@ -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@)
|
@ -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.
|
@ -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
|
@ -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
|
@ -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@)
|
@ -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@)
|
@ -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@)
|
@ -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
|
@ -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
|
@ -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
|
@ -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.
|
@ -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>
|
@ -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 */
|
@ -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
@ -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-- */
|
@ -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 */
|
@ -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
@ -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);
|
||||
}
|
@ -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
|
@ -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);
|
||||
}
|
@ -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*/
|
@ -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
@ -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"
|
@ -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
|
@ -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
|
@ -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
|
@ -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
@ -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-- */
|
@ -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
@ -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
@ -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
|
@ -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*/
|
@ -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
@ -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*/
|
@ -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*/
|
@ -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
|
||||
}
|
@ -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 */
|
@ -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.
|
@ -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.
|
@ -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
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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));
|
||||
}
|
@ -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");
|
||||
}
|
@ -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
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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. -- */
|
@ -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
@ -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()));
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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 */
|
@ -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();
|
||||
}
|
@ -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.
|
@ -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
@ -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
@ -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.
|
@ -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 { ; }
|
||||
%%
|
@ -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);
|
||||
}
|
@ -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
Loading…
Reference in New Issue
Block a user