From ff5e90afcb4b8abff11b6ea0858d1ebfb8be7a74 Mon Sep 17 00:00:00 2001 From: cvs2svn Date: Sun, 3 May 1998 04:11:50 +0000 Subject: This commit was manufactured by cvs2svn to create tag 'bind-vendor-bind_8_1_2_t3b'. --- contrib/bind/OPTIONS | 412 ---- contrib/bind/conf/bsdinstall.sh | 251 --- contrib/bind/conf/copyright | 50 - contrib/bind/conf/master/README | 45 - contrib/bind/conf/master/named.boot | 18 - contrib/bind/conf/master/named.boot.master | 16 - contrib/bind/conf/master/named.hosts | 22 - contrib/bind/conf/master/named.local | 13 - contrib/bind/conf/master/named.rev | 30 - contrib/bind/conf/master/root.cache | 63 - contrib/bind/conf/options.h | 158 -- contrib/bind/conf/portability.h | 650 ------ contrib/bind/doc/misc/IPv6 | 72 - contrib/bind/man/Makefile | 451 ---- contrib/bind/man/dig.1 | 364 ---- contrib/bind/man/dnsquery.1 | 164 -- contrib/bind/man/gethostbyname.3 | 228 -- contrib/bind/man/getnetent.3 | 133 -- contrib/bind/man/host.1 | 207 -- contrib/bind/man/hostname.7 | 108 - contrib/bind/man/mailaddr.7 | 135 -- contrib/bind/man/named-xfer.8 | 146 -- contrib/bind/man/named.8 | 441 ---- contrib/bind/man/named.reload.8 | 69 - contrib/bind/man/named.restart.8 | 73 - contrib/bind/man/ndc.8 | 127 -- contrib/bind/man/nslookup.8 | 387 ---- contrib/bind/man/resolver.3 | 339 --- contrib/bind/man/resolver.5 | 133 -- contrib/bind/named/Makefile | 197 -- contrib/bind/named/Makefile.reno | 83 - contrib/bind/named/Version.c | 89 - contrib/bind/named/db_defs.h | 183 -- contrib/bind/named/db_dump.c | 1025 --------- contrib/bind/named/db_func.h | 104 - contrib/bind/named/db_glob.h | 93 - contrib/bind/named/db_glue.c | 909 -------- contrib/bind/named/db_load.c | 2296 -------------------- contrib/bind/named/db_lookup.c | 250 --- contrib/bind/named/db_reload.c | 126 -- contrib/bind/named/db_save.c | 195 -- contrib/bind/named/db_secure.c | 153 -- contrib/bind/named/db_update.c | 815 ------- contrib/bind/named/dmalloc.c | 315 --- contrib/bind/named/dmalloc.h | 68 - contrib/bind/named/named-xfer.c | 2026 ----------------- contrib/bind/named/named.h | 19 - contrib/bind/named/named.reload.sh | 7 - contrib/bind/named/named.restart.sh | 7 - contrib/bind/named/ndc.sh | 83 - contrib/bind/named/ns_defs.h | 393 ---- contrib/bind/named/ns_forw.c | 1096 ---------- contrib/bind/named/ns_func.h | 170 -- contrib/bind/named/ns_glob.h | 285 --- contrib/bind/named/ns_init.c | 1137 ---------- contrib/bind/named/ns_main.c | 1696 --------------- contrib/bind/named/ns_maint.c | 1087 ---------- contrib/bind/named/ns_ncache.c | 183 -- contrib/bind/named/ns_req.c | 2094 ------------------ contrib/bind/named/ns_resp.c | 3236 ---------------------------- contrib/bind/named/ns_sort.c | 171 -- contrib/bind/named/ns_stats.c | 394 ---- contrib/bind/named/ns_udp.c | 113 - contrib/bind/named/ns_validate.c | 1234 ----------- contrib/bind/named/pathnames.h | 122 -- contrib/bind/named/storage.c | 205 -- contrib/bind/named/tree.c | 570 ----- contrib/bind/named/tree.h | 48 - contrib/bind/named/tree.man3 | 154 -- contrib/bind/res/Makefile | 114 - contrib/bind/res/base64.c | 321 --- contrib/bind/res/gethnamaddr.c | 1008 --------- contrib/bind/res/getnetbyaddr.c | 57 - contrib/bind/res/getnetbyname.c | 64 - contrib/bind/res/getnetent.c | 163 -- contrib/bind/res/getnetnamadr.c | 288 --- contrib/bind/res/herror.c | 119 - contrib/bind/res/hostnamelen.c | 94 - contrib/bind/res/inet_addr.c | 184 -- contrib/bind/res/inet_net_ntop.c | 139 -- contrib/bind/res/inet_net_pton.c | 207 -- contrib/bind/res/inet_neta.c | 82 - contrib/bind/res/inet_ntop.c | 195 -- contrib/bind/res/inet_pton.c | 215 -- contrib/bind/res/nsap_addr.c | 114 - contrib/bind/res/res_comp.c | 937 -------- contrib/bind/res/res_data.c | 115 - contrib/bind/res/res_debug.c | 1538 ------------- contrib/bind/res/res_init.c | 655 ------ contrib/bind/res/res_mkquery.c | 190 -- contrib/bind/res/res_query.c | 403 ---- contrib/bind/res/res_send.c | 845 -------- contrib/bind/res/sethostent.c | 61 - contrib/bind/tools/Makefile | 163 -- contrib/bind/tools/addr.c | 173 -- contrib/bind/tools/dig.c | 1236 ----------- contrib/bind/tools/dnsquery.c | 189 -- contrib/bind/tools/host.c | 1451 ------------- contrib/bind/tools/nslookup/Makefile | 129 -- contrib/bind/tools/nslookup/commands.l | 219 -- contrib/bind/tools/nslookup/debug.c | 646 ------ contrib/bind/tools/nslookup/getinfo.c | 844 -------- contrib/bind/tools/nslookup/list.c | 1037 --------- contrib/bind/tools/nslookup/main.c | 1121 ---------- contrib/bind/tools/nslookup/nslookup.help | 34 - contrib/bind/tools/nslookup/pathnames.h | 71 - contrib/bind/tools/nslookup/res.h | 177 -- contrib/bind/tools/nslookup/send.c | 411 ---- contrib/bind/tools/nslookup/skip.c | 211 -- contrib/bind/tools/nslookup/subr.c | 471 ---- 110 files changed, 45427 deletions(-) delete mode 100644 contrib/bind/OPTIONS delete mode 100755 contrib/bind/conf/bsdinstall.sh delete mode 100644 contrib/bind/conf/copyright delete mode 100644 contrib/bind/conf/master/README delete mode 100644 contrib/bind/conf/master/named.boot delete mode 100644 contrib/bind/conf/master/named.boot.master delete mode 100644 contrib/bind/conf/master/named.hosts delete mode 100644 contrib/bind/conf/master/named.local delete mode 100644 contrib/bind/conf/master/named.rev delete mode 100644 contrib/bind/conf/master/root.cache delete mode 100644 contrib/bind/conf/options.h delete mode 100644 contrib/bind/conf/portability.h delete mode 100644 contrib/bind/doc/misc/IPv6 delete mode 100644 contrib/bind/man/Makefile delete mode 100644 contrib/bind/man/dig.1 delete mode 100644 contrib/bind/man/dnsquery.1 delete mode 100644 contrib/bind/man/gethostbyname.3 delete mode 100644 contrib/bind/man/getnetent.3 delete mode 100644 contrib/bind/man/host.1 delete mode 100644 contrib/bind/man/hostname.7 delete mode 100644 contrib/bind/man/mailaddr.7 delete mode 100644 contrib/bind/man/named-xfer.8 delete mode 100644 contrib/bind/man/named.8 delete mode 100644 contrib/bind/man/named.reload.8 delete mode 100644 contrib/bind/man/named.restart.8 delete mode 100644 contrib/bind/man/ndc.8 delete mode 100644 contrib/bind/man/nslookup.8 delete mode 100644 contrib/bind/man/resolver.3 delete mode 100644 contrib/bind/man/resolver.5 delete mode 100644 contrib/bind/named/Makefile delete mode 100644 contrib/bind/named/Makefile.reno delete mode 100644 contrib/bind/named/Version.c delete mode 100644 contrib/bind/named/db_defs.h delete mode 100644 contrib/bind/named/db_dump.c delete mode 100644 contrib/bind/named/db_func.h delete mode 100644 contrib/bind/named/db_glob.h delete mode 100644 contrib/bind/named/db_glue.c delete mode 100644 contrib/bind/named/db_load.c delete mode 100644 contrib/bind/named/db_lookup.c delete mode 100644 contrib/bind/named/db_reload.c delete mode 100644 contrib/bind/named/db_save.c delete mode 100644 contrib/bind/named/db_secure.c delete mode 100644 contrib/bind/named/db_update.c delete mode 100644 contrib/bind/named/dmalloc.c delete mode 100644 contrib/bind/named/dmalloc.h delete mode 100644 contrib/bind/named/named-xfer.c delete mode 100644 contrib/bind/named/named.h delete mode 100644 contrib/bind/named/named.reload.sh delete mode 100644 contrib/bind/named/named.restart.sh delete mode 100644 contrib/bind/named/ndc.sh delete mode 100644 contrib/bind/named/ns_defs.h delete mode 100644 contrib/bind/named/ns_forw.c delete mode 100644 contrib/bind/named/ns_func.h delete mode 100644 contrib/bind/named/ns_glob.h delete mode 100644 contrib/bind/named/ns_init.c delete mode 100644 contrib/bind/named/ns_main.c delete mode 100644 contrib/bind/named/ns_maint.c delete mode 100644 contrib/bind/named/ns_ncache.c delete mode 100644 contrib/bind/named/ns_req.c delete mode 100644 contrib/bind/named/ns_resp.c delete mode 100644 contrib/bind/named/ns_sort.c delete mode 100644 contrib/bind/named/ns_stats.c delete mode 100644 contrib/bind/named/ns_udp.c delete mode 100644 contrib/bind/named/ns_validate.c delete mode 100644 contrib/bind/named/pathnames.h delete mode 100644 contrib/bind/named/storage.c delete mode 100644 contrib/bind/named/tree.c delete mode 100644 contrib/bind/named/tree.h delete mode 100644 contrib/bind/named/tree.man3 delete mode 100644 contrib/bind/res/Makefile delete mode 100644 contrib/bind/res/base64.c delete mode 100644 contrib/bind/res/gethnamaddr.c delete mode 100644 contrib/bind/res/getnetbyaddr.c delete mode 100644 contrib/bind/res/getnetbyname.c delete mode 100644 contrib/bind/res/getnetent.c delete mode 100644 contrib/bind/res/getnetnamadr.c delete mode 100644 contrib/bind/res/herror.c delete mode 100644 contrib/bind/res/hostnamelen.c delete mode 100644 contrib/bind/res/inet_addr.c delete mode 100644 contrib/bind/res/inet_net_ntop.c delete mode 100644 contrib/bind/res/inet_net_pton.c delete mode 100644 contrib/bind/res/inet_neta.c delete mode 100644 contrib/bind/res/inet_ntop.c delete mode 100644 contrib/bind/res/inet_pton.c delete mode 100644 contrib/bind/res/nsap_addr.c delete mode 100644 contrib/bind/res/res_comp.c delete mode 100644 contrib/bind/res/res_data.c delete mode 100644 contrib/bind/res/res_debug.c delete mode 100644 contrib/bind/res/res_init.c delete mode 100644 contrib/bind/res/res_mkquery.c delete mode 100644 contrib/bind/res/res_query.c delete mode 100644 contrib/bind/res/res_send.c delete mode 100644 contrib/bind/res/sethostent.c delete mode 100644 contrib/bind/tools/Makefile delete mode 100644 contrib/bind/tools/addr.c delete mode 100644 contrib/bind/tools/dig.c delete mode 100644 contrib/bind/tools/dnsquery.c delete mode 100644 contrib/bind/tools/host.c delete mode 100644 contrib/bind/tools/nslookup/Makefile delete mode 100644 contrib/bind/tools/nslookup/commands.l delete mode 100644 contrib/bind/tools/nslookup/debug.c delete mode 100644 contrib/bind/tools/nslookup/getinfo.c delete mode 100644 contrib/bind/tools/nslookup/list.c delete mode 100644 contrib/bind/tools/nslookup/main.c delete mode 100644 contrib/bind/tools/nslookup/nslookup.help delete mode 100644 contrib/bind/tools/nslookup/pathnames.h delete mode 100644 contrib/bind/tools/nslookup/res.h delete mode 100644 contrib/bind/tools/nslookup/send.c delete mode 100644 contrib/bind/tools/nslookup/skip.c delete mode 100644 contrib/bind/tools/nslookup/subr.c diff --git a/contrib/bind/OPTIONS b/contrib/bind/OPTIONS deleted file mode 100644 index 8255244a02bb..000000000000 --- a/contrib/bind/OPTIONS +++ /dev/null @@ -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-- diff --git a/contrib/bind/conf/bsdinstall.sh b/contrib/bind/conf/bsdinstall.sh deleted file mode 100755 index 58f87ded2604..000000000000 --- a/contrib/bind/conf/bsdinstall.sh +++ /dev/null @@ -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 diff --git a/contrib/bind/conf/copyright b/contrib/bind/conf/copyright deleted file mode 100644 index a441ff88eb8c..000000000000 --- a/contrib/bind/conf/copyright +++ /dev/null @@ -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. -- diff --git a/contrib/bind/conf/master/README b/contrib/bind/conf/master/README deleted file mode 100644 index 4e49af65a819..000000000000 --- a/contrib/bind/conf/master/README +++ /dev/null @@ -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. diff --git a/contrib/bind/conf/master/named.boot b/contrib/bind/conf/master/named.boot deleted file mode 100644 index 7d467f28732d..000000000000 --- a/contrib/bind/conf/master/named.boot +++ /dev/null @@ -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 - diff --git a/contrib/bind/conf/master/named.boot.master b/contrib/bind/conf/master/named.boot.master deleted file mode 100644 index 702ffcfef2da..000000000000 --- a/contrib/bind/conf/master/named.boot.master +++ /dev/null @@ -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 - diff --git a/contrib/bind/conf/master/named.hosts b/contrib/bind/conf/master/named.hosts deleted file mode 100644 index d31b3bdca294..000000000000 --- a/contrib/bind/conf/master/named.hosts +++ /dev/null @@ -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 diff --git a/contrib/bind/conf/master/named.local b/contrib/bind/conf/master/named.local deleted file mode 100644 index e0270eaf70c9..000000000000 --- a/contrib/bind/conf/master/named.local +++ /dev/null @@ -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. diff --git a/contrib/bind/conf/master/named.rev b/contrib/bind/conf/master/named.rev deleted file mode 100644 index 6d1fb5836cc4..000000000000 --- a/contrib/bind/conf/master/named.rev +++ /dev/null @@ -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. diff --git a/contrib/bind/conf/master/root.cache b/contrib/bind/conf/master/root.cache deleted file mode 100644 index 48abd78583b6..000000000000 --- a/contrib/bind/conf/master/root.cache +++ /dev/null @@ -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 . " -; 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 diff --git a/contrib/bind/conf/options.h b/contrib/bind/conf/options.h deleted file mode 100644 index bea7eb924d94..000000000000 --- a/contrib/bind/conf/options.h +++ /dev/null @@ -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 diff --git a/contrib/bind/conf/portability.h b/contrib/bind/conf/portability.h deleted file mode 100644 index 6485ee3bd3f4..000000000000 --- a/contrib/bind/conf/portability.h +++ /dev/null @@ -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 -#include -#include -#include -#ifndef TIME_H_INCLUDED -# include -# 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 -# include -# include -# include -#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 -# include -# include -# 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 -# 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 -# 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 -# include - -#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 -#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 - * 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*/ diff --git a/contrib/bind/doc/misc/IPv6 b/contrib/bind/doc/misc/IPv6 deleted file mode 100644 index 49fc3f5ec37c..000000000000 --- a/contrib/bind/doc/misc/IPv6 +++ /dev/null @@ -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. diff --git a/contrib/bind/man/Makefile b/contrib/bind/man/Makefile deleted file mode 100644 index 26c6af5f12a2..000000000000 --- a/contrib/bind/man/Makefile +++ /dev/null @@ -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} diff --git a/contrib/bind/man/dig.1 b/contrib/bind/man/dig.1 deleted file mode 100644 index a02b2a1b3968..000000000000 --- a/contrib/bind/man/dig.1 +++ /dev/null @@ -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 [ "" ] -.RI [ "" ] -.RI [ "+" ] -.RI [ "\-" ] -.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 "\-" -"\-" 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 "+" -"+" 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@) diff --git a/contrib/bind/man/dnsquery.1 b/contrib/bind/man/dnsquery.1 deleted file mode 100644 index 510053ab3438..000000000000 --- a/contrib/bind/man/dnsquery.1 +++ /dev/null @@ -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 - list of usable RR types and classes -.br - 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 diff --git a/contrib/bind/man/gethostbyname.3 b/contrib/bind/man/gethostbyname.3 deleted file mode 100644 index 034904b6dd5a..000000000000 --- a/contrib/bind/man/gethostbyname.3 +++ /dev/null @@ -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 -.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. diff --git a/contrib/bind/man/getnetent.3 b/contrib/bind/man/getnetent.3 deleted file mode 100644 index 22b394e1e786..000000000000 --- a/contrib/bind/man/getnetent.3 +++ /dev/null @@ -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 -.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. diff --git a/contrib/bind/man/host.1 b/contrib/bind/man/host.1 deleted file mode 100644 index 9ade617c096b..000000000000 --- a/contrib/bind/man/host.1 +++ /dev/null @@ -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. diff --git a/contrib/bind/man/hostname.7 b/contrib/bind/man/hostname.7 deleted file mode 100644 index 255c53cfe44d..000000000000 --- a/contrib/bind/man/hostname.7 +++ /dev/null @@ -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@) diff --git a/contrib/bind/man/mailaddr.7 b/contrib/bind/man/mailaddr.7 deleted file mode 100644 index 9a69a4ddbe7c..000000000000 --- a/contrib/bind/man/mailaddr.7 +++ /dev/null @@ -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. diff --git a/contrib/bind/man/named-xfer.8 b/contrib/bind/man/named-xfer.8 deleted file mode 100644 index 54ae2be1a5e1..000000000000 --- a/contrib/bind/man/named-xfer.8 +++ /dev/null @@ -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 diff --git a/contrib/bind/man/named.8 b/contrib/bind/man/named.8 deleted file mode 100644 index d65770c639f7..000000000000 --- a/contrib/bind/man/named.8 +++ /dev/null @@ -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 -$ORIGIN - - -.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 diff --git a/contrib/bind/man/named.reload.8 b/contrib/bind/man/named.reload.8 deleted file mode 100644 index b838ea04b339..000000000000 --- a/contrib/bind/man/named.reload.8 +++ /dev/null @@ -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@) diff --git a/contrib/bind/man/named.restart.8 b/contrib/bind/man/named.restart.8 deleted file mode 100644 index 034bebdaec6a..000000000000 --- a/contrib/bind/man/named.restart.8 +++ /dev/null @@ -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@) diff --git a/contrib/bind/man/ndc.8 b/contrib/bind/man/ndc.8 deleted file mode 100644 index 6d9ecfa5ca29..000000000000 --- a/contrib/bind/man/ndc.8 +++ /dev/null @@ -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@) diff --git a/contrib/bind/man/nslookup.8 b/contrib/bind/man/nslookup.8 deleted file mode 100644 index de0306aa0972..000000000000 --- a/contrib/bind/man/nslookup.8 +++ /dev/null @@ -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 diff --git a/contrib/bind/man/resolver.3 b/contrib/bind/man/resolver.3 deleted file mode 100644 index 2d71c14b5cd6..000000000000 --- a/contrib/bind/man/resolver.3 +++ /dev/null @@ -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 -.br -.B #include -.br -.B #include -.br -.B #include -.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 . -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 : -.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 diff --git a/contrib/bind/man/resolver.5 b/contrib/bind/man/resolver.5 deleted file mode 100644 index 41fcf3cd9f11..000000000000 --- a/contrib/bind/man/resolver.5 +++ /dev/null @@ -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 diff --git a/contrib/bind/named/Makefile b/contrib/bind/named/Makefile deleted file mode 100644 index 777cbb947994..000000000000 --- a/contrib/bind/named/Makefile +++ /dev/null @@ -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. diff --git a/contrib/bind/named/Makefile.reno b/contrib/bind/named/Makefile.reno deleted file mode 100644 index 2bddd9e10917..000000000000 --- a/contrib/bind/named/Makefile.reno +++ /dev/null @@ -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 diff --git a/contrib/bind/named/Version.c b/contrib/bind/named/Version.c deleted file mode 100644 index e89670b58313..000000000000 --- a/contrib/bind/named/Version.c +++ /dev/null @@ -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 */ diff --git a/contrib/bind/named/db_defs.h b/contrib/bind/named/db_defs.h deleted file mode 100644 index 83fc2da745cc..000000000000 --- a/contrib/bind/named/db_defs.h +++ /dev/null @@ -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 */ diff --git a/contrib/bind/named/db_dump.c b/contrib/bind/named/db_dump.c deleted file mode 100644 index 09e96d32d088..000000000000 --- a/contrib/bind/named/db_dump.c +++ /dev/null @@ -1,1025 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)db_dump.c 4.33 (Berkeley) 3/3/91"; -static char rcsid[] = "$Id: db_dump.c,v 8.19 1996/10/08 04:51:03 vixie Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1988, 1990 - * - - * Copyright (c) 1986, 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. - * - - * 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. - * --Copyright-- - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "named.h" - -static int scan_root __P((struct hashbuf *)); -static const char *MkCredStr __P((int)); - -#ifdef ALLOW_T_UNSPEC -static void putbyte __P((int, char **)); -#endif - -/* - * Dump current cache in a format similar to RFC 883. - * - * We try to be careful and determine whether the operation succeeded - * so that the new cache file can be installed. - */ - -void -doachkpt() -{ - FILE *fp; - char tmpcheckfile[256]; - - /* nowhere to checkpoint cache... */ - if (cache_file == NULL) { - dprintf(3, (ddt, "skipping doachkpt (cache_file == NULL)\n")); - return; - } - - dprintf(3, (ddt, "doachkpt()\n")); - - (void) sprintf(tmpcheckfile, "%s.chk", cache_file); - if ((fp = fopen(tmpcheckfile, "w")) == NULL) { - dprintf(3, (ddt, - "doachkpt(can't open %s for write)\n", tmpcheckfile)); - return; - } - - (void) gettime(&tt); - fprintf(fp, "; Dumped at %s", ctimel(tt.tv_sec)); - fflush(fp); - if (ferror(fp)) { - dprintf(3, (ddt, "doachkpt(write to checkpoint file failed)\n")); - return; - } - - if (fcachetab != NULL) { - int n = scan_root(hashtab); - - if (n < MINROOTS) { - syslog(LOG_NOTICE, "%d root hints... (too low)", n); - fprintf(fp, "; ---- Root hint cache dump ----\n"); - (void) db_dump(fcachetab, fp, DB_Z_CACHE, ""); - } - } - - if (hashtab != NULL) { - fprintf(fp, "; ---- Cache dump ----\n"); - if (db_dump(hashtab, fp, DB_Z_CACHE, "") == NODBFILE) { - dprintf(3, (ddt, "doachkpt(checkpoint failed)\n")); - (void) my_fclose(fp); - return; - } - } - - if (my_fclose(fp) == EOF) { - return; - } - - if (rename(tmpcheckfile, cache_file)) { - dprintf(3, (ddt, "doachkpt(install %s to %s failed, %d)\n", - tmpcheckfile, cache_file, errno)); - } -} - -/* - * What we do is scan the root hint cache to make sure there are at least - * MINROOTS root pointers with non-0 TTL's so that the checkpoint will not - * lose the root. Failing this, all pointers are written out w/ TTL ~0 - * (root pointers timed out and prime_cache() not done or failed). - */ - -static int -scan_root(htp) - struct hashbuf *htp; -{ - register struct databuf *dp; - register struct namebuf *np; - struct timeval soon; - int roots = 0; - - dprintf(1, (ddt, "scan_root(0x%lx)\n", (u_long)htp)); - - /* metric by which we determine whether a root NS pointer is still */ - /* valid (will be written out if we do a dump). we also add some */ - /* time buffer for safety... */ - (void) gettime(&soon); - soon.tv_sec += TIMBUF; - - for (np = htp->h_tab[0]; np != NULL; np = np->n_next) { - if (NAME(*np)[0] == '\0') { - dp = np->n_data; - while (dp != NULL) { - if (dp->d_type == T_NS && - dp->d_ttl > soon.tv_sec) { - roots++; - if (roots >= MINROOTS) - return (roots); - } - dp = dp->d_next; - } - } - } - return (roots); -} - -#ifdef notdef -mark_cache(htp, ttl) - struct hashbuf *htp; - int ttl; -{ - register struct databuf *dp; - register struct namebuf *np; - struct namebuf **npp, **nppend; - struct timeval soon; - - dprintf(1, (ddt, "mark_cache()\n")); - - (void) gettime(&soon); - soon.tv_sec += TIMBUF; - - npp = htp->h_tab; - nppend = npp + htp->h_size; - while (npp < nppend) { - for (np = *npp++; np != NULL; np = np->n_next) { - if (np->n_data == NULL) - continue; - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (dp->d_ttl < soon.tv_sec) - dp->d_ttl = ttl; - } - } - } - - npp = htp->h_tab; - nppend = npp + htp->h_size; - while (npp < nppend) { - for (np = *npp++; np != NULL; np = np->n_next) { - if (np->n_hash == NULL) - continue; - mark_cache(np->n_hash, ttl); - } - } -} -#endif /* notdef */ - -/* - * Dump current data base in a format similar to RFC 883. - */ - -void -doadump() -{ - FILE *fp; - - dprintf(3, (ddt, "doadump()\n")); - syslog(LOG_NOTICE, "dumping nameserver data\n"); - - if ((fp = fopen(dumpfile, "w")) == NULL) - return; - gettime(&tt); - fprintf(fp, "; Dumped at %s", ctimel(tt.tv_sec)); - if (zones && nzones) - zt_dump(fp); - fputs( -"; Note: Cr=(auth,answer,addtnl,cache) tag only shown for non-auth RR's\n", - fp); - fputs( -"; Note: NT=milliseconds for any A RR which we've used as a nameserver\n", - fp); - fprintf(fp, "; --- Cache & Data ---\n"); - if (hashtab != NULL) - (void) db_dump(hashtab, fp, DB_Z_ALL, ""); - fprintf(fp, "; --- Hints ---\n"); - if (fcachetab != NULL) - (void) db_dump(fcachetab, fp, DB_Z_ALL, ""); - (void) my_fclose(fp); - syslog(LOG_NOTICE, "finished dumping nameserver data\n"); -} - -int -zt_dump(fp) - FILE *fp; -{ - register struct zoneinfo *zp; - - fprintf(fp, ";; ++zone table++\n"); - for (zp = &zones[1]; zp < &zones[nzones]; zp++) { - char *pre, buf[64]; - u_int cnt; - - if (!zp->z_origin) - continue; - - fprintf(fp, "; %s (type %d, class %d, source %s)\n", - zp->z_origin - ? (*zp->z_origin ? zp->z_origin : ".") - : "Nil", - zp->z_type, zp->z_class, - zp->z_source ? zp->z_source : "Nil"); - fprintf(fp, ";\ttime=%lu, lastupdate=%lu, serial=%u,\n", - (u_long)zp->z_time, (u_long)zp->z_lastupdate, - zp->z_serial); - fprintf(fp, ";\trefresh=%u, retry=%u, expire=%u, minimum=%u\n", - zp->z_refresh, zp->z_retry, - zp->z_expire, zp->z_minimum); - fprintf(fp, ";\tftime=%lu, xaddr=[%s], state=%04x, pid=%d\n", - (u_long)zp->z_ftime, inet_ntoa(zp->z_xaddr), - zp->z_flags, (int)zp->z_xferpid); - sprintf(buf, ";\tz_addr[%d]: ", zp->z_addrcnt); - pre = buf; - for (cnt = 0; cnt < zp->z_addrcnt; cnt++) { - fprintf(fp, "%s[%s]", pre, inet_ntoa(zp->z_addr[cnt])); - pre = ", "; - } - if (zp->z_addrcnt) - fputc('\n', fp); -#ifdef BIND_NOTIFY - if (zp->z_notifylist) { - register struct notify *ap; - - for (ap = zp->z_notifylist; ap; ap = ap->next) - fprintf(fp, ";\tNotify [%s] %s", - inet_ntoa(ap->addr), - ctime(&ap->last)); - } -#endif - } - fprintf(fp, ";; --zone table--\n"); - return (0); -} - -int -db_dump(htp, fp, zone, origin) - struct hashbuf *htp; - FILE *fp; - int zone; - char *origin; -{ - register struct databuf *dp = NULL; - register struct namebuf *np; - struct namebuf **npp, **nppend; - char dname[MAXDNAME]; - u_int32_t n; - u_int32_t addr; - int j, i; - register u_char *cp; - u_char *end; - char *proto, *sep; - int16_t type; - int found_data = 0, tab, printed_origin = 0; - u_int16_t keyflags; - u_char *sigdata; - u_char *savecp; - char temp_base64[MAX_KEY_BASE64]; - - npp = htp->h_tab; - nppend = npp + htp->h_size; - while (npp < nppend) { - for (np = *npp++; np != NULL; np = np->n_next) { - if (np->n_data == NULL) - continue; - /* Blecch - can't tell if there is data here for the - * right zone, so can't print name yet - */ - found_data = 0; - /* we want a snapshot in time... */ - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - /* Is the data for this zone? */ - if (zone != DB_Z_ALL && dp->d_zone != zone) - continue; - if (dp->d_zone == DB_Z_CACHE && - dp->d_ttl <= tt.tv_sec && - (dp->d_flags & DB_F_HINT) == 0) - continue; - if (!printed_origin) { - fprintf(fp, "$ORIGIN %s.\n", origin); - printed_origin++; - } - tab = 0; -#ifdef NCACHE - if (dp->d_rcode == NXDOMAIN || - dp->d_rcode == NOERROR_NODATA) { - fputc(';', fp); - } else if (found_data == 0 || found_data == 1) { - found_data = 2; - } -#endif /*NCACHE*/ - if (found_data == 0 || found_data == 2) { - if (NAME(*np)[0] == '\0') { - if (origin[0] == '\0') - fprintf(fp, ".\t"); - else - fprintf(fp, ".%s.\t", origin); /* ??? */ - } else - fprintf(fp, "%s\t", NAME(*np)); - if (NAMELEN(*np) < (unsigned)8) - tab = 1; - found_data++; - } else { - (void) putc('\t', fp); - tab = 1; - } - if (dp->d_zone == DB_Z_CACHE) { - if (dp->d_flags & DB_F_HINT - && (int32_t)(dp->d_ttl - tt.tv_sec) - < DB_ROOT_TIMBUF) - fprintf(fp, "%d\t", DB_ROOT_TIMBUF); - else - fprintf(fp, "%d\t", - (int)(dp->d_ttl - tt.tv_sec)); - } else if (dp->d_ttl != USE_MINIMUM && - dp->d_ttl != zones[dp->d_zone].z_minimum) - fprintf(fp, "%d\t", (int)dp->d_ttl); - else if (tab) - (void) putc('\t', fp); - fprintf(fp, "%s\t%s\t", - p_class(dp->d_class), - p_type(dp->d_type)); - cp = (u_char *)dp->d_data; - sep = "\t;"; - type = dp->d_type; -#ifdef NCACHE - if (dp->d_rcode == NXDOMAIN || - dp->d_rcode == NOERROR_NODATA) { -#ifdef RETURNSOA - if (dp->d_size == 0) { -#endif - fprintf(fp, "%s%s-$", - (dp->d_rcode == NXDOMAIN) - ?"NXDOMAIN" :"NODATA", - sep); - goto eoln; -#ifdef RETURNSOA - } else { - type = T_SOA; - } -#endif - } -#endif - /* - * Print type specific data - */ - switch (type) { - case T_A: - switch (dp->d_class) { - case C_IN: - case C_HS: - GETLONG(n, cp); - n = htonl(n); - fputs(inet_ntoa(*(struct in_addr *)&n), - fp); - break; - } - if (dp->d_nstime) { - fprintf(fp, "%sNT=%d", - sep, dp->d_nstime); - sep = " "; - } - break; - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_PTR: - fprintf(fp, "%s.", cp); - break; - - case T_NS: - cp = (u_char *)dp->d_data; - if (cp[0] == '\0') - fprintf(fp, ".\t"); - else - fprintf(fp, "%s.", cp); - break; - - case T_HINFO: - case T_ISDN: { - char buf[256]; - if ((n = *cp++) != '\0') { - bcopy(cp, buf, n); buf[n] = '\0'; - fprintf(fp, "\"%.*s\"", (int)n, buf); - cp += n; - } else - fprintf(fp, "\"\""); - if ((n = *cp++) != '\0') { - bcopy(cp, buf, n); buf[n] = '\0'; - fprintf(fp, " \"%.*s\"", (int)n, buf); - } else - fprintf(fp, " \"\""); - break; - } - - case T_SOA: - fprintf(fp, "%s.", cp); - cp += strlen((char *)cp) + 1; - fprintf(fp, " %s. (\n", cp); -#if defined(RETURNSOA) && defined(NCACHE) - if (dp->d_rcode) - fputs(";", fp); -#endif - cp += strlen((char *)cp) + 1; - GETLONG(n, cp); - fprintf(fp, "\t\t%lu", (u_long)n); - GETLONG(n, cp); - fprintf(fp, " %lu", (u_long)n); - GETLONG(n, cp); - fprintf(fp, " %lu", (u_long)n); - GETLONG(n, cp); - fprintf(fp, " %lu", (u_long)n); - GETLONG(n, cp); - fprintf(fp, " %lu )", (u_long)n); -#if defined(RETURNSOA) && defined(NCACHE) - if (dp->d_rcode) { - fprintf(fp,";%s.;%s%s-$",cp, - (dp->d_rcode == NXDOMAIN) ? - "NXDOMAIN" : "NODATA", - sep); - } -#endif - break; - - case T_MX: - case T_AFSDB: - case T_RT: - GETSHORT(n, cp); - fprintf(fp, "%lu", (u_long)n); - fprintf(fp, " %s.", cp); - break; - - case T_PX: - GETSHORT(n, cp); - fprintf(fp, "%lu", (u_long)n); - fprintf(fp, " %s.", cp); - cp += strlen((char *)cp) + 1; - fprintf(fp, " %s.", cp); - break; - - case T_X25: - if ((n = *cp++) != '\0') - fprintf(fp, " \"%.*s\"", (int)n, cp); - else - fprintf(fp, " \"\""); - break; - - case T_TXT: - end = (u_char *)dp->d_data + dp->d_size; - while (cp < end) { - (void) putc('"', fp); - if ((n = *cp++) != '\0') { - for (j = n ; j > 0 && cp < end ; j--) { - if (*cp == '\n' || *cp == '"' || *cp == '\\') - (void) putc('\\', fp); - (void) putc(*cp++, fp); - } - } - (void) putc('"', fp); - if (cp < end) - (void) putc(' ', fp); - } - break; - - case T_NSAP: - (void) fputs(inet_nsap_ntoa(dp->d_size, - dp->d_data, NULL), - fp); - break; - case T_AAAA: { - char t[sizeof - "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255" - ]; - - (void) fputs(inet_ntop(AF_INET6, dp->d_data, - t, sizeof t), - fp); - break; - } -#ifdef LOC_RR - case T_LOC: { - char t[256]; - - (void) fputs(loc_ntoa(dp->d_data, t), fp); - break; - } -#endif /* LOC_RR */ - - case T_NAPTR: { - u_int order, preference; - - GETSHORT(order, cp); - fprintf(fp, "%lu", (u_long)order); - - GETSHORT(preference, cp); - fprintf(fp, "%lu", (u_long)preference); - - if (n = *cp++) { - fprintf(fp, "\"%.*s\"", (int)n, cp); - cp += n; - } - if (n = *cp++) { - fprintf(fp, "\"%.*s\"", (int)n, cp); - cp += n; - } - if (n = *cp++) { - fprintf(fp, " \"%.*s\"", (int)n, cp); - cp += n; - } - fprintf(fp, " %s.", cp); - - break; - } - - case T_SRV: { - u_int priority, weight, port; - - GETSHORT(priority, cp); - GETSHORT(weight, cp); - GETSHORT(port, cp); - fprintf(fp, "\t%u %u %u %s.", - priority, weight, port, cp); - break; - } - case T_UINFO: - fprintf(fp, "\"%s\"", cp); - break; - - case T_UID: - case T_GID: - if (dp->d_size == INT32SZ) { - GETLONG(n, cp); - } else { - n = -2; /* XXX - hack */ - } - fprintf(fp, "%u", n); - break; - - case T_WKS: - GETLONG(addr, cp); - addr = htonl(addr); - fputs(inet_ntoa(*(struct in_addr *)&addr), fp); - proto = protocolname(*cp); - cp += sizeof(char); - fprintf(fp, " %s ", proto); - i = 0; - while(cp < (u_char *)dp->d_data + dp->d_size) { - j = *cp++; - do { - if (j & 0200) - fprintf(fp, " %s", - servicename(i, proto)); - j <<= 1; - } while (++i & 07); - } - break; - - case T_MINFO: - case T_RP: - fprintf(fp, "%s.", cp); - cp += strlen((char *)cp) + 1; - fprintf(fp, " %s.", cp); - break; - - case T_KEY: - savecp = cp; /* save the beginning */ - /*>>> Flags (unsigned_16) */ - GETSHORT(keyflags,cp); - fprintf(fp, "0x%04x ", keyflags); - /*>>> Protocol (8-bit decimal) */ - fprintf(fp, "%3u ", *cp++); - /*>>> Algorithm id (8-bit decimal) */ - fprintf(fp, "%3u ", *cp++); - - /*>>> Public-Key Data (multidigit BASE64) */ - /* containing ExponentLen, Exponent, and Modulus */ - i = b64_ntop(cp, dp->d_size - (cp - savecp), - temp_base64, - sizeof temp_base64); - if (i < 0) - fprintf(fp, "; BAD BASE64"); - else - fprintf(fp, "%s", temp_base64); - break; - - case T_SIG: - sigdata = cp; - /* RRtype (char *) */ - GETSHORT(n,cp); - fprintf(fp, "%s ", p_type(n)); - /* Algorithm id (8-bit decimal) */ - fprintf(fp, "%d ", *cp++); - /* Labels (8-bit decimal) (not saved in file) */ - /* FIXME -- check value and print err if bad */ - cp++; - /* OTTL (u_long) */ - GETLONG(n, cp); - fprintf(fp, "%lu ", n); - /* Texp (u_long) */ - GETLONG(n, cp); - fprintf(fp, "%s ", p_secstodate (n)); - /* Tsig (u_long) */ - GETLONG(n, cp); - fprintf(fp, "%s ", p_secstodate (n)); - /* Kfootprint (unsigned_16) */ - GETSHORT(n, cp); - fprintf(fp, "%lu ", n); - /* Signer's Name (char *) */ - fprintf(fp, "%s ", cp); - cp += strlen((char *)cp) + 1; - /* Signature (base64 of any length) */ - i = b64_ntop(cp, dp->d_size - (cp - sigdata), - temp_base64, - sizeof temp_base64); - if (i < 0) - fprintf(fp, "; BAD BASE64"); - else - fprintf(fp, "%s", temp_base64); - break; - -#ifdef ALLOW_T_UNSPEC - case T_UNSPEC: - /* Dump binary data out in an ASCII-encoded - format */ - { - /* Allocate more than enough space: - * actually need 5/4 size + 20 or so - */ - int TmpSize = 2 * dp->d_size + 30; - char *TmpBuf = (char *) malloc(TmpSize); - if (TmpBuf == NULL) { - TmpBuf = "BAD_MALLOC"; - } - if (btoa(cp, dp->d_size, TmpBuf, TmpSize) - == CONV_OVERFLOW) { - TmpBuf = "OVERFLOW"; - } - fprintf(fp, "%s", TmpBuf); - } - break; -#endif /* ALLOW_T_UNSPEC */ - default: - fprintf(fp, "%s?d_type=%d?", - sep, dp->d_type); - sep = " "; - } - if (dp->d_cred < DB_C_ZONE) { - fprintf(fp, "%sCr=%s", - sep, MkCredStr(dp->d_cred)); - sep = " "; - } else { - fprintf(fp, "%sCl=%d", - sep, dp->d_clev); - sep = " "; - } -eoln: -#ifdef STATS - if (dp->d_ns) { - fprintf(fp, "%s[%s]", - sep, inet_ntoa(dp->d_ns->addr)); - sep = " "; - } -#endif - putc('\n', fp); - } - } - } - if (ferror(fp)) - return(NODBFILE); - - npp = htp->h_tab; - nppend = npp + htp->h_size; - while (npp < nppend) { - for (np = *npp++; np != NULL; np = np->n_next) { - if (np->n_hash == NULL) - continue; - getname(np, dname, sizeof(dname)); - if (db_dump(np->n_hash, fp, zone, dname) == NODBFILE) - return(NODBFILE); - } - } - return(OK); -} - -static const char * -MkCredStr(cred) - int cred; -{ - static char badness[20]; - - switch (cred) { - case DB_C_ZONE: return "zone"; - case DB_C_AUTH: return "auth"; - case DB_C_ANSWER: return "answer"; - case DB_C_ADDITIONAL: return "addtnl"; - case DB_C_CACHE: return "cache"; - default: break; - } - sprintf(badness, "?%d?", cred); - return (badness); -} - -#ifdef ALLOW_T_UNSPEC -/* - * Subroutines to convert between 8 bit binary bytes and printable ASCII. - * Computes the number of bytes, and three kinds of simple checksums. - * Incoming bytes are collected into 32-bit words, then printed in base 85: - * exp(85,5) > exp(2,32) - * The ASCII characters used are between '!' and 'u'; - * 'z' encodes 32-bit zero; 'x' is used to mark the end of encoded data. - * - * Originally by Paul Rutter (philabs!per) and Joe Orost (petsd!joe) for - * the atob/btoa programs, released with the compress program, in mod.sources. - * Modified by Mike Schwartz 8/19/86 for use in BIND. - */ - -/* Make sure global variable names are unique */ -#define Ceor T_UNSPEC_Ceor -#define Csum T_UNSPEC_Csum -#define Crot T_UNSPEC_Crot -#define word T_UNSPEC_word -#define bcount T_UNSPEC_bcount - -static int32_t Ceor, Csum, Crot, word, bcount; - -#define EN(c) ((int) ((c) + '!')) -#define DE(c) ((c) - '!') -#define AddToBuf(bufp, c) **bufp = c; (*bufp)++; -#define times85(x) ((((((x<<2)+x)<<2)+x)<<2)+x) - -/* Decode ASCII-encoded byte c into binary representation and - * place into *bufp, advancing bufp - */ -static int -byte_atob(c, bufp) - register c; - char **bufp; -{ - if (c == 'z') { - if (bcount != 0) - return(CONV_BADFMT); - else { - putbyte(0, bufp); - putbyte(0, bufp); - putbyte(0, bufp); - putbyte(0, bufp); - } - } else if ((c >= '!') && (c < ('!' + 85))) { - if (bcount == 0) { - word = DE(c); - ++bcount; - } else if (bcount < 4) { - word = times85(word); - word += DE(c); - ++bcount; - } else { - word = times85(word) + DE(c); - putbyte((int)((word >> 24) & 255), bufp); - putbyte((int)((word >> 16) & 255), bufp); - putbyte((int)((word >> 8) & 255), bufp); - putbyte((int)(word & 255), bufp); - word = 0; - bcount = 0; - } - } else - return(CONV_BADFMT); - return(CONV_SUCCESS); -} - -/* Compute checksum info and place c into *bufp, advancing bufp */ -static void -putbyte(c, bufp) - register c; - char **bufp; -{ - Ceor ^= c; - Csum += c; - Csum += 1; - if ((Crot & 0x80000000)) { - Crot <<= 1; - Crot += 1; - } else { - Crot <<= 1; - } - Crot += c; - AddToBuf(bufp, c); -} - -/* Read the ASCII-encoded data from inbuf, of length inbuflen, and convert - it into T_UNSPEC (binary data) in outbuf, not to exceed outbuflen bytes; - outbuflen must be divisible by 4. (Note: this is because outbuf is filled - in 4 bytes at a time. If the actual data doesn't end on an even 4-byte - boundary, there will be no problem...it will be padded with 0 bytes, and - numbytes will indicate the correct number of bytes. The main point is - that since the buffer is filled in 4 bytes at a time, even if there is - not a full 4 bytes of data at the end, there has to be room to 0-pad the - data, so the buffer must be of size divisible by 4). Place the number of - output bytes in numbytes, and return a failure/success status */ -int -atob(inbuf, inbuflen, outbuf, outbuflen, numbytes) - char *inbuf; - int inbuflen; - char *outbuf; - int outbuflen; - int *numbytes; -{ - int inc, nb; - int32_t oeor, osum, orot; - char *inp, *outp = outbuf, *endoutp = &outbuf[outbuflen]; - - if ( (outbuflen % 4) != 0) - return(CONV_BADBUFLEN); - Ceor = Csum = Crot = word = bcount = 0; - for (inp = inbuf, inc = 0; inc < inbuflen; inp++, inc++) { - if (outp > endoutp) - return(CONV_OVERFLOW); - if (*inp == 'x') { - inp +=2; - break; - } else { - if (byte_atob(*inp, &outp) == CONV_BADFMT) - return(CONV_BADFMT); - } - } - - /* Get byte count and checksum information from end of buffer */ - if (sscanf(inp, "%d %lx %lx %lx", numbytes, &oeor, &osum, &orot) != 4) - return(CONV_BADFMT); - if ((oeor != Ceor) || (osum != Csum) || (orot != Crot)) - return(CONV_BADCKSUM); - return(CONV_SUCCESS); -} - -/* Encode binary byte c into ASCII representation and place into *bufp, - advancing bufp */ -static void -byte_btoa(c, bufp) - register c; - char **bufp; -{ - Ceor ^= c; - Csum += c; - Csum += 1; - if ((Crot & 0x80000000)) { - Crot <<= 1; - Crot += 1; - } else { - Crot <<= 1; - } - Crot += c; - - word <<= 8; - word |= c; - if (bcount == 3) { - if (word == 0) { - AddToBuf(bufp, 'z'); - } else { - register int tmp = 0; - register int32_t tmpword = word; - - if (tmpword < 0) { - /* Because some don't support u_long */ - tmp = 32; - tmpword -= (int32_t)(85 * 85 * 85 * 85 * 32); - } - if (tmpword < 0) { - tmp = 64; - tmpword -= (int32_t)(85 * 85 * 85 * 85 * 32); - } - AddToBuf(bufp, - EN((tmpword / (int32_t)(85 * 85 * 85 * 85)) + tmp)); - tmpword %= (int32_t)(85 * 85 * 85 * 85); - AddToBuf(bufp, EN(tmpword / (85 * 85 * 85))); - tmpword %= (85 * 85 * 85); - AddToBuf(bufp, EN(tmpword / (85 * 85))); - tmpword %= (85 * 85); - AddToBuf(bufp, EN(tmpword / 85)); - tmpword %= 85; - AddToBuf(bufp, EN(tmpword)); - } - bcount = 0; - } else { - bcount += 1; - } -} - - -/* - * Encode the binary data from inbuf, of length inbuflen, into a - * null-terminated ASCII representation in outbuf, not to exceed outbuflen - * bytes. Return success/failure status - */ -static int -btoa(inbuf, inbuflen, outbuf, outbuflen) - char *inbuf; - int inbuflen; - char *outbuf; - int outbuflen; -{ - int32_t inc, nb; - int32_t oeor, osum, orot; - char *inp, *outp = outbuf, *endoutp = &outbuf[outbuflen -1]; - - Ceor = Csum = Crot = word = bcount = 0; - for (inp = inbuf, inc = 0; inc < inbuflen; inp++, inc++) { - byte_btoa((unsigned char) (*inp), &outp); - if (outp >= endoutp) - return(CONV_OVERFLOW); - } - while (bcount != 0) { - byte_btoa(0, &outp); - if (outp >= endoutp) - return(CONV_OVERFLOW); - } - /* Put byte count and checksum information at end of buffer, delimited - by 'x' */ - (void) sprintf(outp, "x %d %lx %lx %lx", inbuflen, Ceor, Csum, Crot); - if (&outp[strlen(outp) - 1] >= endoutp) - return(CONV_OVERFLOW); - else - return(CONV_SUCCESS); -} -#endif /* ALLOW_T_UNSPEC */ diff --git a/contrib/bind/named/db_func.h b/contrib/bind/named/db_func.h deleted file mode 100644 index 87e4fafdf08c..000000000000 --- a/contrib/bind/named/db_func.h +++ /dev/null @@ -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-- */ diff --git a/contrib/bind/named/db_glob.h b/contrib/bind/named/db_glob.h deleted file mode 100644 index bd9235fc5eb3..000000000000 --- a/contrib/bind/named/db_glob.h +++ /dev/null @@ -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 */ diff --git a/contrib/bind/named/db_glue.c b/contrib/bind/named/db_glue.c deleted file mode 100644 index 4f6deb09aad7..000000000000 --- a/contrib/bind/named/db_glue.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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); -} diff --git a/contrib/bind/named/db_load.c b/contrib/bind/named/db_load.c deleted file mode 100644 index 6251f4207fd2..000000000000 --- a/contrib/bind/named/db_load.c +++ /dev/null @@ -1,2296 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)db_load.c 4.38 (Berkeley) 3/2/91"; -static char rcsid[] = "$Id: db_load.c,v 8.32 1997/06/01 20:34:34 vixie Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1988, 1990 - * - - * Copyright (c) 1986, 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. - * - - * 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. - * --Copyright-- - */ - -/* - * Load data base from ascii backupfile. Format similar to RFC 883. - */ - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "named.h" - -#define ALLOW_LONG_TXT_RDATA - -static int gettoken __P((register FILE *, const char *)), - getnonblank __P((FILE *, const char *)), - getprotocol __P((FILE *, const char *)), - getservices __P((int, char *, FILE *, const char *)), - getcharstring __P((char *, char *, int, int, int, FILE *, const char *)); -static void makename __P((char *, const char *)); -static int makename_ok __P((char *name, const char *origin, - int class, - enum transport transport, - enum context context, - const char *owner, - const char *filename, int lineno)); -static int getmlword __P((char *, int, FILE *, int)); -static int getallwords __P((char *, int, FILE *, int)); -static u_int32_t wordtouint32 __P((char *)); -static u_int32_t datetosecs __P((char *, int *)); - -static int wordtouint32_error = 0; -static int empty_token = 0; -static int getmlword_nesting = 0; - -int getnum_error; - -/* - * Parser token values - */ -#define CURRENT 1 -#define DOT 2 -#define AT 3 -#define DNAME 4 -#define INCLUDE 5 -#define ORIGIN 6 -#define ERROR 7 - -static int clev; /* a zone deeper in a hierachy has more credability */ - -#define MAKENAME_OK(N) if (!makename_ok(N, origin, class, \ - transport, context, \ - domain, filename, lineno)) { \ - errs++; \ - sprintf(buf, "bad name \"%s\"", N); \ - goto err; \ - } - -/* int - * db_load(filename, in_origin, zp, def_domain) - * load a database from `filename' into zone `zp'. append `in_origin' - * to all nonterminal domain names in the file. `def_domain' is the - * default domain for include files or NULL for zone base files. - * returns: - * -1 = can't open file - * 0 = success - * >0 = number of errors encountered - */ -int -db_load(filename, in_origin, zp, def_domain) - const char *filename, *in_origin; - struct zoneinfo *zp; - const char *def_domain; -{ - static int read_soa, read_ns, rrcount; - register char *cp; - char domain[MAXDNAME]; - char origin[MAXDNAME]; - char tmporigin[MAXDNAME]; - char buf[MAXDATA]; - char data[MAXDATA]; - const char *op; - int c, someclass, class, type, dbflags, dataflags, multiline; - u_int32_t ttl; - struct databuf *dp; - FILE *fp; - int slineno, i, errs, didinclude; - register u_int32_t n; - struct stat sb; - struct in_addr ina; - int escape; - enum transport transport; - enum context context; - u_int32_t sig_type; - u_int32_t keyflags; - int success; - int dateerror; -#ifdef DO_WARN_SERIAL - u_int32_t serial; -#endif - -/* Simple macro for setting error messages about RR's being parsed, - before jumping to err label. If no SETERR is done, the last word - scanned into "buf" by getword will be printed. */ -#define SETERR(x) strcpy (buf, x); - - switch (zp->z_type) { - case Z_PRIMARY: - case Z_CACHE: - transport = primary_trans; - break; - case Z_SECONDARY: - case Z_STUB: - transport = secondary_trans; - break; - default: - transport = response_trans; /*guessing*/ - break; - } - errs = 0; - didinclude = 0; - if (!def_domain) { - /* This is not the result of a $INCLUDE. */ - rrcount = 0; - read_soa = 0; - read_ns = 0; - clev = db_getclev(in_origin); - } - - dprintf(1, (ddt,"db_load(%s, %s, %d, %s)\n", - filename, in_origin, zp - zones, - def_domain ? def_domain : "Nil")); - - (void) strcpy(origin, in_origin); - if ((fp = fopen(filename, "r")) == NULL) { - syslog(LOG_WARNING, "%s: %m", filename); - dprintf(1, (ddt, "db_load: error opening file %s\n", - filename)); - return (-1); - } - if (zp->z_type == Z_CACHE) { - dbflags = DB_NODATA | DB_NOHINTS; - dataflags = DB_F_HINT; -#ifdef STUBS - } else if (zp->z_type == Z_STUB && clev == 0) { - dbflags = DB_NODATA | DB_NOHINTS; - dataflags = DB_F_HINT; -#endif - } else { - dbflags = DB_NODATA; - dataflags = 0; - } - gettime(&tt); - if (fstat(fileno(fp), &sb) < 0) { - syslog(LOG_WARNING, "%s: %m", filename); - sb.st_mtime = (int)tt.tv_sec; - } - slineno = lineno; - lineno = 1; - if (def_domain) - strcpy(domain, def_domain); - else - domain[0] = '\0'; - class = zp->z_class; - zp->z_flags &= ~(Z_INCLUDE|Z_DB_BAD); - while ((c = gettoken(fp, filename)) != EOF) { - switch (c) { - case INCLUDE: - if (!getword((char *)buf, sizeof(buf), fp, 0)) - /* file name*/ - break; - if (!getword(tmporigin, sizeof(tmporigin), fp, 1)) - strcpy(tmporigin, origin); - else { - makename(tmporigin, origin); - endline(fp); - } - didinclude = 1; - errs += db_load((char *)buf, tmporigin, zp, domain); - continue; - - case ORIGIN: - (void) strcpy((char *)buf, origin); - if (!getword(origin, sizeof(origin), fp, 1)) - break; - dprintf(3, (ddt, "db_load: origin %s, buf %s\n", - origin, buf)); - makename(origin, buf); - dprintf(3, (ddt, "db_load: origin now %s\n", origin)); - continue; - - case DNAME: - if (!getword(domain, sizeof(domain), fp, 1)) - break; - n = strlen(domain) - 1; - if (domain[n] == '.') - domain[n] = '\0'; - else if (*origin) { - (void) strcat(domain, "."); - (void) strcat(domain, origin); - } - goto gotdomain; - - case AT: - (void) strcpy(domain, origin); - goto gotdomain; - - case DOT: - domain[0] = '\0'; - /* FALLTHROUGH */ - case CURRENT: - gotdomain: - if (!getword((char *)buf, sizeof(buf), fp, 0)) { - if (c == CURRENT) - continue; - break; - } - cp = buf; - ttl = USE_MINIMUM; - if (isdigit(*cp)) { - n = 0; - do { - if (n > (INT_MAX - (*cp - '0')) / 10) { - syslog(LOG_INFO, - "%s: line %d: number > %lu\n", - filename, lineno, (u_long)INT_MAX); - n = INT_MAX; - cp++; - } else - n = n * 10 + (*cp++ - '0'); - } - while (isdigit(*cp)); - if (*cp != '\0') { - errs++; - syslog(LOG_INFO, - "%s: Line %d: bad TTL: %s.\n", - filename, lineno, buf); - break; - } - if (zp->z_type == Z_CACHE) { - /* this allows the cache entry to age */ - /* while sitting on disk (powered off) */ - if (n > max_cache_ttl) - n = max_cache_ttl; - n += sb.st_mtime; - } - ttl = n; - if (!getword((char *)buf, sizeof(buf), fp, 0)) - break; - } - - /* Parse class (IN, etc) */ - someclass = sym_ston(__p_class_syms, - (char *)buf, &success); - if (success && someclass != C_ANY) { - class = someclass; - (void) getword((char *)buf, - sizeof(buf), fp, 0); - } - - /* Parse RR type (A, MX, etc) */ - type = sym_ston(__p_type_syms, - (char *)buf, &success); - if ((!success) || type == T_ANY) { - dprintf(1, (ddt, "%s: Line %d: Unknown type: %s.\n", - filename, lineno, buf)); - errs++; - syslog(LOG_INFO, "%s: Line %d: Unknown type: %s.\n", - filename, lineno, buf); - break; - } - - context = ns_ownercontext(type, transport); - if (!ns_nameok(domain, class, transport, context, - domain, inaddr_any)) { - errs++; - syslog(LOG_NOTICE, - "%s:%d: owner name error\n", - filename, lineno); - break; - } - - context = domain_ctx; - switch (type) { -#ifdef ALLOW_T_UNSPEC - case T_UNSPEC: -#endif - case T_KEY: - case T_SIG: - /* Don't do anything here for these types -- - they read their own input separately later */ - goto dont_get_word; - - case T_SOA: - case T_MINFO: - case T_RP: - case T_NS: - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_PTR: - escape = 1; - break; - default: - escape = 0; - } - if (!getword((char *)buf, sizeof(buf), fp, escape)) - break; - dprintf(3, - (ddt, - "d='%s', c=%d, t=%d, ttl=%d, data='%s'\n", - domain, class, type, ttl, buf)); - /* - * Convert the ascii data 'buf' to the proper format - * based on the type and pack into 'data'. - */ - dont_get_word: - switch (type) { - case T_A: - if (!inet_aton(buf, &ina)) - goto err; - n = ntohl(ina.s_addr); - cp = data; - PUTLONG(n, cp); - n = INT32SZ; - break; - - case T_SOA: - context = hostname_ctx; - goto soa_rp_minfo; - case T_RP: - case T_MINFO: - context = mailname_ctx; - /* FALLTHROUGH */ - soa_rp_minfo: - (void) strcpy((char *)data, (char *)buf); - - MAKENAME_OK(data); - cp = data + strlen((char *)data) + 1; - if (!getword((char *)cp, - (sizeof data) - - (cp - (char *)data), - fp, 1)) - goto err; - if (type == T_RP) - context = domain_ctx; - else - context = mailname_ctx; - MAKENAME_OK(cp); - cp += strlen((char *)cp) + 1; - if (type != T_SOA) { - n = cp - (char *)data; - break; - } - if (class != zp->z_class) { - errs++; - syslog(LOG_INFO, - "%s:%d: %s", - filename, lineno, - "SOA class not same as zone's"); - } - if (strcasecmp(zp->z_origin, domain) != 0) { - errs++; - syslog(LOG_ERR, - "%s: line %d: SOA for \"%s\" not at zone top \"%s\"", - filename, lineno, domain, - zp->z_origin); - } - c = getnonblank(fp, filename); - if (c == '(') { - multiline = 1; - } else { - multiline = 0; - ungetc(c, fp); - } -#ifdef DO_WARN_SERIAL - serial = zp->z_serial; -#endif - zp->z_serial = getnum(fp, filename, - GETNUM_SERIAL); - if (getnum_error) - errs++; - n = (u_int32_t) zp->z_serial; - PUTLONG(n, cp); -#ifdef DO_WARN_SERIAL - if (serial && SEQ_GT(serial, zp->z_serial)) { - syslog(LOG_NOTICE, - "%s:%d: WARNING: new serial number < old (%lu < %lu)", - filename , lineno, - zp->z_serial, serial); - } -#endif - zp->z_refresh = getnum(fp, filename, - GETNUM_NONE); - if (getnum_error) { - errs++; - zp->z_refresh = INIT_REFRESH; - } - n = (u_int32_t) zp->z_refresh; - PUTLONG(n, cp); - if (zp->z_type == Z_SECONDARY -#if defined(STUBS) - || zp->z_type == Z_STUB -#endif - ) { - ns_refreshtime(zp, MIN(sb.st_mtime, - tt.tv_sec)); - } - zp->z_retry = getnum(fp, filename, - GETNUM_NONE); - if (getnum_error) { - errs++; - zp->z_retry = INIT_REFRESH; - } - n = (u_int32_t) zp->z_retry; - PUTLONG(n, cp); - zp->z_expire = getnum(fp, filename, - GETNUM_NONE); - if (getnum_error) { - errs++; - zp->z_expire = INIT_REFRESH; - } - n = (u_int32_t) zp->z_expire; - PUTLONG (n, cp); - zp->z_minimum = getnum(fp, filename, - GETNUM_NONE); - if (getnum_error) { - errs++; - zp->z_minimum = 120; - } - n = (u_int32_t) zp->z_minimum; - PUTLONG (n, cp); - n = cp - (char *)data; - if (multiline) { - if (getnonblank(fp, filename) != ')') - goto err; - endline(fp); - } - read_soa++; - if (zp->z_type != Z_PRIMARY) - break; - /* sanity checks PRIMARY ONLY */ - /* - * sanity: give enough time for the - * zone to transfer (retry) - */ - if (zp->z_expire < - (zp->z_refresh+zp->z_retry)) { - syslog(LOG_NOTICE, - "%s: WARNING SOA expire value is less then SOA refresh + retry (%lu < %lu + %lu)", - filename, zp->z_expire, zp->z_refresh, - zp->z_retry); - } - /* BIND specific */ - if (zp->z_expire < maint_interval) { - syslog(LOG_NOTICE, - "%s: WARNING SOA expire value is less then maintainance interval (%lu < %lu)", - filename, zp->z_expire, maint_interval); - } - /* BIND Specific */ - if (zp->z_refresh < maint_interval) { - syslog(LOG_WARNING, - "%s: WARNING SOA refresh value is less then maintainance interval (%lu < %lu)", - filename, zp->z_refresh, maint_interval); - } - /* BIND specific */ - if (zp->z_retry < maint_interval) { - syslog(LOG_WARNING, - "%s: WARNING SOA retry value is less then maintainance interval (%lu < %lu)", - filename, zp->z_retry, maint_interval); - } - /* sanity */ - if (zp->z_expire < - (zp->z_refresh + 10 * zp->z_retry)) { - syslog(LOG_WARNING, - "%s: WARNING SOA expire value is less then refresh + 10 * retry (%lu < (%lu + 10 * %lu))", - filename, zp->z_expire, zp->z_refresh, - zp->z_retry); - } - /* - * sanity: most harware/telco faults are - * detected and fixed within a week, - * secondaries should continue to - * operate for this time. - * (minimum of 4 days for long weekends) - */ - if (zp->z_expire < (7 * 24 * 3600)) { - syslog(LOG_WARNING, - "%s: WARNING SOA expire value is less then 7 days (%lu)", - filename, zp->z_expire); - } - /* - * sanity: maximum down time - * if we havn't talked for six months - * war must have broken out - */ - if (zp->z_expire > ( 183 * 24 * 3600)) { - syslog(LOG_WARNING, - "%s: WARNING SOA expire value is greater then 6 months (%lu)", - filename, zp->z_expire); - } - /* sanity */ - if (zp->z_refresh < (zp->z_retry * 2)) { - syslog(LOG_WARNING, - "%s: WARNING SOA refresh value is less than 2 * retry (%lu < %lu * 2)", - filename, zp->z_refresh, zp->z_retry); - } - break; - - case T_UID: - case T_GID: - n = 0; - cp = buf; - while (isdigit(*cp)) - n = n * 10 + (*cp++ - '0'); - if (cp == buf) - goto err; - cp = data; - PUTLONG(n, cp); - n = INT32SZ; - break; - - case T_WKS: - /* Address */ - if (!inet_aton(buf, &ina)) - goto err; - n = ntohl(ina.s_addr); - cp = data; - PUTLONG(n, cp); - *cp = (char)getprotocol(fp, filename); - /* Protocol */ - n = INT32SZ + sizeof(char); - /* Services */ - n = getservices((int)n, data, fp, filename); - break; - - case T_NS: - if (strcasecmp(zp->z_origin, domain) == 0) - read_ns++; - context = hostname_ctx; - goto cname_etc; - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - context = domain_ctx; - goto cname_etc; - case T_PTR: - context = ns_ptrcontext(domain); - cname_etc: - (void) strcpy((char *)data, (char *)buf); - MAKENAME_OK(data); - n = strlen((char *)data) + 1; - break; - - case T_UINFO: - cp = strchr((char *)buf, '&'); - bzero(data, sizeof data); - if ( cp != NULL) { - (void) strncpy((char *)data, - (char *)buf, cp - buf); - op = strchr(domain, '.'); - if ( op != NULL) - (void) strncat((char *)data, - domain,op-domain); - else - (void) strcat((char *)data, - domain); - (void) strcat((char *)data, - (char *)++cp); - } else - (void) strcpy((char *)data, - (char *)buf); - n = strlen((char *)data) + 1; - break; - - case T_NAPTR: - /* Order Preference Flags Service Replacement Regexp */ - n = 0; - cp = buf; - /* Order */ - while (isdigit(*cp)) - n = n * 10 + (*cp++ - '0'); - /* catch bad values */ - if ((cp == buf) || (n > 65535)) - goto err; - cp = data; - PUTSHORT((u_int16_t)n, cp); - /* Preference */ - n = getnum(fp, filename, GETNUM_NONE); - if (getnum_error || n > 65536) - goto err; - PUTSHORT((u_int16_t)n, cp); - - /* Flags */ - if (!getword((char *)buf, sizeof(buf), fp, 0)) - goto err; - n = strlen((char *)buf); - *cp++ = n; - bcopy(buf, (char *)cp, (int)n); - cp += n; - - /* Service Classes */ - if (!getword((char *)buf, sizeof(buf), fp, 0)) - goto err; - n = strlen((char *)buf); - *cp++ = n; - bcopy(buf, (char *)cp, (int)n); - cp += n; - - /* Pattern */ - if (!getword((char *)buf, sizeof(buf), fp, 0)) - goto err; - n = strlen((char *)buf); - *cp++ = n; - bcopy(buf, (char *)cp, (int)n); - cp += n; - - /* Replacement */ - if (!getword((char *)buf, sizeof(buf), fp, 1)) - goto err; - (void) strcpy((char *)cp, (char *)buf); - context = domain_ctx; - MAKENAME_OK(cp); - /* advance pointer to end of data */ - cp += strlen((char *)cp) +1; - - /* now save length */ - n = (cp - (char *)data); - break; - - case T_MX: - case T_AFSDB: - case T_RT: - case T_SRV: - n = 0; - cp = buf; - while (isdigit(*cp)) - n = n * 10 + (*cp++ - '0'); - /* catch bad values */ - if ((cp == buf) || (n > 65535)) - goto err; - cp = data; - PUTSHORT((u_int16_t)n, cp); - - if (type == T_SRV) { - n = getnum(fp, filename, GETNUM_NONE); - if (getnum_error || n > 65536) - goto err; - PUTSHORT((u_int16_t)n, cp); - - n = getnum(fp, filename, GETNUM_NONE); - if (getnum_error || n > 65536) - goto err; - PUTSHORT((u_int16_t)n, cp); - } - - if (!getword((char *)buf, sizeof(buf), fp, 1)) - goto err; - (void) strcpy((char *)cp, (char *)buf); - context = hostname_ctx; - MAKENAME_OK(cp); - /* advance pointer to end of data */ - cp += strlen((char *)cp) +1; - - /* now save length */ - n = (cp - (char *)data); - break; - - case T_PX: - context = domain_ctx; - n = 0; - data[0] = '\0'; - cp = buf; - while (isdigit(*cp)) - n = n * 10 + (*cp++ - '0'); - /* catch bad values */ - if ((cp == buf) || (n > 65535)) - goto err; - cp = data; - PUTSHORT((u_int16_t)n, cp); - - if (!getword((char *)buf, sizeof(buf), fp, 0)) - goto err; - (void) strcpy((char *)cp, (char *)buf); - MAKENAME_OK(cp); - /* advance pointer to next field */ - cp += strlen((char *)cp) +1; - if (!getword((char *)buf, sizeof(buf), fp, 0)) - goto err; - (void) strcpy((char *)cp, (char *)buf); - MAKENAME_OK(cp); - /* advance pointer to end of data */ - cp += strlen((char *)cp) + 1; - - /* now save length */ - n = (cp - (char *)data); - break; - - case T_HINFO: - n = getcharstring(buf, data, type, 2, 2, fp, filename); - if (n == 0) - goto err; - break; - - case T_ISDN: - n = getcharstring(buf, data, type, 1, 2, fp, filename); - if (n == 0) - goto err; - break; - - case T_TXT: - n = getcharstring(buf, data, type, 1, 0, fp, filename); - if (n == 0) - goto err; - break; - - case T_X25: - n = getcharstring(buf, data, type, 1, 1, fp, filename); - if (n == 0) - goto err; - break; - - case T_NSAP: - n = inet_nsap_addr(buf, (u_char *)data, - sizeof data); - if (n == 0) - goto err; - endline(fp); - break; - case T_AAAA: - if (inet_pton(AF_INET6, buf, data) <= 0) - goto err; - n = IN6ADDRSZ; - endline(fp); - break; - - case T_KEY: { - /* The KEY record looks like this in the db file: - * Name Cl KEY Flags Proto Algid PublicKeyData - * where: - * Name,Cl per usual - * KEY RR type - * Flags 4 digit hex value (unsigned_16) - * Proto 8 bit u_int - * Algid 8 bit u_int - * PublicKeyData - * a string of base64 digits, - * skipping any embedded whitespace. - */ - u_int32_t al, pr; - int nk, klen; - char *expstart; - u_int expbytes, modbytes; - - i = 0; - data[i] = '\0'; - cp = data; - getmlword_nesting = 0; /* KLUDGE err recov. */ - /*>>> Flags (unsigned_16) */ - if (!getmlword((char*)buf, sizeof(buf), fp, 0) - ) { - SETERR("No flags field"); - goto err; - } - keyflags = wordtouint32(buf); - if (wordtouint32_error || 0xFFFF < keyflags) - goto err; - if (keyflags & KEYFLAG_RESERVED_BITMASK) { - SETERR("Reserved flag bits are set"); - goto err; - } - PUTSHORT(keyflags, cp); - - /*>>> Protocol (8-bit decimal) */ - if (!getmlword((char*)buf, sizeof(buf), fp, 0) - ) { - SETERR("No protocol field"); - goto err; - } - pr = wordtouint32(buf); - if (wordtouint32_error || 255 < pr) - goto err; - *cp++ = (u_char) pr; - - /*>>> Algorithm id (8-bit decimal) */ - if (!getmlword((char*)buf, sizeof(buf), fp, 0) - ) { - SETERR("No algorithm ID") - goto err; - } - al = wordtouint32(buf); - if (wordtouint32_error || - 0 == al || 255 == al || 255 < al) - goto err; - *cp++ = (u_char) al; - - /*>>> Public Key data is in BASE64. - * We don't care what algorithm it uses or what - * the internal structure of the BASE64 data is. - */ - if (!getallwords((char *)buf, MAXDATA, fp, 0)) - klen = 0; - else { - /* Convert from BASE64 to binary. */ - klen = b64_pton(buf, (u_char*)cp, - sizeof data - - (cp - (char *)data)); - if (klen < 0) - goto err; - } - - /* set total length */ - n = cp + klen - (char *)data; - - /* - * Now check for valid key flags & algs & etc, - * from the RFC. - */ - - if (keyflags & (KEYFLAG_ZONEKEY | KEYFLAG_IPSEC - | KEYFLAG_EMAIL)) - pr |= 1; /* A nonzero proto. */ - if (KEYFLAG_TYPE_NO_KEY == - (keyflags & KEYFLAG_TYPEMASK)) - nk = 1; /* No-key */ - else - nk = 0; /* have a key */ - if ((keyflags & KEYFLAG_ZONEKEY) && - (KEYFLAG_TYPE_CONF_ONLY == - (keyflags & KEYFLAG_TYPEMASK))) { - /* Zone key must have Authentication bit - set ogud@tis.com */ - SETERR("Zonekey needs authentication bit"); - goto err; - } - - if (al == 0 && nk == 0) { - SETERR("Key specified, but no alg"); - goto err; - } - if (al != 0 && pr == 0) { - SETERR("Alg specified, but no protos"); - goto err; - } - - if (nk == 1 && klen != 0) { - SETERR("No-key flags set but key fnd"); - goto err; - } - - if (nk == 0 && klen == 0) { - SETERR("Key type spec'd, but no key"); - goto err; - } - - /* Check algorithm-ID and key structure, for - the algorithm-ID's that we know about. */ - switch (al) { - case ALGORITHM_MD5RSA: - if (klen == 0) - break; - expstart = cp; - expbytes = *expstart++; - if (expbytes == 0) - GETSHORT(expbytes, expstart); - - if (expbytes < 1) { - SETERR("Exponent too short"); - goto err; - } - if (expbytes > - (MAX_MD5RSA_KEY_PART_BITS + 7) / 8 - ) { - SETERR("Exponent too long"); - goto err; - } - if (*expstart == 0) { - SETERR("Exponent starts w/ 0"); - goto err; - } - - modbytes = klen - - (expbytes + (expstart - cp)); - if (modbytes < - (MIN_MD5RSA_KEY_PART_BITS + 7) / 8 - ) { - SETERR("Modulus too short"); - goto err; - } - if (modbytes > - (MAX_MD5RSA_KEY_PART_BITS + 7) / 8 - ) { - SETERR("Modulus too long"); - goto err; - } - if (*(expstart+expbytes) == 0) { - SETERR("Modulus starts w/ 0"); - goto err; - } - break; - - case ALGORITHM_EXPIRE_ONLY: - if (klen != 0) { - SETERR( - "Key provided for expire-only algorithm"); - goto err; - } - break; - case ALGORITHM_PRIVATE_OID: - if (klen == 0) { - SETERR("No ObjectID in key"); - goto err; - } - break; - } - - endline(fp); /* flush the rest of the line */ - break; - } /*T_KEY*/ - - case T_SIG: - { - /* The SIG record looks like this in the db file: - Name Cl SIG RRtype Algid [OTTL] Texp Tsig Kfoot Signer Sig - - where: Name and Cl are as usual - SIG is a keyword - RRtype is a char string - ALGid is 8 bit u_int - OTTL is 32 bit u_int (optionally present) - Texp is YYYYMMDDHHMMSS - Tsig is YYYYMMDDHHMMSS - Kfoot is 16-bit unsigned decimal integer - Signer is a char string - Sig is 64 to 319 base-64 digits - A missing OTTL is detected by the magnitude of the Texp value - that follows it, which is larger than any u_int. - The Labels field in the binary RR does not appear in the - text RR. - - It's too crazy to run these pages of SIG code at the right - margin. I'm exdenting them for readability. - */ - int siglen; - u_int32_t al; - u_int32_t signtime, exptime, timetilexp; - u_int32_t origTTL; - time_t now; - - /* The TTL gets checked against the Original TTL, - and bounded by the signature expiration time, which - are both under the signature. We can't let TTL drift - based on the SOA record. If defaulted, fix it now. - (It's not clear to me why USE_MINIMUM isn't eliminated - before putting ALL RR's into the database. -gnu@toad.com) */ - if (ttl == USE_MINIMUM) - ttl = zp->z_minimum; - - i = 0; - data[i] = '\0'; - getmlword_nesting = 0; /* KLUDGE err recovery */ - - /* RRtype (char *) */ - if (!getmlword((char*)buf, sizeof(buf), fp, 0)) { - SETERR("SIG record doesn't specify type"); - goto err; - } - sig_type = sym_ston(__p_type_syms, (char *)buf, &success); - if (!success || sig_type == T_ANY) { - /* - * We'll also accept a numeric RR type, - * for signing RR types that this version - * of named doesn't yet understand. - * In the T_ANY case, we rely on wordtouint32 - * to fail when scanning the string "ANY". - */ - sig_type = wordtouint32 (buf); - if (wordtouint32_error || sig_type > 0xFFFF) { - SETERR("Unknown RR type in SIG record"); - goto err; - } - } - cp = &data[i]; - PUTSHORT((u_int16_t)sig_type, cp); - i += 2; - - /* Algorithm id (8-bit decimal) */ - if (!getmlword((char *)buf, sizeof(buf), fp, 0)) { - SETERR("Missing algorithm ID"); - goto err; - } - al = wordtouint32(buf); - if (0 == al || wordtouint32_error || 255 <= al) - goto err; - data[i] = (u_char) al; - i++; - - /* - * Labels (8-bit decimal) - * Not given in the file. Must compute. - */ - n = dn_count_labels(domain); - if (0 >= n || 255 < n) { - SETERR ("SIG label count invalid"); - goto err; - } - data[i] = (u_char) n; - i++; - - /* - * OTTL (optional u_int32_t) and - * Texp (u_int32_t date) - */ - if (!getmlword((char *)buf, sizeof(buf), fp, 0)) { - SETERR("OTTL and expiration time missing"); - goto err; - } - /* - * See if OTTL is missing and this is a date. - * This relies on good, silent error checking - * in datetosecs. - */ - exptime = datetosecs(buf, &dateerror); - if (!dateerror) { - /* Output TTL as OTTL */ - origTTL = ttl; - cp = &data[i]; - PUTLONG (origTTL, cp); - i += 4; - } else { - /* Parse and output OTTL; scan TEXP */ - origTTL = wordtouint32(buf); - if (0 >= origTTL || wordtouint32_error || - (origTTL > 0x7fffffff)) - goto err; - cp = &data[i]; - PUTLONG(origTTL, cp); - i += 4; - if (!getmlword((char *)buf, sizeof(buf), fp, 0)) { - SETERR ("Expiration time missing"); - goto err; - } - exptime = datetosecs(buf, &dateerror); - } - if (dateerror || exptime > 0x7fffffff || exptime <= 0) { - SETERR("Invalid expiration time"); - goto err; - } - cp = &data[i]; - PUTLONG(exptime, cp); - i += 4; - - /* Tsig (u_int32_t) */ - if (!getmlword((char *)buf, sizeof(buf), fp, 0)) { - SETERR("Missing signature time"); - goto err; - } - signtime = datetosecs(buf, &dateerror); - if (0 == signtime || dateerror) { - SETERR("Invalid signature time"); - goto err; - } - cp = &data[i]; - PUTLONG(signtime, cp); - i += 4; - - /* Kfootprint (unsigned_16) */ - if (!getmlword((char *)buf, sizeof(buf), fp, 0)) { - SETERR("Missing key footprint"); - goto err; - } - n = wordtouint32(buf); - if (wordtouint32_error || n >= 0x0ffff) { - SETERR("Invalid key footprint"); - goto err; - } - cp = &data[i]; - PUTSHORT((u_int16_t)n, cp); - i += 2; - - /* Signer's Name */ - if (!getmlword((char*)buf, sizeof(buf), fp, 0)) { - SETERR("Missing signer's name"); - goto err; - } - cp = &data[i]; - strcpy(cp,buf); - context = domain_ctx; - MAKENAME_OK(cp); - i += strlen(cp) + 1; - - /* - * Signature (base64 of any length) - * We don't care what algorithm it uses or what - * the internal structure of the BASE64 data is. - */ - if (!getallwords((char *)buf, sizeof(buf), fp, 0)) { - siglen = 0; - } else { - cp = &data[i]; - siglen = b64_pton(buf, (u_char*)cp, sizeof data - i); - if (siglen < 0) - goto err; - } - - /* set total length and we're done! */ - n = i + siglen; - - /* - * Check signature time, expiration, and adjust TTL. Note - * that all time values are in GMT (UTC), *not* local time. - */ - - now = time (0); - - /* Don't let bogus name servers increase the signed TTL */ - if (ttl > origTTL) { - SETERR("TTL is greater than signed original TTL"); - goto err; - } - - /* Don't let bogus signers "sign" in the future. */ - if (signtime > now) { - SETERR("signature time is in the future"); - goto err; - } - - /* Ignore received SIG RR's that are already expired. */ - if (exptime <= now) { - SETERR("expiration time is in the past"); - goto err; - } - - /* Lop off the TTL at the expiration time. */ - timetilexp = exptime - now; - if (timetilexp < ttl) { - dprintf(1, (ddt, - "shrinking expiring %s SIG TTL from %d to %d\n", - p_secstodate(exptime), ttl, timetilexp)); - ttl = timetilexp; - } - - /* - * Check algorithm-ID and key structure, for - * the algorithm-ID's that we know about. - */ - switch (al) { - case ALGORITHM_MD5RSA: - if (siglen == 0) { - SETERR("No key for RSA algorithm"); - goto err; - } - if (siglen < 1) { - SETERR("Signature too short"); - goto err; - } - if (siglen > (MAX_MD5RSA_KEY_PART_BITS + 7) / 8) { - SETERR("Signature too long"); - goto err; - } - /* We rely on cp from parse */ - if (*cp == 0) { - SETERR("Signature starts with zeroes"); - goto err; - } - break; - - case ALGORITHM_EXPIRE_ONLY: - if (siglen != 0) { - SETERR( - "Signature supplied to expire-only algorithm" - ); - goto err; - } - break; - case ALGORITHM_PRIVATE_OID: - if (siglen == 0) { - SETERR("No ObjectID in key"); - goto err; - } - break; - } - - endline(fp); /* flush the rest of the line */ - - break; /* Accept this RR. */ - } - -#ifdef LOC_RR - case T_LOC: - cp = buf + (n = strlen(buf)); - *cp = ' '; - cp++; - while ((i = getc(fp), *cp = i, i != EOF) - && *cp != '\n' - && (n < MAXDATA)) { - cp++; n++; - } - if (*cp == '\n') /* leave \n for getword */ - ungetc(*cp, fp); - *cp = '\0'; - /* now process the whole line */ - n = loc_aton(buf, (u_char *)data); - if (n == 0) - goto err; - endline(fp); - break; -#endif /* LOC_RR */ -#ifdef ALLOW_T_UNSPEC - case T_UNSPEC: - { - int rcode; - fgets(buf, sizeof(buf), fp); - dprintf(1, (ddt, "loading T_UNSPEC\n")); - if (rcode = atob(buf, - strlen((char*)buf), - data, sizeof data, - &n)) { - if (rcode == CONV_OVERFLOW) { - errs++; - syslog(LOG_INFO, - "Load T_UNSPEC: input buffer overflow"); - } else { - errs++; - syslog(LOG_INFO, - "Load T_UNSPEC: Data in bad atob format"); - } - } - } - break; -#endif /* ALLOW_T_UNSPEC */ - - default: - goto err; - } -#ifndef PURGE_ZONE -#ifdef STUBS - if (type == T_SOA && zp->z_type == Z_STUB) - continue; -#endif -#endif -#ifdef NO_GLUE - /* - * Ignore data outside the zone. - */ - if (zp->z_type != Z_CACHE && - !samedomain(domain, zp->z_origin)) - { - syslog(LOG_INFO, - "%s:%d: data \"%s\" outside zone \"%s\" (ignored)", - filename, lineno, domain, zp->z_origin); - continue; - } -#endif /*NO_GLUE*/ - dp = savedata(class, type, (u_int32_t)ttl, - (u_char *)data, (int)n); - dp->d_zone = zp - zones; - dp->d_flags = dataflags; - dp->d_cred = DB_C_ZONE; - dp->d_clev = clev; - if ((c = db_update(domain, dp, dp, dbflags, - (dataflags & DB_F_HINT) - ? fcachetab - : hashtab)) - != OK) { -#ifdef DEBUG - if (debug && (c != DATAEXISTS)) - fprintf(ddt, "update failed %s %d\n", - domain, type); -#endif - db_free(dp); - } else { - rrcount++; - } - continue; - - case ERROR: - break; - } - err: - errs++; - syslog(LOG_NOTICE, "%s: line %d: database format error (%s)", - filename, empty_token ? (lineno - 1) : lineno, buf); - if (!empty_token) - endline(fp); - } - (void) my_fclose(fp); - lineno = slineno; - if (!def_domain) { - if (didinclude) { - zp->z_flags |= Z_INCLUDE; - zp->z_ftime = 0; - } else - zp->z_ftime = sb.st_mtime; - zp->z_lastupdate = sb.st_mtime; - if (zp->z_type != Z_CACHE) { - const char *msg = NULL; - - if (read_soa == 0) - msg = "no SOA RR found"; - else if (read_soa != 1) - msg = "multiple SOA RRs found"; - else if (read_ns == 0) - msg = "no NS RRs found at zone top"; - else if (!rrcount) - msg = "no relevant RRs found"; - if (msg != NULL) { - errs++; - syslog(LOG_WARNING, - "Zone \"%s\" (file %s): %s", - zp->z_origin, filename, msg); - } - } - } -#ifdef SECURE_ZONES - build_secure_netlist(zp); -#endif - if (!def_domain) - syslog(errs ? LOG_WARNING : LOG_INFO, - "%s zone \"%s\" %s (serial %lu)", - zoneTypeString(zp), zp->z_origin, - errs ? "rejected due to errors" : "loaded", - (u_long)zp->z_serial); - if (errs) { - zp->z_flags |= Z_DB_BAD; - zp->z_ftime = 0; - } -#ifdef BIND_NOTIFY - /* XXX: this needs to be delayed, both according to the spec, and - * because the metadata needed by sysnotify() (and its sysquery()) - * could be in other zones that we (at startup) havn't loaded yet. - */ - if (!errs && !def_domain && - (zp->z_type == Z_PRIMARY || zp->z_type == Z_SECONDARY)) - sysnotify(zp->z_origin, zp->z_class, T_SOA); -#endif - return (errs); -} - -static int -gettoken(fp, src) - register FILE *fp; - const char *src; -{ - register int c; - char op[32]; - - for (;;) { - c = getc(fp); - top: - switch (c) { - case EOF: - return (EOF); - - case '$': - if (getword(op, sizeof(op), fp, 0)) { - if (!strcasecmp("include", op)) - return (INCLUDE); - if (!strcasecmp("origin", op)) - return (ORIGIN); - } - syslog(LOG_NOTICE, - "%s: line %d: Unknown $ option: $%s\n", - src, lineno, op); - return (ERROR); - - case ';': - while ((c = getc(fp)) != EOF && c != '\n') - ; - goto top; - - case ' ': - case '\t': - return (CURRENT); - - case '.': - return (DOT); - - case '@': - return (AT); - - case '\n': - lineno++; - continue; - - default: - (void) ungetc(c, fp); - return (DNAME); - } - } -} - -/* int - * getword(buf, size, fp, preserve) - * get next word, skipping blanks & comments. - * '\' '\n' outside of "quotes" is considered a blank. - * parameters: - * buf - destination - * size - of destination - * fp - file to read from - * preserve - should we preserve \ before \\ and \.? - * return value: - * 0 = no word; perhaps EOL or EOF; lineno was incremented. - * 1 = word was read - */ -int -getword(buf, size, fp, preserve) - char *buf; - int size; - FILE *fp; - int preserve; -{ - register char *cp = buf; - register int c, spaceok; - - empty_token = 0; /* XXX global side effect. */ - while ((c = getc(fp)) != EOF) { - if (c == ';') { - /* Comment. Skip to end of line. */ - while ((c = getc(fp)) != EOF && c != '\n') - NULL; - c = '\n'; - } - if (c == '\n') { - /* - * Unescaped newline. It's a terminator unless we're - * already midway into a token. - */ - if (cp != buf) - ungetc(c, fp); - else - lineno++; - break; - } - if (c == '"') { - /* "Quoted string." Gather the whole string here. */ - while ((c = getc(fp)) != EOF && c!='"' && c!='\n') { - if (c == '\\') { - if ((c = getc(fp)) == EOF) - c = '\\'; - if (preserve && - (c == '\\' || c == '.')) { - if (cp >= buf+size-1) - break; - *cp++ = '\\'; - } - if (c == '\n') - lineno++; - } - if (cp >= buf+size-1) - break; - *cp++ = c; - } - /* - * Newline string terminators are - * not token terminators. - */ - if (c == '\n') { - lineno++; - break; - } - /* Sample following character, check for terminator. */ - if ((c = getc(fp)) != EOF) - ungetc(c, fp); - if (c == EOF || isspace(c)) { - *cp = '\0'; - return (1); - } - continue; - } - spaceok = 0; - if (c == '\\') { - /* Do escape processing. */ - if ((c = getc(fp)) == EOF) - c = '\\'; - if (preserve && (c == '\\' || c == '.')) { - if (cp >= buf+size-1) - break; - *cp++ = '\\'; - } - if (c == ' ' || c == '\t') - spaceok++; - } - if (isspace(c) && !spaceok) { - /* Blank of some kind. Skip run. */ - while (isspace(c = getc(fp)) && c != '\n') - NULL; - ungetc(c, fp); - /* Blank means terminator if the token is nonempty. */ - if (cp != buf) /* Trailing whitespace */ - break; - continue; /* Leading whitespace */ - } - if (cp >= buf+size-1) - break; - *cp++ = (char)c; - } - *cp = '\0'; - if (cp == buf) - empty_token = 1; - return (cp != buf); -} - -/* Get multiline words. Same parameters as getword. Handles any - number of leading ('s or )'s in the words it sees. - FIXME: We kludge recognition of ( and ) for multiline input. - Each paren must appear at the start of a (blank-separated) word, - which is particularly counter-intuitive for ). Good enough for now, - until Paul rewrites the parser. -*/ -static int -getmlword(buf, size, fp, preserve) - char *buf; - int size; - FILE *fp; - int preserve; -{ - char *p; - - do { - while (!getword (buf, size, fp, preserve)) { - /* No more words on this line. See if doing the - multiline thing. */ - if (!getmlword_nesting) { /* Nope... */ - ungetc('\n', fp); /* Push back newline */ - lineno--; /* Unbump the lineno */ - empty_token = 0; /* Undo this botch */ - return 0; - } - if (feof(fp) || ferror(fp)) - return 0; /* Error, no terminating ')' */ - /* Continue reading til we get a word... */ - } - while ('(' == *buf) { - /* Word starts with paren. Multiline mode. - Move the rest of the word down over the paren. */ - getmlword_nesting++; - p = buf; - while (0 != (p[0]=p[1])) p++; - } - while (')' == *buf) { - getmlword_nesting--; - p = buf; - while (0 != (p[0]=p[1])) p++; - } - } while (buf[0] == 0); /* loop til we get a non-( non-) word */ - - return 1; /* Got a word... */ -} - -/* Get all the remaining words on a line, concatenated into one big - long (not too long!) string, with the whitespace squeezed out. - This routine, like getword(), does not swallow the newline if words seen. - This routine, unlike getword(), never swallows the newline if no words. - Parameters are the same as getword(). Result is: - 0 got no words at all - 1 got one or more words - -1 got too many words, they don't all fit; or missing close paren -*/ -static int -getallwords(buf, size, fp, preserve) - char *buf; - int size; - FILE *fp; - int preserve; -{ - char *runningbuf = buf; - int runningsize = size; - int len; - - while (runningsize > 0) { - if (!getmlword (runningbuf, runningsize, fp, preserve)) { - return runningbuf!=buf; /* 1 or 0 */ - } - len = strlen(runningbuf); - runningbuf += len; - runningsize -= len; - } - return -1; /* Error, String too long */ -} - -/* -From: kagotani@cs.titech.ac.jp -Message-Id: <9007040716.AA26646@saeko.cs.titech.ac.jp> -Subject: named bug report and fix -Date: Wed, 04 Jul 90 16:16:52 JST - -I found a bug in the BIND source code. Named with this bug parses -the serial_no field of SOA records incorrectly. For example: - expression internal - in files expression I expect - 1. 1000 10000 - 1.2 10002 10002 - 1.23 100023 10023 - 2.3 20003 20003 -Especially I can not accept that "2.3" is treated as if it is -smaller than "1.23" in their internal expressions. - -[ if you define SENSIBLE_DOTS in ../conf/options.h, you get - m. kagotani's expected behaviour. this is NOT compatible - with pre-4.9 versions of BIND. --vix ] -*/ - -int -getnum(fp, src, opt) - FILE *fp; - const char *src; - int opt; -{ - register int c, n; - int seendigit = 0; - int seendecimal = 0; - int m = 0; - int allow_dots = 0; - - getnum_error = 0; -#ifdef DOTTED_SERIAL - if (opt & GETNUM_SERIAL) - allow_dots++; -#endif - for (n = 0; (c = getc(fp)) != EOF; ) { - if (isspace(c)) { - if (c == '\n') - lineno++; - if (seendigit) - break; - continue; - } - if (c == ';') { - while ((c = getc(fp)) != EOF && c != '\n') - ; - if (c == '\n') - lineno++; - if (seendigit) - break; - continue; - } - if (getnum_error) - continue; - if (!isdigit(c)) { - if (c == ')' && seendigit) { - (void) ungetc(c, fp); - break; - } - if (seendigit && (opt & GETNUM_SCALED) && - strchr("KkMmGg", c) != NULL) { - switch (c) { - case 'K': case 'k': - n *= 1024; - break; - case 'M': case 'm': - n *= (1024 * 1024); - break; - case 'G': case 'g': - n *= (1024 * 1024 * 1024); - break; - } - break; - } - if (seendecimal || c != '.' || !allow_dots) { - syslog(LOG_NOTICE, "%s:%d: expected a number", - src, lineno); - getnum_error = 1; - } else { - if (!seendigit) - n = 1; -#ifdef SENSIBLE_DOTS - n *= 10000; -#else - n *= 1000; -#endif - seendigit = 1; - seendecimal = 1; - } - continue; - } -#ifdef SENSIBLE_DOTS - if (seendecimal) - m = m * 10 + (c - '0'); - else - n = n * 10 + (c - '0'); -#else - n = n * 10 + (c - '0'); -#endif - seendigit = 1; - } - if (getnum_error) - return (0); - if (m > 9999) { - syslog(LOG_INFO, - "%s:%d: number after the decimal point exceeds 9999", - src, lineno); - getnum_error = 1; - return (0); - } - if (seendecimal) { - syslog(LOG_INFO, - "%s:%d: decimal serial number interpreted as %d", - src, lineno, n+m); - } - return (n + m); -} - -static int -getnonblank(fp, src) - FILE *fp; - const char *src; -{ - register int c; - - while ( (c = getc(fp)) != EOF ) { - if (isspace(c)) { - if (c == '\n') - lineno++; - continue; - } - if (c == ';') { - while ((c = getc(fp)) != EOF && c != '\n') - ; - if (c == '\n') - lineno++; - continue; - } - return(c); - } - syslog(LOG_INFO, "%s: line %d: unexpected EOF", src, lineno); - return (EOF); -} - -/* - * Take name and fix it according to following rules: - * "." means root. - * "@" means current origin. - * "name." means no changes. - * "name" means append origin. - */ -static void -makename(name, origin) - char *name; - const char *origin; -{ - int n; - - if (origin[0] == '.') - origin++; - n = strlen(name); - if (n == 1) { - if (name[0] == '.') { - name[0] = '\0'; - return; - } - if (name[0] == '@') { - (void) strcpy(name, origin); - return; - } - } - if (n > 0) { - if (name[n - 1] == '.') - name[n - 1] = '\0'; - else if (origin[0] != '\0') { - name[n] = '.'; - (void) strcpy(name + n + 1, origin); - } - } -} - -static int -makename_ok(name, origin, class, transport, context, owner, filename, lineno) - char *name; - const char *origin; - int class; - enum transport transport; - enum context context; - const char *owner; - const char *filename; - int lineno; -{ - int ret = 1; - - makename(name, origin); - if (!ns_nameok(name, class, transport, context, owner, inaddr_any)) { - syslog(LOG_INFO, "%s:%d: database naming error\n", - filename, lineno); - ret = 0; - } - return (ret); -} - -void -endline(fp) - register FILE *fp; -{ - register int c; - - while ((c = getc(fp)) != '\0') { - if (c == '\n') { - (void) ungetc(c,fp); - break; - } else if (c == EOF) { - break; - } - } -} - -#define MAXPORT 1024 -#define MAXLEN 24 - -static int -getprotocol(fp, src) - FILE *fp; - const char *src; -{ - int k; - char b[MAXLEN]; - - (void) getword(b, sizeof(b), fp, 0); - - k = protocolnumber(b); - if (k == -1) - syslog(LOG_INFO, "%s: line %d: unknown protocol: %s.", - src, lineno, b); - return(k); -} - -static int -getservices(n, data, fp, src) - int n; - char *data; - FILE *fp; - const char *src; -{ - int j, ch; - int k; - int maxl; - int bracket; - char b[MAXLEN]; - char bm[MAXPORT/8]; - - for (j = 0; j < MAXPORT/8; j++) - bm[j] = 0; - maxl = 0; - bracket = 0; - while (getword(b, sizeof(b), fp, 0) || bracket) { - if (feof(fp) || ferror(fp)) - break; - if (strlen(b) == 0) - continue; - if ( b[0] == '(') { - bracket++; - continue; - } - if ( b[0] == ')') { - bracket = 0; - while ((ch = getc(fp)) != EOF && ch != '\n') - ; - if (ch == '\n') - lineno++; - break; - } - k = servicenumber(b); - if (k == -1) { - syslog(LOG_INFO, - "%s: line %d: Unknown service '%s'", - src, lineno, b); - continue; - } - if ((k < MAXPORT) && (k)) { - bm[k/8] |= (0x80>>(k%8)); - if (k > maxl) - maxl=k; - } - else { - syslog(LOG_INFO, - "%s: line %d: port no. (%d) too big", - src, lineno, k); - dprintf(1, (ddt, - "%s: line %d: port no. (%d) too big\n", - src, lineno, k)); - } - } - if (bracket) - syslog(LOG_INFO, "%s: line %d: missing close paren", - src, lineno); - maxl = maxl/8+1; - bcopy(bm, data+n, maxl); - return (maxl+n); -} - -/* get_netlist(fp, netlistp, allow) - * get list of nets from 'fp', put on *netlistp, 'allow' controls - * whether hosts, nets, or both shall be accepted without warnings. - * (note that they are always accepted; 'allow' just controls the - * warnings.) - */ -void -get_netlist(fp, netlistp, allow, print_tag) - FILE *fp; - struct netinfo **netlistp; - int allow; - char *print_tag; -{ - struct netinfo *ntp, **end; - char buf[MAXDNAME], *maskp; - struct in_addr ina; - - for (end = netlistp; *end; end = &(**end).next) - ; - ntp = NULL; - dprintf(1, (ddt, "get_netlist(%s)", print_tag)); - while (getword(buf, sizeof(buf), fp, 0)) { - if (strlen(buf) == 0) - break; - if ((maskp = strchr(buf, '&')) != NULL) - *maskp++ = '\0'; - dprintf(1, (ddt," %s", buf)); - if (!ntp) { - ntp = (struct netinfo *)malloc(sizeof(struct netinfo)); - if (!ntp) - panic(errno, "malloc(netinfo)"); - } - if (!inet_aton(buf, &ntp->my_addr)) { - syslog(LOG_INFO, "%s contains bogus element (%s)", - print_tag, buf); - continue; - } - if (maskp) { - if (!inet_aton(maskp, &ina)) { - syslog(LOG_INFO, - "%s element %s has bad mask (%s)", - print_tag, buf, maskp); - continue; - } - } else { - if (allow & ALLOW_HOSTS) - ina.s_addr = 0xffffffff; /* "exact" */ - else - ina.s_addr = net_mask(ntp->my_addr); - } - ntp->next = NULL; - ntp->mask = ina.s_addr; - ntp->addr = ntp->my_addr.s_addr & ntp->mask; - - /* Check for duplicates */ - if (addr_on_netlist(ntp->my_addr, *netlistp)) - continue; - - if (ntp->addr != ntp->my_addr.s_addr) { - ina.s_addr = ntp->addr; - syslog(LOG_INFO, - "%s element (%s) mask problem (%s)", - print_tag, buf, inet_ntoa(ina)); - } - - *end = ntp; - end = &ntp->next; - ntp = NULL; - } - if (ntp) - free((char *)ntp); - - dprintf(1, (ddt, "\n")); -#ifdef DEBUG - if (debug > 2) - 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 x%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 -} - -struct netinfo * -addr_on_netlist(addr, netlist) - struct in_addr addr; - struct netinfo *netlist; -{ - u_int32_t a = addr.s_addr; - struct netinfo *t; - - for (t = netlist; t != NULL; t = t->next) - if (t->addr == (a & t->mask)) - return t; - return NULL; -} - -int -position_on_netlist(addr, netlist) - struct in_addr addr; - struct netinfo *netlist; -{ - u_int32_t a = addr.s_addr; - struct netinfo *t; - int position = 0; - - for (t = netlist; t != NULL; t = t->next) - if (t->addr == (a & t->mask)) - break; - else - position++; - return position; -} - -void -free_netlist(netlistp) - struct netinfo **netlistp; -{ - register struct netinfo *ntp, *next; - - for (ntp = *netlistp; ntp != NULL; ntp = next) { - next = ntp->next; - free((char *)ntp); - } - *netlistp = NULL; -} - -/* - * Converts a word to a u_int32_t. Error if any non-numeric - * characters in the word, except leading or trailing white space. - */ -static u_int32_t -wordtouint32(buf) - char *buf; -{ - u_long result; - u_int32_t res2; - char *bufend; - - wordtouint32_error = 0; - result = strtoul(buf, &bufend, 0); - if (bufend == buf) - wordtouint32_error = 1; - else - while ('\0' != *bufend) { - if (isspace(*bufend)) - bufend++; - else { - wordtouint32_error = 1; - break; - } - } - /* Check for truncation between u_long and u_int32_t */ - res2 = result; - if (res2 != result) - wordtouint32_error = 1; - return (res2); -} - - -/* - * Parse part of a date. Set error flag if any error. - * Don't reset the flag if there is no error. - */ -static int -datepart(buf, size, min, max, errp) - char *buf; - int size, min, max, *errp; -{ - int result = 0; - int i; - - for (i = 0; i < size; i++) { - if (!isdigit(buf[i])) - *errp = 1; - result = (result * 10) + buf[i] - '0'; - } - if (result < min) - *errp = 1; - if (result > max) - *errp = 1; - return (result); -} - - -/* Convert a date in ASCII into the number of seconds since - 1 January 1970 (GMT assumed). Format is yyyymmddhhmmss, all - digits required, no spaces allowed. */ - -static u_int32_t -datetosecs(cp, errp) - char *cp; - int *errp; -{ - struct tm time; - u_int32_t result; - int mdays, i; - static const int days_per_month[12] = - {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - - if (strlen(cp) != 14) { - *errp = 1; - return 0; - } - *errp = 0; - - bzero((char *)&time, sizeof time); - time.tm_year = datepart(cp + 0, 4, 1990, 9999, errp) - 1900; - time.tm_mon = datepart(cp + 4, 2, 01, 12, errp) - 1; - time.tm_mday = datepart(cp + 6, 2, 01, 31, errp); - time.tm_hour = datepart(cp + 8, 2, 00, 23, errp); - time.tm_min = datepart(cp + 10, 2, 00, 59, errp); - time.tm_sec = datepart(cp + 12, 2, 00, 59, errp); - if (*errp) /* Any parse errors? */ - return (0); - - /* - * OK, now because timegm() is not available in all environments, - * we will do it by hand. Roll up sleeves, curse the gods, begin! - */ - -#define SECS_PER_DAY ((u_int32_t)24*60*60) -#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) - - result = time.tm_sec; /* Seconds */ - result += time.tm_min * 60; /* Minutes */ - result += time.tm_hour * (60*60); /* Hours */ - result += (time.tm_mday - 1) * SECS_PER_DAY; /* Days */ - - /* Months are trickier. Look without leaping, then leap */ - mdays = 0; - for (i = 0; i < time.tm_mon; i++) - mdays += days_per_month[i]; - result += mdays * SECS_PER_DAY; /* Months */ - if (time.tm_mon > 1 && isleap (1900+time.tm_year)) - result += SECS_PER_DAY; /* Add leapday for this year */ - - /* First figure years without leapdays, then add them in. */ - /* The loop is slow, FIXME, but simple and accurate. */ - result += (time.tm_year - 70) * (SECS_PER_DAY*365); /* Years */ - for (i = 70; i < time.tm_year; i++) - if (isleap (1900+i)) - result += SECS_PER_DAY; /* Add leapday for prev year */ - - return (result); -} - - -#define MAXCHARSTRING 255 - -static int -getcharstring(buf, data, type, minfields, maxfields, fp, src) - char *buf; - char *data; - int type; - int minfields; - int maxfields; - FILE *fp; - const char *src; -{ - int nfield = 0, done = 0, n = 0, i; - char *b = buf; - - do { - nfield++; - i = strlen(buf); -#ifdef ALLOW_LONG_TXT_RDATA - b = buf; - if (type == T_TXT || type == T_X25) { - while (i > MAXCHARSTRING - && n + MAXCHARSTRING + 1 < MAXDATA) { - data[n] = MAXCHARSTRING; - bcopy(b, data + n + 1, MAXCHARSTRING); - n += MAXCHARSTRING + 1; - b += MAXCHARSTRING; - i -= MAXCHARSTRING; - } - } -#endif /* ALLOW_LONG_TXT_RDATA */ - if (i > MAXCHARSTRING) { - syslog(LOG_INFO, - "%s: line %d: RDATA field %d too long", - src, lineno, nfield); - return (0); - } - if (n + i + 1 > MAXDATA) { - syslog(LOG_INFO, - "%s: line %d: total RDATA too long", - src, lineno); - return (0); - } - data[n] = i; - bcopy(b, data + n + 1, (int)i); - n += i + 1; - done = (maxfields && nfield >= maxfields); - } while (!done && getword(buf, MAXDATA, fp, 0)); - - if (nfield < minfields) { - syslog(LOG_INFO, - "%s: line %d: expected %d RDATA fields, only saw %d", - src, lineno, minfields, nfield); - return (0); - } - - if (done) - endline(fp); - - return (n); -} diff --git a/contrib/bind/named/db_lookup.c b/contrib/bind/named/db_lookup.c deleted file mode 100644 index fce3ffdbc785..000000000000 --- a/contrib/bind/named/db_lookup.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include - -#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); -} diff --git a/contrib/bind/named/db_reload.c b/contrib/bind/named/db_reload.c deleted file mode 100644 index 640f5bd5e5f7..000000000000 --- a/contrib/bind/named/db_reload.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include - -#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 diff --git a/contrib/bind/named/db_save.c b/contrib/bind/named/db_save.c deleted file mode 100644 index 277b008532fe..000000000000 --- a/contrib/bind/named/db_save.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include -#include - -#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); -} diff --git a/contrib/bind/named/db_secure.c b/contrib/bind/named/db_secure.c deleted file mode 100644 index db577089f288..000000000000 --- a/contrib/bind/named/db_secure.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include - -#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*/ diff --git a/contrib/bind/named/db_update.c b/contrib/bind/named/db_update.c deleted file mode 100644 index b74ac5abcb67..000000000000 --- a/contrib/bind/named/db_update.c +++ /dev/null @@ -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 -#include - -#include -#include -#include -#include -#include -#include -#include - -#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); - } -} diff --git a/contrib/bind/named/dmalloc.c b/contrib/bind/named/dmalloc.c deleted file mode 100644 index 03593e2c1c26..000000000000 --- a/contrib/bind/named/dmalloc.c +++ /dev/null @@ -1,315 +0,0 @@ -/* dmalloc - debugging layer on top of malloc - * vix 25mar92 [fixed bug in round-up calcs in alloc()] - * vix 24mar92 [added size calcs, improved printout] - * vix 22mar92 [original work] - * - * $Id: dmalloc.c,v 8.3 1996/05/17 09:10:46 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-- - */ - -#include -#include -#include "../conf/portability.h" -#include "../conf/options.h" - -#ifdef DMALLOC - -#define TRUE 1 -#define FALSE 0 -typedef unsigned bool; - -#define MAX_MEMORY 65536 /* must fit in typeof(datum.size) */ -#define MAX_CALLERS 256 /* must be **2 */ - -typedef struct caller { - struct caller *next; - struct filenam *file; - struct calltab *frees; - unsigned line; - unsigned calls; - unsigned blocks; - unsigned bytes; -} caller; - -typedef struct filenam { - struct filenam *next; - char *name; -} filenam; - -typedef struct calltab { - struct caller *callers[MAX_CALLERS]; -} calltab; - -typedef struct datum { - unsigned size; /* size of malloc'd item */ - unsigned caller; /* offset into memory[] */ - /* user data follows */ -} datum; - -static char memory[MAX_MEMORY]; -static char *nextmem = memory; -static char *alloc(size) unsigned size; { - char *thismem = nextmem; - int oddness = (size % sizeof(char*)); - if (oddness) - size += (sizeof(char*) - oddness); - nextmem += size; - if (nextmem >= &memory[MAX_MEMORY]) { - fprintf(stderr, "dmalloc.alloc: out of mem\n"); - kill(0, SIGBUS); - } - return thismem; - } - -static filenam *Files; -static calltab Callers; - -/*--------------------------------------------------- imports - */ - -#undef malloc -#undef calloc -#undef realloc -#undef free - -char *malloc(), *calloc(), *realloc(); - -#if defined(sun) -int free(); -#else -void free(); -#endif - -/*--------------------------------------------------- private - */ - -#define STR_EQ(l,r) (((l)[0] == (r)[0]) && !strcmp(l, r)) - -static filenam * -findFile(file, addflag) - char *file; - bool addflag; -{ - filenam *f; - - for (f = Files; f; f = f->next) - if (STR_EQ(file, f->name)) - return f; - if (!addflag) - return NULL; - f = (filenam*) alloc(sizeof(filenam)); - f->next = Files; - Files = f; - f->name = alloc(strlen(file) + 1); - strcpy(f->name, file); - return f; -} - -static caller * -findCaller(ctab, file, line, addflag) - calltab *ctab; - char *file; - unsigned line; - bool addflag; -{ - unsigned hash = line & (MAX_CALLERS - 1); - caller *c; - - for (c = ctab->callers[hash]; c; c = c->next) - if ((c->line == line) && STR_EQ(c->file->name, file)) - return c; - if (!addflag) - return NULL; - c = (caller*) alloc(sizeof(caller)); - c->next = ctab->callers[hash]; - c->file = findFile(file, TRUE); - c->line = line; - c->calls = 0; - c->frees = (calltab *) alloc(sizeof(calltab)); - ctab->callers[hash] = c; - return c; -} - -/*--------------------------------------------------- public - */ - -char * -dmalloc(file, line, size) - char *file; - unsigned line; - unsigned size; -{ - caller *c; - datum *d; - - c = findCaller(&Callers, file, line, TRUE); - d = (datum *) malloc(sizeof(datum) + size); - if (!d) - return (NULL); - d->size = size; - d->caller = ((char *)c) - memory; - c->calls++; - c->blocks++; - c->bytes += size; - return (char *) (d+1); -} - -void -dfree(file, line, ptr) - char *file; - unsigned line; - char *ptr; -{ - caller *c, *a; - datum *d; - - d = (datum *) ptr; d--; - a = (caller *) (memory + d->caller); - a->bytes -= d->size; - a->blocks--; - c = findCaller(a->frees, file, line, TRUE); - c->calls++; - free((char*) d); -} - -char * -dcalloc(file, line, nelems, elsize) - char *file; - unsigned line; - unsigned nelems, elsize; -{ - unsigned size = (nelems * elsize); - char *ptr; - - ptr = dmalloc(file, line, size); - if (ptr) - bzero(ptr, size); - return ptr; -} - -char * -drealloc(file, line, ptr, size) - char *file; - unsigned line; - char *ptr; - unsigned size; -{ - caller *c, *a; - datum *d; - - d = (datum *) ptr; d--; - /* fix up stats from allocation */ - a = (caller *) (memory + d->caller); - a->bytes -= d->size; - a->blocks--; - /* we are a "freer" of this allocation */ - c = findCaller(a->frees, file, line, TRUE); - c->calls++; - /* get new allocation and stat it */ - c = findCaller(&Callers, file, line, TRUE); - d = (datum *) realloc((char *) d, sizeof(datum) + size); - d->size = size; - d->caller = ((char *)c) - memory; - c->calls++; - c->blocks++; - c->bytes += size; - return (char *) (d+1); -} - -static void -dmalloccallers(outf, prefix, ctab) - FILE *outf; - char *prefix; - calltab *ctab; -{ - /* this bizarre logic is to print all of a file's entries together */ - filenam *f; - - for (f = Files; f; f = f->next) { - int i; - - for (i = MAX_CALLERS-1; i >= 0; i--) { - caller *c; - - for (c = ctab->callers[i]; c; c = c->next) { - if (f != c->file) - continue; - fprintf(outf, "%s\"%s\":%u calls=%u", - prefix, c->file->name, c->line, - c->calls); - if (c->blocks || c->bytes) - fprintf(outf, " blocks=%u bytes=%u", - c->blocks, c->bytes); - fputc('\n', outf); - if (c->frees) - dmalloccallers(outf, - "\t\t", c->frees); - } - } - } -} - -void -dmallocstats(outf) - FILE *outf; -{ - fprintf(outf, "dallocstats [ private mem used=%u, avail=%u ]\n", - nextmem - memory, &memory[MAX_MEMORY] - nextmem); - dmalloccallers(outf, "\t", &Callers); -} - -#endif /*DMALLOC*/ diff --git a/contrib/bind/named/dmalloc.h b/contrib/bind/named/dmalloc.h deleted file mode 100644 index 9d0b44a91eeb..000000000000 --- a/contrib/bind/named/dmalloc.h +++ /dev/null @@ -1,68 +0,0 @@ -/* dmalloc - debugging layer on top of malloc - * vix 22mar92 [written] - * - * $Id: dmalloc.h,v 8.1 1994/12/15 06:24:14 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-- - */ - -#define malloc(s) dmalloc(__FILE__, __LINE__, s) -#define free(p) dfree(__FILE__, __LINE__, p) -#define calloc(n, s) dcalloc(__FILE__, __LINE__, n, s) -#define realloc(p, s) drealloc(__FILE__, __LINE__, p, s) - -char *dmalloc(), *dcalloc(), *drealloc(); -void dfree(), dmallocstats(); diff --git a/contrib/bind/named/named-xfer.c b/contrib/bind/named/named-xfer.c deleted file mode 100644 index 7ff2e5ce41d5..000000000000 --- a/contrib/bind/named/named-xfer.c +++ /dev/null @@ -1,2026 +0,0 @@ -/* - * The original version of xfer by Kevin Dunlap. - * Completed and integrated with named by David Waitzman - * (dwaitzman@bbn.com) 3/14/88. - * Modified by M. Karels and O. Kure 10-88. - * Modified extensively since then by just about everybody. - */ - -/* - * ++Copyright++ 1988, 1990 - * - - * Copyright (c) 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. - * - - * 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. - * --Copyright-- - */ - -#if !defined(lint) && !defined(SABER) -char copyright[] = -"@(#) Copyright (c) 1988, 1990 The Regents of the University of California.\n\ - portions Copyright (c) 1993 Digital Equipment Corporation\n\ - All rights reserved.\n"; -#endif /* not lint */ - -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)named-xfer.c 4.18 (Berkeley) 3/7/91"; -static char rcsid[] = "$Id: named-xfer.c,v 8.24 1998/04/07 04:59:45 vixie Exp $"; -#endif /* not lint */ - -#include -#include -#include -#include -#include - -#include -#if defined(__osf__) -# include -# include -#endif -#if defined(_AIX) -# include -# define TIME_H_INCLUDED -#endif -#include -#include -#include -#include - -#include -#include -#include -#include -#if !defined(SVR4) || !defined(sun) -# include -#endif -#include -#include - -#define MAIN_PROGRAM -#include "named.h" -#undef MAIN_PROGRAM - -#ifndef LOG_PERROR -# define LOG_PERROR 0 -#endif - -static struct zoneinfo zone; /* zone information */ - -static char ddtfilename[] = _PATH_TMPXFER, - *ddtfile = ddtfilename, - *tmpname, - *domain; /* domain being xfered */ - -static int quiet = 0, - read_interrupted = 0, - curclass, - domain_len; /* strlen(domain) */ - -static FILE *fp = NULL, - *dbfp = NULL; - -static char *ProgName; - -static void usage __P((const char *)); -static int getzone __P((struct zoneinfo *, u_int32_t, int)), - print_output __P((struct zoneinfo *, u_int32_t, - u_char *, int, u_char *)), - netread __P((int, char *, int, int)); -static SIG_FN read_alarm __P(()); -static SIG_FN term_handler __P(()); -static const char *soa_zinfo __P((struct zoneinfo *, u_char *, u_char*)); - -struct zoneinfo zp_start, zp_finish; - -extern char *optarg; -extern int optind, getopt(); - - -void -cleanup_for_exit() { -#ifdef DEBUG - if (!debug) -#endif - (void) unlink(tmpname); -} - -void -main(argc, argv) - int argc; - char *argv[]; -{ - register struct zoneinfo *zp; - register struct hostent *hp; - char *dbfile = NULL, *tracefile = NULL, *tm = NULL; - int dbfd, ddtd, result, c, fd, closed = 0; - u_int32_t serial_no = 0; - u_int16_t port = htons(NAMESERVER_PORT); - struct stat statbuf; -#ifdef STUBS - int stub_only = 0; -#endif -#ifdef GEN_AXFR - int class = C_IN; -#endif - - if (ProgName = strrchr(argv[0], '/')) - ProgName++; - else - ProgName = argv[0]; - - (void) umask(022); - - /* this is a hack; closing everything in the parent is hard. */ - for (fd = getdtablesize()-1; fd > STDERR_FILENO; fd--) - closed += (close(fd) == 0); - -#ifdef RENICE - nice(-40); /* this is the recommended procedure to */ - nice(20); /* reset the priority of the current process */ - nice(0); /* to "normal" (== 0) - see nice(3) */ -#endif - -#ifdef LOG_DAEMON - openlog(ProgName, LOG_PID|LOG_CONS|LOG_PERROR, LOGFAC); -#else - openlog(ProgName, LOG_PID); -#endif -#ifdef STUBS - while ((c = getopt(argc, argv, "C:d:l:s:t:z:f:p:P:qS")) != EOF) -#else - while ((c = getopt(argc, argv, "C:d:l:s:t:z:f:p:P:q")) != EOF) -#endif - switch (c) { -#ifdef GEN_AXFR - case 'C': - class = get_class(optarg); - break; -#endif - case 'd': -#ifdef DEBUG - debug = atoi(optarg); -#endif - break; - case 'l': - ddtfile = (char *)malloc(strlen(optarg) + - sizeof(".XXXXXX") + 1); - if (!ddtfile) - panic(errno, "malloc(ddtfile)"); -#ifdef SHORT_FNAMES - filenamecpy(ddtfile, optarg); -#else - (void) strcpy(ddtfile, optarg); -#endif /* SHORT_FNAMES */ - (void) strcat(ddtfile, ".XXXXXX"); - break; - case 's': - serial_no = strtoul(optarg, (char **)NULL, 10); - break; - case 't': - tracefile = optarg; - break; - case 'z': /* zone == domain */ - domain = optarg; - domain_len = strlen(domain); - while ((domain_len > 0) && - (domain[domain_len-1] == '.')) - domain[--domain_len] = '\0'; - break; - case 'f': - dbfile = optarg; - tmpname = (char *)malloc((unsigned)strlen(optarg) + - sizeof(".XXXXXX") + 1); - if (!tmpname) - panic(errno, "malloc(tmpname)"); -#ifdef SHORT_FNAMES - filenamecpy(tmpname, optarg); -#else - (void) strcpy(tmpname, optarg); -#endif /* SHORT_FNAMES */ - break; - case 'p': - port = htons((u_int16_t)atoi(optarg)); - break; - case 'P': - port = (u_int16_t)atoi(optarg); - break; -#ifdef STUBS - case 'S': - stub_only = 1; - break; -#endif - case 'q': - quiet++; - break; - case '?': - default: - usage("unrecognized argument"); - /* NOTREACHED */ - } - - if (!domain || !dbfile || optind >= argc) { - if (!domain) - usage("no domain"); - if (!dbfile) - usage("no dbfile"); - if (optind >= argc) - usage("not enough arguments"); - /* NOTREACHED */ - } - if (stat(dbfile, &statbuf) != -1 && - !S_ISREG(statbuf.st_mode) && - !S_ISFIFO(statbuf.st_mode)) - usage("dbfile must be a regular file or FIFO"); - if (tracefile && (fp = fopen(tracefile, "w")) == NULL) - perror(tracefile); - (void) strcat(tmpname, ".XXXXXX"); - /* tmpname is now something like "/etc/named/named.bu.db.XXXXXX" */ - if ((dbfd = mkstemp(tmpname)) == -1) { - perror(tmpname); - if (!quiet) - syslog(LOG_ERR, "can't make tmpfile (%s): %m\n", - tmpname); - exit(XFER_FAIL); - } -#if HAVE_FCHMOD - if (fchmod(dbfd, 0644) == -1) -#else - if (chmod(tmpname, 0644) == -1) -#endif - { - perror(tmpname); - if (!quiet) - syslog(LOG_ERR, "can't [f]chmod tmpfile (%s): %m\n", - tmpname); - exit(XFER_FAIL); - } - if ((dbfp = fdopen(dbfd, "r+")) == NULL) { - perror(tmpname); - if (!quiet) - syslog(LOG_ERR, "can't fdopen tmpfile (%s)", tmpname); - exit(XFER_FAIL); - } -#ifdef DEBUG - if (debug) { - /* ddtfile is now something like "/usr/tmp/xfer.ddt.XXXXXX" */ - if ((ddtd = mkstemp(ddtfile)) == -1) { - perror(ddtfile); - debug = 0; - } -#if HAVE_FCHMOD - else if (fchmod(ddtd, 0644) == -1) -#else - else if (chmod(ddtfile, 0644) == -1) -#endif - { - perror(ddtfile); - debug = 0; - } else if ((ddt = fdopen(ddtd, "w")) == NULL) { - perror(ddtfile); - debug = 0; - } else { -#ifdef HAVE_SETVBUF - setvbuf(ddt, NULL, _IOLBF, BUFSIZ); -#else - setlinebuf(ddt); -#endif - } - } -#endif - /* - * Ignore many types of signals that named (assumed to be our parent) - * considers important- if not, the user controlling named with - * signals usually kills us. - */ - (void) signal(SIGHUP, SIG_IGN); -#ifdef SIGSYS - (void) signal(SIGSYS, SIG_IGN); -#endif -#ifdef DEBUG - if (debug == 0) -#endif - { - (void) signal(SIGINT, SIG_IGN); - (void) signal(SIGQUIT, SIG_IGN); - } - (void) signal(SIGIOT, SIG_IGN); - -#if defined(SIGUSR1) && defined(SIGUSR2) - (void) signal(SIGUSR1, SIG_IGN); - (void) signal(SIGUSR2, SIG_IGN); -#else /* SIGUSR1&&SIGUSR2 */ - (void) signal(SIGEMT, SIG_IGN); - (void) signal(SIGFPE, SIG_IGN); -#endif /* SIGUSR1&&SIGUSR2 */ - - dprintf(1, (ddt, "domain `%s'; file `%s'; serial %lu; closed %d\n", - domain, dbfile, (u_long)serial_no, closed)); - - buildservicelist(); - buildprotolist(); - - /* init zone data */ - - zp = &zone; -#ifdef STUBS - if (stub_only) - zp->z_type = Z_STUB; - else -#endif - zp->z_type = Z_SECONDARY; -#ifdef GEN_AXFR - zp->z_class = class; -#endif - zp->z_origin = domain; - zp->z_source = dbfile; - zp->z_addrcnt = 0; - dprintf(1, (ddt, "zone found (%d): \"%s\", source = %s\n", - zp->z_type, - (zp->z_origin[0] == '\0') - ? "." - : zp->z_origin, - zp->z_source)); - - for (; optind != argc; optind++) { - tm = argv[optind]; - if (!inet_aton(tm, &zp->z_addr[zp->z_addrcnt])) { - hp = gethostbyname(tm); - if (hp == NULL) { - syslog(LOG_NOTICE, - "uninterpretable server (%s) for %s\n", - tm, zp->z_origin); - continue; - } - bcopy(hp->h_addr, - (char *)&zp->z_addr[zp->z_addrcnt], - INADDRSZ); - dprintf(1, (ddt, "Arg: \"%s\"\n", tm)); - } - if (zp->z_addr[zp->z_addrcnt].s_addr == 0) { - syslog(LOG_NOTICE, - "SOA query to 0.0.0.0 (%s) for %s", - tm, zp->z_origin); - continue; - } - if (++zp->z_addrcnt >= NSMAX) { - zp->z_addrcnt = NSMAX; - dprintf(1, (ddt, "NSMAX reached\n")); - break; - } - } - dprintf(1, (ddt, "addrcnt = %d\n", zp->z_addrcnt)); - - res_init(); - _res.options &= ~(RES_DEFNAMES | RES_DNSRCH | RES_RECURSE); - result = getzone(zp, serial_no, port); - (void) my_fclose(dbfp); - switch (result) { - - case XFER_SUCCESS: /* ok exit */ - if (rename(tmpname, dbfile) == -1) { - perror("rename"); - if (!quiet) - syslog(LOG_ERR, "rename %s to %s: %m", - tmpname, dbfile); - exit(XFER_FAIL); - } - exit(XFER_SUCCESS); - - case XFER_UPTODATE: /* the zone was already uptodate */ - (void) unlink(tmpname); - exit(XFER_UPTODATE); - - default: - result = XFER_FAIL; - /* fall through */ - case XFER_TIMEOUT: - case XFER_FAIL: - cleanup_for_exit(); - exit(result); - } - /*NOTREACHED*/ -} - -static char *UsageText[] = { - "\t-z zone_to_transfer\n", - "\t-f db_file\n", - "\t-s serial_no\n", - "\t[-d debug_level]\n", - "\t[-l debug_log_file]\n", - "\t[-t trace_file]\n", - "\t[-p port]\n", -#ifdef STUBS - "\t[-S]\n", -#endif -#ifdef GEN_AXFR - "\t[-C class]\n", -#endif - "\tservers...\n", - NULL -}; - -static void -usage(msg) - const char *msg; -{ - char * const *line; - - fprintf(stderr, "Usage error: %s\n", msg); - fprintf(stderr, "Usage: %s\n", ProgName); - for (line = UsageText; *line; line++) - fputs(*line, stderr); - exit(XFER_FAIL); -} - -#define DEF_DNAME '\001' /* '\0' means the root domain */ -/* XXX: The following variables should probably all be "static" */ -u_int32_t minimum_ttl = 0; -int soa_cnt = 0; -#ifdef STUBS -int ns_cnt = 0; -#endif -int query_type = 0; -int prev_comment = 0; /* was previous record a comment? */ -char zone_top[MAXDNAME]; /* the top of the zone */ -char prev_origin[MAXDNAME]; /* from most recent $ORIGIN line */ -char prev_dname[MAXDNAME] = { DEF_DNAME }; /* from previous record */ -char prev_ns_dname[MAXDNAME] = { DEF_DNAME }; /* from most recent NS record */ - -static int -getzone(zp, serial_no, port) - struct zoneinfo *zp; - u_int32_t serial_no; - int port; -{ - HEADER *hp; - u_int16_t len; - u_int32_t serial; - int s, n, l, error = 0; - u_int cnt; - u_char *cp, *nmp, *eom, *tmp ; - u_char *buf = NULL; - u_int bufsize; - char name[MAXDNAME], name2[MAXDNAME]; - struct sockaddr_in sin; -#ifdef POSIX_SIGNALS - struct sigaction sv, osv; -#else - struct sigvec sv, osv; -#endif - int qdcount, ancount, aucount, class, type; - const char *badsoa_msg = "Nil"; - -#ifdef DEBUG - if (debug) { - (void)fprintf(ddt,"getzone() %s ", zp->z_origin); - switch (zp->z_type) { - case Z_STUB: - fprintf(ddt,"stub\n"); - break; - case Z_SECONDARY: - fprintf(ddt,"secondary\n"); - break; - default: - fprintf(ddt,"unknown type\n"); - } - } -#endif -#ifdef POSIX_SIGNALS - bzero((char *)&sv, sizeof sv); - sv.sa_handler = (SIG_FN (*)()) read_alarm; - /* SA_ONSTACK isn't recommended for strict POSIX code */ - /* is it absolutely necessary? */ - /* sv.sa_flags = SA_ONSTACK; */ - sigfillset(&sv.sa_mask); - (void) sigaction(SIGALRM, &sv, &osv); - bzero((char *)&sv, sizeof sv); - sv.sa_handler = (SIG_FN (*)()) term_handler; - sigfillset(&sv.sa_mask); - (void) sigaction(SIGTERM, &sv, &osv); -#else - bzero((char *)&sv, sizeof sv); - sv.sv_handler = read_alarm; - sv.sv_mask = ~0; - (void) sigvec(SIGALRM, &sv, &osv); - bzero((char *)&sv, sizeof sv); - sv.sv_handler = term_handler; - sv.sv_mask = ~0; - (void) sigvec(SIGTERM, &sv, &osv); -#endif - - strcpy(zone_top, zp->z_origin); - if ((l = strlen(zone_top)) != 0 && zone_top[l - 1] == '.') - zone_top[l - 1] = '\0'; - strcpy(prev_origin, zone_top); - - for (cnt = 0; cnt < zp->z_addrcnt; cnt++) { -#ifdef GEN_AXFR - curclass = zp->z_class; -#else - curclass = C_IN; -#endif - error = 0; - if (buf == NULL) { - if ((buf = (u_char *)malloc(2 * PACKETSZ)) == NULL) { - syslog(LOG_INFO, "malloc(%u) failed", - 2 * PACKETSZ); - error++; - break; - } - bufsize = 2 * PACKETSZ; - } - bzero((char *)&sin, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = (u_int16_t)port; - sin.sin_addr = zp->z_addr[cnt]; - if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - syslog(LOG_INFO, "socket: %m"); - error++; - break; - } - dprintf(2, (ddt, "connecting to server #%d [%s].%d\n", - cnt+1, inet_ntoa(sin.sin_addr), - ntohs(sin.sin_port))); - if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { - if (!quiet) - syslog(LOG_INFO, - "connect(%s) for zone %s failed: %m", - inet_ntoa(sin.sin_addr), zp->z_origin); - error++; - (void) my_close(s); - continue; - } -#ifndef GEN_AXFR - tryagain: -#endif - n = res_mkquery(QUERY, zp->z_origin, curclass, - T_SOA, NULL, 0, NULL, buf, bufsize); - if (n < 0) { - if (!quiet) - syslog(LOG_INFO, - "zone %s: res_mkquery T_SOA failed", - zp->z_origin); - (void) my_close(s); -#ifdef POSIX_SIGNALS - (void) sigaction(SIGALRM, &osv, (struct sigaction *)0); -#else - (void) sigvec(SIGALRM, &osv, (struct sigvec *)0); -#endif - return (XFER_FAIL); - } - /* - * Send length & message for SOA query - */ - if (writemsg(s, buf, n) < 0) { - syslog(LOG_INFO, "writemsg: %m"); - error++; - (void) my_close(s); - continue; - } - /* - * Get out your butterfly net and catch the SOA - */ - if (netread(s, (char *)buf, INT16SZ, XFER_TIMER) < 0) { - error++; - (void) my_close(s); - continue; - } - if ((len = _getshort(buf)) == 0) { - (void) my_close(s); - continue; - } - if (len > bufsize) { - if ((buf = (u_char *)realloc(buf, len)) == NULL) { - syslog(LOG_INFO, - "malloc(%u) failed for SOA from server [%s], zone %s\n", - len, - inet_ntoa(sin.sin_addr), - zp->z_origin); - (void) my_close(s); - continue; - } - bufsize = len; - } - if (netread(s, (char *)buf, len, XFER_TIMER) < 0) { - error++; - (void) my_close(s); - continue; - } -#ifdef DEBUG - if (debug >= 3) { - (void)fprintf(ddt,"len = %d\n", len); - fp_nquery(buf, len, ddt); - } -#endif - hp = (HEADER *) buf; - qdcount = ntohs(hp->qdcount); - ancount = ntohs(hp->ancount); - aucount = ntohs(hp->nscount); - - /* - * close socket if any of these apply: - * 1) rcode != NOERROR - * 2) not an authority response - * 3) not an answer to our question - * 4) both the number of answers and authority count < 1) - */ - if (hp->rcode != NOERROR || !hp->aa || qdcount != 1 || - (ancount < 1 && aucount < 1)) { -#ifndef GEN_AXFR - if (curclass == C_IN) { - dprintf(1, (ddt, "SOA failed, trying C_HS\n")); - curclass = C_HS; - goto tryagain; - } -#endif -#ifndef ultrix - syslog(LOG_NOTICE, - "[%s] %s for %s, SOA query got rcode %d, aa %d, ancount %d, aucount %d", - inet_ntoa(sin.sin_addr), - (hp->aa - ? (qdcount==1 ?"no SOA found" :"bad response") - : "not authoritative"), - zp->z_origin[0] != '\0' ? zp->z_origin : ".", - hp->rcode, hp->aa, ancount, aucount); -#endif - error++; - (void) my_close(s); - continue; - } - zp_start = *zp; - if ((int)len < HFIXEDSZ + QFIXEDSZ) { - badsoa_msg = "too short"; - badsoa: - syslog(LOG_INFO, - "malformed SOA from [%s], zone %s: %s", - inet_ntoa(sin.sin_addr), zp->z_origin, - badsoa_msg); - error++; - (void) my_close(s); - continue; - } - /* - * Step through response. - */ - tmp = buf + HFIXEDSZ; - eom = buf + len; - /* Query Section. */ - n = dn_expand(buf, eom, tmp, name2, sizeof name2); - if (n < 0) { - badsoa_msg = "qname error"; - goto badsoa; - } - tmp += n; - if (tmp + 2 * INT16SZ > eom) { - badsoa_msg = "query error"; - goto badsoa; - } - GETSHORT(type, tmp); - GETSHORT(class, tmp); - if (class != curclass || type != T_SOA || - strcasecmp(zp->z_origin, name2) != 0) { - syslog(LOG_INFO, - "wrong query in resp from [%s], zone %s: [%s %s %s]\n", - inet_ntoa(sin.sin_addr), zp->z_origin, - name2, p_class(class), p_type(type)); - error++; - (void) my_close(s); - continue; - } - /* ... Answer Section. - * We may have to loop a little, to bypass SIG SOA's in - * the response. - */ - do { - u_char *cp4; - u_short type, class, dlen; - u_long ttl; - - n = dn_expand(buf, eom, tmp, name2, sizeof name2); - if (n < 0) { - badsoa_msg = "aname error"; - goto badsoa; - } - tmp += n; - - /* Are type, class, and ttl OK? */ - cp4 = tmp; /* Leave tmp pointing to type field */ - if (eom - cp4 < 3 * INT16SZ + INT32SZ) { - badsoa_msg = "zinfo too short"; - goto badsoa; - } - GETSHORT(type, cp4); - GETSHORT(class, cp4); - GETLONG(ttl, cp4); - GETSHORT(dlen, cp4); - if (cp4 + dlen > eom) { - badsoa_msg = "zinfo dlen too big"; - goto badsoa; - } - if (type == T_SOA) - break; - /* Skip to next record, if any. */ - dprintf (1, (ddt, "skipping %s %s RR in response\n", - name2, p_type (type))); - tmp = cp4 + dlen; - } while (1); - - if (strcasecmp(zp->z_origin, name2) != 0) { - syslog(LOG_INFO, - "wrong answer in resp from [%s], zone %s: [%s %s %s]\n", - inet_ntoa(sin.sin_addr), zp->z_origin, - name2, p_class(class), p_type(type)); - error++; - (void) my_close(s); - continue; - } - badsoa_msg = soa_zinfo(&zp_start, tmp, eom); - if (badsoa_msg) - goto badsoa; - if (SEQ_GT(zp_start.z_serial, serial_no) || !serial_no) { - const char *l, *nl; - dprintf(1, (ddt, "need update, serial %lu\n", - (u_long)zp_start.z_serial)); - hp = (HEADER *) buf; - soa_cnt = 0; -#ifdef STUBS - ns_cnt = 0; -#endif - gettime(&tt); - for (l = Version; l; l = nl) { - size_t len; - if ((nl = strchr(l, '\n')) != NULL) { - len = nl - l; - nl = nl + 1; - } else { - len = strlen(l); - nl = NULL; - } - while (isspace((unsigned char) *l)) - l++; - if (*l) - fprintf(dbfp, "; BIND version %.*s\n", - (int)len, l); - } - fprintf(dbfp, "; zone '%s' last serial %lu\n", - domain, (u_long)serial_no); - fprintf(dbfp, "; from %s at %s", - inet_ntoa(sin.sin_addr), - ctimel(tt.tv_sec)); - for (;;) { - if ((soa_cnt == 0) || (zp->z_type == Z_STUB)) { -#ifdef STUBS - if (zp->z_type == Z_STUB) { - if (soa_cnt == 1 && - ns_cnt == 0) - query_type = T_NS; - else - query_type = T_SOA; - } else -#endif - query_type = T_AXFR; - n = res_mkquery(QUERY, zp->z_origin, - curclass, query_type, - NULL, 0, - NULL, buf, bufsize); - if (n < 0) { - if (!quiet) { -#ifdef STUBS - if (zp->z_type == Z_STUB) - syslog(LOG_INFO, - (query_type == T_SOA) - ? "zone %s: res_mkquery T_SOA failed" - : "zone %s: res_mkquery T_NS failed", - zp->z_origin); - else -#endif - syslog(LOG_INFO, - "zone %s: res_mkquery T_AXFR failed", - zp->z_origin); - } - (void) my_close(s); -#ifdef POSIX_SIGNALS - sigaction(SIGALRM, &osv, - (struct sigaction *)0); -#else - sigvec(SIGALRM, &osv, - (struct sigvec *)0); -#endif - return (XFER_FAIL); - } - /* - * Send length & msg for zone transfer - */ - if (writemsg(s, buf, n) < 0) { - syslog(LOG_INFO, - "writemsg: %m"); - error++; - (void) my_close(s); - break; - } - } - /* - * Receive length & response - */ - if (netread(s, (char *)buf, INT16SZ, - (soa_cnt == 0) ?300 :XFER_TIMER) - < 0) { - error++; - break; - } - if ((len = _getshort(buf)) == 0) - break; - if (len > bufsize) { - buf = (u_char *)realloc(buf, len); - if (buf == NULL) { - syslog(LOG_INFO, - "malloc(%u) failed for packet from server [%s], zone %s\n", - len, - inet_ntoa(sin.sin_addr), - zp->z_origin); - error++; - break; - } - bufsize = len; - } - hp = (HEADER *)buf; - eom = buf + len; - if (netread(s, (char *)buf, len, XFER_TIMER) - < 0) { - error++; - break; - } -#ifdef DEBUG - if (debug >= 3) { - (void)fprintf(ddt,"len = %d\n", len); - fp_nquery(buf, len, ddt); - } - if (fp) - fp_nquery(buf, len, fp); -#endif - if (len < HFIXEDSZ) { - badrec: - error++; - syslog(LOG_INFO, - "record too short from [%s], zone %s\n", - inet_ntoa(sin.sin_addr), - zp->z_origin); - break; - } - cp = buf + HFIXEDSZ; - if (hp->qdcount) { - if ((n = dn_skipname(cp, eom)) == -1 - || n + QFIXEDSZ >= eom - cp) - goto badrec; - cp += n + QFIXEDSZ; - } - nmp = cp; - if ((n = dn_skipname(cp, eom)) == -1) - goto badrec; - tmp = cp + n; -#ifdef STUBS - if (zp->z_type == Z_STUB) { - ancount = ntohs(hp->ancount); - for (n = cnt = 0 ; cnt < ancount ; cnt++) { - n = print_output(zp, serial_no, buf, - len, cp); - if (n < 0) - break; - cp += n; - } - /* - * If we've processed the answer section and - * didn't get any useful answers, bail out. - */ - if (query_type == T_SOA && soa_cnt == 0) { - syslog(LOG_ERR, - "stubs: no SOA in answer"); - error++; - break; - } - if (query_type == T_NS && ns_cnt == 0) { - syslog(LOG_ERR, - "stubs: no NS in answer"); - error++; - break; - } - if (n >= 0 && hp->nscount) { - ancount = ntohs(hp->nscount); - for (cnt = 0; cnt < ancount; cnt++) { - n = print_output(zp, - serial_no, - buf, len, cp); - if (n < 0) - break; - cp += n; - } - } - ancount = ntohs(hp->arcount); - for (cnt = 0; n >= 0 && cnt < ancount; cnt++) { - n = print_output(zp, serial_no, buf, - len, cp); - cp += n; - } - if (n < 0) { - syslog(LOG_INFO, - "print_output: unparseable answer (%d), zone %s", - hp->rcode, zp->z_origin); - error++; - break; - } - if (cp != eom) { - syslog(LOG_INFO, - "print_output: short answer (%d, %d), zone %s", - cp - buf, n, zp->z_origin); - error++; - break; - } - } else { -#endif /*STUBS*/ - ancount = ntohs(hp->ancount); - for (n = cnt = 0; cnt < ancount; cnt++) { - n = print_output(zp, serial_no, buf, - len, cp); - if (n < 0) - break; - cp += n; - } - if (n < 0) { - syslog(LOG_INFO, - "print_output: unparseable answer (%d), zone %s", - hp->rcode, zp->z_origin); - error++; - break; - } - if (cp != eom) { - syslog(LOG_INFO, - "print_output: short answer (%d, %d), zone %s", - cp - buf, eom - buf, - zp->z_origin); - error++; - break; - } -#ifdef STUBS - } -#endif - - if (soa_cnt >= 2) - break; - - } - (void) my_close(s); - if (error == 0) { -#ifdef POSIX_SIGNALS - (void) sigaction(SIGALRM, &osv, - (struct sigaction *)0); -#else - (void) sigvec(SIGALRM, &osv, (struct sigvec *)0); -#endif - return (XFER_SUCCESS); - } - dprintf(2, (ddt, "error receiving zone transfer\n")); - } else if (zp_start.z_serial == serial_no) { - (void) my_close(s); - dprintf(1, (ddt, - "zone up-to-date, serial %u\n", - zp_start.z_serial)); - return (XFER_UPTODATE); - } else { - (void) my_close(s); - if (!quiet) - syslog(LOG_NOTICE, - "serial from [%s], zone %s: %u lower than current: %u\n", - inet_ntoa(sin.sin_addr), zp->z_origin, - zp_start.z_serial, serial_no); - return (XFER_FAIL); - } - } -#ifdef POSIX_SIGNALS - (void) sigaction(SIGALRM, &osv, (struct sigaction *)0); -#else - (void) sigvec(SIGALRM, &osv, (struct sigvec *)0); -#endif - if (!error) - return (XFER_TIMEOUT); - return (XFER_FAIL); -} - -static SIG_FN -term_handler() { - cleanup_for_exit(); - _exit(XFER_FAIL); /* not safe to call exit() from a signal handler */ -} - -/* - * Set flag saying to read was interrupted - * used for a read timer - */ -static SIG_FN -read_alarm() -{ - read_interrupted = 1; -} - -static int -netread(fd, buf, len, timeout) - int fd; - register char *buf; - register int len; - int timeout; -{ - static const char setitimerStr[] = "setitimer: %m"; - struct itimerval ival, zeroival; - register int n; -#if defined(NETREAD_BROKEN) - int retries = 0; -#endif - - memset(&zeroival, 0, sizeof zeroival); - ival = zeroival; - ival.it_value.tv_sec = timeout; - while (len > 0) { - if (setitimer(ITIMER_REAL, &ival, NULL) < 0) { - syslog(LOG_INFO, setitimerStr); - return (-1); - } - errno = 0; - n = recv(fd, buf, len, 0); - if (n == 0 && errno == 0) { -#if defined(NETREAD_BROKEN) - if (++retries < 42) /* doug adams */ - continue; -#endif - syslog(LOG_INFO, "premature EOF, fetching \"%s\"", - domain); - return (-1); - } - if (n < 0) { - if (errno == 0) { -#if defined(NETREAD_BROKEN) - if (++retries < 42) /* doug adams */ - continue; -#endif - syslog(LOG_INFO, - "recv(len=%d): n=%d && !errno", - len, n); - return (-1); - } - if (errno == EINTR) { - if (!read_interrupted) { - /* It wasn't a timeout; ignore it. */ - continue; - } - errno = ETIMEDOUT; - } - syslog(LOG_INFO, "recv(len=%d): %m", len); - return (-1); - } - buf += n; - len -= n; - } - if (setitimer(ITIMER_REAL, &zeroival, NULL) < 0) { - syslog(LOG_INFO, setitimerStr); - return (-1); - } - return (0); -} - -static const char * -soa_zinfo(zp, cp, eom) - register struct zoneinfo *zp; - register u_char *cp; - u_char *eom; -{ - register int n; - int type, class; - u_long ttl; - u_int dlen; - u_char *rdatap; - - /* Are type, class, and ttl OK? */ - if (eom - cp < 3 * INT16SZ + INT32SZ) - return ("zinfo too short"); - GETSHORT(type, cp); - GETSHORT(class, cp); - GETLONG(ttl, cp); - GETSHORT(dlen, cp); - rdatap = cp; - if (type != T_SOA || class != curclass) - return ("zinfo wrong typ/cla/ttl"); - /* Skip master name and contact name, we can't validate them. */ - if ((n = dn_skipname(cp, eom)) == -1) - return ("zinfo mname"); - cp += n; - if ((n = dn_skipname(cp, eom)) == -1) - return ("zinfo hname"); - cp += n; - /* Grab the data fields. */ - if (eom - cp < 5 * INT32SZ) - return ("zinfo dlen"); - GETLONG(zp->z_serial, cp); - GETLONG(zp->z_refresh, cp); - GETLONG(zp->z_retry, cp); - GETLONG(zp->z_expire, cp); - GETLONG(zp->z_minimum, cp); - if (cp != rdatap + dlen) - return ("bad soa dlen"); - return (NULL); -} - -#define BOUNDS_CHECK(ptr, count) \ - do { \ - if ((ptr) + (count) > eom) { \ - hp->rcode = FORMERR; \ - return (-1); \ - } \ - } while (0) - -/* - * Parse the message, determine if it should be printed, and if so, print it - * in .db file form. - * Does minimal error checking on the message content. - */ -static int -print_output(zp, serial_no, msg, msglen, rrp) - struct zoneinfo *zp; - u_int32_t serial_no; - u_char *msg; - int msglen; - u_char *rrp; -{ - register u_char *cp; - register HEADER *hp = (HEADER *) msg; - u_int32_t addr, ttl; - int i, j, tab, result, class, type, dlen, n1, n; - char data[BUFSIZ]; - u_char *cp1, *cp2, *temp_ptr, *eom, *rr_type_ptr; - u_char *cdata, *rdatap; - char *origin, *proto, dname[MAXDNAME]; - char *ignore = ""; - const char *badsoa_msg; - - eom = msg + msglen; - cp = rrp; - n = dn_expand(msg, msg + msglen, cp, dname, sizeof dname); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - rr_type_ptr = cp; - BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ); - GETSHORT(type, cp); - GETSHORT(class, cp); - GETLONG(ttl, cp); - GETSHORT(dlen, cp); - BOUNDS_CHECK(cp, dlen); - rdatap = cp; - - origin = strchr(dname, '.'); - if (origin == NULL) - origin = ""; - else - origin++; /* move past the '.' */ - dprintf(3, (ddt, - "print_output: dname %s type %d class %d ttl %lu\n", - dname, type, class, (u_long)ttl)); - /* - * Convert the resource record data into the internal database format. - * CP points to the raw resource record. - * After this switch: - * CP has been updated to point past the RR. - * CP1 points to the internal database version. - * N is the length of the internal database version. - */ - switch (type) { - case T_A: - case T_WKS: - case T_HINFO: - case T_UINFO: - case T_TXT: - case T_X25: - case T_ISDN: - case T_LOC: - case T_NSAP: - case T_AAAA: - case T_UID: - case T_GID: - case T_KEY: - cp1 = cp; - n = dlen; - cp += n; - break; - - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - n = dn_expand(msg, msg + msglen, cp, data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 = (u_char *)data; - n = strlen(data) + 1; - break; - - case T_MINFO: - case T_SOA: - case T_RP: - n = dn_expand(msg, msg + msglen, cp, data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - n = strlen(data) + 1; - cp1 = (u_char *)data + n; - n1 = sizeof data - n; - if (type == T_SOA) - n1 -= 5 * INT32SZ; - n = dn_expand(msg, msg + msglen, cp, (char *)cp1, n1); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 += strlen((char *) cp1) + 1; - if (type == T_SOA) { - BOUNDS_CHECK(cp, 5 * INT32SZ); - temp_ptr = cp + 4 * INT32SZ; - GETLONG(minimum_ttl, temp_ptr); - n = 5 * INT32SZ; - bcopy((char *) cp, (char *) cp1, n); - cp += n; - cp1 += n; - } - n = cp1 - (u_char *)data; - cp1 = (u_char *)data; - break; - - case T_NAPTR: - /* Grab weight and port. */ - BOUNDS_CHECK(cp, INT16SZ*2); - bcopy(cp, data, INT16SZ*2); - cp1 = (u_char *) (data + INT16SZ*2); - cp += INT16SZ*2; - - /* Flags */ - BOUNDS_CHECK(cp, 1); - n = *cp++; - BOUNDS_CHECK(cp, n); - *cp1++ = n; - bcopy(cp, cp1, n); - cp += n; cp1 += n; - - /* Service */ - BOUNDS_CHECK(cp, 1); - n = *cp++; - BOUNDS_CHECK(cp, n); - *cp1++ = n; - bcopy(cp, cp1, n); - cp += n; cp1 += n; - - /* Regexp */ - BOUNDS_CHECK(cp, 1); - n = *cp++; - BOUNDS_CHECK(cp, n); - *cp1++ = n; - bcopy(cp, cp1, n); - cp += n; cp1 += n; - - /* Replacement */ - n = dn_expand(msg, msg + msglen, cp, (char *)cp1, - sizeof data - ((char *)cp1 - data)); - if (n < 0) - return (-1); - cp += n; - - /* compute end of data */ - cp1 += strlen((char *)cp1) + 1; - /* compute size of data */ - n = cp1 - (u_char *)data; - cp1 = (u_char *)data; - break; - - case T_MX: - case T_AFSDB: - case T_RT: - case T_SRV: - /* grab preference */ - BOUNDS_CHECK(cp, INT16SZ); - bcopy((char *)cp, data, INT16SZ); - cp1 = (u_char *)data + INT16SZ; - cp += INT16SZ; - - if (type == T_SRV) { - BOUNDS_CHECK(cp, INT16SZ); - bcopy((char *)cp, cp1, INT16SZ*2); - cp1 += INT16SZ*2; - cp += INT16SZ*2; - } - - /* get name */ - n = dn_expand(msg, msg + msglen, cp, - (char *)cp1, sizeof data - (cp1-(u_char *)data)); - if (n < 0) - return (-1); - cp += n; - - /* compute end of data */ - cp1 += strlen((char *) cp1) + 1; - /* compute size of data */ - n = cp1 - (u_char *)data; - cp1 = (u_char *)data; - break; - - case T_PX: - /* grab preference */ - BOUNDS_CHECK(cp, INT16SZ); - bcopy((char *)cp, data, INT16SZ); - cp1 = (u_char *)data + INT16SZ; - cp += INT16SZ; - - /* get MAP822 name */ - n = dn_expand(msg, msg + msglen, cp, - (char *)cp1, sizeof data - INT16SZ); - if (n < 0) - return (-1); - cp += n; - cp1 += (n = (strlen((char *) cp1) + 1)); - n1 = sizeof data - n; - - /* get MAPX400 name */ - n = dn_expand(msg, msg + msglen, cp, (char *)cp1, n1); - if (n < 0) - return (-1); - cp += n; - cp1 += strlen((char *) cp1) + 1; - n = cp1 - (u_char *)data; - cp1 = (u_char *)data; - break; - - case T_SIG: - /* CP is the raw resource record as it arrived. - * CP1, after this switch, points to the internal database version. */ - cp1 = (u_char *)data; - - /* first just copy over the type_covered, algorithm, */ - /* labels, orig ttl, two timestamps, and the footprint */ - BOUNDS_CHECK(cp, 18); - bcopy( cp, cp1, 18 ); - cp += 18; - cp1 += 18; - - /* then the signer's name */ - n = dn_expand(msg, msg + msglen, cp, - (char *)cp1, (sizeof data) - 18); - if (n < 0) - return (-1); - cp += n; - cp1 += strlen((char*)cp1)+1; - - /* finally, we copy over the variable-length signature. - Its size is the total data length, minus what we copied. */ - n = dlen - (18 + n); - if (n > (int)((sizeof data) - (int)(cp1 - (u_char *)data))) { - hp->rcode = FORMERR; - return (-1); /* out of room! */ - } - bcopy(cp, cp1, n); - cp += n; - cp1 += n; - - /* compute size of data */ - n = cp1 - (u_char *)data; - cp1 = (u_char *)data; - break; - - default: - syslog(LOG_INFO, "\"%s %s %s\" - unknown type (%d)", - dname, p_class(class), p_type(type), type); - hp->rcode = NOTIMP; - return (-1); - } - - if (n > MAXDATA) { - dprintf(1, (ddt, - "update type %d: %d bytes is too much data\n", - type, n)); - hp->rcode = FORMERR; - return (-1); - } - if (cp != rdatap + dlen) { - dprintf(1, (ddt, - "encoded rdata length is %u, but actual length was %u\n", - dlen, (u_int)(cp - rdatap))); - hp->rcode = FORMERR; - return (-1); - } - - cdata = cp1; - result = cp - rrp; - - /* - * Special handling for SOA records. - */ - - if (type == T_SOA) { - if (strcasecmp(dname, zp->z_origin) != 0) { - syslog(LOG_INFO, - "wrong zone name in AXFR (wanted \"%s\", got \"%s\")", - zp->z_origin, dname); - hp->rcode = FORMERR; - return (-1); - } - if (!soa_cnt) { - badsoa_msg = soa_zinfo(&zp_start, rr_type_ptr, eom); - if (badsoa_msg) { - syslog(LOG_INFO, - "malformed SOA for zone %s: %s", - zp->z_origin, badsoa_msg); - hp->rcode = FORMERR; - return (-1); - } - if (SEQ_GT(zp_start.z_serial, serial_no) || - !serial_no) - soa_cnt++; - else { - syslog(LOG_INFO, - "serial went backwards after transfer started"); - return (-1); - } - } else { - badsoa_msg = soa_zinfo(&zp_finish, rr_type_ptr, eom); - if (badsoa_msg) { - syslog(LOG_INFO, - "malformed SOA for zone %s: %s", - zp->z_origin, badsoa_msg); - hp->rcode = FORMERR; - return (-1); - } - dprintf(2, (ddt, "SOA, serial %lu\n", - (u_long)zp_finish.z_serial)); - if (zp_start.z_serial != zp_finish.z_serial) { - dprintf(1, (ddt, "serial changed, restart\n")); - soa_cnt = 0; -#ifdef STUBS - ns_cnt = 0; -#endif - minimum_ttl = 0; - strcpy(prev_origin, zp->z_origin); - prev_dname[0] = DEF_DNAME; - /* - * Flush buffer, truncate file - * and seek to beginning to restart. - */ - fflush(dbfp); - if (ftruncate(fileno(dbfp), 0) != 0) { - if (!quiet) - syslog(LOG_INFO, - "ftruncate %s: %m\n", - tmpname); - return (-1); - } - fseek(dbfp, 0L, 0); - return (result); - } - soa_cnt++; - return (result); - } - } - -#ifdef STUBS - if (zp->z_type == Z_STUB) { - if (query_type == T_NS && type == T_NS) - ns_cnt++; - /* - * If we're processing a response to an SOA query, we don't - * want to print anything from the response except for the SOA. - * We do want to check everything in the packet, which is - * why we do this check now instead of earlier. - */ - if (query_type == T_SOA && type != T_SOA) - return (result); - } -#endif - - if (!soa_cnt || soa_cnt >= 2) { - char *gripe; - - if (!soa_cnt) - gripe = "got RR before first SOA"; - else - gripe = "got RR after second SOA"; - syslog(LOG_INFO, "%s in zone %s", gripe, zp->z_origin); - hp->rcode = FORMERR; - return (-1); - } - -#ifdef NO_GLUE - /* - * If they are trying to tell us info about something that is - * not in the zone that we are transfering, then ignore it! - * They don't have the authority to tell us this info. - * - * We have to do a bit of checking here - the name that we are - * checking vs is fully qualified & may be in a subdomain of the - * zone in question. We also need to ignore any final dots. - * - * If a domain has both NS records and non-NS records, (for - * example, NS and MX records), then we should ignore the non-NS - * records (except that we should not ignore glue A records). - * XXX: It is difficult to do this properly, so we just compare - * the current dname with that in the most recent NS record. - * This defends against the most common error case, - * where the remote server sends MX records soon after the - * NS records for a particular domain. If sent earlier, we lose. XXX - */ - if (!samedomain(dname, domain)) { - (void) fprintf(dbfp, "; Ignoring info about %s, not in zone %s.\n", - dname, domain); - ignore = "; "; - } else if (type != T_NS && type != T_A && - strcasecmp(zone_top, dname) != 0 && - strcasecmp(prev_ns_dname, dname) == 0) - { - (void) fprintf(dbfp, "; Ignoring extra info about %s, invalid after NS delegation.\n", - dname); - ignore = "; "; - } -#endif /*NO_GLUE*/ - - /* - * If the current record is not being ignored, but the - * previous record was ignored, then we invalidate information - * that might have been altered by ignored records. - * (This means that we sometimes output unnecessary $ORIGIN - * lines, but that is harmless.) - * - * Also update prev_comment now. - */ - if (prev_comment && ignore[0] == '\0') { - prev_dname[0] = DEF_DNAME; - prev_origin[0] = DEF_DNAME; - } - prev_comment = (ignore[0] != '\0'); - - /* - * set prev_ns_dname if necessary - */ - if (type == T_NS) { - (void) strcpy(prev_ns_dname, dname); - } - - /* - * If the origin has changed, print the new origin - */ - if (strcasecmp(prev_origin, origin)) { - (void) strcpy(prev_origin, origin); - (void) fprintf(dbfp, "%s$ORIGIN %s.\n", ignore, origin); - } - tab = 0; - - if (strcasecmp(prev_dname, dname)) { - /* - * set the prev_dname to be the current dname, then cut off all - * characters of dname after (and including) the first '.' - */ - char *cutp = strchr(dname, '.'); - - (void) strcpy(prev_dname, dname); - if (cutp) - *cutp = '\0'; - - if (dname[0] == 0) { - if (origin[0] == 0) - (void) fprintf(dbfp, "%s.\t", ignore); - else - (void) fprintf(dbfp, "%s.%s.\t", - ignore, origin); /* ??? */ - } else - (void) fprintf(dbfp, "%s%s\t", ignore, dname); - if (strlen(dname) < (size_t)8) - tab = 1; - } else { - (void) fprintf(dbfp, "%s\t", ignore); - tab = 1; - } - - if (ttl != minimum_ttl) - (void) fprintf(dbfp, "%lu\t", (u_long) ttl); - else if (tab) - (void) putc('\t', dbfp); - - (void) fprintf(dbfp, "%s\t%s\t", p_class(class), p_type(type)); - cp = cdata; - - /* - * Print type specific data - */ - switch (type) { - - case T_A: - switch (class) { - case C_IN: - case C_HS: - GETLONG(n, cp); - n = htonl(n); - fputs(inet_ntoa(*(struct in_addr *) &n), dbfp); - break; - } - (void) fprintf(dbfp, "\n"); - break; - - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_PTR: - if (cp[0] == '\0') - (void) fprintf(dbfp, ".\n"); - else - (void) fprintf(dbfp, "%s.\n", cp); - break; - - case T_NS: - cp = cdata; - if (cp[0] == '\0') - (void) fprintf(dbfp, ".\t"); - else - (void) fprintf(dbfp, "%s.", cp); - (void) fprintf(dbfp, "\n"); - break; - - case T_HINFO: - case T_ISDN: - cp2 = cp + n; - for (i = 0; i < 2; i++) { - if (i != 0) - (void) putc(' ', dbfp); - n = *cp++; - cp1 = cp + n; - if (cp1 > cp2) - cp1 = cp2; - (void) putc('"', dbfp); - j = 0; - while (cp < cp1) { - if (*cp == '\0') { - cp = cp1; - break; - } - if (strchr("\n\"\\", *cp)) - (void) putc('\\', dbfp); - (void) putc(*cp++, dbfp); - j++; - } - if (j == 0 && (type != T_ISDN || i == 0)) - (void) putc('?', dbfp); - (void) putc('"', dbfp); - } - (void) putc('\n', dbfp); - break; - - case T_SOA: - (void) fprintf(dbfp, "%s.", cp); - cp += strlen((char *) cp) + 1; - (void) fprintf(dbfp, " %s. (\n", cp); - cp += strlen((char *) cp) + 1; - GETLONG(n, cp); - (void) fprintf(dbfp, "%s\t\t%lu", ignore, (u_long)n); - GETLONG(n, cp); - (void) fprintf(dbfp, " %lu", (u_long)n); - GETLONG(n, cp); - (void) fprintf(dbfp, " %lu", (u_long)n); - GETLONG(n, cp); - (void) fprintf(dbfp, " %lu", (u_long)n); - GETLONG(n, cp); - (void) fprintf(dbfp, " %lu )\n", (u_long)n); - break; - - case T_MX: - case T_AFSDB: - case T_RT: - GETSHORT(n, cp); - (void) fprintf(dbfp, "%lu", (u_long)n); - (void) fprintf(dbfp, " %s.\n", cp); - break; - - case T_PX: - GETSHORT(n, cp); - (void) fprintf(dbfp, "%lu", (u_long)n); - (void) fprintf(dbfp, " %s.", cp); - cp += strlen((char *) cp) + 1; - (void) fprintf(dbfp, " %s.\n", cp); - break; - - case T_TXT: - case T_X25: - cp1 = cp + n; - while (cp < cp1) { - (void) putc('"', dbfp); - if (i = *cp++) { - for (j = i; j > 0 && cp < cp1; j--) { - if (strchr("\n\"\\", *cp)) - (void) putc('\\', dbfp); - (void) putc(*cp++, dbfp); - } - } - (void) putc('"', dbfp); - if (cp < cp1) - (void) putc(' ', dbfp); - } - (void) putc('\n', dbfp); - break; - - case T_NSAP: - fprintf(dbfp, "%s\n", inet_nsap_ntoa(n, cp, NULL)); - break; - - case T_AAAA: { - char t[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"]; - - fprintf(dbfp, "%s\n", inet_ntop(AF_INET6, cp, t, sizeof t)); - break; - } - case T_UINFO: - (void) fprintf(dbfp, "\"%s\"\n", cp); - break; - -#ifdef LOC_RR - case T_LOC: { - char t[255]; - - (void) fprintf(dbfp, "%s\n", loc_ntoa(cp, t)); - break; - } -#endif /* LOC_RR */ - - case T_NAPTR: { - u_int order, preference; - - /* Order */ - GETSHORT(order, cp); - fprintf(dbfp, "%lu", (u_long)order); - - /* Preference */ - GETSHORT(preference, cp); - fprintf(dbfp, " %lu", (u_long)preference); - - /* Flags */ - if (n = *cp++) { - fprintf(dbfp, " \"%.*s\"", (int)n, cp); - cp += n; - } - - /* Service */ - if (n = *cp++) { - fprintf(dbfp, " \"%.*s\"", (int)n, cp); - cp += n; - } - - /* Regexp */ - if (n = *cp++) { - fprintf(dbfp, " \"%.*s\"", (int)n, cp); - cp += n; - } - - /* Replacement */ - fprintf(dbfp, " %s.\n", cp); - - break; - } - case T_SRV: { - u_int priority, weight, port; - - GETSHORT(priority, cp); - GETSHORT(weight, cp); - GETSHORT(port, cp); - fprintf(dbfp, "\t%u %u %u %s.\n", - priority, weight, port, cp); - break; - } - - case T_UID: - case T_GID: - if (n == INT32SZ) { - GETLONG(n, cp); - (void) fprintf(dbfp, "%lu\n", (u_long)n); - } - break; - - case T_WKS: - GETLONG(addr, cp); - addr = htonl(addr); - fputs(inet_ntoa(*(struct in_addr *) &addr), dbfp); - fputc(' ', dbfp); - proto = protocolname(*cp); - cp += sizeof(char); - (void) fprintf(dbfp, "%s ", proto); - i = 0; - while (cp < cdata + n) { - j = *cp++; - do { - if (j & 0200) - (void) fprintf(dbfp, " %s", - servicename(i, proto)); - j <<= 1; - } while (++i & 07); - } - (void) fprintf(dbfp, "\n"); - break; - - case T_MINFO: - case T_RP: - (void) fprintf(dbfp, "%s.", cp); - cp += strlen((char *) cp) + 1; - (void) fprintf(dbfp, " %s.\n", cp); - break; - - case T_KEY: { - char databuf[16+MAX_KEY_BASE64]; /* 16 for slop */ - u_int16_t keyflags; - - /* get & format key flags */ - keyflags = _getshort(cp); - (void) fprintf(dbfp, "0x%04x ", keyflags); - cp += INT16SZ; - - /* protocol id */ - (void) fprintf(dbfp, " %u", *cp++); - - /* algorithm id */ - (void) fprintf(dbfp, " %u ", *cp++); - - /* key itself (which may have zero length) */ - n = b64_ntop(cp, (cp1 + n) - cp, databuf, sizeof databuf); - if (n < 0) - fprintf(dbfp, "; BAD BASE64\n"); - else - fprintf(dbfp, "%s\n", databuf); - break; - } - - case T_SIG: { - char databuf[16+MAX_KEY_BASE64]; /* 16 for slop */ - - /* get & format rr type which signature covers */ - (void) fprintf(dbfp,"%s", p_type(_getshort((u_char*)cp))); - cp += INT16SZ; - - /* algorithm id */ - (void) fprintf(dbfp," %d",*cp++); - - /* labels (# of labels in name) - skip in textual record */ - cp++; - - /* orig time to live (TTL)) */ - (void) fprintf(dbfp," %lu", (u_long)_getlong((u_char*)cp)); - cp += INT32SZ; - - /* expiration time */ - (void) fprintf(dbfp," %s", p_secstodate(_getlong((u_char*)cp))); - cp += INT32SZ; - - /* time signed */ - (void) fprintf(dbfp," %s", p_secstodate(_getlong((u_char*)cp))); - cp += INT32SZ; - - /* Key footprint */ - (void) fprintf(dbfp," %d", _getshort((u_char*)cp)); - cp += INT16SZ; - - /* signer's name */ - (void) fprintf(dbfp, " %s. ", cp); - cp += strlen((char *) cp) + 1; - - /* signature itself */ - n = b64_ntop(cp, (cdata + n) - cp, databuf, sizeof databuf); - if (n < 0) - fprintf (dbfp, "; BAD BASE64\n"); - else - fprintf (dbfp, "%s\n", databuf); - break; - } - - default: - cp1 = cp + n; - while (cp < cp1) - fprintf(dbfp, "0x%02.2X ", *cp++ & 0xFF); - (void) fprintf(dbfp, "???\n"); - } - if (ferror(dbfp)) { - syslog(LOG_ERR, "%s: %m", tmpname); - cleanup_for_exit(); - exit(XFER_FAIL); - } - return (result); -} - -#ifdef SHORT_FNAMES -/* -** This routine handles creating temporary files with mkstemp -** in the presence of a 14 char filename system. Pathconf() -** does not work over NFS. -*/ -filenamecpy(ddtfile, optarg) -char *ddtfile, *optarg; -{ - int namelen, extra, len; - char *dirname, *filename; - - /* determine the length of filename allowed */ - if((dirname = strrchr(optarg, '/')) == NULL){ - filename = optarg; - } else { - *dirname++ = '\0'; - filename = dirname; - } - namelen = pathconf(dirname == NULL? "." : optarg, _PC_NAME_MAX); - if(namelen <= 0) - namelen = 255; /* length could not be determined */ - if(dirname != NULL) - *--dirname = '/'; - - /* copy a shorter name if it will be longer than allowed */ - extra = (strlen(filename)+strlen(".XXXXXX")) - namelen; - if(extra > 0){ - len = strlen(optarg) - extra; - (void) strncpy(ddtfile, optarg, len); - ddtfile[len] = '\0'; - } else - (void) strcpy(ddtfile, optarg); -} -#endif /* SHORT_FNAMES */ diff --git a/contrib/bind/named/named.h b/contrib/bind/named/named.h deleted file mode 100644 index 0575a5c6e5be..000000000000 --- a/contrib/bind/named/named.h +++ /dev/null @@ -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" diff --git a/contrib/bind/named/named.reload.sh b/contrib/bind/named/named.reload.sh deleted file mode 100644 index 0b6495a251b6..000000000000 --- a/contrib/bind/named/named.reload.sh +++ /dev/null @@ -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 diff --git a/contrib/bind/named/named.restart.sh b/contrib/bind/named/named.restart.sh deleted file mode 100644 index 4d073e6e723c..000000000000 --- a/contrib/bind/named/named.restart.sh +++ /dev/null @@ -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 diff --git a/contrib/bind/named/ndc.sh b/contrib/bind/named/ndc.sh deleted file mode 100644 index 883dabce3fb5..000000000000 --- a/contrib/bind/named/ndc.sh +++ /dev/null @@ -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 diff --git a/contrib/bind/named/ns_defs.h b/contrib/bind/named/ns_defs.h deleted file mode 100644 index 05c4a3996042..000000000000 --- a/contrib/bind/named/ns_defs.h +++ /dev/null @@ -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 - -/* 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 - diff --git a/contrib/bind/named/ns_forw.c b/contrib/bind/named/ns_forw.c deleted file mode 100644 index 06d428b7df16..000000000000 --- a/contrib/bind/named/ns_forw.c +++ /dev/null @@ -1,1096 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)ns_forw.c 4.32 (Berkeley) 3/3/91"; -static char rcsid[] = "$Id: ns_forw.c,v 8.20 1997/06/01 20:34:34 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-- - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "named.h" - -/* - * Forward the query to get the answer since its not in the database. - * Returns FW_OK if a request struct is allocated and the query sent. - * Returns FW_DUP if this is a duplicate of a pending request. - * Returns FW_NOSERVER if there were no addresses for the nameservers. - * Returns FW_SERVFAIL on malloc error or if asked to do something - * dangerous, such as fwd to ourselves or fwd to the host that asked us. - * - * (no action is taken on errors and qpp is not filled in.) - */ -int -ns_forw(nsp, msg, msglen, fp, qsp, dfd, qpp, dname, class, type, np) - struct databuf *nsp[]; - u_char *msg; - int msglen; - struct sockaddr_in *fp; - struct qstream *qsp; - int dfd; - struct qinfo **qpp; - char *dname; - int class, type; - struct namebuf *np; -{ - register struct qinfo *qp; - char tmpdomain[MAXDNAME]; - struct sockaddr_in *nsa; - HEADER *hp; - u_int16_t id; - int n; - - dprintf(3, (ddt, "ns_forw()\n")); - - hp = (HEADER *) msg; - id = hp->id; - /* Look at them all */ - for (qp = nsqhead; qp != QINFO_NULL; qp = qp->q_link) { - if (qp->q_id == id && - bcmp((char *)&qp->q_from, fp, sizeof(qp->q_from)) == 0 && - ((qp->q_cmsglen == 0 && qp->q_msglen == msglen && - bcmp((char *)qp->q_msg+2, msg+2, msglen-2) == 0) || - (qp->q_cmsglen == msglen && - bcmp((char *)qp->q_cmsg+2, msg+2, msglen-2) == 0))) { - dprintf(3, (ddt, - "forw: dropped DUP id=%d\n", ntohs(id))); -#ifdef XSTATS - nameserIncr(fp->sin_addr, nssRcvdDupQ); -#endif - return (FW_DUP); - } - } - - qp = qnew(dname, class, type); - getname(np, tmpdomain, sizeof tmpdomain); - qp->q_domain = strdup(tmpdomain); - if (!qp->q_domain) - panic(ENOMEM, "ns_forw: strdup failed"); - qp->q_from = *fp; /* nslookup wants to know this */ - n = nslookup(nsp, qp, dname, "ns_forw"); - if (n < 0) { - dprintf(2, (ddt, "forw: nslookup reports danger\n")); - qfree(qp); - return (FW_SERVFAIL); - } - if (n == 0 && !fwdtab) { - dprintf(2, (ddt, "forw: no nameservers found\n")); - qfree(qp); - return (FW_NOSERVER); - } - qp->q_stream = qsp; - qp->q_curaddr = 0; - qp->q_fwd = fwdtab; - qp->q_dfd = dfd; - qp->q_id = id; - qp->q_expire = tt.tv_sec + RETRY_TIMEOUT*2; - hp->id = qp->q_nsid = htons(nsid_next()); - hp->ancount = htons(0); - hp->nscount = htons(0); - hp->arcount = htons(0); - if ((qp->q_msg = (u_char *)malloc((unsigned)msglen)) == NULL) { - syslog(LOG_NOTICE, "forw: malloc: %m"); - qfree(qp); - return (FW_SERVFAIL); - } - bcopy(msg, qp->q_msg, qp->q_msglen = msglen); - if (!qp->q_fwd) { - hp->rd = 0; - qp->q_addr[0].stime = tt; - } - -#ifdef SLAVE_FORWARD - if (forward_only) - schedretry(qp, (time_t)slave_retry); - else -#endif /* SLAVE_FORWARD */ - schedretry(qp, qp->q_fwd ?(2*RETRYBASE) :retrytime(qp)); - - nsa = Q_NEXTADDR(qp, 0); - dprintf(1, (ddt, - "forw: forw -> [%s].%d ds=%d nsid=%d id=%d %dms retry %dsec\n", - inet_ntoa(nsa->sin_addr), - ntohs(nsa->sin_port), ds, - ntohs(qp->q_nsid), ntohs(qp->q_id), - (qp->q_addr[0].nsdata != NULL) - ? qp->q_addr[0].nsdata->d_nstime - : -1, - (int)(qp->q_time - tt.tv_sec))); -#ifdef DEBUG - if (debug >= 10) - fp_nquery(msg, msglen, ddt); -#endif - if (sendto(ds, (char *)msg, msglen, 0, (struct sockaddr *)nsa, - sizeof(struct sockaddr_in)) < 0) { - if (!haveComplained((char*)nsa->sin_addr.s_addr, sendtoStr)) - syslog(LOG_INFO, "ns_forw: sendto([%s].%d): %m", - inet_ntoa(nsa->sin_addr), ntohs(nsa->sin_port)); - nameserIncr(nsa->sin_addr, nssSendtoErr); - } -#ifdef XSTATS - nameserIncr(fp->sin_addr, nssRcvdFwdQ); -#endif - nameserIncr(nsa->sin_addr, nssSentFwdQ); - if (qpp) - *qpp = qp; - hp->rd = 1; - return (0); -} - -/* struct qdatagram * - * aIsUs(addr) - * scan the datagramq (our list of interface addresses) for "addr" - * returns: - * pointer to qdatagram entry or NULL if no match is found - * notes: - * INADDR_ANY ([0.0.0.0]) is on the datagramq, so it's considered "us" - * author: - * Paul Vixie (DECWRL) April 1991 - */ -struct qdatagram * -aIsUs(addr) - struct in_addr addr; -{ - struct qdatagram *dqp; - - for (dqp = datagramq; dqp != QDATAGRAM_NULL; dqp = dqp->dq_next) { - if (addr.s_addr == dqp->dq_addr.s_addr) { - return dqp; - } - } - return NULL; -} - -/* haveComplained(tag1, tag2) - * check to see if we have complained about (tag1,tag2) recently - * (note that these are declared as pointers but are never deref'd) - * returns: - * boolean: have we complained recently? - * side-effects: - * outdated complaint records removed from our static list - * author: - * Paul Vixie (DECWRL) April 1991 - */ -int -haveComplained(tag1, tag2) - const char *tag1, *tag2; -{ - struct complaint { - const char *tag1, *tag2; - time_t expire; - struct complaint *next; - }; - static struct complaint *List = NULL; - struct complaint *cur, *next, *prev; - int r = 0; - - for (cur = List, prev = NULL; cur; prev = cur, cur = next) { - next = cur->next; - if (tt.tv_sec > cur->expire) { - if (prev) - prev->next = next; - else - List = next; - free((char*) cur); - cur = prev; - } else if ((tag1 == cur->tag1) && (tag2 == cur->tag2)) { - r++; - } - } - if (!r) { - cur = (struct complaint *)malloc(sizeof(struct complaint)); - if (cur) { - cur->tag1 = tag1; - cur->tag2 = tag2; - cur->expire = tt.tv_sec + INIT_REFRESH; /* "10:00" */ - cur->next = NULL; - if (prev) - prev->next = cur; - else - List = cur; - } - } - return (r); -} - -/* void - * nslookupComplain(sysloginfo, queryname, complaint, dname, a_rr) - * Issue a complaint about a dangerous situation found by nslookup(). - * params: - * sysloginfo is a string identifying the complainant. - * queryname is the domain name associated with the problem. - * complaint is a string describing what is wrong. - * dname and a_rr are the problematic other name server. - */ -static void -nslookupComplain(sysloginfo, queryname, complaint, dname, a_rr, nsdp) - const char *sysloginfo, *queryname, *complaint, *dname; - const struct databuf *a_rr, *nsdp; -{ -#ifdef STATS - char nsbuf[20]; - char abuf[20]; -#endif - char *a, *ns; - const char *a_type; - int print_a; - - dprintf(2, (ddt, "NS '%s' %s\n", dname, complaint)); - if (sysloginfo && queryname && !haveComplained(queryname, complaint)) - { - char buf[999]; - - a = ns = (char *)NULL; - print_a = (a_rr->d_type == T_A); - a_type = p_type(a_rr->d_type); -#ifdef NCACHE - if (a_rr->d_rcode) { - print_a = 0; - switch(a_rr->d_rcode) { - case NXDOMAIN: - a_type = "NXDOMAIN"; - break; - case NOERROR_NODATA: - a_type = "NODATA"; - break; - } - } -#endif -#ifdef STATS - if (nsdp) { - if (nsdp->d_ns) { - strcpy(nsbuf, inet_ntoa(nsdp->d_ns->addr)); - ns = nsbuf; - } else { - ns = zones[nsdp->d_zone].z_origin; - } - } - if (a_rr->d_ns) { - strcpy(abuf, inet_ntoa(a_rr->d_ns->addr)); - a = abuf; - } else { - a = zones[a_rr->d_zone].z_origin; - } -#endif - /* syslog only takes 5 params */ - if ( a != NULL || ns != NULL) - sprintf(buf, "%s: query(%s) %s (%s:%s) learnt (%s=%s:NS=%s)", - sysloginfo, queryname, - complaint, dname, - print_a ? - inet_ntoa(data_inaddr(a_rr->d_data)) : "", - a_type, - a ? a : "", - ns ? ns : "" ); - else - sprintf(buf, "%s: query(%s) %s (%s:%s)", - sysloginfo, queryname, - complaint, dname, - print_a ? - inet_ntoa(data_inaddr(a_rr->d_data)) : ""); - syslog(LOG_INFO, "%s", buf); - } -} - -/* - * nslookup(nsp, qp, syslogdname, sysloginfo) - * Lookup the address for each nameserver in `nsp' and add it to - * the list saved in the qinfo structure pointed to by `qp'. - * Omits information about nameservers that we shouldn't ask. - * Detects the following dangerous operations: - * One of the A records for one of the nameservers in nsp - * refers to the address of one of our own interfaces; - * One of the A records refers to the nameserver port on - * the host that asked us this question. - * returns: the number of addresses added, or -1 if a dangerous operation - * is detected. - * side effects: - * if a dangerous situation is detected and (syslogdname && sysloginfo), - * calls syslog. - */ -int -nslookup(nsp, qp, syslogdname, sysloginfo) - struct databuf *nsp[]; - register struct qinfo *qp; - const char *syslogdname; - const char *sysloginfo; -{ - register struct namebuf *np; - register struct databuf *dp, *nsdp; - register struct qserv *qs; - register int n; - register u_int i; - struct hashbuf *tmphtp; - char *dname; - const char *fname; - int oldn, naddr, class, found_arr, potential_ns; - time_t curtime; - - dprintf(3, (ddt, "nslookup(nsp=0x%lx, qp=0x%lx, \"%s\")\n", - (u_long)nsp, (u_long)qp, syslogdname)); - - potential_ns = 0; - naddr = n = qp->q_naddr; - curtime = (u_long) tt.tv_sec; - while ((nsdp = *nsp++) != NULL) { - class = nsdp->d_class; - dname = (char *)nsdp->d_data; - dprintf(3, (ddt, "nslookup: NS \"%s\" c=%d t=%d (%#lx)\n", - dname, class, nsdp->d_type, - (u_long)nsdp->d_flags)); - - /* don't put in servers we have tried */ - for (i = 0; i < qp->q_nusedns; i++) { - if (qp->q_usedns[i] == nsdp) { - dprintf(2, (ddt, - "skipping used NS w/name %s\n", - nsdp->d_data)); - goto skipserver; - } - } - - tmphtp = ((nsdp->d_flags & DB_F_HINT) ?fcachetab :hashtab); - np = nlookup(dname, &tmphtp, &fname, 1); - if (np == NULL) { - dprintf(3, (ddt, "%s: not found %s %lx\n", - dname, fname, (u_long)np)); - found_arr = 0; - goto need_sysquery; - } - if (fname != dname) { - if (findMyZone(np, class) == DB_Z_CACHE) { - /* - * lifted from findMyZone() - * We really need to know if the NS - * is the bottom of one of our zones - * to see if we've got missing glue - */ - for (; np; np = np_parent(np)) - for (dp = np->n_data; dp; dp = dp->d_next) - if (match(dp, class, T_NS)) { -#ifdef NCACHE - if (dp->d_rcode) - break; -#endif - if (dp->d_zone) { - static char *complaint = - "Glue A RR missing"; - nslookupComplain(sysloginfo, - syslogdname, - complaint, - dname, dp, - nsdp); - goto skipserver; - } else { - found_arr = 0; - goto need_sysquery; - } - } - /* shouldn't happen, but ... */ - found_arr = 0; - goto need_sysquery; - } else { - /* Authoritative A RR missing. */ - continue; - } - } - found_arr = 0; - oldn = n; - - /* look for name server addresses */ - delete_stale(np); - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - struct in_addr nsa; - - if (dp->d_type == T_CNAME && dp->d_class == class) { - static const char *complaint = - "NS points to CNAME"; -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - goto skipserver; - } - if (dp->d_type != T_A || dp->d_class != class) - continue; -#ifdef NCACHE - if (dp->d_rcode) { - static const char *complaint = - "A RR negative cache entry"; - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - goto skipserver; - } -#endif - if (data_inaddr(dp->d_data).s_addr == INADDR_ANY) { - static const char *complaint = - "Bogus (0.0.0.0) A RR"; - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - continue; - } -#ifdef INADDR_LOOPBACK - if (ntohl(data_inaddr(dp->d_data).s_addr) == - INADDR_LOOPBACK) { - static const char *complaint = - "Bogus LOOPBACK A RR"; - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - continue; - } -#endif -#ifdef INADDR_BROADCAST - if (ntohl(data_inaddr(dp->d_data).s_addr) == - INADDR_BROADCAST) { - static const char *complaint = - "Bogus BROADCAST A RR"; - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - continue; - } -#endif -#ifdef IN_MULTICAST - if (IN_MULTICAST(ntohl(data_inaddr(dp->d_data).s_addr))) { - static const char *complaint = - "Bogus MULTICAST A RR"; - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - continue; - } -#endif - /* - * Don't use records that may become invalid to - * reference later when we do the rtt computation. - * Never delete our safety-belt information! - */ - if ((dp->d_zone == 0) && - (dp->d_ttl < curtime) && - !(dp->d_flags & DB_F_HINT) ) - { - syslog(LOG_DEBUG, "nslookup: stale '%s'\n", - NAME(*np)); - n = oldn; - found_arr = 0; - goto need_sysquery; - } -#ifdef VALIDATE - /* anant@isi.edu validation procedure, maintains a - * table of server names-addresses used recently - */ - store_name_addr(dname, data_inaddr(dp->d_data), - syslogdname, sysloginfo); -#endif /*VALIDATE*/ - - found_arr++; - nsa = data_inaddr(dp->d_data); - /* don't put in duplicates */ - qs = qp->q_addr; - for (i = 0; i < n; i++, qs++) - if (qs->ns_addr.sin_addr.s_addr == nsa.s_addr) - goto skipaddr; - qs->ns_addr.sin_family = AF_INET; - qs->ns_addr.sin_port = ns_port; - qs->ns_addr.sin_addr = nsa; - qs->ns = nsdp; - qs->nsdata = dp; - qs->nretry = 0; - /* - * If this A RR has no RTT, initialize its RTT to a - * small random value. - */ - if (dp->d_nstime == 0) - dp->d_nstime = 1 + - (int)(25.0*rand()/(RAND_MAX + 1.0)); - /* - * if we are being asked to fwd a query whose - * nameserver list includes our own name/address(es), - * then we have detected a lame delegation and rather - * than melt down the network and hose down the other - * servers (who will hose us in return), we'll return - * -1 here which will cause SERVFAIL to be sent to - * the client's resolver which will hopefully then - * shut up. - * - * (originally done in nsContainsUs by vix@dec mar92; - * moved into nslookup by apb@und jan1993) - * - * try to limp along instead of denying service - * gdonl mar96 - */ - if (aIsUs(nsa)) { - static char *complaint = "contains our address"; - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - continue; - } - /* - * If we want to forward to a host that asked us - * this question then either we or they are sick - * (unless they asked from some port other than - * their nameserver port). (apb@und jan1993) - * - * try to limp along instead of denying service - * gdonl mar96 - */ - if (bcmp((char *)&qp->q_from, (char *)&qs->ns_addr, - sizeof(qp->q_from)) == 0) - { - static char *complaint = "forwarding loop"; - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - continue; - } -#ifdef BOGUSNS - /* - * Don't forward queries to bogus servers. Note - * that this is unlike the previous tests, which - * are fatal to the query. Here we just skip the - * server, which is only fatal if it's the last - * server. Note also that we antialias here -- all - * A RR's of a server are considered the same server, - * and if any of them is bogus we skip the whole - * server. Those of you using multiple A RR's to - * load-balance your servers will (rightfully) lose - * here. But (unfortunately) only if they are bogus. - */ - if (addr_on_netlist(nsa, boglist)) - goto skipserver; -#endif - - n++; - if (n >= NSMAX) - goto out; - skipaddr: - NULL; - } - dprintf(8, (ddt, "nslookup: %d ns addrs\n", n)); - need_sysquery: - if (found_arr == 0) { - potential_ns++; - if (!(qp->q_flags & Q_SYSTEM)) - (void) sysquery(dname, class, T_A, NULL, 0, - QUERY); - } - skipserver: - NULL; - } - out: - dprintf(3, (ddt, "nslookup: %d ns addrs total\n", n)); - qp->q_naddr = n; - if (n == 0 && potential_ns == 0 && !fwdtab) { - static char *complaint = "No possible A RRs"; - if (sysloginfo && syslogdname && - !haveComplained(syslogdname, complaint)) - { - syslog(LOG_INFO, "%s: query(%s) %s", - sysloginfo, syslogdname, complaint); - } - return(-1); - } - /* Update the refcounts before the sort. */ - for (i = naddr; i < n; i++) { - qp->q_addr[i].nsdata->d_rcnt++; - qp->q_addr[i].ns->d_rcnt++; - } - if (n > 1) { - qsort((char *)qp->q_addr, n, sizeof(struct qserv), - (int (*)__P((const void *, const void *)))qcomp); - } - return (n - naddr); -} - -/* - * qcomp - compare two NS addresses, and return a negative, zero, or - * positive value depending on whether the first NS address is - * "better than", "equally good as", or "inferior to" the second - * NS address. - * - * How "goodness" is defined (for the purposes of this routine): - * - If the estimated round trip times differ by an amount deemed significant - * then the one with the smaller estimate is preferred; else - * - If we can determine which one is topologically closer then the - * closer one is preferred; else - * - The one with the smaller estimated round trip time is preferred - * (zero is returned if the two estimates are identical). - * - * How "topological closeness" is defined (for the purposes of this routine): - * Ideally, named could consult some magic map of the Internet and - * determine the length of the path to an arbitrary destination. Sadly, - * no such magic map exists. However, named does have a little bit of - * topological information in the form of the sortlist (which includes - * the directly connected subnet(s), the directly connected net(s), and - * any additional nets that the administrator has added using the "sortlist" - * directive in the bootfile. Thus, if only one of the addresses matches - * something in the sortlist then it is considered to be topologically - * closer. If both match, but match different entries in the sortlist, - * then the one that matches the entry closer to the beginning of the - * sorlist is considered to be topologically closer. In all other cases, - * topological closeness is ignored because it's either indeterminate or - * equal. - * - * How times are compared: - * Both times are rounded to the closest multiple of the NOISE constant - * defined below and then compared. If the rounded values are equal - * then the difference in the times is deemed insignificant. Rounding - * is used instead of merely taking the absolute value of the difference - * because doing the latter would make the ordering defined by this - * routine be incomplete in the mathematical sense (e.g. A > B and - * B > C would not imply A > C). The mathematics are important in - * practice to avoid core dumps in qsort(). - * - * XXX: this doesn't solve the European root nameserver problem very well. - * XXX: we should detect and mark as inferior nameservers that give bogus - * answers - * - * (this was originally vixie's stuff but almquist fixed fatal bugs in it - * and wrote the above documentation) - */ - -/* - * RTT delta deemed to be significant, in milliseconds. With the current - * definition of RTTROUND it must be a power of 2. - */ -#define NOISE 128 /* milliseconds; 0.128 seconds */ - -#define sign(x) (((x) < 0) ? -1 : ((x) > 0) ? 1 : 0) -#define RTTROUND(rtt) (((rtt) + (NOISE >> 1)) & ~(NOISE - 1)) - -int -qcomp(qs1, qs2) - struct qserv *qs1, *qs2; -{ - int pos1, pos2, pdiff; - u_long rtt1, rtt2; - long tdiff; - - if ((!qs1->nsdata) || (!qs2->nsdata)) - return 0; - rtt1 = qs1->nsdata->d_nstime; - rtt2 = qs2->nsdata->d_nstime; - - dprintf(10, (ddt, "qcomp(%s, %s) %lu (%lu) - %lu (%lu) = %lu", - inet_ntoa(qs1->ns_addr.sin_addr), - inet_ntoa(qs2->ns_addr.sin_addr), - rtt1, RTTROUND(rtt1), rtt2, RTTROUND(rtt2), - rtt1 - rtt2)); - if (RTTROUND(rtt1) == RTTROUND(rtt2)) { - pos1 = position_on_netlist(qs1->ns_addr.sin_addr, nettab); - pos2 = position_on_netlist(qs2->ns_addr.sin_addr, nettab); - pdiff = pos1 - pos2; - dprintf(10, (ddt, ", pos1=%d, pos2=%d\n", pos1, pos2)); - if (pdiff) - return (pdiff); - } else { - dprintf(10, (ddt, "\n")); - } - tdiff = rtt1 - rtt2; - return (sign(tdiff)); -} -#undef sign -#undef RTTROUND - -/* - * Arrange that forwarded query (qp) is retried after t seconds. - * Query list will be sorted after z_time is updated. - */ -void -schedretry(qp, t) - struct qinfo *qp; - time_t t; -{ - register struct qinfo *qp1, *qp2; - -#ifdef DEBUG - if (debug > 3) { - fprintf(ddt, "schedretry(0x%lx, %ld sec)\n", - (u_long)qp, (long)t); - if (qp->q_time) - fprintf(ddt, - "WARNING: schedretry(%#lx, %ld) q_time already %ld\n", - (u_long)qp, (long)t, (long)qp->q_time); - } -#endif - t += (u_long) tt.tv_sec; - qp->q_time = t; - - if ((qp1 = retryqp) == NULL) { - retryqp = qp; - qp->q_next = NULL; - return; - } - if (t < qp1->q_time) { - qp->q_next = qp1; - retryqp = qp; - return; - } - while ((qp2 = qp1->q_next) != NULL && qp2->q_time < t) - qp1 = qp2; - qp1->q_next = qp; - qp->q_next = qp2; -} - -/* - * Unsched is called to remove a forwarded query entry. - */ -void -unsched(qp) - struct qinfo *qp; -{ - register struct qinfo *np; - - dprintf(3, (ddt, "unsched(%#lx, %d)\n", (u_long)qp, ntohs(qp->q_id))); - if (retryqp == qp) { - retryqp = qp->q_next; - } else { - for (np=retryqp; np->q_next != QINFO_NULL; np = np->q_next) { - if (np->q_next != qp) - continue; - np->q_next = qp->q_next; /* dequeue */ - break; - } - } - qp->q_next = QINFO_NULL; /* sanity check */ - qp->q_time = 0; -} - -/* - * Retry is called to retransmit query 'qp'. - */ -void -retry(qp) - register struct qinfo *qp; -{ - register int n; - register HEADER *hp; - struct sockaddr_in *nsa; - - dprintf(3, (ddt, "retry(x%lx) id=%d\n", (u_long)qp, ntohs(qp->q_id))); - - if (qp->q_msg == NULL) { /* XXX - why? */ - qremove(qp); - return; - } - - if (qp->q_expire && (qp->q_expire < tt.tv_sec)) { - dprintf(1, (ddt, - "retry(x%lx): expired @ %lu (%d secs before now (%lu))\n", - (u_long)qp, (u_long)qp->q_expire, - (int)(tt.tv_sec - qp->q_expire), - (u_long)tt.tv_sec)); - if (qp->q_stream || (qp->q_flags & Q_PRIMING)) - goto fail; - qremove(qp); - return; - } - - /* try next address */ - n = qp->q_curaddr; - if (qp->q_fwd) { - qp->q_fwd = qp->q_fwd->next; - if (qp->q_fwd) - goto found; - /* out of forwarders, try direct queries */ - } else - ++qp->q_addr[n].nretry; - if (!forward_only) { - do { - if (++n >= (int)qp->q_naddr) - n = 0; - if (qp->q_addr[n].nretry < MAXRETRY) - goto found; - } while (n != qp->q_curaddr); - } -fail: - /* - * Give up. Can't reach destination. - */ - hp = (HEADER *)(qp->q_cmsg ? qp->q_cmsg : qp->q_msg); - if (qp->q_flags & Q_PRIMING) { - /* Can't give up priming */ - unsched(qp); - schedretry(qp, (time_t)60*60); /* 1 hour */ - hp->rcode = NOERROR; /* Lets be safe, reset the query */ - hp->qr = hp->aa = 0; - qp->q_fwd = fwdtab; - for (n = 0; n < (int)qp->q_naddr; n++) - qp->q_addr[n].nretry = 0; - return; - } - dprintf(5, (ddt, "give up\n")); - n = ((HEADER *)qp->q_cmsg ? qp->q_cmsglen : qp->q_msglen); - hp->id = qp->q_id; - hp->qr = 1; - hp->ra = (NoRecurse == 0); - hp->rd = 1; - hp->rcode = SERVFAIL; -#ifdef DEBUG - if (debug >= 10) - fp_nquery(qp->q_msg, n, ddt); -#endif - if (send_msg((u_char *)hp, n, qp)) { - dprintf(1, (ddt, "gave up retry(x%lx) nsid=%d id=%d\n", - (u_long)qp, ntohs(qp->q_nsid), ntohs(qp->q_id))); - } -#ifdef XSTATS - nameserIncr(qp->q_from.sin_addr, nssSentFail); -#endif - qremove(qp); - return; - -found: - if (qp->q_fwd == 0 && qp->q_addr[n].nretry == 0) - qp->q_addr[n].stime = tt; - qp->q_curaddr = n; - hp = (HEADER *)qp->q_msg; - hp->rd = (qp->q_fwd ? 1 : 0); - nsa = Q_NEXTADDR(qp, n); - dprintf(1, (ddt, - "%s(addr=%d n=%d) -> [%s].%d ds=%d nsid=%d id=%d %dms\n", - (qp->q_fwd ? "reforw" : "resend"), - n, qp->q_addr[n].nretry, - inet_ntoa(nsa->sin_addr), - ntohs(nsa->sin_port), ds, - ntohs(qp->q_nsid), ntohs(qp->q_id), - (qp->q_addr[n].nsdata != 0) - ? qp->q_addr[n].nsdata->d_nstime - : (-1))); -#ifdef DEBUG - if (debug >= 10) - fp_nquery(qp->q_msg, qp->q_msglen, ddt); -#endif - /* NOSTRICT */ - if (sendto(ds, (char*)qp->q_msg, qp->q_msglen, 0, - (struct sockaddr *)nsa, - sizeof(struct sockaddr_in)) < 0) { - dprintf(3, (ddt, "error resending msg errno=%d\n", errno)); - } - hp->rd = 1; /* leave set to 1 for dup detection */ - nameserIncr(nsa->sin_addr, nssSentDupQ); - unsched(qp); -#ifdef SLAVE_FORWARD - if(forward_only) - schedretry(qp, (time_t)slave_retry); - else -#endif /* SLAVE_FORWARD */ - schedretry(qp, qp->q_fwd ? (2*RETRYBASE) : retrytime(qp)); -} - -/* - * Compute retry time for the next server for a query. - * Use a minimum time of RETRYBASE (4 sec.) or twice the estimated - * service time; * back off exponentially on retries, but place a 45-sec. - * ceiling on retry times for now. (This is because we don't hold a reference - * on servers or their addresses, and we have to finish before they time out.) - */ -time_t -retrytime(qp) - struct qinfo *qp; -{ - time_t t, u, v; - struct qserv *ns = &qp->q_addr[qp->q_curaddr]; - - if (ns->nsdata != NULL) - t = (time_t) MAX(RETRYBASE, 2 * ns->nsdata->d_nstime / 1000); - else - t = (time_t) RETRYBASE; - u = t << ns->nretry; - v = MIN(u, RETRY_TIMEOUT); /* max. retry timeout for now */ - dprintf(3, (ddt, "retrytime: nstime%ldms t%ld nretry%ld u%ld : v%ld\n", - ns->nsdata ?(long)(ns->nsdata->d_nstime / 1000) :(long)-1, - (long)t, (long)ns->nretry, (long)u, (long)v)); - return (v); -} - -void -qflush() -{ - while (nsqhead) - qremove(nsqhead); - nsqhead = QINFO_NULL; - priming = 0; -} - -void -qremove(qp) - register struct qinfo *qp; -{ - dprintf(3, (ddt, "qremove(x%lx)\n", (u_long)qp)); - - if (qp->q_flags & Q_ZSERIAL) - qserial_answer(qp, 0); - unsched(qp); - qfree(qp); -} - -#if defined(__STDC__) || defined(__GNUC__) -struct qinfo * -qfindid(u_int16_t id) -#else -struct qinfo * -qfindid(id) - register u_int16_t id; -#endif -{ - register struct qinfo *qp; - - dprintf(3, (ddt, "qfindid(%d)\n", ntohs(id))); - for (qp = nsqhead; qp!=QINFO_NULL; qp = qp->q_link) { - if (qp->q_nsid == id) - return(qp); - } - dprintf(5, (ddt, "qp not found\n")); - return (NULL); -} - -struct qinfo * -qnew(name, class, type) - const char *name; - int class; - int type; -{ - register struct qinfo *qp; - - qp = (struct qinfo *)calloc(1, sizeof(struct qinfo)); - if (qp == NULL) - panic(ENOMEM, "qnew: calloc failed"); - dprintf(5, (ddt, "qnew(%#x)\n", qp)); -#ifdef BIND_NOTIFY - qp->q_notifyzone = DB_Z_CACHE; -#endif - qp->q_link = nsqhead; - nsqhead = qp; - qp->q_name = strdup(name); - if (!qp->q_name) - panic(ENOMEM, "qnew: strdup failed"); - qp->q_class = (u_int16_t)class; - qp->q_type = (u_int16_t)type; - return (qp); -} - -void -nsfree(qp, where) - struct qinfo *qp; - char *where; -{ - static const char freed[] = "freed", busy[] = "busy"; - const char *result; - struct databuf *dp; - int i; - - for (i = 0 ; i < (int)qp->q_naddr ; i++) { - dp = qp->q_addr[i].ns; - if (dp) { - result = (--(dp->d_rcnt)) ? busy : freed; - dprintf(1, (ddt, "%s: ns %s rcnt %d (%s)\n", - where, dp->d_data, dp->d_rcnt, result)); - if (result == freed) - db_free(dp); - } - dp = qp->q_addr[i].nsdata; - if (dp) { - result = (--(dp->d_rcnt)) ? busy : freed; - dprintf(1, (ddt, "%s: nsdata %s rcnt %d (%s)\n", - where, inet_ntoa(data_inaddr(dp->d_data)), - dp->d_rcnt, result)); - if (result == freed) - db_free(dp); - } - } -} - -void -qfree(qp) - struct qinfo *qp; -{ - struct qinfo *np; - struct databuf *dp; - - dprintf(3, (ddt, "Qfree(x%lx)\n", (u_long)qp)); - if (qp->q_next) - dprintf(1, (ddt, "WARNING: qfree of linked ptr x%lx\n", - (u_long)qp)); - if (qp->q_msg) - free(qp->q_msg); - if (qp->q_cmsg) - free(qp->q_cmsg); - if (qp->q_domain) - free(qp->q_domain); - if (qp->q_name) - free(qp->q_name); - nsfree(qp, "qfree"); - if (nsqhead == qp) - nsqhead = qp->q_link; - else { - for (np = nsqhead; np->q_link != QINFO_NULL; np = np->q_link) { - if (np->q_link != qp) - continue; - np->q_link = qp->q_link; /* dequeue */ - break; - } - } - free((char*)qp); -} diff --git a/contrib/bind/named/ns_func.h b/contrib/bind/named/ns_func.h deleted file mode 100644 index aa61381f3405..000000000000 --- a/contrib/bind/named/ns_func.h +++ /dev/null @@ -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-- */ diff --git a/contrib/bind/named/ns_glob.h b/contrib/bind/named/ns_glob.h deleted file mode 100644 index efb0035a8d36..000000000000 --- a/contrib/bind/named/ns_glob.h +++ /dev/null @@ -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 */ diff --git a/contrib/bind/named/ns_init.c b/contrib/bind/named/ns_init.c deleted file mode 100644 index a94e1d4516ee..000000000000 --- a/contrib/bind/named/ns_init.c +++ /dev/null @@ -1,1137 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)ns_init.c 4.38 (Berkeley) 3/21/91"; -static char rcsid[] = "$Id: ns_init.c,v 8.25 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "named.h" - -#undef nsaddr - -enum limit { Datasize , Files }; - -static void zoneinit __P((struct zoneinfo *)), - get_forwarders __P((FILE *)), - boot_read __P((const char *filename, int includefile)), -#ifdef DEBUG - content_zone __P((int)), -#endif - do_reload __P((char *, int, int)), - free_forwarders __P((void)), - ns_limit __P((const char *name, int value)), - ns_checknames __P((const char *names, - const char *severity)), - ns_rlimit __P((const char *name, enum limit limit, - long value)), - ns_option __P((const char *name)); - -static struct zoneinfo *find_zone __P((char *, int, int)); - -static enum severity checkname_severity[num_trans]; - -/* - * Set new refresh time for zone. Use a random number in the last half of - * the refresh limit; we want it to be substantially correct while still - * preventing slave synchronization. - */ -void -ns_refreshtime(zp, timebase) - struct zoneinfo *zp; - time_t timebase; -{ - u_long refresh = (zp->z_refresh > 0) ? zp->z_refresh : INIT_REFRESH; - time_t half = (refresh + 1) / 2; - - zp->z_time = timebase + half + (rand() % half); -} - -/* - * Set new retry time for zone. - */ -void -ns_retrytime(zp, timebase) - struct zoneinfo *zp; - time_t timebase; -{ - zp->z_time = timebase + zp->z_retry; -} - -/* - * Read boot file for configuration info. - */ -void -ns_init(bootfile) - char *bootfile; -{ - register struct zoneinfo *zp; - static int loads = 0; /* number of times loaded */ - - dprintf(1, (ddt, "\nns_init(%s)\n", bootfile)); - gettime(&tt); - - memset(checkname_severity, '\0', sizeof checkname_severity); - checkname_severity[primary_trans] = fail; - checkname_severity[secondary_trans] = warn; - checkname_severity[response_trans] = ignore; - - if (loads == 0) { - if ((zones = - (struct zoneinfo *)calloc(64, sizeof(struct zoneinfo))) - == NULL) { - syslog(LOG_ERR, - "Not enough memory to allocate initial zones array"); - exit(1); - } - nzones = 1; /* zone zero is cache data */ - /* allocate cache hash table, formerly the root hash table. */ - hashtab = savehash((struct hashbuf *)NULL); - - /* allocate root-hints/file-cache hash table */ - fcachetab = savehash((struct hashbuf *)NULL); - /* init zone data */ - zones[0].z_type = Z_CACHE; - zones[0].z_origin = ""; - } else { - /* Mark previous zones as not yet found in boot file. */ - for (zp = &zones[1]; zp < &zones[nzones]; zp++) - zp->z_flags &= ~Z_FOUND; -#ifdef LOCALDOM - if (localdomain) { - free(localdomain); - localdomain = NULL; - } -#endif - free_forwarders(); - free_netlist(enettab); -#ifdef XFRNETS - free_netlist(&xfrnets); -#endif -#ifdef BOGUSNS - free_netlist(&boglist); -#endif - forward_only = 0; - } - - dprintf(3, (ddt, "\n content of zones before loading \n")); -#ifdef DEBUG - if (debug >= 3) { - content_zone(nzones - 1); - } -#endif - boot_read(bootfile, 0); - - /* erase all old zones that were not found */ - for (zp = &zones[1]; zp < &zones[nzones]; zp++) { - if (zp->z_type && (zp->z_flags & Z_FOUND) == 0) { -#ifdef CLEANCACHE - remove_zone(hashtab, zp - zones, 1); -#else - remove_zone(hashtab, zp - zones); -#endif -#ifdef SECURE_ZONES - free_netlist(&zp->secure_nets); -#endif - do_reload(zp->z_origin, zp->z_type, zp->z_class); - syslog(LOG_NOTICE, "Zone \"%s\" was removed", zp->z_origin); - free(zp->z_origin); - free(zp->z_source); - bzero((char *) zp, sizeof(*zp)); - } - } - dprintf(2, (ddt,"\n content of zones after loading\n")); - -#ifdef DEBUG - if (debug >= 2) { - content_zone(nzones-1); - } -#endif - - /* - * Schedule calls to ns_maint(). - */ - if (!needmaint) - sched_maint(); - dprintf(1, (ddt, "exit ns_init()%s\n", - needmaint ? ", need maintenance immediately" : "")); - loads++; -} - -/* - * Read the actual boot file. - * Set up to recurse. - */ -static void -boot_read(filename, includefile) - const char *filename; - int includefile; -{ - register struct zoneinfo *zp; - char buf[MAXDNAME], obuf[MAXDNAME], *source; - FILE *fp; - int type; - int class; -#ifdef GEN_AXFR - char *class_p; -#endif - struct stat f_time; - static int tmpnum = 0; /* unique number for tmp zone files */ - int slineno; /* Saved global line number. */ - int i; - - if ((fp = fopen(filename, "r")) == NULL) { - syslog(LOG_ERR, "%s: %m", filename); - if (includefile) - return; - exit(1); - } - - slineno = lineno; - lineno = 1; - - while (!feof(fp) && !ferror(fp)) { - /* read named.boot keyword and process args */ - if (!getword(buf, sizeof(buf), fp, 0)) { - /* - * This is a blank line, a commented line, or the - * '\n' of the previous line. - */ - continue; - } - if (strcasecmp(buf, "directory") == 0) { - (void) getword(buf, sizeof(buf), fp, 0); - if (chdir(buf) < 0) { - syslog(LOG_CRIT, "directory %s: %m\n", - buf); - exit(1); - } - continue; - } else if (strcasecmp(buf, "sortlist") == 0) { - get_netlist(fp, enettab, ALLOW_NETS, buf); - continue; - } else if (strcasecmp(buf, "max-fetch") == 0) { - max_xfers_running = getnum(fp, filename, GETNUM_NONE); - continue; - } else if (strcasecmp(buf, "limit") == 0) { - (void) getword(buf, sizeof(buf), fp, 0); - ns_limit(buf, getnum(fp, filename, GETNUM_SCALED)); - continue; - } else if (strcasecmp(buf, "options") == 0) { - while (getword(buf, sizeof(buf), fp, 0)) - ns_option(buf); - continue; - } else if (strcasecmp(buf, "check-names") == 0) { - (void) getword(buf, sizeof(buf), fp, 0); - (void) getword(obuf, sizeof(obuf), fp, 0); - ns_checknames(buf, obuf); - continue; - } else if (strcasecmp(buf, "forwarders") == 0) { - get_forwarders(fp); - continue; - } else if (strcasecmp(buf, "slave") == 0) { - forward_only++; - continue; -#ifdef BOGUSNS - } else if (strcasecmp(buf, "bogusns") == 0) { - get_netlist(fp, &boglist, ALLOW_HOSTS, buf); - continue; -#endif -#ifdef XFRNETS - } else if ((strcasecmp(buf, "tcplist") == 0) || - (strcasecmp(buf, "xfrnets") == 0)) { - get_netlist(fp, &xfrnets, ALLOW_NETS, buf); - continue; -#endif -#ifdef LOCALDOM - } else if (strcasecmp(buf, "domain") == 0) { - if (getword(buf, sizeof(buf), fp, 1)) - localdomain = savestr(buf); - continue; -#endif - } else if (strcasecmp(buf, "include") == 0) { - if (getword(buf, sizeof(buf), fp, 0)) - boot_read(buf, 1); - continue; - } else if (strncasecmp(buf, "cache", 5) == 0) { - type = Z_CACHE; - class = C_IN; -#ifdef GEN_AXFR - if (class_p = strchr(buf, '/')) { - class = get_class(class_p+1); - - if (class != C_IN) { - syslog(LOG_NOTICE, - "cache directive with non-IN class is not supported (yet)"); - endline(fp); - continue; - } - } -#endif - } else if (strncasecmp(buf, "primary", 7) == 0) { - type = Z_PRIMARY; - class = C_IN; -#ifdef GEN_AXFR - if (class_p = strchr(buf, '/')) - class = get_class(class_p+1); -#endif - } else if (strncasecmp(buf, "secondary", 9) == 0) { - type = Z_SECONDARY; - class = C_IN; -#ifdef GEN_AXFR - if (class_p = strchr(buf, '/')) - class = get_class(class_p+1); -#endif -#ifdef STUBS - } else if (strncasecmp(buf, "stub", 4) == 0) { - type = Z_STUB; - class = C_IN; -#ifdef GEN_AXFR - if (class_p = strchr(buf, '/')) - class = get_class(class_p+1); -#endif -#endif - } else { - syslog(LOG_NOTICE, - "%s: line %d: unknown directive '%s'\n", - filename, lineno, buf); - endline(fp); - continue; - } - - /* - * read zone origin - */ - if (!getword(obuf, sizeof(obuf), fp, 1)) { - syslog(LOG_NOTICE, "%s: line %d: missing origin\n", - filename, lineno); - continue; - } - i = strlen(obuf); - if ((obuf[i-1] == '.') && (i != 1)) - syslog(LOG_INFO, - "%s: line %d: zone \"%s\" has trailing dot\n", - filename, lineno, obuf); - while ((--i >= 0) && (obuf[i] == '.')) - obuf[i] = '\0'; - dprintf(1, (ddt, "zone origin %s", obuf[0]?obuf:".")); - /* - * Read source file or host address. - */ - if (!getword(buf, sizeof(buf), fp, 0)) { - syslog(LOG_NOTICE, "%s: line %d: missing %s\n", - filename, lineno, -#ifdef STUBS - (type == Z_SECONDARY || type == Z_STUB) -#else - (type == Z_SECONDARY) -#endif - ?"host address" - :"source file"); - continue; - } - - /* - * Check for previous instance of this zone (reload). - */ - if (!(zp = find_zone(obuf, type, class))) { - if (type == Z_CACHE) { - zp = &zones[0]; - goto gotcache; - } - for (zp = &zones[1]; zp < &zones[nzones]; zp++) - if (zp->z_type == Z_NIL) - goto gotzone; - /* - * This code assumes that nzones never decreases. - */ - if (nzones % 64 == 0) { - dprintf(1, (ddt, - "Reallocating zones structure\n")); - /* - * Realloc() not used since it might damage zones - * if an error occurs. - */ - zp = (struct zoneinfo *) - malloc((64 + nzones) - * sizeof(struct zoneinfo)); - if (!zp) { - syslog(LOG_NOTICE, - "no memory for more zones"); - endline(fp); - continue; - } - bcopy((char *)zones, (char *)zp, - nzones * sizeof(struct zoneinfo)); - bzero((char *)&zp[nzones], - 64 * sizeof(struct zoneinfo)); - free(zones); - zones = zp; - } - zp = &zones[nzones++]; - gotzone: - zp->z_origin = savestr(obuf); - gotcache: - zp->z_type = type; - zp->z_class = class; - } - zp->z_addrcnt = 0; - - switch (type) { - case Z_CACHE: - source = savestr(buf); - dprintf(1, (ddt, ", source = %s\n", source)); - zp->z_refresh = 0; /* by default, no dumping */ - if (getword(buf, sizeof(buf), fp, 0)) { -#ifdef notyet - zp->z_refresh = atoi(buf); - if (zp->z_refresh <= 0) { - syslog(LOG_NOTICE, - "%s: line %d: bad refresh time '%s', ignored\n", - filename, lineno, buf); - zp->z_refresh = 0; - } else if (cache_file == NULL) - cache_file = source; -#else - syslog(LOG_NOTICE, - "%s: line %d: cache refresh ignored\n", - filename, lineno); -#endif - endline(fp); - } - /* - * If we've loaded this file, and the file has - * not been modified and contains no $include, - * then there's no need to reload. - */ - if (zp->z_source && - !strcmp(source, zp->z_source) && - !(zp->z_flags & Z_INCLUDE) && - stat(zp->z_source, &f_time) != -1 && - zp->z_ftime == f_time.st_mtime) { - dprintf(1, (ddt, "cache is up to date\n")); - if (source != cache_file) - free(source); - break; /* zone is already up to date */ - } - - /* file has changed, or hasn't been loaded yet */ - if (zp->z_source) { - free(zp->z_source); -#ifdef CLEANCACHE - remove_zone(fcachetab, 0, 1); -#else - remove_zone(fcachetab, 0); -#endif - } - zp->z_source = source; - dprintf(1, (ddt, "reloading zone\n")); - (void) db_load(zp->z_source, zp->z_origin, zp, NULL); - break; - - case Z_PRIMARY: - source = savestr(buf); - endline(fp); - - dprintf(1, (ddt, ", source = %s\n", source)); - /* - * If we've loaded this file, and the file has - * not been modified and contains no $include, - * then there's no need to reload. - */ - if (zp->z_source && - !strcmp(source, zp->z_source) && - !(zp->z_flags & Z_INCLUDE) && - stat(zp->z_source, &f_time) != -1 && - zp->z_ftime == f_time.st_mtime) { - dprintf(1, (ddt, "zone is up to date\n")); - free(source); - break; /* zone is already up to date */ - } - if (zp->z_source) { - free(zp->z_source); -#ifdef CLEANCACHE - remove_zone(hashtab, zp - zones, 1); -#else - remove_zone(hashtab, zp - zones); -#endif - } - zp->z_source = source; - zp->z_flags &= ~Z_AUTH; -#ifdef PURGE_ZONE - purge_zone(zp->z_origin, hashtab, zp->z_class); -#endif - dprintf(1, (ddt, "reloading zone\n")); - if (!db_load(zp->z_source, zp->z_origin, zp, NULL)) - zp->z_flags |= Z_AUTH; - zp->z_refresh = 0; /* no maintenance needed */ - zp->z_time = 0; - break; - - case Z_SECONDARY: -#ifdef STUBS - case Z_STUB: -#endif - source = NULL; - dprintf(1, (ddt, "\n\taddrs: ")); - do { - if (!inet_aton(buf, - &zp->z_addr[zp->z_addrcnt]) - ) { - source = savestr(buf); - endline(fp); - break; - } - dprintf(1, (ddt, "%s, ", buf)); - if ((int)++zp->z_addrcnt > NSMAX - 1) { - zp->z_addrcnt = NSMAX - 1; - dprintf(1, (ddt, - "\nns.h NSMAX reached\n")); - } - } while (getword(buf, sizeof(buf), fp, 0)); - dprintf(1, (ddt, "addrcnt = %d\n", zp->z_addrcnt)); - if (!source) { - /* - * We will always transfer this zone again - * after a reload. - */ - sprintf(buf, "%s/NsTmp%ld.%d", _PATH_TMPDIR, - (long)getpid(), tmpnum++); - source = savestr(buf); - zp->z_flags |= Z_TMP_FILE; - } else - zp->z_flags &= ~Z_TMP_FILE; - /* - * If we had a backup file name, and it was changed, - * free old zone and start over. If we don't have - * current zone contents, try again now in case - * we have a new server on the list. - */ - if (zp->z_source && - (strcmp(source, zp->z_source) || - (stat(zp->z_source, &f_time) == -1 || - (zp->z_ftime != f_time.st_mtime)))) { - dprintf(1, (ddt, - "backup file changed or missing\n")); - free(zp->z_source); - zp->z_source = NULL; - zp->z_serial = 0; /* force xfer */ - if (zp->z_flags & Z_AUTH) { - zp->z_flags &= ~Z_AUTH; -#ifdef CLEANCACHE - remove_zone(hashtab, zp - zones, 1); -#else - remove_zone(hashtab, zp - zones); -#endif - /* - * reload parent so that NS records are - * present during the zone transfer. - */ - do_reload(zp->z_origin, zp->z_type, - zp->z_class); - } - } - if (zp->z_source) - free(source); - else - zp->z_source = source; - if (!(zp->z_flags & Z_AUTH)) - zoneinit(zp); -#ifdef FORCED_RELOAD - else { - /* - ** Force secondary to try transfer right away - ** after SIGHUP. - */ - if (!(zp->z_flags & (Z_QSERIAL|Z_XFER_RUNNING)) - && reloading) { - zp->z_time = tt.tv_sec; - needmaint = 1; - } - } -#endif /* FORCED_RELOAD */ - break; - - } - if ((zp->z_flags & Z_FOUND) && /* already found? */ - (zp - zones) != DB_Z_CACHE) /* cache never sets Z_FOUND */ - syslog(LOG_NOTICE, - "Zone \"%s\" declared more than once", - zp->z_origin); - zp->z_flags |= Z_FOUND; - dprintf(1, (ddt, "zone[%d] type %d: '%s'", - zp-zones, type, - *(zp->z_origin) == '\0' ? "." : zp->z_origin)); - if (zp->z_refresh && zp->z_time == 0) - ns_refreshtime(zp, tt.tv_sec); - if (zp->z_time <= tt.tv_sec) - needmaint = 1; - dprintf(1, (ddt, " z_time %lu, z_refresh %lu\n", - (u_long)zp->z_time, (u_long)zp->z_refresh)); - } - (void) my_fclose(fp); - lineno = slineno; -} - -static void -zoneinit(zp) - register struct zoneinfo *zp; -{ - struct stat sb; - int result; - - /* - * Try to load zone from backup file, - * if one was specified and it exists. - * If not, or if the data are out of date, - * we will refresh the zone from a primary - * immediately. - */ - if (!zp->z_source) - return; - result = stat(zp->z_source, &sb); -#ifdef PURGE_ZONE - if (result != -1) - purge_zone(zp->z_origin, hashtab, zp->z_class); -#endif - if (result == -1 || db_load(zp->z_source, zp->z_origin, zp, NULL)) { - /* - * Set zone to be refreshed immediately. - */ - zp->z_refresh = INIT_REFRESH; - zp->z_retry = INIT_REFRESH; - if (!(zp->z_flags & (Z_QSERIAL|Z_XFER_RUNNING))) { - zp->z_time = tt.tv_sec; - needmaint = 1; - } - } else { - zp->z_flags |= Z_AUTH; - } -} - -static void -get_forwarders(fp) - FILE *fp; -{ - char buf[MAXDNAME]; - register struct fwdinfo *fip = NULL, *ftp = NULL; - -#ifdef SLAVE_FORWARD - int forward_count = 0; -#endif - - dprintf(1, (ddt, "forwarders ")); - - /* On multiple forwarder lines, move to end of the list. */ -#ifdef SLAVE_FORWARD - if (fwdtab != NULL){ - forward_count++; - for (fip = fwdtab; fip->next != NULL; fip = fip->next) - forward_count++; - } -#else - if (fwdtab != NULL) { - for (fip = fwdtab; fip->next != NULL; fip = fip->next) { - ; - } - } -#endif /* SLAVE_FORWARD */ - - while (getword(buf, sizeof(buf), fp, 0)) { - if (strlen(buf) == 0) - break; - dprintf(1, (ddt," %s",buf)); - if (!ftp) { - ftp = (struct fwdinfo *)malloc(sizeof(struct fwdinfo)); - if (!ftp) - panic(errno, "malloc(fwdinfo)"); - } - if (inet_aton(buf, &ftp->fwdaddr.sin_addr)) { - ftp->fwdaddr.sin_port = ns_port; - ftp->fwdaddr.sin_family = AF_INET; - } else { - syslog(LOG_NOTICE, "'%s' (ignored, NOT dotted quad)", - buf); - continue; - } -#ifdef FWD_LOOP - if (aIsUs(ftp->fwdaddr.sin_addr)) { - syslog(LOG_NOTICE, - "Forwarder '%s' ignored, my address", - buf); - dprintf(1, (ddt, " (ignored, my address)")); - continue; - } -#endif /* FWD_LOOP */ - ftp->next = NULL; - if (fwdtab == NULL) - fwdtab = ftp; /* First time only */ - else - fip->next = ftp; - fip = ftp; - ftp = NULL; -#ifdef SLAVE_FORWARD - forward_count++; -#endif /* SLAVE_FORWARD */ - } - if (ftp) - free((char *)ftp); - -#ifdef SLAVE_FORWARD - /* - ** Set the slave retry time to 60 seconds total divided - ** between each forwarder - */ - if (forward_count != 0) { - slave_retry = (int) (60 / forward_count); - if(slave_retry <= 0) - slave_retry = 1; - } -#endif - - dprintf(1, (ddt, "\n")); -#ifdef DEBUG - if (debug > 2) { - for (ftp = fwdtab; ftp != NULL; ftp = ftp->next) { - fprintf(ddt, "ftp x%lx [%s] next x%lx\n", - (u_long)ftp, - inet_ntoa(ftp->fwdaddr.sin_addr), - (u_long)ftp->next); - } - } -#endif -} - -static void -free_forwarders() -{ - register struct fwdinfo *ftp, *fnext; - - for (ftp = fwdtab; ftp != NULL; ftp = fnext) { - fnext = ftp->next; - free((char *)ftp); - } - fwdtab = NULL; -} - -static struct zoneinfo * -find_zone(name, type, class) - char *name; - int type, class; -{ - register struct zoneinfo *zp; - - for (zp = &zones[1]; zp < &zones[nzones]; zp++) { - if (zp->z_type == type && zp->z_class == class && - strcasecmp(name, zp->z_origin) == 0) { - dprintf(2, (ddt, ", old zone (%d)", zp - zones)); - return (zp); - } - } - dprintf(2, (ddt, ", new zone")); - return NULL; -} - -static void -do_reload(domain, type, class) - char *domain; - int type; - int class; -{ - char *s; - struct zoneinfo *zp; - - dprintf(1, (ddt, "do_reload: %s %d %d\n", - *domain ? domain : ".", type, class)); - - /* the zone has changed type? */ - /* NOTE: we still exist so don't match agains ourselves */ - /* If we are a STUB or SECONDARY check that we have loaded */ - if (((type != Z_STUB) && (zp = find_zone(domain, Z_STUB, class)) && - zp->z_serial) || - ((type != Z_CACHE) && find_zone(domain, Z_CACHE, class)) || - ((type != Z_PRIMARY) && find_zone(domain, Z_PRIMARY, class)) || - ((type != Z_SECONDARY) - && (zp = find_zone(domain, Z_SECONDARY, class)) && zp->z_serial) - ) { - return; - } - - while ((s = strchr(domain, '.')) || *domain) { - if (s) - domain = s + 1; /* skip dot */ - else - domain = ""; /* root zone */ - - if ((zp = find_zone(domain, Z_STUB, class)) || - (zp = find_zone(domain, Z_CACHE, class)) || - (zp = find_zone(domain, Z_PRIMARY, class)) || - (zp = find_zone(domain, Z_SECONDARY, class))) { - - dprintf(1, (ddt, "do_reload: matched %s\n", - *domain ? domain : ".")); - -#ifdef CLEANCACHE - if (zp->z_type == Z_CACHE) - remove_zone(fcachetab, 0, 1); - else - remove_zone(hashtab, zp - zones, 1); -#else - if (zp->z_type == Z_CACHE) - remove_zone(fcachetab, 0); - else - remove_zone(hashtab, zp - zones); -#endif - zp->z_flags &= ~Z_AUTH; - - switch (zp->z_type) { - case Z_SECONDARY: - case Z_STUB: - zoneinit(zp); - break; - case Z_PRIMARY: - case Z_CACHE: - if (db_load(zp->z_source, zp->z_origin, zp, 0) - == 0) - zp->z_flags |= Z_AUTH; - break; - } - break; - } - } -} - -#ifdef DEBUG -/* prints out the content of zones */ -static void -content_zone(end) - int end; -{ - int i; - - for (i = 1; i <= end; i++) { - printzoneinfo(i); - } -} -#endif - -static void -ns_limit(name, value) - const char *name; - int value; -{ - if (!strcasecmp(name, "transfers-in")) { - max_xfers_running = value; - } else if (!strcasecmp(name, "transfers-per-ns")) { - max_xfers_per_ns = value; - } else if (!strcasecmp(name, "datasize")) { - ns_rlimit("datasize", Datasize, value); - } else if (!strcasecmp(name, "files")) { - ns_rlimit("files", Files, value); - } else { - syslog(LOG_ERR, - "error: unrecognized limit in bootfile: \"%s\"", - name); - exit(1); - } -} - -static int -select_string(strings, string) - const char *strings[]; - const char *string; -{ - int i; - - for (i = 0; strings[i] != NULL; i++) - if (!strcasecmp(strings[i], string)) - return (i); - return (-1); -} - -static void -ns_checknames(transport_str, severity_str) - const char *transport_str; - const char *severity_str; -{ - enum transport transport; - enum severity severity; - int i; - - if ((i = select_string(transport_strings, transport_str)) == -1) { - syslog(LOG_ERR, - "error: unrecognized transport type in bootfile: \"%s\"", - transport_str); - exit(1); - } - transport = (enum transport) i; - - if ((i = select_string(severity_strings, severity_str)) == -1) { - syslog(LOG_ERR, - "error: unrecognized severity type in bootfile: \"%s\"", - severity_str); - exit(1); - } - severity = (enum severity) i; - - checkname_severity[transport] = severity; - syslog(LOG_INFO, "check-names %s %s", transport_str, severity_str); -} - -enum context -ns_ptrcontext(owner) - const char *owner; -{ - if (samedomain(owner, "in-addr.arpa") || samedomain(owner, "ip6.int")) - return (hostname_ctx); - return (domain_ctx); -} - -enum context -ns_ownercontext(type, transport) - int type; - enum transport transport; -{ - enum context context; - - switch (type) { - case T_A: - case T_WKS: - case T_MX: - switch (transport) { - case primary_trans: - case secondary_trans: - context = owner_ctx; - break; - case response_trans: - context = hostname_ctx; - break; - default: - panic(-1, "impossible condition in ns_ownercontext()"); - } - break; - case T_MB: - case T_MG: - context = mailname_ctx; - default: - context = domain_ctx; - break; - } - return (context); -} - -int -ns_nameok(name, class, transport, context, owner, source) - const char *name; - int class; - enum transport transport; - enum context context; - struct in_addr source; - const char *owner; -{ - enum severity severity = checkname_severity[transport]; - int ok; - - if (severity == ignore) - return (1); - switch (context) { - case domain_ctx: - ok = (class != C_IN) || res_dnok(name); - break; - case owner_ctx: - ok = (class != C_IN) || res_ownok(name); - break; - case mailname_ctx: - ok = res_mailok(name); - break; - case hostname_ctx: - ok = res_hnok(name); - break; - default: - panic(-1, "impossible condition in ns_nameok()"); - } - if (!ok) { - char *s, *o; - - if (source.s_addr == INADDR_ANY) - s = strdup(transport_strings[transport]); - else { - s = malloc(strlen(transport_strings[transport]) + - sizeof " from [000.000.000.000]"); - if (s) - sprintf(s, "%s from [%s]", - transport_strings[transport], - inet_ntoa(source)); - } - if (strcasecmp(owner, name) == 0) - o = strdup(""); - else { - const char *t = (*owner == '\0') ? "." : owner; - - o = malloc(strlen(t) + sizeof " (owner \"\")"); - if (o) - sprintf(o, " (owner \"%s\")", t); - } -#ifndef ultrix - syslog((transport == response_trans) ? LOG_INFO : LOG_NOTICE, - "%s name \"%s\"%s %s (%s) is invalid - %s", - context_strings[context], - name, o != NULL ? o : "[malloc failed]", p_class(class), - s != NULL ? s : "[malloc failed]", - (severity == fail) ? "rejecting" : "proceeding anyway"); -#endif - if (severity == warn) - ok = 1; - if (s) - free(s); - if (o) - free(o); - } - return (ok); -} - -int -ns_wildcard(name) - const char *name; -{ - if (*name != '*') - return (0); - return (*++name == '\0'); -} - -static void -ns_rlimit(name, limit, value) - const char *name; - enum limit limit; - long value; -{ -#ifndef HAVE_GETRUSAGE -# ifdef LINT - name; limit; value; -# endif - syslog(LOG_WARNING, "warning: unimplemented limit in bootfile: \"%s\"", - name); -#else - struct rlimit limits; - int rlimit = -1; - - switch (limit) { - case Datasize: - rlimit = RLIMIT_DATA; - break; - case Files: -#ifdef RLIMIT_NOFILE - rlimit = RLIMIT_NOFILE; -#endif - break; - default: - panic(-1, "impossible condition in ns_rlimit()"); - } - if (rlimit == -1) { - syslog(LOG_WARNING, - "limit \"%s\" not supported on this system - ignored", - name); - return; - } - if (getrlimit(rlimit, &limits) < 0) { - syslog(LOG_WARNING, "getrlimit(%s): %m", name); - return; - } - limits.rlim_cur = limits.rlim_max = value; - if (setrlimit(rlimit, &limits) < 0) { - syslog(LOG_WARNING, "setrlimit(%s, %ld): %m", name, value); - return; - } -#endif -} - -static void -ns_option(name) - const char *name; -{ - if (!strcasecmp(name, "no-recursion")) { - NoRecurse = 1; - } else if (!strcasecmp(name, "no-fetch-glue")) { - NoFetchGlue = 1; -#ifdef QRYLOG - } else if (!strcasecmp(name, "query-log")) { - qrylog = 1; -#endif - } else if (!strcasecmp(name, "forward-only")) { - forward_only = 1; -#ifndef INVQ - } else if (!strcasecmp(name, "fake-iquery")) { - fake_iquery = 1; -#endif - } else { - syslog(LOG_ERR, - "error: unrecognized option in bootfile: \"%s\"", - name); - exit(1); - } -} diff --git a/contrib/bind/named/ns_main.c b/contrib/bind/named/ns_main.c deleted file mode 100644 index 7f880820d94f..000000000000 --- a/contrib/bind/named/ns_main.c +++ /dev/null @@ -1,1696 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)ns_main.c 4.55 (Berkeley) 7/1/91"; -static char rcsid[] = "$Id: ns_main.c,v 8.25 1997/06/01 20:34:34 vixie Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1989, 1990 - * - - * Copyright (c) 1986, 1989, 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-- - */ - -#if !defined(lint) && !defined(SABER) -char copyright[] = -"@(#) Copyright (c) 1986, 1989, 1990 The Regents of the University of California.\n\ - portions Copyright (c) 1993 Digital Equipment Corporation\n\ - portions Copyright (c) 1995 Internet Software Consortium\n\ - All rights reserved.\n"; -#endif /* not lint */ - -/* - * Internet Name server (see RCF1035 & others). - */ - -#include -#include -#include -#include -#if !defined(SYSV) && defined(XXX) -#include -#endif /* !SYSV */ -#if defined(__osf__) -# define _SOCKADDR_LEN /* XXX - should be in portability.h but that - * would need to be included before socket.h - */ -#endif -#include -#include -#include -#if defined(__osf__) -# include -# include -#endif -#if defined(_AIX) -# include -# define TIME_H_INCLUDED -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(SVR4) -# include -#endif - -#define MAIN_PROGRAM -#include "named.h" -#undef MAIN_PROGRAM - -#undef nsaddr - - /* UDP receive, TCP send buffer size */ -static const int rbufsize = 8 * 1024, - /* TCP send window size */ - sbufsize = 16 * 1024; - -static struct sockaddr_in nsaddr; -static u_int16_t local_ns_port, /* our service port */ - nsid_state; -static fd_set mask; /* open descriptors */ -static char **Argv = NULL; -static char *LastArg = NULL; /* end of argv */ - -static struct qstream *sqadd __P((void)); -static void sq_query __P((struct qstream *)), - opensocket __P((struct qdatagram *)), -#ifdef DEBUG - printnetinfo __P((struct netinfo *)), -#endif - setdebug __P((int)); -static int sq_here __P((struct qstream *)); - -static SIG_FN onintr __P(()), - maint_alarm __P(()), - setdumpflg __P(()), - onhup __P(()), -#if defined(QRYLOG) && defined(SIGWINCH) - setQrylogFlg __P(()), -#endif - setIncrDbgFlg __P(()), - setNoDbgFlg __P(()), -#ifdef SIGSYS - sigprof __P(()), -#endif /* SIGSYS */ - setchkptflg __P(()), - setstatsflg __P(()); - -static void -usage() -{ - fprintf(stderr, -"Usage: named [-d #] [-q] [-r] [-p port[/localport]] [[-b] bootfile]\n"); - exit(1); -} - -/*ARGSUSED*/ -void -main(argc, argv, envp) - int argc; - char *argv[], *envp[]; -{ - register int n, udpcnt; - register char *arg; - register struct qstream *sp; - register struct qdatagram *dqp; - struct qstream *nextsp; - int nfds; - const int on = 1; - int rfd, size, len; - time_t lasttime, maxctime; - u_char buf[PACKETSZ]; -#ifdef NeXT - int old_sigmask; -#endif - fd_set tmpmask; - struct timeval t, *tp; - struct qstream *candidate = QSTREAM_NULL; - char **argp; -#ifdef PID_FIX - char oldpid[10]; -#endif -#ifdef WANT_PIDFILE - FILE *fp; /* file descriptor for pid file */ -#endif -#ifdef IP_OPTIONS - u_char ip_opts[50]; /* arbitrary size */ -#endif -#ifdef RLIMIT_NOFILE - struct rlimit rl; -#endif - - local_ns_port = ns_port = htons(NAMESERVER_PORT); - - /* BSD has a better random number generator but it's not clear - * that we need it here. - */ - gettime(&tt); - srand(((unsigned)getpid()) + (unsigned)tt.tv_usec); - - /* - ** Save start and extent of argv for ns_setproctitle(). - */ - - Argv = argp = argv; - while (*argp) - argp++; - LastArg = argp[-1] + strlen(argp[-1]); - - (void) umask(022); - /* XXX - should use getopt here */ - while (--argc > 0) { - arg = *++argv; - if (*arg == '-') { - while (*++arg) - switch (*arg) { - case 'b': - if (--argc <= 0) - usage(); - bootfile = savestr(*++argv); - break; - - case 'd': - ++argv; - - if (*argv != 0) { - if (**argv == '-') { - argv--; - break; - } -#ifdef DEBUG - debug = atoi(*argv); -#endif - --argc; - } -#ifdef DEBUG - if (debug <= 0) - debug = 1; - setdebug(1); -#endif - break; - - case 'p': - /* use nonstandard port number. - * usage: -p remote/local - * remote is the port number to which - * we send queries. local is the port - * on which we listen for queries. - * local defaults to same as remote. - */ - if (--argc <= 0) - usage(); - ns_port = htons((u_int16_t) - atoi(*++argv)); - { - char *p = strchr(*argv, '/'); - if (p) { - local_ns_port = - htons((u_int16_t) - atoi(p+1)); - } else { - local_ns_port = ns_port; - } - } - break; - -#ifdef QRYLOG - case 'q': - qrylog = 1; - break; -#endif - - case 'r': - NoRecurse = 1; - break; - - default: - usage(); - } - } else - bootfile = savestr(*argv); - } - -#ifdef DEBUG - if (!debug) -#endif - for (n = getdtablesize() - 1; n > 2; n--) - (void) close(n); /* don't use my_close() here */ -#ifdef DEBUG - else { - fprintf(ddt, "Debug turned ON, Level %d\n",debug); - fprintf(ddt, "Version = %s\n", Version); - fprintf(ddt, "bootfile = %s\n", bootfile); - } -#endif - - n = 0; -#if defined(DEBUG) && defined(LOG_PERROR) - if (debug) - n |= LOG_PERROR; -#endif -#ifdef LOG_NOWAIT - n |= LOG_NOWAIT; -#endif -#ifdef LOG_DAEMON - openlog("named", LOG_PID|LOG_CONS|LOG_NDELAY|n, LOGFAC); -#else - openlog("named", LOG_PID); -#endif - -#ifdef RLIMIT_NOFILE - rl.rlim_cur = rl.rlim_max = FD_SETSIZE; - if (setrlimit(RLIMIT_NOFILE, &rl) == -1) - syslog(LOG_ERR, "setrlimit(RLIMIT_FSIZE,FD_SETSIZE): %m"); -#endif - /* check that udp checksums are on */ - ns_udp(); - -#ifdef WANT_PIDFILE - /* tuck my process id away */ -#ifdef PID_FIX - fp = fopen(PidFile, "w"); - if (fp != NULL) { - (void) fgets(oldpid, sizeof(oldpid), fp); - (void) rewind(fp); - fprintf(fp, "%ld\n", (long)getpid()); - (void) my_fclose(fp); - } -#else /*PID_FIX*/ - fp = fopen(PidFile, "w"); - if (fp != NULL) { - fprintf(fp, "%d\n", getpid()); - (void) my_fclose(fp); - } -#endif /*PID_FIX*/ -#endif /*WANT_PIDFILE*/ - - syslog(LOG_NOTICE, "starting. %s", Version); - - _res.options &= ~(RES_DEFNAMES | RES_DNSRCH | RES_RECURSE); - - nsaddr.sin_family = AF_INET; - nsaddr.sin_addr.s_addr = INADDR_ANY; - nsaddr.sin_port = local_ns_port; - nsid_init(); - - /* - ** Open stream port. - */ - for (n = 0; ; n++) { - int fd; - if ((vs = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - syslog(LOG_ERR, "socket(SOCK_STREAM): %m"); - exit(1); - } -#ifdef F_DUPFD - /* - * leave a space for stdio to work in - */ - if ((fd = fcntl(vs, F_DUPFD, 20)) != -1) { - close(vs); - vs = fd; - } else - syslog(LOG_NOTICE, "fcntl(vs, F_DUPFD, 20): %m"); -#endif - if (setsockopt(vs, SOL_SOCKET, SO_REUSEADDR, (char *)&on, - sizeof(on)) != 0) - { - syslog(LOG_NOTICE, "setsockopt(vs, reuseaddr): %m"); - (void) my_close(vs); - continue; - } - if (bind(vs, (struct sockaddr *)&nsaddr, sizeof(nsaddr)) == 0) - break; - - if (errno != EADDRINUSE || n > 4) { - if (errno == EADDRINUSE) { - syslog(LOG_NOTICE, - "There may be a name server already running"); - syslog(LOG_ERR, "exiting"); - } else { - syslog(LOG_ERR, "bind(vs, [%s].%d): %m", - inet_ntoa(nsaddr.sin_addr), - ntohs(nsaddr.sin_port)); - } -#if defined(WANT_PIDFILE) && defined(PID_FIX) - /* put old pid back */ - if (atoi(oldpid) && (fp = fopen(PidFile, "w"))) { - fprintf(fp, "%s", oldpid); - (void) my_fclose(fp); - _exit(1); - } -#endif /*WANT_PIDFILE && PID_FIX*/ - exit(1); - } - /* Retry opening the socket a few times */ - my_close(vs); - sleep(3); - } - if (listen(vs, 5) != 0) { - syslog(LOG_ERR, "listen(vs, 5): %m"); - exit(1); - } - - /* - * named would be terminated if one of these is sent and no handler. - */ - setsignal(SIGINT, -1, setdumpflg); - setsignal(SIGQUIT, -1, setchkptflg); - setsignal(SIGIOT, -1, setstatsflg); - setsignal(SIGUSR1, -1, setIncrDbgFlg); - setsignal(SIGUSR2, -1, setNoDbgFlg); - setsignal(SIGHUP, -1, onhup); - -#if defined(SIGWINCH) && defined(QRYLOG) - setsignal(SIGWINCH, -1, setQrylogFlg); -#endif - - /* - * Get list of local addresses and set up datagram sockets. - */ - FD_ZERO(&mask); - FD_SET(vs, &mask); - getnetconf(); - - /* - ** Initialize and load database. - */ - gettime(&tt); - buildservicelist(); - buildprotolist(); - ns_init(bootfile); -#ifdef DEBUG - if (debug) { - fprintf(ddt, "Network and sort list:\n"); - printnetinfo(nettab); - } -#endif - - time(&boottime); - resettime = boottime; - - setsignal(SIGALRM, SIGCHLD, maint_alarm); - setsignal(SIGCHLD, SIGALRM, reapchild); - setsignal(SIGPIPE, -1, (SIG_FN (*)())SIG_IGN); - -#if defined(SIGXFSZ) - /* Wierd DEC Hesiodism, harmless. */ - setsignal(SIGXFSZ, -1, onhup); -#endif - -#ifdef SIGSYS - setsignal(SIGSYS, -1, sigprof); -#endif /* SIGSYS */ - -#ifdef XSTATS - /* Catch SIGTERM so we can write stats before exiting. */ - setsignal(SIGTERM, -1, onintr); -#endif - - dprintf(1, (ddt, "database initialized\n")); - t.tv_usec = 0; - - /* - * Fork and go into background now that - * we've done any slow initialization - * and are ready to answer queries. - */ -#ifdef USE_SETSID - if ( -#ifdef DEBUG - !debug || -#endif - !isatty(0)) { - if (fork() > 0) - exit(0); - setsid(); -#ifdef DEBUG - if (!debug) -#endif - { - n = open(_PATH_DEVNULL, O_RDONLY); - (void) dup2(n, 0); - (void) dup2(n, 1); - (void) dup2(n, 2); - if (n > 2) - (void) my_close(n); - } - } -#else -#ifdef DEBUG - if (!debug) -#endif - { -#ifdef HAVE_DAEMON - daemon(1, 0); -#else - switch (fork()) { - case -1: - syslog(LOG_ERR, "fork: %m"); - exit(1); - /*FALLTHROUGH*/ - case 0: - /* child */ - break; - default: - /* parent */ - exit(0); - } - n = open(_PATH_DEVNULL, O_RDONLY); - (void) dup2(n, 0); - (void) dup2(n, 1); - (void) dup2(n, 2); - if (n > 2) - (void) my_close(n); -#if defined(SYSV) || defined(hpux) - setpgrp(); -#else - { - struct itimerval ival; - - /* - * The open below may hang on pseudo ttys if the person - * who starts named logs out before this point. - * - * needmaint may get set inapropriately if the open - * hangs, but all that will happen is we will see that - * no maintenance is required. - */ - bzero((char *)&ival, sizeof(ival)); - ival.it_value.tv_sec = 120; - (void) setitimer(ITIMER_REAL, &ival, - (struct itimerval *)NULL); - n = open(_PATH_TTY, O_RDWR); - ival.it_value.tv_sec = 0; - (void) setitimer(ITIMER_REAL, &ival, - (struct itimerval *)NULL); - if (n > 0) { - (void) ioctl(n, TIOCNOTTY, (char *)NULL); - (void) my_close(n); - } - } -#endif /* SYSV */ -#endif /* HAVE_DAEMON */ - } -#endif /* USE_SETSID */ -#ifdef WANT_PIDFILE - /* tuck my process id away again */ - fp = fopen(PidFile, "w"); - if (fp != NULL) { - fprintf(fp, "%ld\n", (long)getpid()); - (void) my_fclose(fp); - } -#endif - - syslog(LOG_NOTICE, "Ready to answer queries.\n"); - prime_cache(); - nfds = getdtablesize(); /* get the number of file descriptors */ - if (nfds > FD_SETSIZE) { - nfds = FD_SETSIZE; /* Bulletproofing */ - syslog(LOG_NOTICE, "Return from getdtablesize() > FD_SETSIZE"); - } -#ifdef NeXT - old_sigmask = sigblock(sigmask(SIGCHLD)); -#endif - for (;;) { -#ifdef DEBUG - if (ddt && debug == 0) { - fprintf(ddt,"Debug turned OFF\n"); - (void) my_fclose(ddt); - ddt = 0; - } -#endif -#ifdef XSTATS - if (needToExit) { - ns_logstats(); - exit(0); - } -#endif /* XSTATS */ - if (needreload) { - needreload = 0; - db_reload(); - } - if (needStatsDump) { - needStatsDump = 0; - ns_stats(); - } - if (needendxfer) { - holdsigchld(); - needendxfer = 0; /* should be safe even if not held */ - endxfer(); /* releases SIGCHLD */ - } - releasesigchld(); - if (needzoneload) { - needzoneload = 0; - loadxfer(); - } - if (needmaint) { - needmaint = 0; - ns_maint(); - } - if(needToChkpt) { - needToChkpt = 0; - doachkpt(); - } - if(needToDoadump) { - needToDoadump = 0; - doadump(); - } - /* - ** Wait until a query arrives - */ - if (retryqp != NULL) { - gettime(&tt); - /* - ** The tv_sec field might be unsigned - ** and thus cannot be negative. - */ - if ((int32_t) retryqp->q_time <= tt.tv_sec) { - retry(retryqp); - continue; - } - t.tv_sec = (int32_t) retryqp->q_time - tt.tv_sec; - tp = &t; - } else - tp = NULL; - tmpmask = mask; -#ifdef NeXT - sigsetmask(old_sigmask); /* Let queued signals run. */ -#endif - n = select(nfds, &tmpmask, (fd_set *)NULL, (fd_set *)NULL, tp); -#ifdef NeXT - old_sigmask = sigblock(sigmask(SIGCHLD)); -#endif - if (n < 0 && errno != EINTR) { - syslog(LOG_ERR, "select: %m"); - sleep(60); - } - if (n <= 0) - continue; - - for (dqp = datagramq; - dqp != QDATAGRAM_NULL; - dqp = dqp->dq_next) { - if (FD_ISSET(dqp->dq_dfd, &tmpmask)) - for (udpcnt = 0; udpcnt < 42; udpcnt++) { /*XXX*/ - int from_len = sizeof(from_addr); - - if ((n = recvfrom(dqp->dq_dfd, (char *)buf, - MIN(PACKETSZ, sizeof buf), 0, - (struct sockaddr *)&from_addr, &from_len)) < 0) - { -#if defined(SPURIOUS_ECONNREFUSED) - if ((n < 0) && (errno == ECONNREFUSED)) - break; -#endif - if ((n < 0) && (errno == PORT_WOULDBLK)) - break; - syslog(LOG_INFO, "recvfrom: %m"); - break; - } - if (n == 0) - break; - gettime(&tt); - dprintf(1, (ddt, - "\ndatagram from [%s].%d, fd %d, len %d; now %s", - inet_ntoa(from_addr.sin_addr), - ntohs(from_addr.sin_port), - dqp->dq_dfd, n, - ctimel(tt.tv_sec))); - if (n < HFIXEDSZ) - break; -#ifdef DEBUG - if (debug >= 10) - fp_nquery(buf, n, ddt); -#endif - /* - * Consult database to get the answer. - */ - gettime(&tt); - ns_req(buf, n, PACKETSZ, QSTREAM_NULL, &from_addr, - dqp->dq_dfd); - } - } - /* - ** Process stream connection. - ** - ** Note that a "continue" in here takes us back to the select() - ** which, if our accept() failed, will bring us back here. - */ - if (FD_ISSET(vs, &tmpmask)) { - int from_len = sizeof(from_addr); - - rfd = accept(vs, - (struct sockaddr *)&from_addr, - &from_len); - if (rfd < 0 && errno == EINTR) - continue; - if (rfd < 0 && errno == EMFILE && streamq) { - maxctime = 0; - candidate = NULL; - for (sp = streamq; sp; sp = nextsp) { - nextsp = sp->s_next; - if (sp->s_refcnt) - continue; - gettime(&tt); - lasttime = tt.tv_sec - sp->s_time; - if (lasttime >= VQEXPIRY) - sqrm(sp); - else if (lasttime > maxctime) { - candidate = sp; - maxctime = lasttime; - } - } - if (candidate) - sqrm(candidate); - continue; - } - if (rfd < 0) { - syslog(LOG_INFO, "accept: %m"); - continue; - } - if ((n = fcntl(rfd, F_GETFL, 0)) < 0) { - syslog(LOG_INFO, "fcntl(rfd, F_GETFL): %m"); - (void) my_close(rfd); - continue; - } - if (fcntl(rfd, F_SETFL, n|PORT_NONBLOCK) != 0) { - syslog(LOG_INFO, "fcntl(rfd, NONBLOCK): %m"); - (void) my_close(rfd); - continue; - } -#if defined(IP_OPTIONS) - len = sizeof ip_opts; - if (getsockopt(rfd, IPPROTO_IP, IP_OPTIONS, - (char *)ip_opts, &len) < 0) { - syslog(LOG_INFO, - "getsockopt(rfd, IP_OPTIONS): %m"); - (void) my_close(rfd); - continue; - } - if (len != 0) { - nameserIncr(from_addr.sin_addr, nssRcvdOpts); - if (!haveComplained((char*) - from_addr.sin_addr.s_addr, - "rcvd ip options")) { - syslog(LOG_INFO, - "rcvd IP_OPTIONS from [%s].%d (ignored)", - inet_ntoa(from_addr.sin_addr), - ntohs(from_addr.sin_port)); - } - if (setsockopt(rfd, IPPROTO_IP, IP_OPTIONS, - NULL, 0) < 0) { - syslog(LOG_INFO, - "setsockopt(!IP_OPTIONS): %m"); - (void) my_close(rfd); - continue; - } - } -#endif - if (setsockopt(rfd, SOL_SOCKET, SO_SNDBUF, - (char*)&sbufsize, sizeof(sbufsize)) < 0){ - syslog(LOG_INFO, - "setsockopt(rfd, SO_SNDBUF, %d): %m", - sbufsize); - (void) my_close(rfd); - continue; - } - if (setsockopt(rfd, SOL_SOCKET, SO_KEEPALIVE, - (char *)&on, sizeof(on)) < 0) { - syslog(LOG_INFO, - "setsockopt(rfd, KEEPALIVE): %m"); - (void) my_close(rfd); - continue; - } - if ((sp = sqadd()) == QSTREAM_NULL) { - (void) my_close(rfd); - continue; - } - sp->s_rfd = rfd; /* stream file descriptor */ - sp->s_size = -1; /* amount of data to receive */ - gettime(&tt); - sp->s_time = tt.tv_sec; /* last transaction time */ - sp->s_from = from_addr; /* address to respond to */ - sp->s_bufp = (u_char *)&sp->s_tempsize; - FD_SET(rfd, &mask); - FD_SET(rfd, &tmpmask); -#ifdef DEBUG - if (debug) - syslog(LOG_DEBUG, - "IP/TCP connection from %s (fd %d)\n", - sin_ntoa(&sp->s_from), rfd); -#endif - } - if (streamq) - dprintf(3, (ddt, "streamq = 0x%lx\n", - (u_long)streamq)); - for (sp = streamq; sp != QSTREAM_NULL; sp = nextsp) { - nextsp = sp->s_next; - if (!FD_ISSET(sp->s_rfd, &tmpmask)) - continue; - dprintf(5, (ddt, - "sp x%lx rfd %d size %d time %d next x%lx\n", - (u_long)sp, sp->s_rfd, sp->s_size, - sp->s_time, (u_long)sp->s_next)); - dprintf(5, (ddt, - "\tbufsize %d buf x%lx bufp x%lx\n", - sp->s_bufsize, - (u_long)sp->s_buf, (u_long)sp->s_bufp)); - if (sp->s_size < 0) { - size = INT16SZ - - (sp->s_bufp - (u_char *)&sp->s_tempsize); - while (size > 0 && - (n = read(sp->s_rfd, sp->s_bufp, size)) > 0 - ) { - sp->s_bufp += n; - size -= n; - } - if ((n < 0) && (errno == PORT_WOULDBLK)) - continue; - if (n <= 0) { - sqrm(sp); - continue; - } - if ((sp->s_bufp - (u_char *)&sp->s_tempsize) == - INT16SZ) { - sp->s_size = ntohs(sp->s_tempsize); - if (sp->s_bufsize == 0) { - if (!(sp->s_buf = (u_char *) - malloc(rbufsize)) - ) { - sp->s_buf = buf; - sp->s_bufsize=sizeof(buf); - } else { - sp->s_bufsize = rbufsize; - } - } - if (sp->s_size > sp->s_bufsize && - sp->s_bufsize != 0 - ) { - sp->s_buf = (u_char *) - realloc((char *)sp->s_buf, - (unsigned)sp->s_size); - if (sp->s_buf == NULL) { - sp->s_buf = buf; - sp->s_bufsize = 0; - sp->s_size = sizeof(buf); - } else { - sp->s_bufsize = sp->s_size; - } - } - sp->s_bufp = sp->s_buf; - } - } - gettime(&tt); - sp->s_time = tt.tv_sec; - while (sp->s_size > 0 && - (n = read(sp->s_rfd, - sp->s_bufp, - sp->s_size) - ) > 0 - ) { - sp->s_bufp += n; - sp->s_size -= n; - } - - if (sp->s_size > 0 && - (n == -1) && - (errno == PORT_WOULDBLK)) - continue; - - /* - * we don't have enough memory for the query. - * if we have a query id, then we will send an - * error back to the user. - */ - if (sp->s_bufsize == 0) { - if (sp->s_bufp - sp->s_buf > INT16SZ) { - HEADER *hp; - - hp = (HEADER *)sp->s_buf; - hp->qr = 1; - hp->ra = (NoRecurse == 0); - hp->ancount = 0; - hp->qdcount = 0; - hp->nscount = 0; - hp->arcount = 0; - hp->rcode = SERVFAIL; - (void) writemsg(sp->s_rfd, sp->s_buf, - HFIXEDSZ); - } - sqrm(sp); - continue; - } - - /* - * If the message is too short to contain a valid - * header, try to send back an error, and drop the - * message. - */ - if (sp->s_bufp - sp->s_buf < HFIXEDSZ) { - if (sp->s_bufp - sp->s_buf > INT16SZ) { - HEADER *hp; - - hp = (HEADER *)sp->s_buf; - hp->qr = 1; - hp->ra = (NoRecurse == 0); - hp->ancount = 0; - hp->qdcount = 0; - hp->nscount = 0; - hp->arcount = 0; - hp->rcode = SERVFAIL; - (void) writemsg(sp->s_rfd, sp->s_buf, - HFIXEDSZ); - } - sqrm(sp); - continue; - } - if (n <= 0) { - sqrm(sp); - continue; - } - /* - * Consult database to get the answer. - */ - if (sp->s_size == 0) { -#ifdef XSTATS - nameserIncr(sp->s_from.sin_addr, nssRcvdTCP); -#endif - sq_query(sp); - ns_req(sp->s_buf, - sp->s_bufp - sp->s_buf, - sp->s_bufsize, sp, - &sp->s_from, -1); - /* ns_req() can call sqrm() - check for it */ - if (sq_here(sp)) { - sp->s_bufp = (u_char *)&sp->s_tempsize; - sp->s_size = -1; - } - continue; - } - } - } - /* NOTREACHED */ -} - -void -getnetconf() -{ - register struct netinfo *ntp; - struct netinfo *ontp; - struct ifconf ifc; - struct ifreq ifreq, *ifr; - struct qdatagram *dqp; - static int first = 1; - char buf[32768], *cp, *cplim; - u_int32_t nm; - time_t my_generation = time(NULL); - - ifc.ifc_len = sizeof buf; - ifc.ifc_buf = buf; - if (ioctl(vs, SIOCGIFCONF, (char *)&ifc) < 0) { - syslog(LOG_ERR, "get interface configuration: %m - exiting"); - exit(1); - } - ntp = NULL; -#if defined(AF_LINK) && \ - !defined(RISCOS_BSD) && !defined(M_UNIX) && \ - !defined(sgi) && !defined(sun) && !defined(NO_SA_LEN) -#define my_max(a, b) (a > b ? a : b) -#define my_size(p) my_max((p).sa_len, sizeof(p)) -#else -#define my_size(p) (sizeof (p)) -#endif - cplim = buf + ifc.ifc_len; /* skip over if's with big ifr_addr's */ - for (cp = buf; - cp < cplim; - cp += sizeof (ifr->ifr_name) + my_size(ifr->ifr_addr)) { -#undef my_size - ifr = (struct ifreq *)cp; - if (ifr->ifr_addr.sa_family != AF_INET || - ((struct sockaddr_in *) - &ifr->ifr_addr)->sin_addr.s_addr == 0) { - continue; - } - ifreq = *ifr; - /* - * Don't test IFF_UP, packets may still be received at this - * address if any other interface is up. - */ -#if !defined(BSD) || (BSD < 199103) - if (ioctl(vs, SIOCGIFADDR, (char *)&ifreq) < 0) { - syslog(LOG_NOTICE, "get interface addr: %m"); - continue; - } -#endif - dprintf(1, (ddt, "considering [%s]\n", - inet_ntoa(((struct sockaddr_in *) - &ifreq.ifr_addr)->sin_addr))); - /* build datagram queue */ - /* - * look for an already existing source interface address. - * This happens mostly when reinitializing. Also, if - * the machine has multiple point to point interfaces, then - * the local address may appear more than once. - */ - if (dqp = aIsUs(((struct sockaddr_in *)&ifreq.ifr_addr) - ->sin_addr)) { - dprintf(1, (ddt, - "dup interface address %s on %s\n", - inet_ntoa(((struct sockaddr_in *) - &ifreq.ifr_addr)->sin_addr), - ifreq.ifr_name)); - dqp->dq_gen = my_generation; - continue; - } - - /* - * Skip over address 0.0.0.0 since this will conflict - * with binding to wildcard address later. Interfaces - * which are not completely configured can have this addr. - */ - if (((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr.s_addr - == 0x00000000) { /* XXX */ - dprintf(1, (ddt, "skipping address 0.0.0.0 on %s\n", - ifreq.ifr_name)); - continue; - } - if ((dqp = (struct qdatagram *) - calloc(1, sizeof(struct qdatagram)) - ) == NULL) { - syslog(LOG_ERR, "getnetconf: malloc: %m"); - exit(12); - } - dqp->dq_next = datagramq; - datagramq = dqp; - dqp->dq_addr = ((struct sockaddr_in *) - &ifreq.ifr_addr)->sin_addr; - dqp->dq_gen = my_generation; - opensocket(dqp); - dprintf(1, (ddt, "listening [%s]\n", - inet_ntoa(((struct sockaddr_in *) - &ifreq.ifr_addr)->sin_addr))); - - /* - * Add interface to list of directly-attached (sub)nets - * for use in sorting addresses. - */ - if (ntp == NULL) { - ntp = (struct netinfo *)malloc(sizeof(struct netinfo)); - if (!ntp) - panic(errno, "malloc(netinfo)"); - } - ntp->my_addr = ((struct sockaddr_in *) - &ifreq.ifr_addr)->sin_addr; -#ifdef SIOCGIFNETMASK - if (ioctl(vs, SIOCGIFNETMASK, (char *)&ifreq) < 0) { - syslog(LOG_NOTICE, "get netmask: %m"); - ntp->mask = net_mask(ntp->my_addr); - } else - ntp->mask = ((struct sockaddr_in *) - &ifreq.ifr_addr)->sin_addr.s_addr; -#else - /* 4.2 does not support subnets */ - ntp->mask = net_mask(ntp->my_addr); -#endif - if (ioctl(vs, SIOCGIFFLAGS, (char *)&ifreq) < 0) { - syslog(LOG_NOTICE, "get interface flags: %m"); - continue; - } -#ifdef IFF_LOOPBACK - if (ifreq.ifr_flags & IFF_LOOPBACK) -#else - /* test against 127.0.0.1 (yuck!!) */ - if (ntp->my_addr.s_addr == inet_addr("127.0.0.1")) /* XXX */ -#endif - { - if (netloop.my_addr.s_addr == 0) { - netloop.my_addr = ntp->my_addr; - netloop.mask = 0xffffffff; - netloop.addr = ntp->my_addr.s_addr; - dprintf(1, (ddt, "loopback address: x%lx\n", - (u_long)netloop.my_addr.s_addr)); - } - continue; - } else if ((ifreq.ifr_flags & IFF_POINTOPOINT)) { - if (ioctl(vs, SIOCGIFDSTADDR, (char *)&ifreq) < 0) { - syslog(LOG_NOTICE, "get dst addr: %m"); - continue; - } - ntp->mask = 0xffffffff; - ntp->addr = ((struct sockaddr_in *) - &ifreq.ifr_addr)->sin_addr.s_addr; - } else { - ntp->addr = ntp->mask & ntp->my_addr.s_addr; - } - /* - * Place on end of list of locally-attached (sub)nets, - * but before logical nets for subnetted nets. - */ - ntp->next = *elocal; - *elocal = ntp; - if (elocal == enettab) - enettab = &ntp->next; - elocal = &ntp->next; - ntp = NULL; - } - if (ntp) - free((char *)ntp); - - /* - * now go through the datagramq and delete anything that - * does not have the current generation number. this is - * how we catch interfaces that go away or change their - * addresses. note that 0.0.0.0 is the wildcard element - * and should never be deleted by this code. - * - * XXX - need to update enettab/elocal as well. - */ - dqflush(my_generation); /* With apologies to The Who. */ - - /* - * Create separate qdatagram structure for socket - * wildcard address. - */ - if (first) { - if (!(dqp = (struct qdatagram *)calloc(1, sizeof(*dqp)))) - panic(errno, "malloc(qdatagram)"); - dqp->dq_next = datagramq; - datagramq = dqp; - dqp->dq_addr.s_addr = INADDR_ANY; - opensocket(dqp); - ds = dqp->dq_dfd; - } - - /* - * Compute logical networks to which we're connected - * based on attached subnets; - * used for sorting based on network configuration. - */ - for (ntp = nettab; ntp != NULL; ntp = ntp->next) { - nm = net_mask(ntp->my_addr); - if (nm != ntp->mask) { - if (findnetinfo(ntp->my_addr)) - continue; - ontp = (struct netinfo *) - malloc(sizeof(struct netinfo)); - if (!ontp) - panic(errno, "malloc(netinfo)"); - ontp->my_addr = ntp->my_addr; - ontp->mask = nm; - ontp->addr = ontp->my_addr.s_addr & nm; - ontp->next = *enettab; - *enettab = ontp; - enettab = &ontp->next; - } - } - first = 0; -} - -/* - * Find netinfo structure for logical network implied by address "addr", - * if it's on list of local/favored networks. - */ -struct netinfo * -findnetinfo(addr) - struct in_addr addr; -{ - register struct netinfo *ntp; - u_int32_t net, mask; - - mask = net_mask(addr); - net = addr.s_addr & mask; - for (ntp = nettab; ntp != NULL; ntp = ntp->next) - if (ntp->addr == net && ntp->mask == mask) - return (ntp); - return ((struct netinfo *) NULL); -} - -#ifdef DEBUG -static void -printnetinfo(ntp) - register struct netinfo *ntp; -{ - for ( ; ntp != NULL; ntp = ntp->next) { - fprintf(ddt, "addr x%lx mask x%lx", - (u_long)ntp->addr, (u_long)ntp->mask); - fprintf(ddt, " my_addr x%lx", ntp->my_addr.s_addr); - fprintf(ddt, " %s\n", inet_ntoa(ntp->my_addr)); - } -} -#endif - -static void -opensocket(dqp) - register struct qdatagram *dqp; -{ - int m, n; - int on = 1; - int fd; - - /* - * Open datagram sockets bound to interface address. - */ - if ((dqp->dq_dfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - syslog(LOG_ERR, "socket(SOCK_DGRAM): %m - exiting"); - exit(1); - } -#ifdef F_DUPFD - /* - * leave a space for stdio to work in - */ - if ((fd = fcntl(dqp->dq_dfd, F_DUPFD, 20)) != -1) { - close(dqp->dq_dfd); - dqp->dq_dfd = fd; - } else - syslog(LOG_NOTICE, "fcntl(dfd, F_DUPFD, 20): %m"); -#endif - dprintf(1, (ddt, "dqp->dq_addr %s d_dfd %d\n", - inet_ntoa(dqp->dq_addr), dqp->dq_dfd)); - if (setsockopt(dqp->dq_dfd, SOL_SOCKET, SO_REUSEADDR, - (char *)&on, sizeof(on)) != 0) - { - syslog(LOG_NOTICE, "setsockopt(dqp->dq_dfd, reuseaddr): %m"); - /* XXX press on regardless, this is not too serious. */ - } -#ifdef SO_RCVBUF - m = sizeof(n); - if ((getsockopt(dqp->dq_dfd, SOL_SOCKET, SO_RCVBUF, (char*)&n, &m) >= 0) - && (m == sizeof(n)) - && (n < rbufsize)) { - (void) setsockopt(dqp->dq_dfd, SOL_SOCKET, SO_RCVBUF, - (char *)&rbufsize, sizeof(rbufsize)); - } -#endif /* SO_RCVBUF */ - if ((n = fcntl(dqp->dq_dfd, F_GETFL, 0)) < 0) { - syslog(LOG_NOTICE, "fcntl(dfd, F_GETFL): %m"); - /* XXX press on regardless, but this really is a problem. */ - } else if (fcntl(dqp->dq_dfd, F_SETFL, n|PORT_NONBLOCK) != 0) { - syslog(LOG_NOTICE, "fcntl(dqp->dq_dfd, non-blocking): %m"); - /* XXX press on regardless, but this really is a problem. */ - } - /* - * NOTE: Some versions of SunOS have problems with the following - * call to bind. Bind still seems to function on these systems - * if you comment out the exit inside the if. This may cause - * Suns with multiple interfaces to reply strangely. - */ - nsaddr.sin_addr = dqp->dq_addr; - if (bind(dqp->dq_dfd, (struct sockaddr *)&nsaddr, sizeof(nsaddr))) { - syslog(LOG_NOTICE, "bind(dfd=%d, [%s].%d): %m", - dqp->dq_dfd, inet_ntoa(nsaddr.sin_addr), - ntohs(nsaddr.sin_port)); -#if !defined(sun) - syslog(LOG_ERR, "exiting"); - exit(1); -#endif - } - FD_SET(dqp->dq_dfd, &mask); -} - -/* -** Set flag saying to reload database upon receiving SIGHUP. -** Must make sure that someone isn't walking through a data -** structure at the time. -*/ - -static SIG_FN -onhup() -{ - int save_errno = errno; - - resignal(SIGHUP, -1, onhup); - needreload = 1; - errno = save_errno; -} - -/* -** Set flag saying to call ns_maint() -** Must make sure that someone isn't walking through a data -** structure at the time. -*/ - -static SIG_FN -maint_alarm() -{ - int save_errno = errno; - - resignal(SIGALRM, SIGCHLD, maint_alarm); - needmaint = 1; - errno = save_errno; -} - - -#ifdef XSTATS -/* - * Signal handler to write log information - */ -static SIG_FN -onintr() -{ - int save_errno = errno; - - resignal(SIGTERM, -1, onintr); - needToExit = 1; /* XXX variable reuse */ - errno = save_errno; -} -#endif /* XSTATS */ - -/* - * Signal handler to schedule a data base dump. Do this instead of dumping the - * data base immediately, to avoid seeing it in a possibly inconsistent state - * (due to updates), and to avoid long disk I/O delays at signal-handler - * level - */ -static SIG_FN -setdumpflg() -{ - int save_errno = errno; - - resignal(SIGINT, -1, setdumpflg); - needToDoadump = 1; - errno = save_errno; -} - -/* -** Turn on or off debuging by open or closeing the debug file -*/ - -static void -setdebug(code) - int code; -{ -#if defined(lint) && !defined(DEBUG) - code = code; -#endif -#ifdef DEBUG - - if (code) { - int n; - - ddt = freopen(debugfile, "w+", stderr); - if ( ddt == NULL) { - syslog(LOG_NOTICE, "can't open debug file %s: %m", - debugfile); - debug = 0; - } else { -#if defined(HAVE_SETVBUF) - setvbuf(ddt, NULL, _IOLBF, BUFSIZ); -#else - setlinebuf(ddt); -#endif - if ((n = fcntl(fileno(ddt), F_GETFL, 0)) < 0) { - syslog(LOG_INFO, - "fcntl(ddt, F_GETFL): %m"); - } else { - (void) fcntl(fileno(ddt), F_SETFL, n|O_APPEND); - } - } - } else - debug = 0; - /* delay closing ddt, we might interrupt someone */ -#endif -} - -/* -** Catch a special signal and set debug level. -** -** If debuging is off then turn on debuging else increment the level. -** -** Handy for looking in on long running name servers. -*/ - -static SIG_FN -setIncrDbgFlg() -{ - int save_errno = errno; - - resignal(SIGUSR1, -1, setIncrDbgFlg); -#ifdef DEBUG - if (debug == 0) { - debug++; - setdebug(1); - } else { - debug++; - } - if (debug) - fprintf(ddt, "Debug turned ON, Level %d\n", debug); -#endif - errno = save_errno; -} - -/* -** Catch a special signal to turn off debugging -*/ - -static SIG_FN -setNoDbgFlg() -{ - int save_errno = errno; - - resignal(SIGUSR2, -1, setNoDbgFlg); - setdebug(0); - errno = save_errno; -} - -#if defined(QRYLOG) && defined(SIGWINCH) -/* -** Set flag for query logging -*/ -static SIG_FN -setQrylogFlg() -{ - int save_errno = errno; - - resignal(SIGWINCH, -1, setQrylogFlg); - qrylog = !qrylog; - syslog(LOG_NOTICE, "query log %s\n", qrylog ?"on" :"off"); - errno = save_errno; -} -#endif /*QRYLOG && SIGWINCH*/ - -/* -** Set flag for statistics dump -*/ -static SIG_FN -setstatsflg() -{ - int save_errno = errno; - - resignal(SIGIOT, -1, setstatsflg); - needStatsDump = 1; - errno = save_errno; -} - -static SIG_FN -setchkptflg() -{ - int save_errno = errno; - - resignal(SIGQUIT, -1, setchkptflg); - needToChkpt = 1; - errno = save_errno; -} - -/* -** Catch a special signal SIGSYS -** -** this is setup to fork and exit to drop to /usr/tmp/gmon.out -** and keep the server running -*/ - -#ifdef SIGSYS -static SIG_FN -sigprof() -{ - int save_errno = errno; - - resignal(SIGSYS, -1, sigprof); - dprintf(1, (ddt, "sigprof()\n")); - if (fork() == 0) - { - (void) chdir(_PATH_TMPDIR); - exit(1); - } - errno = save_errno; -} -#endif /* SIGSYS */ - -/* -** Routines for managing stream queue -*/ - -static struct qstream * -sqadd() -{ - register struct qstream *sqp; - - if (!(sqp = (struct qstream *)calloc(1, sizeof(struct qstream)))) { - syslog(LOG_ERR, "sqadd: calloc: %m"); - return (QSTREAM_NULL); - } - dprintf(3, (ddt, "sqadd(x%lx)\n", (u_long)sqp)); - - sqp->s_next = streamq; - streamq = sqp; - return (sqp); -} - -/* sqrm(qp) - * remove stream queue structure `qp'. - * no current queries may refer to this stream when it is removed. - * side effects: - * memory is deallocated. sockets are closed. lists are relinked. - */ -void -sqrm(qp) - register struct qstream *qp; -{ - register struct qstream *qsp; - - dprintf(2, (ddt, "sqrm(%#lx, %d) rfcnt=%d\n", - (u_long)qp, qp->s_rfd, qp->s_refcnt)); - - if (qp->s_bufsize != 0) - free(qp->s_buf); - FD_CLR(qp->s_rfd, &mask); - (void) my_close(qp->s_rfd); - if (qp == streamq) { - streamq = qp->s_next; - } else { - for (qsp = streamq; - qsp && (qsp->s_next != qp); - qsp = qsp->s_next) - ; - if (qsp) { - qsp->s_next = qp->s_next; - } - } - free((char *)qp); -} - -/* void - * sqflush(allbut) - * call sqrm() on all open streams except `allbut' - * side effects: - * global list `streamq' modified - * idiocy: - * is N^2 due to the scan inside of sqrm() - */ -void -sqflush(allbut) - register struct qstream *allbut; -{ - register struct qstream *sp, *spnext; - - for (sp = streamq; sp != NULL; sp = spnext) { - spnext = sp->s_next; - if (sp != allbut) - sqrm(sp); - } -} - -/* void - * dqflush(gen) - * close/deallocate all the udp sockets, unless `gen' != (time_t)0 - * in which case all those not from this generation (except 0.0.0.0) - * will be deleted, and syslog() will be called. - * known bugs: - * the above text is impenetrable. - * side effects: - * global list `datagramq' is modified. - */ -void -dqflush(gen) - register time_t gen; -{ - register struct qdatagram *this, *prev, *next; - - prev = NULL; - for (this = datagramq; this != NULL; this = next) { - next = this->dq_next; - if (gen != (time_t)0) { - if (this->dq_addr.s_addr == INADDR_ANY || - this->dq_gen == gen) { - prev = this; - continue; - } - syslog(LOG_NOTICE, "interface [%s] missing; deleting", - inet_ntoa(this->dq_addr)); - } - FD_CLR(this->dq_dfd, &mask); - my_close(this->dq_dfd); - free(this); - if (prev == NULL) - datagramq = next; - else - prev->dq_next = next; - } -} - -/* int - * sq_here(sp) - * determine whether stream 'sp' is still on the streamq - * return: - * boolean: is it here? - */ -static int -sq_here(sp) - register struct qstream *sp; -{ - register struct qstream *t; - - for (t = streamq; t != NULL; t = t->s_next) - if (t == sp) - return (1); - return (0); -} - -/* - * Initiate query on stream; - * mark as referenced and stop selecting for input. - */ -static void -sq_query(sp) - register struct qstream *sp; -{ - sp->s_refcnt++; - FD_CLR(sp->s_rfd, &mask); -} - -/* - * Note that the current request on a stream has completed, - * and that we should continue looking for requests on the stream. - */ -void -sq_done(sp) - register struct qstream *sp; -{ - - sp->s_refcnt = 0; - sp->s_time = tt.tv_sec; - FD_SET(sp->s_rfd, &mask); -} - -void -ns_setproctitle(a, s) - char *a; - int s; -{ - int size; - register char *cp; - struct sockaddr_in sin; - char buf[80]; - - cp = Argv[0]; - size = sizeof(sin); - if (getpeername(s, (struct sockaddr *)&sin, &size) == 0) - (void) sprintf(buf, "-%s [%s]", a, inet_ntoa(sin.sin_addr)); - else { - syslog(LOG_DEBUG, "getpeername: %m"); - (void) sprintf(buf, "-%s", a); - } - (void) strncpy(cp, buf, LastArg - cp); - cp += strlen(cp); - while (cp < LastArg) - *cp++ = ' '; -} - -u_int32_t -net_mask(in) - 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)); - else - return (htonl(IN_CLASSC_NET)); -} - -/* - * These are here in case we ever want to get more clever, like perhaps - * using a bitmap to keep track of outstanding queries and a random - * allocation scheme to make it a little harder to predict them. Note - * that the resolver will need the same protection so the cleverness - * should be put there rather than here; this is just an interface layer. - */ - -void -nsid_init() -{ - nsid_state = res_randomid(); -} - -u_int16_t -nsid_next() -{ - if (nsid_state == 65535) - nsid_state = 0; - else - nsid_state++; - return (nsid_state); -} - -#if defined(BSD43_BSD43_NFS) -/* junk needed for old Sun NFS licensees */ -#undef dn_skipname -extern char *dn_skipname(); -char *(*hack_skipname)() = dn_skipname; -#endif diff --git a/contrib/bind/named/ns_maint.c b/contrib/bind/named/ns_maint.c deleted file mode 100644 index 944d2b29daf9..000000000000 --- a/contrib/bind/named/ns_maint.c +++ /dev/null @@ -1,1087 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)ns_maint.c 4.39 (Berkeley) 3/2/91"; -static char rcsid[] = "$Id: ns_maint.c,v 8.18 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "named.h" - -#ifdef USE_UTIME -# include -#endif - -static int xfers_running, /* # of xfers running */ - xfers_deferred, /* # of needed xfers not run yet */ - qserials_running, - alarm_pending, /* flag */ - nxfers __P((struct zoneinfo *, int)); - -static void startxfer __P((struct zoneinfo *)), - abortxfer __P((struct zoneinfo *)), - addxfer __P((struct zoneinfo *)), - tryxfer __P((void)); - -#define qserial_qfull() (qserials_running == MAXQSERIAL) - -#ifdef CLEANCACHE -static time_t cache_time; -#endif -#ifdef XSTATS -static time_t stats_time; -#endif -/* - * Invoked at regular intervals by signal interrupt; refresh all secondary - * zones from primary name server and remove old cache entries. - */ -void -ns_maint() -{ - register struct zoneinfo *zp; - int zonenum; - - gettime(&tt); - - dprintf(1, (ddt, "\nns_maint(); now %s", ctimel(tt.tv_sec))); - - alarm_pending = 0; - for (zp = zones, zonenum = 0; zp < &zones[nzones]; zp++, zonenum++) { -#ifdef DEBUG - if (debug >= 2) - printzoneinfo(zonenum); -#endif - if (tt.tv_sec >= zp->z_time && zp->z_refresh > 0) { - switch (zp->z_type) { - - case Z_CACHE: - doachkpt(); - ns_refreshtime(zp, tt.tv_sec); - break; - - case Z_SECONDARY: -#ifdef STUBS - case Z_STUB: -#endif - if (zp->z_serial != 0 && - ((zp->z_lastupdate + zp->z_expire) < - tt.tv_sec) - ) { - zp->z_serial = 0; - } - if (zp->z_flags & - (Z_NEED_RELOAD|Z_NEED_XFER|Z_QSERIAL)) { - ns_refreshtime(zp, tt.tv_sec); - break; - } - if (zp->z_flags & Z_XFER_RUNNING) { - abortxfer(zp); - break; - } - qserial_query(zp); - break; - } - gettime(&tt); - } - } -#ifdef CLEANCACHE - if ((cache_time + cache_interval) <= tt.tv_sec) { - if (cache_time && (!NoRecurse || !NoFetchGlue)) - remove_zone(hashtab, 0, 0); - cache_time = tt.tv_sec; - } -#endif -#ifdef XSTATS - if (stats_time + stats_interval <= tt.tv_sec) { - if (stats_time) - ns_logstats(); - stats_time = tt.tv_sec; - } -#endif - if (!needmaint) - sched_maint(); - dprintf(1, (ddt, "exit ns_maint()\n")); -} - -/* - * Find when the next refresh needs to be and set - * interrupt time accordingly. - */ -void -sched_maint() -{ - register struct zoneinfo *zp; - struct itimerval ival; -#ifdef CLEANCACHE - time_t next_refresh = cache_time + cache_interval; -#else - time_t next_refresh = 0; -#endif - static time_t next_alarm; - - for (zp = zones; zp < &zones[nzones]; zp++) - if (zp->z_time != 0 && - (next_refresh == 0 || next_refresh > zp->z_time)) - next_refresh = zp->z_time; - /* - * Schedule the next call to ns_maint. - * Don't visit any sooner than maint_interval. - */ - bzero((char *)&ival, sizeof ival); - if (next_refresh != 0) { - if (next_refresh == next_alarm && alarm_pending) { - dprintf(1, (ddt, "sched_maint: no schedule change\n")); - return; - } - /* - * tv_sec can be an unsigned long, so we can't let - * it go negative. - */ - if (next_refresh < tt.tv_sec) - next_refresh = tt.tv_sec; - ival.it_value.tv_sec = next_refresh - tt.tv_sec; - if ((long) ival.it_value.tv_sec < maint_interval) - ival.it_value.tv_sec = maint_interval; - next_alarm = next_refresh; - alarm_pending = 1; - } - (void) setitimer(ITIMER_REAL, &ival, (struct itimerval *)NULL); - dprintf(1, (ddt, "sched_maint: Next interrupt in %lu sec\n", - (u_long)ival.it_value.tv_sec)); -} - -/* - * Mark a zone "up to date" after named-xfer tells us this or we - * discover it through the qserial_*() logic. - */ -static void -markUpToDate(zp) - struct zoneinfo *zp; -{ - struct stat f_time; - - zp->z_flags &= ~Z_SYSLOGGED; - zp->z_lastupdate = tt.tv_sec; - ns_refreshtime(zp, tt.tv_sec); - /* - * Restore Z_AUTH in case expired, - * but only if there were no errors - * in the zone file. - */ - if ((zp->z_flags & Z_DB_BAD) == 0) - zp->z_flags |= Z_AUTH; - if (zp->z_source) { -#if defined(USE_UTIME) - struct utimbuf t; - - t.actime = tt.tv_sec; - t.modtime = tt.tv_sec; - (void) utime(zp->z_source, &t); -#else - struct timeval t[2]; - - t[0] = tt; - t[1] = tt; - (void) utimes(zp->z_source, t); -#endif /* USE_UTIME */ - } - /* we use "stat" to set zp->z_ftime instead of just - setting it to tt.tv_sec in order to avoid any - possible rounding problems in utimes(). */ - if (stat(zp->z_source, &f_time) != -1) - zp->z_ftime = f_time.st_mtime; - /* XXX log if stat fails? */ -} - -/* - * Query for the serial number of a zone, so that - * we can check to see if we need to transfer it. - */ -void -qserial_query(zp) - struct zoneinfo *zp; -{ - struct qinfo *qp; - - dprintf(1, (ddt, "qserial_query(%s)\n", zp->z_origin)); - - if (qserial_qfull()) - return; - - qp = sysquery(zp->z_origin, zp->z_class, T_SOA, - zp->z_addr, zp->z_addrcnt, QUERY); - if (!qp) { - syslog(LOG_INFO, "qserial_query(%s): sysquery FAILED", - zp->z_origin); - return; /* XXX - this is bad, we should do something */ - } - qp->q_flags |= Q_ZSERIAL; - qp->q_zquery = zp; - zp->z_flags |= Z_QSERIAL; - ns_refreshtime(zp, tt.tv_sec); - qserials_running++; - dprintf(1, (ddt, "qserial_query(%s) QUEUED\n", zp->z_origin)); -} - -void -qserial_answer(qp, serial) - struct qinfo *qp; - u_int32_t serial; -{ - struct zoneinfo *zp = qp->q_zquery; - int was_qfull = qserial_qfull(); - - dprintf(1, (ddt, "qserial_answer(%s, %lu)\n", - zp->z_origin, (u_long)serial)); - zp->z_flags &= ~Z_QSERIAL; - qp->q_flags &= ~Q_ZSERIAL; /* keeps us from being called twice */ - qserials_running--; - if (serial == 0) { - /* an error occurred, or the query timed out. - */ -#ifdef GETSER_LOGGING - syslog(GETSER_LOGGING, "Err/TO getting serial# for \"%s\"", - zp->z_origin); -#endif /* GETSER_LOGGING */ - addxfer(zp); - } else if (SEQ_GT(serial, zp->z_serial) || !zp->z_serial) { - dprintf(1, (ddt, "qserial_answer: zone is out of date\n")); - zp->z_xaddr = from_addr.sin_addr; /* don't use qp->q_from */ - addxfer(zp); - } else if (SEQ_GT(zp->z_serial, serial)) { - if (!haveComplained((char*)zp, "went backward")) { - syslog(LOG_NOTICE, - "Zone \"%s\" (class %d) SOA serial# (%lu) rcvd from [%s] is < ours (%lu)\n", - zp->z_origin, zp->z_class, (u_long)serial, - inet_ntoa(from_addr.sin_addr), - (u_long)zp->z_serial); - } - } else { - dprintf(1, (ddt, "qserial_answer: zone serial is still OK\n")); - markUpToDate(zp); - } - if (was_qfull) - needmaint = 1; -} - -/* - * Hold and release SIGCHLD - */ -#ifdef POSIX_SIGNALS -static sigset_t sset; -#else -#ifndef SYSV -static int omask; -#endif -#endif /* POSIX_SIGNALS */ - -void holdsigchld() -{ -#ifdef POSIX_SIGNALS - sigemptyset(&sset); - sigaddset(&sset,SIGCHLD); - sigprocmask(SIG_BLOCK,&sset,NULL); -#else /* POSIX_SIGNALS */ -#ifndef SYSV - omask = sigblock(sigmask(SIGCHLD)); -#else /* SYSV */ - /* XXX - out of luck? */ -#endif /* SYSV */ -#endif /* POSIX_SIGNALS */ -} - -void releasesigchld() -{ -#ifdef POSIX_SIGNALS - sigprocmask(SIG_UNBLOCK,&sset,NULL); -#else -#ifndef SYSV - (void) sigsetmask(omask); -#endif -#endif /* POSIX_SIGNALS */ -} - - /* State of all running zone transfers */ -static struct { - pid_t xfer_pid; - int xfer_state; /* see below */ -#ifdef sequent - union wait xfer_status; -#else - int xfer_status; -#endif -} xferstatus[MAX_XFERS_RUNNING]; -#define XFER_IDLE 0 -#define XFER_RUNNING 1 -#define XFER_DONE 2 - -/* - * Start an asynchronous zone transfer for a zone. - * Depends on current time being in tt. - * The caller must call sched_maint after startxfer. - */ -static void -startxfer(zp) - struct zoneinfo *zp; -{ - char *argv[NSMAX + 20], argv_ns[NSMAX][MAXDNAME]; - int argc = 0, argc_ns = 0, pid, i; - unsigned int cnt; - char debug_str[10]; - char serial_str[10]; - char port_str[10]; -#ifdef GEN_AXFR - char class_str[10]; -#endif - - dprintf(1, (ddt, "startxfer() %s\n", zp->z_origin)); - - argv[argc++] = _PATH_XFER; - argv[argc++] = "-z"; - argv[argc++] = zp->z_origin; - argv[argc++] = "-f"; - argv[argc++] = zp->z_source; - argv[argc++] = "-s"; - sprintf(serial_str, "%lu", (u_long)zp->z_serial); - argv[argc++] = serial_str; -#ifdef GEN_AXFR - argv[argc++] = "-C"; - sprintf(class_str, "%d", zp->z_class); - argv[argc++] = class_str; -#endif - if (zp->z_flags & Z_SYSLOGGED) - argv[argc++] = "-q"; - argv[argc++] = "-P"; - sprintf(port_str, "%d", ns_port); - argv[argc++] = port_str; -#ifdef STUBS - if (zp->z_type == Z_STUB) - argv[argc++] = "-S"; -#endif -#ifdef DEBUG - if (debug) { - argv[argc++] = "-d"; - sprintf(debug_str, "%d", debug); - argv[argc++] = debug_str; - argv[argc++] = "-l"; - argv[argc++] = _PATH_XFERDDT; - if (debug > 5) { - argv[argc++] = "-t"; - argv[argc++] = _PATH_XFERTRACE; - } - } -#endif - - if (zp->z_xaddr.s_addr != 0) { - /* Address was specified by the qserial logic, use it. */ - argv[argc++] = strcpy(argv_ns[argc_ns++], - inet_ntoa(zp->z_xaddr)); - } else { - /* - * Copy the server ip addresses into argv, after converting - * to ascii and saving the static inet_ntoa result. - */ - for (cnt = 0; cnt < zp->z_addrcnt; cnt++) { - struct in_addr a; - - a = zp->z_addr[cnt]; - if (aIsUs(a) && - !haveComplained(zp->z_origin, (char*)startxfer)) { - syslog(LOG_NOTICE, - "attempted to fetch zone %s from self (%s)", - zp->z_origin, inet_ntoa(a)); - continue; - } - argv[argc++] = strcpy(argv_ns[argc_ns++], - inet_ntoa(a)); - } - } - - argv[argc] = 0; - -#ifdef DEBUG - if (debug) { - for (i = 0; i < argc; i++) - fprintf(ddt, " %s", argv[i]); - fprintf(ddt, "\n"); - } -#endif /* DEBUG */ - - gettime(&tt); - holdsigchld(); - for (i = 0; i < MAX_XFERS_RUNNING; i++) { - if (xferstatus[i].xfer_pid == 0) { - xferstatus[i].xfer_state = XFER_RUNNING; - break; - } - } - if ((pid = vfork()) == -1) { - syslog(LOG_ERR, "xfer vfork: %m"); - releasesigchld(); - zp->z_time = tt.tv_sec + 10; - return; - } - - if (pid == 0) { - /* Child. */ - execv(_PATH_XFER, argv); - syslog(LOG_ERR, "can't exec %s: %m", _PATH_XFER); - _exit(XFER_FAIL); /* Avoid duplicate buffer flushes. */ - } - /* Parent. */ - xferstatus[i].xfer_pid = pid; /* XXX - small race condition here if we - * can't hold signals */ - dprintf(1, (ddt, "started xfer child %d\n", pid)); - zp->z_flags &= ~Z_NEED_XFER; - zp->z_flags |= Z_XFER_RUNNING; - zp->z_xferpid = pid; - xfers_running++; - zp->z_time = tt.tv_sec + MAX_XFER_TIME; - releasesigchld(); -} - -const char * -zoneTypeString(zp) - const struct zoneinfo *zp; -{ - static char ret[sizeof "(4294967296?)"]; /* 2^32 */ - - switch (zp->z_type) { - case Z_PRIMARY: return ("primary"); - case Z_SECONDARY: return ("secondary"); -#ifdef STUBS - case Z_STUB: return ("stub"); -#endif - case Z_CACHE: return ("cache"); - default: - sprintf(ret, "(%lu?)", (u_long)zp->z_type); - return (ret); - } -} - -#ifdef DEBUG -void -printzoneinfo(zonenum) - int zonenum; -{ - struct timeval tt; - struct zoneinfo *zp = &zones[zonenum]; - - if (!debug) - return; - - if (!zp->z_origin) - return; - - fprintf(ddt, "printzoneinfo(%d):\n", zonenum); - - gettime(&tt); - fprintf(ddt, "origin ='%s'", zp->z_origin[0] ? zp->z_origin : "."); -#ifdef GEN_AXFR - fprintf(ddt, ", class = %d", zp->z_class); -#endif - fprintf(ddt, ", type = %s", zoneTypeString(zp)); - if (zp->z_source) - fprintf(ddt,", source = %s\n", zp->z_source); - fprintf(ddt, "z_refresh = %lu", (u_long)zp->z_refresh); - fprintf(ddt, ", retry = %lu", (u_long)zp->z_retry); - fprintf(ddt, ", expire = %lu", (u_long)zp->z_expire); - fprintf(ddt, ", minimum = %lu", (u_long)zp->z_minimum); - fprintf(ddt, ", serial = %lu\n", (u_long)zp->z_serial); - fprintf(ddt, "z_time = %lu", (u_long)zp->z_time); - if (zp->z_time) { - fprintf(ddt, ", now time : %lu sec", (u_long)tt.tv_sec); - fprintf(ddt, ", time left: %lu sec", - (u_long)(zp->z_time - tt.tv_sec)); - } - fprintf(ddt, "; flags %lx\n", (u_long)zp->z_flags); -} -#endif /* DEBUG */ - -/* - * remove_zone (htp, zone) -- - * Delete all RR's in the zone "zone" under specified hash table. - */ -void -#ifdef CLEANCACHE -remove_zone(htp, zone, all) -#else -remove_zone(htp, zone) -#endif - register struct hashbuf *htp; - register int zone; -#ifdef CLEANCACHE - register int all; -#endif -{ - register struct databuf *dp, *pdp; - register struct namebuf *np, *pnp, *npn; - struct namebuf **npp, **nppend; - - nppend = htp->h_tab + htp->h_size; - for (npp = htp->h_tab; npp < nppend; npp++) { - for (pnp = NULL, np = *npp; np != NULL; np = npn) { - for (pdp = NULL, dp = np->n_data; dp != NULL; NULL) { - if (dp->d_zone == zone -#ifdef CLEANCACHE - && (all || stale(dp)) -#endif - ) { - dp = rm_datum(dp, np, pdp); - } else { - pdp = dp; - dp = dp->d_next; - } - } /*for(pdp)*/ - - if (np->n_hash) { - /* call recursively to remove subdomains. */ - remove_zone(np->n_hash, zone -#ifdef CLEANCACHE - , all -#endif - ); - - /* if now empty, free it */ - if (np->n_hash->h_cnt == 0) { - free((char*)np->n_hash); - np->n_hash = NULL; - } - } - - if ((np->n_hash == NULL) && (np->n_data == NULL)) { - npn = rm_name(np, npp, pnp); - htp->h_cnt--; - } else { - npn = np->n_next; - pnp = np; - } - } /*for(pnp)*/ - } /*for(npp)*/ -} - -#ifdef PURGE_ZONE -static void purge_z_2 __P((struct hashbuf *, int)); -static bottom_of_zone __P((struct databuf *, int)); - -void -purge_zone(dname, htp, class) - const char *dname; - register struct hashbuf *htp; - int class; -{ - const char *fname; - struct databuf *dp, *pdp; - struct namebuf *np; - struct hashbuf *phtp = htp; - - dprintf(1, (ddt, "purge_zone(%s,%d)\n", dname, class)); - if ((np = nlookup(dname, &phtp, &fname, 0)) && dname == fname && - !ns_wildcard(NAME(*np))) { - for (pdp = NULL, dp = np->n_data; dp != NULL; ) { - if (dp->d_class == class) - dp = rm_datum(dp, np, pdp); - else { - pdp = dp; - dp = dp->d_next; - } - } - - if (np->n_hash) { - purge_z_2(np->n_hash, class); - if (np->n_hash->h_cnt == 0) { - free((char*)np->n_hash); - np->n_hash = NULL; - } - } - - /* remove entry from cache, if required */ - if ((np->n_hash == NULL) && (np->n_data == NULL)) { - struct namebuf **npp, **nppend; - struct namebuf *npn, *pnp, *nnp; - - dprintf(3,(ddt, "purge_zone: cleaning cache\n")); - - /* walk parent hashtable looking for ourself */ - if (np->n_parent) - phtp = np->n_parent->n_hash; - else - phtp = htp; /* top / root zone */ - - if (phtp) { - nppend = phtp->h_tab + phtp->h_size; - for (npp = phtp->h_tab; npp < nppend; npp++) { - for (pnp = NULL, nnp = *npp; - nnp != NULL; - nnp = npn) { - if (nnp == np) { - dprintf(3, (ddt, - "purge_zone: found our selves\n" - )); - npn = rm_name(nnp,npp,pnp); - phtp->h_cnt--; - } else { - npn = nnp->n_next; - pnp = nnp; - } - } - } - } - } - } -} - -static void -purge_z_2(htp, class) - register struct hashbuf *htp; - register int class; -{ - register struct databuf *dp, *pdp; - register struct namebuf *np, *pnp, *npn; - struct namebuf **npp, **nppend; - - nppend = htp->h_tab + htp->h_size; - for (npp = htp->h_tab; npp < nppend; npp++) { - for (pnp = NULL, np = *npp; np != NULL; np = npn) { - if (!bottom_of_zone(np->n_data, class)) { - for (pdp = NULL, dp = np->n_data; dp != NULL; ) { - if (dp->d_class == class) - dp = rm_datum(dp, np, pdp); - else { - pdp = dp; - dp = dp->d_next; - } - } - if (np->n_hash) { - /* call recursively to rm subdomains */ - purge_z_2(np->n_hash, class); - - /* if now empty, free it */ - if (np->n_hash->h_cnt == 0) { - free((char*)np->n_hash); - np->n_hash = NULL; - } - } - } - - if ((np->n_hash == NULL) && (np->n_data == NULL)) { - npn = rm_name(np, npp, pnp); - htp->h_cnt--; - } else { - npn = np->n_next; - pnp = np; - } - } - } -} - -static int -bottom_of_zone(dp, class) - struct databuf *dp; - int class; -{ - for ( ; dp ; dp = dp->d_next) { - if (dp->d_class != class) - continue; - if (dp->d_zone == 0) - continue; -#ifdef NCACHE - if (dp->d_rcode) /* this should not occur */ - continue; -#endif - if (dp->d_type == T_SOA) - return (1); - } - dprintf(3, (ddt, "bottom_of_zone() == 0\n")); - return (0); -} -#endif - -/* - * Handle XFER limit for a nameserver. - */ -static int -nxfers(zp, delta) - struct zoneinfo *zp; - int delta; -{ - struct in_addr nsa; - struct nameser *nsp; - int ret; - - if (zp->z_xaddr.s_addr) - nsa = zp->z_xaddr; /* qserial overrode address */ - else if (!zp->z_addrcnt) - return (-1); - else - nsa = zp->z_addr[0]; /* first ns holds zone's xfer limit */ - - if (!(nsp = nameserFind(nsa, NS_F_INSERT))) - return (-1); /* probably ENOMEM */ - - ret = nsp->xfers; - if (delta < 0 && -delta > ret) - return (-1); /* taking more than we have */ - - nsp->xfers += delta; - return (ret); -} - -/* - * Abort an xfer that has taken too long. - */ -static void -abortxfer(zp) - struct zoneinfo *zp; -{ - if (zp->z_flags & (Z_XFER_GONE|Z_XFER_ABORTED)) { - int i; - - for (i = 0; i < MAX_XFERS_RUNNING; i++) { - if (xferstatus[i].xfer_pid == zp->z_xferpid) { - xferstatus[i].xfer_pid = 0; - xferstatus[i].xfer_state = XFER_IDLE; - break; - } - } - - if (zp->z_flags & Z_XFER_GONE) - syslog(LOG_WARNING, - "zone transfer timeout for \"%s\"; pid %lu missing", - zp->z_origin, (u_long)zp->z_xferpid); - else if (kill(zp->z_xferpid, SIGKILL) == -1) - syslog(LOG_WARNING, - "zone transfer timeout for \"%s\"; kill pid %lu: %m", - zp->z_origin, (u_long)zp->z_xferpid); - else - syslog(LOG_WARNING, -"zone transfer timeout for \"%s\"; second kill\ -pid %lu - forgetting, processes may accumulate", - zp->z_origin, (u_long)zp->z_xferpid); - - zp->z_xferpid = 0; - xfers_running--; - (void)nxfers(zp, -1); - zp->z_flags &= ~(Z_XFER_RUNNING|Z_XFER_ABORTED|Z_XFER_GONE); - } else if (kill(zp->z_xferpid, SIGKILL) == -1) { - if (errno == ESRCH) - /* No warning on first time, it may have just exited */ - zp->z_flags |= Z_XFER_GONE; - else { - syslog(LOG_WARNING, - "zone transfer timeout for \"%s\"; pid %lu kill failed %m", - zp->z_origin, (u_long)zp->z_xferpid); - zp->z_flags |= Z_XFER_ABORTED; - } - } else { - syslog(LOG_NOTICE, - "zone transfer timeout for \"%s\"; pid %lu killed", - zp->z_origin, (u_long)zp->z_xferpid); - zp->z_flags |= Z_XFER_ABORTED; - } -} - -/* - * SIGCHLD signal handler: process exit of xfer's. - * (Note: also called when outgoing transfer completes.) - */ -SIG_FN -reapchild() -{ - int pid, i, save_errno; -#if defined(sequent) - union wait status; -#else - int status; -#endif /* sequent */ - -#if defined(MUST_REARM_SIGS) - (void)signal(SIGCLD, (SIG_FN (*)()) reapchild); -#endif - save_errno = errno; - gettime(&tt); -#if defined(USE_WAITPID) - while ((pid = waitpid(-1, &status, WNOHANG)) > 0) { -#else /* USE_WAITPID */ - { - pid = wait(&status); -#endif /* USE_WAITPID */ - for (i = 0; i < MAX_XFERS_RUNNING; i++) { - if (xferstatus[i].xfer_pid == pid) { - xferstatus[i].xfer_status = status; - xferstatus[i].xfer_state = XFER_DONE; - needendxfer++; - break; - } - } - } - errno = save_errno; -} - -/* - * Finish processing of of finished xfers - */ -void -endxfer() -{ - register struct zoneinfo *zp; - int exitstatus, pid, i; -#if defined(sequent) - union wait status; -#else - int status; -#endif /* sequent */ - - gettime(&tt); - - for (i = 0; i < MAX_XFERS_RUNNING; i++) { - if (xferstatus[i].xfer_state != XFER_DONE) - continue; - pid = xferstatus[i].xfer_pid; - status = xferstatus[i].xfer_status; - exitstatus = WIFEXITED(status) ?WEXITSTATUS(status) :0; - - for (zp = zones; zp < &zones[nzones]; zp++) { - if (zp->z_xferpid != pid) - continue; - xfers_running--; - (void) nxfers(zp, -1); - zp->z_xferpid = 0; - zp->z_flags &= - ~(Z_XFER_RUNNING|Z_XFER_ABORTED|Z_XFER_GONE); - dprintf(1, (ddt, - "\nendxfer: child %d zone %s returned status=%d termsig=%d\n", - pid, zp->z_origin, exitstatus, - WIFSIGNALED(status) ?WTERMSIG(status) :-1 - ) - ); - if (WIFSIGNALED(status)) { - if (WTERMSIG(status) != SIGKILL) { - syslog(LOG_NOTICE, - "named-xfer \"%s\" exited with signal %d\n", - zp->z_origin[0]?zp->z_origin:".", - WTERMSIG(status)); - } - ns_retrytime(zp, tt.tv_sec); - } else { - switch (exitstatus) { - case XFER_UPTODATE: - markUpToDate(zp); - break; - - case XFER_SUCCESS: - /* XXX should incorporate loadxfer() */ - zp->z_flags |= Z_NEED_RELOAD; - zp->z_flags &= ~Z_SYSLOGGED; - needzoneload++; - break; - - case XFER_TIMEOUT: - if (!(zp->z_flags & Z_SYSLOGGED)) { - zp->z_flags |= Z_SYSLOGGED; - syslog(LOG_NOTICE, - "zoneref: Masters for secondary zone \"%s\" unreachable", - zp->z_origin); - } - ns_retrytime(zp, tt.tv_sec); - break; - - default: - if (!(zp->z_flags & Z_SYSLOGGED)) { - zp->z_flags |= Z_SYSLOGGED; - syslog(LOG_NOTICE, - "named-xfer for \"%s\" exited %d", - zp->z_origin, - exitstatus); - } - /* FALLTHROUGH */ - case XFER_FAIL: - zp->z_flags |= Z_SYSLOGGED; - ns_retrytime(zp, tt.tv_sec); - break; - } - break; - } - } - xferstatus[i].xfer_state = XFER_IDLE; - xferstatus[i].xfer_pid = 0; - } - releasesigchld(); - tryxfer(); -} - -/* - * Try to start some xfers - new "fair scheduler" by Bob Heiney @DEC (1995) - */ -static void -tryxfer() { - static struct zoneinfo *zp = NULL; - static struct zoneinfo *lastzones = NULL; - static int lastnzones = 0; - struct zoneinfo *startzp, *stopzp; - - /* initialize, and watch out for changes in zones! */ - if (lastzones != zones) { - if (lastzones != NULL) - syslog(LOG_INFO, "zones changed: %p != %p", - lastzones, zones); - lastzones = zones; - zp = zones; - } - - /* did zones shrink? */ - if (lastnzones > nzones) { - syslog(LOG_INFO, "zones shrunk"); - zp = zones; - } - lastnzones = nzones; - - if (zp == zones) - stopzp = &zones[nzones-1]; - else - stopzp = zp - 1; - - dprintf(3, (ddt, "tryxfer start zp=%p stopzp=%p def=%d running=%d\n", - zp, stopzp, xfers_deferred, xfers_running)); - - startzp = zp; - for (;;) { - int xfers; - - if (!xfers_deferred || xfers_running >= max_xfers_running) - break; - - if ((xfers = nxfers(zp, 0)) != -1 && - xfers < max_xfers_per_ns && - (zp->z_flags & Z_NEED_XFER)) { - nxfers(zp, 1); - xfers_deferred--; - startxfer(zp); - } - - if (zp == stopzp) { - dprintf(3, (ddt, "tryxfer stop mark\n")); - zp = startzp; - break; - } - - zp++; - /* wrap around? */ - if (zp == &zones[nzones]) - zp = zones; - } - dprintf(3, (ddt, "tryxfer stop zp=%p\n", zp)); - - if (!needmaint) - sched_maint(); -} - -/* - * Reload zones whose transfers have completed. - */ -void -loadxfer() { - register struct zoneinfo *zp; - - gettime(&tt); - for (zp = zones; zp < &zones[nzones]; zp++) { - if (zp->z_flags & Z_NEED_RELOAD) { - dprintf(1, (ddt, "loadxfer() \"%s\"\n", - zp->z_origin[0] ? zp->z_origin : ".")); - zp->z_flags &= ~(Z_NEED_RELOAD|Z_AUTH); - remove_zone(hashtab, zp - zones -#ifdef CLEANCACHE - , 1 -#endif - ); -#ifdef PURGE_ZONE - purge_zone(zp->z_origin, hashtab, zp->z_class); -#endif - if (!db_load(zp->z_source, zp->z_origin, zp, NULL)) - zp->z_flags |= Z_AUTH; - if (zp->z_flags & Z_TMP_FILE) - (void) unlink(zp->z_source); - } - } - if (!needmaint) - sched_maint(); -} - -/* - * Add this zone to the set of those needing transfers. - */ -static void -addxfer(zp) - struct zoneinfo *zp; -{ - if (!(zp->z_flags & Z_NEED_XFER)) { - zp->z_flags |= Z_NEED_XFER; - xfers_deferred++; - tryxfer(); - } -} diff --git a/contrib/bind/named/ns_ncache.c b/contrib/bind/named/ns_ncache.c deleted file mode 100644 index ccacf610a5d8..000000000000 --- a/contrib/bind/named/ns_ncache.c +++ /dev/null @@ -1,183 +0,0 @@ -/************************************************************************** - * ns_ncache.c - * author: anant kumar - * last modification: March 17, 1993 - * - * implements negative caching - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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*/ diff --git a/contrib/bind/named/ns_req.c b/contrib/bind/named/ns_req.c deleted file mode 100644 index bd59bab4ccc6..000000000000 --- a/contrib/bind/named/ns_req.c +++ /dev/null @@ -1,2094 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)ns_req.c 4.47 (Berkeley) 7/1/91"; -static char rcsid[] = "$Id: ns_req.c,v 8.29 1998/04/07 04:59:45 vixie Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1988, 1990 - * - - * Copyright (c) 1986, 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. - * - - * 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. - * --Copyright-- - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "named.h" - -struct addinfo { - char *a_dname; /* domain name */ - char *a_rname; /* referred by */ - u_int16_t a_rtype; /* referred by */ - u_int16_t a_class; /* class for address */ -}; - -enum req_action { Finish, Refuse, Return }; - -static enum req_action req_query __P((HEADER *hp, u_char **cpp, u_char *eom, - struct qstream *qsp, - int *buflenp, int *msglenp, - u_char *msg, int dfd, - struct sockaddr_in *from)); - -static enum req_action req_iquery __P((HEADER *hp, u_char **cpp, u_char *eom, - int *buflenp, u_char *msg, - struct sockaddr_in *from)); - -#ifdef BIND_NOTIFY -static enum req_action req_notify __P((HEADER *hp, u_char **cpp, u_char *eom, - u_char *msg,struct sockaddr_in *from)); -#endif - -static void fwritemsg __P((FILE *, u_char *, int)), - doaxfr __P((struct namebuf *, FILE *, - struct namebuf *, int)), - startxfr __P((struct qstream *, struct namebuf *, - u_char *, int, int, const char *)); - -static struct addinfo addinfo[NADDRECS]; -static void addname __P((const char *, const char *, - u_int16_t, u_int16_t)); -static void copyCharString __P((u_char **, const char *)); - -/* - * Process request using database; assemble and send response. - */ -void -ns_req(msg, msglen, buflen, qsp, from, dfd) - u_char *msg; - int msglen, buflen; - struct qstream *qsp; - struct sockaddr_in *from; - int dfd; -{ - register HEADER *hp = (HEADER *) msg; - u_char *cp, *eom; -#ifdef DEBUG - const char *sortmsgtxt; -#endif - enum req_action action; - int n; - -#ifdef DEBUG - if (debug > 3) { - fprintf(ddt, "ns_req(from=%s)\n", sin_ntoa(from)); - fp_nquery(msg, msglen, ddt); - } -#endif - - /* - * XXX - this decision should be made by our caller, not by us. - */ - if (hp->qr) { - ns_resp(msg, msglen); - - /* Now is a safe time for housekeeping */ - if (needs_prime_cache) - prime_cache(); - - return; - } - - /* it's not a response so these bits have no business - * being set. will later simplify work if we can - * safely assume these are always 0 when a query - * comes in. - */ - hp->aa = hp->ra = 0; - - hp->rcode = NOERROR; - cp = msg + HFIXEDSZ; - eom = msg + msglen; - buflen -= HFIXEDSZ; - - free_addinfo(); /* sets addcount to zero */ - dnptrs[0] = NULL; - - switch (hp->opcode) { - case QUERY: - action = req_query(hp, &cp, eom, qsp, - &buflen, &msglen, - msg, dfd, from); - break; - - case IQUERY: - action = req_iquery(hp, &cp, eom, &buflen, msg, from); - break; - -#ifdef BIND_NOTIFY - case NS_NOTIFY_OP: - action = req_notify(hp, &cp, eom, msg, from); - break; -#endif - - default: - dprintf(1, (ddt, "ns_req: Opcode %d not implemented\n", - hp->opcode)); - /* XXX - should syslog, limited by haveComplained */ - hp->qdcount = htons(0); - hp->ancount = htons(0); - hp->nscount = htons(0); - hp->arcount = htons(0); - hp->rcode = NOTIMP; - action = Finish; - } - - /* - * vector via internal opcode. (yes, it was even uglier before.) - */ - switch (action) { - case Return: - return; - case Refuse: - hp->rcode = REFUSED; - /*FALLTHROUGH*/ - case Finish: - /* rest of the function handles this case */ - break; - default: - panic(-1, "ns_req: bad action variable"); - /*NOTREACHED*/ - } - - /* - * apply final polish - */ - hp->qr = 1; /* set Response flag */ - hp->ra = (NoRecurse == 0); - - n = doaddinfo(hp, cp, buflen); - cp += n; - buflen -= n; - -#ifdef DEBUG -#ifdef SORT_RESPONSE - sortmsgtxt = local(from) == NULL ? "Remote" : "Local"; -#else /*SORT*/ - sortmsgtxt = "(not sorting)"; -#endif /*SORT*/ - dprintf(1, (ddt, "ns_req: answer -> %s fd=%d id=%d size=%d %s\n", - sin_ntoa(from), (qsp == QSTREAM_NULL) ? dfd : qsp->s_rfd, - ntohs(hp->id), cp - msg, sortmsgtxt)); - if (debug >= 10) - fp_nquery(msg, cp - msg, ddt); -#endif /*DEBUG*/ - if (qsp == QSTREAM_NULL) { - if (sendto(dfd, (char*)msg, cp - msg, 0, - (struct sockaddr *)from, - sizeof(*from)) < 0) { - if (!haveComplained((char*)from->sin_addr.s_addr, - sendtoStr)) - syslog(LOG_INFO, - "ns_req: sendto(%s): %m", - sin_ntoa(from)); - nameserIncr(from->sin_addr, nssSendtoErr); - } - nameserIncr(from->sin_addr, nssSentAns); -#ifdef XSTATS - if (hp->rcode == NXDOMAIN) - nameserIncr(from->sin_addr, nssSentNXD); - if (!hp->aa) - nameserIncr(from->sin_addr, nssSentNaAns); -#endif - } else { - (void) writemsg(qsp->s_rfd, msg, cp - msg); - sq_done(qsp); - } - - if (needs_prime_cache) { - prime_cache(); /* Now is a safe time */ - } -} - -#ifdef BIND_NOTIFY -int -findZonePri(zp, from) - register const struct zoneinfo *zp; - const struct sockaddr_in *from; -{ - register u_int32_t from_addr = from->sin_addr.s_addr; - register int i; - - for (i = 0; (u_int)i < zp->z_addrcnt; i++) - if (zp->z_addr[i].s_addr == from_addr) - return (i); - return (-1); -} - -static enum req_action -req_notify(hp, cpp, eom, msg, from) - HEADER *hp; - u_char **cpp, *eom, *msg; - struct sockaddr_in *from; -{ - int n, type, class, zn; - char dnbuf[MAXDNAME]; - struct namebuf *np; - const char *fname; - struct hashbuf *htp = hashtab; /* lookup relative to root */ - - /* valid notify's have one question and zero answers */ - if ((ntohs(hp->qdcount) != 1) - || ntohs(hp->ancount) != 0 - || ntohs(hp->nscount) != 0 - || ntohs(hp->arcount) != 0) { - dprintf(1, (ddt, "FORMERR Notify header counts wrong\n")); - hp->qdcount = htons(0); - hp->ancount = htons(0); - hp->nscount = htons(0); - hp->arcount = htons(0); - hp->rcode = FORMERR; - return (Finish); - } - - n = dn_expand(msg, eom, *cpp, dnbuf, sizeof dnbuf); - if (n < 0) { - dprintf(1, (ddt, "FORMERR Query expand name failed\n")); - hp->rcode = FORMERR; - return (Finish); - } - if (*cpp + 2 * INT16SZ > eom) { - dprintf(1, (ddt, "FORMERR notify too short")); - hp->rcode = FORMERR; - return (Finish); - } - *cpp += n; - GETSHORT(type, *cpp); - GETSHORT(class, *cpp); - syslog(LOG_INFO, "rcvd NOTIFY(%s %s %s)", - dnbuf, p_class(class), p_type(type)); - /* XXX - when answers are allowed, we'll need to do compression - * correctly here, and we will need to check for packet underflow. - */ - np = nlookup(dnbuf, &htp, &fname, 0); - if (!np) { - syslog(LOG_INFO, "rcvd NOTIFY for \"%s\", name not in cache", - dnbuf); - hp->rcode = SERVFAIL; - return (Finish); - } - zn = findMyZone(np, class); - if (zn == DB_Z_CACHE || zones[zn].z_type != Z_SECONDARY) { - /* this can come if a user did an AXFR of some zone somewhere - * and that zone's server now wants to tell us that the SOA - * has changed. AXFR's always come from nonpriv ports so it - * isn't possible to know whether it was the server or just - * "dig". this condition can be avoided by using secure zones - * since that way only real secondaries can AXFR from you. - */ - syslog(LOG_INFO, - "NOTIFY for non-secondary name (%s), from %s", - dnbuf, sin_ntoa(from)); - goto refuse; - } - if (findZonePri(&zones[zn], from) == -1) { - syslog(LOG_INFO, - "NOTIFY from non-master server (zone %s), from %s", - zones[zn].z_origin, sin_ntoa(from)); - goto refuse; - } - switch (type) { - case T_SOA: - if (strcasecmp(dnbuf, zones[zn].z_origin) != 0) { - syslog(LOG_INFO, - "NOTIFY(SOA) for non-origin (%s), from %s", - dnbuf, sin_ntoa(from)); - goto refuse; - } - if (zones[zn].z_flags & - (Z_NEED_RELOAD|Z_NEED_XFER|Z_QSERIAL|Z_XFER_RUNNING)) { - syslog(LOG_INFO, - "NOTIFY(SOA) for zone already xferring (%s)", - dnbuf); - goto noerror; - } - zones[zn].z_time = tt.tv_sec; - qserial_query(&zones[zn]); - /* XXX: qserial_query() can fail due to queue full condition; - * we should detect that case here and do something. - */ - break; - default: - /* unimplemented, but it's not a protocol error, just - * something to be ignored. - */ - break; - } - noerror: - hp->rcode = NOERROR; - return (Finish); - refuse: - hp->rcode = REFUSED; - return (Finish); -} -#endif /*BIND_NOTIFY*/ - -static enum req_action -req_query(hp, cpp, eom, qsp, buflenp, msglenp, msg, dfd, from) - HEADER *hp; - u_char **cpp; - u_char *eom; - struct qstream *qsp; - u_char *msg; - int *buflenp, *msglenp, dfd; - struct sockaddr_in *from; -{ - int n, class, type, count, foundname, founddata, omsglen, cname; - u_int16_t id; - u_char **dpp, *omsg, *answers; - char dnbuf[MAXDNAME], *dname; - const char *fname; - struct hashbuf *htp; - struct databuf *nsp[NSMAX]; - struct namebuf *np, *anp; - struct qinfo *qp; - struct netinfo *lp; -#ifdef SECURE_ZONES - struct zoneinfo *zp; -#endif - struct databuf *dp; - -#ifdef XSTATS - nameserIncr(from->sin_addr, nssRcvdQ); -#endif - - nsp[0] = NULL; - dpp = dnptrs; - *dpp++ = msg; - *dpp = NULL; - - /* valid queries have one question and zero answers */ - if ((ntohs(hp->qdcount) != 1) - || ntohs(hp->ancount) != 0 - || ntohs(hp->nscount) != 0 - || ntohs(hp->arcount) != 0) { - dprintf(1, (ddt, "FORMERR Query header counts wrong\n")); - hp->qdcount = htons(0); - hp->ancount = htons(0); - hp->nscount = htons(0); - hp->arcount = htons(0); - hp->rcode = FORMERR; - return (Finish); - } - - /* - * Get domain name, class, and type. - */ - if ((**cpp & INDIR_MASK) == 0) { - *dpp++ = *cpp; /* remember name for compression */ - } - *dpp = NULL; - n = dn_expand(msg, eom, *cpp, dnbuf, sizeof dnbuf); - if (n < 0) { - dprintf(1, (ddt, "FORMERR Query expand name failed\n")); - hp->rcode = FORMERR; - return (Finish); - } - *cpp += n; - if (*cpp + 2 * INT16SZ > eom) { - dprintf(1, (ddt, "FORMERR Query message length short\n")); - hp->rcode = FORMERR; - return (Finish); - } - GETSHORT(type, *cpp); - GETSHORT(class, *cpp); - if (*cpp < eom) { - dprintf(6, (ddt,"message length > received message\n")); - *msglenp = *cpp - msg; - } - - qtypeIncr(type); - - /* - * Yow! - */ - if (!strcasecmp(dnbuf, "VERSION.BIND") && - class == C_CHAOS && type == T_TXT) { - u_char *tp; - - hp->ancount = htons(1); - hp->nscount = htons(0); - hp->arcount = htons(0); - hp->rcode = NOERROR; - hp->aa = 1; - hp->ra = 0; - copyCharString(cpp, "VERSION"); /* Name */ - copyCharString(cpp, "BIND"); - *(*cpp)++ = 0x00; - PUTSHORT(T_TXT, *cpp); /* Type */ - PUTSHORT(C_CHAOS, *cpp); /* Class */ - PUTLONG(0, *cpp); /* TTL */ - tp = *cpp; /* Temp RdLength */ - PUTSHORT(0, *cpp); - copyCharString(cpp, ShortVersion); - PUTSHORT((*cpp) - (tp + INT16SZ), tp); /* Real RdLength */ - *msglenp = *cpp - msg; /* Total message length */ - return (Finish); - } - - /* - * Process query. - */ - if (type == T_AXFR) { - /* refuse request if not a TCP connection */ - if (qsp == QSTREAM_NULL) { - syslog(LOG_INFO, - "rejected UDP AXFR from %s for \"%s\"", - sin_ntoa(from), *dnbuf ? dnbuf : "."); - return (Refuse); - } - /* the position of this is subtle. */ - nameserIncr(from->sin_addr, nssRcvdAXFR); -#ifdef XFRNETS - if (xfrnets) { - /* if xfrnets was specified, peer address - * must be on it. should probably allow - * for negation some day. - */ - if (!addr_on_netlist(from->sin_addr, xfrnets)) { - syslog(LOG_INFO, - "unapproved AXFR from %s for %s", - sin_ntoa(from), *dnbuf ? dnbuf : "."); - return (Refuse); - } - } -#endif /*XFRNETS*/ - dnptrs[0] = NULL; /* don't compress names */ - hp->rd = 0; /* recursion not possible */ - syslog(LOG_INFO, "approved AXFR from %s for \"%s\"", - sin_ntoa(from), *dnbuf ? dnbuf : "."); - } - *buflenp -= *msglenp; - count = 0; - foundname = 0; - founddata = 0; - dname = dnbuf; - cname = 0; - -#ifdef QRYLOG - if (qrylog) { - syslog(LOG_INFO, "XX /%s/%s/%s", - inet_ntoa(from->sin_addr), - (dname[0] == '\0') ?"." :dname, - p_type(type)); - } -#endif /*QRYLOG*/ - - try_again: - dprintf(1, (ddt, "req: nlookup(%s) id %d type=%d class=%d\n", - dname, ntohs(hp->id), type, class)); - htp = hashtab; /* lookup relative to root */ - if ((anp = np = nlookup(dname, &htp, &fname, 0)) == NULL) - fname = ""; - dprintf(1, (ddt, "req: %s '%s' as '%s' (cname=%d)\n", - np == NULL ? "missed" : "found", - dname, fname, cname)); - -#ifdef LOCALDOM - /* - * if nlookup failed to find the name then - * see if there are any '.''s in the name - * if not then add local domain name to the - * name and try again. - */ - if (!np && localdomain && !strchr(dname, '.')) { - (void) strcat(dname, "."); - (void) strcat(dname, localdomain); - dprintf(1, (ddt,"req: nlookup(%s) type=%d\n", dname, type)); - htp = hashtab; - np = nlookup(dname, &htp, &fname, 0); - } -#endif /*LOCALDOM*/ - -#ifdef YPKLUDGE - /* Some braindamaged resolver software will not - recognize internet addresses in dot notation and - send out address queries for "names" such as - 128.93.8.1. This kludge will prevent those - from flooding higher level servers. - We simply claim to be authoritative and that - the domain doesn't exist. - Note that we could return the address but we - don't do that in order to encourage that broken - software is fixed. - */ - - if (!np && type == T_A && class == C_IN && dname) { - struct in_addr ina; - - if (inet_aton(dname, &ina)) { - hp->rcode = NXDOMAIN; - hp->aa = 1; - dprintf(3, (ddt, "ypkludge: hit as '%s'\n", dname)); - return (Finish); - } - } -#endif /*YPKLUDGE*/ - - if ((!np) || (fname != dname)) - goto fetchns; - -#ifdef SECURE_ZONES - /* (gdmr) Make sure the class is correct. If we have the same name - * with more than one class then we can't refuse a request for one - * class just because another class is blocked. We *really* ought - * to look for the correct type too, but since everything in a - * particular class of zone has the same secure_zone attribute it - * doesn't really matter which type we use! Alternatively, this lot - * could all be moved to after the finddata(), by which time only - * the correct class/type combinations will be left. - */ - dp = np->n_data; - while (dp && (dp->d_class != class)) - dp = dp->d_next; - if (dp) { - zp = &zones[dp->d_zone]; - if (zp->secure_nets - && !addr_on_netlist(from->sin_addr, zp->secure_nets)) { - syslog(LOG_NOTICE, "Unauthorized request %s from %s", - dname, sin_ntoa(from)); - dprintf(1, (ddt, "req: refuse %s from %s class %d (%d)\n", - dname, sin_ntoa(from), class, zp->z_class)); - return (Refuse); - } - } -#endif - foundname++; - answers = *cpp; - count = *cpp - msg; - -#ifdef NCACHE - /* Look for NXDOMAIN record with appropriate class - * if found return immediately - */ - for (dp = np->n_data; dp ; dp = dp->d_next) { - if (!stale(dp) && (dp->d_rcode == NXDOMAIN) && - (dp->d_class == class)) { -#ifdef RETURNSOA - n = finddata(np, class, T_SOA, hp, &dname, - buflenp, &count); - if (n != 0 ) { - if (count) { - *cpp += n; - *buflenp -= n; - *msglenp += n; - hp->nscount = htons((u_int16_t)count); - } - if (hp->rcode == NOERROR_NODATA) { - /* this should not occur */ - hp->rcode = NOERROR; - return (Finish); - } - } -#endif - hp->rcode = NXDOMAIN; - hp->aa = 1; - return (Finish); - } - } - - /* if not NXDOMAIN, the NOERROR_NODATA record might be - * anywhere in the chain. have to go through the grind. - */ -#endif /*NCACHE*/ - - n = finddata(np, class, type, hp, &dname, buflenp, &count); - if (n == 0) { - /* NO data available. Refuse AXFR requests, or - * look for better servers for other requests. - */ - if (type == T_AXFR) { - dprintf(1, (ddt, "T_AXFR refused: no data\n")); - return (Refuse); - } else { - goto fetchns; - } - } - -#ifdef NCACHE - if (hp->rcode == NOERROR_NODATA) { - hp->rcode = NOERROR; -#ifdef RETURNSOA - if (count) { - *cpp += n; - *buflenp -= n; - *msglenp += n; - hp->nscount = htons(count); - } -#endif - founddata = 1; - return (Finish); - } -#endif - - *cpp += n; - *buflenp -= n; - *msglenp += n; - hp->ancount = htons(ntohs(hp->ancount) + (u_int16_t)count); - if (fname != dname && type != T_CNAME && type != T_ANY) { - if (cname++ >= MAXCNAMES) { - dprintf(3, (ddt, - "resp: leaving, MAXCNAMES exceeded\n")); - hp->rcode = SERVFAIL; - return (Finish); - } - goto try_again; - } - founddata = 1; - dprintf(3, (ddt, - "req: foundname=%d, count=%d, founddata=%d, cname=%d\n", - foundname, count, founddata, cname)); - -#ifdef SORT_RESPONSE - if ((lp = local(from)) != NULL) - sort_response(answers, count, lp, *cpp); -#endif -#ifdef BIND_NOTIFY - if (type == T_SOA && - from->sin_port == ns_port && - np->n_data) { - int zn = np->n_data->d_zone; - - if (zn != DB_Z_CACHE) { - struct notify *ap; - - /* Old? */ - ap = findNotifyPeer(&zones[zn], from->sin_addr); - /* New? */ - if (!ap && (ap = (struct notify *)malloc(sizeof *ap))) { - ap->addr = from->sin_addr; - ap->next = zones[zn].z_notifylist; - zones[zn].z_notifylist = ap; - } - /* Old or New? */ - if (ap) - ap->last = tt.tv_sec; - } - } -#endif /*BIND_NOTIFY*/ - if (type == T_AXFR) { - startxfr(qsp, np, msg, *cpp - msg, class, dname); - return (Return); - } - -#ifdef notdef - /* - * If we found an authoritative answer, we're done. - */ - if (hp->aa) - return (Finish); -#endif - - fetchns: - /* - * If we're already out of room in the response, we're done. - */ - if (hp->tc) - return (Finish); - - /* - * Look for name servers to refer to and fill in the authority - * section or record the address for forwarding the query - * (recursion desired). - */ - free_nsp(nsp); - nsp[0] = NULL; - count = 0; - switch (findns(&np, class, nsp, &count, 0)) { - case NXDOMAIN: - /* We are authoritative for this np. */ - if (!foundname) - hp->rcode = NXDOMAIN; - dprintf(3, (ddt, "req: leaving (%s, rcode %d)\n", - dname, hp->rcode)); - if (class != C_ANY) { - hp->aa = 1; - if (np && (!foundname || !founddata)) { - n = doaddauth(hp, *cpp, *buflenp, np, nsp[0]); - *cpp += n; - *buflenp -= n; -#ifdef ADDAUTH - } else if (ntohs(hp->ancount) != 0) { - /* don't add NS records for NOERROR NODATA - as some servers can get confused */ - free_nsp(nsp); - switch (findns(&np, class, nsp, &count, 1)) { - case NXDOMAIN: - case SERVFAIL: - break; - default: - if (np && - (type != T_NS || np != anp) - ) { - n = add_data(np, nsp, *cpp, - *buflenp, &count); - if (n < 0) { - hp->tc = 1; - n = (-n); - } - *cpp += n; - *buflenp -= n; - hp->nscount = - htons((u_int16_t) - count); - } - } -#endif /*ADDAUTH*/ - } - } - free_nsp(nsp); - return (Finish); - - case SERVFAIL: - /* We're authoritative but the zone isn't loaded. */ - if (!founddata && !(forward_only && fwdtab)) { - hp->rcode = SERVFAIL; - free_nsp(nsp); - return (Finish); - } - } - - /* - * If we successfully found the answer in the cache, - * or this is not a recursive query, or we are purposely - * never recursing, then add the nameserver references - * ("authority section") here and we're done. - */ - if (founddata || !hp->rd || NoRecurse) { - /* - * If the qtype was NS, and the np of the authority is - * the same as the np of the data, we don't need to add - * another copy of the answer here in the authority - * section. - */ - if (!founddata || type != T_NS || anp != np) { - n = add_data(np, nsp, *cpp, *buflenp, &count); - if (n < 0) { - hp->tc = 1; - n = (-n); - } - *cpp += n; - *buflenp -= n; - hp->nscount = htons((u_int16_t)count); - } - free_nsp(nsp); - /* Our caller will handle the Additional section. */ - return (Finish); - } - - /* - * At this point, we don't have the answer, but we do - * have some NS's to try. If the user would like us - * to recurse, create the initial query. If a cname - * is involved, we need to build a new query and save - * the old one in cmsg/cmsglen. - */ - if (cname) { - omsg = (u_char *)malloc((unsigned) *msglenp); - if (omsg == (u_char *)NULL) { - syslog(LOG_INFO, "ns_req: Out Of Memory"); - hp->rcode = SERVFAIL; - free_nsp(nsp); - return (Finish); - } - id = hp->id; - omsglen = *msglenp; - bcopy(msg, omsg, omsglen); - n = res_mkquery(QUERY, dname, class, type, - NULL, 0, NULL, msg, - *msglenp + *buflenp); - if (n < 0) { - syslog(LOG_INFO, "res_mkquery(%s) failed", dname); - hp->rcode = SERVFAIL; - free_nsp(nsp); - return (Finish); - } - *msglenp = n; - } - n = ns_forw(nsp, msg, *msglenp, from, qsp, dfd, &qp, - dname, class, type, np); - if (n != FW_OK && cname) - free(omsg); - switch (n) { - case FW_OK: - if (cname) { - qp->q_cname = cname; - qp->q_cmsg = omsg; - qp->q_cmsglen = omsglen; - qp->q_id = id; - } - break; - case FW_DUP: - break; /* Duplicate request dropped */ - case FW_NOSERVER: - /* - * Don't go into an infinite loop if - * the admin gave root NS records in the cache - * file without giving address records - * for the root servers. - */ - if (np) { - if (NAME(*np)[0] == '\0') { - syslog(LOG_NOTICE, - "ns_req: no address for root server"); - hp->rcode = SERVFAIL; - free_nsp(nsp); - return (Finish); - } -#ifdef VALIDATE - /* - * we need to kill all the NS records here as - * validate will fail as we are talking to the parent - * server - */ - delete_all(np, class, T_NS); -#endif - for (dp = np->n_data; dp ; dp = dp->d_next) - if (dp->d_zone && match(dp, class, T_NS)) - break; - if (dp) { - /* - * we know the child zone exists but are - * missing glue. - * - * nslookup has called sysquery() to get the - * missing glue. - * - * for UDP, drop the response and let the - * client retry. for TCP, we should probably - * (XXX) hold open the TCP connection for a - * while in case the sysquery() comes back - * soon. meanwhile we SERVFAIL. - */ - if (qsp) - goto do_servfail; - break; - } - np = np_parent(np); - } - goto fetchns; /* Try again. */ - case FW_SERVFAIL: - do_servfail: - hp->rcode = SERVFAIL; - free_nsp(nsp); - return (Finish); - } - free_nsp(nsp); - return (Return); -} - -static enum req_action -req_iquery(hp, cpp, eom, buflenp, msg, from) - HEADER *hp; - u_char **cpp, *eom; - int *buflenp; - u_char *msg; - struct sockaddr_in *from; -{ - int dlen, alen, n, type, class, count; - char dnbuf[MAXDNAME], anbuf[PACKETSZ], *data, *fname; - -#ifdef XSTATS - nameserIncr(from->sin_addr, nssRcvdIQ); -#endif - - if (ntohs(hp->ancount) != 1 - || ntohs(hp->qdcount) != 0 - || ntohs(hp->nscount) != 0 - || ntohs(hp->arcount) != 0) { - dprintf(1, (ddt, "FORMERR IQuery header counts wrong\n")); - hp->qdcount = htons(0); - hp->ancount = htons(0); - hp->nscount = htons(0); - hp->arcount = htons(0); - hp->rcode = FORMERR; - return (Finish); - } - - /* - * Skip domain name, get class, and type. - */ - if ((n = dn_skipname(*cpp, eom)) < 0) { - dprintf(1, (ddt, "FORMERR IQuery packet name problem\n")); - hp->rcode = FORMERR; - return (Finish); - } - *cpp += n; - if (*cpp + 3 * INT16SZ + INT32SZ > eom) { - dprintf(1, (ddt, "FORMERR IQuery message too short")); - hp->rcode = FORMERR; - return (Finish); - } - GETSHORT(type, *cpp); - GETSHORT(class, *cpp); - *cpp += INT32SZ; /* ttl */ - GETSHORT(dlen, *cpp); - *cpp += dlen; - if (*cpp != eom) { - dprintf(1, (ddt, "FORMERR IQuery message length off\n")); - hp->rcode = FORMERR; - return (Finish); - } - - /* - * not all inverse queries are handled. - */ - switch (type) { - case T_A: -#ifndef INVQ - if (!fake_iquery || dlen != INT32SZ) - return (Refuse); -#endif -#ifdef INVQ - case T_UID: - case T_GID: -#endif - break; - default: - return (Refuse); - } - dprintf(1, (ddt, "req: IQuery class %d type %d\n", class, type)); - - fname = (char *)msg + HFIXEDSZ; - alen = (char *)*cpp - fname; - if ((size_t)alen > sizeof anbuf) - return (Refuse); - bcopy(fname, anbuf, alen); - data = anbuf + alen - dlen; - *cpp = (u_char *)fname; - *buflenp -= HFIXEDSZ; - count = 0; - -#ifdef QRYLOG - if (qrylog) { - syslog(LOG_INFO, "XX /%s/%s/-%s", - inet_ntoa(from->sin_addr), - inet_ntoa(data_inaddr((u_char *)data)), - p_type(type)); - } -#endif /*QRYLOG*/ - -#ifdef INVQ - { - register struct invbuf *ip; - - for (ip = invtab[dhash((u_char *)data, dlen)]; - ip != NULL; - ip = ip->i_next) { - int i; - - for (i = 0; i < INVBLKSZ; i++) { - struct namebuf *np; - struct databuf *dp; - - if ((np = ip->i_dname[i]) == NULL) - break; - dprintf(5, (ddt, "dname = %d\n", NAME(*np))); - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (!match(dp, class, type)) - continue; - if (dp->d_size != dlen || - bcmp(dp->d_data, data, dlen)) - continue; - getname(np, dnbuf, sizeof(dnbuf)); - dprintf(2, (ddt, "req: IQuery found %s\n", - dnbuf)); - *buflenp -= QFIXEDSZ; - n = dn_comp(dnbuf, *cpp, *buflenp, NULL, NULL); - if (n < 0) { - hp->tc = 1; - return (Finish); - } - *cpp += n; - if (*cpp + 2 * INT16SZ > dnbuf + *buflenp) { - hp->tc = 1; - return (Finish); - } - PUTSHORT((u_int16_t)dp->d_type, *cpp); - PUTSHORT((u_int16_t)dp->d_class, *cpp); - *buflenp -= n; - count++; - } - } - } - } -#else /*INVQ*/ - /* - * We can only get here if we are compiled without INVQ (the default) - * and the type is T_A and the option "fake-iquery" is on in the boot - * file. - * - * What we do here is send back a bogus response of "[dottedquad]". - * A better strategy would be to turn this into a PTR query, but that - * would legitimize inverse queries in a way they do not deserve. - */ - sprintf(dnbuf, "[%s]", inet_ntoa(data_inaddr((u_char *)data))); - *buflenp -= QFIXEDSZ; - n = dn_comp(dnbuf, *cpp, *buflenp, NULL, NULL); - if (n < 0) { - hp->tc = 1; - return (Finish); - } - *cpp += n; - PUTSHORT((u_int16_t)type, *cpp); - PUTSHORT((u_int16_t)class, *cpp); - *buflenp -= n; - count++; -#endif /*INVQ*/ - dprintf(1, (ddt, "req: IQuery %d records\n", count)); - hp->qdcount = htons((u_int16_t)count); - if (alen > *buflenp) { - hp->tc = 1; - return (Finish); - } - bcopy(anbuf, *cpp, alen); - *cpp += alen; - return (Finish); -} - -static void -fwritemsg(rfp, msg, msglen) - FILE *rfp; - u_char *msg; - int msglen; -{ - u_char len[INT16SZ]; - - __putshort(msglen, len); - if (fwrite((char *)len, INT16SZ, 1, rfp) != 1 || - fwrite((char *)msg, msglen, 1, rfp) != 1) { - syslog(LOG_ERR, "fwritemsg: %m"); - _exit(1); - } -} - -/* - * Test a datum for validity and return non-zero if it is out of date. - */ -int -stale(dp) - register struct databuf *dp; -{ - register struct zoneinfo *zp = &zones[dp->d_zone]; - - switch (zp->z_type) { - - case Z_PRIMARY: - return (0); - -#ifdef STUBS - case Z_STUB: - /* root stub zones have DB_F_HINT set */ - if (dp->d_flags & DB_F_HINT) - return (0); - /* FALLTROUGH */ -#endif - case Z_SECONDARY: - /* - * Check to see whether a secondary zone - * has expired; if so clear authority flag - * for zone and return true. If lastupdate - * is in the future, assume zone is up-to-date. - */ - if ((int32_t)(tt.tv_sec - zp->z_lastupdate) - > (int32_t)zp->z_expire) { - dprintf(1, (ddt, - "stale: secondary zone %s expired\n", - zp->z_origin)); - if (!haveComplained(zp->z_origin, (char*)stale)) { - syslog(LOG_NOTICE, - "secondary zone \"%s\" expired", - zp->z_origin); - } - zp->z_flags &= ~Z_AUTH; - needmaint = 1; - return (1); - } - if (zp->z_lastupdate > tt.tv_sec) { - if (!haveComplained(zp->z_origin, (char*)stale)) { - syslog(LOG_NOTICE, - "secondary zone \"%s\" time warp", - zp->z_origin); - } - zp->z_flags &= ~Z_AUTH; - needmaint = 1; - return (1); - } - return (0); - - case Z_CACHE: - if (dp->d_flags & DB_F_HINT || dp->d_ttl >= tt.tv_sec) - return (0); - dprintf(3, (ddt, "stale: ttl %d %ld (x%lx)\n", - dp->d_ttl, (long)(dp->d_ttl - tt.tv_sec), - (u_long)dp->d_flags)); - return (1); - - default: - /* FALLTHROUGH */ ; - - } - panic(-1, "stale: impossible condition"); - /* NOTREACHED */ -} - -/* - * Copy databuf into a resource record for replies. - * Return size of RR if OK, -1 if buffer is full. - */ -int -make_rr(name, dp, buf, buflen, doadd) - const char *name; - register struct databuf *dp; - u_char *buf; - int buflen, doadd; -{ - register u_char *cp; - u_char *cp1, *sp; - struct zoneinfo *zp; - register int32_t n; - register int16_t type = dp->d_type; - register u_int32_t ttl; - u_char **edp = dnptrs + sizeof dnptrs / sizeof dnptrs[0]; - - dprintf(5, (ddt, "make_rr(%s, %lx, %lx, %d, %d) %d zone %d ttl %lu\n", - name, (u_long)dp, (u_long)buf, - buflen, doadd, dp->d_size, dp->d_zone, (u_long)dp->d_ttl)); - -#ifdef NCACHE - if (dp->d_rcode -#ifdef RETURNSOA - && dp->d_size == 0 -#endif - ) { - panic(-1, "make_rr: impossible d_rcode value"); - } -#endif - zp = &zones[dp->d_zone]; - /* check for outdated RR before updating dnptrs by dn_comp() (?) */ - if (zp->z_type == Z_CACHE) { - if ((dp->d_flags & DB_F_HINT) != 0 - || dp->d_ttl < (u_int32_t)tt.tv_sec) { - ttl = 0; - } else - ttl = dp->d_ttl - (u_int32_t) tt.tv_sec; - } else { - if (dp->d_ttl != USE_MINIMUM) - ttl = dp->d_ttl; - else - ttl = zp->z_minimum; /* really default */ -#ifdef notdef /* don't decrease ttl based on time since verification */ - if (zp->z_type == Z_SECONDARY) { - /* - * Set ttl to value received from primary, - * less time since we verified it (but never - * less than a small positive value). - */ - ttl -= tt.tv_sec - zp->z_lastupdate; - if (ttl <= 0) - ttl = 120; - } -#endif - } - - buflen -= RRFIXEDSZ; - if (buflen < 0) - return (-1); -#if defined(RETURNSOA) && defined(NCACHE) - if (dp->d_rcode) { - name = (char *)dp->d_data; - name += strlen(name) +1; - name += strlen(name) +1; - name += 5 * INT32SZ; - type = T_SOA; - } -#endif - if ((n = dn_comp(name, buf, buflen, dnptrs, edp)) < 0) - return (-1); - cp = buf + n; - buflen -= n; - if (buflen < 0) - return (-1); - PUTSHORT((u_int16_t)type, cp); - PUTSHORT((u_int16_t)dp->d_class, cp); - PUTLONG(ttl, cp); - sp = cp; - cp += INT16SZ; - switch (type) { - case T_CNAME: - case T_MG: - case T_MR: - case T_PTR: - n = dn_comp((char *)dp->d_data, cp, buflen, dnptrs, edp); - if (n < 0) - return (-1); - PUTSHORT((u_int16_t)n, sp); - cp += n; - break; - - case T_MB: - case T_NS: - /* Store domain name in answer */ - n = dn_comp((char *)dp->d_data, cp, buflen, dnptrs, edp); - if (n < 0) - return (-1); - PUTSHORT((u_int16_t)n, sp); - cp += n; - if (doadd) - addname((char*)dp->d_data, name, - type, dp->d_class); - break; - - case T_SOA: - case T_MINFO: - case T_RP: - cp1 = dp->d_data; - n = dn_comp((char *)cp1, cp, buflen, dnptrs, edp); - if (n < 0) - return (-1); - cp += n; - buflen -= type == T_SOA ? n + 5 * INT32SZ : n; - if (buflen < 0) - return (-1); - cp1 += strlen((char *)cp1) + 1; - n = dn_comp((char *)cp1, cp, buflen, dnptrs, edp); - if (n < 0) - return (-1); - cp += n; - if (type == T_SOA) { - cp1 += strlen((char *)cp1) + 1; - bcopy(cp1, cp, (n = 5 * INT32SZ)); - cp += n; - } - n = (u_int16_t)((cp - sp) - INT16SZ); - PUTSHORT((u_int16_t)n, sp); - break; - - case T_NAPTR: - /* cp1 == our data/ cp == data of RR */ - cp1 = dp->d_data; - - /* copy order */ - buflen -= INT16SZ; - if (buflen < 0) - return (-1); - bcopy(cp1, cp, INT16SZ); - cp += INT16SZ; - cp1 += INT16SZ; - n = (u_int16_t)((cp - sp) - INT16SZ); - dprintf(1, (ddt, "current size n = %u\n", n)); - - /* copy preference */ - buflen -= INT16SZ; - if (buflen < 0) - return (-1); - bcopy(cp1, cp, INT16SZ); - cp += INT16SZ; - cp1 += INT16SZ; - n = (u_int16_t)((cp - sp) - INT16SZ); - dprintf(1, (ddt, "current size n = %u\n", n)); - - /* Flags */ - n = *cp1++; - buflen -= n + 1; - if (buflen < 0) - return (-1); - dprintf(1, (ddt, "size of n at flags = %d\n", n)); - *cp++ = n; - bcopy(cp1,cp,n); - cp += n; - cp1 += n; - n = (u_int16_t)((cp - sp) - INT16SZ); - dprintf(1, (ddt, "current size n = %u\n", n)); - - /* Service */ - n = *cp1++; - buflen -= n + 1; - if (buflen < 0) - return (-1); - *cp++ = n; - bcopy(cp1,cp,n); - cp += n; - cp1 += n; - n = (u_int16_t)((cp - sp) - INT16SZ); - dprintf(1, (ddt, "current size n = %u\n", n)); - - /* Regexp */ - n = *cp1++; - buflen -= n + 1; - if (buflen < 0) - return (-1); - *cp++ = n; - bcopy(cp1,cp,n); - cp += n; - cp1 += n; - n = (u_int16_t)((cp - sp) - INT16SZ); - dprintf(1, (ddt, "current size n = %u\n", n)); - - /* Replacement */ - dprintf(1, (ddt, "Replacement = %s\n", cp1)); - n = dn_comp((char *)cp1, cp, buflen, dnptrs, edp); - dprintf(1, (ddt, "dn_comp's n = %u\n", n)); - if (n < 0) - return (-1); - cp += n; - - /* save data length */ - n = (u_int16_t)((cp - sp) - INT16SZ); - dprintf(1, (ddt, "saved size n = %u\n", n)); - PUTSHORT((u_int16_t)n, sp); - - break; - - case T_MX: - case T_AFSDB: - case T_RT: - case T_SRV: - /* cp1 == our data/ cp == data of RR */ - cp1 = dp->d_data; - - if ((buflen -= INT16SZ) < 0) - return (-1); - - /* copy preference */ - bcopy(cp1, cp, INT16SZ); - cp += INT16SZ; - cp1 += INT16SZ; - - if (type == T_SRV) { - buflen -= INT16SZ*2; - if (buflen < 0) - return (-1); - bcopy(cp1, cp, INT16SZ*2); - cp += INT16SZ*2; - cp1 += INT16SZ*2; - } - - n = dn_comp((char *)cp1, cp, buflen, dnptrs, edp); - if (n < 0) - return (-1); - cp += n; - - /* save data length */ - n = (u_int16_t)((cp - sp) - INT16SZ); - PUTSHORT((u_int16_t)n, sp); - if (doadd) - addname((char*)cp1, name, type, dp->d_class); - break; - - case T_PX: - cp1 = dp->d_data; - - if ((buflen -= INT16SZ) < 0) - return (-1); - - /* copy preference */ - bcopy(cp1, cp, INT16SZ); - cp += INT16SZ; - cp1 += INT16SZ; - - n = dn_comp((char *)cp1, cp, buflen, dnptrs, edp); - if (n < 0) - return (-1); - cp += n; - buflen -= n; - cp1 += strlen((char *)cp1) + 1; - n = dn_comp((char *)cp1, cp, buflen, dnptrs, edp); - if (n < 0) - return (-1); - cp += n; - - /* save data length */ - n = (u_int16_t)((cp - sp) - INT16SZ); - PUTSHORT((u_int16_t)n, sp); - break; - - case T_SIG: - /* cp1 == our data; cp == data of target RR */ - cp1 = dp->d_data; - - /* first just copy over the type_covered, algorithm, */ - /* labels, orig ttl, two timestamps, and the footprint */ - if ((dp->d_size - 18) > buflen) - return (-1); /* out of room! */ - bcopy( cp1, cp, 18 ); - cp += 18; - cp1 += 18; - buflen -= 18; - - /* then the signer's name */ - n = dn_comp((char *)cp1, cp, buflen, NULL, NULL); - if (n < 0) - return (-1); - cp += n; - buflen -= n; - cp1 += strlen((char*)cp1)+1; - - /* finally, we copy over the variable-length signature */ - n = dp->d_size - (u_int16_t)((cp1 - dp->d_data)); - if (n > buflen) - return (-1); /* out of room! */ - bcopy(cp1, cp, n); - cp += n; - - /* save data length & return */ - n = (u_int16_t)((cp - sp) - INT16SZ); - PUTSHORT((u_int16_t)n, sp); - break; - - default: - if (dp->d_size > buflen) - return (-1); - bcopy(dp->d_data, cp, dp->d_size); - PUTSHORT((u_int16_t)dp->d_size, sp); - cp += dp->d_size; - } - return (cp - buf); -} - -#if defined(__STDC__) || defined(__GNUC__) -static void -addname(register const char *dname, - register const char *rname, - u_int16_t rtype, - u_int16_t class) -#else -static void -addname(dname, rname, rtype, class) - register const char *dname; - register const char *rname; - u_int16_t rtype; - u_int16_t class; -#endif -{ - register struct addinfo *ap; - register int n; - - for (ap = addinfo, n = addcount; --n >= 0; ap++) - if (strcasecmp(ap->a_dname, dname) == 0) - return; - - /* add domain name to additional section */ - if (addcount < NADDRECS) { - addcount++; - ap->a_dname = savestr(dname); - ap->a_rname = savestr(rname); - ap->a_rtype = rtype; - ap->a_class = class; - } -} - -/* - * Lookup addresses for names in addinfo and put into the message's - * additional section. - */ -int -doaddinfo(hp, msg, msglen) - HEADER *hp; - u_char *msg; - int msglen; -{ - register struct namebuf *np; - register struct databuf *dp; - register struct addinfo *ap; - register u_char *cp; - struct hashbuf *htp; - const char *fname; - int n, count; - - if (!addcount) - return (0); - - dprintf(3, (ddt, "doaddinfo() addcount = %d\n", addcount)); - - if (hp->tc) { - dprintf(4, (ddt, "doaddinfo(): tc already set, bailing\n")); - return (0); - } - - count = 0; - cp = msg; - for (ap = addinfo; --addcount >= 0; ap++) { - int foundany = 0, - foundcname = 0, - save_count = count, - save_msglen = msglen; - u_char *save_cp = cp; - - dprintf(3, (ddt, "do additional \"%s\" (from \"%s\")\n", - ap->a_dname, ap->a_rname)); - htp = hashtab; /* because "nlookup" stomps on arg. */ - np = nlookup(ap->a_dname, &htp, &fname, 0); - if (np == NULL || fname != ap->a_dname) - goto next_rr; - dprintf(3, (ddt, "found it\n")); - /* look for the data */ - delete_stale(np); - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - if (match(dp, (int)ap->a_class, T_CNAME) || - match(dp, C_IN, T_CNAME)) { - foundcname++; - break; - } - if (!match(dp, (int)ap->a_class, T_A) && - !match(dp, C_IN, T_A) && - !match(dp, (int)ap->a_class, T_AAAA) && - !match(dp, C_IN, T_AAAA)) { - continue; - } - foundany++; - /* - * Should be smart and eliminate duplicate - * data here. XXX - */ - if ((n = make_rr(ap->a_dname, dp, cp, msglen, 0)) < 0){ - /* truncation in the additional-data section - * is not all that serious. we do not set TC, - * since the answer and authority sections are - * OK; however, since we're not setting TC we - * have to make sure that none of the RR's for - * this name go out (!TC implies that all - * {name,type} appearances are complete -- and - * since we only do A RR's here, the name is - * the key). vixie, 23apr93 - */ - dprintf(5, (ddt, - "addinfo: not enough room, remaining msglen = %d\n", - save_msglen)); - cp = save_cp; - msglen = save_msglen; - count = save_count; - break; - } - dprintf(5, (ddt, - "addinfo: adding address data n = %d\n", - n)); - cp += n; - msglen -= n; - count++; - } - next_rr: - if (!NoFetchGlue && !foundcname && !foundany) { - /* ask a real server for this info */ - (void) sysquery(ap->a_dname, (int)ap->a_class, T_A, - NULL, 0, QUERY); - } - if (foundcname) { - if (!haveComplained((char*)nhash(ap->a_dname), - (char*)nhash(ap->a_rname))) { - syslog(LOG_DEBUG, - "\"%s %s %s\" points to a CNAME (%s)", - ap->a_rname, p_class(ap->a_class), - p_type(ap->a_rtype), ap->a_dname); - } - } - free(ap->a_dname); - free(ap->a_rname); - } - hp->arcount = htons((u_int16_t)count); - return (cp - msg); -} - -int -doaddauth(hp, cp, buflen, np, dp) - register HEADER *hp; - u_char *cp; - int buflen; - struct namebuf *np; - struct databuf *dp; -{ - char dnbuf[MAXDNAME]; - int n; - - getname(np, dnbuf, sizeof(dnbuf)); - if (stale(dp)) { - dprintf(1, (ddt, - "doaddauth: can't add stale '%s' (%d)\n", - dnbuf, buflen)); - return (0); - } - n = make_rr(dnbuf, dp, cp, buflen, 1); - if (n <= 0) { - dprintf(1, (ddt, - "doaddauth: can't add oversize '%s' (%d) (n=%d)\n", - dnbuf, buflen, n)); - if (n < 0) { - hp->tc = 1; - } - return (0); - } - hp->nscount = htons(ntohs(hp->nscount) + 1); - return (n); -} - -/* - * Do a zone transfer (or a recursive part of a zone transfer). - * SOA record already sent. - * - * top always refers to the domain at the top of the zone being transferred. - * np refers to a domain inside the zone being transferred, - * which will be equal to top if this is the first call, - * or will be a subdomain below top if this is a recursive call, - * rfp is a stdio file to which output is sent. - */ -static void -doaxfr(np, rfp, top, class) - register struct namebuf *np; - FILE *rfp; - struct namebuf *top; - int class; /* Class to transfer */ -{ - register struct databuf *dp; - register int n; - struct hashbuf *htp; - struct databuf *gdp; /* glue databuf */ - struct namebuf *gnp; /* glue namebuf */ - struct namebuf *tnp; /* top namebuf */ - struct databuf *tdp; /* top databuf */ - struct namebuf **npp, **nppend; - u_char msg[64*1024]; - u_char *cp; - const char *fname; - char dname[MAXDNAME]; - HEADER *hp; - int fndns; - - if (np == top) - dprintf(1, (ddt, "doaxfr()\n")); - fndns = 0; - bzero((char*)msg, sizeof msg); - hp = (HEADER *) msg; - hp->opcode = QUERY; - hp->qr = 1; - hp->rcode = NOERROR; - hp->ancount = htons(1); - cp = msg + HFIXEDSZ; - getname(np, dname, sizeof dname); - - /* first do the NS records (del@harris) */ - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { -#ifdef GEN_AXFR - if (dp->d_class != class && class != C_ANY) - continue; -#endif -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - if (dp->d_type == T_NS) { - fndns = 1; - n = make_rr(dname, dp, cp, sizeof(msg)-HFIXEDSZ, 0); - if (n < 0) - continue; - fwritemsg(rfp, msg, n + HFIXEDSZ); -#ifdef NO_GLUE - if ((np != top) || (NAME(*top)[0] == '\0')) { -#endif /*NO_GLUE*/ - /* Glue the sub domains together by sending - * the address records for the sub domain - * name servers along if necessary. - * Glue is necessary if the server is in any zone - * delegated from the current (top) zone. Such - * a delegated zone might or might not be that - * referred to by the NS record now being handled. - */ - htp = hashtab; - cp = (u_char *) (msg + HFIXEDSZ); - gnp = nlookup((char *)dp->d_data, &htp, &fname, 0); - if (gnp == NULL || fname != (char *)dp->d_data) - continue; -#ifdef NO_GLUE - for (tnp = gnp; tnp != NULL; tnp = tnp->n_parent) - if ( tnp == top ) - break; - if ( (tnp == NULL) && (NAME(*top)[0] != '\0') ) - continue; /* name server is not below top domain */ - for (tnp = gnp; - tnp != NULL && tnp != top; - tnp = tnp->n_parent) { - for (tdp = tnp->n_data; - tdp != NULL; - tdp = tdp->d_next) { -#ifdef GEN_AXFR - if (tdp->d_class != class && class != C_ANY) - continue; -#endif - if (tdp->d_type == T_NS) - break; - } - if (tdp != NULL) - break; /* found a zone cut */ - } - if ((tnp == top) || - ((tnp == NULL) && (NAME(*top)[0] == '\0'))) - continue; /* name server is not in a delegated zone */ - /* now we know glue records are needed. send them. */ -#endif /*NO_GLUE*/ - for (gdp=gnp->n_data; gdp != NULL; gdp=gdp->d_next) { -#ifdef GEN_AXFR - if (gdp->d_class != class && class != C_ANY) - continue; -#endif - if (gdp->d_type != T_A || stale(gdp)) - continue; -#ifdef NCACHE - if (gdp->d_rcode) - continue; -#endif - n = make_rr(fname, gdp, cp, sizeof(msg)-HFIXEDSZ, 0); - if (n < 0) - continue; - fwritemsg(rfp, msg, n + HFIXEDSZ); - } -#ifdef NO_GLUE - } -#endif /*NO_GLUE*/ - } - } - /* no need to send anything else if a delegation appeared */ - if ((np != top) && fndns) - return; - - /* do the rest of the data records */ - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { -#ifdef GEN_AXFR - if (dp->d_class != class && class != C_ANY) - continue; -#endif - /* - * Skip the top SOA record (marks end of data); - * don't send SOA for subdomains, as we're not sending them; - * skip the NS records because we did them first. - */ - if (dp->d_type == T_SOA || dp->d_type == T_NS) - continue; - -#if 0 /* Not yet implemented. Only a SHOULD in the I-D. -gnu@toad.com */ - /* skip the SIG AXFR record because we did it first too. */ - if (dp->d_type == T_SIG) { - int sig_rrtype = GETSHORT (dp->d_data); - if (sig_rrtype == T_AXFR) - continue; - } -#endif /* 0 */ - - if (dp->d_zone == 0 || stale(dp)) - continue; -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - if ((n = make_rr(dname, dp, cp, sizeof(msg)-HFIXEDSZ, 0)) < 0) - continue; - fwritemsg(rfp, msg, n + HFIXEDSZ); - } - - /* Finally do non-delegated subdomains. Delegated subdomains - * have already been handled. - */ - /* - * We find the subdomains by looking in the hash table for this - * domain, but the root domain needs special treatment, because - * of the following wart in the database design: - * - * The top level hash table (pointed to by the global `hashtab' - * variable) contains pointers to the namebuf's for the root as - * well as for the top-level domains below the root, in contrast - * to the usual situation where a hash table contains entries - * for domains at the same level. The n_hash member of the - * namebuf for the root domain is NULL instead of pointing to a - * hashbuf for the top-level domains. The n_parent members of - * the namebufs for the top-level domains are NULL instead of - * pointing to the namebuf for the root. - * - * We work around the wart as follows: - * - * If we are not dealing with the root zone then we just set - * htp = np->n_hash, pointing to the hash table for the current - * domain, and we walk through the hash table as usual, - * processing the namebufs for all the subdomains. - * - * If we are dealing with the root zone, then we set - * htp = hashtab, pointing to the global hash table (because - * there is no hash table associated with the root domain's - * namebuf. While we walk this hash table, we take care not to - * recursively process the entry for the root namebuf. - * - * (apb@und nov1990) - */ - htp = ((dname[0] == '\0') ? hashtab : np->n_hash); - if (htp == NULL) { - return; /* no subdomains */ - } - npp = htp->h_tab; - nppend = npp + htp->h_size; - while (npp < nppend) { - for (np = *npp++; np != NULL; np = np->n_next) { - if (NAME(*np)[0] != '\0') { /* don't redo root domain */ - doaxfr(np, rfp, top, class); - } - } - } - if (np == top) - dprintf(1, (ddt, "exit doaxfr()\n")); -} - -static void -startxfr(qsp, np, soa, soalen, class, dname) - struct qstream *qsp; - struct namebuf *np; - u_char *soa; - int soalen; - int class; - const char *dname; -{ - FILE *rfp; - int fdstat; - pid_t pid; - int pipefd[2]; - char c; -#ifdef HAVE_SETVBUF - char *buf; -#endif -#ifdef SO_SNDBUF - static const int sndbuf = XFER_BUFSIZE * 2; -#endif -#ifdef SO_LINGER - static const struct linger ll = { 1, 120 }; -#endif - - dprintf(5, (ddt, "startxfr()\n")); - - /* create a pipe to synchronize parent and child */ - if (pipe(pipefd) != 0) { - syslog(LOG_NOTICE, "startxfr(%s -> %s) failing; pipe: %m", - dname, sin_ntoa(&qsp->s_from)); - sqrm(qsp); - return; - } - - /* - * child does the work while - * the parent continues - */ - switch (pid = fork()) { - case -1: - syslog(LOG_NOTICE, "startxfr(%s -> %s) failing; fork: %m", - dname, sin_ntoa(&qsp->s_from)); - close(pipefd[0]); - close(pipefd[1]); - sqrm(qsp); - return; - case 0: - /* child */ - break; - default: - /* parent */ - syslog(LOG_DEBUG, "zone transfer of \"%s\" to %s (pid %lu)", - dname, sin_ntoa(&qsp->s_from), (u_long)pid); - close(pipefd[0]); /* close the read end */ - sqrm(qsp); - /* close the write end to release the child */ - close(pipefd[1]); - return; - } - - /* - * Child. - * - * XXX: this should be a vfork/exec since on non-copy-on-write - * systems with huge nameserver images, this is very expensive. - */ - close(vs); - sqflush(/*allbut*/ qsp); - dqflush((time_t)0); - - close(pipefd[1]); /* close the write end */ - /* - * Wait for parent to close the write end of the pipe which - * we'll see as an EOF. The parent won't close the write end - * until it has closed the fd we'll be writing to, at which - * point it will be safe for us to proceed. - * - * We shouldn't get interrupted, but ... - */ - while (read(pipefd[0], &c, 1) == -1 && errno == EINTR) - ; /* nothing */ - close(pipefd[0]); - -#ifdef RENICE - nice(-40); nice(20); nice(0); /* back to "normal" */ -#endif - dprintf(5, (ddt, "startxfr: child pid %lu\n", (u_long)pid)); - - if (!(rfp = fdopen(qsp->s_rfd, "w"))) { - syslog(LOG_ERR, "fdopen: %m"); - _exit(1); - } - ns_setproctitle("zone XFR to", qsp->s_rfd); - if (-1 == (fdstat = fcntl(qsp->s_rfd, F_GETFL, 0))) { - syslog(LOG_ERR, "fcntl(F_GETFL): %m"); - _exit(1); - } - (void) fcntl(qsp->s_rfd, F_SETFL, fdstat & ~PORT_NONBLOCK); -#ifdef HAVE_SETVBUF - /* some systems (DEC OSF/1, SunOS) don't initialize the stdio buffer - * if all you do between fdopen() and fclose() are fwrite()'s. even - * on systems where the buffer is correctly set, it is too small. - */ - if ((buf = malloc(XFER_BUFSIZE)) != NULL) - (void) setvbuf(rfp, buf, _IOFBF, XFER_BUFSIZE); -#endif -#ifdef SO_SNDBUF - /* the default seems to be 4K, and we'd like it to have enough room - * to parallelize sending the pushed data with accumulating more - * write() data from us. - */ - (void) setsockopt(qsp->s_rfd, SOL_SOCKET, SO_SNDBUF, - (char *)&sndbuf, sizeof sndbuf); -#endif - /* XXX: some day we would like to only send the size and header out - * when we fill a 64K DNS/AXFR "message" rather than on each RR. - * (PVM@ISI gets credit for this idea.) - */ - fwritemsg(rfp, soa, soalen); - doaxfr(np, rfp, np, class); - fwritemsg(rfp, soa, soalen); - (void) fflush(rfp); -#ifdef SO_LINGER - /* kernels that map pages for IO end up failing if the pipe is full - * at exit and we take away the final buffer. this is really a kernel - * bug but it's harmless on systems that are not broken, so... - */ - setsockopt(qsp->s_rfd, SOL_SOCKET, SO_LINGER, - (char *)&ll, sizeof ll); -#endif - close(qsp->s_rfd); - _exit(0); - /* NOTREACHED */ -} - -void -free_addinfo() { - struct addinfo *ap; - - for (ap = addinfo; --addcount >= 0; ap++) { - free(ap->a_dname); - free(ap->a_rname); - } - addcount = 0; -} - -void -free_nsp(nsp) - struct databuf **nsp; -{ - while (*nsp) { - if (--((*nsp)->d_rcnt)) { - dprintf(3, (ddt, "free_nsp: %s rcnt %d\n", - (*nsp)->d_data, (*nsp)->d_rcnt)); - } else { - dprintf(3, (ddt, "free_nsp: %s rcnt %d delayed\n", - (*nsp)->d_data, (*nsp)->d_rcnt)); - db_free(*nsp); /* delayed free */ - } - *nsp++ = NULL; - } -} - -static void -copyCharString(dst, src) - u_char **dst; - const char *src; -{ - size_t len = strlen(src) & 0xff; - - *(*dst)++ = (u_char) len; - memcpy(*dst, src, len); - *dst += len; -} diff --git a/contrib/bind/named/ns_resp.c b/contrib/bind/named/ns_resp.c deleted file mode 100644 index d48da231ee3c..000000000000 --- a/contrib/bind/named/ns_resp.c +++ /dev/null @@ -1,3236 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static char sccsid[] = "@(#)ns_resp.c 4.65 (Berkeley) 3/3/91"; -static char rcsid[] = "$Id: ns_resp.c,v 8.41 1998/04/07 04:59:45 vixie Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1988, 1990 - * - - * Copyright (c) 1986, 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. - * - - * 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. - * --Copyright-- - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "named.h" - -static u_int8_t norootlogged[MAXCLASS]; /* XXX- should be a bitmap */ - -static const char skipnameFailedAnswer[] = "skipname failed in answer", - skipnameFailedAuth[] = "skipname failed in authority", - skipnameFailedQuery[] = "skipname failed in query", - outofDataQuery[] = "ran out of data in query", - outofDataAnswer[] = "ran out of data in answer", - notSingleQuery[] = "not exactly one query", - expandFailedQuery[] = "dn_expand failed in query", - expandFailedAnswer[] = "dn_expand failed in answer", - expandFailedAuth[] = "dn_expand failed in authority", - outofDataAuth[] = "ran out of data in authority", - dlenOverrunAnswer[] = "dlen overrun in answer", - dlenOverrunAuth[] = "dlen overrun in authority", - dlenUnderrunAnswer[] = "dlen underrun in answer", - outofDataFinal[] = "out of data in final pass", - outofDataAFinal[] = "out of data after final pass", - badNameFound[] = "found an invalid domain name", - wrongQuestion[] = "answer to wrong question", - danglingCname[] = "dangling CNAME pointer"; - -struct db_list { - struct db_list *db_next; - struct databuf *db_dp; -}; - -struct flush_set { - char * fs_name; - int fs_type; - int fs_class; - u_int fs_cred; - struct db_list *fs_list; - struct db_list *fs_last; -}; - -static void rrsetadd __P((struct flush_set *, char *, - struct databuf *)), - rrsetupdate __P((struct flush_set *, int flags)), - flushrrset __P((struct flush_set *)), - free_flushset __P((struct flush_set *)); -static int rrsetcmp __P((char *, struct db_list *)), - check_root __P((void)), - check_ns __P((void)), - rrextract __P((u_char *, int, u_char *, - struct databuf **, char *, int, - char **)); - -static void add_related_additional __P((char *)); -static void free_related_additional __P((void)); -static int related_additional __P((char *)); -static void maybe_free __P((char **)); - -#define MAX_RELATED 100 - -static int num_related = 0; -static char *related[MAX_RELATED]; - -#ifdef LAME_LOGGING -static char * -learntFrom(qp, server) - struct qinfo *qp; - struct sockaddr_in *server; -{ - static char *buf = NULL; - char *a, *ns, *na; - struct databuf *db; -#ifdef STATS - char nsbuf[20]; - char abuf[20]; -#endif - int i; - - if (buf) { - free(buf); - buf = NULL; - } - - a = ns = na = ""; - - for (i = 0; i < (int)qp->q_naddr; i++) { - if (qp->q_addr[i].ns_addr.sin_addr.s_addr == - server->sin_addr.s_addr) { - db = qp->q_addr[i].ns; - if (db) { -#ifdef STATS - if (db->d_ns) { - strcpy(nsbuf, - inet_ntoa(db->d_ns->addr)); - ns = nsbuf; - } else { - ns = zones[db->d_zone].z_origin; - } -#endif - -#ifdef NCACHE - if (!db->d_rcode) -#endif - na = (char*)qp->q_addr[i].ns->d_data; - } - -#ifdef STATS - db = qp->q_addr[i].nsdata; - if (db) { - if (db->d_ns) { - strcpy(abuf, - inet_ntoa(db->d_ns->addr)); - a = abuf; - } else { - a = zones[db->d_zone].z_origin; - } - } -#endif - break; - } - } - - if ((a == ns) && (ns == na)) /* all "UNKNOWN" */ - return (""); - -#ifdef STATS -# define LEARNTFROM " '%s': learnt (A=%s,NS=%s)" -#else -# define LEARNTFROM " '%s'" -#endif - buf = malloc(strlen(a = (*a ? a : "\".\"")) + - strlen(ns = (*ns ? ns : "\".\"")) + - strlen(na = (*na ? na : "\".\"")) + - sizeof(LEARNTFROM)); - if (!buf) - return (""); - sprintf(buf, LEARNTFROM, na, a, ns); - return (buf); -} -#endif /*LAME_LOGGING*/ - -void -ns_resp(msg, msglen) - u_char *msg; - int msglen; -{ - register struct qinfo *qp; - register HEADER *hp; - register struct qserv *qs; - register struct databuf *ns, *ns2; - register u_char *cp; - u_char *eom = msg + msglen; - struct flush_set *flushset = NULL; - struct sockaddr_in *nsa; - struct databuf *nsp[NSMAX]; - int i, c, n, qdcount, ancount, aucount, nscount, arcount, arfirst; - int qtype, qclass, dbflags; - int restart; /* flag for processing cname response */ - int validanswer; - int cname, lastwascname, externalcname; - int count, founddata, foundname; - int buflen; - int newmsglen; - char name[MAXDNAME], qname[MAXDNAME], aname[MAXDNAME]; - char msgbuf[MAXDNAME]; - char *dname, tmpdomain[MAXDNAME]; - const char *fname; - const char *formerrmsg = "brain damage"; - u_char newmsg[PACKETSZ]; - u_char **dpp, *tp; - time_t rtrip; - struct hashbuf *htp; - struct namebuf *np; - struct netinfo *lp; - struct fwdinfo *fwd; - char *tname = NULL; - - nameserIncr(from_addr.sin_addr, nssRcvdR); - nsp[0] = NULL; - hp = (HEADER *) msg; - if ((qp = qfindid(hp->id)) == NULL ) { - dprintf(1, (ddt, "DUP? dropped (id %d)\n", ntohs(hp->id))); - nameserIncr(from_addr.sin_addr, nssRcvdDupR); - return; - } - - dprintf(2, (ddt, "Response (%s %s %s) nsid=%d id=%d\n", - (qp->q_flags & Q_SYSTEM) ?"SYSTEM" :"USER", - (qp->q_flags & Q_PRIMING) ?"PRIMING" :"NORMAL", - (qp->q_flags & Q_ZSERIAL) ?"ZSERIAL" :"-", - ntohs(qp->q_nsid), ntohs(qp->q_id))); - - /* - * Here we handle high level formatting problems by parsing the header. - */ - qdcount = ntohs(hp->qdcount); - ancount = ntohs(hp->ancount); - aucount = ntohs(hp->nscount); /* !!! */ - arcount = ntohs(hp->arcount); - free_addinfo(); /* sets addcount to zero */ - cp = msg + HFIXEDSZ; - dpp = dnptrs; - *dpp++ = msg; - if ((*cp & INDIR_MASK) == 0) - *dpp++ = cp; - *dpp = NULL; - if (qdcount == 1) { - n = dn_expand(msg, eom, cp, qname, sizeof(qname)); - if (n <= 0) { - formerrmsg = expandFailedQuery; - goto formerr; - } - cp += n; - if (cp + 2 * INT16SZ > eom) { - formerrmsg = outofDataQuery; - goto formerr; - } - GETSHORT(qtype, cp); - GETSHORT(qclass, cp); - if (!ns_nameok(qname, qclass, response_trans, - ns_ownercontext(qtype, response_trans), - qname, from_addr.sin_addr)) { - formerrmsg = badNameFound; - goto formerr; - } - if (cp > eom) { - formerrmsg = outofDataQuery; - goto formerr; - } - if (qp->q_msg && qp->q_msglen && - !res_nameinquery(qname, qtype, qclass, - qp->q_msg, qp->q_msg + qp->q_msglen)) { - sprintf(msgbuf, - "query section mismatch (%s %s %s)", - qname, p_class(qclass), p_type(qtype)); - formerrmsg = msgbuf; - goto formerr; - } - if (strcasecmp(qp->q_name, qname) != 0 || - qp->q_class != qclass || - qp->q_type != qtype) { - formerrmsg = wrongQuestion; - goto formerr; - } - } else { - strcpy(qname, qp->q_name); - qclass = qp->q_class; - qtype = qp->q_type; - } - - /* cp now points after the query section. */ - - /* - * Here we handle bad responses from servers. - * Several possibilities come to mind: - * The server is sick and returns SERVFAIL - * The server returns some garbage opcode (it's sick) - * The server can't understand our query and return FORMERR - * In all these cases, we drop the packet, disable retries on - * this server and immediately force a retry. - */ - if ((hp->rcode != NOERROR && hp->rcode != NXDOMAIN) - || (hp->opcode != QUERY -#ifdef BIND_NOTIFY - && hp->opcode != NS_NOTIFY_OP -#endif - )) { - dprintf(2, (ddt, "resp: error (ret %d, op %d), dropped\n", - hp->rcode, hp->opcode)); - switch (hp->rcode) { - case SERVFAIL: - nameserIncr(from_addr.sin_addr, nssRcvdFail); - break; - case FORMERR: - nameserIncr(from_addr.sin_addr, nssRcvdFErr); - break; - default: - nameserIncr(from_addr.sin_addr, nssRcvdErr); - break; - } - /* mark server as bad */ - if (!qp->q_fwd) - for (i = 0; i < (int)qp->q_naddr; i++) - if (qp->q_addr[i].ns_addr.sin_addr.s_addr - == from_addr.sin_addr.s_addr) - qp->q_addr[i].nretry = MAXRETRY; - /* - * XXX: doesn't handle responses sent from the wrong - * interface on a multihomed server. - */ - if (qp->q_fwd || - qp->q_addr[qp->q_curaddr].ns_addr.sin_addr.s_addr - == from_addr.sin_addr.s_addr) - retry(qp); - return; - } - - if (qdcount != 1) { - /* We don't generate or forward these (yet). */ - formerrmsg = notSingleQuery; - goto formerr; - } - - /* - * Determine if the response came from a forwarder. Packets from - * anyplace not listed as a forwarder or as a server to whom we - * might have forwarded the query will be dropped. - */ - for (fwd = fwdtab; fwd != (struct fwdinfo *)NULL; fwd = fwd->next) { - if (fwd->fwdaddr.sin_addr.s_addr == - from_addr.sin_addr.s_addr) { - /* XXX - should put this in STATS somewhere. */ - break; - } - } - /* - * XXX: note bad ambiguity here. if one of our forwarders is also - * a delegated server for some domain, then we will not update - * the RTT information on any replies we get from those servers. - * Workaround: disable recursion on authoritative servers so that - * the ambiguity does not arise. - */ - /* - * If we weren't using a forwarder, find the qinfo pointer and update - * the rtt and fact that we have called on this server before. - */ - if (fwd == (struct fwdinfo *)NULL) { - struct timeval *stp; - - for (n = 0, qs = qp->q_addr; (u_int)n < qp->q_naddr; n++, qs++) - if (qs->ns_addr.sin_addr.s_addr == - from_addr.sin_addr.s_addr) - break; - if ((u_int)n >= qp->q_naddr) { - if (!haveComplained((char*)from_addr.sin_addr.s_addr, - "unexpected source")) { - syslog(LOG_INFO, - "Response from unexpected source (%s)", - sin_ntoa(&from_addr)); - } - /* - * We don't know who this response came from so it - * gets dropped on the floor. - */ - return; - } - stp = &qs->stime; - - /* Handle response from different (untried) interface */ - if ((qs->ns != NULL) && (stp->tv_sec == 0)) { - ns = qs->ns; - while (qs > qp->q_addr - && (qs->stime.tv_sec == 0 || qs->ns != ns)) - qs--; - *stp = qs->stime; - /* XXX - sometimes stp still ends up pointing to - * a zero timeval, in spite of the above attempt. - * Why? What should we do about it? - */ - dprintf(1, (ddt, - "Response from unused address %s, assuming %s\n", - sin_ntoa(&from_addr), - sin_ntoa(&qs->ns_addr))); - /* XXX - catch aliases here */ - } - - /* compute query round trip time */ - /* XXX - avoid integer overflow, which is quite likely if stp - * points to a zero timeval (see above). - * rtrip is of type time_t, which we assume is at least - * as big as an int. - */ - if ((tt.tv_sec - stp->tv_sec) > (INT_MAX-999)/1000) { - rtrip = INT_MAX; - } else { - rtrip = ((tt.tv_sec - stp->tv_sec) * 1000 + - (tt.tv_usec - stp->tv_usec) / 1000); - } - - dprintf(3, (ddt, "stime %lu/%lu now %lu/%lu rtt %ld\n", - (u_long)stp->tv_sec, (u_long)stp->tv_usec, - (u_long)tt.tv_sec, (u_long)tt.tv_usec, - (long)rtrip)); - - /* prevent floating point overflow, limit to 1000 sec */ - if (rtrip > 1000000) { - rtrip = 1000000; - } - ns = qs->nsdata; - /* - * Don't update nstime if this doesn't look - * like an address databuf now. XXX - */ - if (ns && - ns->d_type == T_A && - ns->d_class == qs->ns->d_class) { - u_long t; - - if (ns->d_nstime == 0) - t = rtrip; - else - t = ns->d_nstime * ALPHA - + - (1 - ALPHA) * rtrip; - if (t > 65535) - t = 65535; - ns->d_nstime = (u_int16_t)t; - } - - /* - * Record the source so that we do not use this NS again. - */ - if (ns && qs->ns && (qp->q_nusedns < NSMAX)) { - qp->q_usedns[qp->q_nusedns++] = qs->ns; - dprintf(2, (ddt, "NS #%d addr %s used, rtt %d\n", - n, sin_ntoa(&qs->ns_addr), - ns->d_nstime)); - } - - /* - * Penalize those who had earlier chances but failed - * by multiplying round-trip times by BETA (>1). - * Improve nstime for unused addresses by applying GAMMA. - * The GAMMA factor makes unused entries slowly - * improve, so they eventually get tried again. - * GAMMA should be slightly less than 1. - * Watch out for records that may have timed out - * and are no longer the correct type. XXX - */ - - for (n = 0, qs = qp->q_addr; - (u_int)n < qp->q_naddr; - n++, qs++) { - u_long t; - - ns2 = qs->nsdata; - if ((!ns2) || (ns2 == ns)) - continue; - if (ns2->d_type != T_A || - ns2->d_class != qs->ns->d_class) /* XXX */ - continue; - if (qs->stime.tv_sec) { - if (ns2->d_nstime == 0) - t = (rtrip * BETA); - else - t = ns2->d_nstime * BETA - + - (1 - ALPHA) * rtrip; - } else - t = ns2->d_nstime * GAMMA; - if (t > 65535) - t = 65535; - ns2->d_nstime = (u_int16_t)t; - dprintf(2, (ddt, "NS #%d %s rtt now %d\n", n, - sin_ntoa(&qs->ns_addr), - ns2->d_nstime)); - } - } - -#ifdef BIND_NOTIFY - /* for now, NOTIFY isn't defined for ANCOUNT!=0, AUCOUNT!=0, - * or ADCOUNT!=0. therefore the only real work to be done for - * a NOTIFY-QR is to remove it from the query queue. - */ - if (hp->opcode == NS_NOTIFY_OP) { - qremove(qp); - return; - } -#endif - -#ifdef LAME_DELEGATION - /* - * Non-authoritative, no answer, no error, with referral. - */ - if (hp->rcode == NOERROR && !hp->aa && ancount == 0 && aucount > 0 -#ifdef BIND_NOTIFY - && hp->opcode != NS_NOTIFY_OP -#endif - ) { - u_char *tp; - int type, class; -#ifdef DEBUG - if (debug > 0) - fp_nquery(msg, msglen, ddt); -#endif - /* - * Since there is no answer section (ancount == 0), - * we must be pointing at the authority section (aucount > 0). - */ - tp = cp; - n = dn_expand(msg, eom, tp, name, sizeof name); - if (n < 0) { - formerrmsg = expandFailedAuth; - goto formerr; - } - tp += n; - if (tp + 2 * INT16SZ > eom) { - formerrmsg = outofDataAuth; - goto formerr; - } - GETSHORT(type, tp); - GETSHORT(class, tp); - if (!ns_nameok(name, class, response_trans, - ns_ownercontext(type, response_trans), - name, from_addr.sin_addr)) { - formerrmsg = badNameFound; - goto formerr; - } - - /* - * If the answer delegates us either to the same level in - * the hierarchy or closer to the root, we consider this - * server lame. Note that for now we only log the message - * if the T_NS was C_IN, which is technically wrong (NS is - * visible in all classes) but necessary anyway (non-IN - * classes tend to not have good strong delegation graphs). - */ - - if (type == T_NS && samedomain(qp->q_domain, name)) { - nameserIncr(from_addr.sin_addr, nssRcvdLDel); - /* mark server as bad */ - if (!qp->q_fwd) - for (i = 0; i < (int)qp->q_naddr; i++) - if (qp->q_addr[i].ns_addr.sin_addr.s_addr - == from_addr.sin_addr.s_addr) - qp->q_addr[i].nretry = MAXRETRY; -#ifdef LAME_LOGGING - if (class == C_IN && - !haveComplained((char*)nhash(sin_ntoa(&from_addr)), - (char*)nhash(qp->q_domain))) - syslog(LAME_LOGGING, - "Lame server on '%s' (in '%s'?): %s%s\n", - qname, qp->q_domain, - sin_ntoa(&from_addr), - learntFrom(qp, &from_addr)); - -#endif /* LAME_LOGGING */ - /* XXX - doesn't handle responses sent from the wrong - * interface on a multihomed server - */ - if (qp->q_fwd || - qp->q_addr[qp->q_curaddr].ns_addr.sin_addr.s_addr - == from_addr.sin_addr.s_addr) - retry(qp); - return; - } - } -#endif /* LAME_DELEGATION */ - - if (qp->q_flags & Q_ZSERIAL) { - if (hp->aa && ancount > 0 && hp->rcode == NOERROR && - qtype == T_SOA && ((qclass == C_IN) || (qclass == C_HS))) { - int n; - u_int16_t type, class, dlen; - u_int32_t serial; - u_char *tp = cp; - u_char *rdatap; - - n = dn_expand(msg, eom, tp, name, sizeof name); - if (n < 0) { - formerrmsg = expandFailedAnswer; - goto formerr; - } - tp += n; /* name */ - if (tp + 3 * INT16SZ + INT32SZ > eom) { - formerrmsg = outofDataAnswer; - goto formerr; - } - GETSHORT(type, tp); /* type */ - GETSHORT(class, tp); /* class */ - tp += INT32SZ; /* ttl */ - GETSHORT(dlen, tp); /* dlen */ - rdatap = tp; /* start of rdata */ - if (!ns_nameok(name, class, response_trans, - ns_ownercontext(type, response_trans), - name, from_addr.sin_addr)) { - formerrmsg = badNameFound; - goto formerr; - } - if (strcasecmp(qname, name) || - qtype != type || - qclass != class) { - sprintf(msgbuf, - "qserial answer mismatch (%s %s %s)", - name, p_class(class), p_type(type)); - formerrmsg = msgbuf; - goto formerr; - } - - if (0 >= (n = dn_skipname(tp, eom))) { - formerrmsg = skipnameFailedAnswer; - goto formerr; - } - tp += n; /* mname */ - if (0 >= (n = dn_skipname(tp, eom))) { - formerrmsg = skipnameFailedAnswer; - goto formerr; - } - tp += n; /* rname */ - if (tp + 5 * INT32SZ > eom) { - formerrmsg = dlenUnderrunAnswer; - goto formerr; - } - GETLONG(serial, tp); - tp += 4 * INT32SZ; /* Skip rest of SOA. */ - if ((u_int)(tp - rdatap) != dlen) { - formerrmsg = dlenOverrunAnswer; - goto formerr; - } - - qserial_answer(qp, serial); - qremove(qp); - } else { - retry(qp); - } - return; - } - - /* - * Add the info received in the response to the data base. - */ - arfirst = ancount + aucount; - c = arfirst + arcount; - - /* -ve $ing non-existence of record, must handle non-authoritative - * NOERRORs with c == 0. - */ - if (!hp->aa && hp->rcode == NOERROR && c == 0) - goto return_msg; - -#ifdef notdef - /* - * If the request was for a CNAME that doesn't exist, - * but the name is valid, fetch any other data for the name. - * DON'T do this now, as it will requery if data are already - * in the cache (maybe later with negative caching). - */ - if (type == T_CNAME && c == 0 && hp->rcode == NOERROR - && !(qp->q_flags & Q_SYSTEM)) { - dprintf(4, (ddt, "resp: leaving, no CNAME\n")); - - /* Cause us to put it in the cache later */ - prime(class, T_ANY, qp); - - /* Nothing to store, just give user the answer */ - goto return_msg; - } -#endif /* notdef */ - - if (qp->q_flags & Q_SYSTEM) - dbflags = DB_NOTAUTH | DB_NODATA; - else - dbflags = DB_NOTAUTH | DB_NODATA | DB_NOHINTS; - count = c; - if (qp->q_flags & Q_PRIMING) - dbflags |= DB_PRIMING; - if (hp->tc) { - count -= arcount; /* truncation had to affect this */ - if (!arcount) { - count -= aucount; /* guess it got this too */ - } - if (!(arcount || aucount)) { - count -= ancount; /* things are pretty grim */ - } - /* XXX - should retry this query with TCP */ - /* - * XXX - if this response is forwarded to the client - * the truncated section is included. We will not - * validate it, and if it somehow corrupt, we won't - * notice. - * - * XXX - if the answer section is truncated and we got - * this response after being redirected by a CNAME, we - * will not include any part of the final answer in our - * response to the client. This will make the client - * think that there are no RRs of the appropriate type. - */ - } - - tp = cp; - - restart = 0; - validanswer = 0; - nscount = 0; - cname = 0; - lastwascname = 0; - externalcname = 0; - strcpy(aname, qname); - - if (count) { - /* allocate 1 extra record for end of set detection */ - flushset = (struct flush_set *) - calloc(count+1, sizeof(struct flush_set)); - if (!flushset) - panic(-1, "flushset: out of memory"); - } else - flushset = NULL; - - for (i = 0; i < count; i++) { - struct databuf *dp; - int type; - - maybe_free(&tname); - if (cp >= eom) { - free_related_additional(); - if (flushset != NULL) - free_flushset(flushset); - formerrmsg = outofDataFinal; - goto formerr; - } - n = rrextract(msg, msglen, cp, &dp, name, sizeof name, &tname); - if (n < 0) { - free_related_additional(); - maybe_free(&tname); - if (flushset != NULL) - free_flushset(flushset); - formerrmsg = outofDataFinal; - goto formerr; - } - cp += n; - if (!dp) - continue; - type = dp->d_type; - if (i < ancount) { - /* Answer section. */ - if (externalcname || strcasecmp(name, aname) != 0) { - if (!externalcname) - syslog(LOG_DEBUG, - "wrong ans. name (%s != %s)", - name, aname); - else - dprintf(3, (ddt, - "ignoring answer '%s' after external cname\n", - name)); - db_free(dp); - continue; - } - if (type == T_CNAME && - qtype != T_CNAME && qtype != T_ANY) { - strcpy(aname, (char *)dp->d_data); - if (!samedomain(aname, qp->q_domain)) - externalcname = 1; - cname = 1; - lastwascname = 1; - } else { - validanswer = 1; - lastwascname = 0; - } - - if (tname != NULL) { - add_related_additional(tname); - tname = NULL; - } - - dp->d_cred = (hp->aa && !strcasecmp(name, qname)) - ? DB_C_AUTH - : DB_C_ANSWER; - } else { - /* After answer section. */ - if (lastwascname) { - dprintf(3, (ddt, - "last was cname, ignoring auth. and add.\n")); - db_free(dp); - break; - } - if (i < arfirst) { - /* Authority section. */ - switch (type) { - case T_NS: - case T_SOA: - if (!samedomain(aname, name)){ - syslog(LOG_DEBUG, - "bad referral (%s !< %s)", - aname[0] ? aname : ".", - name[0] ? name : "."); - db_free(dp); - continue; - } else if (!samedomain(name, - qp->q_domain)) { - if (!externalcname) - syslog(LOG_DEBUG, - "bad referral (%s !< %s)", - name[0] ? name : ".", - qp->q_domain[0] ? - qp->q_domain : "."); - db_free(dp); - continue; - } - if (type == T_NS) { - nscount++; - add_related_additional(tname); - tname = NULL; - } - break; - case T_NXT: - case T_SIG: - break; - default: - syslog(LOG_DEBUG, - "invalid RR type '%s' in authority section (name = '%s') from %s", - p_type(type), name, - sin_ntoa(&from_addr)); - db_free(dp); - continue; - } - } else { - /* Additional section. */ - switch (type) { - case T_A: - case T_AAAA: - if (externalcname || - !samedomain(name, qp->q_domain)) { - dprintf(3, (ddt, - "ignoring additional info '%s' type %s\n", - name, p_type(type))); - db_free(dp); - continue; - } - if (!related_additional(name)) { - syslog(LOG_DEBUG, - "unrelated additional info '%s' type %s from %s", - name, p_type(type), - sin_ntoa(&from_addr)); - db_free(dp); - continue; - } - break; - case T_KEY: - case T_SIG: - break; - default: - syslog(LOG_DEBUG, - "invalid RR type '%s' in additional section (name = '%s') from %s", - p_type(type), name, - sin_ntoa(&from_addr)); - db_free(dp); - continue; - } - } - dp->d_cred = (qp->q_flags & Q_PRIMING) - ? DB_C_ANSWER - : DB_C_ADDITIONAL; - } - rrsetadd(flushset, name, dp); - } - free_related_additional(); - maybe_free(&tname); - if (flushset) { - rrsetupdate(flushset, dbflags); - free_flushset(flushset); - } - if (lastwascname && !externalcname) - syslog(LOG_DEBUG, "%s (%s)", danglingCname, aname); - - if (cp > eom) { - formerrmsg = outofDataAFinal; - goto formerr; - } - - if ((qp->q_flags & Q_SYSTEM) && ancount) { - if ((qp->q_flags & Q_PRIMING) && !check_root()) { - /* mark server as bad */ - if (!qp->q_fwd) - for (i = 0; i < (int)qp->q_naddr; i++) - if (qp->q_addr[i].ns_addr.sin_addr.s_addr - == from_addr.sin_addr.s_addr) - qp->q_addr[i].nretry = MAXRETRY; - /* XXX - doesn't handle responses sent from - * the wronginterface on a multihomed server - */ - if (qp->q_fwd || - qp->q_addr[qp->q_curaddr].ns_addr.sin_addr.s_addr - == from_addr.sin_addr.s_addr) - retry(qp); - return; - } - dprintf(3, (ddt, "resp: leaving, SYSQUERY ancount %d\n", - ancount)); -#ifdef BIND_NOTIFY - if (qp->q_notifyzone != DB_Z_CACHE) { - struct zoneinfo *zp = &zones[qp->q_notifyzone]; - - /* - * Clear this first since sysnotify() might set it. - */ - qp->q_notifyzone = DB_Z_CACHE; - sysnotify(zp->z_origin, zp->z_class, T_SOA); - } -#endif - qremove(qp); - return; - } - - if (ancount && count && !validanswer) - /* - * Everything passed validation but we didn't get the - * final answer. The response must have contained - * a dangling CNAME. Force a restart of the query. - * - * Don't set restart if count==0, since this means - * the response was truncated in the answer section, - * causing us to set count to 0 which will cause - * validanswer to be 0 as well even though the answer - * section probably contained valid RRs (just not - * a complete set). - * XXX - this works right if we can just forward this - * response to the client, but not if we found a CNAME - * in a prior response and restarted the query. - */ - restart = 1; - - /* - * If there are addresses and this is a local query, - * sort them appropriately for the local context. - */ -#ifdef SORT_RESPONSE - if (!restart && ancount > 1 && (lp = local(&qp->q_from)) != NULL) - sort_response(tp, ancount, lp, eom); -#endif - - /* - * An answer to a T_ANY query or a successful answer to a - * regular query with no indirection, then just return answer. - */ - if (!restart && ancount && (qtype == T_ANY || !qp->q_cmsglen)) { - dprintf(3, (ddt, "resp: got as much answer as there is\n")); - goto return_msg; - } - - /* - * We might want to cache this negative answer. - */ - if (!ancount && - (!nscount || hp->rcode == NXDOMAIN) && - (hp->aa || fwd || qclass == C_ANY)) { - /* we have an authoritative NO */ - dprintf(3, (ddt, "resp: leaving auth NO\n")); -#ifdef NCACHE - /* answer was NO */ - if (hp->aa && - ((hp->rcode == NXDOMAIN) || (hp->rcode == NOERROR))) { - cache_n_resp(msg, msglen); - } -#endif /*NCACHE*/ - if (qp->q_cmsglen) { - /* XXX - what about additional CNAMEs in the chain? */ - msg = qp->q_cmsg; - msglen = qp->q_cmsglen; - hp = (HEADER *)msg; - } - goto return_msg; - } - - /* - * All messages in here need further processing. i.e. they - * are either CNAMEs or we got referred again. - */ - count = 0; - founddata = 0; - foundname = 0; - dname = name; - /* - * Even with VALIDATE, if restart==0 and ancount > 0, we should - * have some valid data because because the data in the answer - * section is owned by the query name and that passes the - * validation test by definition - * - * XXX - the restart stuff doesn't work if any of the answer RRs - * is not cacheable (TTL==0 or unknown RR type), since all of the - * answer must pass through the cache and be re-assembled. - */ - if ((!restart || !cname) && qp->q_cmsglen && ancount) { - dprintf(1, (ddt, "Cname second pass\n")); - newmsglen = MIN(PACKETSZ, qp->q_cmsglen); - bcopy(qp->q_cmsg, newmsg, newmsglen); - } else { - newmsglen = MIN(PACKETSZ, msglen); - bcopy(msg, newmsg, newmsglen); - } - hp = (HEADER *) newmsg; - hp->ancount = htons(0); - hp->nscount = htons(0); - hp->arcount = htons(0); - hp->rcode = NOERROR; - dnptrs[0] = newmsg; - dnptrs[1] = NULL; - cp = newmsg + HFIXEDSZ; - /* - * Keep in mind that none of this code works when QDCOUNT>1. - * cp ends up pointed just past the query section in both cases. - */ - /* - * Arrange for dname to contain the query name. The query - * name can be either the original query name if restart==0 - * or the target of the last CNAME if we are following a - * CNAME chain and were referred. - */ - n = dn_expand(newmsg, newmsg + newmsglen, cp, dname, - sizeof name); - if (n < 0) { - dprintf(1, (ddt, "dn_expand failed\n")); - goto servfail; - } - if (!res_dnok(dname)) { - dprintf(1, (ddt, "bad name (%s)\n", dname)); - goto servfail; - } - cp += n + QFIXEDSZ; - buflen = sizeof(newmsg) - (cp - newmsg); - - cname = 0; - try_again: - dprintf(1, (ddt, "resp: nlookup(%s) qtype=%d\n", dname, qtype)); - fname = ""; - htp = hashtab; /* lookup relative to root */ - np = nlookup(dname, &htp, &fname, 0); - dprintf(1, (ddt, "resp: %s '%s' as '%s' (cname=%d)\n", - np == NULL ? "missed" : "found", dname, fname, cname)); - if (np == NULL || fname != dname) - goto fetch_ns; - - foundname++; - count = cp - newmsg; - n = finddata(np, qclass, qtype, hp, &dname, &buflen, &count); - if (n == 0) - goto fetch_ns; /* NO data available */ -#ifdef NCACHE - if (hp->rcode) { - if (hp->rcode == NOERROR_NODATA) - hp->rcode = NOERROR; -#ifdef RETURNSOA - if (count) { - cp += n; - buflen -= n; - hp->nscount = htons((u_int16_t)count); - } -#endif - goto return_newmsg; - } -#endif - cp += n; - buflen -= n; - hp->ancount = htons(ntohs(hp->ancount) + (u_int16_t)count); - if (fname != dname && qtype != T_CNAME && qtype != T_ANY) { - cname++; - goto try_again; - } - founddata = 1; - - dprintf(3, (ddt, - "resp: foundname=%d, count=%d, founddata=%d, cname=%d\n", - foundname, count, founddata, cname)); - - fetch_ns: - - if (hp->tc) - goto return_newmsg; - - /* - * Look for name servers to refer to and fill in the authority - * section or record the address for forwarding the query - * (recursion desired). - */ - free_nsp(nsp); - switch (findns(&np, qclass, nsp, &count, 0)) { - case NXDOMAIN: /* shouldn't happen */ - dprintf(3, (ddt, "req: leaving (%s, rcode %d)\n", - dname, hp->rcode)); - if (!foundname) - hp->rcode = NXDOMAIN; - if (qclass != C_ANY) { - hp->aa = 1; - if (np && (!foundname || !founddata)) { - n = doaddauth(hp, cp, buflen, np, nsp[0]); - cp += n; - buflen -= n; - } - } - goto return_newmsg; - - case SERVFAIL: - goto servfail; - } - - if (founddata) { - hp = (HEADER *)newmsg; - n = add_data(np, nsp, cp, buflen, &count); - if (n < 0) { - hp->tc = 1; - n = (-n); - } - cp += n; - buflen -= n; - hp->nscount = htons((u_int16_t)count); - goto return_newmsg; - } - - /* - * If we get here, we don't have the answer yet and are about - * to iterate to try and get it. First, infinite loop avoidance. - */ - if (qp->q_nqueries++ > MAXQUERIES) { - dprintf(1, (ddt, "resp: MAXQUERIES exceeded (%s %s %s)\n", - dname, p_class(qclass), p_type(qtype))); - syslog(LOG_INFO, - "MAXQUERIES exceeded, possible data loop in resolving (%s)", - dname); - goto servfail; - } - - /* Reset the query control structure */ - - nsfree(qp, "ns_resp"); - qp->q_naddr = 0; - qp->q_curaddr = 0; - qp->q_fwd = fwdtab; - - getname(np, tmpdomain, sizeof tmpdomain); - if (qp->q_domain != NULL) - free(qp->q_domain); - qp->q_domain = strdup(tmpdomain); - if (qp->q_domain == NULL) - panic(ENOMEM, "ns_resp: strdup failed"); - - if ((n = nslookup(nsp, qp, dname, "ns_resp")) <= 0) { - if (n < 0) { - dprintf(3, (ddt, "resp: nslookup reports danger\n")); - if (cname) /* a remote CNAME that does not have data */ - goto return_newmsg; - goto servfail; - } else { - dprintf(3, (ddt, "resp: no addrs found for NS's\n")); - /* - * Timeout while sysquery looks up the NS addresses. - * - * Hopefully we'll have them when the client asks - * again. - * - * too bad we can't just wait for the sysquery - * response to restart this query (it's too hard). - * - * We could try to crawl back up the tree looking - * for reachable servers, but we may have just - * gotten delegated down here by a response with - * no A RRs for the servers. If we blindly tried - * this strategy, we bang on the same server forever. - */ - goto timeout; - } - } - for (n = 0; (u_int)n < qp->q_naddr; n++) - qp->q_addr[n].stime.tv_sec = 0; - if (!qp->q_fwd) - qp->q_addr[0].stime = tt; - if (cname) { - if (qp->q_cname++ == MAXCNAMES) { - dprintf(3, (ddt, - "resp: leaving, MAXCNAMES exceeded\n")); - goto servfail; - } - dprintf(1, (ddt, "q_cname = %d\n", qp->q_cname)); - dprintf(3, (ddt, - "resp: building recursive query; nslookup\n")); - if (!qp->q_cmsg) { - qp->q_cmsg = qp->q_msg; - qp->q_cmsglen = qp->q_msglen; - } else if (qp->q_msg) - (void) free(qp->q_msg); - if ((qp->q_msg = (u_char *)malloc(PACKETSZ)) == NULL) { - syslog(LOG_NOTICE, "resp: malloc error\n"); - goto servfail; - } - n = res_mkquery(QUERY, dname, qclass, qtype, - NULL, 0, NULL, qp->q_msg, PACKETSZ); - if (n < 0) { - syslog(LOG_INFO, "resp: res_mkquery(%s) failed", - dname); - goto servfail; - } - if (qp->q_name != NULL) - free(qp->q_name); - qp->q_name = savestr(dname); - qp->q_msglen = n; - hp = (HEADER *) qp->q_msg; - hp->rd = 0; - } else - hp = (HEADER *) qp->q_msg; - hp->id = qp->q_nsid = htons(nsid_next()); - if (qp->q_fwd) - hp->rd = 1; - unsched(qp); - schedretry(qp, retrytime(qp)); - nsa = Q_NEXTADDR(qp, 0); - dprintf(1, (ddt, "resp: forw -> %s ds=%d nsid=%d id=%d %dms\n", - sin_ntoa(nsa), ds, - ntohs(qp->q_nsid), ntohs(qp->q_id), - (qp->q_addr[0].nsdata != NULL) - ? qp->q_addr[0].nsdata->d_nstime - : (-1))); -#ifdef DEBUG - if (debug >= 10) - fp_nquery(qp->q_msg, qp->q_msglen, ddt); -#endif - if (sendto(ds, (char*)qp->q_msg, qp->q_msglen, 0, - (struct sockaddr *)nsa, - sizeof(struct sockaddr_in)) < 0) { - if (!haveComplained((char*)nsa->sin_addr.s_addr, sendtoStr)) - syslog(LOG_INFO, "ns_resp: sendto(%s): %m", - sin_ntoa(nsa)); - nameserIncr(nsa->sin_addr, nssSendtoErr); - } - hp->rd = 0; /* leave set to 0 for dup detection */ -#ifdef XSTATS - nameserIncr(nsa->sin_addr, nssSentFwdR); -#endif - nameserIncr(qp->q_from.sin_addr, nssRcvdFwdR); - dprintf(3, (ddt, "resp: Query sent.\n")); - free_nsp(nsp); - return; - - formerr: - if (!haveComplained((char*)from_addr.sin_addr.s_addr, - (char*)nhash(formerrmsg))) - syslog(LOG_INFO, "Malformed response from %s (%s)\n", - sin_ntoa(&from_addr), formerrmsg); -#ifdef XSTATS - nameserIncr(from_addr.sin_addr, nssSentFErr); -#endif - free_nsp(nsp); - return; - - return_msg: - nameserIncr(from_addr.sin_addr, nssRcvdFwdR); -#ifdef XSTATS - nameserIncr(qp->q_from.sin_addr, nssSentFwdR); -#endif - /* The "standard" return code */ - hp->qr = 1; - hp->id = qp->q_id; - hp->rd = 1; - hp->ra = (NoRecurse == 0); - (void) send_msg(msg, msglen, qp); - qremove(qp); - free_nsp(nsp); - return; - - return_newmsg: - nameserIncr(qp->q_from.sin_addr, nssSentAns); - -#ifdef XSTATS - if (!hp->aa) - nameserIncr(qp->q_from.sin_addr, nssSentNaAns); - if (hp->rcode == NXDOMAIN) - nameserIncr(qp->q_from.sin_addr, nssSentNXD); -#endif - n = doaddinfo(hp, cp, buflen); - cp += n; - buflen -= n; - hp->qr = 1; - hp->id = qp->q_id; - hp->rd = 1; - hp->ra = (NoRecurse == 0); - (void) send_msg(newmsg, cp - newmsg, qp); - qremove(qp); - free_nsp(nsp); - return; - - servfail: -#ifdef XSTATS - nameserIncr(qp->q_from.sin_addr, nssSentFail); -#endif - hp = (HEADER *)(qp->q_cmsglen ? qp->q_cmsg : qp->q_msg); - hp->rcode = SERVFAIL; - hp->qr = 1; - hp->id = qp->q_id; - hp->rd = 1; - hp->ra = (NoRecurse == 0); - (void) send_msg((u_char *)hp, (qp->q_cmsglen ? qp->q_cmsglen : qp->q_msglen), - qp); - timeout: - if (qp->q_stream != QSTREAM_NULL) - sqrm(qp->q_stream); - qremove(qp); - free_nsp(nsp); - return; -} - -#define BOUNDS_CHECK(ptr, count) \ - do { \ - if ((ptr) + (count) > eom) { \ - hp->rcode = FORMERR; \ - return (-1); \ - } \ - } while (0) - -static int -rrextract(msg, msglen, rrp, dpp, dname, namelen, tnamep) - u_char *msg; - int msglen; - u_char *rrp; - struct databuf **dpp; - char *dname; - int namelen; - char **tnamep; -{ - register u_char *cp, *eom, *rdatap; - register int n; - int class, type, dlen, n1; - u_int32_t ttl; - u_char *cp1; - u_char data[MAXDNAME*2 + INT32SZ*5]; - register HEADER *hp = (HEADER *)msg; - enum context context; - - if (tnamep != NULL) - *tnamep = NULL; - - *dpp = NULL; - cp = rrp; - eom = msg + msglen; - if ((n = dn_expand(msg, eom, cp, dname, namelen)) < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - BOUNDS_CHECK(cp, 2*INT16SZ + INT32SZ + INT16SZ); - GETSHORT(type, cp); - GETSHORT(class, cp); - GETLONG(ttl, cp); - GETSHORT(dlen, cp); - BOUNDS_CHECK(cp, dlen); - rdatap = cp; - if (!ns_nameok(dname, class, response_trans, - ns_ownercontext(type, response_trans), - dname, from_addr.sin_addr)) { - hp->rcode = FORMERR; - return (-1); - } - dprintf(3, (ddt, "rrextract: dname %s type %d class %d ttl %d\n", - dname, type, class, ttl)); - /* - * Convert the resource record data into the internal - * database format. - * - * On entry to the switch: - * CP points to the RDATA section of the wire-format RR. - * DLEN is its length. - * The memory area at DATA is available for processing. - * - * On exit from the switch: - * CP has been incremented past the RR. - * CP1 points to the RDATA section of the database-format RR. - * N contains the length of the RDATA section of the dbase-format RR. - * - * The new data at CP1 for length N will be copied into the database, - * so it need not be in any particular storage location. - */ - switch (type) { - case T_A: - if (dlen != INT32SZ) { - hp->rcode = FORMERR; - return (-1); - } - /*FALLTHROUGH*/ - case T_WKS: - case T_HINFO: - case T_UINFO: - case T_UID: - case T_GID: - case T_TXT: - case T_X25: - case T_ISDN: - case T_NSAP: - case T_AAAA: - case T_LOC: - case T_KEY: -#ifdef ALLOW_T_UNSPEC - case T_UNSPEC: -#endif - cp1 = cp; - n = dlen; - cp += n; - break; - - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - n = dn_expand(msg, eom, cp, (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - if (!ns_nameok((char *)data, class, response_trans, - type == T_PTR ?ns_ptrcontext(dname) :domain_ctx, - dname, from_addr.sin_addr)) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 = data; - n = strlen((char *)data) + 1; - if (tnamep != NULL && (type == T_NS || type == T_MB)) - *tnamep = strdup((char *)cp1); - break; - - case T_SOA: - context = hostname_ctx; - goto soa_rp_minfo; - case T_RP: - case T_MINFO: - context = mailname_ctx; - /* FALLTHROUGH */ - soa_rp_minfo: - n = dn_expand(msg, eom, cp, (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - if (!ns_nameok((char *)data, class, response_trans, context, - dname, from_addr.sin_addr)) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - /* - * The next use of 'cp' is dn_expand(), so we don't have - * to BOUNDS_CHECK() here. - */ - cp1 = data + (n = strlen((char *)data) + 1); - n1 = sizeof(data) - n; - if (type == T_SOA) - n1 -= 5 * INT32SZ; - n = dn_expand(msg, eom, cp, (char *)cp1, n1); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - if (type == T_RP) - context = domain_ctx; - else - context = mailname_ctx; - if (!ns_nameok((char *)cp1, class, response_trans, context, - dname, from_addr.sin_addr)) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 += strlen((char *)cp1) + 1; - if (type == T_SOA) { - n = 5 * INT32SZ; - BOUNDS_CHECK(cp, n); - bcopy(cp, cp1, n); - cp += n; - cp1 += n; - } - n = cp1 - data; - cp1 = data; - break; - - case T_NAPTR: - /* Grab weight and port. */ - BOUNDS_CHECK(cp, INT16SZ*2); - bcopy(cp, data, INT16SZ*2); - cp1 = data + INT16SZ*2; - cp += INT16SZ*2; - - /* Flags */ - BOUNDS_CHECK(cp, 1); - n = *cp++; - BOUNDS_CHECK(cp, n); - *cp1++ = n; - bcopy(cp, cp1, n); - cp += n; cp1 += n; - - /* Service */ - BOUNDS_CHECK(cp, 1); - n = *cp++; - BOUNDS_CHECK(cp, n); - *cp1++ = n; - bcopy(cp, cp1, n); - cp += n; cp1 += n; - - /* Regexp */ - BOUNDS_CHECK(cp, 1); - n = *cp++; - BOUNDS_CHECK(cp, n); - *cp1++ = n; - bcopy(cp, cp1, n); - cp += n; cp1 += n; - - /* Replacement */ - n = dn_expand(msg, eom, cp, (char *)cp1, - sizeof data - (cp1 - data)); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - if (!ns_nameok((char *)cp1, class, response_trans, - hostname_ctx, dname, from_addr.sin_addr)) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - - /* compute end of data */ - cp1 += strlen((char *)cp1) + 1; - /* compute size of data */ - n = cp1 - data; - cp1 = data; - break; - - case T_MX: - case T_AFSDB: - case T_RT: - case T_SRV: - /* grab preference */ - BOUNDS_CHECK(cp, INT16SZ); - bcopy(cp, data, INT16SZ); - cp1 = data + INT16SZ; - cp += INT16SZ; - - if (type == T_SRV) { - /* Grab weight and port. */ - BOUNDS_CHECK(cp, INT16SZ*2); - bcopy(cp, cp1, INT16SZ*2); - cp1 += INT16SZ*2; - cp += INT16SZ*2; - } - - /* get name */ - n = dn_expand(msg, eom, cp, (char *)cp1, - sizeof data - (cp1 - data)); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - if (!ns_nameok((char *)cp1, class, response_trans, - hostname_ctx, dname, from_addr.sin_addr)) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - - if (tnamep != NULL) - *tnamep = strdup((char *)cp1); - - /* compute end of data */ - cp1 += strlen((char *)cp1) + 1; - /* compute size of data */ - n = cp1 - data; - cp1 = data; - break; - - case T_PX: - /* grab preference */ - BOUNDS_CHECK(cp, INT16SZ); - bcopy(cp, data, INT16SZ); - cp1 = data + INT16SZ; - cp += INT16SZ; - - /* get MAP822 name */ - n = dn_expand(msg, eom, cp, (char *)cp1, - sizeof data - INT16SZ); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - if (!ns_nameok((char *)cp1, class, response_trans, - domain_ctx, dname, from_addr.sin_addr)) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - /* - * The next use of 'cp' is dn_expand(), so we don't have - * to BOUNDS_CHECK() here. - */ - cp1 += (n = strlen((char *)cp1) + 1); - n1 = sizeof(data) - n; - n = dn_expand(msg, eom, cp, (char *)cp1, n1); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - if (!ns_nameok((char *)cp1, class, response_trans, - domain_ctx, dname, from_addr.sin_addr)) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 += strlen((char *)cp1) + 1; - n = cp1 - data; - cp1 = data; - break; - - case T_SIG: { - u_long origTTL, exptime, signtime, timetilexp, now; - - /* Check signature time, expiration, and adjust TTL. */ - /* This code is similar to that in db_load.c. */ - - /* Skip coveredType, alg, labels */ - BOUNDS_CHECK(cp, INT16SZ + 1 + 1 + 3*INT32SZ); - cp1 = cp + INT16SZ + 1 + 1; - GETLONG(origTTL, cp1); - GETLONG(exptime, cp1); - GETLONG(signtime, cp1); - now = time(NULL); /* Get current time in GMT/UTC */ - - /* Don't let bogus name servers increase the signed TTL */ - if (ttl > origTTL) { - dprintf(3, (ddt, - "shrinking SIG TTL from %d to origTTL %d\n", - ttl, origTTL)); - ttl = origTTL; - } - - /* Don't let bogus signers "sign" in the future. */ - if (signtime > now) { - dprintf(3, (ddt, - "ignoring SIG: signature date %s is in the future\n", - p_secstodate (signtime))); - return ((cp - rrp) + dlen); - } - - /* Ignore received SIG RR's that are already expired. */ - if (exptime <= now) { - dprintf(3, (ddt, - "ignoring SIG: expiration %s is in the past\n", - p_secstodate (exptime))); - return ((cp - rrp) + dlen); - } - - /* Lop off the TTL at the expiration time. */ - timetilexp = exptime - now; - if (timetilexp < ttl) { - dprintf(3, (ddt, - "shrinking expiring %s SIG TTL from %d to %d\n", - p_secstodate (exptime), ttl, timetilexp)); - ttl = timetilexp; - } - - /* The following code is copied from named-xfer.c. */ - cp1 = (u_char *)data; - - /* first just copy over the type_covered, algorithm, */ - /* labels, orig ttl, two timestamps, and the footprint */ - BOUNDS_CHECK(cp, 18); - bcopy(cp, cp1, 18); - cp += 18; - cp1 += 18; - - /* then the signer's name */ - n = dn_expand(msg, eom, cp, (char *)cp1, (sizeof data) - 18); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 += strlen((char*)cp1)+1; - - /* finally, we copy over the variable-length signature. - Its size is the total data length, minus what we copied. */ - if (18 + (u_int)n > dlen) { - hp->rcode = FORMERR; - return (-1); - } - n = dlen - (18 + n); - if (n > ((int)(sizeof data) - (int)(cp1 - (u_char *)data))) { - hp->rcode = FORMERR; - return (-1); /* out of room! */ - } - bcopy(cp, cp1, n); - cp += n; - cp1 += n; - - /* compute size of data */ - n = cp1 - (u_char *)data; - cp1 = (u_char *)data; - break; - } - - default: - dprintf(3, (ddt, "unknown type %d\n", type)); - return ((cp - rrp) + dlen); - } - - if (cp > eom) { - hp->rcode = FORMERR; - return (-1); - } - if ((u_int)(cp - rdatap) != dlen) { - dprintf(3, (ddt, - "encoded rdata length is %u, but actual length was %u", - dlen, (u_int)(cp - rdatap))); - hp->rcode = FORMERR; - return (-1); - } - if (n > MAXDATA) { - dprintf(1, (ddt, - "update type %d: %d bytes is too much data\n", - type, n)); - hp->rcode = FORMERR; - return (-1); - } - - ttl += tt.tv_sec; - - *dpp = savedata(class, type, ttl, cp1, n); - return (cp - rrp); -} - -/* - * Decode the resource record 'rrp' and update the database. - * If savens is non-nil, record pointer for forwarding queries a second time. - */ -int -doupdate(msg, msglen, rrp, zone, savens, flags, cred) - u_char *msg; - int msglen; - u_char *rrp; - int zone; - struct databuf **savens; - int flags; - u_int cred; -{ - register u_char *cp; - register int n; - int class, type; - struct databuf *dp; - char dname[MAXDNAME]; - - dprintf(3, (ddt, "doupdate(zone %d, savens %#lx, flags %#lx)\n", - zone, (u_long)savens, (u_long)flags)); - - if ((n = rrextract(msg, msglen, rrp, &dp, dname, sizeof(dname), NULL)) - == -1) - return (-1); - if (!dp) - return (-1); - - type = dp->d_type; - class = dp->d_class; - cp = rrp + n; - -#if defined(TRACEROOT) || defined(BOGUSNS) - if ((type == T_NS) && (savens != NULL)) { - char *temp, qname[MAXDNAME]; - register int bogus = 0; - int bogusns = 0; -#ifdef BOGUSNS - if (addr_on_netlist(from_addr.sin_addr, boglist)) { - bogusns++; - bogus++; - } -#endif - if (!bogus && - ((temp = strrchr((char *)dp->d_data, '.')) != NULL) && - !strcasecmp(temp, ".arpa") - ) - bogus++; - qname[0] = qname[1] = '\0'; - if (dn_expand(msg, msg + msglen, msg + HFIXEDSZ, - qname, sizeof(qname)) < 0) - qname[0] = '?'; - else if (qname[0] == '\0') - qname[0] = '.'; - if (bogus && ((dname[0] == '\0') && (zone == 0))) { - if (!haveComplained((char*)from_addr.sin_addr.s_addr, - "bogus root NS")) - syslog(LOG_NOTICE, - "bogus root NS %s rcvd from %s on query for \"%s\"", - dp->d_data, sin_ntoa(&from_addr), qname); - db_free(dp); - return (cp - rrp); - } -#ifdef BOGUSNS - if (bogusns) { - if (!haveComplained((char*)from_addr.sin_addr.s_addr, - "bogus nonroot NS")) - syslog(LOG_INFO, - "bogus nonroot NS %s rcvd from %s on query for \"%s\"", - dp->d_data, sin_ntoa(&from_addr), qname); - db_free(dp); - return (cp - rrp); - } -#endif - } -#endif /*TRACEROOT || BOGUSNS*/ - - dp->d_zone = zone; - dp->d_cred = cred; - dp->d_clev = 0; /* We trust what is on disk more, except root srvrs */ - if ((n = db_update(dname, dp, dp, flags, hashtab)) != OK) { -#ifdef DEBUG - if (debug && (n != DATAEXISTS)) - fprintf(ddt, "update failed (%d)\n", n); - else if (debug >= 3) - fprintf(ddt, "update failed (DATAEXISTS)\n"); -#endif - db_free(dp); - } else if (type == T_NS && savens != NULL) - *savens = dp; - return (cp - rrp); -} - -int -send_msg(msg, msglen, qp) - u_char *msg; - int msglen; - struct qinfo *qp; -{ - if (qp->q_flags & Q_SYSTEM) - return (1); -#ifdef DEBUG - if (debug) { - fprintf(ddt,"send_msg -> %s (%s %d) id=%d\n", - sin_ntoa(&qp->q_from), - qp->q_stream == QSTREAM_NULL ? "UDP" : "TCP", - qp->q_stream == QSTREAM_NULL ? qp->q_dfd - : qp->q_stream->s_rfd, - ntohs(qp->q_id)); - } - if (debug > 4) { - struct qinfo *tqp; - - for (tqp = nsqhead; tqp!=QINFO_NULL; tqp = tqp->q_link) { - fprintf(ddt, - "qp %#lx q_id: %d q_nsid: %d q_msglen: %d ", - (u_long)tqp, tqp->q_id, - tqp->q_nsid, tqp->q_msglen); - fprintf(ddt, - "q_naddr: %d q_curaddr: %d\n", - tqp->q_naddr, tqp->q_curaddr); - fprintf(ddt, "q_next: %#lx q_link: %#lx\n", - (u_long)qp->q_next, (u_long)qp->q_link); - } - } - if (debug > 5) - fp_nquery(msg, msglen, ddt); -#endif /* DEBUG */ - if (qp->q_stream == QSTREAM_NULL) { - if (sendto(qp->q_dfd, (char*)msg, msglen, 0, - (struct sockaddr *)&qp->q_from, - sizeof(qp->q_from)) < 0) { - if (!haveComplained((char*)qp->q_from.sin_addr.s_addr, - sendtoStr)) -#if defined(SPURIOUS_ECONNREFUSED) - if (errno != ECONNREFUSED) -#endif - syslog(LOG_INFO, - "send_msg: sendto(%s): %m", - sin_ntoa(&qp->q_from)); - nameserIncr(qp->q_from.sin_addr, nssSendtoErr); - return (1); - } - } else { - (void) writemsg(qp->q_stream->s_rfd, (u_char*)msg, msglen); - sq_done(qp->q_stream); - } - return (0); -} - -#ifdef notdef -/* i don't quite understand this but the only ref to it is notdef'd --vix */ -prime(class, type, oqp) - int class, type; - register struct qinfo *oqp; -{ - char dname[BUFSIZ]; - - if (oqp->q_msg == NULL) - return; - if (dn_expand((u_char *)oqp->q_msg, - (u_char *)oqp->q_msg + oqp->q_msglen, - (u_char *)oqp->q_msg + HFIXEDSZ, (u_char *)dname, - sizeof(dname)) < 0) - return; - dprintf(2, (ddt, "prime: %s\n", dname)); - (void) sysquery(dname, class, type, NULL, 0, QUERY); -} -#endif - -void -prime_cache() -{ - register struct qinfo *qp; - - dprintf(1, (ddt, "prime_cache: priming = %d\n", priming)); - if (!priming && fcachetab->h_tab[0] != NULL && !forward_only) { - priming++; - if (!(qp = sysquery("", C_IN, T_NS, NULL, 0, QUERY))) - priming = 0; - else - qp->q_flags |= (Q_SYSTEM | Q_PRIMING); - } - needs_prime_cache = 0; - return; -} - -#ifdef BIND_NOTIFY -struct notify * -findNotifyPeer(zp, ina) - const struct zoneinfo *zp; - struct in_addr ina; -{ - register struct notify *ap; - - for (ap = zp->z_notifylist; ap; ap = ap->next) - if (ap->addr.s_addr == ina.s_addr) - break; - return (ap); -} - -/* sysnotify(dname, class, type) - * cause a NOTIFY request to be sysquery()'d to each secondary server - * of the zone that "dname" is within. - */ -void -sysnotify(dname, class, type) - const char *dname; - int class, type; -{ - char *soaname, *zname; - const char *fname; - register struct databuf *dp; - struct in_addr nss[NSMAX]; - int nns, na, zn, nsc; - struct hashbuf *htp; - struct zoneinfo *zp; - struct notify *ap; - struct namebuf *np; - - htp = hashtab; - np = nlookup(dname, &htp, &fname, 0); - if (!np) - panic(-1, "sysnotify: can't find name"); - zn = findMyZone(np, class); - if (zn == DB_Z_CACHE) - panic(-1, "sysnotify: not auth zone"); - zp = &zones[zn]; - if (zp->z_type != Z_PRIMARY && zp->z_type != Z_SECONDARY) - panic(-1, "sysnotify: not pri/sec"); - zname = zp->z_origin; -/* -**DBG** syslog(LOG_INFO, "sysnotify: found \"%s\" in \"%s\" (%s)", -**DBG** dname, zname, zoneTypeString(zp)); -*/ - nns = na = 0; - /* - * Send to recent AXFR peers. - */ - for (ap = zp->z_notifylist; ap; ap = ap->next) { - if (tt.tv_sec - ap->last >= zp->z_refresh) { - /* XXX - probably should do GC here. */ - continue; - } - nss[0] = ap->addr; - nsc = 1; - nns++; - na++; - sysquery(dname, class, T_SOA, nss, nsc, NS_NOTIFY_OP); - } - if (zp->z_type != Z_PRIMARY) - goto done; - /* - * Master. - */ - htp = hashtab; - np = nlookup(zname, &htp, &fname, 0); - if (!np) - panic(-1, "sysnotify: found name but not zone"); - soaname = NULL; - for (dp = np->n_data; dp; dp = dp->d_next) { - if (!dp->d_zone || !match(dp, class, T_SOA)) - continue; - if (soaname) { - syslog(LOG_NOTICE, "multiple SOA's for zone \"%s\"?", - zname); - return; - } - soaname = (char *) dp->d_data; - } - if (!soaname) { - syslog(LOG_NOTICE, "no SOA found for zone \"%s\"", zname); - return; - } - - for (dp = np->n_data; dp; dp = dp->d_next) { - register struct databuf *adp; - struct namebuf *anp; - - if (!dp->d_zone || !match(dp, class, T_NS)) - continue; - /* NS RDATA is server name. */ - if (strcasecmp((char*)dp->d_data, soaname) == 0) - continue; - htp = hashtab; - anp = nlookup((char*)dp->d_data, &htp, &fname, 0); - if (!anp) { - syslog(LOG_INFO, "sysnotify: can't nlookup(%s)?", - (char*)dp->d_data); - continue; - } - nsc = 0; - for (adp = anp->n_data; adp; adp = adp->d_next) { - struct in_addr ina; - if (!match(adp, class, T_A)) - continue; - ina = data_inaddr(adp->d_data); - /* Don't send to things we handled above. */ - ap = findNotifyPeer(zp, ina); - if (ap && tt.tv_sec - ap->last < zp->z_refresh) - goto nextns; - if (nsc < NSMAX) - nss[nsc++] = ina; - } /*next A*/ - if (nsc == 0) { - struct qinfo *qp; - - qp = sysquery((char*)dp->d_data, /*NS name*/ - class, /*XXX: C_IN?*/ - T_A, 0, 0, QUERY); - if (qp) - qp->q_notifyzone = zn; - continue; - } - (void) sysquery(dname, class, T_SOA, nss, nsc, NS_NOTIFY_OP); - nns++; - na += nsc; - nextns:; - } /*next NS*/ - done: - if (nns || na) { - char tmp[MAXDNAME]; - - /* Many syslog()'s only take 5 args. */ - sprintf(tmp, "%s %s %s", dname, p_class(class), p_type(type)); - syslog(LOG_INFO, "Sent NOTIFY for \"%s\" (%s); %d NS, %d A", - tmp, zname, nns, na); - } -} -#endif /*BIND_NOTIFY*/ - -struct qinfo * -sysquery(dname, class, type, nss, nsc, opcode) - const char *dname; - int class, type; - struct in_addr *nss; - int nsc, opcode; -{ - register struct qinfo *qp, *oqp; - register HEADER *hp; - char tmpdomain[MAXDNAME]; - struct namebuf *np; - struct databuf *nsp[NSMAX]; - struct hashbuf *htp; - struct sockaddr_in *nsa; - const char *fname; - int n, count; - - nsp[0] = NULL; - dprintf(3, (ddt, "sysquery(%s, %d, %d, %#lx, %d)\n", - dname, class, type, (u_long)nss, nsc)); - qp = qnew(dname, class, type); - - if (nss && nsc) { - np = NULL; - } else { - htp = hashtab; - if (priming && dname[0] == '\0') { - np = NULL; - } else if ((np = nlookup(dname, &htp, &fname, 1)) == NULL) { - syslog(LOG_INFO, "sysquery: nlookup error on %s?", - dname); - err1: - qfree(qp); - return (NULL); - } - - n = findns(&np, class, nsp, &count, 0); - switch (n) { - case NXDOMAIN: - case SERVFAIL: - syslog(LOG_DEBUG, "sysquery: findns error (%s) on %s?", - n == NXDOMAIN ? "NXDOMAIN" : "SERVFAIL", dname); - err2: - free_nsp(nsp); - goto err1; - } - } - - /* build new qinfo struct */ - qp->q_cmsg = qp->q_msg = NULL; - qp->q_dfd = ds; - if (nss && nsc) - qp->q_fwd = NULL; - else - qp->q_fwd = fwdtab; - qp->q_expire = tt.tv_sec + RETRY_TIMEOUT*2; - qp->q_flags |= Q_SYSTEM; - - getname(np, tmpdomain, sizeof tmpdomain); - if (qp->q_domain != NULL) - free(qp->q_domain); - qp->q_domain = strdup(tmpdomain); - if (qp->q_domain == NULL) - panic(ENOMEM, "ns_resp: strdup failed"); - - if ((qp->q_msg = (u_char *)malloc(PACKETSZ)) == NULL) { - syslog(LOG_NOTICE, "sysquery: malloc failed"); - goto err2; - } - n = res_mkquery(opcode, dname, class, - type, NULL, 0, NULL, - qp->q_msg, PACKETSZ); - if (n < 0) { - syslog(LOG_INFO, "sysquery: res_mkquery(%s) failed", dname); - goto err2; - } - qp->q_msglen = n; - hp = (HEADER *) qp->q_msg; - hp->id = qp->q_nsid = htons(nsid_next()); - hp->rd = (qp->q_fwd ? 1 : 0); - - /* First check for an already pending query for this data */ - for (oqp = nsqhead; oqp != QINFO_NULL; oqp = oqp->q_link) { - if ((oqp != qp) - && (oqp->q_msglen == qp->q_msglen) - && bcmp((char *)oqp->q_msg+2, - qp->q_msg+2, - qp->q_msglen-2) == 0 - ) { -#ifdef BIND_NOTIFY - /* XXX - need fancier test to suppress duplicate - * NOTIFYs to the same server (compare nss?) - */ - if (opcode != NS_NOTIFY_OP) -#endif /*BIND_NOTIFY*/ - { - dprintf(3, (ddt, "sysquery: duplicate\n")); - goto err2; - } - } - } - - if (nss && nsc) { - int i; - struct qserv *qs; - - for (i = 0, qs = qp->q_addr; - i < nsc; - i++, qs++) { - qs->ns_addr.sin_family = AF_INET; - qs->ns_addr.sin_addr = nss[i]; - qs->ns_addr.sin_port = ns_port; - qs->ns = NULL; - qs->nsdata = NULL; - qs->stime = tt; - qs->nretry = 0; - } - qp->q_naddr = nsc; - } else { - fetch_a: - count = nslookup(nsp, qp, dname, "sysquery"); - if (count <= 0) { - if (count < 0) { - syslog(LOG_INFO, - "sysquery: nslookup reports danger (%s)", - dname); - goto err2; - } else if (np && NAME(*np)[0] == '\0') { - syslog(LOG_WARNING, - "sysquery: no addrs found for root NS (%s)", - dname); - if (class == C_IN && !priming) - needs_prime_cache = 1; - goto err2; - } - if (np) { - free_nsp(nsp); - nsp[0] = NULL; - np = np_parent(np); - n = findns(&np, class, nsp, &count, 0); - switch (n) { - case NXDOMAIN: /*FALLTHROUGH*/ - case SERVFAIL: - syslog(LOG_DEBUG, - "sysquery: findns error (%d) on %s?", - n, dname); - goto err2; - } - goto fetch_a; - } - goto err2; - } - } - - schedretry(qp, retrytime(qp)); - if (qp->q_fwd == NULL) - qp->q_addr[0].stime = tt; /* XXX - why not every? */ - nsa = Q_NEXTADDR(qp, 0); - - dprintf(1, (ddt, - "sysquery: send -> %s dfd=%d nsid=%d id=%d retry=%ld\n", - sin_ntoa(nsa), qp->q_dfd, - ntohs(qp->q_nsid), ntohs(qp->q_id), - (long)qp->q_time)); -#ifdef DEBUG - if (debug >= 10) - fp_nquery(qp->q_msg, qp->q_msglen, ddt); -#endif - if (sendto(qp->q_dfd, (char*)qp->q_msg, qp->q_msglen, 0, - (struct sockaddr *)nsa, - sizeof(struct sockaddr_in)) < 0) { - if (!haveComplained((char*)nsa->sin_addr.s_addr, sendtoStr)) - syslog(LOG_INFO, "sysquery: sendto(%s): %m", - sin_ntoa(nsa)); - nameserIncr(nsa->sin_addr, nssSendtoErr); - } - nameserIncr(nsa->sin_addr, nssSentSysQ); - free_nsp(nsp); - return (qp); -} - -/* - * Check the list of root servers after receiving a response - * to a query for the root servers. - */ -static int -check_root() -{ - register struct databuf *dp, *pdp; - register struct namebuf *np; - int count = 0; - - priming = 0; - for (np = hashtab->h_tab[0]; np != NULL; np = np->n_next) - if (NAME(*np)[0] == '\0') - break; - if (np == NULL) { - syslog(LOG_NOTICE, "check_root: Can't find root!\n"); - return (0); - } - for (dp = np->n_data; dp != NULL; dp = dp->d_next) - if (dp->d_type == T_NS) - count++; - dprintf(1, (ddt, "%d root servers\n", count)); - if (count < MINROOTS) { - syslog(LOG_NOTICE, - "check_root: %d root servers after query to root server < min", - count); - return (0); - } - pdp = NULL; - dp = np->n_data; - while (dp != NULL) { - if (dp->d_type == T_NS && dp->d_zone == 0 && - dp->d_ttl < tt.tv_sec) { - dprintf(1, (ddt, "deleting old root server '%s'\n", - dp->d_data)); - dp = rm_datum(dp, np, pdp); - /* SHOULD DELETE FROM HINTS ALSO */ - continue; - } - pdp = dp; - dp = dp->d_next; - } - if (check_ns()) - return (1); - else { - priming = 1; - return (0); - } -} - -/* - * Check the root to make sure that for each NS record we have a A RR - */ -static int -check_ns() -{ - register struct databuf *dp, *tdp; - register struct namebuf *np, *tnp; - struct hashbuf *htp; - char *dname; - int found_arr; - const char *fname; - time_t curtime; - int servers = 0, rrsets = 0; - - dprintf(2, (ddt, "check_ns()\n")); - - curtime = (u_int32_t) tt.tv_sec; - for (np = hashtab->h_tab[0]; np != NULL; np = np->n_next) { - if (NAME(*np)[0] != '\0') - continue; - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - int cnames = 0; - -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - if (dp->d_type != T_NS) - continue; - - servers++; - - /* look for A records */ - dname = (caddr_t) dp->d_data; - htp = hashtab; - tnp = nlookup(dname, &htp, &fname, 0); - if (tnp == NULL || fname != dname) { - dprintf(3, (ddt, - "check_ns: %s: not found %s %#lx\n", - dname, fname, (u_long)tnp)); - sysquery(dname, dp->d_class, T_A, NULL, - 0, QUERY); - continue; - } - /* look for name server addresses */ - found_arr = 0; - delete_stale(tnp); - for (tdp = tnp->n_data; - tdp != NULL; - tdp = tdp->d_next) { -#ifdef NCACHE - if (tdp->d_rcode) - continue; -#endif - if (tdp->d_type == T_CNAME) - cnames++; - if (tdp->d_type != T_A || - tdp->d_class != dp->d_class) - continue; - if ((tdp->d_zone == 0) && - (tdp->d_ttl < curtime)) { - dprintf(3, (ddt, - "check_ns: stale entry '%s'\n", - NAME(*tnp))); - found_arr = 0; - break; - } - found_arr++; - } - if (found_arr) - rrsets++; - else if (cnames > 0) - syslog(LOG_INFO, "Root NS %s -> CNAME %s", - NAME(*np), NAME(*tnp)); - else - sysquery(dname, dp->d_class, T_A, NULL, - 0, QUERY); - } - } - - dprintf(2, (ddt, "check_ns: %d %d\n", servers, rrsets)); - return ((servers<=2)?(rrsets==servers):((rrsets*2)>=servers)); -} - -/* int findns(npp, class, nsp, countp, flag) - * Find NS's or an SOA - * npp, class: - * dname whose most enclosing NS is wanted - * nsp, countp: - * result array and count; array will also be NULL terminated - * flag: - * boolean: we're being called from ADDAUTH, bypass authority checks - * return value: - * NXDOMAIN: we are authoritative for this {dname,class} - * *countp is bogus, but nsp[] has a single SOA returned in it. - * SERVFAIL: we are auth but zone isn't loaded; or, no root servers found - * *countp and nsp[] are bogus. - * OK: we are not authoritative, and here are the NS records we found. - * *countp and nsp[] return NS records of interest. - */ -int -findns(npp, class, nsp, countp, flag) - register struct namebuf **npp; - int class; - struct databuf **nsp; - int *countp; - int flag; -{ - register struct namebuf *np = *npp; - register struct databuf *dp; - register struct databuf **nspp; - struct hashbuf *htp; - - nsp[0] = NULL; - - if (priming && (np == NULL || NAME(*np)[0] == '\0')) - htp = fcachetab; - else - htp = hashtab; - - try_again: - if (htp == fcachetab && class == C_IN && !priming) - needs_prime_cache = 1; - if (np == NULL) { - /* find the root */ - for (np = htp->h_tab[0]; np != NULL; np = np->n_next) - if (NAME(*np)[0] == '\0') - break; - } - while (np != NULL) { - dprintf(5, (ddt, "findns: np %#lx '%s'\n", - (u_long)np, NAME(*np))); - /* Look first for SOA records. */ -#ifdef ADDAUTH - if (!flag) -#endif - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (dp->d_zone != 0 && -#ifdef PURGE_ZONE - ((zones[dp->d_zone].z_type == Z_PRIMARY) || - (zones[dp->d_zone].z_type == Z_SECONDARY)) && -#endif - match(dp, class, T_SOA)) { - dprintf(3, (ddt, "findns: SOA found\n")); - if (zones[dp->d_zone].z_flags & Z_AUTH) { - *npp = np; - nsp[0] = dp; - nsp[1] = NULL; - dp->d_rcnt++; - return (NXDOMAIN); - } else { - /* XXX: zone isn't loaded but we're - * primary or secondary for it. - * should we fwd this? - */ - return (SERVFAIL); - } - } - } - - /* If no SOA records, look for NS records. */ - nspp = &nsp[0]; - *nspp = NULL; - delete_stale(np); - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (!match(dp, class, T_NS)) - continue; -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - /* - * Don't use records that may become invalid to - * reference later when we do the rtt computation. - * Never delete our safety-belt information! - * - * XXX: this is horribly bogus. - */ - if ((dp->d_zone == 0) && - (dp->d_ttl < tt.tv_sec) && - !(dp->d_flags & DB_F_HINT)) { - dprintf(1, (ddt, "findns: stale entry '%s'\n", - NAME(*np))); - /* - * We may have already added NS databufs - * and are going to throw them away. Fix - * fix reference counts. We don't need - * free() them here as we just got them - * from the cache. - */ - while (nspp > &nsp[0]) - (*--nspp)->d_rcnt--; - nsp[0] = NULL; - goto try_parent; - } - if (nspp < &nsp[NSMAX-1]) { - *nspp++ = dp; - dp->d_rcnt++; - } - } - - *countp = nspp - nsp; - if (*countp > 0) { - dprintf(3, (ddt, "findns: %d NS's added for '%s'\n", - *countp, NAME(*np))); - *nspp = NULL; - *npp = np; - return (OK); /* Success, got some NS's */ - } - try_parent: - np = np_parent(np); - } - if (htp == hashtab) { - htp = fcachetab; - goto try_again; - } - dprintf(1, (ddt, "findns: No root nameservers for class %s?\n", - p_class(class))); - if ((unsigned)class < MAXCLASS && norootlogged[class] == 0) { - norootlogged[class] = 1; - syslog(LOG_INFO, "No root nameservers for class %s\n", - p_class(class)); - } - return (SERVFAIL); -} - - -/* - * Extract RR's from the given node that match class and type. - * Return number of bytes added to response. - * If no matching data is found, then 0 is returned. - */ -int -finddata(np, class, type, hp, dnamep, lenp, countp) - struct namebuf *np; - int class, type; - register HEADER *hp; - char **dnamep; - int *lenp, *countp; -{ - register struct databuf *dp; - register char *cp; - int buflen, n, count = 0; - - delete_stale(np); - -#ifdef ROUND_ROBIN - if (type != T_ANY && type != T_PTR) { - /* cycle order of RRs, for a load balancing effect... */ - - register struct databuf **dpp; - - for (dpp = &np->n_data; dp = *dpp; dpp = &dp->d_next) { - if (dp->d_next && wanted(dp, class, type)) { - register struct databuf *lp; - - *dpp = lp = dp->d_next; - dp->d_next = NULL; - - for (dpp = &lp->d_next; - *dpp; - dpp = &lp->d_next) - lp = *dpp; - *dpp = dp; - break; - } - } - } -#endif /*ROUND_ROBIN*/ - - buflen = *lenp; -#ifdef DEBUG - if (buflen > PACKETSZ) - dprintf(1, (ddt, "finddata(): buflen=%d\n", buflen)); -#endif - cp = ((char *)hp) + *countp; - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (!wanted(dp, class, type)) { -#ifndef NCACHE /*if no negative caching then cname => nothing else*/ - if (type == T_CNAME && class == dp->d_class) { - /* any data means no CNAME exists */ - *countp = 0; - return 0; - } -#endif /*NCACHE*/ - continue; - } - if (dp->d_cred == DB_C_ADDITIONAL) { -#ifdef NOADDITIONAL - continue; -#else - /* we want to expire additional data very - * quickly. current strategy is to cut 5% - * off each time it is accessed. this makes - * stale(dp) true earlier when this datum is - * used often. - */ - dp->d_ttl = tt.tv_sec - + - 0.95 * (int) (dp->d_ttl - tt.tv_sec); -#endif - } -#ifdef NCACHE - /* -ve $ing stuff, anant@isi.edu - * if we have a -ve $ed record, change the rcode on the - * header to reflect that - */ - if (dp->d_rcode == NOERROR_NODATA) { - if (count != 0) { - /* - * This should not happen, yet it does... - */ - syslog(LOG_INFO, - "NODATA & data for \"%s\" type %d class %d", - *dnamep, type, class); - continue; - } - if (type == T_ANY) - continue; - hp->rcode = NOERROR_NODATA; - if (dp->d_size == 0) { /* !RETURNSOA */ - *countp = 0; - return 1; /* XXX - we have to report success */ - } - } - if (dp->d_rcode == NXDOMAIN) { - if (count != 0) { - /* - * This should not happen, yet it might... - */ - syslog(LOG_INFO, - "NXDOMAIN & data for \"%s\" type %d class %d", - *dnamep, type, class); - continue; - } - hp->rcode = NXDOMAIN; - if (dp->d_size == 0) { /* !RETURNSOA */ - *countp = 0; - return 1; /* XXX - we have to report success */ - } - } -#endif /*NCACHE*/ - - /* Don't put anything but key or sig RR's in response to - requests for key or sig */ - if (((type == T_SIG) || (type == T_KEY)) && - (!((dp->d_type == T_SIG) || (dp->d_type == T_KEY))) ) - continue; - - if ((n = make_rr(*dnamep, dp, (u_char *)cp, buflen, 1)) < 0) { - hp->tc = 1; - *countp = count; - return (*lenp - buflen); - } - - cp += n; - buflen -= n; - count++; -#ifdef notdef - /* this isn't right for glue records, aa is set in ns_req */ - if (dp->d_zone && - (zones[dp->d_zone].z_flags & Z_AUTH) && - class != C_ANY) - hp->aa = 1; /* XXX */ -#endif - if (dp->d_type == T_CNAME) { - /* don't alias if querying for key, sig, nxt, or any */ - if ((type != T_KEY) && - (type != T_SIG) && - (type != T_NXT) && - (type != T_ANY)) { /* or T_NS? */ - *dnamep = (caddr_t) dp->d_data; - if (dp->d_zone != DB_Z_CACHE && - (zones[dp->d_zone].z_flags & Z_AUTH) && - class != C_ANY) /* XXX */ - hp->aa = 1; /* XXX */ - } - break; - } - } - /* - * Cache invalidate the other RR's of same type - * if some have timed out - */ - dprintf(3, (ddt, "finddata: added %d class %d type %d RRs\n", - count, class, type)); - *countp = count; - return (*lenp - buflen); -} - -/* - * Do we want this data record based on the class and type? - * (We always return found unexpired SIG RR's that cover the wanted rrtype.) - */ -int -wanted(dp, class, type) - struct databuf *dp; - int class, type; -{ - u_char *cp; - u_int16_t coveredType; - time_t expiration; - - dprintf(3, (ddt, "wanted(%#lx, %d, %d) [%s %s]\n", - (u_long)dp, class, type, - p_class(dp->d_class), p_type(dp->d_type))); - - if (dp->d_class != class && class != C_ANY) - return (0); - /* Must check SIG for expiration below, other matches return OK here. */ - if (type == dp->d_type && (type != T_SIG)) - return (1); -#ifdef NCACHE - /*-ve $ing stuff, for a T_ANY query, we do not want to return - * -ve $ed RRs. - */ - if (type == T_ANY && dp->d_rcode == NOERROR_NODATA) - return (0); -#endif - - /* First, look at the type of RR. */ - switch (dp->d_type) { - - /* Cases to deal with: - T_ANY search, return all unexpired SIGs. - T_SIG search, return all unexpired SIGs. - T_ search, return all unexp SIG s. - */ - case T_SIG: - cp = dp->d_data; - GETSHORT(coveredType,cp); - cp += INT16SZ + INT32SZ; /* skip alg, labels, & orig TTL */ - GETLONG(expiration,cp); - - if (type == T_ANY || type == T_SIG || type == coveredType) { - if (expiration > time(0)) - return (1); /* Unexpired matching SIG */ - } - return (0); /* We don't return this SIG. */ - - case T_ANY: - return (1); - case T_CNAME: -#ifdef NCACHE - if (dp->d_rcode != NOERROR_NODATA) -#endif - return (1); -#ifdef NCACHE - else - break; -#endif - } - /* OK, now look at the type of query. */ - switch (type) { - case T_ANY: - return (1); - - case T_MAILB: - switch (dp->d_type) { - case T_MR: - case T_MB: - case T_MG: - case T_MINFO: - return (1); - } - break; - - case T_AXFR: - /* T_AXFR needs an authoritative SOA */ - if (dp->d_type == T_SOA && dp->d_zone != 0 - && (zones[dp->d_zone].z_flags & Z_AUTH)) - return (1); - break; - } - return (0); -} - -/* - * Add RR entries from dpp array to a query/response. - * Return the number of bytes added or negative the amount - * added if truncation occured. Typically you are - * adding NS records to a response. - */ -int -add_data(np, dpp, cp, buflen, countp) - struct namebuf *np; - struct databuf **dpp; - register u_char *cp; - int buflen, *countp; -{ - register struct databuf *dp; - char dname[MAXDNAME]; - register int n, bytes; - - bytes = *countp = 0; - getname(np, dname, sizeof(dname)); - for (dp = *dpp++; dp != NULL; dp = *dpp++) { - if (stale(dp)) - continue; /* ignore old cache entry */ -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - if ((n = make_rr(dname, dp, cp, buflen, 1)) < 0) - return (-bytes); /* Truncation */ - cp += n; - buflen -= n; - bytes += n; - (*countp)++; - } - return (bytes); -} - -static void -rrsetadd(flushset, name, dp) - struct flush_set *flushset; - char *name; - struct databuf *dp; -{ - struct flush_set *fs = flushset; - struct db_list *dbl; - - while (fs->fs_name && ( - strcasecmp(fs->fs_name,name) || - (fs->fs_class != dp->d_class) || - (fs->fs_type != dp->d_type) || - (fs->fs_cred != dp->d_cred))) { - fs++; - } - if (!fs->fs_name) { - fs->fs_name = strdup(name); - if (!fs->fs_name) - panic(-1, "rrsetadd: out of memory"); - fs->fs_class = dp->d_class; - fs->fs_type = dp->d_type; - fs->fs_cred = dp->d_cred; - fs->fs_list = NULL; - fs->fs_last = NULL; - } - dbl = (struct db_list *)malloc(sizeof(struct db_list)); - if (!dbl) - panic(-1, "rrsetadd: out of memory"); - dbl->db_next = NULL; - dbl->db_dp = dp; - if (fs->fs_last == NULL) - fs->fs_list = dbl; - else - fs->fs_last->db_next = dbl; - fs->fs_last = dbl; -} - -static int -ttlcheck(name,dbl,update) - char *name; - struct db_list *dbl; - int update; -{ - int type = dbl->db_dp->d_type; - int class = dbl->db_dp->d_class; - struct hashbuf *htp = hashtab; - const char *fname; - register struct namebuf *np; - struct db_list *dbp = dbl; - struct databuf *dp; - u_int32_t ttl; - int first; - - - np = nlookup(name, &htp, &fname, 0); - if (np == NULL || fname != name || ns_wildcard(NAME(*np))) { - return(1); - } - - /* check that all the ttl's we have are the same, if not return 1 */ - first = 1; - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (!match(dp, class, type)) - continue; - if (first) { - /* we can't update zone data so return early */ - if (dp->d_zone != 0) - return(0); - ttl = dp->d_ttl; - first = 0; - } else if (ttl != dp->d_ttl) { - return(1); - } - } - - /* there are no records of this type in the cache */ - if (first) - return(1); - - /* - * the ttls of all records we have in the cache are the same - * if the ttls differ in the new set we don't want it. - */ - - /* check that all the ttl's we have are the same, if not return 0 */ - first = 1; - while (dbp) { - if (first) { - ttl = dbp->db_dp->d_ttl; - first = 0; - } else if (ttl != dbp->db_dp->d_ttl) { - return(0); - } - dbp = dbp->db_next; - } - - /* update ttl if required */ - if (update) { - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (!match(dp, class, type)) - continue; - if (dp->d_ttl > ttl) - break; - dp->d_ttl = ttl; - fixttl(dp); - } - } - - return(1); -} - -static int -rrsetcmp(name, dbl) - char *name; - struct db_list *dbl; -{ - int type = dbl->db_dp->d_type; - int class = dbl->db_dp->d_class; - struct hashbuf *htp = hashtab; - const char *fname; - register struct namebuf *np; - struct db_list *dbp = dbl; - struct databuf *dp; - int exists = 0; - - - np = nlookup(name, &htp, &fname, 0); - if (np == NULL || fname != name || ns_wildcard(NAME(*np))) { - dprintf(1, (ddt, "rrsetcmp: name not in database\n")); - return(-1); - } - - /* check that all entries in dbl are in the cache */ - while (dbp) { - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (match(dp, class, type)) - exists++; - if (!db_cmp(dp, dbp->db_dp) -#ifdef NOADDITIONAL - && ((dp->d_cred == dbp->db_dp->d_cred) || - (dp->d_cred != DB_C_ADDITIONAL)) -#endif - ) - break; - } - if (!dp) { - dprintf(1, (ddt, "rrsetcmp: %srecord%s in database\n", - exists ? "" : "no ", exists ? " not" : "s")); - return(exists? 1 : -1); - } - dbp = dbp->db_next; - } - - /* Check that all cache entries are in the list. */ - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (!match(dp, class, type)) - continue; -#ifdef NCACHE - if (dp->d_rcode) - return(1); -#endif - dbp = dbl; - while (dbp) { - if (!db_cmp(dp, dbp->db_dp)) - break; - dbp = dbp->db_next; - } - if (!dbp) { - dprintf(1, (ddt, "rrsetcmp: record not in rrset\n")); - return(1); - } - } - dprintf(1, (ddt, "rrsetcmp: rrsets matched\n")); - return(0); -} - -static void -rrsetupdate(flushset, flags) - struct flush_set * flushset; - int flags; -{ - struct flush_set *fs = flushset; - struct db_list *dbp, *odbp; - int n; - - while (fs->fs_name) { - dprintf(1,(ddt, "rrsetupdate: %s\n", - fs->fs_name[0] ? fs->fs_name : ".")); - if ((n = rrsetcmp(fs->fs_name, fs->fs_list)) && - ttlcheck(fs->fs_name, fs->fs_list, 0)) { - if (n > 0) - flushrrset(fs); - - dbp = fs->fs_list; - while (dbp) { - n = db_update(fs->fs_name, dbp->db_dp, - dbp->db_dp, flags, hashtab); - dprintf(1,(ddt, "rrsetupdate: %s %d\n", - fs->fs_name[0] ? fs->fs_name : ".", n)); - if (n != OK) - db_free(dbp->db_dp); - odbp = dbp; - dbp = dbp->db_next; - free((char *)odbp); - } - } else { - if (n == 0) - (void)ttlcheck(fs->fs_name, fs->fs_list, 1); - dbp = fs->fs_list; - while (dbp) { - db_free(dbp->db_dp); - odbp = dbp; - dbp = dbp->db_next; - free((char *)odbp); - } - } - fs->fs_list = NULL; - fs++; - } -} - -static void -flushrrset(fs) - struct flush_set * fs; -{ - struct databuf *dp; - int n; - - dprintf(1, (ddt, "flushrrset(%s, %s, %s, %d)\n", - fs->fs_name[0]?fs->fs_name:".", p_type(fs->fs_type), - p_class(fs->fs_class), fs->fs_cred)); - dp = savedata(fs->fs_class, fs->fs_type, 0, NULL, 0); - dp->d_zone = 0; - dp->d_cred = fs->fs_cred; - dp->d_clev = 0; - do { - n = db_update(fs->fs_name, dp, NULL, DB_DELETE, hashtab); - dprintf(1, (ddt, "flushrrset: %d\n", n)); - } while (n == OK); - db_free(dp); -} - -static void -free_flushset(flushset) - struct flush_set *flushset; -{ - struct flush_set *fs; - - for (fs = flushset; fs->fs_name != NULL; fs++) - free(fs->fs_name); - free((char *)flushset); -} - -/* - * This is best thought of as a "cache invalidate" function. - * It is called whenever a piece of data is determined to have - * become invalid either through a timeout or a validation - * failure. It is better to have no information, than to - * have partial information you pass off as complete. - */ -void -delete_all(np, class, type) - register struct namebuf *np; - int class, type; -{ - register struct databuf *dp, *pdp; - - dprintf(3, (ddt, "delete_all(%#lx:\"%s\" %s %s)\n", - (u_long)np, NAME(*np), p_class(class), p_type(type))); - pdp = NULL; - dp = np->n_data; - while (dp != NULL) { - if ((dp->d_zone == 0) && !(dp->d_flags & DB_F_HINT) - && match(dp, class, type)) { - dp = rm_datum(dp, np, pdp); - continue; - } - pdp = dp; - dp = dp->d_next; - } -} - -/* delete_stale(np) - * for all RRs associated with this name, check for staleness (& delete) - * arguments: - * np = pointer to namebuf to be cleaned. - * returns: - * void. - * side effects: - * delete_all() can be called, freeing memory and relinking chains. - */ -void -delete_stale(np) - struct namebuf *np; -{ - struct databuf *dp; - again: - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if ((dp->d_zone == 0) && stale(dp)) { - delete_all(np, dp->d_class, dp->d_type); - goto again; - } - } -} - - -static void -add_related_additional(name) - char *name; -{ - int i; - - if (num_related >= MAX_RELATED - 1) - return; - for (i = 0; i < num_related; i++) - if (strcasecmp(name, related[i]) == 0) { - free(name); - return; - } - related[num_related++] = name; -} - -static void -free_related_additional() { - int i; - - for (i = 0; i < num_related; i++) - free(related[i]); - num_related = 0; -} - -static int -related_additional(name) - char *name; -{ - int i; - - for (i = 0; i < num_related; i++) - if (strcasecmp(name, related[i]) == 0) - return (1); - return (0); -} - -static void -maybe_free(tname) - char **tname; -{ - if (tname == NULL || *tname == NULL) - return; - free(*tname); - *tname = NULL; -} diff --git a/contrib/bind/named/ns_sort.c b/contrib/bind/named/ns_sort.c deleted file mode 100644 index 0f53ccec658d..000000000000 --- a/contrib/bind/named/ns_sort.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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 diff --git a/contrib/bind/named/ns_stats.c b/contrib/bind/named/ns_stats.c deleted file mode 100644 index 1fe382abe387..000000000000 --- a/contrib/bind/named/ns_stats.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include - -#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, "<>\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*/ diff --git a/contrib/bind/named/ns_udp.c b/contrib/bind/named/ns_udp.c deleted file mode 100644 index 7fb583124bc7..000000000000 --- a/contrib/bind/named/ns_udp.c +++ /dev/null @@ -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 -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#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 -} diff --git a/contrib/bind/named/ns_validate.c b/contrib/bind/named/ns_validate.c deleted file mode 100644 index b7e774cadf89..000000000000 --- a/contrib/bind/named/ns_validate.c +++ /dev/null @@ -1,1234 +0,0 @@ -/************************************************************************** - * ns_validate.c (was security.c in original ISI contribution) - * author: anant kumar - * contributed: March 17, 1993 - * - * implements validation procedure for RR's received from a server as a - * response to a query. - */ - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include "named.h" - -#ifdef VALIDATE - -static int isvalid __P((struct namebuf *, int, int, char *, int)), - check_addr_ns __P((struct databuf **, - struct sockaddr_in *, - char *)), - check_in_tables __P((struct databuf **, - struct sockaddr_in *, - char *)); -#if 0 -static void stick_in_queue __P((char *, int, int, char *)); -#endif - -static NAMEADDR nameaddrlist[MAXNAMECACHE]; -static int firstNA = 0, - lastNA = 0; - -static TO_Validate *validateQ, *currentVQ; -static int VQcount; - -/***************************************************************** - * validate() is called from dovalidate(). it takes as parameters, - * the domain name sought, the class, type etc. of record, the server - * that gave us the answer and the data it gave us - * - * it returns VALID if it is able to validate the record, INVALID if it cannot. - * furtehr VALID is split into VALID_CACHE if we need to cache this record - * since the domainname is not something we are authoritative for and - * VALID_NO_CACHE if the name is something we are authoritative for. - * - * pseudocode for function validate is as follows: - * validate(domain, qdomain, server, type, class, data, dlen, rcode) { - * - * if (dname or a higher level name not found in cache) - * return INVALID; - * if (NS records for "domain" found in cache){ - * - * if (we are authoritative) /findns() returned NXDOMAIN;/ - * if (we did not have an exact match on names) - * =>the name does not exist in our database - * => data is bad: return INVALID - * if (data agrees with what we have) - * return VALID_NO_CACHE; - * else return INVALID; - * - * if (we are not authoritative) /findns() returned OK;/ - * if (domain lives below the qdomain) - * return VALID_CACHE; - * if (address records for NS's found in cache){ - * if ("server" = one of the addresses){ - * return VALID_CACHE; - * }else{ - * stick in queue of "to_validate" data; - * return (INVALID); - * } - * else return INVALID; - * - * This performs the validation procedure described above. Checks - * for the longest component of the dname that has a NS record - * associated with it. At any stage, if no data is found, it implies - * that the name is bad (has an unknown domain identifier) thus, we - * return INVALID. - * If address of one of these servers matches the address of the server - * that returned us this data, we are happy! - * - * since findns will set needs_prime_cache if np = NULL is passed, we always - * reset it. will let ns_req do it when we are searching for ns records to - * query someone. hence in all the three cases of switch(findns()) - * we have needs_prime_cache = 0; - *****************************************************************************/ -int -validate(dname, qdomain, server, type, class, data, dlen -#ifdef NCACHE - ,rcode -#endif - ) - char *dname, *qdomain; - struct sockaddr_in *server; - int type, class; - char *data; - int dlen; -#ifdef NCACHE - int rcode; -#endif -{ - struct namebuf *np, *dnamep; - struct hashbuf *htp; - struct databuf *nsp[NSMAX]; - int count; - const char *fname; - int exactmatch = 0; - struct fwdinfo *fwd; - - nsp[0] = NULL; - dprintf(3, (ddt, - "validate(), d:%s, s:[%s], t:%d, c:%d\n", - dname, inet_ntoa(server->sin_addr), type, class)); - - /* everything from forwarders is the GOSPEL */ - for (fwd = fwdtab; fwd != NULL; fwd = fwd->next) { - if (server->sin_addr.s_addr == fwd->fwdaddr.sin_addr.s_addr) - return (VALID_CACHE); - } - - htp = hashtab; - if (priming && (dname[0] == '\0')) - np = NULL; - else - np = nlookup(dname, &htp, &fname, 0); - - /* we were able to locate namebufs for this domain, or a parent domain, - * or ??? */ - - if (np == NULL) - fname = ""; - dprintf(5, (ddt, - "validate:namebuf found np:%#lx, d:\"%s\", f:\"%s\"\n", - (u_long)np, dname, fname)); - /* save the namebuf if we were able to locate the exact dname */ - if (!strcasecmp(dname, fname)) { - dnamep = np; - exactmatch = 1; - } - switch (findns(&np, class, nsp, &count, 0)) { - case NXDOMAIN: - /** we are authoritative for this domain, lookup name - * in our zone data, if it matches, return valid. - * in either case, do not cache - **/ - dprintf(5, (ddt, "validate: auth data found\n")); - free_nsp(nsp); - if (needs_prime_cache) - needs_prime_cache = 0; - -#ifdef NCACHE - if (rcode == NXDOMAIN) { - /* If we had an exactmatch on the name, we found the - * name in our authority database, so this couldn't - * have been a bad name. INVALID data, say so - */ - if (exactmatch) - return (INVALID); - else - /* we did not have an exactmatch, the data is - * good, we do not NCACHE stuff we are - * authoritative for, though. - */ - return (VALID_NO_CACHE); - } -#endif - if (!strcasecmp(dname, NAME(*np))) { - - /* if the name we seek is the same as that we have ns - * records for, compare the data we have to see if it - * matches. if it does, return valid_no_cache, if it - * doesn't, invalid. - */ - if (isvalid(np, type, class, data, dlen)) - return (VALID_NO_CACHE); - else - return (INVALID); - } - - /* we found ns records in a higher level, if we were unable to - * locate the exact name earlier, it means we are - * authoritative for this domain but do not have records for - * this name. this name is obviously invalid - */ - if (!exactmatch) - return (INVALID); - - /* we found the exact name earlier and we are obviously - * authoritative so check for data records and see if any - * match. - */ - if (isvalid(dnamep, type, class, data, dlen)) - return (VALID_NO_CACHE); - else - return (INVALID); - - case SERVFAIL:/* could not find name server records*/ - /* stick_in_queue(dname, type, class, data); */ - if (needs_prime_cache) - needs_prime_cache = 0; - free_nsp(nsp); - return (INVALID); - - case OK: /*proceed */ - dprintf(5, (ddt, "validate:found ns records\n")); - if (needs_prime_cache) - needs_prime_cache = 0; - if (samedomain(dname, qdomain) || - check_addr_ns(nsp, server, dname)) { - free_nsp(nsp); - return (VALID_CACHE); - } - /* server is not one of those we know of */ - /* stick_in_queue(dname, type, class, data); */ - free_nsp(nsp); - return (INVALID); - default: - free_nsp(nsp); - return (INVALID); - } /*switch*/ - -} /*validate*/ - -/*********************************************************************** - * validate rr returned by somebody against your own database, if you are - * authoritative for the information. if you have a record that matches, - * return 1, else return 0. validate() above will use this and determine - * if the record should be returned/discarded. - ***********************************************************************/ -static int -isvalid(np, type, class, data, dlen) - struct namebuf *np; - int type, class; - char *data; - int dlen; -{ - register struct databuf *dp; - - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (!wanted(dp, class, type)) { - if ((type == T_CNAME) && (class == dp->d_class)) { - /* if a cname exists, any other will not */ - return (0); - /* we come here only for zone info, - * so -ve $ed info can't be - */ - } - continue; - } - /* type and class match, if i get here - * let's now compare the data section, per RR type - */ - - /* unless, of course, the data was negative, in which case - * we should return FAILURE since we should not have found - * data here. - */ - if ((data == NULL) || (dlen == 0)) - return (0); - - /* XXX: why aren't we just calling db_cmp()? */ - - switch (type) { - char *td; - u_char *tdp; - int x; - - case T_A: - case T_WKS: - case T_HINFO: - case T_UINFO: - case T_UID: - case T_GID: - case T_TXT: - case T_X25: - case T_ISDN: - case T_LOC: -#ifdef ALLOW_T_UNSPEC - case T_UNSPEC: -#endif - x = memcmp(dp->d_data, data, dlen); - dprintf(3, (ddt, "type = %d, GOOD = %d\n", - type, x)); - if (x == 0) - return (1); - else - break; - - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - x = strncasecmp((char *)dp->d_data, data, dlen); - dprintf(3, (ddt, "type = %d, GOOD = %d\n", - type, x)); - if (x == 0) - return (1); - else - break; - - case T_MINFO: - case T_SOA: - case T_RP: - /* compare first string */ - x = strncasecmp((char *)dp->d_data, data, - strlen(data) + 1); - if (x != 0) - break; - - /* move to second string */ - td = data + (strlen(data) + 1); - tdp = dp->d_data + - (strlen((char *)dp->d_data)+1); - - /* compare second string */ - x = strncasecmp(td, (char *)tdp, - strlen((char *)td+1)); - if (x != 0) - break; - - /* move beyond second string, to - * set of words in SOA. - * RP and MINFO stuff really - * ends here - */ - - td = td + strlen((char *)td) + 1; - tdp = tdp + strlen((char *)tdp) + 1; - if (type == T_SOA) { - x = memcmp(td, (char *)tdp, - 5*INT32SZ); - if (x != 0) - break; - } - - /* everything was equal, wow! - * so return a success - */ - return (1); - - case T_MX: - case T_AFSDB: - case T_RT: - x = memcmp(dp->d_data, data, - INT16SZ); - if (x != 0) - break; - td = data + INT16SZ; - tdp = dp->d_data + INT16SZ; - x = strncasecmp(td, (char *)tdp, - strlen((char *)td) + 1); - if (x != 0) - break; - return (1); - - case T_PX: - x = memcmp(dp->d_data, data, - INT16SZ); - if (x != 0) - break; - td = data + INT16SZ; - tdp = dp->d_data + INT16SZ; - - /* compare first string */ - x = strncasecmp(td, (char *)tdp, - strlen((char *)td) + 1); - if (x != 0) - break; - td += (strlen(td) + 1); - tdp += (strlen((char *)tdp) + 1); - - /* compare second string */ - x = strncasecmp(td, (char *)tdp, - strlen((char *)td+1)); - if (x != 0) - break; - return (1); - - default: - dprintf(3, (ddt, "unknown type %d\n", type)); - return (0); - } - /* continue in loop if record did not match */ - } - /* saw no record of interest in whole chain - * If the data we were trying to validate was negative, we succeeded! - * else we failed - */ - if ((data == NULL) || (dlen == 0)) { - /* negative data, report success */ - return (1); - } - /* positive data, no such RR, validation failed */ - return (0); -} - -/****************************************************************** - * get a list of databufs that have ns addresses for the closest domain - * you know about, get their addresses and confirm that server indeed - * is one of them. if yes return 1 else 0. - * first checks the cache that we build in nslookup() earlier - * when we ns_forw(). if unableto find it there, it checks the entire - * hash table to do address translations. - *******************************************************************/ -static int -check_addr_ns(nsp, server, dname) - struct databuf **nsp; - struct sockaddr_in *server; - char *dname; -{ - int i, found=0; - char sname[MAXDNAME]; - struct in_addr *saddr = &(server->sin_addr); - struct databuf **nsdp; - - dprintf(5, (ddt, "check_addr_ns: s:[%s], db:0x%lx, d:\"%s\"\n", - inet_ntoa(*saddr), (u_long)nsp, dname)); - - for(i = lastNA; i != firstNA; i = (i+1) % MAXNAMECACHE) { - if (!bcmp((char *)saddr, - (char *)&(nameaddrlist[i].ns_addr), - INADDRSZ)) { - strcpy(sname, nameaddrlist[i].nsname); - found = 1; - break; - } - } - if (found) { - dprintf(3, (ddt, - "check_addr_ns: found address:[%s]\n", - inet_ntoa(*saddr))); - for (nsdp = nsp; *nsdp != NULL;nsdp++) { - dprintf(5, (ddt, - "check_addr_ns:names are:%s, %s\n", - sname,(*nsdp)->d_data)); - if (!strcasecmp(sname,(char *)((*nsdp)->d_data))) { - return (1); - } - } - } - /* could not find name in my cache of servers, must go through the - * whole grind - */ - - dprintf(2, (ddt, "check_addr_ns:calling check_in_tables()\n")); - return (check_in_tables(nsp, server, dname)); -} - -/************************************************************************* - * checks in hash tables for the address of servers whose name is in the - * data section of nsp records. borrows code from nslookup()/ns_forw.c - * largely. - *************************************************************************/ -static int -check_in_tables(nsp, server, syslogdname) - struct databuf *nsp[]; - struct sockaddr_in *server; - char *syslogdname; -{ - register struct namebuf *np; - register struct databuf *dp, *nsdp; - struct hashbuf *tmphtp; - const char *dname, *fname; - int class; - int qcomp(); - - dprintf(3, (ddt, "check_in_tables(nsp=x%lx, qp=x%x, '%s')\n", - (u_long)nsp, server, syslogdname)); - - while ((nsdp = *nsp++) != NULL) { - class = nsdp->d_class; - dname = (char *)nsdp->d_data; - dprintf(3, (ddt, "check_in_tables: NS %s c%d t%d (x%x)\n", - dname, class, nsdp->d_type, nsdp->d_flags)); - tmphtp = ((nsdp->d_flags & DB_F_HINT) ? fcachetab : hashtab); - np = nlookup(dname, &tmphtp, &fname, 1); - if (np == NULL || fname != dname) { - dprintf(3, (ddt, "%s: not found %s %x\n", - dname, fname, np)); - continue; - } - /* look for name server addresses */ - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (stale(dp)) - continue; - if (dp->d_type != T_A || dp->d_class != class) - continue; -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - if (!bcmp((char *)dp->d_data, - (char *)&(server->sin_addr), - INADDRSZ)) { - return (1); - } - } - } - return (0); /* haven't been able to locate the right address */ -} - -/************************************************************************ - * is called in nslookup() and stores the name vs address of a name server - * --& check_in_tables above-- - * we contact, in a list of a maximum MAXNAMECACHE entries. we later refer - * -- NAMEADDR nameaddrlist[MAXNAMECACHE]; -- - * to this list when we are trying to resolve the name in check_addr_ns(). - *************************************************************************/ -void -store_name_addr(servername, serveraddr, syslogdname, sysloginfo) - const char *servername; - struct in_addr serveraddr; - const char *syslogdname; - const char *sysloginfo; -{ - int i; - - dprintf(3, (ddt, - "store_name_addr:s:%s, a:[%s]\n", - servername, inet_ntoa(serveraddr))); - - /* if we already have the name address pair in cache, return */ - for (i = lastNA; i != firstNA; i = (i+1) % MAXNAMECACHE) { - if (strcasecmp(servername, nameaddrlist[i].nsname) == 0) { - if (serveraddr.s_addr - == - nameaddrlist[i].ns_addr.s_addr) { - dprintf(5, (ddt, - "store_name_addr:found n and a [%s] [%s] in our $\n", - inet_ntoa(nameaddrlist[i].ns_addr), - inet_ntoa(serveraddr))); - return; - } /* if */ - } else if (serveraddr.s_addr - == - nameaddrlist[i].ns_addr.s_addr) { -#ifdef BAD_IDEA - /* - * log this as it needs to be fixed. - * replace old name by new, next query likely to have - * NS record matching new - */ - if (!haveComplained((char*) - nhash(nameaddrlist[i].nsname), - (char*)nhash(servername))) - syslog(LOG_INFO, - "%s: server name mismatch for [%s]: (%s != %s) (server for %s)", - sysloginfo, - inet_ntoa(serveraddr), - nameaddrlist[i].nsname, servername, - syslogdname); -#endif - free(nameaddrlist[i].nsname); - nameaddrlist[i].nsname = savestr(servername); - return; - } - } - /* we have to add this one to our cache */ - - nameaddrlist[firstNA].nsname = savestr(servername); - bcopy((char *)&serveraddr, - (char *)&(nameaddrlist[firstNA].ns_addr), - INADDRSZ); - - dprintf(2, (ddt, "store_name_addr:added entry #:%d n:%s a:[%s]\n", - firstNA, nameaddrlist[firstNA].nsname, - inet_ntoa(nameaddrlist[firstNA].ns_addr))); - - firstNA = (firstNA+1) % MAXNAMECACHE; - if (firstNA == lastNA) { - free(nameaddrlist[firstNA].nsname); - nameaddrlist[firstNA].nsname = 0; - lastNA = (lastNA+1) % MAXNAMECACHE; - } - return; -} - -/* - * Decode the resource record 'rrp' and validate the RR. - * Borrows code almost entirely from doupdate(). is a rather - * non-invasive routine since it just goes thru the same motions - * as doupdate but just marks the array validatelist entry as - * the return code from validate(). This is later used in doupdate - * to cache/not cache the entry. also used in update_msg() to - * delete/keep the record from the outgoing message. - */ -int -dovalidate(msg, msglen, rrp, zone, flags, qdomain, server, VCode) - u_char *msg, *rrp; - int msglen, zone, flags; - char *qdomain; - struct sockaddr_in *server; - int *VCode; -{ - register u_char *cp; - register int n; - int class, type, dlen, n1; - u_int32_t ttl; - char dname[MAXDNAME]; - u_char *cp1; - u_char data[MAXDNAME*2 + INT32SZ*5]; - register HEADER *hp = (HEADER *) msg; - - dprintf(2, (ddt, "dovalidate(zone %d, flags %x)\n", - zone, flags)); -#ifdef DEBUG - if (debug >= 10) - fp_nquery(msg, msglen, ddt); -#endif - - cp = rrp; - n = dn_expand(msg, msg + msglen, cp, dname, sizeof dname); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - GETSHORT(type, cp); - GETSHORT(class, cp); - GETLONG(ttl, cp); - GETSHORT(dlen, cp); - dprintf(2, (ddt, "dovalidate: dname %s type %d class %d ttl %d\n", - dname, type, class, ttl)); - /* - * Convert the resource record data into the internal - * database format. - */ - switch (type) { - case T_A: - case T_WKS: - case T_HINFO: - case T_UINFO: - case T_UID: - case T_GID: - case T_TXT: - case T_X25: - case T_ISDN: - case T_LOC: -#ifdef ALLOW_T_UNSPEC - case T_UNSPEC: -#endif - cp1 = cp; - n = dlen; - cp += n; - break; - - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - n = dn_expand(msg, msg + msglen, cp, - (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 = data; - n = strlen((char *)data) + 1; - break; - - case T_MINFO: - case T_SOA: - case T_RP: - n = dn_expand(msg, msg + msglen, cp, - (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 = data + (n = strlen((char *)data) + 1); - n1 = sizeof(data) - n; - if (type == T_SOA) - n1 -= 5 * INT32SZ; - n = dn_expand(msg, msg + msglen, cp, (char *)cp1, n1); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 += strlen((char *)cp1) + 1; - if (type == T_SOA) { - bcopy((char *)cp, (char *)cp1, n = 5 * INT32SZ); - cp += n; - cp1 += n; - } - n = cp1 - data; - cp1 = data; - break; - - case T_MX: - case T_AFSDB: - case T_RT: - /* grab preference */ - bcopy((char *)cp, data, INT16SZ); - cp1 = data + INT16SZ; - cp += INT16SZ; - - /* get name */ - n = dn_expand(msg, msg + msglen, cp, - (char *)cp1, sizeof(data) - INT16SZ); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - - /* compute end of data */ - cp1 += strlen((char *)cp1) + 1; - /* compute size of data */ - n = cp1 - data; - cp1 = data; - break; - - case T_PX: - /* grab preference */ - bcopy((char *)cp, data, INT16SZ); - cp1 = data + INT16SZ; - cp += INT16SZ; - - /* get first name */ - n = dn_expand(msg, msg + msglen, cp, - (char *)cp1, sizeof(data) - INT16SZ); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 += (n = strlen((char *)cp1) + 1); - n1 = sizeof(data) - n; - - /* get second name */ - n = dn_expand(msg, msg + msglen, cp, (char *)cp1, n1); - if (n < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - cp1 += strlen((char *)cp1) + 1; - n = cp1 - data; - cp1 = data; - break; - - default: - dprintf(3, (ddt, "unknown type %d\n", type)); - return ((cp - rrp) + dlen); - } - if (n > MAXDATA) { - dprintf(2, (ddt, - "update type %d: %d bytes is too much data\n", - type, n)); - hp->rcode = FORMERR; - return (-1); - } - - *VCode = validate(dname, qdomain, server, type, class,(char *)cp1, n -#ifdef NCACHE - ,NOERROR -#endif - ); - if (*VCode == INVALID) { - dprintf(2, (ddt, - "validation failed d:%s, t:%d, c:%d\n", - dname, type, class)); - } else { - dprintf(2, (ddt, - "validation succeeded d:%s, t:%d, c:%d\n", - dname, type, class)); - } - return (cp - rrp); -} - -#if 0 -/****************************************************************** - * This manages a data structure that stores all RRs that we were - * unable to validate. Am not sure exactly what purpose this might - * serve but until such time as we are sure it will not help, let - * me do it anyway. - *****************************************************************/ -static void -stick_in_queue(dname, type, class, data) - char *dname; - int type; - int class; - char *data; -{ - struct timeval tp; - struct _TIMEZONE tzp; - TO_Validate *tempVQ; - u_long leasttime; - - if (validateQ == NULL) { - validateQ = (TO_Validate *)malloc(sizeof(TO_Validate)); - if (!validateQ) - panic(errno, "malloc(validateQ)"); - validateQ->type = type; - validateQ->class = class; - validateQ->dname = savestr(dname); - validateQ->data = savestr(data); /* XXX no \0 */ - gettimeofday(&tp, &tzp); - validateQ->time = tp.tv_sec; - VQcount = 1; - validateQ->next = validateQ->prev = NULL; - currentVQ = validateQ; - return; - } - if (VQcount < MAXVQ) { - tempVQ =(TO_Validate *)malloc(sizeof(TO_Validate)); - if (!tempVQ) - panic(errno, "malloc(tempVQ)"); - tempVQ->type = type; - tempVQ->class = class; - tempVQ->dname = savestr(dname); - tempVQ->data = savestr(data); /* XXX no \0 */ - gettimeofday(&tp,&tzp); - tempVQ->time = tp.tv_sec; - tempVQ->next = currentVQ->next; - tempVQ->prev = currentVQ; - if (currentVQ->next != NULL) - currentVQ->next->prev = tempVQ; - currentVQ->next = tempVQ; - currentVQ = tempVQ; - VQcount++; - return; - } - gettimeofday(&tp, &tzp); - leasttime = validateQ->time; - currentVQ = validateQ; - for (tempVQ = validateQ; tempVQ != NULL; tempVQ = tempVQ->next) { - if (tp.tv_sec >= tempVQ->time +VQEXPIRY) { - tempVQ->type = type; - tempVQ->class = class; - strcpy(tempVQ->dname, dname); - strcpy(tempVQ->data, data); - tempVQ->time = tp.tv_sec; - currentVQ = tempVQ; - return; - } - if (tempVQ->time < leasttime) { - leasttime = tempVQ->time; - currentVQ = tempVQ; - } - } - currentVQ->type = type; - currentVQ->class = class; - strcpy(currentVQ->dname, dname); - strcpy(currentVQ->data, data); - currentVQ->time = tp.tv_sec; - return; -} -#endif - -#ifdef BAD_IDEA -/* removes any INVALID RR's from the msg being returned, updates msglen to - * reflect the new message length. - */ -int -update_msg(msg, msglen, Vlist, c) - u_char *msg; - int *msglen; - int Vlist[]; - int c; -{ - register HEADER *hp; - register u_char *cp; - int i; - int n = 0; - u_char *tempcp, *newcp; - int *RRlen; - int qlen; /* the length of the query section*/ - u_int16_t rdlength; - u_int16_t ancount, nscount; - u_int16_t new_ancount, new_nscount, new_arcount; - char dname[MAXDNAME], qname[MAXDNAME]; - u_char data[MAXDNAME]; - u_char **dpp; - u_char *dnptrs[40]; - u_char **edp = dnptrs + sizeof(dnptrs)/sizeof(dnptrs[0]); - u_char *eom = msg + *msglen; - int n_new; - int rembuflen, newlen; - u_char *newmsg; - u_int16_t type, class, dlen; - u_int32_t ttl; - int inv = 0; - -#ifdef DEBUG - if (debug) { - fprintf(ddt, "update_msg: msglen:%d, c:%d\n", *msglen, c); - if (debug >= 10) - fp_nquery(msg, *msglen, ddt); - } -#endif - /* just making sure we do not do all the work for nothing */ - for (i=0; iancount); - new_nscount = nscount = ntohs(hp->nscount); - new_arcount = ntohs(hp->arcount); - - cp = msg + HFIXEDSZ; - newlen = HFIXEDSZ; - /* skip the query section */ - qlen = dn_expand(msg, eom, cp, qname, sizeof qname); - if (qlen <= 0) { - dprintf(2, (ddt, "dn_expand() failed, bad record\n")); - goto badend; - } - cp +=qlen; - GETSHORT(type,cp); - GETSHORT(class,cp); - qlen += 2 * INT16SZ; - newlen += qlen; - - for (i = 0; i < c; i++) { - if (Vlist[i] == INVALID) { - if (i < ancount) - new_ancount--; - else if (i < ancount+nscount) - new_nscount--; - else - new_arcount--; - } - - RRlen[i] = dn_skipname(cp, msg + *msglen); - if (RRlen[i] <= 0) { - dprintf(2, (ddt, - "dn_skipname() failed, bad record\n")); - goto badend; - } - RRlen[i] += 2 * INT16SZ + INT32SZ; - /*type+class+TTL*/ - cp += RRlen[i]; - GETSHORT(rdlength, cp); - RRlen[i] += INT16SZ; /*rdlength*/ - RRlen[i] += rdlength; /*rdata field*/ - dprintf(3, (ddt, "RRlen[%d]=%d\n", i, RRlen[i])); - if (Vlist[i] != INVALID) - newlen += RRlen[i]; - cp += rdlength; /*increment pointer to next RR*/ - } - hp->ancount = htons(new_ancount); - hp->nscount = htons(new_nscount); - hp->arcount = htons(new_arcount); - /* get new buffer */ - dprintf(3, (ddt, - "newlen:%d, if no RR is INVALID == msglen\n", newlen)); - newmsg = (u_char *)calloc(1,newlen + MAXDNAME); - if (newmsg == NULL) - goto badend; - dpp = dnptrs; - *dpp++ = newmsg; - *dpp = NULL; - /* bcopy the header, with all the length fields correctly put in */ - bcopy((char *)msg, (char*)newmsg, HFIXEDSZ); /*header copied */ - newcp = newmsg +HFIXEDSZ; /*need a pointer in the new buffer */ - rembuflen = newlen +MAXDNAME - HFIXEDSZ; /*buflen we can workin*/ - newlen = HFIXEDSZ; /* this will now contain the length of msg */ - n_new = dn_comp(qname, newcp, rembuflen, dnptrs, edp); - if (n_new < 0) - goto badend; - newcp += n_new; - PUTSHORT(type, newcp); - PUTSHORT(class, newcp); /*query section complete*/ - newlen += (n_new+2*INT16SZ); - rembuflen -= (n_new+2*INT16SZ); - /* have to decode and copy every Valid RR from here */ - - cp = msg +HFIXEDSZ +qlen; /*skip header and query section*/ - for (i = 0; i < c; i++) { - if (Vlist[i] == INVALID) { - /* go to next RR if this one is not INVALID */ - cp += RRlen[i]; - continue; - } - /* we have a valid record, must put it in the newmsg */ - n = dn_expand(msg, eom, cp, dname, sizeof dname); - if (n < 0) { - hp->rcode = FORMERR; - goto badend; - } - n_new = dn_comp(dname, newcp, rembuflen, dnptrs, edp); - if (n_new < 0) - goto badend; - cp += n; - newcp += n_new; - dprintf(5, (ddt, - "cp:0x%x newcp:0x%x after getting name\n", - cp, newcp)); - GETSHORT(type, cp); - PUTSHORT(type, newcp); - dprintf(5, (ddt, - "cp:0x%x newcp:0x%x after getting type\n", - cp, newcp)); - GETSHORT(class, cp); - PUTSHORT(class, newcp); - dprintf(5, (ddt, - "cp:0x%x newcp:0x%x after getting class\n", - cp, newcp)); - GETLONG(ttl, cp); - PUTLONG(ttl, newcp); - dprintf(5, (ddt, - "cp:0x%x newcp:0x%x after getting ttl\n", - cp, newcp)); - /* this will probably be modified for newmsg, - * will put this in later, after compression - */ - GETSHORT(dlen, cp); - newlen += (n_new+3*INT16SZ + INT32SZ); - rembuflen -= (n_new+3*INT16SZ+ INT32SZ); - tempcp = newcp; - newcp += INT16SZ; /*advance to rdata field*/ - dprintf(5, (ddt, "tempcp:0x%x newcp:0x%x\n", - tempcp, newcp)); - dprintf(3, (ddt, - "update_msg: dname %s type %d class %d ttl %d\n", - dname, type, class, ttl)); - /* read off the data section */ - switch (type) { - case T_A: - case T_WKS: - case T_HINFO: - case T_UINFO: - case T_UID: - case T_GID: - case T_TXT: - case T_X25: - case T_ISDN: - case T_LOC: -#ifdef ALLOW_T_UNSPEC - case T_UNSPEC: -#endif - n = dlen; - PUTSHORT(n, tempcp); /*time to put in the dlen*/ - bcopy(cp, newcp,n); /*done here*/ - cp +=n; - newcp +=n; - newlen += n; - rembuflen -= n; - dprintf(3, (ddt, "\tcp:0x%x newcp:0x%x dlen:%d\n", - cp, newcp, dlen)); - break; - - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - /*read off name from data section */ - n = dn_expand(msg, eom, cp, - (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - goto badend; - } - cp += n; /*advance pointer*/ - /* fill in new packet */ - n_new = dn_comp((char *)data, newcp, rembuflen, - dnptrs, edp); - if (n_new < 0) - goto badend; - PUTSHORT(n_new,tempcp); /*put in dlen field*/ - newcp += n_new; /*advance new pointer*/ - newlen += n_new; - rembuflen -= n_new; - break; - - case T_MINFO: - case T_SOA: - case T_RP: - n = dn_expand(msg, eom, cp, (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - goto badend; - } - cp += n; - n_new = dn_comp((char *)data, newcp, rembuflen, - dnptrs, edp); - if (n_new < 0) - goto badend; - newcp += n_new; - newlen += n_new; - rembuflen -= n_new; - dlen = n_new; - n = dn_expand(msg, eom, cp, (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - goto badend; - } - cp += n; - n_new = dn_comp((char *)data, newcp, rembuflen, - dnptrs, edp); - if (n_new < 0) - goto badend; - newcp += n_new; - newlen += n_new; - rembuflen -= n_new; - dlen += n_new; - if (type == T_SOA) { - bcopy(cp, newcp, n = 5*INT32SZ); - cp += n; - newcp += n; - newlen +=n; - rembuflen -= n; - dlen +=n; - } - PUTSHORT(dlen, tempcp); - break; - - case T_MX: - case T_AFSDB: - case T_RT: - /* grab preference */ - bcopy(cp,newcp,INT16SZ); - cp += INT16SZ; - newcp += INT16SZ; - - /* get name */ - n = dn_expand(msg, eom, cp, (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - goto badend; - } - cp += n; - n_new = dn_comp((char *)data, newcp, rembuflen, - dnptrs, edp); - if (n_new < 0) - goto badend; - PUTSHORT(n_new+INT16SZ, tempcp); - newcp += n_new; - newlen += n_new+INT16SZ; - rembuflen -= n_new+INT16SZ; - break; - - case T_PX: - /* grab preference */ - bcopy(cp, newcp, INT16SZ); - cp += INT16SZ; - newcp += INT16SZ; - - /* get first name */ - n = dn_expand(msg, eom, cp, (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - goto badend; - } - cp += n; - n_new = dn_comp((char *)data, newcp, rembuflen, - dnptrs, edp); - if (n_new < 0) - goto badend; - newcp += n_new; - newlen += n_new+INT16SZ; - rembuflen -= n_new+INT16SZ; - dlen = n_new+INT16SZ; - n = dn_expand(msg, eom, cp, (char *)data, sizeof data); - if (n < 0) { - hp->rcode = FORMERR; - goto badend; - } - cp += n; - n_new = dn_comp((char *)data, newcp, rembuflen, - dnptrs, edp); - if (n_new < 0) - goto badend; - newcp += n_new; - newlen += n_new; - rembuflen -= n_new; - dlen += n_new; - PUTSHORT(dlen, tempcp); - break; - - default: - dprintf(3, (ddt, "unknown type %d\n", type)); - goto badend; - } - dprintf(2, (ddt, - "newlen:%d, i:%d newcp:0x%x cp:0x%x\n\n", - newlen, i, newcp, cp)); - } - bcopy(newmsg, msg, newlen); - n = *msglen - newlen; - if (n < 0) { - dprintf(2, (ddt, - "update_msg():newmsg longer than old: n:%d o:%d ???\n", - newlen, *msglen)); - } - *msglen = newlen; - free((char *)newmsg); - -#ifdef DEBUG - if (debug >= 10) - fp_nquery(msg, *msglen, ddt); -#endif - free((char *)RRlen); - return (n); -badend: - dprintf(2, (ddt, "encountered problems: UPDATE_MSG\n")); - free((char *)RRlen); - return (-1); -} -#endif /*BAD_IDEA*/ - -#endif /*VALIDATE*/ diff --git a/contrib/bind/named/pathnames.h b/contrib/bind/named/pathnames.h deleted file mode 100644 index 7ded7d212caa..000000000000 --- a/contrib/bind/named/pathnames.h +++ /dev/null @@ -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 -#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*/ diff --git a/contrib/bind/named/storage.c b/contrib/bind/named/storage.c deleted file mode 100644 index 2fa53cd83f61..000000000000 --- a/contrib/bind/named/storage.c +++ /dev/null @@ -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 -#include -#include - -#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*/ diff --git a/contrib/bind/named/tree.c b/contrib/bind/named/tree.c deleted file mode 100644 index 58607ea0bd48..000000000000 --- a/contrib/bind/named/tree.c +++ /dev/null @@ -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 -#ifndef _PATH_XFER -# include -#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 -} diff --git a/contrib/bind/named/tree.h b/contrib/bind/named/tree.h deleted file mode 100644 index 7d027b948b69..000000000000 --- a/contrib/bind/named/tree.h +++ /dev/null @@ -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 */ diff --git a/contrib/bind/named/tree.man3 b/contrib/bind/named/tree.man3 deleted file mode 100644 index 5be48783e2b6..000000000000 --- a/contrib/bind/named/tree.man3 +++ /dev/null @@ -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. diff --git a/contrib/bind/res/Makefile b/contrib/bind/res/Makefile deleted file mode 100644 index 834d74a9c31d..000000000000 --- a/contrib/bind/res/Makefile +++ /dev/null @@ -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. diff --git a/contrib/bind/res/base64.c b/contrib/bind/res/base64.c deleted file mode 100644 index 868826a777dc..000000000000 --- a/contrib/bind/res/base64.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include - -#include -#include -#include - -#if defined(BSD) && (BSD >= 199103) && defined(AF_INET6) -# include -# include -#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); -} diff --git a/contrib/bind/res/gethnamaddr.c b/contrib/bind/res/gethnamaddr.c deleted file mode 100644 index 4ea4d7e75d2e..000000000000 --- a/contrib/bind/res/gethnamaddr.c +++ /dev/null @@ -1,1008 +0,0 @@ -/* - * ++Copyright++ 1985, 1988, 1993 - * - - * Copyright (c) 1985, 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[] = "@(#)gethostnamadr.c 8.1 (Berkeley) 6/4/93"; -static char rcsid[] = "$Id: gethnamaddr.c,v 8.23 1998/04/07 04:59:46 vixie Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#ifndef LOG_AUTH -# define LOG_AUTH 0 -#endif - -#define MULTI_PTRS_ARE_ALIASES 1 /* XXX - experimental */ - -#if defined(BSD) && (BSD >= 199103) && defined(AF_INET6) -# include -# include -#else -# include "../conf/portability.h" -#endif - -#if defined(USE_OPTIONS_H) -# include <../conf/options.h> -#endif - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -#define MAXALIASES 35 -#define MAXADDRS 35 - -static const char AskedForGot[] = - "gethostby*.getanswer: asked for \"%s\", got \"%s\""; - -static char *h_addr_ptrs[MAXADDRS + 1]; - -static struct hostent host; -static char *host_aliases[MAXALIASES]; -static char hostbuf[8*1024]; -static u_char host_addr[16]; /* IPv4 or IPv6 */ -static FILE *hostf = NULL; -static int stayopen = 0; - -static void map_v4v6_address __P((const char *src, char *dst)); -static void map_v4v6_hostent __P((struct hostent *hp, char **bp, int *len)); - -#ifdef RESOLVSORT -static void addrsort __P((char **, int)); -#endif - -#if PACKETSZ > 1024 -#define MAXPACKET PACKETSZ -#else -#define MAXPACKET 1024 -#endif - -typedef union { - HEADER hdr; - u_char buf[MAXPACKET]; -} querybuf; - -typedef union { - int32_t al; - char ac; -} align; - -extern int h_errno; - -#ifdef DEBUG -static void -dprintf(msg, num) - char *msg; - int num; -{ - if (_res.options & RES_DEBUG) { - int save = errno; - - printf(msg, num); - errno = save; - } -} -#else -# define dprintf(msg, num) /*nada*/ -#endif - -#define BOUNDED_INCR(x) \ - do { \ - cp += x; \ - if (cp > eom) { \ - h_errno = NO_RECOVERY; \ - return (NULL); \ - } \ - } while (0) - -#define BOUNDS_CHECK(ptr, count) \ - do { \ - if ((ptr) + (count) > eom) { \ - h_errno = NO_RECOVERY; \ - return (NULL); \ - } \ - } while (0) - -static struct hostent * -getanswer(answer, anslen, qname, qtype) - const querybuf *answer; - int anslen; - const char *qname; - int qtype; -{ - register const HEADER *hp; - register const u_char *cp; - register int n; - const u_char *eom, *erdata; - char *bp, **ap, **hap; - int type, class, buflen, ancount, qdcount; - int haveanswer, had_error; - int toobig = 0; - char tbuf[MAXDNAME]; - const char *tname; - int (*name_ok) __P((const char *)); - - tname = qname; - host.h_name = NULL; - eom = answer->buf + anslen; - switch (qtype) { - case T_A: - case T_AAAA: - name_ok = res_hnok; - break; - case T_PTR: - name_ok = res_dnok; - break; - default: - return (NULL); /* XXX should be abort(); */ - } - /* - * find first satisfactory answer - */ - hp = &answer->hdr; - ancount = ntohs(hp->ancount); - qdcount = ntohs(hp->qdcount); - bp = hostbuf; - buflen = sizeof hostbuf; - cp = answer->buf; - BOUNDED_INCR(HFIXEDSZ); - if (qdcount != 1) { - h_errno = NO_RECOVERY; - return (NULL); - } - n = dn_expand(answer->buf, eom, cp, bp, buflen); - if ((n < 0) || !(*name_ok)(bp)) { - h_errno = NO_RECOVERY; - return (NULL); - } - BOUNDED_INCR(n + QFIXEDSZ); - if (qtype == T_A || qtype == T_AAAA) { - /* res_send() has already verified that the query name is the - * same as the one we sent; this just gets the expanded name - * (i.e., with the succeeding search-domain tacked on). - */ - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - h_errno = NO_RECOVERY; - return (NULL); - } - host.h_name = bp; - bp += n; - buflen -= n; - /* The qname can be abbreviated, but h_name is now absolute. */ - qname = host.h_name; - } - ap = host_aliases; - *ap = NULL; - host.h_aliases = host_aliases; - hap = h_addr_ptrs; - *hap = NULL; - host.h_addr_list = h_addr_ptrs; - haveanswer = 0; - had_error = 0; - while (ancount-- > 0 && cp < eom && !had_error) { - n = dn_expand(answer->buf, eom, cp, bp, buflen); - if ((n < 0) || !(*name_ok)(bp)) { - had_error++; - continue; - } - cp += n; /* name */ - BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ); - type = _getshort(cp); - cp += INT16SZ; /* type */ - class = _getshort(cp); - cp += INT16SZ + INT32SZ; /* class, TTL */ - n = _getshort(cp); - cp += INT16SZ; /* len */ - BOUNDS_CHECK(cp, n); - erdata = cp + n; - if (class != C_IN) { - /* XXX - debug? syslog? */ - cp += n; - continue; /* XXX - had_error++ ? */ - } - if ((qtype == T_A || qtype == T_AAAA) && type == T_CNAME) { - if (ap >= &host_aliases[MAXALIASES-1]) - continue; - n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); - if ((n < 0) || !(*name_ok)(tbuf)) { - had_error++; - continue; - } - cp += n; - if (cp != erdata) { - h_errno = NO_RECOVERY; - return (NULL); - } - /* Store alias. */ - *ap++ = bp; - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - had_error++; - continue; - } - bp += n; - buflen -= n; - /* Get canonical name. */ - n = strlen(tbuf) + 1; /* for the \0 */ - if (n > buflen || n >= MAXHOSTNAMELEN) { - had_error++; - continue; - } - strcpy(bp, tbuf); - host.h_name = bp; - bp += n; - buflen -= n; - continue; - } - if (qtype == T_PTR && type == T_CNAME) { - n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); - if (n < 0 || !res_dnok(tbuf)) { - had_error++; - continue; - } - cp += n; - if (cp != erdata) { - h_errno = NO_RECOVERY; - return (NULL); - } - /* Get canonical name. */ - n = strlen(tbuf) + 1; /* for the \0 */ - if (n > buflen || n >= MAXHOSTNAMELEN) { - had_error++; - continue; - } - strcpy(bp, tbuf); - tname = bp; - bp += n; - buflen -= n; - continue; - } - if (type != qtype) { - syslog(LOG_NOTICE|LOG_AUTH, - "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", - qname, p_class(C_IN), p_type(qtype), - p_type(type)); - cp += n; - continue; /* XXX - had_error++ ? */ - } - switch (type) { - case T_PTR: - if (strcasecmp(tname, bp) != 0) { - syslog(LOG_NOTICE|LOG_AUTH, - AskedForGot, qname, bp); - cp += n; - continue; /* XXX - had_error++ ? */ - } - n = dn_expand(answer->buf, eom, cp, bp, buflen); - if ((n < 0) || !res_hnok(bp)) { - had_error++; - break; - } -#if MULTI_PTRS_ARE_ALIASES - cp += n; - if (cp != erdata) { - h_errno = NO_RECOVERY; - return (NULL); - } - if (!haveanswer) - host.h_name = bp; - else if (ap < &host_aliases[MAXALIASES-1]) - *ap++ = bp; - else - n = -1; - if (n != -1) { - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - had_error++; - break; - } - bp += n; - buflen -= n; - } - break; -#else - host.h_name = bp; - if (_res.options & RES_USE_INET6) { - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - had_error++; - break; - } - bp += n; - buflen -= n; - map_v4v6_hostent(&host, &bp, &buflen); - } - h_errno = NETDB_SUCCESS; - return (&host); -#endif - case T_A: - case T_AAAA: - if (strcasecmp(host.h_name, bp) != 0) { - syslog(LOG_NOTICE|LOG_AUTH, - AskedForGot, host.h_name, bp); - cp += n; - continue; /* XXX - had_error++ ? */ - } - if (n != host.h_length) { - cp += n; - continue; - } - if (!haveanswer) { - register int nn; - - host.h_name = bp; - nn = strlen(bp) + 1; /* for the \0 */ - bp += nn; - buflen -= nn; - } - - bp += sizeof(align) - ((u_long)bp % sizeof(align)); - - if (bp + n >= &hostbuf[sizeof hostbuf]) { - dprintf("size (%d) too big\n", n); - had_error++; - continue; - } - if (hap >= &h_addr_ptrs[MAXADDRS-1]) { - if (!toobig++) - dprintf("Too many addresses (%d)\n", - MAXADDRS); - cp += n; - continue; - } - bcopy(cp, *hap++ = bp, n); - bp += n; - buflen -= n; - cp += n; - if (cp != erdata) { - h_errno = NO_RECOVERY; - return (NULL); - } - break; - default: - abort(); - } - if (!had_error) - haveanswer++; - } - if (haveanswer) { - *ap = NULL; - *hap = NULL; -# if defined(RESOLVSORT) - /* - * Note: we sort even if host can take only one address - * in its return structures - should give it the "best" - * address in that case, not some random one - */ - if (_res.nsort && haveanswer > 1 && qtype == T_A) - addrsort(h_addr_ptrs, haveanswer); -# endif /*RESOLVSORT*/ - if (!host.h_name) { - n = strlen(qname) + 1; /* for the \0 */ - if (n > buflen || n >= MAXHOSTNAMELEN) - goto no_recovery; - strcpy(bp, qname); - host.h_name = bp; - bp += n; - buflen -= n; - } - if (_res.options & RES_USE_INET6) - map_v4v6_hostent(&host, &bp, &buflen); - h_errno = NETDB_SUCCESS; - return (&host); - } - no_recovery: - h_errno = NO_RECOVERY; - return (NULL); -} - -struct hostent * -gethostbyname(name) - const char *name; -{ - struct hostent *hp; - - if ((_res.options & RES_INIT) == 0 && res_init() == -1) { - h_errno = NETDB_INTERNAL; - return (NULL); - } - if (_res.options & RES_USE_INET6) { - hp = gethostbyname2(name, AF_INET6); - if (hp) - return (hp); - } - return (gethostbyname2(name, AF_INET)); -} - -struct hostent * -gethostbyname2(name, af) - const char *name; - int af; -{ - querybuf buf; - register const char *cp; - char *bp; - int n, size, type, len; - extern struct hostent *_gethtbyname2(); - - if ((_res.options & RES_INIT) == 0 && res_init() == -1) { - h_errno = NETDB_INTERNAL; - return (NULL); - } - - switch (af) { - case AF_INET: - size = INADDRSZ; - type = T_A; - break; - case AF_INET6: - size = IN6ADDRSZ; - type = T_AAAA; - break; - default: - h_errno = NETDB_INTERNAL; - errno = EAFNOSUPPORT; - return (NULL); - } - - host.h_addrtype = af; - host.h_length = size; - - /* - * if there aren't any dots, it could be a user-level alias. - * this is also done in res_query() since we are not the only - * function that looks up host names. - */ - if (!strchr(name, '.') && (cp = __hostalias(name))) - name = cp; - - /* - * disallow names consisting only of digits/dots, unless - * they end in a dot. - */ - if (isdigit(name[0])) - for (cp = name;; ++cp) { - if (!*cp) { - if (*--cp == '.') - break; - /* - * All-numeric, no dot at the end. - * Fake up a hostent as if we'd actually - * done a lookup. - */ - if (inet_pton(af, name, host_addr) <= 0) { - h_errno = HOST_NOT_FOUND; - return (NULL); - } - strncpy(hostbuf, name, MAXDNAME); - hostbuf[MAXDNAME] = '\0'; - bp = hostbuf + MAXDNAME; - len = sizeof hostbuf - MAXDNAME; - host.h_name = hostbuf; - host.h_aliases = host_aliases; - host_aliases[0] = NULL; - h_addr_ptrs[0] = (char *)host_addr; - h_addr_ptrs[1] = NULL; - host.h_addr_list = h_addr_ptrs; - if (_res.options & RES_USE_INET6) - map_v4v6_hostent(&host, &bp, &len); - h_errno = NETDB_SUCCESS; - return (&host); - } - if (!isdigit(*cp) && *cp != '.') - break; - } - if ((isxdigit(name[0]) && strchr(name, ':') != NULL) || - name[0] == ':') - for (cp = name;; ++cp) { - if (!*cp) { - if (*--cp == '.') - break; - /* - * All-IPv6-legal, no dot at the end. - * Fake up a hostent as if we'd actually - * done a lookup. - */ - if (inet_pton(af, name, host_addr) <= 0) { - h_errno = HOST_NOT_FOUND; - return (NULL); - } - strncpy(hostbuf, name, MAXDNAME); - hostbuf[MAXDNAME] = '\0'; - bp = hostbuf + MAXDNAME; - len = sizeof hostbuf - MAXDNAME; - host.h_name = hostbuf; - host.h_aliases = host_aliases; - host_aliases[0] = NULL; - h_addr_ptrs[0] = (char *)host_addr; - h_addr_ptrs[1] = NULL; - host.h_addr_list = h_addr_ptrs; - h_errno = NETDB_SUCCESS; - return (&host); - } - if (!isxdigit(*cp) && *cp != ':' && *cp != '.') - break; - } - - if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf))) < 0) { - dprintf("res_search failed (%d)\n", n); - if (errno == ECONNREFUSED) - return (_gethtbyname2(name, af)); - return (NULL); - } - return (getanswer(&buf, n, name, type)); -} - -struct hostent * -gethostbyaddr(addr, len, af) - const char *addr; /* XXX should have been def'd as u_char! */ - int len, af; -{ - const u_char *uaddr = (const u_char *)addr; - static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; - static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; - int n, size; - querybuf buf; - register struct hostent *hp; - char qbuf[MAXDNAME+1], *qp; -#ifdef SUNSECURITY - register struct hostent *rhp; - char **haddr; - u_long old_options; - char hname2[MAXDNAME+1]; -#endif /*SUNSECURITY*/ - extern struct hostent *_gethtbyaddr(); - - if ((_res.options & RES_INIT) == 0 && res_init() == -1) { - h_errno = NETDB_INTERNAL; - return (NULL); - } - if (af == AF_INET6 && len == IN6ADDRSZ && - (!bcmp(uaddr, mapped, sizeof mapped) || - !bcmp(uaddr, tunnelled, sizeof tunnelled))) { - /* Unmap. */ - addr += sizeof mapped; - uaddr += sizeof mapped; - af = AF_INET; - len = INADDRSZ; - } - switch (af) { - case AF_INET: - size = INADDRSZ; - break; - case AF_INET6: - size = IN6ADDRSZ; - break; - default: - errno = EAFNOSUPPORT; - h_errno = NETDB_INTERNAL; - return (NULL); - } - if (size != len) { - errno = EINVAL; - h_errno = NETDB_INTERNAL; - return (NULL); - } - switch (af) { - case AF_INET: - (void) sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", - (uaddr[3] & 0xff), - (uaddr[2] & 0xff), - (uaddr[1] & 0xff), - (uaddr[0] & 0xff)); - break; - case AF_INET6: - qp = qbuf; - for (n = IN6ADDRSZ - 1; n >= 0; n--) { - qp += SPRINTF((qp, "%x.%x.", - uaddr[n] & 0xf, - (uaddr[n] >> 4) & 0xf)); - } - strcpy(qp, "ip6.int"); - break; - default: - abort(); - } - n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf); - if (n < 0) { - dprintf("res_query failed (%d)\n", n); - if (errno == ECONNREFUSED) - return (_gethtbyaddr(addr, len, af)); - return (NULL); - } - if (!(hp = getanswer(&buf, n, qbuf, T_PTR))) - return (NULL); /* h_errno was set by getanswer() */ -#ifdef SUNSECURITY - if (af == AF_INET) { - /* - * turn off search as the name should be absolute, - * 'localhost' should be matched by defnames - */ - strncpy(hname2, hp->h_name, MAXDNAME); - hname2[MAXDNAME] = '\0'; - old_options = _res.options; - _res.options &= ~RES_DNSRCH; - _res.options |= RES_DEFNAMES; - if (!(rhp = gethostbyname(hname2))) { - syslog(LOG_NOTICE|LOG_AUTH, - "gethostbyaddr: No A record for %s (verifying [%s])", - hname2, inet_ntoa(*((struct in_addr *)addr))); - _res.options = old_options; - h_errno = HOST_NOT_FOUND; - return (NULL); - } - _res.options = old_options; - for (haddr = rhp->h_addr_list; *haddr; haddr++) - if (!memcmp(*haddr, addr, INADDRSZ)) - break; - if (!*haddr) { - syslog(LOG_NOTICE|LOG_AUTH, - "gethostbyaddr: A record of %s != PTR record [%s]", - hname2, inet_ntoa(*((struct in_addr *)addr))); - h_errno = HOST_NOT_FOUND; - return (NULL); - } - } -#endif /*SUNSECURITY*/ - hp->h_addrtype = af; - hp->h_length = len; - bcopy(addr, host_addr, len); - h_addr_ptrs[0] = (char *)host_addr; - h_addr_ptrs[1] = NULL; - if (af == AF_INET && (_res.options & RES_USE_INET6)) { - map_v4v6_address((char*)host_addr, (char*)host_addr); - hp->h_addrtype = AF_INET6; - hp->h_length = IN6ADDRSZ; - } - h_errno = NETDB_SUCCESS; - return (hp); -} - -void -_sethtent(f) - int f; -{ - if (!hostf) - hostf = fopen(_PATH_HOSTS, "r" ); - else - rewind(hostf); - stayopen = f; -} - -void -_endhtent() -{ - if (hostf && !stayopen) { - (void) fclose(hostf); - hostf = NULL; - } -} - -struct hostent * -_gethtent() -{ - char *p; - register char *cp, **q; - int af, len; - - if (!hostf && !(hostf = fopen(_PATH_HOSTS, "r" ))) { - h_errno = NETDB_INTERNAL; - return (NULL); - } - again: - if (!(p = fgets(hostbuf, sizeof hostbuf, hostf))) { - h_errno = HOST_NOT_FOUND; - return (NULL); - } - if (*p == '#') - goto again; - if (!(cp = strpbrk(p, "#\n"))) - goto again; - *cp = '\0'; - if (!(cp = strpbrk(p, " \t"))) - goto again; - *cp++ = '\0'; - if (inet_pton(AF_INET6, p, host_addr) > 0) { - af = AF_INET6; - len = IN6ADDRSZ; - } else if (inet_pton(AF_INET, p, host_addr) > 0) { - if (_res.options & RES_USE_INET6) { - map_v4v6_address((char*)host_addr, (char*)host_addr); - af = AF_INET6; - len = IN6ADDRSZ; - } else { - af = AF_INET; - len = INADDRSZ; - } - } else { - goto again; - } - h_addr_ptrs[0] = (char *)host_addr; - h_addr_ptrs[1] = NULL; - host.h_addr_list = h_addr_ptrs; - host.h_length = len; - host.h_addrtype = af; - while (*cp == ' ' || *cp == '\t') - cp++; - host.h_name = cp; - q = host.h_aliases = host_aliases; - if (cp = strpbrk(cp, " \t")) - *cp++ = '\0'; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &host_aliases[MAXALIASES - 1]) - *q++ = cp; - if (cp = strpbrk(cp, " \t")) - *cp++ = '\0'; - } - *q = NULL; - h_errno = NETDB_SUCCESS; - return (&host); -} - -struct hostent * -_gethtbyname(name) - const char *name; -{ - extern struct hostent *_gethtbyname2(); - struct hostent *hp; - - if (_res.options & RES_USE_INET6) { - hp = _gethtbyname2(name, AF_INET6); - if (hp) - return (hp); - } - return (_gethtbyname2(name, AF_INET)); -} - -struct hostent * -_gethtbyname2(name, af) - const char *name; - int af; -{ - register struct hostent *p; - register char **cp; - - _sethtent(0); - while (p = _gethtent()) { - if (p->h_addrtype != af) - continue; - if (strcasecmp(p->h_name, name) == 0) - break; - for (cp = p->h_aliases; *cp != 0; cp++) - if (strcasecmp(*cp, name) == 0) - goto found; - } - found: - _endhtent(); - return (p); -} - -struct hostent * -_gethtbyaddr(addr, len, af) - const char *addr; - int len, af; -{ - register struct hostent *p; - - _sethtent(0); - while (p = _gethtent()) - if (p->h_addrtype == af && !bcmp(p->h_addr, addr, len)) - break; - _endhtent(); - return (p); -} - -static void -map_v4v6_address(src, dst) - const char *src; - char *dst; -{ - u_char *p = (u_char *)dst; - char tmp[INADDRSZ]; - int i; - - /* Stash a temporary copy so our caller can update in place. */ - bcopy(src, tmp, INADDRSZ); - /* Mark this ipv6 addr as a mapped ipv4. */ - for (i = 0; i < 10; i++) - *p++ = 0x00; - *p++ = 0xff; - *p++ = 0xff; - /* Retrieve the saved copy and we're done. */ - bcopy(tmp, (void*)p, INADDRSZ); -} - -static void -map_v4v6_hostent(hp, bpp, lenp) - struct hostent *hp; - char **bpp; - int *lenp; -{ - char **ap; - - if (hp->h_addrtype != AF_INET || hp->h_length != INADDRSZ) - return; - hp->h_addrtype = AF_INET6; - hp->h_length = IN6ADDRSZ; - for (ap = hp->h_addr_list; *ap; ap++) { - int i = sizeof(align) - ((u_long)*bpp % sizeof(align)); - - if (*lenp < (i + IN6ADDRSZ)) { - /* Out of memory. Truncate address list here. XXX */ - *ap = NULL; - return; - } - *bpp += i; - *lenp -= i; - map_v4v6_address(*ap, *bpp); - *ap = *bpp; - *bpp += IN6ADDRSZ; - *lenp -= IN6ADDRSZ; - } -} - -#ifdef RESOLVSORT -static void -addrsort(ap, num) - char **ap; - int num; -{ - int i, j; - char **p; - short aval[MAXADDRS]; - int needsort = 0; - - p = ap; - for (i = 0; i < num; i++, p++) { - for (j = 0 ; (unsigned)j < _res.nsort; j++) - if (_res.sort_list[j].addr.s_addr == - (((struct in_addr *)(*p))->s_addr & _res.sort_list[j].mask)) - break; - aval[i] = j; - if (needsort == 0 && i > 0 && j < aval[i-1]) - needsort = i; - } - if (!needsort) - return; - - while (needsort < num) { - for (j = needsort - 1; j >= 0; j--) { - if (aval[j] > aval[j+1]) { - char *hp; - - i = aval[j]; - aval[j] = aval[j+1]; - aval[j+1] = i; - - hp = ap[j]; - ap[j] = ap[j+1]; - ap[j+1] = hp; - - } else - break; - } - needsort++; - } -} -#endif - -#if defined(BSD43_BSD43_NFS) || defined(sun) -/* some libc's out there are bound internally to these names (UMIPS) */ -void -ht_sethostent(stayopen) - int stayopen; -{ - _sethtent(stayopen); -} - -void -ht_endhostent() -{ - _endhtent(); -} - -struct hostent * -ht_gethostbyname(name) - char *name; -{ - return (_gethtbyname(name)); -} - -struct hostent * -ht_gethostbyaddr(addr, len, af) - const char *addr; - int len, af; -{ - return (_gethtbyaddr(addr, len, af)); -} - -struct hostent * -gethostent() -{ - return (_gethtent()); -} - -void -dns_service() -{ - return; -} - -#undef dn_skipname -dn_skipname(comp_dn, eom) - const u_char *comp_dn, *eom; -{ - return (__dn_skipname(comp_dn, eom)); -} -#endif /*old-style libc with yp junk in it*/ diff --git a/contrib/bind/res/getnetbyaddr.c b/contrib/bind/res/getnetbyaddr.c deleted file mode 100644 index b8477301a6bf..000000000000 --- a/contrib/bind/res/getnetbyaddr.c +++ /dev/null @@ -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 - -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); -} diff --git a/contrib/bind/res/getnetbyname.c b/contrib/bind/res/getnetbyname.c deleted file mode 100644 index 6bf450d5b40e..000000000000 --- a/contrib/bind/res/getnetbyname.c +++ /dev/null @@ -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 -#include - -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); -} diff --git a/contrib/bind/res/getnetent.c b/contrib/bind/res/getnetent.c deleted file mode 100644 index 18e5d26f601d..000000000000 --- a/contrib/bind/res/getnetent.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#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); -} diff --git a/contrib/bind/res/getnetnamadr.c b/contrib/bind/res/getnetnamadr.c deleted file mode 100644 index d9f06f1f50c1..000000000000 --- a/contrib/bind/res/getnetnamadr.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -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)); -} diff --git a/contrib/bind/res/herror.c b/contrib/bind/res/herror.c deleted file mode 100644 index 6d88b49285f6..000000000000 --- a/contrib/bind/res/herror.c +++ /dev/null @@ -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 -#include -#include -#include -#if defined(BSD) && (BSD >= 199103) -# include -# include -#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"); -} diff --git a/contrib/bind/res/hostnamelen.c b/contrib/bind/res/hostnamelen.c deleted file mode 100644 index 93880627fda2..000000000000 --- a/contrib/bind/res/hostnamelen.c +++ /dev/null @@ -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 -#include -#include -#include -#include - -#if defined(BSD) && (BSD >= 199103) -# include -#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 diff --git a/contrib/bind/res/inet_addr.c b/contrib/bind/res/inet_addr.c deleted file mode 100644 index 6f668699b80f..000000000000 --- a/contrib/bind/res/inet_addr.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#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); -} diff --git a/contrib/bind/res/inet_net_ntop.c b/contrib/bind/res/inet_net_ntop.c deleted file mode 100644 index ff948ff799a4..000000000000 --- a/contrib/bind/res/inet_net_ntop.c +++ /dev/null @@ -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 -#include -#include -#include - -#include -#include -#include -#include - -#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); -} diff --git a/contrib/bind/res/inet_net_pton.c b/contrib/bind/res/inet_net_pton.c deleted file mode 100644 index 5dfb1329c819..000000000000 --- a/contrib/bind/res/inet_net_pton.c +++ /dev/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 -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#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); -} diff --git a/contrib/bind/res/inet_neta.c b/contrib/bind/res/inet_neta.c deleted file mode 100644 index 098059bc017e..000000000000 --- a/contrib/bind/res/inet_neta.c +++ /dev/null @@ -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 -#include -#include -#include - -#include -#include - -#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); -} diff --git a/contrib/bind/res/inet_ntop.c b/contrib/bind/res/inet_ntop.c deleted file mode 100644 index 3fd85060e2a4..000000000000 --- a/contrib/bind/res/inet_ntop.c +++ /dev/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 -#include -#include -#include -#include -#include -#include -#include -#include -#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); -} diff --git a/contrib/bind/res/inet_pton.c b/contrib/bind/res/inet_pton.c deleted file mode 100644 index 244107bfdd42..000000000000 --- a/contrib/bind/res/inet_pton.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include -#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); -} diff --git a/contrib/bind/res/nsap_addr.c b/contrib/bind/res/nsap_addr.c deleted file mode 100644 index 162961a3b13e..000000000000 --- a/contrib/bind/res/nsap_addr.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include - -#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); -} diff --git a/contrib/bind/res/res_comp.c b/contrib/bind/res/res_comp.c deleted file mode 100644 index 62127904c381..000000000000 --- a/contrib/bind/res/res_comp.c +++ /dev/null @@ -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 -#include -#include -#include - -#include -#include -#include -#include - -#if defined(BSD) && (BSD >= 199103) -# include -# include -#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