diff options
author | peter <peter@FreeBSD.org> | 1996-08-29 21:38:16 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1996-08-29 21:38:16 +0000 |
commit | e9b0417229bf60d446d18d81acd84493abebc875 (patch) | |
tree | 6365f80151952093209df910a1249a090c9ae84c /usr.sbin/named | |
parent | f868347963d18183249f939fde7a2017b8735561 (diff) | |
download | FreeBSD-src-e9b0417229bf60d446d18d81acd84493abebc875.zip FreeBSD-src-e9b0417229bf60d446d18d81acd84493abebc875.tar.gz |
Revert back to building bind-4.9.4-P1 in seperate directories...
Diffstat (limited to 'usr.sbin/named')
53 files changed, 107 insertions, 25398 deletions
diff --git a/usr.sbin/named/CHANGES b/usr.sbin/named/CHANGES deleted file mode 100644 index dcee379..0000000 --- a/usr.sbin/named/CHANGES +++ /dev/null @@ -1,2408 +0,0 @@ -$Id: CHANGES,v 8.27 1996/01/09 20:23:45 vixie Exp $ - - --- 4.9.3-p1 released --- - -575. [port] Ultrix/Hesiod named responses are oversized, we were - incorrectly accepting them and then overwriting the stack. - -574. [port] BSD/OS 2.1 required some ./BSD/Makefile changes. - - --- 4.9.3-rel released --- - -573. [contrib] put in "951231" version of contrib/host. - -572. [doc] new file doc/info/SCO-2 concerning <sys/param.h> porting. - -571. [bug] zones whose master files contained only $INCLUDEs were - incorrectly considered to not have any RR's (old bug.) - -570. [doc] trivial man/named.8 tweak. - -569. [doc] minor documentation tweak to shres/solaris/ISSUES. - - --- 4.9.3-beta34 released --- - -568. [bug] very minor initialization bug fixed in tools/dig.c. - -567. [bug] disabled VALIDATE; all this code is trash and will be removed - along with ALLOW_UPDATES very early in the next alpha cycle. - we are now back to the B26 level of stability, with several - minor bug fixes from intervening betas. - -566. [bug] fixed memory leak introduced in #565. - - --- 4.9.3-beta33 released --- - -565. [proto] we were generating truncated RRsets due to VALIDATE bugs. - -564. [proto] we weren't stopping early enough on some kinds of truncation. - -563. [doc] added doc/info/Solaris, concerning Sun Patch-ID# 102165-02. - -562. [bug] named/ns_resp.c had an overzealous #ifdef. - -561. [port] tools/nslookup/getinfo.c had an ANSI C nit. - -560. [port] shres/netbsd and Makefile's netbsd stuff was wrong. - -559. [doc] shres/* documentation had more pathname problems. - -558. [port] SCO OSE5 portability problem (minor). - -557. [doc] added doc/misc/style.txt out of my archives. - -556. [contrib] updated contrib/arlib, contrib/dnsparse (really!). - -555. [bug] quoted newlines were still broken even after #509. - -554. [bug] dangling CNAME cache chains could make named dump core. - -553. [bug] forwarders didn't work well with VALIDATE. - - --- 4.9.3-beta32 released --- - -552. [doc] ./Makefile had some out of date comments. - -551. [bug] shres/sunos/* needed some fine tuning. - -550. [contrib] contrib/dnsparse replaced with a later version. - - --- 4.9.3-beta31 released --- - -549. [bug] "make links" hadn't been tested in a while; shres/* req'd chg. - -548. [bug] shres/sunos/* needed some fixups due to a late Sun patch. - -547. [doc] Makefile comments for Linux were out of date. - -546. [doc] OPTIONS had an incorrect path name and some factual errors. - -545. [bug] shres/sunos/Makefile had some incorrect path names. - - --- 4.9.3-beta30 released --- - -544. [port] some systems with broken CPP's wouldn't compile ns_req.c. - -543. [bug] query restart bug in ns_resp.c. - - --- 4.9.3-beta29 released --- - -542. [port] rearranged signal() calls to make POSIX + SYSV possible. - -541. [port] padded _res to 512 bytes; moved initialized data to res_data.c. - -540. [port] added experimental shres/netbsd/ directory. - -539. [bug] we weren't able to load 0 ttl's in zone files. - -538. [doc] BOG corrections. - - --- 4.9.3-beta28 never released --- - -537. [contrib] new contrib/lamers/ directory. - -536. [bug] there was a possible deadlock condition over missing glue. - -535. [bug] previous patch to db_load() was misapplied. - -534. [bug] several ancient cache corruption bugs fixed in ns_resp(). - -533. [root] root servers required a new ``no-fetch-glue'' option. - -532. [bug] all kinds of stuff was broken under shres/ due to new subdir. - - --- 4.9.3-beta27 released --- - -531. [bug] limited support for labels containing \. (literal dot.) - -530. [bug] new root.cache file imported from internic. - -529. [bug] another set of bug fixes to the zone transfer scheduler. - -528. [bug] VALIDATE reenabled but without packet editing. - -527. [bug] glue passing through CNAMEs will now be cached properly. - -526. [bug] deleted zones should no longer cause core dumps. - -525. [func] several messages changed to be more informative. - -524. [bug] loc_ntoa() was returning a pointer to a stack variable. - -523. [bug] wildcard RR's were being deleted by purge_zone(). - -522. [bug] "ndc start" didn't work if no pid file existed. - -521. [port] Sun SVR4 fixes, including shared library support. - -520. [bug] we weren't using "forwarders" if "options forward_only" - wasn't set (in some cases.) - -519. [bug] named-xfer wasn't called res_init(). - -518. [bug] lots of byte order nits. - -517. [bug] "tools/host -a" now prints in RR format again. - -516. [proto] minimum TTL changes from five minutes to zero seconds. - -515. [bug] SOA TTL of zero is no longer considered an error. - -514. [bug] division by zero error corrected in ns_refreshtime(). - -513. [bug] we had the #ifdefs nexted backwards in <netdb.h>. - -512. [bug] we were able to dump core while tracing due to a NULL pointer. - -511. [bug] DiG wasn't able to suppress all of res_debug.c's comments. - -510. [doc] BOG typos. new doc/misc/FAQ. new site in MIRRORS. - -509. [bug] another side effect of the inet_aton() change was fixed, - this time it was breaking escaped newlines in named.boot. - -508. [contrib] new contrib/host, contrib/misc/settransfer, contrib/msql. - contrib/umich/lame_delegation was withdrawn by the author. - -507. [bug] DiG didn't do ndots and was trigger happy about options. - -506. [port] NextStep, Interactive, SCO, Digital UNIX, ULTRIX improvements. - -505. [bug] we were overly restrictive about nonauthoritative NXDOMAINs. - -504. [bug] named was generating corrupt responses in au truncation. - -503. [port] shres/* now supports SunOS 4.1.4. - -502. [bug] nslookup wasn't behaving properly in the presence of "ndots". - -501. [bug] we now delay 5 seconds after an "ndc restart" or "ndc start". - -500. [bug] change #494 was incomplete. - - --- 4.9.3-beta26 released --- - -499. [bug] we needed a SERVFAIL in an error case. - -498. [bug] some recently added byte order bugs were stomped; - data_inaddr() was made slightly more conservative. - -497. [port] local_hostname_length() moved to its own source file. - -496. [bug] Beta25's change to compat/Makefile was wrong. - -495. [bug] tools/host.c wasn't processing cnames properly. - - --- 4.9.3-beta25 released --- - -494. [func] "include" directive in boot file is no longer fatal if the - specified file doesn't exist or is not readable. - -493. [bug] new interfaces' UDP sockets weren't affecting select()'s mask. - -492. [doc] another round of changes and cleanups to the BOG. - -491. [bug] various cleanups to lame server detection. - -490. [port] completely new shres/* from CKD. - -489. [doc] added a ***NOTE*** to ./INSTALL about operating system files. - -488. [port] GNU C Library changes for include/netdb.h. - -487. [func] named will try a little bit longer to bind() its stream socket. - -486. [contrib] new packages: contrib/inaddrtool and contrib/trnamed. - -485. [func] ns_forw will no longer forward to 0.0.0.0, 255.255.255.255, - or 127.0.0.1. - -484. [port] more POSIX_SIGNALS conversions. - -483. [bug] compat/Makefile wasn't passing on all definitions to submakes. - -482. [port] bad bug in NeXT C Library worked around. - -481. [doc] RFC 1794 is now included in doc/rfc. - -480. [bug] a debugging printf() was accessing freed memory. - -479. [port] doc/info/NCR has been replaced. - -478. [port] doc/info/interactive has been replaced by its author. - -477. [port] UNIXWARE 2.X changes. - -476. [bug] ns_init.c was creating files in "//tmp" rather than "/tmp". - -475. [bug] inet_aton() reverts to mostly previous behaviour. - -474. [bug] PTR->CNAME support added; name test fixed. - -473. [func] added gethostbyname2(), improved its man page. - -472. [port] Linux connect() can reconnect, res/res_send.c now knows this. - -471. [build] several "clean" targets were not removing ".depend" files. - -470. [bug] dqflush() was using memory after free()ing it and never closing - any file descriptors and not clearing select()'s mask bits. - - --- 4.9.3-beta24 released --- - -469. [bug] We no longer share static return buffers across functions in - res_debug.c. - -468. [logging] An extraneous haveComplained() was removed from ns_resp.c. - -467. [portdoc] Linux build doc changes. - - --- 4.9.3-beta23 released --- - -466. [doc] big reorg to BOG. - -465. [doc] minor corrections to man pages. - -464. [port] NEC Makefile changes. - -463. [contrib] random updates. - -462. [bug] res_send() wasn't always clearing errno, which led to - false-negative return conditions. - -461. [port] minor u_char-vs-char lint removed. - -460. [port] backed out a recent Linux portability change. - - --- 4.9.3-beta22 released --- - -459. [port] made a major lint pass. - -458. [func] paved over a bad security hole in named-xfer. - -457. [bug] negative caching vs (secure_zone | cname checking) bugs. - -456. [port] moved all:: target to be first in top level Makefile. - -455. [bug] res/res_send.c had a bad macro definition. - -454. [doc] RUNSON moved to doc/info. MIRRORS file added. - -453. [quality] learntFrom() was reformatted. - -452. [doc] minor changes for shlib/ISSUES, tools/nslookup/nslookup.help. - -451. [port] linux, NCR, Solaris, NExT portability changes. - -450. [func] added RES_NOALIASES flag, needed for security. - -449. [bug] we were defining a nonstandard DNS header flag as PR. no more. - - --- 4.9.3-beta21 released --- - -448. [port] systems with hundreds of network interfaces need big ioctl()'s. - -447. [func] zones without NS RR's or with mismatching SOA RR's are caught. - -446. [bug] miscellaneous fixes to res/gethnamaddr.c. - -445. [bug] the secure_zone logic was incomplete. - -444. [bug] bootfile "options" parsing was broken. - -443. [bug] named-xfer was munging incoming WKS RR's. - -442. [contrib] various cleanups. - - --- 4.9.3-beta20 released --- - -441. [contrib] put in DOC 2.1.1. - -440. [func] change/addition to the "lame delegation" syslog message. - -439. [bug] emulation macros WIFSIGNALED and WIFEXITED were bogus. - -438. [bug] missing "#ifndef INVQ" added. - -437. [doc] man pages and BOG updated to include new B18/B19 features. - -436. [port] PIDDIR definition removed from Solaris 2.X. - -435. [port] shres/Makefile fixed for new location of inet_addr.c. - -434. [port] getnetnamaddr.c had a spurious "#if defined(sun)" - -433. [bugs] random typos and glitches from the beta19 afternoon rush. - - --- 4.9.3-beta19 released --- - -432. [func] we should be much more resistant to root cache corruption now. - -431. [bug] tcp socket send buffer will now be set at 16K to avoid blocks. - -430. [bug] ns_req.c had two cases where it could overflow a buffer. - -429. [bug] the "." zone will now respect the setting of NO_GLUE. - -428. [func] 0.0.0.0 A RR's are allowed in the DB but we won't use them. - -427. [func] "options fake-iquery" added, users of Sun nslookup take note. - -426. [port] include/netdb.h now has some #ifdef sun defs in it. - -425. [bug] negative caching bugs in findns() and in ns_forw.c. - -424. [func] "limit transfers-per-ns" directive added. - -423. [bug] infinite loop fixed in named-xfer.c's version number printing. - -422. [bug] gethostbyname() of a dotted quad in an auto variable will - no longer cause the caller to consume random stack trash. - -421. [port] inet_aton() has moved from lib44bsd.a back to libresolv.a. - -420. [func] any punctuation character can now terminate an inet_aton(). - -419. [port] use sigemptyset(), sigaddset() - in preference to sigmask(). - - --- 4.9.3-beta18 released --- - -418. [bug] ``close(11): interrupted system call'' now fixed. - -417. [bug] big name servers would never refresh all their zones since - tryxfer() wasn't a "fair" scheduler. it is now. - -416. [func] SOA syntax errors will now lead to dead zones, not dead srvrs. - -415. [func] expiration values lower than refresh values cause a warning. - -414. [func] added "options" and "limit" directives to named.boot. - -413. [port] new file: doc/info/solaris.too. - -412. [bug] possible div-by-zero in ns_init.c. - -411. [port] NeXTstep, UNIXWARE, ISC, AUX changes/additions to top Makefile. - -410. [port] POSIX_SIGNALS covers a bit more code now. - -409. [bug] CNAME->PTR responses were triggering syslog() unnecessarily. - -408. [port] res_send.c's socket() calls were using the wrong arguments. - this was benign but with IPv6 looming, we need to clean it up. - -407. [bug] the delayed free() logic (DATUMREFCNT) didn't account for - the possibility of some NULL pointers, in ns_resp.c. - -406. [bug] we were walking through purged list items in ns_forw.c. - this caused bad things to happen when glue expired. - -405. [bug] "attempted update to auth zone" is no longer a warning. - -404. [bug] fp_nquery() is now used everywhere, fp_query() is deprecated. - -403. [port] hstrerror()'s result is now declared as const. - -402. [bug] a flakey initialization in the resolver has been fixed. - -401. [port] removed some junk around getnetbyname(), needs testing on suns. - -400. [func] BIND's version number now appears as a comment in zone files - written by named-xfer. - -399. [func] older, bogus HINFO RR's will now be fixed up with warnings. - -398. [bug] "SOA class not same as zone's" is now a zone load error. - -397. [func] all of the syslog() priorities have been lowered. - -396. [doc] added doc/misc/{FAQ.1of2,FAQ.2of2,vixie-security.ps}. - -368. [port] top level Makefile updates: .depend files aren't shipped; - solaris, linux, dec osf/1, dynix build more cleanly. - -367. [port] LOC RR logic has had some lint removed. also named-xfer.c. - -366. [contrib] dnswalk 1.8.3 is now included. - -365. [security] initial query ID is no longer a fixed constant. - - --- 4.9.3-beta17 released --- - -364. named/ndc.sh didn't always exit with nonzero on errors. - -363. include/arpa/Makefile was installing into //. - -362. convex cleanups. osf/1 cleanups. - -361. minor nit in sprintf() format string in tools/host.c. - - --- 4.9.3-beta16 released --- - -360. CRED is long gone. - -359. convex systems have getrusage(). - -358. CPPFLAGS wasn't quite right. - - --- 4.9.3-beta15 released --- - -357. netdb.h now externs h_errno. - -356. fixed odd corner case bug in res_query(). - -355. no BIND beta is complete without a patch to shres/PROBLEMS. - -354. minor addition to the "ndc" command line syntax. - -353. "." domain syslog() raised from LOG_DEBUG to LOG_WARNING. - -352. minor nit in named-xfer.c. - -351. the BSD/* Makefiles were mode 440, are now 444. - -350. new (undocumented) make target: "make mkdirs". - -349. output format change in tools/host.c. - -348. contrib/* updates. - -347. CPPFLAGS variable added to the Makefile tree, should quieten some makes. - nextstep, solaris, and svr4 systems have some new build parameters. - -346. BOG cleanups and addition of PX RR documentation. - -345. more items for RUNSON. - -344. several combinations and permutations of compilation options didn't work. - - --- 4.9.3-beta14 released --- - -343. Type cast fix for #340. - -343. Small change to RUNSON. - -342. Removed fsync() call, it really wasn't nec'y and was causing trouble. - - --- 4.9.3-beta13 released --- - -341. Small fix for #331. - -340. Inverse queries, if enabled, will be logged if QRYLOG is enabled and on. - -339. Nonrecursive servers (-r) will once again sysquery() for missing glue. - -338. named/ndc now preserves the user's $PATH. - -337. SUNSECURITY is now only on for shres/*. - -336. New version of contrib/host has been included. - -335. tools/nsquery.c and tools/nstest.c were moved to contrib/old/. - -334. Portability changes for HP-UX, Solaris, Linux, SCO UNIX. - -333. INVQ (inverse query support) now defaults to "off". - -332. Some of the internal hashing logic for syslog() rate limiting was not - accurate (more things were logged than should have been). - - --- 4.9.3-beta12-patch2 released --- - -331. Default domain in $INCLUDE files is now intuitive (rather than "."). - -330. Lame delegations are now only logged for class "IN". - -329. Format change to XSTATS output to make it more readable. - -328. Bad responses could cause core dumps in DiG, nslookup, etc. - -327. The now-requisite change to shres/* was discovered and put in. - -326. Portability changes for Linux, SCO, ULTRIX3, NeXT. - -325. Bit the bullet and reset all the RCS revision numbers to 8.1==4.9.3.b12. - - --- 4.9.3-beta12-patch1 released --- - -324. Added some missing pieces to the NSAP and NSAP_PTR handling. - -323. Tightened some of the GEN_AXFR code, fixed potential C_HS problem. - -322. Fixed minor niggle in the way "dig" parses its arguments. - -321. Final(?) tuning of the SunOS shres stuff. - -320. Reorganized the SunOS build params in the top level Makefile. - - --- 4.9.3-beta12 released --- - -319. Fixed DiG so that ". IN NS" was the default if no args are given. (Vixie) - -318. Merged the resolver with 4.4BSD's; made a BSD/ subdirectory off the main - tree for easy integration into BSD/OS, FreeBSD, NetBSD, et al; moved the - "master" subdirectory to "conf/master" to cut down on top level clutter. - -317. Lots of last minute fiddling to make Beta12 "right". (cast of thousands) - -316. Minor byte order bug in BIND_NOTIFY. (Grange) - -315. Added code to db_load() to detect "no RR's found" case. (Vixie; Heiney) - -314. "Zone declared more than once" test added. (Grange; Vixie) - -313. XSTATS interval was changed from "no more than once a minute, and usually - every fifteen minutes" to "no more than once an hour, and usually every - hour". (Gianopoulos; Vixie) - -312. Minor stuff in BIND_NOTIFY and the Ultrix and OSF/1 builds. (Heiney) - -311. Continuing hacks to LOC RR (experimental) and shres/*. (Davis) - - --- 4.9.3-beta11-patch5 released --- - -310. Minor BOG patches. (Shapiro) - -309. Minor LOC RR lint. (Heiney; Truck) - -308. Minor STUBS changes in ns_req.c. (Andrews) - -307. Ultrix and OSF/1 now install "man" (not "cat") pages. AIX now installs - *.[0-9] rather than *.0 pages. (Vixie, et al) - -306. conf/Info.* moved to new directory doc/info/*. (Vixie) - -305. NOTIFY could cause multiple simultaneous axfr's. (Andrews; Vixie) - - --- 4.9.3-beta11-patch4 released --- - -304. Minor fixes to PURGE_ZONE, CLEANCACHE, RETURNSOA, and dig. (Mark Andrews) - -303. LOC RR support is now in. (Chris Davis; Vixie) - -302. General portability stuff (with ISC leanings). (Mark Galbraith) - -301. Minor DiG portability fix. (Dima Volodin) - -300. Yet more HINFO fixes. (Gianopoulos) - -299. Really minor patch to tools/nstest.c, plus AIX fixes. (David Bolen) - -298. More shres/* fixes. (Davis; Woods) - -297. Minor SCO fixups. (Eduard Vopicka) - -296. Fixed #include <signal.h> problem in db_glue.c. (cast of thousands) - -295. Minor goofs in the sources. (Grange; Gianopoulos) - -294. Minor patch to the BOG (font problem). (Shapiro; Vixie) - - --- 4.9.3-beta11-patch3 released --- - -293. Minor #ifdef screwup corrected. (Mohamed Ellozy) - -292. Small HP-UX portability change. (Truck) - -291. Minor BOG correction. (Harlan Stenn) - -290. PX RR support. (Pierluigi Bonetti) - -289. Made random refresh interval a little more robust. (Miller; Vixie) - -288. Minor portability changes for DEC OSF/1. (Bob Heiney) - -287. We now do a setvbuf() on outbound AXFR streams since the system's - default size causes more write()'s (and therefore TCP segments) - than we really want. (Paul Mockapetris' idea; Paul Vixie's code.) - -286. Recast all uses of abort() to call private function panic(). This was - nec'y since we use the ABRT (IOT) signal to force a statistics dump, and - having it dump statistics inside of abort() was a bad thing. - (Mark Andrews noticed the problem; Paul Vixie fixed it.) - -285. Minor change to top-level Makefile for OSF/1 man pages. (Shapiro) - -284. Minor change to HINFO stuff. (Gianopoulos) - -283. Minor changes to XSTATS #ifdef's. (Benoit Grange) - -282. Minor change to top-level Makefile for ULTRIX/VAX. (William Gianopoulos) - - --- 4.9.3-beta11-patch2 released --- - -281. Another batch of (minor) HINFO changes. (William Gianopoulos) - -280. Minor formatting changes to keep ctags happy. (Craig Leres) - -279. Minor changes to OPTIONS. (Mark Seiden) - -278. New option XSTATS (default "on" for now). (Benoit Grange) - -277. res_mkquery() wasn't calling res_init(). (Philip Gladstone) - -276. Minor cleanup to shres/INSTALL. (Chris Davis) - -275. We now set a SO_LINGER on outbound zone transfers. (Peter Wemm; Vixie) - -274. Minor portability fix for VAX Ultrix. (Stan Barber) - -273. Fixed two time warp problems. (Bob Heiney; Paul Vixie) - -272. Named-xfer will now log and error and abort if it encounters an RR type - it doesn't recognize. (Mark Andrews; Paul Vixie) - -271. Minor cleanups to the HINFO comparison code in db_update. (Bryan Beecher) - -270. Made CLEANCACHE less of a CPU hog. (Benoit Grange; Mark Andrews) - -269. Add even more branches to the cred/clev decision tree, to make it more - robust about borderline data at zone cuts. (Jack McCann; Mark Andrews) - -268. New option (default: "on" for now): PURGE_ZONE. (Mark Andrews) - -267. Added contrib/misc/{soa-easy,dnsfind}.shar. I will not be including - this in the b11p2 diffs, though it will be in the next full kit. - (Tim Cook) - -266. I finally broke down and made a recommendation in the BOG with respect to - "nameserver 127.0.0.1". (Greg Woods supplied the patch) - -265. Minor portability stuff for SunOS. (Greg Woods) - - --- 4.9.3-beta11-patch1 released --- - -264. 900-second check removed; TTL==0 should work now. (Mark Andrews) - -263. Minor db_save() patch for initializing memory. (Bryan Beecher) - -262. Minor ESIX (SVR4.0.4/gcc) changes. (John Polstra) - -261. Minor dig-related patch to res_send.c. (Mark Andrews) - -260. Minor line number fix for ns_init(). (Havard Eidnes) - -259. NetBSD shared library stuff is now in contrib/misc/netbsd-shlib.shar. - (Matt Ragan) - -258. NeXT portability changes. (Allan Nathanson) - -257. Minor HP-UX portability stuff. (Lewis; Corrigan) - -256. Two medium sized bugs in BIND_NOTIFY. (Don "Truck" Lewis) - -255. Minor lint in ns_req.c. (Mark Andrews) - -254. Minor ndc.sh build problem. (Michael Corrigan) - -253. Minor coding inconsistency in res/res_comp.c. (Jeff Schreiber; Vixie) - -252. Minor BOG addition (SIGIOT). (Bryan Knowles) - - --- 4.9.3-beta11 released --- - -251. If a master zone's serial number goes backwards, named now logs a - warning. (Mark Andrews) - -250. Minor portability nit in ns_forw(). (Simon Leinen) - -249. Another portability problem fixed in ndc.sh. (Corrigan) - -248. Declaration problem with findZonePri() fixed. (Corrigan) - -247. References to CNAMES from MX/NS/MB will now be explicitly logged. (Vixie) - -246. Made the BIND_NOTIFY logic more robust; it still does not match the - current I-D (no delays yet). (Vixie) - -245. Fixed a writable-string problem. Added a lot of ANSI "const"'s. (Vixie) - - --- 4.9.3-beta10-patch1 released --- - -244. Added shres/PROBLEMS file. (Chris Davis) - -243. Corrected the BOG on the meaning of ".". (Doug Luce, Paul Vixie) - -242. SOA's can now be stored in $INCLUDE files. (John Lind) - -241. Rejection of 0.0.0.0 had a potential seg fault. (Mark Andrews) - -240. NoRecurse wasn't preventing queries for missing glue. (Mark Andrews) - -239. WKS nonaggregation test had bad length. (Ed Clarke, Chris Britton) - -238. NeXT library problem worked around. (Greg Wohletz) - -237. Core dump fixed in the dprintf() macro. (Eric Murray) - -236. MBZ fields in new queries were actually stack trash. (Olson, Vixie) - -235. Adds and changes to contrib/: - Added contrib/misc/dnstools.shar, from alt.sources. (Eric Murray) - Added contrib/misc/settransfer.shar (nonrecommended). (Tom Brisco) - Updated contrib/host/* with latest public version. (Eric Wassenaar) - Updated contrib/host/makezones with latest pub. version. (Philip Hazel) - -234. Made the "ps" command needed by ndc.sh a configurable parameter. - - --- 4.9.3-beta10 released --- - -233. Added and reordered a lot of code in ns_resp() to cause it to be - slighly harder to spoof with bad packets. More work needs to be done, - so that named will be as spoof-proof as the resolver has become. (Vixie.) - -232. Added new RR types to include/arpa/nameser.h, per RFC 1700. (Vixie) - -231. New "ndc" command. (Vixie) - -230. The VALIDATE option is now formally deprecated. It has bugs its detection - of invalid responses, and is known to mutilate perfectly valid CNAME - responses, to the detriment of clients. This code will likely be deleted - in the next BIND release, to be replaced by an ``always restart query'' - strategy. (Vixie) - -229. Moved a syslog() so that primary as well as secondary loads are logged. - -228. Resolver functions now reliably set h_errno. (Vixie, Wassenaar) - -227. Expired zones now lose their cached serial number information, giving - an opportunity to refresh a zone after a serial number goes backward. - (Andrews) - -226. Sun386i support crept in on little cat feet. (Brownlee) - -225. UDP packets could be overstuffed by 12 bytes. (Reilly, Vixie) - -224. failing connect()'s in named-xfer will no longer be logged. (Andrews) - -223. merged IETF stream (Vixie): - a. made ALLOW_UPDATES even more optional (it will disappear soon); - b. added NOTIFY option (experimental); - c. cleaned up some comments; - d. removed T_SA (was experimental, replaced by ROUND_ROBIN); - e. made named/Makefile's default CFLAGS -g (it usually inherits -O); - f. random code cleanup; - g. some internal errors are now fatal instead of warnings. - these changes were brought in once it became clear that there would be - another Beta of 4.9.3. - -222. tools/Makefile was using "make" instead of "${MAKE}". (Day) - -221. yet another bug was found and fixed in the SUNSECURITY code. (Brown) - -220. a variable reuse problem in the SUNSECURITY syslog()'s in gethnamaddr.c - was fixed. (Wohletz, Wemm, Vixie) - -219. "stub" root zones now affect the hint cache (STUBS is experimental). - in this situation it is reasonable to not have a "cache" directive, - and some code was reordered to make this possible. (Andrews) - -218. contrib/umich/lame-delegation/LISA-VI-paper.ps is now a proper - PostScript(tm) file. (Davis) - -217. syslog() cleanups in named-xfer.c. (Vixie, Barrett) - -216. shres/Makefile now forces -O. (Braniss, Ray) - -215. New contrib/misc/ctldns.sh. (Bush) - -214. New contrib/misc/dns-peers.info. (Wolfhugel) - -213. BOG and named(8) fixes. (Paffrath, Vixie, Hawkinson) - -212. database input errors will no longer cause the following line to - be ignored. (Gianopoulos) - -211. the TXT RR fixes done so far in 4.9.3 have been backed out; we're - back to the 4.9.2 behaviour. (Gianopoulos) - -210. the authority section will no longer duplicate the answer section - if both would contain the same NS RR set. (Vixie) - - --- 4.9.3-beta9-patch1 released --- - -209. installed marka's patch to CRED that fixes BETA9's flaw. - -208. added comment to README about -l44bsd and inet_aton(). - -207. new directory: contrib/multizdb. highly nonrecommended. - -206. small NextStep change in Makefile. - - --- 4.9.3-beta9 released --- - -205. minor Makefile fix after beta9 was previewed on bind-workers; also, a - new file conf/Info.Linux-more has been included. - -204. BOG fixes. - -203. netlists elements are now - { addr [ "&" mask ] } - which for the EBNF-impaired, means that "&" introduces an explicit mask. - implicit masks are either by-class or 0xffffffff, depending on ALLOW_HOSTS - in the call to get_netlist(). - -202. name compression is now case-insensitive. - -201. duplicate RRDATA won't trigger the new "auth warning" in db_update(). - - --- 4.9.3-beta8-patch2 released --- - -200. added a haveComplained() to limit auth warnings. - -199. fixed idiotic code reordering from patch1. - - --- 4.9.3-beta8-patch1 released --- - -198. a bad-string-termination bug was fixed in getnetanswer(). - -197. an uninitialized-variable bug was fixed in db_update(). - - --- 4.9.3-beta8 released --- - -196. Several minor corrections were made to the BOG. - -195. "clev" now distinguishes between root and TLD (wasn't worth a darn before) - -194. empty nodes in authority zones are now protected from non-auth updates. - (most of db_update() was rewritten to fix/support this.) - -193. negative cache items weren't updated before, now they are. - -192. zone updates from answers were prevented for new types but not if some - rr already existed with that type. fixed. also syslogged. - -191. the cache now distinguishes between authoritative answers and zone rr's. - -190. negative cache items are now marked appropriately authoritative. - -189. CRED is no longer optional. - -188. Another enhancement has been made to HINFO parsing. Named-xfer now - accepts RFC-bogus input formats generated by previous versions of BIND. - -187. SUNSECURITY now forces RES_DEFNAMES on so that relative "localhost" works. - -186. Minor portability fixes for DEC OSF/1, HP-UX. - - --- 4.9.3-beta7-patch2 released --- - -186. i forgot to comment out template Linux lines in top Makefile. fixed. - -185. "bogusns" directive significantly strengthened, for IN-ADDR.ARPA problem. - also fixed a bug in hardcoded root server lame detection. - - --- 4.9.3-beta7-patch1 released --- - -184. Yet another ULTRIX incompatibility has been worked around. - -183. Bogus HINFO RR's will no longer cause corrupt secondary zone files. - -182. NeXT support is now complete. Builds right out of the box. - -181. Updated TODO file. - -180. Added new INSTALL file. - -179. Minor doc fix in OPTIONS file. - -178. Security-related bug fix to new sunos shres/* stuff. - -177. Limited Linux portability was added. - -176. Trailing dots on zone names in named.boot are now ignored. - -175. Random lint was removed. - -174. DiG changes: increment version number (2.1), allow default domain (.). - - --- 4.9.3-beta7 released --- - -173. named-xfer would act strangely if trailing dot domains given as arguments. - -172. setenv() now provided on systems that need it (NeXTStep, e.g.). - -171. doc changes for shres/*. - -170. fixed debugging output problem in ns_req.c. - -169. fixed portability "bugs" on ultrix systems (some tools wouldn't link). - -168. minor functionality change in named/ns_validate.c. - -167. minor lint in res/res_comp.c. - -166. minor change to contrib/doc-2.0/*. - - --- 4.9.3-beta6 released --- - -165. another small adjustment to the Apollo section of the Makefile. - -164. a completely new shres/* was submitted; contrib/sunlibc is deprecated. - -163. INVQ is back on again by default. See README. - -162. another set of patches for obscure corner cases in the HINFO parser. - -161. added new SUNOS4 macro to Makefile and conf/portability.h; this should - fix the trouble folks were having with strerror() on SunOS 4.X systems. - -160. minor Makefile changes. - -159. processes which send outbound zone transfers now close all inherited - descriptors, since they can be longer-lived than the main named. - - --- 4.9.3-beta5 released --- - -158. various lint involving options which are rarely defined. - -157. sunos needed -DBSD=43 rather than -DBSD. - -156. minor memory leak fixed in ns_req.c. - -155. some install directories for DGUX were wrong. - - --- 4.9.3-beta4 released --- - -154. a new man/* hierarchy was installed which should be more portable. - -153. a new contrib/host has been included. - -152. a parsing problem in HINFO was fixed. - -151. a few minor changes to contrib/sunlibc/Makefile. - -150. typo in res_send.c fixed. - -149. fine tuning the credibility-level heuristics. - -148. dn_expand() will fail on names which have bad characters in them. - -147. disappearing zones could cause a core dump in syslog() - fixed. - -146. text of warnings in named-xfer corrected. - -145. limited DGUX, RISCOS support added. - -144. contrib/sunlibc/Makefile MFLAGS/MARGS problem fixed. - -143. another SunOS recv() bug has been worked around. - -142. various BOG fixes. - -141. updated master/root.cache file from latest InterNIC version. - -140. Added ``max-fetch'' to named(8). - -139. NOT_BIND problem in named/tree.c fixed. - -138. minor lint, memory leaks, and portability problems were fixed. - - --- 4.9.3-beta3 released --- - -137. some serious (and recently) dynamic memory bugs were killed. - -136. a reference to uninitialized data was fixed in res_query(). - -135. a RES_STAYOPEN-related bug was fixed in res_send(). - -134. isascii() and isxdigit() now simulated on systems which lack them. - -133. named's local setproctitle() has been renamed to avoid system conflicts. - -132. minor bugfix to negative caching code. - -131. minor bugfix in validation code. - -130. the typestats[] multiple definition problem was fixed. - -129. some Sequent portability changes were folded in. - -128. a new contrib/sunlibc was donated, but hasn't been tested. - -127. minor changes to contrib/sunlibc/Info.*. is anybody using shres/*, tho? - -126. STDIN_FILENO and STDOUT_FILENO are now defined by conf/portability.h. - -125. there is now a ``max-fetch'' directive in the boot file (see the BOG). - -124. there is now a RENICE option in conf/options.h. - -123. the toplevel Makefile has been made slightly more readable. - -122. <<DELETED>> - -121. minor fixups in the lame delegation code. - - --- 4.9.3-beta2 released --- - -120. I upgraded my "-me" macros so that the included doc/bog/file.psf is OK. - -119. NXDOMAIN responses from the negative cache will now always be - authoritative. this is the least of all evils, trust me. - -118. strcasecmp() in compat/lib is now ANSI compliant. - -117. PTR RR's are no longer subject to ROUND_ROBIN processing. - -116. writev() emulation for SCO had a bug. - -115. the resolver no longer calls sscanf() or qsort(). - -114. minor debugging nit cleaned up in res_querydomain(). - -113. IP options on incoming connections are now logged and ignored. This - should probably be done for datagrams as well but not today. - -112. tree.c made portable to non-POSIX/ANSI systems. - -111. NSAP RR's are now supported. NSAP_PTR RR's are deprecated and so left out. - -110. outbound zone transfers are now logged. - -109. various lint cleaned up wrt 16-bit integer handling. - -108. named-xfer was exiting bogusly on some systems due to flakey kernel - interfaces. i've rewritten some of the code to avoid the problem, - and fixed plenty of lint in the process. - - --- 4.9.3-beta1 released --- - -107. Apollo systems were dumping core because of a missing #include <resolv.h>. - -106. NSAP and NSAP_PTR RR's now recognized by res_debug() (but nothing else). - -105. NeXTstep 2.1/3.0 and Pyramid dcosx now nominally supported. - -104. res_querydomain() was doing Bad things if given an empty name. - - --- 4.9.3.a5.p4 published --- - -103. named-xfer's exit cause is now syslog()'d more often/clearly (Paul Vixie). - -102. I left out a ";" in the new compat/lib/ftruncate.c file (Craig Leres). - -101. X25, ISDN, and RT RR support have been added (Michael A. Meiszl). - - --- 4.9.3.a5.p3 published --- - -100. Another glitch (very minor this time) was found and fixed in the - QSERIAL logic. This was a performance problem only -- reliability - wasn't affected (Bob Heiney). - -99. SCO UNIX is now supported, thanks in part to Michael A. Meiszl. - -98. I witlessly used a GCC-only feature (automatic aggregate initialization) - in a5p2. Kazuhisa Shimizu was the first to report it. - - --- 4.9.3.a5.p2 published --- - -97. NEC EWS4800 EWS-UX/V Rel4.0/Rel4.2 support (from Kazuhisa Shimizu). - -96. Some of the security checking logic in the new res/gethnamaddr.c's - getanswer() was happening in the wrong order (thanks, Bob Heiney). - -95. Minor typo in the man/host.1 man page (caught by Robert Elz). - -94. DiG was groping core if given more than 10 tokens in a lookup string - (Michael J. Corrigan provided the fix). - -93. Queries to INADDR_ANY ("0.0.0.0") come back from the system's primary - interface, and res_send() was discarding them. A proper fix would add - a lot of code to the resolver, so for now we'll just work around it - (Michael J. Corrigan reported this). - -92. The "data outside zone" syslog message was misleading (Bob Heiney). - - --- 4.9.3.a5.p1 published --- - -91. res/gethnamaddr.c wouldn't compile on non-BSD systems since it depended - on LOG_AUTH which is a post-4.3 feature (Bob Heiney reported this). - - ****** 4.9.3-alpha5 released ****** - -90. redid most of my previous round of prototyping now that i truly - understand which variables and parameters should be u_char and which - ones should be char. (Vixie) - -89. added (optional) prototypes for _getshort() and _getlong(); this means - the calls all need casts of their argument since it usually isn't a - u_char*. Also prototyped res_query(), res_search, and the nominally - private but for some reason not static res_querydomain(). (Vixie) - -88. security related: responses from servers we didn't query are now ignored - by the resolver; answers with QDCOUNT!=1 are treated as errors; name - mismatches in the question or any part of the answer field are syslog()'d - and ignored. (Vixie) - -87. fixed a bug in the SUNSECURITY stuff. (Vixie) - -86. a long standing bug in the name hashing code that caused it to ``hash in'' - the case of the name's characters, was found and fixed. (twice.) (Vixie) - -85. Bob Heiney did some performance analysis and concluded that samedomain() - was soaking down cycles at a rate disproportionate to its usefulness; he - reimplemented it in a way that violated the (good,fast,cheap) rule. - -84. the RFC1101 implementation of getnetby*() was using case-sensitive - string compares. - -83. fp_query() will no longer try to format packets larger than PACKETSZ, - and for perversity, dig and named are now prepared to handle replies - (via TCP) larger than PACKETSZ. new function: __fp_nquery(). (Vixie) - -82. multiline initial syslog() is fixed (Bill G). - -81. Don Lewis sent in a big update for the lame delegation logic. Vixie fixed - one bug. Bryan Beecher had a big hand in this. - -80. TCP replies can now be up to 8K in size (don walsh). - -79. validation bug fixed (don lewis). - -78. BOG patches from mike minnich and others. - -77. more lint fixes for Cray (norb brotz). - -76. a new hostname(7) man page was contributed by Art Harkin. - -75. DESTINC is now a settable Makefile parameter (Marion Hakanson). - -74. the zones-not-transferring bug is finally gone. - -73. now using LOG_PERROR in openlog(); many parallel dprintf()'s are gone. - -72. inability to retrieve serial number via UDP now forces TCP transfer. - -71. removing secondary zone files and SIGHUP'ing will now force a transfer. - -70. "cache" directives can now specify "/class" as documented in the BOG. - -69. Mark Andrews' fix for the ns_forw core dump is in. - -68. Keith Bostic fixed some typo's in the man pages. - -67. Compiling without NCACHE is possible now (John Hanley). - -66. Bill Gianopoulos and Alan Barrett finally agreed on what glue was and - Bill's alpha4 patch is mostly gone now, and one new idea was added. - -65. BOG improvements (Vixie, Brooks). - -64. Mark Andrews' CLEANCACHE (recommended) and RETURNSOA (__NOT__ recommended!) - are in. RETURNSOA should not be enabled at this time; there's nothing - wrong with the code but it will cause cache corruption in older servers - and may not be necessary. The jury is still out. - -63. outbound zone transfers are now logged (requested by Ron Johnson). - -62. serial number queries sent out for zone transfer purposes will now be - limited to a maximum of four (4) simultaneous outstanding; this keeps - BIND from overflowing its UDP socket buffer when hundreds of zones must - be checked (still trying to fix Paul Pomes' problem). - -61. short A RR's in responses will no longer lead to purify errors due to short - malloc()'s in savedata() (thanks to Nicholas Briggs for reporting this). - - ****** 4.9.3-alpha4 released ****** - -60. manifest constants used instead of "sizeof({u_,}int{16,32}_t)", for - systems which lack 16- and 32-bit integers (paul vixie for norm brotz). - -59. zone transfer anti-glue logic made RFC1034-compliant (bill gianopoulos). - -58. seg fault in sysquery() (from LAME_DELEGATION) fixed (mark andrews). - - ****** 4.9.3-alpha3 released ****** - -57. a big, hefty patch was made to the negative caching logic (mark andrews). - -56. named-xfer will no longer scramble the default origin (alan barrett). - -55. random bits of lint found and removed (mario guerra). - -54. convexos-10 is now supported (jukka ukkonen). - -53. seg fault in database dumps (from VALIDATE) fixed (don lewis). - -52. problem with extra bogus 0.0.0.0 A RR's from VALIDATE fixed (mark andrews). - -51. the LAME_DELEGATION logic once written into 4.8.3 by don lewis has - been substantially reworked and put into 4.9.3-alpha3 (bryan beecher). - -50. all instances of "sizeof(HEADER)" were changed to "HFIXEDSZ" to make - life easier for the cray. also, "struct HEADER" in include/arpa/nameser.h - uses just bit fields now, for portability to 64-bit systems without - 16-bit integer types. (norb brotz suggested it; paul vixie did it). - -49. build changes for NeXT and AIX systems (artur romao; c. wolfhugel). - -48. random sunshlib changes (piete brooks). - -47. minor fixes for solaris build (carson gaspar; paul pomes). - -48. a few bugs were wrung out of the BOG (per hedeland; vixie). - - ****** 4.9.3-alpha2 released ****** - -47. several obscure Makefile problems were fixed (vixie). - -46. there is now a per-primary-NS quota for simultaneous zone transfers; this - will cut down on the retry thrashing seen on servers that are secondary for - thousands of zones (vixie). - -45. a bug introduced by change #23 has been fixed (marten terpstra; apb). - -44. the "data outside zone" messages are now consistent (piete brooks; vixie). - -43. several #include's were reordered in res/*.c and a few #ifdef's were - changed; BIND should now run OK on DGUX (henry miller). - -42. several changes to the conf/options.h and Makefile (vixie): - -> SVR4 has been added as a top-level Makefile CDEFS option - -> SYSV has moved from conf/options.h to the top level Makefile - -> INVQ is now an "#ifdef" rather than a "#if" - -41. resolver no longer uses initialized static data, which should make shared - libraries easier to generate (vixie did it, at the urging of many others). - -40. now compiles on Apollo DomainOS (don lewis). - - ****** 4.9.3-alpha1 released ****** - -39. lots of lint found and fixed (craig leres). - -38. illegal enum compare fixed in named/ns_stats.c (vixie). - -37. missing ')' added in SUNSECURITY section of res/gethnamaddr.c (h miller). - - ****** 4.9.3-prealpha released ****** - -36. ***REMOVED*** - -35. various bugs were fixed in the negative caching (vixie; mark andrews). - -34. several debugging and dump output problems were fixed (mark andrews). - -33. TXT RR's can now be read from zone files even if they lack quotes; - the RFC doesn't say quotes are needed (jim martin). - -32. limited support for AIX-3 is now included (christoph wolfhugel). - -31. SUNSECURITY is now an obvious default in ./Makefile (p killey; b beecher). - -30. VC queries that time out are now GC'd and SERVFAIL'd (mark andrews). - -29. HP-UX 9.0's top-level makefile variables have been changed (don lewis). - -28. various fixes for tools/host.c (jim martin; mark andrews). - -27. syslog messages logged by SUNSECURITY will now include the address of - the host that's having problems (david morrison). - -26. systems whose connect() calls fail if a socket is already connect()'d - will now have their sockets closed and recreated in res_send() (piete - brooks; mark andrews; vixie). - -25. res_send() will now corrected reset its "connected" variable when the - connectedness of a socket changes (mark andrews). - -24. SERVFAIL responses will no longer terminate the res_search() inner loop, - thus catastrophic problems with early search elements will no longer - prevent res_search() from trying later search elements (bryan beecher;vix). - -23. non-NS RR's for delegated subzones will no longer be accepted in a zone - transfer (alan p barrett). - -22. the setting for _PATH_PIDFILE is now overridden by the Makefile (l hume). - -21. named.restart.sh now has a smaller path with %DESTSBIN% first therein; - this should prevent the vendor version of named from being exec'd by - accident (leigh hume). - -20. big change: statistics are now kept "per name server" rather than as - a single global array. the /var/tmp/named.stats file format has changed - quite a bit, so older awk/perl scripts are likely to stop working. - -19. big change: every RR now keeps a pointer to a "nameser" struct; this - currently permits SIGINT-initiated dumps to include the address of all - non-zone data, which will help with tracking down corrupt data. - -18. db_load.c was missing two #ifdef/#endif's for CRED (mike minnich). - -17. don't aggregate SOA or WKS RR's in the cache (vixie). - -16. minor cosmetic changes (vixie). - -15. fixed typo in compat/Makefile ("LIBDIR" -> "DESTDIR") (rob davies). - -14. fixed spurious "accept: interrupted system calls" (vixie). - -13. named will now start as many named-xfer's as it should; previously it - lost track of the need for transfers at the beginning of each maint - cycle. also, we don't bother asking for an SOA if we know that our - zone is out of date. i've changed the transfer metrics so that more - transfers can happen concurrently, and maint cycles come more often. - (andrew partan; vixie). - -12. a number of LOG_ERR and LOG_CRIT syslogs were downgraded to LOG_NOTICE - (rob davies; vixie). - -11. sequence number checking now treats "zero" as a special case. - (craig leres; andrew partan; vixie). - -10. MFLAGS no longer used explicitly, since it is often used implicitly - (mark andrews; vixie). - -9. ADDAUTH is no longer considered experimental (tony stoneley; vixie). - -8. several obscure type bugs fixed (don lewis). - -7. signal handlers all now preserve errno (don lewis). - -6. TTL deprecation made more portable (don lewis). - -5. now compiles on Apollo DomainOS and is generally more POSIX-ish (don lewis). - -4. bryan beecher's "query" tool has been promoted to tools/ and renamed to - dnsquery. minor changes were required in several Makefiles (vixie). - -3. "make links" at the top level will now make a higher resolution link tree, - which makes porting easier on some systems (ian dickinson). - -2. Convex feof() bug now has a workaround (jukka ukkonen). - -1. gethostby*() will no longer overwrite its fixed-size array if a host with - too many addresses is handled (reported by piete brooks, fixed by vixie). - --------------------------------------- 4.9.3 above, 4.9.2 below - -4.9.2 ------------------ FINAL ----------------- Paul Vixie - -57. updated TODO, README files. - -56. fix to contrib/sunlibc/Makefile. - -55. several new items in contrib/. - -54. Corrected bad command line parsing bug in tools/dig.c; also added the - old query timing code back in (thanks to Havard Eidnes). - -53. Ported contrib/decwrl/host.c to the modern interfaces. - -4.9.2 ------------------ BETA5 ----------------- Paul Vixie - -52. A number of optimizations that fell out of negative caching and/or the - validation code have been turned off in order to avoid confusing older - nameservers and their unfortunate assumptions about co-invariants. - Mark Andrews and Robert Elz were the principle debuggers and contributors - to this part of the effort. - -51. We're now much more portable to systems without Posix or BSD signals, - thanks to Bill Wisner. - -50. tools/host.c now has more reasonable error messages and can deal with - negative caching servers. - -49. Lots of Makefile gaffes are now fixed. - -48. New "host" in contrib/host/, complements of Eric Wassenaar. - -47. AFSDB support is now complete, thanks to Chris Everhart. - -46. The bug whereby named would sporadically return NXDOMAIN when it should - have sent back a referral has been fixed. - -4.9.2 ------------------ BETA3, BETA4 ----------------- Paul Vixie - -45. Robert Elz has provided updated LOCALDOMAIN environment variable - processing, making it more like resolv.conf's "search" than "domain". - In the spirit of this I have added a RES_OPTIONS environment variable - and a corresponding "options" keyword to resolv.conf. All of this is - documented in the man pages and in the BOG. Robert has also contributed - several bug fixes to the validation and negative caching code. - -4.9.2 ------------------ ALPHA ----------------- Paul Vixie - -44. BETA1, BETA2, and three patches to BETA2 have all come and gone without - itemized descriptions in this file. I'll provide the RCS history on the - code to anyone who asks, but basically what's been happening is that some - core dumps were fixed, others added, then those were fixed too. Meanwhile - RFC 1535 has been published, codifying CERT's concerns and our answer to - them. BIND is now RFC 1535 compatible. RFC's 1535, 1536, and 1537 are - now included in the doc/ directory. Note that Mark Andrews supplied many - of the fixes to the core dumps, some of which were introduced by me and - some by ISI's negative caching and/or validation code. - -43. patch05 to ALPHA2 (930908) released: this includes new DNSRCH logic to - correct a serious problem that CERT called me with today. the change is - subtle and will have the effect that names which could match either as - fully qualified names or partially qualified names using the local search - list will be found as fully qualified. previous releases would have found - them first through the local search list. local search lists are a bad - idea in my opinion; see new SEARCH_DEFAULT option in OPTIONS file for more - information. also in this release: limited Solaris support, in the form - of POSIX-style signal handling used on systems which support (or require) - it. as of this patch, 4.9.2 has a good chance of compiling out of the box - on Solaris, modulo makefile edits. dig and host should be more portable - now, too. - -42. patch04 to ALPHA2 (930908) released: this corrects several borderline - syntax errors in various Makefiles (Sun and Ultrix makes complained); - it corrects a coredump on Ultrix systems (which aren't really as POSIX - as i thought they were); it lets dig and nslookup compile again on SunOS; - and it cleans up some dirty junk in named-xfer.c. this stuff is really - really minor but i would like to see it tested on a Sun system before the - beta. - -41. patch03 to ALPHA2 (930908) released: this uses compat/include by default - which is helpful on BSD/386 systems and shouldn't hurt any others except - perhaps real 4.4BSD systems (and maybe not even those); it removes Bryan - Beecher's SHUFFLE_ADDRS option since he and I agree that Marshall Rose's - ROUND_ROBIN stuff is more general and cleaner; it includes various patches - to the documentation sent in by several folks (please print the BOG and - let me know if you find problems in it); it fixes "make depend" problem - in "man/" subdirectory; it fixes several outright bugs in Gregory Shapiro's - SECURE_ZONES code; it removes an obscure syslog() that should have been a - dprintf() ("validate_count -> 0"); it fixes a bug in NCACHE whereby a T_ANY - query for a name which was negatively cached but had children would return - _answers_ with the T_ANY type for subsequent queries; several newer syslog - messages were reworded to make them clearer; a portability bug in the - SUNSECURITY logic was fixed; another in the RFC1101 logic was fixed; - support for the PAGER environment variable was added to nslookup (sorry, - i know we're in functional freeze but this will enable development in the - next cycle and it was pretty simple) and only affects the "view" and "help" - commands. - -40. patch02 to ALPHA2 (930908) released; this includes more fixed from Mark - Andrews, this time to Anant's NCACHE stuff (memory leak and functional - bug). Also included is a patch from Gregory Neil Shapiro to his SECURE_ - ZONES code, which I hadn't noticed since I don't run it here. - -39. patch01 to ALPHA2 (930908) released; this includes some fixes from Mark - Andrews to his "clev" and ADDAUTH stuff. The "clev" patch fixes a problem - on all servers; the ADDAUTH stuff is still experimental so most users will - not be affected by it. Dave Morrison also sent a patch for the USE_UTIME - logic, which is important for ULTRIX systems. - -38. 4.9.2-ALPHA2 released on 930908. - -37. Mark Andrews sent an initial attempt at implementing ADDAUTH, which will - eventually allow named to include authority and glue RR's with all - authoritative answers. I am not sure that the design goal is right, and - the implementation currently sends back glue RR's but no authority RR's, - so I'm recommending against using this for now. But since it changes some - internal interfaces in a harmless enough way, I'm including the changes. - -36. Marshall Rose's ROUND_ROBIN code snuck in at the last hour. This is the - best answer I've seen to the problems purported to be solved by SA RR's, - and my wording in the OPTIONS file shows this. - -35. These items from TODO is now done: - - [vixie@pa.dec.com 25apr93]: clean up debugging - replace all "#ifdef DEBUG...fprintf(...)...#endif" with dprintf(...) - which would be a macro that only expands to an fprintf() if DEBUG is - set. dprintf(x, (args)) with x as the log level. perhaps change log - levels to be symbolic, and perhaps make them a mask instead of a limit. - - [vixie@pa.dec.com 25apr93]: clean up #ifdef's and portability - add and use function prototypes. make everything static that can be. - externs should only be in .h files (add more .h files, per module if - needed, to cover these). add "export" keyword (null define) to make - it clear which names are exported and which are static. all top-blevel - names in a module must be "export" or "static". - - [gshapiro@guest.wpi.edu and vixie@pa.dec.com 26apr93]: access control - "xfrnets" is ok but what we really need is full access control per - zone rather than a global list of acceptable client nets. this is - especially important if you send /etc/passwd via zone transfer. - - [postel@isi.edu anant@isi.edu jaffe@noc.rutgers.edu - 28apr93]: negative caching - Paul: - We'ed like to have included in 4.9.1 - our implemention for negative caching. - --jon & Anant. - - [vixie@pa.dec.com 16may93]: inet_addr needs to die - to be replaced by calls to inet_aton, which doesn't confuse the - broadcast address with bad addresses. - - [Paul: I know you said that you'd like to wait for the IETF DNS WG to - "bless" an official load balancing scheme, but I'll be adding my - shuffle A records to BIND 4.9 for use here at U-M anyhow. The code - mods to existing source files are minimal since the bulk of the work - is done in a separate .c I added. If you don't want SA records to - move into 4.9.1 unless they become official, please just toss this - first entry. --bryan@umich.edu] - - [bryan@umich.edu 25apr93]: add "shuffle A" records - There are several schemes for adding some kind of load balancing - capability to the DNS. Our "Shuffle Address" (SA) records are one - stab at this, and since they're in use at U-M, I need to add them - so we can use BIND 4.9 here. - - [bryan@umich.edu 25apr93]: add AFSDB records - AFSDB records were proposed in RFC xxxx. We use them here at the - University of Michigan, so I need to add them for our copy of - BIND 4.9. - - [bryan@umich.edu 25apr93]: small fix to resolver's p_cdname() - The current copy of p_cdname() in the resolver does not work - for query responses larger than 512 bytes (which can happen when - using TCP). A very small modification changes the "sanity check" - argument (the second one) to dn_expand() from "msg + 512" to - "cp + MAXCDNAME". (This showed up very recently.) - -34. While waiting for some last minute changes from volunteers, I looked - at my work queue and saw that asp@uunet.uu.net had asked a while ago - that named not fork/exec a named-xfer unless it had already determined - that the serial number was out of date. This is important to sites like - UUNET and DECWRL, which have thousands of "secondary" lines in their - named.boot and can take hours to check all the serial numbers at boot - time if named forks/execs named-xfer and lets named-xfer compare the - serial numbers, rather than comparing them in named and only fork/exec'ing - a named-xfer if it's actually neccessary to do a transfer. In spite of - C's lack of threads, this only took a few hours to do. So it's in. - -33. Gregory Shapiro's "secure_zone" changes are in. See the BOG. - -32. Internals changes: STATS is no longer optional; ns_req() has been split - into three functions for readability. Convex systems are now supported. - You can now define LOG_FAC in conf/options.h if you want to syslog as - LOG_LOCAL1 or some other non-LOG_DAEMON value. The mkstemp() problem on - ULTRIX has been fixed. More dead code has been eliminated. - -31. Large TCP queries are now printable in debug mode (which is used by - "dig" and "nslookup"), thanks to a patch and a lot of patient explain- - ations from Bryan Beecher. - -30. Data from subdomains ("deeper zones") is now considered more credible - than data from parent zones, if both are authoritative. This permits - a subdomain's data to differ from its parents delegation information - and have the most-local information supercede the least-local. Mark - Andrews <marka@syd.dms.csiro.au> sent this in, and it is nonoptional. - -29. rossc@ucc.su.oz.au's SUNSECURITY patch is now included, along with - marka@syd.dms.csiro.au's performance improvement to it. Note that - I am violating my own policies by including this, since it came - without a corresponding patch to OPTIONS, conf/options.h, and the BOG. - -28. Interfaces with multiple addresses were not being handled properly. - This is an issue for 4.3-Reno and later BSD systems, including BNR2 - ("Net-2") and 4.4BSD. Multiple addresses are not properly handled - as if they were all aliases for the localhost. - -27. Jukka Ukkonen <ukkonen@csc.fi> sent me some patches for the Convex, - which I've put it but cannot test. - -26. sob@tmc.edu (Stan Barber) sent me new versions of contrib/host/host.c - and contrib/host/send.c, which I have installed but not tested. I am - still waiting for someone to update the version in tools/host.c, which - is going to be a lot more work. Contact me via e-mail if you want to - help. - -25. My credibility stuff from the original 4.9 (and before that, KJB) - was operating under a ``scorched earth'' policy due to a brain fault - on my part when I wrote the code originally. Tim.Goodwin@pipex.net - discovered this and sent in a patch. Note that throwing out glue is - generally OK since glue is generally NOT OK, but disposing of it after - ~20 references is a lot better than disposing of it after 1 reference. - -24. NS RR sorting on forwarded and system queries was not happening - unless more than 1024 milliseconds of RTT variance existed among - the servers. This was a good value for development and testing - but not for production use. The value is now 128 milliseconds. - No, this should not be a configurable in the boot file. - -23. I am including a file doc/FAQ which was posted to usenet as: - From: craig@ecel.uwa.edu.au (Craig Richmond - division) - Newsgroups: comp.protocols.tcp-ip.domains - Subject: FAQ: Setting up a basic DNS server for a domain - Date: 3 Aug 1993 10:53:51 GMT - Organization: The University of Western Australia - Lines: 1088 - Message-ID: <23lg3v$1go@uniwa.uwa.edu.au> - Summary: Step by Step implementation of a DNS server - Keywords: FAQ DNS setup - -22. named-xfer now syslogs if the remote server's serial number is _lower_ - than ours, which does seem like a bad thing. per@erix.ericsson.se - (Per Hedeland) sent this in. - -21. man/resolver.3 had a typo on the exp_dn argument to dn_expand. fixed. - (Steve Alexander <stevea@lachman.com> sent this in.) - -20. include/sys/cdefs.h moved to compat/include/sys/cdefs.h since some - systems have their own which must be used. the top-level makefile - must be edited if you are on one of these systems, since the default - CFLAGS includes this new directory as a -I directive. sys/bitypes.h - has also moved. - -19. A neccessary bug fix for ISI's VALIDATE/NCACHE code has been incorporated. - If you had to rebuild without these turned on in options.h to get your - CNAME lookups to work again in an earlier 4.9.2 ALPHA, you can turn them - on again now. - -18. The q_system field of the query structure has been removed in favor of - a q_type field containing bit definitions. The old PRIMING_CACHE magic - cookie is no longer used. Go to the end of the universe, do not pass go. - -17. Converted to ANSI C. All functions are static unless they are actually - needed outside the current module ("file" in C terminology); static - functions are declared with prototypes if they are forward-referenced. - Externally visible functions are declared in separate header files, with - prototypes. ns.h and db.h have been split into four new header files: - db.h -> db_defs.h db_glob.h db_func.h - ns.h -> ns_defs.h ns_glob.h ns_func.h - - The *_defs files contain only structure and type definitions, and macro - definitions. Nothing that generates text or data space in the executable - is declared here. - - The *_glob files contain only global variable declarations, which used to - be defined in the various *.c files in a more or less random fashion. The - declarations are "extern" if included from non-main()-containing files, but - are defined globally and given initial values in main()-ish files. This - reuse of the same declarations insures that the type and size declarations - match between definitions and external references to them. - - The *_func files contains function prototypes for global ("extern") - functions. The prototypes are all optional so will not break non-ANSI - systems. Note that I don't have such a system any more so I may be wrong. - -16. Removed all remaining references to "short" or "long" that did not - depend on the vague semantics of those types. Most uses were actually - depending on a size of 16 bits for short and 32 bits for long, and there - are processors/compilers where each of these types is different. This - work was begun in 4.9 and is now complete. Note that some structs that - are used in large data structures use "char" for 8-bit integers. It helps. - -05Jul93 - ALPHA Released - -This is the cleanup release after 4.9. I'm going to try the TCSH style of -logging the changes; let me know if you think it's a bad way of doing it. - -15. the resolver now includes an implementation of RFC 1101, which allows - network names to be encoded in the DNS tree rather than in /etc/networks. - this implementation is by rps@matuc2.mat.uc.pt (Rui Pedro Mendes Salgueiro) - i put the test program and original documentation in contrib/rfc1101/. i - would like to see their main.c ("nettest") turned into a tools/nettest, - but i'm not willing to do the work myself. it needs a man page, etc. - -14. as expected the initial HS zone transfer stuff didn't work that well. - thanks to <per@ericsson.se>, retries after failed SOA queries will use - C_IN rather than falling through to C_HS inappropriately. - -13. ns_init.c was fcntl(SETFL)'ing in a destructive way. it now does a - fcntl(GETFL) to get the old option mask and then |'s in the new flag. - this patch came from Eduard Vopicka <Eduard.Vopicka@vse.cz>. - -12. there are two new conf/Info.* files; check 'em out. - -11. ultrix (some versions, especially the vax ones) libc.a had some bad - naming conventions for some resolver routines. getshort/putshort just - have to be real functions, not just macros, or you can't link anything - with this resolver. patch was sent by <aas@brain.physics.swin.oz.au>. - -10. sethostent(x) for host files was sticky for nonzero 'x' (avalon@anu.edu.au) - -9. hp9000s700 is now supported in include/arpa/nameser.h (avalon@anu.edu.au) - -8. statistics dumps now print the time in decimal-seconds-since-1970 in - addition to the old "ctime" format, for ease of debugging. (Peter Koch). - -7. systems with 14-character filename limitations have apparently been - having trouble in named-xfer since its temporary file names are bigger - than they can handle. ash@hp sent in some patches a while ago, enabled - with SHORT_FNAMES in conf/options.h, to deal with this appropriately. - We should probably just generate short names always. - -6. Some security stuff from ISI. According to Anant Kumar <anant@isi.edu>: - - The validation procedure is the major change here. Currently, we - accept anything from a server, as long as we had asked it a question. - This implies that a malicious server can really send us any data and - we not only pass it on, we also cache it for as long as the TTL - holds. This can be really bad for our health and for that of those - who use the DNS. - - We add this procedure to verify for each RR returned by a server - that it is indeed authoritative for either that zone, or for a - parent zone. We end up trusting the root servers for everything! - Also, the more rich our cache is the more choosy we become about the - data we add on to it. This stuff is all ifdef'd with "#ifdef VALIDATE" - - The negative caching stuff adds on a d_rcode field to the databufs. - Any positive entry now shows a NOERROR there while negative entries - have either a NXDOMAIN or NOERROR_NODATA. NOERROR_NODATA rcode is - never returned. It is used only to differentiate, within the - internal database, between negative and positive entries. We use the - regular hash table (hashtab) to store negative entries, too. Only - authoritative answers are negative cached, for NTTL (parameterized, - currently 10 minutes) seconds. Non-authoritative NXDOMAINs or - NOERROR with zero RR count, now generated, are now accepted but - never cached. This is ifdef'd with "#ifdef NCACHE". - -5. "make install" now has a prayer of working for the man pages. an observation - was made that net2++ systems _require_ formatted "cat" pages and that older - systems are _able_ to use them, so that's all we install. - -4. i wrote man pages for named.reload, named.restart, and named-xfer. these - were actually in 4.9.1 for 4.4BSD. - -3. unneeded functions in compat/lib will now generate placeholder symbols, to - make sure that the linker doesn't generate ugly-but-harmless warnings. - -2. my ignorance of the true meaning of _POSIX_SOURCE has been corrected, - along with the ugly-but-working code in conf/portability.h and elsewhere. - -1. non-resolver routines moved from res/ to compat/lib/. this will shorten - libresolv.a and make it easier to integrate new BIND releases into Net-2 - descendents such as 4.4BSD and BSD/386. - -4.9.1 ------------------ - -This is the integration of the changes that were made for 4.4BSD. This -release will not be published. Changes include: - -doc/BOG/*: many changes to improve appearance of the output, including - orphan-avoidance and better tab stops. Sent to me by someone on - the net who deserves thanks but I've lost the original mail. Oops. - -include/*: the CSRG people weren't entirely pleased with the interface - changes i made to the res_*() and inet_*() functions. in particular, - the changes from "long" to "u_int32_t" were too sweeping in their - opinion since Posix is already working on standardizing them and - might look unkindly on an apparently-still-evolving interface. also, - the possibility that all the vendors will change their implementations - to match the new interface is apparently rather dim. therefore most - externally-visible occurances of the int32_t type have been changed - back to "long" in the resolver interface. we believe that this should - still be portable to Cray and AXP machines, but i'll wait to hear from - someone who can actually try it out and let me know. - -tools/*: the "net2" version of "lex" requires some additional flags and libs, - and this had implications for the Makefiles and the dig.c source file. - nslookup's man page is now in man/ rather than tools/nslookup, for - consistency. - -named/*: last-minute 4.9-FINAL changes to named-xfer.c and db_load.c resulted - in corruption of TXT records on zone transfers, and a high number of - useless syslog(SYS_ERR) messages about zones already being up to date. - these last-minute changes have been massaged into better shape and are - now a lot readier for prime time than they were. a lesson was learned. - - the inet_aton() function is now used where appropriate, rather than the - old inet_addr(). this is just an evolutionary move that should have no - practical implications. bad addresses in the "tcplist", "bogusns", and - "sortlist" directives (from named.boot) are now syslogged. - - some open files are still inherited by named-xfer from named, but they - are properly closed now. - - the SIGXFSZ signal is now accepted as an alias for SIGHUP, in support - of the wierd DEC Hesiod implementation. no practical significance. - -res/*: one important bug fix in the gethostent() stuff, and a whole bunch of - evolutionary include file changes. - -include/*: include/sys was moved to compat/include/sys, since systems that - do not need it really really really need to get their own instead. - at some point i'm going to move the res/*.c files that are needed for - compatibility but not really part of the resolver, into compat/lib. - -general: there are more settable parameters in the top-level Makefile, and - they are propagated downward into the subdirectories' Makefiles. you - should not have to edit any Makefile except the top-level one. Note - that "make links" still creates local Makefiles in the build directory - because "mkdep" still edits the Makefiles on most systems. - -4.9-FINAL ------------------- - -Kevin Dunlap sent in some changes for the BOG. So did a lot of other folks. - -Someone asked about AXP-OSF, so I did a trivial 64-bit port. Porting to -other 64-bit systems should be simple now. Someone also sent in some MIPS -RISCOS portability changes, which were simple and therefore were put in. -Note that some type names have been added to BSD 4.4 as a result of this -work; they are going to be in <sys/types.h> in BSD 4.4 but they are in a -local include file called <sys/bitypes.h> in this distribution, with -appropriate #ifdef's in the include files that depend on them. Those of you -who are porting to 64-bit platforms where "long" isn't 32 bits should be -using these new names for your types; there was no standard before this, -but the names we've added for BIND 4.9 and BSD 4.4 are going to be proposed -to Posix at some point. Sometimes it's just not OK for "int" to be the -"natural integer size of the machine" and you just _have_ to tell the compiler -how many bits you want. - -The NIC added a new root server, thus pushing the size of a nonauthoritative -root server response (which includes the root server list in the answer as -well as the authority sections) over the 512-byte limit. This showed up a -long-term BIND bug wherein it failed to set the TC ("truncation occurred") -bit if truncation occurred anywhere but the answer section. Since truncation -was occuring at the end of the packet, in the additional data section, this -meant that BIND was generating truncated responses without setting TC in the -response header. Upon further investigation, I found that BIND ignored TC -on responses it received from other name servers. RFC 1035 states that RR's -from truncated responses should not be cached; with creative interpretation -of the exact 1035 wording, I found a way to reach this goal while still -caching the answer section (as long as the truncation occurred in some other -section, which 1035 gives no definitive way to determine but I'm happy with -my guess). - -While researching the above, I finally broke down and added credibility -output to the zone dump files. They are in the comments so should cause -no trouble. There's more work to be done on the dump output; in particular, -Phil Almquist proposed and even prototyped a "tagging" of all RR's with the -A RR of the nameserver that sent them to us; this feature should be added -and the dump output should include it. This would add a lot to our ability -to track down corrupt data. - -Don Lewis and I had more discussions about TC and ended up agreeing that the -right thing to do is to set TC on responses that overflow in the answer or -authority section, truncating at an RR boundary, but do not set TC on responses -that overflow in the additional-data section (truncating at a {name,type} -boundary). This actually solves the root server problem pretty well, since -BIND 4.9 will, when it tries to use an NS whose A isn't in the cache, generate -a sysquery() for the missing A. (Heck, additional data TTL's are depreciated -at the rate of 5% per use, so this would end up happening pretty quickly even -if we did cache a partial {name,type} -- but now we won't have to.) - -While trying to fix all of this stuff I ended up moving some functions around -to avoid duplicating them in different source files, and I reformatted some -source lines that went over 80 characters. I also made a few things "static" -that used to be unneccessarily global. More of that will happen in 4.9.1. - -DEC's product version of MIT Hesiod uses SIGXFSZ for what we do with SIGHUP; -since the default for SIGXFSZ is to exit, it seemed prudent to wire it up to -do what SIGHUP does instead, so that this BIND can run on DEC Hesiod servers. - -At the request of several people, I integrated the USC "dig" and Rutgers -"host" tools into the distribution. This required some changes to the -resolver library's debugging output formats, which will be visible in -nslookup, nsquery, and any other tool that sets the RES_DEBUG option. -Note that there is no support for "DEFNAMES" in this version of dig, due -to design changes between 4.8 (from which "dig" is derived) and 4.9. there -is no reason in principle why it can't be made to work, but it doesn't work -now. therefore only fully-qualified names can be looked up with this "dig". - -I had to change the name of the resolver "state" structure to be "__res_state" -for standards conformance (really, it is not reasonable to expect that because -a program includes <resolv.h> it will never define its own structure called -"state". This change highlights the imperative that any application which is -relinked against this resolver must first be recompiled against these include -files (notably <resolv.h>). This is true for almost all versions of libresolv. - -I asked for items for the "TODO" list and got quite a few. Check them out -before you hack; someone else may already have started doing what you want to -do. I also asked for tools for the "contrib" subdirectory and got 650KB worth. -They make the BIND 4.9 distribution a lot larger than 4.8.3 was, but the extra -bytes are well worth their weight. - -Kenneth Almquist (no relation to Phil, as far as I know) posted a patch for -res_send() that lets it keep track of servers that are responding "SERVFAIL" -or some other fatal condition; these servers are NOT used for retries of the -current query. This information is not persistent between calls to res_send() -since future calls will probably be for different {name,type} queries, which -will not neccessarily fail in the same way. This change is trivial and makes -a measurable difference in the amount of DNS traffic on my local net. - -4.9-BETA ------------------- April 17, 1993 -- Paul Vixie -- DECWRL - -"Peter Koch" <pk@TechFak.Uni-Bielefeld.DE>'s previous patch caused core -dumps on some systems. I fixed part of it and Peter sent me a fix for -the rest of it. All is now well. - -The Bind Operations Guide in doc/BOG has been updated to 4.9. Also, the -man page in man/named.8 has had some patches applied. The copyrights are -all fixed now. Let's get this thing OUT of here! - -4.9-ALPHA ------------------- March 15, 1993 -- Paul Vixie -- DECWRL - -There was a really bad bug affecting wildcards. I received a patch -from "Peter Koch" <pk@TechFak.Uni-Bielefeld.DE> which fixes some of -it, but I can't quite motivate myself to fix the rest of it since I -know that what's _really_ wrong is going to require chainsaws and -dynamite to fix and that'll add another year to the release. I think -that this patch will hold us for a while. - -There are a LOT of portability changes that I'm holding onto, especially -including 64-bit fixes. Do not submit any more portability changes -until 4.9.1 opens. Go ahead and make them, but be prepared to remake -them later. Let me know what you are doing but don't send me any diffs -for portability until I ask for them. 4.9 has been stuck in the barrel -for way too long already -- patches that don't fix RFC-noncompliance or -core dumps will just go into my "todo" folder (which is presently a -black hole of great mass). - -4.9-ALPHA ---------------- Febrtuary 2, 1992 -- Paul Vixie -- DECWRL - -Mostly portability fixes. The nslookup "lex" problem is BSDI-specific -and I'm not going to hold up release because of it. This will be the -last alpha release before the public beta. It is, as usual, running -the DEC.COM primary name service and has done so for more than a week -without any problems. - -4.9-ALPHA ---------------- January 10, 1993 -- Paul Vixie -- DECWRL - -Once I get the known bug in nslookup (see below) fixed, this version is going -to go into public beta. I would appreciate it if everyone would try it out. - -KNOWN BUG IN THIS RELEASE: something wild is going on inside of the yylex() -routing on BSD/386 systems. It only affects nslookup. I'm still trying to -figure out how I'm going to debug this; lex experts, please see what's going -on. None of the changes since the 930105 release should have been capable -of producing this change, but something is sure doing it. - -I finally fixed the {GET,PUT}{SHORT,LONG} macros to stop issuing warnings -on HP-UX systems. They are also warning-free on Ultrix(SPIM,VAX), BSDI(386), -and SunOS(SPARC) systems. I took the plunge and changed the internal functions -in res/res_comp.c to depend on these macros instead of duplicating the code, -and everything still works. - -Tom Limoncelli found three ancient memory leaks. I fixed two of them -but the last one looks too much like a "cannot happen" for me to be -willing to experiment with it. Besides which, it's "very" minor. - -Uses setsid() on POSIX systems. PID file is now optional. (arc@sgi) - -Comments (";" or "#") are now allowed in resolv.conf (arc@sgi). - -Documentation and copyright changes in README. - -Known to compile on NeXT machines. - -Some portability changes for AIX, whose CC is very picky. - -I forgot to mention in the 921227 release that T_RP is supported (arc@sgi). - -I included a number of changes that Alan Barrett has been trying to get -in since the 921221 version. Most are portability-related, and the few -things that are functional are changes to my own previous additions :-), -so I'm fairly sure that they are doing the right thing. Alan's changes -include: - - include/arpa/nameser.h - improved error diagnosis in the BYTE_ORDER configuration. - - changed hp9000 test to hp9000s300. As far as I know, there is - no hp9000 preprocessor symbol. Should probably add other - hp9000s<whatever> tests, but have not done so. - - named/ns.h - Moved the XFER-related stuff from the end of the file to near - the top, where it is grouped with similar stuff. - - Makefiles: - Add SYSLIBS variable, so folk can compile with -lBSD easily. - - Changed install targets to make them easier to customise. - - make links wasn't handling named.{reload,restart}* - - Add ${CDEBUG} flag to link step. Some debuggers don't work - right if the program isn't linked with the -g flag. - - struct timeval members are declared as unsigned long on some systems. - Add casts to (long) in several if statements that appear to assume - that tv_sec is signed. - - PID_FIX in ns_main.c controlled more than just whether or not the - pid file gets fixed. - Changed it to control only that one feature. - - For debugging, it is useful for a nameserver to listen to non-standard - port, but to forward requests to a standard port. - Add "-p remote/local" option to named/ns_main.c. - Also needed some other changes elsewhere. - - Don't forward back to the host that asked us a question, unless they - asked from some port other than their nameserver port. This allows a - dig or nslookup user on a host to ask us questions with - recursion-desired, where we are willing to recursively ask the - nameserver on their host. However, if a nameserver asks us something - we will not recurse back to them. - nslookup() in named/ns_forw.c checks for this and returns -1. - ns_forw() and sysquery() notice this and return SERVFAIL. - - Moved the nsContainsUs functionality from a separate routine - into nslookup(). No need to do the same tree walk several times. - - While trying to track down various problems, added detection - and logging of errors in several syscalls in ns_main.c. - - Avoid integer overflow in roundtrip time calc in ns_resp. - This needs a definition for INT_MAX. - - Fixed root zone transfer bug. Also corrected some slightly misleading - comments in the doaxfr() code, and added some more comments. - -4.9-ALPHA ---------------- January 5, 1993 -- Paul Vixie -- DECWRL - -This one was built and tested on Ultrix 4.2 (SPIM, MIPS CC and GCC), -BSD/386 (Gamma.4), Sun SPARC (4.0.3, sorry, that's the latest I have), -4.3BSD Reno (VAX, PCC), and Ultrix 3.0 (VAX PCC). - -Moved res/defs.h to conf/portability.h; named/options.h to conf/options.h. - -Portability changes for O_NDELAY. SUNOS is really strange about this. - -Removed some unneccessary goto's added to ns_main.c on 1jan. Oops. - -Art Harkin of HP sent in a number of small (read: obviously correct) -improvements, some related to portability, some to functionality. - -4.9-ALPHA ---------------- January 1, 1993 -- Paul Vixie -- DECWRL - -Changed all O_NONBLOCK to O_NDELAY. Changed all {r}index to str{r}chr. - -Added some SysV support in the form of bcopy->memcpy, bzero->memset. - -Added C_HS support to named-xfer (greg@duke.cs.unlv.edu). - -Fixed a line-number problem in asp's "include" logic (asp@uunet.uu.net). - -streamq's were being used after free(). bug report from fuat@ans.net -and jpe@ee.egr.duke.edu. bug fix by vixie. - -In the resolver, we now default to address 127.0.0.1 rather than 0.0.0.0. -There's a comment in the code that explains why. - -In the resolver, arc@xingping.esg.sgi.com changed it to use inet_aton() -and included that function for those not running 4.4bsd. - -arc@xingping.esg.sgi.com also provided lots of portability fixes and -general cleanups, in particular to nslookup which he maintains for CSRG. - -4.9-ALPHA ---------------- December 27, 1992 -- Paul Vixie -- DECWRL - -Added strtoul() to libresolv.a since it's yet another neccessary function -that older systems don't have. If we can stomach strcasecmp() we can sure -handle this. - -Moved res/named/gethostnamadr.c to res/gethnamaddr.c (note basename change) -and res/named/sethostent.c to res/sethostent.c. Since the host table stuff -isn't in separate files any more I saw no reason to retain the subdirectory. - -Updated all the copyrights and applied the small lint changes that bring -the baseline of this version from "4.8.3 as seen on ucbarpa" up to "4.8.3 -as released with net-2". Thanks to the alpha testers for pointing this out -to me and for sending in the diffs. - -With much howling and screaming, I ported this to UMIPS (MIPS System V). -There are a lot of really bad things going on in their libc.a, and now -they're going on in BIND as well. - -I added a "res/defs.h" file and then proceeded to include it from all kinds -of files that aren't in res/. I'm thinking of moving it but I'm also trying -to figure out where -- include/ is the wrong place. res/defs.h has in it all -the ugly ifdef's needed to figure out whether this is a late-model BSD system, -a POSIX system, or just old. - -All the "#endif" and "#else" cpp directives now have comments around their -annotations. It turns out that System V CPP complains about "#endif DEBUG" -but has no problem with "#endif /*DEBUG*/". In many cases where the #ifdef -was obviously visible and unambiguous, I simply removed the annotation. - -The "l" is now a ";". Thanks to all who replied :-). - -There was a very bad bug in the named-xfer interface. 'nuff said. - -AIX needs a 32-bit field for PID's. I can't imagine. But it's fixed. - -The "domain" directive in named.boot is now an option, defaulting to off. - -There was a benign bug in sqrm(). - -doaxfr() is now shorter and clearer. - -There is an "include" directive in the named.boot file now. Its syntax is -simple: "include somefile". No quotes, no "#", no <brackets>. This feature -was in 4.9-ALPHA as well, courtesy of Andrew Partan. I forgot to document it. - -4.9-ALPHA ---------------- December 21, 1992 -- Paul Vixie -- DECWRL - -This release incorporates fixes from a lot of people, including many from -DECWRL. Some fixes are just lint; some are to avoid dumping core on non-VAX -computers; many are to fix promiscuity, corruption, and rudeness. - -Various internal DEC programmers have ported the old 4.8.3 code to various -not-entirely-BSD-like platforms and turned up some interesting lint. All -of this has been fixed. Also, we fixed a bad bug in the handling of timeouts -and SERVFAIL's when forwarders and slave are both used. - -I have made major changes to the code inside the ALLOW_UPDATES ifdef's, but -I don't use it and have never compiled with that option turned on so I don't -know if it still works. Given that SNMP has come and there is an IETF WG for -SNMP management of the DNS, I am thinking very seriously of purging all of the -ALLOW_UPDATES code in 4.9.1. I suspect that Mike Schwartz will let me know if -this is ok.. - -(interrim "KJB" notes) ------------------- March, 1992 -- Paul Vixie -- DECWRL - -If we are about to forward a query for some zone for which we are one of the -servers, we send back a SERVFAIL instead. If we don't have it, chances are -good that the other name servers won't have it either. This is the major -cause of "network meltdown" when the root servers declare you as a name server -for some zone you don't know about and havn't configured yourself for. - -Fixed a memory leak such that if db_update() fails to update the database -from a response packet, a databuf will no longer be orphaned. Also fixed -what looks like a similar leak in the ALLOW_UPDATES code but I don't use it -that hasn't been tested. - -Fixed a memory sponge such that if we forward a query to someone who is not -ever going to answer it, we will eventually expire it from our query queue. -Previously it would expire after N retries to N' different servers, which -could be a very long time. Particularly in the case of lame delegations and -other forwarding loops, we feel that 90 seconds (two max-retry intervals) is -enough time for a query to be answered. While we were into this code we made -several fields in the query structure into "short"'s since they were only -being used to store smallish integers. The query list gets Very Long during -a forwarding loop -- even 90 seconds worth of queries is a lot of queries. - -This version includes my hacks that assign a "credibility index" to each -<name,type> such that when more credible data arrives for a given -<name,type>, all old data is purged. When equally-credible data arrives it -is aggregated in the way we all know and love; when less credible data -arrives it is completely ignored. Credibility, from best to worst, is: - 1. zone files (primary or secondary) - 2. authoritative answers - 3. non-authoritative answers and authority records - 4. additional data - 5. zone files ("cache" or "bootstrap" information) -You need this version of bind if you still show any A RR's in network -32.0.0.0 when you look up uucp-gw-1.pa.dec.com's A or adobe.com's NS. - -I have also added some extra code to prevent pollution of the internal -"hint cache." In all versions of BIND that I was able to test, any IN_A -response to any sysquery() would cause the IN_A RR to be added to the -fcachetab ("hint cache"). This resulted in lots of extra cruft in the hint -cache, that wasn't timed out properly, which in turn resulted in lots of -strange answers ('nuff said, take my word for it.) - -Though changes have been made to make the Ultrix and GNU (2.1) C compilers -stop complaining about the source, it should still compile and run just -about anywhere. In fact, after I cleaned up lots of old lint, this version -of BIND is known to compile and run on: - - Ultrix 4.2 (MIPS or VAX) - SunOS 4.0.3 - BSD/386 (BSDi beta) - -This was being released as King James Bind because, like KJ Sendmail, it is -a merge of every major variant of Bind that we know about. It was -assembled and tested by Paul Vixie of DEC NSL/WRL, with generous donations -of code and advice from Win Treese of DEC CRL. Changes from Don Lewis of -Harris, Andrew Partan of UUNET, and Piet Beertema of EUNet are also included. -See the OPTIONS file for a description of the changes you can control with -#ifdef's. - -This server has been run on UUCP-GW-{1,2}.PA.DEC.COM, which are in the UUCP -Zone. Our named.boot file has ~1900 lines in it. Before we instituted the -changes in this release, our name server usually ran at about 16MB virtual, -15MB physical, growing slowly but constantly until we restarted it. -Whenever a new zone was added to the NIC's root zone listing us as a name -server, our servers would kill themselves and eachother (and NS.UU.NET, one -of the other UUCP Zone name servers) with forwarding loops. After these -changes, we run at a fairly constant 8MB virtual and physical size, and our -apparent CPU utilization is always 0.0% since we never finish a quantum and -the scheduler always sees us as waiting for I-O. In other words, life is good. - -Notes from UCB version 4.8.3 follow: - -------------------- - -This is version 4.8.3 of bind. It is a test release that updates -versions 4.8 and 4.8.1 with fixes, and is essentially the same as -the version of named on the 4.3BSD Reno release. Although it is -currently described as a test release, it is believed to be reasonably -stable and more usable than the previously-released versions. -Here are some of the more important changes: - - o A list of domains may be specified for searching in resolv.conf instead - of just the local domain name. - - o gethostbyname() will accept a dotted quad. - - o Support has been added for the the T_TXT data type and for the class - C_HS. These are both used by Hesiod from Project Athena at MIT. - - o All of the pathnames have been put into one header file. This - makes it easier to change the location based upon your local - configuration. - - o Responses are only accepted from an address to which we might of sent - the request. This might cause problems if some server is multihomed - and is still running BIND 4.3, but it prevents attacks induced by - sending responses from another address. - - o Numerous bugs have been fixed: Adding a new authoritative zone now - works when the server has a cached SOA record. Comparisons in the - db now look at type and class as well instead of dropping records - with identical data. Scheduling of maintenance interrupts has been - moved to one routine avoid spurious ones. Named goes into the background - after more of the initialization is done. Stream connection queue - handling was cleaned up including a bug that caused data corruption - and core dumps. Sys5 no longer can have multiple transfers of the - same zone occuring at the same time. Handle CNAME -> CNAME loops - more gracefully. Avoid making one server never get queried. Border - conditions in resolver are checked more accurately. - - o Nslookup has been updated. - -There are several bug reports that have yet to be integrated into this -version. Hopefully they will be dealt with in the next release. Please -send feedback on this release. - -Notes from versions 4.8.1 and 4.8 follow: - ------------------- - -This is version 4.8.1 of bind. It is a test release that includes -version 4.8 with fixes, asynchronous zone transfer and better reload -capabilities. Although it is currently described as a test release, -it is believed to be reasonably stable and more usable than the currently- -released version, 4.8. The changes of note are: - - o The asynchronous zone transfer code previously posted to the bind - mailing list has been integrated, completed and tested. There are - a number of changes from the version posted, including fixes to - allow top-level domains to work and a simplification of the timer - code. - - o The code for reloading the server has been changed so that only - primary zones master files that have changed are reloaded. The - cache and secondary zones are not flushed, and the sortlist, domain, - etc. are reset to correspond to the boot file contents. - - o Several bugs have been fixed: the name "*" is not interpreted as - a wildcard in cached zones, only in primary zones. Secondary servers - no longer decrement the time-to-live of records by the time since - they verified the zone with the master; as a result, they never - hand out nameserver referrals with too short a TTL to be usable. - A bug was fixed that caused secondary servers with out-of-date - zones to return empty answers between the actual expiration time - and the next timeout. - -There are several other bugs that have been reported but have not yet -been fixed. In addition, the next regular release of named will -support negative caching, but this has not been integrated. - -I would appreciate receiving feedback on this release; in particular, -problems (or lack of problems) when installing on various systems. -I attempted to update the SysV code when integrating the zone-transfer, -but haven't tested it. - -The notes from version 4.8 follow. - ----------- -Welcome to version 4.8 of bind. - -There have been several changes to the named boot file (/etc/named.boot) -of which you should be aware. The "domain" line for each zone is no longer -needed, but one such line may still be used to specify a default domain -to be used for queries containing names with only a single component. -The term "suffixes", which was added in version 4.7alpha, has been removed. - -The manual page on named (named.8) has been updated to reflect all -these changes. Please read this and look at the example files -before installation. You should also note the changes in the -resolver code to support non-fully-qualified addresses and per-user -host aliases. See hostname(7) for an overview. Two new routines -have been added to the resolver library since the last test release: -res_query formulates a query, sends it, waits for a response and does -preliminary error checking; res_search implements the search rules -of gethostbyname using res_query. - -The MX lookup routine in sendmail has been modified to use res_search. -Also, dn_skip takes an additional parameter and has been renamed -to dn_skipname. While old sendmail binaries will work with the new -version of bind, because of these changes, it is desirable to install -new sendmail sources and recompile sendmail. Do not rebuild sendmail -from old sources. The new sendmail is on ucbarpa.Berkeley.EDU for -anonymous FTP from pub/4.3/sendmail.MX.tar and pub/4.3/sendmail.MX.tar.Z. - -There have been numerous changes to named, fixing most of the known -bugs that can be fixed without major structural changes in the server. -Several server configurations that failed before should now work. -Certain robustness problems have been fixed, in particular bounds- -checking when processing incoming packets. Two changes have been made -in preparation for negative caching: SOA records are sent in the authority -section in negative responses with NXDOMAIN set, and a bug was fixed that -caused confusion and repeated requests if a response had no error, no answer -and an SOA in the authority section. As such responses are already sent -by other servers, and will be sent by the next release of BIND, it is -important that all sites upgrade to this version as quickly as possible. - -The root "hint" cache and cache file remain the largest problem area, -along with named's naivete in accepting bogus server's data. -These will be addressed in the next release, along with asynchronous -zone transfers, intelligent reloading of zone files, faster startup, -and caching of negative responses. - -This version (4.8) will replace the last officially released version (4.5). -Version 4.5 has a serious bug that causes the generation of a continuous -stream of bogons to the root domain servers (bogus queries with the query -response bit set and possibly garbage for nsid and rcode). It is imperative -that these versions of named be replaced as fast as possible. We urge you to -field 4.8 quickly, for the sake of the root domain servers. - - Mike Karels - Jean Wood - bind@ucbarpa.Berkeley.EDU - -## ++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-- diff --git a/usr.sbin/named/Makefile b/usr.sbin/named/Makefile index 0afe83e..e92c454 100644 --- a/usr.sbin/named/Makefile +++ b/usr.sbin/named/Makefile @@ -1,80 +1,34 @@ -# -# @(#)Makefile 5.8 (Berkeley) 7/28/90 -# +# $Id$ -## ++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 "${.CURDIR}/Makefile.inc" + +.PATH: ${BIND_DIR}/named +.PATH: ${BIND_DIR}/man PROG= named +SRCS= version.c db_dump.c db_glue.c db_load.c db_lookup.c db_reload.c \ + db_save.c db_secure.c db_update.c dmalloc.c ns_forw.c \ + ns_init.c ns_main.c ns_maint.c ns_ncache.c ns_req.c ns_resp.c \ + ns_sort.c ns_stats.c ns_validate.c storage.c tree.c MAN8= named.8 -LDADD= -lutil -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 dmalloc.c tree.c -OBJS+= version.o -CLEANFILES+=version.c version.o -SUBDIR= tools xfer -VER = 4.9.3-P1 +CLEANFILES+= version.c -version.c: ${.CURDIR}/Version.c ${.CURDIR}/Makefile ${SRCS} - (LC_TIME=; export LC_TIME; u=$${USER-root} d=`pwd |sed -e 's|/obj/|/src/|'` \ - h=`hostname` t=`date`; \ +version.c: Version.c ${BIND_DIR}/Makefile + (u=$${USER-root} d=`pwd` h=`hostname` t=`date`; \ sed -e "s|%WHEN%|$${t}|" -e "s|%VERSION%|"${VER}"|" \ -e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \ - < ${.CURDIR}/Version.c > version.c) + < ${BIND_DIR}/named/Version.c > version.c) -.include <bsd.prog.mk> +MAN3+= gethostbyname.3 getnetent.3 resolver.3 +MLINKS+=gethostbyname.3 endhostent.3 gethostbyname.3 gethostbyaddr.3 \ + gethostbyname.3 sethostent.3 gethostbyname.3 gethostent.3 \ + gethostbyname.3 herror.3 +MLINKS+=getnetent.3 endnetent.3 getnetent.3 getnetbyaddr.3 \ + getnetent.3 getnetbyname.3 getnetent.3 setnetent.3 +MLINKS+=resolver.3 dn_comp.3 resolver.3 dn_expand.3 resolver.3 res_init.3 \ + resolver.3 res_mkquery.3 resolver.3 res_send.3 resolver.3 res_query.3 \ + resolver.3 res_search.3 + +.include <bsd.prog.mk> diff --git a/usr.sbin/named/Makefile.inc b/usr.sbin/named/Makefile.inc new file mode 100644 index 0000000..864ef39 --- /dev/null +++ b/usr.sbin/named/Makefile.inc @@ -0,0 +1,27 @@ +# From: Id: Makefile.inc,v 8.4 1996/03/03 17:42:43 vixie Exp +# $Id$ + +.ifndef (Mk.Inc) +Mk.Inc?=defined + +BIND_DIR= ${.CURDIR}/../../contrib/bind + +VER!= awk -F' *= *' '$$1 == "VER" { print $$2 ; exit }' \ + ${BIND_DIR}/Makefile + +PIDDIR= /var/run +INDOT= +XFER_INDOT= ${INDOT} +PS= ps +DESTSBIN= /usr/sbin +IOT= ABRT + +CONFIG?= -DUSE_OPTIONS_H +INCLUDE?= -I. -I${BIND_DIR} -I${BIND_DIR}/include +CFLAGS+= ${INCLUDE} ${CONFIG} + +BINGRP= bin +BINOWN= bin + +.include "Makefile.maninc" +.endif diff --git a/usr.sbin/named/Makefile.maninc b/usr.sbin/named/Makefile.maninc new file mode 100644 index 0000000..b7d2b77 --- /dev/null +++ b/usr.sbin/named/Makefile.maninc @@ -0,0 +1,56 @@ +# From: Id: Makefile.maninc,v 8.1 1994/12/15 06:23:43 vixie Exp +# $Id: Makefile.maninc,v 1.1.1.1 1996/08/29 19:42:58 peter Exp $ + +# (the BIND kit's man page Makefile has gotten bad and crazy over the years. +# this file has to be included AFTER bsd.prog.mk (which includes bsd.man.mk)) +CMD_EXT= 1 +SYSCALL_EXT= 2 +BSD_SYSCALL_EXT=2 +LIB_C_EXT= 3 +LIB_NETWORK_EXT=3 +FORMAT_EXT= 5 +DESC_EXT= 7 +SYS_OPS_EXT= 8 + +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" + +MANFILTER= ${EXT_SED_CMD} diff --git a/usr.sbin/named/OPTIONS b/usr.sbin/named/OPTIONS deleted file mode 100644 index ccc5e27..0000000 --- a/usr.sbin/named/OPTIONS +++ /dev/null @@ -1,411 +0,0 @@ -OPTIONS - Original: Paul Vixie, 28Mar92 - Revised: $Id: OPTIONS,v 8.5 1995/12/29 21:08:13 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. - 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 disable the -feature. Requires STATS. - You may want this, it is on 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 LOC RR type, currently in the -internet-draft stage. - you don't want this yet, it is off 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/usr.sbin/named/Version.c b/usr.sbin/named/Version.c deleted file mode 100644 index 60a7ba8..0000000 --- a/usr.sbin/named/Version.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * @(#)Version.c 4.9 (Berkeley) 7/21/90 - * $Id: Version.c,v 8.1 1994/12/15 06:24:14 vixie Exp $ - */ - -#ifndef lint -char sccsid[] = "@(#)named %VERSION% %WHEN% %WHOANDWHERE%"; -char rcsid[] = "$Id: Version.c,v 8.1 1994/12/15 06:24:14 vixie Exp $"; -#endif /* not lint */ - -char Version[] = "named %VERSION% %WHEN%\n\t%WHOANDWHERE%"; - -#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/usr.sbin/named/db_defs.h b/usr.sbin/named/db_defs.h deleted file mode 100644 index 115615f..0000000 --- a/usr.sbin/named/db_defs.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * from db.h 4.16 (Berkeley) 6/1/90 - * $Id: db_defs.h,v 1.2 1995/05/30 03:48:34 rgrimes 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 */ - 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_mark; /* place to mark data */ - int16_t d_size; /* size of data area */ -#ifdef NCACHE - int16_t d_rcode; /* rcode added for negative caching */ -#endif - int16_t d_rcnt; -#ifdef STATS - struct nameser *d_ns; /* NS from whence this came */ -#endif -/*XXX*/ u_int32_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 */ - -/* - * 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 { - char *n_dname; /* domain name */ - u_int n_hashval; /* hash value of n_dname */ - struct namebuf *n_next; /* linked list */ - struct databuf *n_data; /* data records */ - struct namebuf *n_parent; /* parent domain */ - struct hashbuf *n_hash; /* hash table for children */ -}; - -#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/usr.sbin/named/db_dump.c b/usr.sbin/named/db_dump.c deleted file mode 100644 index e38719d..0000000 --- a/usr.sbin/named/db_dump.c +++ /dev/null @@ -1,919 +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 1.5 1996/01/07 05:48:21 peter 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. - * - - * --Copyright-- - */ - -#include <sys/param.h> -#include <sys/stat.h> -#include <netinet/in.h> -#ifdef ISO -#include <netiso/iso.h> -#endif -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <stdio.h> -#include <syslog.h> -#include <resolv.h> -#include <errno.h> - -#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 (np->n_dname[0] == '\0') { - dp = np->n_data; - while (dp != NULL) { - if (dp->d_type == T_NS && - dp->d_ttl > soon.tv_sec) { - roots++; - if (roots >= MINROOTS) - return (roots); - } - dp = dp->d_next; - } - } - } - return (roots); -} - -#ifdef notdef -mark_cache(htp, ttl) - struct hashbuf *htp; - int ttl; -{ - register struct databuf *dp; - register struct namebuf *np; - struct namebuf **npp, **nppend; - struct timeval soon; - - 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"); -} - -#ifdef ALLOW_UPDATES -/* Create a disk database to back up zones - */ -void -zonedump(zp) - register struct zoneinfo *zp; -{ - FILE *fp; - char *fname; - struct hashbuf *htp; - char *op; - struct stat st; - - /* Only dump zone if there is a cache specified */ - if (zp->z_source && *(zp->z_source)) { - dprintf(1, (ddt, "zonedump(%s)\n", zp->z_source)); - - if ((fp = fopen(zp->z_source, "w")) == NULL) - return; - if (op = strchr(zp->z_origin, '.')) - op++; - gettime(&tt); - htp = hashtab; - if (nlookup(zp->z_origin, &htp, &fname, 0) != NULL) { - db_dump(htp, fp, zp-zones, (op == NULL ? "" : op)); - zp->z_flags &= ~Z_CHANGED; /* Checkpointed */ - } - (void) my_fclose(fp); - if (stat(zp->z_source, &st) == 0) - zp->z_ftime = st.st_mtime; - } else { - dprintf(1, (ddt, "zonedump: no zone to dump\n")); - } -} -#endif - -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=%ld, lastupdate=%ld, serial=%u,\n", - zp->z_time, 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=%ld, xaddr=[%s], state=%04x, pid=%d\n", - 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; -#ifdef ISO - struct iso_addr isoa; -#endif - register u_char *cp; - u_char *end; - char *proto, *sep; - int found_data = 0, tab, printed_origin = 0; - - npp = htp->h_tab; - nppend = npp + htp->h_size; - while (npp < nppend) { - for (np = *npp++; np != NULL; np = np->n_next) { - if (np->n_data == NULL) - continue; - /* Blecch - can't tell if there is data here for the - * right zone, so can't print name yet - */ - found_data = 0; - /* we want a snapshot in time... */ - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - /* Is the data for this zone? */ - if (zone != DB_Z_ALL && dp->d_zone != zone) - continue; - if (dp->d_zone == DB_Z_CACHE && - dp->d_ttl <= tt.tv_sec && - (dp->d_flags & DB_F_HINT) == 0) - continue; - if (!printed_origin) { - fprintf(fp, "$ORIGIN %s.\n", origin); - printed_origin++; - } - tab = 0; -#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 (np->n_dname[0] == 0) { - if (origin[0] == 0) - fprintf(fp, ".\t"); - else - fprintf(fp, ".%s.\t", origin); /* ??? */ - } else - fprintf(fp, "%s\t", np->n_dname); - if (strlen(np->n_dname) < (size_t)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 != 0 && - dp->d_ttl != zones[dp->d_zone].z_minimum) - fprintf(fp, "%d\t", (int)dp->d_ttl); - else if (tab) - (void) putc('\t', fp); - fprintf(fp, "%s\t%s\t", - p_class(dp->d_class), - p_type(dp->d_type)); - cp = (u_char *)dp->d_data; - sep = "\t;"; -#ifdef NCACHE -#ifdef RETURNSOA - if (dp->d_rcode == NOERROR_NODATA) { - fprintf(fp, "NODATA%s-$", sep); - goto eoln; - } -#else - if (dp->d_rcode == NXDOMAIN || - dp->d_rcode == NOERROR_NODATA) { - fprintf(fp, "%s%s-$", - (dp->d_rcode == NXDOMAIN) - ?"NXDOMAIN" :"NODATA", - sep); - goto eoln; - } -#endif -#endif - /* - * Print type specific data - */ - switch (dp->d_type) { - case T_A: - switch (dp->d_class) { - case C_IN: - case C_HS: - GETLONG(n, cp); - n = htonl(n); - 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: - if ((n = *cp++) != '\0') { - fprintf(fp, "\"%.*s\"", (int)n, cp); - cp += n; - } else - fprintf(fp, "\"\""); - if ((n = *cp++) != '\0') - fprintf(fp, " \"%.*s\"", (int)n, cp); - 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 == NXDOMAIN) - 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 == NXDOMAIN) { - fprintf(fp,";%s.;NXDOMAIN%s-$",cp,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_TXT: - case T_X25: - end = (u_char *)dp->d_data + dp->d_size; - (void) putc('"', fp); - while (cp < end) { - if ((n = *cp++) != '\0') { - for (j = n ; j > 0 && cp < end ; j--) - if (*cp == '\n') { - (void) putc('\\', fp); - (void) putc(*cp++, fp); - } else - (void) putc(*cp++, fp); - } - } - (void) fputs("\"", fp); - break; - -#ifdef ISO - case T_NSAP: - isoa.isoa_len = dp->d_size; - if (isoa.isoa_len > sizeof(isoa.isoa_genaddr)) - isoa.isoa_len = sizeof(isoa.isoa_genaddr); - bcopy(dp->d_data, isoa.isoa_genaddr, - isoa.isoa_len); - (void) fputs(iso_ntoa(&isoa), fp); - break; -#endif -#ifdef LOC_RR - case T_LOC: - (void) fputs(loc_ntoa(dp->d_data, NULL), fp); - break; -#endif /* LOC_RR */ - 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; -#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, "%ld %lx %lx %lx", numbytes, &oeor, &osum, &orot) != 4) - return(CONV_BADFMT); - if ((oeor != Ceor) || (osum != Csum) || (orot != Crot)) - return(CONV_BADCKSUM); - return(CONV_SUCCESS); -} - -/* Encode binary byte c into ASCII representation and place into *bufp, - advancing bufp */ -static 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 unsigned 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 %ld %lx %lx %lx", inbuflen, Ceor, Csum, Crot); - if (&outp[strlen(outp) - 1] >= endoutp) - return(CONV_OVERFLOW); - else - return(CONV_SUCCESS); -} -#endif /* ALLOW_T_UNSPEC */ diff --git a/usr.sbin/named/db_func.h b/usr.sbin/named/db_func.h deleted file mode 100644 index 78327d0..0000000 --- a/usr.sbin/named/db_func.h +++ /dev/null @@ -1,116 +0,0 @@ -/* db_proc.h - prototypes for functions in db_*.c - * - * $Id: db_func.h,v 1.3 1995/08/20 21:18:16 peter Exp $ - */ - -/* ++from db_update.c++ */ -extern int db_update __P((char name[], - struct databuf *odp, - struct databuf *newdp, - int flags, - struct hashbuf *htp)), - findMyZone __P((struct namebuf *np, int class)); -/* --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)); -#ifdef DMALLOC -extern struct databuf *savedata_tagged __P((char *, int, - int, int, u_int32_t, - u_char *, int)); -#define savedata(class, type, ttl, data, size) \ - savedata_tagged(__FILE__, __LINE__, class, type, ttl, data, size) -#else -extern struct databuf *savedata __P((int, int, u_int32_t, - u_char *, int)); -#endif -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)); -#ifdef ALLOW_UPDATES -extern void zonedump __P((struct zoneinfo *)); -#endif -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 -#ifdef LOC_RR -extern u_int32_t loc_aton __P((const char *ascii, u_char *binary)); -extern char * loc_ntoa __P((const u_char *binary, char *ascii)); -#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 (*)())); -/* --from db_glue.c-- */ - -/* ++from db_lookup.c++ */ -extern struct namebuf *nlookup __P((const char *, struct hashbuf **, - const char **, int)); -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/usr.sbin/named/db_glob.h b/usr.sbin/named/db_glob.h deleted file mode 100644 index 58c514f..0000000 --- a/usr.sbin/named/db_glob.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * from db.h 4.16 (Berkeley) 6/1/90 - * $Id: db_glob.h,v 1.2 1995/05/30 03:48:37 rgrimes 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 int max_cache_ttl INIT(7*24*60*60); - - /* no minimum ttl */ -DECL 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/usr.sbin/named/db_glue.c b/usr.sbin/named/db_glue.c deleted file mode 100644 index a01184c..0000000 --- a/usr.sbin/named/db_glue.c +++ /dev/null @@ -1,1224 +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 1.4 1995/10/23 11:11:42 peter Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1988 - * - - * Copyright (c) 1986, 1988 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#include <sys/types.h> -#include <sys/uio.h> -#include <sys/param.h> -#include <sys/stat.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#include <stdio.h> -#include <syslog.h> -#include <ctype.h> -#include <netdb.h> -#include <resolv.h> -#include <errno.h> -#include <signal.h> - -#include "named.h" - -struct valuelist { - struct valuelist *next, *prev; - char *name; - char *proto; - int port; -}; -static struct valuelist *servicelist, *protolist; - -#if defined(ultrix) -/* ultrix 4.0 has some icky packaging details. work around them here. - * since this module is linked into named and named-xfer, we end up - * forcing both to drag in our own res_send rather than ultrix's hesiod - * version of that. - */ -static const int (*unused_junk)__P((const u_char *, int, u_char *, int)) = - res_send; -; -#endif - -/*XXX: sin_ntoa() should probably be in libc*/ -const char * -sin_ntoa(sin) - const struct sockaddr_in *sin; -{ - static char ret[sizeof "[111.222.333.444].55555"]; - - if (!sin) - strcpy(ret, "[sin_ntoa(NULL)]"); - else - sprintf(ret, "[%s].%u", - inet_ntoa(sin->sin_addr), - ntohs(sin->sin_port)); - return (ret); -} - -/* - * XXX: some day we'll make this a varargs function - */ -void -panic(err, msg) - int err; - const char *msg; -{ - if (err == -1) - syslog(LOG_CRIT, "%s - ABORT", msg); - else - syslog(LOG_CRIT, "%s: %s - ABORT", msg, strerror(err)); - signal(SIGIOT, SIG_DFL); /* no POSIX needed here. */ - abort(); -} - -void -buildservicelist() -{ - struct servent *sp; - struct valuelist *slp; - -#ifdef MAYBE_HESIOD - setservent(0); -#else - setservent(1); -#endif - while (sp = getservent()) { - slp = (struct valuelist *)malloc(sizeof(struct valuelist)); - if (!slp) - panic(errno, "malloc(servent)"); - slp->name = savestr(sp->s_name); - slp->proto = savestr(sp->s_proto); - slp->port = ntohs((u_int16_t)sp->s_port); /* host byt order */ - slp->next = servicelist; - slp->prev = NULL; - if (servicelist) - servicelist->prev = slp; - servicelist = slp; - } - endservent(); -} - -void -buildprotolist() -{ - struct protoent *pp; - struct valuelist *slp; - -#ifdef MAYBE_HESIOD - setprotoent(0); -#else - setprotoent(1); -#endif - while (pp = getprotoent()) { - slp = (struct valuelist *)malloc(sizeof(struct valuelist)); - if (!slp) - panic(errno, "malloc(protoent)"); - slp->name = savestr(pp->p_name); - slp->port = pp->p_proto; /* host byte order */ - slp->next = protolist; - slp->prev = NULL; - if (protolist) - protolist->prev = slp; - protolist = slp; - } - endprotoent(); -} - -static int -findservice(s, list) - register char *s; - register struct valuelist **list; -{ - register struct valuelist *lp = *list; - int n; - - for (; lp != NULL; lp = lp->next) - if (strcasecmp(lp->name, s) == 0) { - if (lp != *list) { - lp->prev->next = lp->next; - if (lp->next) - lp->next->prev = lp->prev; - (*list)->prev = lp; - lp->next = *list; - *list = lp; - } - return (lp->port); /* host byte order */ - } - if (sscanf(s, "%d", &n) != 1 || n <= 0) - n = -1; - return (n); -} - -/* - * Convert service name or (ascii) number to int. - */ -int -servicenumber(p) - char *p; -{ - return (findservice(p, &servicelist)); -} - -/* - * Convert protocol name or (ascii) number to int. - */ -int -protocolnumber(p) - char *p; -{ - return (findservice(p, &protolist)); -} - -#if defined(__STDC__) || defined(__GNUC__) -static struct servent * -cgetservbyport(u_int16_t port, /* net byte order */ - char *proto) -#else -static struct servent * -cgetservbyport(port, proto) - u_int16_t port; /* net byte order */ - char *proto; -#endif -{ - register struct valuelist **list = &servicelist; - register struct valuelist *lp = *list; - static struct servent serv; - - port = ntohs(port); - for (; lp != NULL; lp = lp->next) { - if (port != (u_int16_t)lp->port) /* host byte order */ - continue; - if (strcasecmp(lp->proto, proto) == 0) { - if (lp != *list) { - lp->prev->next = lp->next; - if (lp->next) - lp->next->prev = lp->prev; - (*list)->prev = lp; - lp->next = *list; - *list = lp; - } - serv.s_name = lp->name; - serv.s_port = htons((u_int16_t)lp->port); - serv.s_proto = lp->proto; - return (&serv); - } - } - return (0); -} - -static struct protoent * -cgetprotobynumber(proto) - register int proto; /* host byte order */ -{ - register struct valuelist **list = &protolist; - register struct valuelist *lp = *list; - static struct protoent prot; - - for (; lp != NULL; lp = lp->next) - if (lp->port == proto) { /* host byte order */ - if (lp != *list) { - lp->prev->next = lp->next; - if (lp->next) - lp->next->prev = lp->prev; - (*list)->prev = lp; - lp->next = *list; - *list = lp; - } - prot.p_name = lp->name; - prot.p_proto = lp->port; /* host byte order */ - return (&prot); - } - return (0); -} - -char * -protocolname(num) - int num; -{ - static char number[8]; - struct protoent *pp; - - pp = cgetprotobynumber(num); - if(pp == 0) { - (void) sprintf(number, "%d", num); - return (number); - } - return (pp->p_name); -} - -#if defined(__STDC__) || defined(__GNUC__) -char * -servicename(u_int16_t port, char *proto) /* host byte order */ -#else -char * -servicename(port, proto) - u_int16_t port; /* host byte order */ - char *proto; -#endif -{ - static char number[8]; - struct servent *ss; - - ss = cgetservbyport(htons(port), proto); - if (ss == 0) { - (void) sprintf(number, "%d", port); - return (number); - } - return (ss->s_name); -} - -u_int -db_getclev(origin) - const char *origin; -{ - u_int lev = 0; - dprintf(12, (ddt, "db_getclev of \"%s\"", origin)); - if (origin && *origin) - lev++; - while (origin && (origin = strchr(origin, '.'))) { - origin++; - lev++; - } - dprintf(12, (ddt, " = %d\n", lev)); - return (lev); -} - -void -gettime(ttp) - struct timeval *ttp; -{ - if (gettimeofday(ttp, NULL) < 0) - syslog(LOG_ERR, "gettimeofday: %m"); - return; -} - -#if !defined(BSD) -int -getdtablesize() -{ -#if defined(USE_POSIX) - int j = (int) sysconf(_SC_OPEN_MAX); - - if (j >= 0) - return (j); -#endif /* POSIX */ - return (FD_SETSIZE); -} -#endif /* BSD */ - -int -my_close(fd) - int fd; -{ - int s; - - do { - errno = 0; - s = close(fd); - } while (s < 0 && errno == EINTR); - - if (s < 0 && errno != EBADF) - syslog(LOG_INFO, "close(%d) failed: %m", fd); - else - dprintf(3, (ddt, "close(%d) succeeded\n", fd)); - return (s); -} - -#ifdef GEN_AXFR -/* - * Map class names to number - */ -struct map { - char *token; - int val; -}; - -static struct map map_class[] = { - { "in", C_IN }, - { "chaos", C_CHAOS }, - { "hs", C_HS }, - { NULL, 0 } -}; - -int -get_class(class) - char *class; -{ - struct map *mp; - - if (isdigit(*class)) - return (atoi(class)); - for (mp = map_class; mp->token != NULL; mp++) - if (strcasecmp(class, mp->token) == 0) - return (mp->val); - return (C_IN); -} -#endif - -int -my_fclose(fp) - FILE *fp; -{ - int fd = fileno(fp), - s = fclose(fp); - - if (s < 0) - syslog(LOG_INFO, "fclose(%d) failed: %m", fd); - else - dprintf(3, (ddt, "fclose(%d) succeeded\n", fd)); - return (s); -} - -/* - * Make a copy of a string and return a pointer to it. - */ -char * -savestr(str) - const char *str; -{ - char *cp; - - cp = (char *)malloc(strlen(str) + 1); - if (!cp) - panic(errno, "malloc(savestr)"); - strcpy(cp, str); - 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; -#ifdef DATUMREFCNT - if (--(dp->d_rcnt)) { - 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: - dprintf(1, (ddt, "rm_datum: %08.8X rcnt = %d\n", - *(int32_t*)(dp->d_data), dp->d_rcnt)); - break; - default: - dprintf(1, (ddt, "rm_datum: rcnt = %d\n", dp->d_rcnt)); - } - } else -#endif - free((char *)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, np->n_dname?np->n_dname:"Nil", msg); - panic(-1, "rm_name"); - } - - /* unlink */ - if (pnp) { - pnp->n_next = nnp; - } else { - *pp = nnp; - } - - /* deallocate */ - free(np->n_dname); - 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) { - if ((i = strlen(np->n_dname))+1 >= buflen) { - *cp = '\0'; - syslog(LOG_INFO, "domain name too long: %s...\n", buf); - strcpy(buf, "Name_Too_Long"); - return; - } - if (cp != buf) - *cp++ = '.'; - (void) strcpy(cp, np->n_dname); - cp += i; - buflen -= (i+1); - np = np->n_parent; - } - *cp = '\0'; -} - -#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; - const char *cp; - - la = strlen(a); - lb = strlen(b); - - /* don't count trailing dots, if any. */ - if (la && a[la-1]=='.') - la--; - if (lb && b[lb-1]=='.') - 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 trailing dots. */ - if (lb == la) - return (strncasecmp(a, b, lb) == 0); - - /* Ok, we know la > lb. */ - - /* Point at the character before the last 'lb' characters of a. */ - cp = a + (la - lb - 1); - - /* If it isn't '.', can't be a match (this lets us avoid - * having "foobar.com" match "bar.com"). */ - if (*cp != '.') - return (0); - - cp++; - - /* We use strncasecmp because we might be trying to - * ignore trailing dots. */ - return (strncasecmp(cp, b, lb)==0); -} - -#ifdef LOC_RR -/* - * routines to convert between on-the-wire RR format and zone file format. - * Does not contain conversion to/from decimal degrees; divide or multiply - * by 60*60*1000 for that. - */ - -static unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000, - 1000000,10000000,100000000,1000000000}; - -/* takes an XeY precision/size value, returns a string representation. */ -static const char * -precsize_ntoa(prec) - u_int8_t prec; -{ - static char retbuf[sizeof("90000000.00")]; - unsigned long val; - int mantissa, exponent; - - mantissa = (int)((prec >> 4) & 0x0f) % 10; - exponent = (int)((prec >> 0) & 0x0f) % 10; - - val = mantissa * poweroften[exponent]; - - (void) sprintf(retbuf,"%d.%.2d", val/100, val%100); - return (retbuf); -} - -/* converts ascii size/precision X * 10**Y(cm) to 0xXY. moves pointer. */ -static u_int8_t -precsize_aton(strptr) - char **strptr; -{ - unsigned int mval = 0, cmval = 0; - u_int8_t retval = 0; - register char *cp; - register int exponent; - register int mantissa; - - cp = *strptr; - - while (isdigit(*cp)) - mval = mval * 10 + (*cp++ - '0'); - - if (*cp == '.') { /* centimeters */ - cp++; - if (isdigit(*cp)) { - cmval = (*cp++ - '0') * 10; - if (isdigit(*cp)) { - cmval += (*cp++ - '0'); - } - } - } - cmval = (mval * 100) + cmval; - - for (exponent = 0; exponent < 9; exponent++) - if (cmval < poweroften[exponent+1]) - break; - - mantissa = cmval / poweroften[exponent]; - if (mantissa > 9) - mantissa = 9; - - retval = (mantissa << 4) | exponent; - - *strptr = cp; - - return (retval); -} - -/* converts ascii lat/lon to unsigned encoded 32-bit number. moves pointer. */ -static u_int32_t -latlon2ul(latlonstrptr,which) - char **latlonstrptr; - int *which; -{ - register char *cp; - u_int32_t retval; - int deg = 0, min = 0, secs = 0, secsfrac = 0; - - cp = *latlonstrptr; - - while (isdigit(*cp)) - deg = deg * 10 + (*cp++ - '0'); - - while (isspace(*cp)) - cp++; - - if (!(isdigit(*cp))) - goto fndhemi; - - while (isdigit(*cp)) - min = min * 10 + (*cp++ - '0'); - - while (isspace(*cp)) - cp++; - - if (!(isdigit(*cp))) - goto fndhemi; - - while (isdigit(*cp)) - secs = secs * 10 + (*cp++ - '0'); - - if (*cp == '.') { /* decimal seconds */ - cp++; - if (isdigit(*cp)) { - secsfrac = (*cp++ - '0') * 100; - if (isdigit(*cp)) { - secsfrac += (*cp++ - '0') * 10; - if (isdigit(*cp)) { - secsfrac += (*cp++ - '0'); - } - } - } - } - - while (!isspace(*cp)) /* if any trailing garbage */ - cp++; - - while (isspace(*cp)) - cp++; - - fndhemi: - switch (*cp) { - case 'N': case 'n': - case 'E': case 'e': - retval = ((unsigned)1<<31) - + (((((deg * 60) + min) * 60) + secs) * 1000) - + secsfrac; - break; - case 'S': case 's': - case 'W': case 'w': - retval = ((unsigned)1<<31) - - (((((deg * 60) + min) * 60) + secs) * 1000) - - secsfrac; - break; - default: - retval = 0; /* invalid value -- indicates error */ - break; - } - - switch (*cp) { - case 'N': case 'n': - case 'S': case 's': - *which = 1; /* latitude */ - break; - case 'E': case 'e': - case 'W': case 'w': - *which = 2; /* longitude */ - break; - default: - *which = 0; /* error */ - break; - } - - cp++; /* skip the hemisphere */ - - while (!isspace(*cp)) /* if any trailing garbage */ - cp++; - - while (isspace(*cp)) /* move to next field */ - cp++; - - *latlonstrptr = cp; - - return (retval); -} - -/* converts a zone file representation in a string to an RDATA on-the-wire - * representation. */ -u_int32_t -loc_aton(ascii, binary) - const char *ascii; - u_char *binary; -{ - const char *cp, *maxcp; - u_char *bcp; - - u_int32_t latit = 0, longit = 0, alt = 0; - u_int32_t lltemp1 = 0, lltemp2 = 0; - int altmeters = 0, altfrac = 0, altsign = 1; - u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */ - u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */ - u_int8_t siz = 0x12; /* default = 1e2 cm = 1.00m */ - int which1 = 0, which2 = 0; - - cp = ascii; - maxcp = cp + strlen(ascii); - - lltemp1 = latlon2ul(&cp, &which1); - - lltemp2 = latlon2ul(&cp, &which2); - - switch (which1 + which2) { - case 3: /* 1 + 2, the only valid combination */ - if ((which1 == 1) && (which2 == 2)) { /* normal case */ - latit = lltemp1; - longit = lltemp2; - } else if ((which1 == 2) && (which2 == 1)) { /* reversed */ - longit = lltemp1; - latit = lltemp2; - } else { /* some kind of brokenness */ - return 0; - } - break; - default: /* we didn't get one of each */ - return 0; - } - - /* altitude */ - if (*cp == '-') { - altsign = -1; - cp++; - } - - if (*cp == '+') - cp++; - - while (isdigit(*cp)) - altmeters = altmeters * 10 + (*cp++ - '0'); - - if (*cp == '.') { /* decimal meters */ - cp++; - if (isdigit(*cp)) { - altfrac = (*cp++ - '0') * 10; - if (isdigit(*cp)) { - altfrac += (*cp++ - '0'); - } - } - } - - alt = (10000000 + (altsign * (altmeters * 100 + altfrac))); - - while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */ - cp++; - - while (isspace(*cp) && (cp < maxcp)) - cp++; - - if (cp >= maxcp) - goto defaults; - - siz = precsize_aton(&cp); - - while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */ - cp++; - - while (isspace(*cp) && (cp < maxcp)) - cp++; - - if (cp >= maxcp) - goto defaults; - - hp = precsize_aton(&cp); - - while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */ - cp++; - - while (isspace(*cp) && (cp < maxcp)) - cp++; - - if (cp >= maxcp) - goto defaults; - - vp = precsize_aton(&cp); - - defaults: - - bcp = binary; - *bcp++ = (u_int8_t) 0; /* version byte */ - *bcp++ = siz; - *bcp++ = hp; - *bcp++ = vp; - PUTLONG(latit,bcp); - PUTLONG(longit,bcp); - PUTLONG(alt,bcp); - - return (16); /* size of RR in octets */ -} - -/* takes an on-the-wire LOC RR and prints it in zone file (human readable) - format. */ -char * -loc_ntoa(binary,ascii) - const u_char *binary; - char *ascii; -{ - static char tmpbuf[255*3]; - - register char *cp; - register const u_char *rcp; - - int latdeg, latmin, latsec, latsecfrac; - int longdeg, longmin, longsec, longsecfrac; - char northsouth, eastwest; - int altmeters, altfrac, altsign; - - const int referencealt = 100000 * 100; - - int32_t latval, longval, altval; - u_int32_t templ; - u_int8_t sizeval, hpval, vpval, versionval; - - char *sizestr, *hpstr, *vpstr; - - rcp = binary; - cp = (ascii != NULL) ? ascii : tmpbuf; - - versionval = *rcp++; - - if (versionval) { - sprintf(cp,"; error: unknown LOC RR version"); - return (cp); - } - - sizeval = *rcp++; - - hpval = *rcp++; - vpval = *rcp++; - - GETLONG(templ,rcp); - latval = (templ - ((unsigned)1<<31)); - - GETLONG(templ,rcp); - longval = (templ - ((unsigned)1<<31)); - - GETLONG(templ,rcp); - if (templ < referencealt) { /* below WGS 84 spheroid */ - altval = referencealt - templ; - altsign = -1; - } else { - altval = templ - referencealt; - altsign = 1; - } - - if (latval < 0) { - northsouth = 'S'; - latval = -latval; - } - else - northsouth = 'N'; - - latsecfrac = latval % 1000; - latval = latval / 1000; - latsec = latval % 60; - latval = latval / 60; - latmin = latval % 60; - latval = latval / 60; - latdeg = latval; - - if (longval < 0) { - eastwest = 'W'; - longval = -longval; - } - else - eastwest = 'E'; - - longsecfrac = longval % 1000; - longval = longval / 1000; - longsec = longval % 60; - longval = longval / 60; - longmin = longval % 60; - longval = longval / 60; - longdeg = longval; - - altfrac = altval % 100; - altmeters = (altval / 100) * altsign; - - sizestr = savestr(precsize_ntoa(sizeval)); - hpstr = savestr(precsize_ntoa(hpval)); - vpstr = savestr(precsize_ntoa(vpval)); - - sprintf(cp, - "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %d.%.2dm %sm %sm %sm", - latdeg, latmin, latsec, latsecfrac, northsouth, - longdeg, longmin, longsec, longsecfrac, eastwest, - altmeters, altfrac, sizestr, hpstr, vpstr); - - free(sizestr); - free(hpstr); - free(vpstr); - - return (cp); -} - -#endif /* LOC_RR */ - -/* - * 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; - - bcopy((char *)data, (char *)&tmp, INADDRSZ); - ret.s_addr = 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 -} diff --git a/usr.sbin/named/db_load.c b/usr.sbin/named/db_load.c deleted file mode 100644 index 7909434..0000000 --- a/usr.sbin/named/db_load.c +++ /dev/null @@ -1,1422 +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 1.5 1996/01/07 05:48:25 peter 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. - * - - * --Copyright-- - */ - -/* - * Load data base from ascii backupfile. Format similar to RFC 883. - */ - -#include <sys/param.h> -#include <sys/stat.h> -#include <netinet/in.h> -#ifdef ISO -#include <netiso/iso.h> -#endif -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <stdio.h> -#include <syslog.h> -#include <ctype.h> -#include <netdb.h> -#include <resolv.h> -#include <errno.h> - -#include "named.h" - -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 *)); -static void makename __P((char *, const char *)); -static int empty_token = 0; -int getnum_error; - -/* - * Map class and type names to number - */ -struct map { - char token[8]; - int val; -}; - -struct map m_class[] = { - { "in", C_IN }, -#ifdef notdef - { "any", C_ANY }, /* any is a QCLASS, not CLASS */ -#endif - { "chaos", C_CHAOS }, - { "hs", C_HS }, -}; -#define M_CLASS_CNT (sizeof(m_class) / sizeof(struct map)) - -struct map m_type[] = { - { "a", T_A }, - { "ns", T_NS }, - { "cname", T_CNAME }, - { "soa", T_SOA }, - { "mb", T_MB }, - { "mg", T_MG }, - { "mr", T_MR }, - { "null", T_NULL }, - { "wks", T_WKS }, - { "ptr", T_PTR }, - { "hinfo", T_HINFO }, - { "minfo", T_MINFO }, - { "mx", T_MX }, - { "uinfo", T_UINFO }, - { "txt", T_TXT }, - { "rp", T_RP }, - { "afsdb", T_AFSDB }, - { "x25", T_X25 }, - { "isdn", T_ISDN }, - { "rt", T_RT }, - { "nsap", T_NSAP }, - { "nsap_ptr", T_NSAP_PTR }, - { "uid", T_UID }, - { "gid", T_GID }, - { "px", T_PX }, -#ifdef notdef - { "any", T_ANY }, /* any is a QTYPE, not TYPE */ -#endif -#ifdef LOC_RR - { "loc", T_LOC }, -#endif /* LOC_RR */ -#ifdef ALLOW_T_UNSPEC - { "unspec", T_UNSPEC }, -#endif /* ALLOW_T_UNSPEC */ -}; -#define M_TYPE_CNT (sizeof(m_type) / sizeof(struct map)) - -/* - * Parser token values - */ -#define CURRENT 1 -#define DOT 2 -#define AT 3 -#define DNAME 4 -#define INCLUDE 5 -#define ORIGIN 6 -#define ERROR 7 - -static int clev; /* a zone deeper in a heirachy has more credability */ - -/* 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; - register struct map *mp; - char domain[MAXDNAME]; - char origin[MAXDNAME]; - char tmporigin[MAXDNAME]; - char buf[MAXDATA]; - char data[MAXDATA]; - const char *cp1, *op; - int c, class, type, dbflags, dataflags, multiline; - u_int32_t ttl; - struct databuf *dp; -#ifdef ISO - struct iso_addr *isoa; -#endif - FILE *fp; - int slineno, i, errs, didinclude; - register u_int32_t n; - struct stat sb; - struct in_addr ina; - int escape; -#ifdef DO_WARN_SERIAL - u_int32_t serial; -#endif - - 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 (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; - } - for (mp = m_class; mp < m_class+M_CLASS_CNT; mp++) - if (!strcasecmp((char *)buf, mp->token)) { - class = mp->val; - (void) getword((char *)buf, - sizeof(buf), fp, 0); - break; - } - for (mp = m_type; mp < m_type+M_TYPE_CNT; mp++) - if (!strcasecmp((char *)buf, mp->token)) { - type = mp->val; - goto fndtype; - } - 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; - fndtype: -#ifdef ALLOW_T_UNSPEC - /* Don't do anything here for T_UNSPEC... - * read input separately later - */ - if (type != T_UNSPEC) { -#endif - switch (type) { - 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)); -#ifdef ALLOW_T_UNSPEC - } -#endif - /* - * Convert the ascii data 'buf' to the proper format - * based on the type and pack into 'data'. - */ - 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_HINFO: - case T_ISDN: - n = strlen((char *)buf); - if (n > 255) { - syslog(LOG_INFO, - "%s: line %d: %s too long", - filename, lineno, (type == T_ISDN) ? - "ISDN-address" : "CPU type"); - n = 255; - } - data[0] = n; - bcopy(buf, (char *)data + 1, (int)n); - if (n == 0) - goto err; - n++; - if (!getword((char *)buf, sizeof(buf), fp, 0)) - i = 0; - else { - endline(fp); - i = strlen((char *)buf); - } - if (i == 0) { - if (type == T_ISDN) { - data[n++] = 0; - break; - } - else - /* goto err; */ - /* XXX tolerate for now */ - data[n++] = 1; - data[n++] = '?'; - syslog(LOG_INFO, - "%s: line %d: OS-type missing", - filename, - empty_token ? (lineno - 1) : lineno); - break; - } - if (i > 255) { - syslog(LOG_INFO, - "%s:%d: %s too long", - filename, lineno, (type == T_ISDN) ? - "ISDN-sa" : "OS type"); - i = 255; - } - data[n] = i; - bcopy(buf, data + n + 1, i); - n += i + 1; - break; - - case T_SOA: - case T_MINFO: - case T_RP: - (void) strcpy((char *)data, (char *)buf); - makename(data, origin); - cp = data + strlen((char *)data) + 1; - if (!getword((char *)cp, - (sizeof data) - (cp - data), - fp, 1)) - goto err; - makename(cp, origin); - cp += strlen((char *)cp) + 1; - if (type != T_SOA) { - n = cp - 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 - data; - if (multiline) { - if (getnonblank(fp, filename) != ')') - goto err; - } - read_soa++; - if (zp->z_expire < zp->z_refresh ) { - syslog(LOG_WARNING, - "%s: WARNING SOA expire value is less then SOA refresh (%lu < %lu)", - filename, zp->z_expire, zp->z_refresh); - } - endline(fp); - break; - - case T_UID: - case T_GID: - n = 0; - cp = buf; - while (isdigit(*cp)) - n = n * 10 + (*cp++ - '0'); - if (cp == buf) - goto err; - cp = data; - PUTLONG(n, cp); - n = 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++; - /* FALLTHROUGH */ - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_PTR: - (void) strcpy((char *)data, (char *)buf); - makename(data, origin); - n = strlen((char *)data) + 1; - break; - - case T_UINFO: - cp = 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_MX: - case T_AFSDB: - case T_RT: - 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 (!getword((char *)buf, sizeof(buf), fp, 1)) - goto err; - (void) strcpy((char *)cp, (char *)buf); - makename(cp, origin); - /* advance pointer to end of data */ - cp += strlen((char *)cp) +1; - - /* now save length */ - n = (cp - data); - break; - - case T_PX: - 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(cp, origin); - /* 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(cp, origin); - /* advance pointer to end of data */ - cp += strlen((char *)cp) + 1; - - /* now save length */ - n = (cp - data); - break; - - case T_TXT: - case T_X25: - i = strlen((char *)buf); - cp = data; - cp1 = buf; - /* - * there is expansion here so make sure we - * don't overflow data - */ - if (i > (sizeof data) * 255 / 256) { - syslog(LOG_INFO, - "%s: line %d: TXT record truncated", - filename, lineno); - i = (sizeof data) * 255 / 256; - } - while (i > 255) { - *cp++ = 255; - bcopy(cp1, cp, 255); - cp += 255; - cp1 += 255; - i -= 255; - } - *cp++ = i; - bcopy(cp1, cp, i); - cp += i; - n = cp - data; - endline(fp); - break; - -#ifdef ISO - case T_NSAP: - isoa = iso_addr(buf); - if (!isoa) - goto err; - n = isoa->isoa_len; - bcopy(isoa->isoa_genaddr, data, n); - endline(fp); - break; -#endif -#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, - (zp->z_type == Z_CACHE) - ? fcachetab - : hashtab)) - != OK) { -#ifdef DEBUG - if (debug && (c != DATAEXISTS)) - fprintf(ddt, "update failed %s %d\n", - domain, type); -#endif - free((char*) 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(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; -#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 - * 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; - - 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; - } - if (c == '\\') { - /* Do escape processing. */ - if ((c = getc(fp)) == EOF) - c = '\\'; - if (preserve && (c == '\\' || c == '.')) { - if (cp >= buf+size-1) - break; - *cp++ = '\\'; - } - } - if (isspace(c)) { - /* 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); -} - -/* -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); - } - } -} - -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\n", - 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\n", - 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[BUFSIZ], *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; -} diff --git a/usr.sbin/named/db_lookup.c b/usr.sbin/named/db_lookup.c deleted file mode 100644 index b425f2b..0000000 --- a/usr.sbin/named/db_lookup.c +++ /dev/null @@ -1,196 +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 1.3 1995/08/20 21:18:24 peter 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 <syslog.h> -#include <sys/param.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <stdio.h> -#include <ctype.h> - -#include "named.h" - -/* - * Lookup 'name' and return a pointer to the namebuf; - * NULL otherwise. If 'insert', insert name into tables. - * Wildcard lookups are handled. - */ -struct namebuf * -nlookup(name, htpp, fname, insert) - const char *name; - struct hashbuf **htpp; - const char **fname; - int insert; -{ - register struct namebuf *np; - register const char *cp; - register int c; - register unsigned hval; - register struct hashbuf *htp; - struct namebuf *parent = NULL; - int escaped = 0; - - htp = *htpp; - hval = 0; - *fname = "???"; - for (cp = name; c = *cp++; ) { - if (!escaped && (c == '.')) { - parent = np = nlookup(cp, htpp, fname, insert); - if (np == NULL) - return (NULL); - if (*fname != cp) - return (np); - if ((htp = np->n_hash) == NULL) { - if (!insert) { - if (np->n_dname[0] == '*' && - np->n_dname[1] == '\0') - *fname = name; - return (np); - } - htp = savehash((struct hashbuf *)NULL); - np->n_hash = htp; - } - *htpp = htp; - break; - } - hval <<= HASHSHIFT; - hval += (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 && - strncasecmp(name, np->n_dname, 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 (np->n_dname[0] == '*' && np->n_dname[1] == '\0' && - 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); -} - -/* 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/usr.sbin/named/db_reload.c b/usr.sbin/named/db_reload.c deleted file mode 100644 index 1145e4a..0000000 --- a/usr.sbin/named/db_reload.c +++ /dev/null @@ -1,125 +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 1.1.1.1 1994/09/22 19:46:14 pst Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1988 - * - - * Copyright (c) 1986, 1988 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <stdio.h> -#include <syslog.h> - -#include "named.h" - -/* - * Flush and reload data base. - */ -void -db_reload() -{ - dprintf(3, (ddt, "reload()\n")); - syslog(LOG_NOTICE, "reloading nameserver\n"); - - qflush(); - sqflush(NULL); - getnetconf(); -#ifdef FORCED_RELOAD - reloading = 1; /* to force transfer if secondary and backing up */ -#endif - ns_init(bootfile); - time(&resettime); -#ifdef FORCED_RELOAD - reloading = 0; - if (!needmaint) - sched_maint(); -#endif /* FORCED_RELOAD */ - - dprintf(1, (ddt, "Ready to answer queries.\n")); - syslog(LOG_NOTICE, "Ready to answer queries.\n"); -} - -#if 0 -/* someday we'll need this.. (untested since before 1990) */ -void -db_free(htp) - struct hashbuf *htp; -{ - register struct databuf *dp, *nextdp; - register struct namebuf *np, *nextnp; - struct namebuf **npp, **nppend; - - npp = htp->h_tab; - nppend = npp + htp->h_size; - while (npp < nppend) { - for (np = *npp++; np != NULL; np = nextnp) { - if (np->n_hash != NULL) - db_free(np->n_hash); - (void) free((char *)np->n_dname); - for (dp = np->n_data; dp != NULL; ) { - nextdp = dp->d_next; - (void) free((char *)dp); - dp = nextdp; - } - nextnp = np->n_next; - free((char *)np); - } - } - (void) free((char *)htp); -} -#endif diff --git a/usr.sbin/named/db_save.c b/usr.sbin/named/db_save.c deleted file mode 100644 index 61471ce..0000000 --- a/usr.sbin/named/db_save.c +++ /dev/null @@ -1,207 +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 1.2 1995/05/30 03:48:42 rgrimes Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986 - * - - * Copyright (c) 1986 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -/* - * Buffer allocation and deallocation routines. - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <syslog.h> -#include <stdio.h> -#include <errno.h> - -#include "named.h" - -/* - * Allocate a name buffer & save name. - */ -struct namebuf * -savename(name, len) - const char *name; - int len; -{ - register struct namebuf *np; - - np = (struct namebuf *) malloc(sizeof(struct namebuf)); - if (np == NULL) - panic(errno, "savename: malloc"); - bzero((char*)np, sizeof(struct namebuf)); - np->n_dname = malloc(len + 1); - if (np == NULL) - panic(errno, "savename: malloc"); - strncpy(np->n_dname, name, len); - np->n_dname[len] = '\0'; - return (np); -} - -/* - * Allocate a data buffer & save data. - */ -struct databuf * -#ifdef DMALLOC -savedata_tagged(file, line, class, type, ttl, data, size) - char *file; - int line; -#else -savedata(class, type, ttl, data, size) -#endif - int class, type; - u_int32_t ttl; - u_char *data; - int size; -{ - register struct databuf *dp; - int bytes = (type == T_NS) ? DATASIZE(size)+INT32SZ : DATASIZE(size); - - dp = (struct databuf *) -#ifdef DMALLOC - dmalloc(file, line, bytes) -#else - malloc(bytes) -#endif - ; - 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_mark = 0; - 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/usr.sbin/named/db_secure.c b/usr.sbin/named/db_secure.c deleted file mode 100644 index cc48775..0000000 --- a/usr.sbin/named/db_secure.c +++ /dev/null @@ -1,153 +0,0 @@ -#ifndef LINT -static char rcsid[] = "$Id: db_secure.c,v 1.3 1995/08/20 21:18:29 peter Exp $"; -#endif - -/* this file was contributed by Gregory Neil Shapiro of WPI in August 1993 */ - -#include <stdio.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <syslog.h> -#include <errno.h> - -#include "named.h" - -#ifdef SECURE_ZONES - -#ifndef SECURE_ZONE_RR -#define SECURE_ZONE_RR "secure_zone" -#endif -#ifndef MASK_SEP -#define MASK_SEP ':' -#endif - -int -build_secure_netlist(zp) - struct zoneinfo *zp; -{ - struct netinfo *ntp = NULL, **netlistp, **end; - char buf[BUFSIZ]; - 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(snp->n_dname, 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/usr.sbin/named/db_update.c b/usr.sbin/named/db_update.c deleted file mode 100644 index 90076c5..0000000 --- a/usr.sbin/named/db_update.c +++ /dev/null @@ -1,733 +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 1.3 1995/08/20 21:18:31 peter Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1990 - * - - * Copyright (c) 1986, 1990 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#include <stdio.h> -#include <syslog.h> - -#include <sys/param.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include "named.h" - -static void fixttl __P((struct databuf *)); -static int db_cmp __P((struct databuf *, - struct databuf *)); - -/* 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) - * 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->n_parent) { - 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) -#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; - 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); - - /* 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)); - (void) free((char *)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. - */ - if ((dp->d_type == T_CNAME || - odp->d_type == T_CNAME) && - odp->d_class == dp->d_class && - odp->d_mark == dp->d_mark && -#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 (illegal)\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 ((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 +%d\n", - (u_long)dp->d_ttl, - 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; - 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) { -#ifdef DATUMREFCNT - newdp->d_rcnt = 1; -#endif - 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); -#ifdef DATUMREFCNT - newdp->d_rcnt = 1; -#endif - dp->d_next = newdp; - return (OK); -} - -static 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. - */ -static 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); - if (dp1->d_mark != dp2->d_mark) - return (1); /* old and new RR's are distinct */ -#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_A: - case T_UID: - case T_GID: - case T_WKS: - case T_NULL: - case T_NSAP: - 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_MX: - case T_AFSDB: - case T_RT: - cp1 = dp1->d_data; - cp2 = dp2->d_data; - if (*cp1++ != *cp2++ || *cp1++ != *cp2++) /* cmp prio */ - 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/usr.sbin/named/dmalloc.c b/usr.sbin/named/dmalloc.c deleted file mode 100644 index 54b23ed..0000000 --- a/usr.sbin/named/dmalloc.c +++ /dev/null @@ -1,312 +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 1.3 1995/05/30 03:48:45 rgrimes 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 <stdio.h> -#include <signal.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); - 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/usr.sbin/named/dmalloc.h b/usr.sbin/named/dmalloc.h deleted file mode 100644 index 6d89ab8..0000000 --- a/usr.sbin/named/dmalloc.h +++ /dev/null @@ -1,68 +0,0 @@ -/* dmalloc - debugging layer on top of malloc - * vix 22mar92 [written] - * - * $Id: dmalloc.h,v 1.1.1.1 1994/09/22 19:46:14 pst 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/usr.sbin/named/named.8 b/usr.sbin/named/named.8 deleted file mode 100644 index 6ba15fa..0000000 --- a/usr.sbin/named/named.8 +++ /dev/null @@ -1,415 +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 NAMED 8 "June 20, 1995" -.UC 4 -.SH NAME -named \- Internet domain name server -.SH SYNOPSIS -.B 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(3) 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'forwarders\ '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 max-xfers 10 -limit datasize 64M -options forward-only query-log fake-iquery - -.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. -.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; -\fBquery-log\fP, which causes all queries to be logged via -syslog(8) -- 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 ``max-fetch'' directive (not shown) is allowed for backward compatibility; -its meaning is identical to ``limit transfers-in''. -.PP -The master file consists of control information and a list of resource -records for objects in the zone of the forms: -.RS -.nf - -$INCLUDE <filename> <opt_domain> -$ORIGIN <domain> -<domain> <opt_ttl> <opt_class> <type> <resource_record_data> - -.fi -.RE -where -.I domain -is "." for root, "@" for the current origin, or a standard domain -name. If -.I domain -is a standard domain name that does not end with ``.'', the current origin -is appended to the domain. Domain names ending with ``.'' are -unmodified. -The -.I opt_domain -field is used to define an origin for the data in an included file. -It is equivalent to placing a $ORIGIN statement before the first -line of the included file. The field is optional. -Neither the -.I opt_domain -field nor $ORIGIN statements in the included file modify the current origin -for this file. -The -.I opt_ttl -field is an optional integer number for the time-to-live field. -It defaults to zero, meaning the minimum value specified in the SOA -record for the zone. -The -.I opt_class -field is the object address type; currently only one type is supported, -.BR IN , -for objects connected to the DARPA Internet. -The -.I type -field contains one of the following tokens; the data expected in the -.I resource_record_data -field is in parentheses. -.TP "\w'MINFO 'u" -A -a host address (dotted quad) -.IP NS -an authoritative name server (domain) -.IP MX -a mail exchanger (domain), preceded by a preference value (0..32767), -with lower numeric values representing higher logical preferences. -.IP CNAME -the canonical name for an alias (domain) -.IP SOA -marks the start of a zone of authority (domain of originating host, -domain address of maintainer, a serial number and the following -parameters in seconds: refresh, retry, expire and minimum TTL (see RFC 883)). -.IP NULL -a null resource record (no format or data) -.IP RP -a Responsible Person for some domain name (mailbox, TXT-referral) -.IP PTR -a domain name pointer (domain) -.IP HINFO -host information (cpu_type OS_type) -.PP -Resource records normally end at the end of a line, -but may be continued across lines between opening and closing parentheses. -Comments are introduced by semicolons and continue to the end of the line. -.PP -Note that there are other resource record types, not shown here. You should -consult the \s-1BIND\s+1 Operations Guide (``\s-1BOG\s+1'') for the complete -list. Some resource record types may have been standardized in newer RFC's -but not yet implemented in this version of \s-1BIND\s+1. -.PP -Each master zone file should begin with an SOA record for the zone. -An example SOA record is as follows: -.LP -.nf -@ IN SOA ucbvax.Berkeley.EDU. rwh.ucbvax.Berkeley.EDU. ( - 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 (1) -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(8) -(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 (/var/run/named.pid on newer systems) -/var/tmp/named.run debug output -/var/tmp/named_dump.db dump of the name server database -/var/tmp/named.stats nameserver statistics data -.fi -.SH "SEE ALSO" -kill(1), gethostbyname(3), signal(3), -resolver(3), resolver(5), hostname(7), -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/usr.sbin/named/named.h b/usr.sbin/named/named.h deleted file mode 100644 index e3e795d..0000000 --- a/usr.sbin/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 1.1 1993/09/08 04:57:40 vixie Exp $ - */ - -#include "options.h" -#include "portability.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/usr.sbin/named/ns_defs.h b/usr.sbin/named/ns_defs.h deleted file mode 100644 index a6615bf..0000000 --- a/usr.sbin/named/ns_defs.h +++ /dev/null @@ -1,401 +0,0 @@ -/* - * from ns.h 4.33 (Berkeley) 8/23/90 - * $Id: ns_defs.h,v 1.3 1995/08/20 21:18:34 peter 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) - - /* wildcard predicate */ -#define WILDCARD_P(str) (str[0] == '*' && str[1] == '\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 */ -#ifdef ALLOW_UPDATES -#define Z_DYNAMIC 0x0400 /* allow dynamic updates */ -#define Z_DYNADDONLY 0x0800 /* dynamic mode: add new data only */ -#define Z_CHANGED 0x1000 /* zone has changed */ -#endif /* ALLOW_UPDATES */ -#define Z_XFER_ABORTED 0x2000 /* zone transfer has been aborted */ -#define Z_XFER_GONE 0x4000 /* zone transfer process is gone */ - - /* named_xfer exit codes */ -#define XFER_UPTODATE 0 /* zone is up-to-date */ -#define XFER_SUCCESS 1 /* performed transfer successfully */ -#define XFER_TIMEOUT 2 /* no server reachable/xfer timeout */ -#define XFER_FAIL 3 /* other failure, has been logged */ - -#include <sys/time.h> - -/* XXX - "struct qserv" is deprecated in favor of "struct nameser" */ -struct qserv { - struct sockaddr_in - ns_addr; /* address of NS */ - struct databuf *ns; /* databuf for NS record */ - struct databuf *nsdata; /* databuf for server address */ - struct timeval stime; /* time first query started */ - int nretry; /* # of times addr retried */ -}; - -/* - * Structure for recording info on forwarded or generated queries. - */ -struct qinfo { - u_int16_t q_id; /* id of query */ - u_int16_t q_nsid; /* id of forwarded query */ - struct sockaddr_in - q_from; /* requestor's address */ - u_char *q_msg, /* the message */ - *q_cmsg; /* the cname message */ - int16_t q_msglen, /* len of message */ - q_cmsglen; /* len of cname message */ - int16_t q_dfd; /* UDP file descriptor */ - struct fwdinfo *q_fwd; /* last forwarder used */ - time_t q_time; /* time to retry */ - time_t q_expire; /* time to expire */ - struct qinfo *q_next; /* rexmit list (sorted by time) */ - struct qinfo *q_link; /* storage list (random order) */ - struct databuf *q_usedns[NSMAX]; /* databuf for NS that we've tried */ - struct qserv q_addr[NSMAX]; /* addresses of NS's */ -#ifdef notyet - struct nameser *q_ns[NSMAX]; /* name servers */ -#endif - u_char q_naddr; /* number of addr's in q_addr */ - u_char q_curaddr; /* last addr sent to */ - u_char q_nusedns; /* number of elements in q_usedns[] */ - u_int8_t q_flags; /* see below */ - int16_t q_cname; /* # of cnames found */ - int16_t q_nqueries; /* # of queries required */ - struct qstream *q_stream; /* TCP stream, null if UDP */ - struct zoneinfo *q_zquery; /* Zone query is about (Q_ZSERIAL) */ -#if defined(LAME_DELEGATION) || defined(VALIDATE) - char q_domain[MAXDNAME]; /* domain for servers we are querying */ -#endif -#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 { nssRcvdQ, /* sent us a query */ - nssRcvdR, /* sent us an answer */ - nssRcvdIQ, /* sent us an inverse query */ - nssRcvdNXD, /* sent us a negative response */ - nssRcvdFwdQ, /* sent us a query we had to fwd */ - nssRcvdFwdR, /* sent us a response we had to fwd */ - nssRcvdDupQ, /* sent us a retry */ - nssRcvdDupR, /* sent us an extra answer */ - nssRcvdFail, /* sent us a SERVFAIL */ - nssRcvdFErr, /* sent us a FORMERR */ - nssRcvdErr, /* sent us some other error */ - nssRcvdTCP, /* sent us a query using TCP */ - 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 */ - nssSentFwdR, /* fwdd a response to them */ - nssSentDupQ, /* sent them a retry */ - nssSentFail, /* sent them a SERVFAIL */ - nssSentFErr, /* sent them a FORMERR */ - nssSendtoErr, /* error in sendto */ -#ifdef XSTATS - nssNotNsQ, /* query received from remote port != ns_port */ - 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/usr.sbin/named/ns_forw.c b/usr.sbin/named/ns_forw.c deleted file mode 100644 index 9349a9e..0000000 --- a/usr.sbin/named/ns_forw.c +++ /dev/null @@ -1,992 +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 1.4 1995/10/23 11:11:44 peter 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 <sys/param.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <syslog.h> -#include <resolv.h> -#include <stdio.h> -#include <errno.h> - -#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, np) - struct databuf *nsp[]; - u_char *msg; - int msglen; - struct sockaddr_in *fp; - struct qstream *qsp; - int dfd; - struct qinfo **qpp; - char *dname; - struct namebuf *np; -{ - register struct qinfo *qp; - 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))); - nameserIncr(fp->sin_addr, nssRcvdDupQ); - return (FW_DUP); - } - } - - qp = qnew(); -#if defined(LAME_DELEGATION) || defined(VALIDATE) - getname(np, qp->q_domain, sizeof qp->q_domain); -#endif - qp->q_from = *fp; /* nslookup wants to know this */ - if ((n = nslookup(nsp, qp, dname, "ns_forw")) < 0) { - dprintf(2, (ddt, "forw: nslookup reports danger\n")); - qfree(qp); - return (FW_SERVFAIL); - } else 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); - } - nameserIncr(fp->sin_addr, nssRcvdFwdQ); - 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; - - dprintf(2, (ddt, "NS '%s' %s\n", dname, complaint)); - if (sysloginfo && queryname && !haveComplained(queryname, complaint)) - { - char buf[999]; - - a = ns = (char *)NULL; -#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 (A=%s:NS=%s)", - sysloginfo, queryname, - complaint, dname, - inet_ntoa(data_inaddr(a_rr->d_data)), - a ? a : "<Not Available>", - ns ? ns : "<Not Available>" ); - else - sprintf(buf, "%s: query(%s) %s (%s:%s)", - sysloginfo, queryname, - complaint, dname, - inet_ntoa(data_inaddr(a_rr->d_data))); - syslog(LOG_INFO, 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 unsigned int i; - struct hashbuf *tmphtp; - char *dname; - const char *fname; - int oldn, naddr, class, found_arr; - time_t curtime; - - dprintf(3, (ddt, "nslookup(nsp=0x%lx, qp=0x%lx, \"%s\")\n", - (u_long)nsp, (u_long)qp, syslogdname)); - - 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 || fname != dname) { - dprintf(3, (ddt, "%s: not found %s %lx\n", - dname, fname, (u_long)np)); - continue; - } - found_arr = 0; - oldn = n; - - /* look for name server addresses */ - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - struct in_addr nsa; - -#ifdef NCACHE - if (dp->d_rcode) - continue; -#endif - if (dp->d_type == T_CNAME && dp->d_class == class) - goto skipserver; - if (dp->d_type != T_A || dp->d_class != class) - continue; - if (data_inaddr(dp->d_data).s_addr == INADDR_ANY) { - static 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 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 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 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) && -#ifdef DATUMREFCNT - (dp->d_ttl < curtime) && -#else - (dp->d_ttl < (curtime+900)) && -#endif - !(dp->d_flags & DB_F_HINT) ) - { - dprintf(3, (ddt, - "nslookup: stale entry '%s'\n", - np->n_dname)); - /* Cache invalidate the NS RR's */ -#ifndef DATUMREFCNT - if (dp->d_ttl < curtime) -#endif - { - delete_all(np, class, T_A); - 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 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) - */ - if (aIsUs(nsa)) { - static char *complaint = "contains our address"; - nslookupComplain(sysloginfo, syslogdname, - complaint, dname, dp, nsdp); - return (-1); - } - /* - * 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) - */ - 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); - return (-1); - } -#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 && !(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; -#ifdef DATUMREFCNT - /* must be run before the sort */ - for (i = naddr ; i < n ; i++) { - qp->q_addr[i].nsdata->d_rcnt++; - qp->q_addr[i].ns->d_rcnt++; - } -#endif - 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) /* return failure code on stream */ - 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))); - } - nameserIncr(qp->q_from.sin_addr, nssSentFail); - 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; -} - -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 * -#ifdef DMALLOC -qnew_tagged(file, line) - char *file; - int line; -#else -qnew() -#endif -{ - register struct qinfo *qp; - - qp = (struct qinfo *) -#ifdef DMALLOC - dcalloc(file, line, 1, sizeof(struct qinfo)); -#else - calloc(1, sizeof(struct qinfo)); -#endif - if (qp == NULL) { - dprintf(5, (ddt, "qnew: calloc error\n")); - syslog(LOG_ERR, "forw: %m"); - exit(12); - } - dprintf(5, (ddt, "qnew(x%lx)\n", (u_long)qp)); -#ifdef BIND_NOTIFY - qp->q_notifyzone = DB_Z_CACHE; -#endif - qp->q_link = nsqhead; - nsqhead = qp; - return (qp); -} - -void -qfree(qp) - struct qinfo *qp; -{ - register struct qinfo *np; - register struct databuf *dp; -#ifdef DATUMREFCNT - int i; -#endif - - 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); -#ifdef DATUMREFCNT - for (i = 0 ; i < (int)qp->q_naddr ; i++) { - dp = qp->q_addr[i].ns; - if (dp) - if (--(dp->d_rcnt)) { - dprintf(3, (ddt, "qfree: ns %s rcnt %d\n", - dp->d_data, - dp->d_rcnt)); - } else { - dprintf(3, (ddt, "qfree: ns %s rcnt %d delayed\n", - dp->d_data, - dp->d_rcnt)); - free((char*)dp); - } - dp = qp->q_addr[i].nsdata; - if (dp) - if ((--(dp->d_rcnt))) { - dprintf(3, (ddt, "qfree: nsdata %08.8X rcnt %d\n", - *(int32_t *)(dp->d_data), - dp->d_rcnt)); - } else { - dprintf(3, (ddt, "qfree: nsdata %08.8X rcnt %d delayed\n", - *(int32_t *)(dp->d_data), - dp->d_rcnt)); - free((char*)dp); - } - } -#endif - 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/usr.sbin/named/ns_func.h b/usr.sbin/named/ns_func.h deleted file mode 100644 index 5fa32d9..0000000 --- a/usr.sbin/named/ns_func.h +++ /dev/null @@ -1,161 +0,0 @@ -/* ns_func.h - declarations for ns_*.c's externally visible functions - * - * $Id: ns_func.h,v 8.6 1995/12/22 10:20:30 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)); -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, - 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 *)), - qfree __P((struct qinfo *)); -extern struct qinfo *qfindid __P((u_int16_t)), -#ifdef DMALLOC - *qnew_tagged __P((void)); -# define qnew() qnew_tagged(__FILE__, __LINE__) -#else - *qnew(); -#endif -/* --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 *)); -/* --from ns_init.c-- */ - -/* ++from ns_ncache.c++ */ -extern void cache_n_resp __P((u_char *, int)); -/* --from ns_ncache.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/usr.sbin/named/ns_glob.h b/usr.sbin/named/ns_glob.h deleted file mode 100644 index 5deeb76..0000000 --- a/usr.sbin/named/ns_glob.h +++ /dev/null @@ -1,270 +0,0 @@ -/* - * from ns.h 4.33 (Berkeley) 8/23/90 - * $Id: ns_glob.h,v 1.4 1995/10/23 11:11:45 peter 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 ALLOW_UPDATES - /* need to exit (may need to doadump - * first, if database has changed since - * it was last dumped/booted). Gets - * set by shutdown signal handler - * (onintr) - */ -DECL int needToExit INIT(0); -#endif /* ALLOW_UPDATES */ -#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[]; - - /* 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 diff --git a/usr.sbin/named/ns_init.c b/usr.sbin/named/ns_init.c deleted file mode 100644 index d710080..0000000 --- a/usr.sbin/named/ns_init.c +++ /dev/null @@ -1,961 +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 1.4 1995/10/23 11:11:46 peter Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1990 - * - - * Copyright (c) 1986, 1990 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <syslog.h> -#include <resolv.h> -#include <stdio.h> -#include <errno.h> -#include <ctype.h> - -#include "named.h" - -#undef nsaddr - -enum limit { Datasize }; - -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 - free_forwarders __P((void)), - ns_limit __P((const char *name, int value)), - 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)); - -/* - * 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); - - 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 - 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[BUFSIZ], obuf[BUFSIZ], *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 */ -#ifdef ALLOW_UPDATES - char *flag; -#endif - 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, "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); -#ifdef ALLOW_UPDATES - if (getword(buf, sizeof(buf), fp, 0)) { - endline(fp); - flag = buf; - while (flag) { - char *cp = strchr(flag, ','); - if (cp) - *cp++ = 0; - if (strcasecmp(flag, "dynamic") == 0) - zp->z_flags |= Z_DYNAMIC; - else if (strcasecmp(flag, "addonly") == 0) - zp->z_flags |= Z_DYNADDONLY; - else { - syslog(LOG_NOTICE, - "%s: line %d: bad flag '%s'\n", - filename, lineno, flag); - } - flag = cp; - } - } -#else /*ALLOW_UPDATES*/ - endline(fp); -#endif - - 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; -#ifdef ALLOW_UPDATES - /* Guarantee calls to ns_maint() */ - zp->z_refresh = maint_interval; -#else - zp->z_refresh = 0; /* no maintenance needed */ - zp->z_time = 0; -#endif - 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\n")); - free(zp->z_source); - zp->z_source = NULL; - zp->z_flags &= ~Z_AUTH; - zp->z_serial = 0; /* force xfer */ -#ifdef CLEANCACHE - remove_zone(hashtab, zp - zones, 1); -#else - remove_zone(hashtab, zp - zones); -#endif - } - 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; - } -} - -#ifdef ALLOW_UPDATES -/* - * Look for the authoritative zone with the longest matching RHS of dname - * and return its zone # or zero if not found. - */ -int -findzone(dname, class) - char *dname; - int class; -{ - char *dZoneName, *zoneName; - int dZoneNameLen, zoneNameLen; - int maxMatchLen = 0; - int maxMatchZoneNum = 0; - int zoneNum; - - dprintf(4, (ddt, "findzone(dname=%s, class=%d)\n", dname, class)); -#ifdef DEBUG - if (debug >= 5) { - fprintf(ddt, "zone dump:\n"); - for (zoneNum = 1; zoneNum < nzones; zoneNum++) - printzoneinfo(zoneNum); - } -#endif - - dZoneName = strchr(dname, '.'); - if (dZoneName == NULL) - dZoneName = ""; /* root */ - else - dZoneName++; /* There is a '.' in dname, so use remainder of - string as the zone name */ - dZoneNameLen = strlen(dZoneName); - for (zoneNum = 1; zoneNum < nzones; zoneNum++) { - if (zones[zoneNum].z_type == Z_NIL) - continue; - zoneName = (zones[zoneNum]).z_origin; - zoneNameLen = strlen(zoneName); - /* The zone name may or may not end with a '.' */ - if (zoneName[zoneNameLen - 1] == '.') - zoneNameLen--; - if (dZoneNameLen != zoneNameLen) - continue; - dprintf(5, (ddt, "about to strncasecmp('%s', '%s', %d)\n", - dZoneName, zoneName, dZoneNameLen)); - if (strncasecmp(dZoneName, zoneName, dZoneNameLen) == 0) { - dprintf(5, (ddt, "match\n")); - /* - * See if this is as long a match as any so far. - * Check if "<=" instead of just "<" so that if - * root domain (whose name length is 0) matches, - * we use it's zone number instead of just 0 - */ - if (maxMatchLen <= zoneNameLen) { - maxMatchZoneNum = zoneNum; - maxMatchLen = zoneNameLen; - } - } else { - dprintf(5, (ddt, "no match\n")); - } - } - dprintf(4, (ddt, "findzone: returning %d\n", maxMatchZoneNum)); - return (maxMatchZoneNum); -} -#endif /* ALLOW_UPDATES */ - -static void -get_forwarders(fp) - FILE *fp; -{ - char buf[BUFSIZ]; - register struct fwdinfo *fip = NULL, *ftp = NULL; - -#ifdef SLAVE_FORWARD - int forward_count = 0; -#endif - - dprintf(1, (ddt, "forwarders ")); - - /* on mulitple 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; -} - -#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 { - syslog(LOG_ERR, - "error: unrecognized limit in bootfile: \"%s\"", - name); - exit(1); - } -} - -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; - - switch (limit) { - case Datasize: - rlimit = RLIMIT_DATA; - break; - default: - abort(); - } - if (getrlimit(rlimit, &limits) < 0) { - syslog(LOG_WARNING, "getrlimit(%s): %m", name); - return; - } - limits.rlim_cur = 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/usr.sbin/named/ns_main.c b/usr.sbin/named/ns_main.c deleted file mode 100644 index d0d3951..0000000 --- a/usr.sbin/named/ns_main.c +++ /dev/null @@ -1,1691 +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 1.6 1996/01/07 05:48:33 peter 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 <sys/param.h> -#include <sys/file.h> -#include <sys/stat.h> -#if !defined(SYSV) && defined(XXX) -#include <sys/wait.h> -#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 <sys/ioctl.h> -#include <sys/socket.h> -#include <netinet/in.h> -#if defined(__osf__) -# include <sys/mbuf.h> -# include <net/route.h> -#endif -#if defined(_AIX) -# include <sys/time.h> -# define TIME_H_INCLUDED -#endif -#include <net/if.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <fcntl.h> -#include <stdio.h> -#include <syslog.h> -#include <errno.h> -#include <signal.h> -#include <netdb.h> -#include <resolv.h> -#if defined(SVR4) -# include <sys/sockio.h> -#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 */ -#ifdef OLD_SETPROCTITLE -static char **Argv = NULL; -static char *LastArg = NULL; /* end of argv */ -#endif - -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[BUFSIZ]; -#ifdef POSIX_SIGNALS - struct sigaction sact; -#else -#ifndef SYSV - struct sigvec vec; -#endif -#endif -#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 - - 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); - -#ifdef OLD_SETPROCTITLE - /* - ** Save start and extent of argv for ns_setproctitle(). - */ - - Argv = argp = argv; - while (*argp) - argp++; - LastArg = argp[-1] + strlen(argp[-1]); -#endif - - (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_DAEMON - openlog("named", LOG_PID|LOG_CONS|LOG_NDELAY|n, LOGFAC); -#else - openlog("named", LOG_PID); -#endif - -#ifdef WANT_PIDFILE - /* tuck my process id away */ -#ifdef PID_FIX - fp = fopen(PidFile, "r+"); - 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++) { - if ((vs = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - syslog(LOG_ERR, "socket(SOCK_STREAM): %m"); - exit(1); - } - 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); - -#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); - setsignal(SIGHUP, -1, onhup); - -#if defined(SIGXFSZ) - /* Wierd DEC Hesiodism, harmless. */ - setsignal(SIGXFSZ, -1, onhup); -#endif - -#ifdef SIGSYS - setsignal(SIGSYS, -1, sigprof); -#endif /* SIGSYS */ - -#ifdef ALLOW_UPDATES - /* Catch SIGTERM so we can dump the database upon shutdown if it - has changed since it was last dumped/booted */ - setsignal(SIGTERM, -1, onintr); -#endif - -#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 ALLOW_UPDATES - if (needToExit) { - struct zoneinfo *zp; - sigblock(~0); /* - * Block all blockable signals - * to ensure a consistant - * state during final dump - */ - dprintf(1, (ddt, "Received shutdown signal\n")); - for (zp = zones; zp < &zones[nzones]; zp++) { - if (zp->z_flags & Z_CHANGED) - zonedump(zp); - } - exit(0); - } -#endif /* ALLOW_UPDATES */ -#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))); -#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); - dprintf(1, (ddt, - "\nTCP connection from [%s].%d (fd %d)\n", - inet_ntoa(sp->s_from.sin_addr), - ntohs(sp->s_from.sin_port), rfd)); - } - 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_size = 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; - } - /* - * we don't have enough memory for the query. - * if we have a query id, then we will send an - * error back to the user. - */ - if (sp->s_bufsize == 0 && - (sp->s_bufp - sp->s_buf > 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); - continue; - } - if ((n == -1) && (errno == PORT_WOULDBLK)) - continue; - if (n <= 0) { - sqrm(sp); - continue; - } - /* - * Consult database to get the answer. - */ - if (sp->s_size == 0) { - nameserIncr(sp->s_from.sin_addr, nssRcvdTCP); - 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) -#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", - 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; - - /* - * 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); - } - 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 ALLOW_UPDATES -/* - * Signal handler to schedule shutdown. Just set flag, to ensure a consistent - * state during dump. - */ -static SIG_FN -onintr() -{ - int save_errno = errno; - - resignal(SIGTERM, -1, onintr); - needToExit = 1; - errno = save_errno; -} -#endif /* ALLOW_UPDATES */ - -#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); -} - -#ifdef OLD_SETPROCTITLE -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++ = ' '; -} -#else -void -ns_setproctitle(a, s) - char *a; - int s; -{ - int size; - struct sockaddr_in sin; - char buf[80]; - - 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); - } - setproctitle("%s", buf); -} -#endif - -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/usr.sbin/named/ns_maint.c b/usr.sbin/named/ns_maint.c deleted file mode 100644 index 8072d88..0000000 --- a/usr.sbin/named/ns_maint.c +++ /dev/null @@ -1,1101 +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 1.4 1995/10/23 11:11:48 peter Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1988 - * - - * Copyright (c) 1986, 1988 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#include <sys/wait.h> -#include <stdio.h> -#include <syslog.h> -#include <signal.h> -#include <errno.h> -#include <sys/stat.h> - -#include "named.h" - -#ifdef USE_UTIME -# include <utime.h> -#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. Also, - * ifdef'd ALLOW_UPDATES, dump database if it has changed since last - * dump/bootup. - */ -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; -#ifdef ALLOW_UPDATES - case Z_PRIMARY: - /* - * Checkpoint the zone if it has changed - * since we last checkpointed - */ - if (zp->z_flags & Z_CHANGED) { - zonedump(zp); - ns_refreshtime(zp, tt.tv_sec); - } - break; -#endif /* ALLOW_UPDATES */ - } - gettime(&tt); - } - } -#ifdef CLEANCACHE - if ((cache_time + cache_interval) <= tt.tv_sec) { - if (cache_time) - 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, serial, - inet_ntoa(from_addr.sin_addr), - 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; -{ - static 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 -#ifdef ECHOARGS - if (debug) { - for (i = 0; i < argc; i++) - fprintf(ddt, "Arg %d=%s\n", i, argv[i]); - } -#endif /* ECHOARGS */ -#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", - (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 && - !WILDCARD_P(dname)) { - 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 exited with signal %d\n", - 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/usr.sbin/named/ns_ncache.c b/usr.sbin/named/ns_ncache.c deleted file mode 100644 index 95f84e5..0000000 --- a/usr.sbin/named/ns_ncache.c +++ /dev/null @@ -1,153 +0,0 @@ -/************************************************************************** - * ns_ncache.c - * author: anant kumar - * last modification: March 17, 1993 - * - * implements negative caching - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/file.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <syslog.h> -#include <errno.h> -#include <stdio.h> -#include <resolv.h> - -#include "named.h" - -#ifdef NCACHE - -void -cache_n_resp(msg, msglen) - u_char *msg; - int msglen; -{ - register struct databuf *dp; - HEADER *hp; - u_char *cp; - char dname[MAXDNAME]; - int n; - int type, class; - int Vcode; - int flags; - - nameserIncr(from_addr.sin_addr, nssRcvdNXD); - - hp = (HEADER *)msg; - cp = msg+HFIXEDSZ; - - n = dn_expand(msg, msg + msglen, cp, dname, sizeof dname); - if (n < 0) { - dprintf(1, (ddt, "Query expand name failed:cache_n_resp\n")); - hp->rcode = FORMERR; - return; - } - cp += n; - 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->rcode==NXDOMAIN) { - u_int32_t ttl; - u_int16_t atype; - u_char * tp = cp; - u_char * cp1; - u_char data[BUFSIZ+MAXDNAME]; - int len = sizeof(data); - - /* store ther SOA record */ - if (!hp->nscount) { - dprintf(3, (ddt, "ncache: nscount == 0\n")); - return; - } - n = dn_skipname(tp, msg + msglen); - if (n < 0) { - dprintf(3, (ddt, "ncache: form error\n")); - return; - } - tp += n; - GETSHORT(atype,tp); /* type */ - if (atype != T_SOA) { - dprintf(3, (ddt, "ncache: type (%d) != T_SOA\n",atype)); - return; - } - tp += sizeof(u_int16_t); /* class */ - GETLONG(ttl,tp); /* ttl */ - tp += sizeof(u_int16_t); /* dlen */ - - if ((n = dn_expand(msg, msg + msglen, tp, data, len)) - < 0 ) { - dprintf(3, (ddt, "ncache: form error 2\n")); - return; - } /* origin */ - tp += n; - cp1 = data + (n = strlen(data) + 1); - len -= n; - if ((n = dn_expand(msg, msg + msglen, tp, cp1, len)) < 0 ) { - dprintf(3, (ddt, "ncache: form error 2\n")); - return; - } /* mail */ - tp += n; - n = strlen(cp1) + 1; - cp1 += n; - len -= n; - bcopy(tp, cp1, n = 5 * sizeof(u_int32_t)); - /* serial, refresh, retry, expire, min */ - cp1 += n; - len -= n; - /* store the zone of the soa record */ - if ((n = dn_expand(msg, msg + msglen, cp, cp1, len)) < 0 ) { - dprintf(3, (ddt, "ncache: form error 2\n")); - return; - } - n = strlen(cp1) + 1; - cp1 += n; - - dp = savedata(class, T_SOA, MIN(ttl,NTTL)+tt.tv_sec, data, - cp1 - data); - } else { -#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)); - free((char *)dp); - return; - } - dprintf(4, (ddt, - "ncache succeeded: [%s %s %s] rcode:%d ttl:%l\n", - dname, p_type(type), p_class(class), - dp->d_rcode, (long)(dp->d_ttl-tt.tv_sec))); - return; -} - -#endif /*NCACHE*/ diff --git a/usr.sbin/named/ns_req.c b/usr.sbin/named/ns_req.c deleted file mode 100644 index 18c6c77..0000000 --- a/usr.sbin/named/ns_req.c +++ /dev/null @@ -1,2152 +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 1.4 1995/10/23 11:11:50 peter 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. - * - - * --Copyright-- - */ - -#include <sys/param.h> -#include <sys/uio.h> -#include <sys/file.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <fcntl.h> -#include <syslog.h> -#include <errno.h> -#include <stdio.h> -#include <resolv.h> - -#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)), -#ifdef DEBUG - printSOAdata __P((struct databuf)), -#endif - doaxfr __P((struct namebuf *, FILE *, - struct namebuf *, int)), - startxfr __P((struct qstream *, struct namebuf *, - u_char *, int, int, const char *)); - -#ifdef ALLOW_UPDATES -static int InitDynUpdate __P((register HEADER *hp, - char *msg, - int msglen, - u_char *startcp, - struct sockaddr_in *from, - struct qstream *qsp, - int dfd)); -#endif - -static struct addinfo addinfo[NADDRECS]; -static void addname __P((const char *, const char *, - u_int16_t, u_int16_t)); - -/* - * 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 - -#ifdef ALLOW_UPDATES -#define FORWARDED 1000 -/* - * In a sense the following constant should be defined in <arpa/nameser.h>, - * since it is returned here in place of a response code if the update was - * forwarded, and the response codes are defined in nameser.h. On the other - * hand, though, this constant is only seen in this file. The assumption - * here is that none of the other return codes equals this one (a good - * assumption, since they only occupy 4 bits over-the-wire) - */ - /* Call InitDynUpdate for all dynamic update requests */ - case UPDATEM: - case UPDATEMA: - case UPDATED: - case UPDATEDA: - case UPDATEA: - n = InitDynUpdate(hp, msg, msglen, cp, from, qsp, dfd); - if (n == FORWARDED) { - /* Return directly because InitDynUpdate - * forwarded the query to the primary, so we - * will send response later - */ - action = Return; - } else { - /* Either sucessful primary update or failure; - * return response code to client - */ - action = Finish; - } - - case ZONEREF: - dprintf(1, (ddt, "Refresh Zone\n")); - /*FALLTHROUGH*/ -#endif /* ALLOW_UPDATES */ - - 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); - } - *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; - - nameserIncr(from->sin_addr, nssRcvdQ); - -#ifdef XSTATS - /* Statistics for queries coming from port <> 53, suspect some kind of forwarder */ - if (from->sin_port != ns_port) - nameserIncr(from->sin_addr, nssNotNsQ); -#endif - -#ifdef DATUMREFCNT - nsp[0] = NULL; -#endif - - 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; - GETSHORT(type, *cpp); - GETSHORT(class, *cpp); - if (*cpp > eom) { - dprintf(1, (ddt, "FORMERR Query message length short\n")); - hp->rcode = FORMERR; - return (Finish); - } - if (*cpp < eom) { - dprintf(6, (ddt,"message length > received message\n")); - *msglenp = *cpp - msg; - } - - qtypeIncr(type); - - /* - * 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 (hp->rcode == NOERROR_NODATA) { - /* this should not occur */ - hp->rcode = NOERROR; - return (Finish); - } - *cpp += n; - *buflenp -= n; - *msglenp += n; - hp->nscount = htons((u_int16_t)count); - } -#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; - 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); - sqrm(qsp); - 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). - */ -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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; - /* XXX: should return SOA if founddata == 0, - * but old named's are confused by an SOA - * in the auth. section if there's no error. - */ - if (foundname == 0 && np) { - n = doaddauth(hp, *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 */ -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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*/ - } - } -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (Finish); - - case SERVFAIL: - /* We're authoritative but the zone isn't loaded. */ - if (!founddata && !(forward_only && fwdtab)) { - hp->rcode = SERVFAIL; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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); - } -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - /* 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; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (Finish); - } - *msglenp = n; - } - n = ns_forw(nsp, msg, *msglenp, from, qsp, dfd, &qp, dname, 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 (np->n_dname[0] == '\0') { - syslog(LOG_NOTICE, - "ns_req: no address for root server"); - hp->rcode = SERVFAIL; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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->n_parent; - } - goto fetchns; /* Try again. */ - case FW_SERVFAIL: - do_servfail: - hp->rcode = SERVFAIL; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (Finish); - } -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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; - - nameserIncr(from->sin_addr, nssRcvdIQ); - - 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; - 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) - 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; - bcopy(fname, anbuf, alen = (char *)*cpp - fname); - 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", np->n_dname)); - 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; - 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; - 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; - 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 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, dp->d_ttl)); - -#ifdef NCACHE - if (dp->d_rcode -#ifdef RETURNSOA - && dp->d_rcode != NXDOMAIN -#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) { - ttl = dp->d_ttl - (u_int32_t) tt.tv_sec; - if ((dp->d_flags & DB_F_HINT) || (ttl < 0)) { - dprintf(3, (ddt, - "make_rr: %d=>0, %#lx\n", - ttl, (u_long)dp->d_flags)); - ttl = 0; - } - } 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 defined(RETURNSOA) && defined(NCACHE) - if (dp->d_rcode == NXDOMAIN) { - name = (char *)dp->d_data; - name += strlen(name) +1; - name += strlen(name) +1; - name += 5 * INT32SZ; - } -#endif - if ((n = dn_comp(name, buf, buflen, dnptrs, edp)) < 0) - return (-1); - cp = buf + n; - buflen -= n; - PUTSHORT((u_int16_t)dp->d_type, cp); - PUTSHORT((u_int16_t)dp->d_class, cp); - PUTLONG(ttl, cp); - sp = cp; - cp += INT16SZ; - switch (dp->d_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, - dp->d_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 -= dp->d_type == T_SOA ? n + 5 * INT32SZ : n; - cp1 += strlen((char *)cp1) + 1; - n = dn_comp((char *)cp1, cp, buflen, dnptrs, edp); - if (n < 0) - return (-1); - cp += n; - if (dp->d_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_MX: - case T_AFSDB: - case T_RT: - /* 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; - - 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, dp->d_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; - - 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 foundstale = 0, - 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 */ - 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)) { - continue; - } - foundany++; - if (stale(dp)) { - foundstale++; - dprintf(1, (ddt, - "doaddinfo: stale entry '%s'%s\n", - np->n_dname, - (dp->d_flags&DB_F_HINT) - ? " hint" - : "" - )); - continue; - } - /* - * 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 (foundstale) { - /* Cache invalidate the address RR's */ - delete_all(np, (int)ap->a_class, T_A); - } - if (!NoFetchGlue && !foundcname && (foundstale || !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_INFO, - "\"%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[PACKETSZ]; - 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) || (top->n_dname[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) && (top->n_dname[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) && (top->n_dname[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 (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 (np->n_dname[0] != '\0') { /* don't redo root domain */ - doaxfr(np, rfp, top, class); - } - } - } - if (np == top) - dprintf(1, (ddt, "exit doaxfr()\n")); -} - -#ifdef ALLOW_UPDATES -/* - * Called by UPDATE{A,D,DA,M,MA} to initiate a dynamic update. If this is the - * primary server for the zone being updated, we update the zone's serial - * number and then call doupdate directly. If this is a secondary, we just - * forward the update; this way, if the primary update fails (e.g., if the - * primary is unavailable), we don't update the secondary; if the primary - * update suceeds, ns_resp will get called with the response (when it comes - * in), and then update the secondary's copy. - */ -static int -InitDynUpdate(hp, msg, msglen, startcp, from, qsp, dfd) - register HEADER *hp; - char *msg; - int msglen; - u_char *startcp; - struct sockaddr_in *from; - struct qstream *qsp; - int dfd; -{ - struct databuf *nsp[NSMAX]; - struct zoneinfo *zp; - char dnbuf[MAXDNAME]; - struct hashbuf *htp = hashtab; /* lookup relative to root */ - struct namebuf *np; - struct databuf *olddp, *newdp, *dp; - struct databuf **nspp; - char *fname; - register u_char *cp = startcp; - u_int16_t class, type; - int n, size, zonenum; - char ZoneName[MAXDNAME], *znp; - -#ifdef DATUMREFCNT - nsp[0] = NULL; -#endif - if ((n = dn_expand(msg, msg + msglen, cp, dnbuf, sizeof(dnbuf))) < 0) { - dprintf(1, (ddt,"FORMERR InitDynUpdate expand name failed\n")); - hp->rcode = FORMERR; - return (FORMERR); - } - cp += n; - GETSHORT(type, cp); - if (type == T_SOA) { /* T_SOA updates not allowed */ - hp->rcode = REFUSED; - dprintf(1, (ddt, "InitDynUpdate: REFUSED - SOA update\n")); - return (REFUSED); - } - GETSHORT(class, cp); - cp += INT32SZ; - GETSHORT(size, cp); -/****XXX - need bounds checking here ****/ - cp += size; - - if ((zonenum = findzone(dnbuf, class)) == 0) { /* zone not found */ - hp->rcode = NXDOMAIN; - return (NXDOMAIN); - } - zp = &zones[zonenum]; - - /* Disallow updates for which we aren't authoratative. Note: the - following test doesn't work right: If it's for a non-local zone, - we will think it's a primary but be unable to lookup the namebuf, - thus returning 'NXDOMAIN' */ - if (zp->z_type != Z_PRIMARY && zp->z_type != Z_SECONDARY) { - hp->rcode = REFUSED; - dprintf(1, (ddt, - "InitDynUpdate: REFUSED - non-{primary,secondary} update\n")); - return (REFUSED); - } - if (!(zp->z_flags & Z_DYNAMIC)) { - hp->rcode = REFUSED; - dprintf(1, (ddt, - "InitDynUpdate: REFUSED - dynamic flag not set for zone\n")); - return (REFUSED); - } - - /* - * Lookup the zone namebuf. Lookup "xyz" not "xyz.", since - * otherwise the lookup fails, because '.' may have a nil n_hash - * associated with it. - */ - strcpy(ZoneName, zp->z_origin); - znp = &ZoneName[strlen(ZoneName) - 1]; - if (*znp == '.') - *znp = NULL; - np = nlookup(ZoneName, &htp, &fname, 0); - if ((np == NULL) || (fname != ZoneName)) { - syslog(LOG_ERR, "InitDynUpdate: lookup failed on zone (%s)\n", - ZoneName); - hp->rcode = NXDOMAIN; - return (NXDOMAIN); - } - - /* - * If this is the primary copy increment the serial number. Don't - * increment the serial number if this is a secondary; this way, if 2 - * different secondaries both update the primary, they will both have - * lower serial numbers than the primary has, and hence eventually - * refresh and get all updates and become consistent. - * - * Note that the serial number must be incremented in both the zone - * data structure and the zone's namebuf. - */ - switch (zp->z_type) { - case Z_SECONDARY: /* forward update to primary */ - nspp = nsp; - dp = np->n_data; - while (dp != NULL) { - if (match(dp, class, T_NS)) { - if (nspp < &nsp[NSMAX-1]) { - *nspp++ = dp; -#ifdef DATUMREFCNT - dp->d_rcnt++; -#endif - } else - break; - } - dp = dp->d_next; - } - *nspp = NULL; /* Delimiter */ - if (ns_forw(nsp, msg, msglen, from, qsp, dfd, NULL, dnbuf, np) - < - 0) { - hp->rcode = SERVFAIL; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (SERVFAIL); - } -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (FORWARDED); - - case Z_PRIMARY: - zp->z_serial++; - /* Find the SOA record */ - for (olddp = np->n_data; olddp != NULL; olddp = olddp->d_next) - if (match(olddp, class, T_SOA)) - break; - if (olddp == NULL) { - syslog(LOG_NOTICE, - "InitDynUpdate: Couldn't find SOA RR for '%s'\n", - ZoneName); - hp->rcode = NXDOMAIN; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (NXDOMAIN); - } - newdp = savedata(olddp->d_class, olddp->d_type, olddp->d_ttl, - olddp->d_data, olddp->d_size); - newdp->d_zone = olddp->d_zone; - newdp->d_cred = DB_C_AUTH; /* XXX - it may not be so */ - newdp->d_clev = db_getclev(zp->z_origin); - cp = (u_char *)newdp->d_data; - cp += strlen(cp) + 1; /* skip origin string */ - cp += strlen(cp) + 1; /* skip in-charge string */ - putlong((u_int32_t)(zp->z_serial), cp); - dprintf(4, (ddt, "after stuffing data into newdp:\n")); -#ifdef DEBUG - if (debug >= 4) - printSOAdata(newdp); -#endif - - if ((n = db_update(ZoneName, olddp, newdp, DB_DELETE, - hashtab)) != NOERROR) { /* XXX */ - dprintf(1, (ddt, - "InitDynUpdate: SOA update failed\n")); - hp->rcode = NOCHANGE; - free((char*) dp); -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (NOCHANGE); - } - - /* Now update the RR itself */ - /* XXX - DB_C_AUTH may be wrong */ - if (doupdate(msg, msglen, msg + HFIXEDSZ, zonenum, - (struct databuf *)0, DB_NODATA, DB_C_AUTH) < 0) { - dprintf(1, (ddt, "InitDynUpdate: doupdate failed\n")); - /* doupdate fills in rcode */ -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (hp->rcode); - } - zp->z_flags |= Z_CHANGED; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (NOERROR); - } -} - -#ifdef DEBUG -/* - * Print the contents of the data in databuf pointed to by dp for an SOA record - */ -static void -printSOAdata(dp) - struct databuf *dp; -{ - register u_char *cp; - - if (!debug) - return; /* Otherwise fprintf to ddt will bomb */ - cp = (u_char *)dp->d_data; - fprintf(ddt, "printSOAdata(%#lx): origin(%#lx)='%s'\n", - (u_long)dp, (u_long)cp, cp); - cp += strlen(cp) + 1; /* skip origin string */ - fprintf(ddt, "printSOAdata: in-charge(%#lx)='%s'\n", - (u_long)cp, cp); - cp += strlen(cp) + 1; /* skip in-charge string */ - fprintf(ddt, "printSOAdata: serial(%lx)=%d\n", - cp, (u_long)_getlong(cp)); -} -#endif -#endif - -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; -#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")); - - /* - * 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)); - return; - case 0: - /* child */ - break; - default: - /* parent */ - syslog(LOG_DEBUG, "zone transfer of \"%s\" to %s (pid %lu)", - dname, sin_ntoa(&qsp->s_from), pid); - 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); - -#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); - close(qsp->s_rfd); -#endif - _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; -} - -#ifdef DATUMREFCNT -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)); - free(*nsp); /* delayed free */ - } - *nsp++ = NULL; - } -} -#endif diff --git a/usr.sbin/named/ns_resp.c b/usr.sbin/named/ns_resp.c deleted file mode 100644 index 756a0d4..0000000 --- a/usr.sbin/named/ns_resp.c +++ /dev/null @@ -1,2593 +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 1.5 1996/01/07 05:48:38 peter 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. - * - - * --Copyright-- - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/file.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <syslog.h> -#include <errno.h> -#include <stdio.h> -#include <resolv.h> - -#include "named.h" - -static void check_root __P((void)), - check_ns __P((void)); - -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", - editFailed[] = "edit of response failed"; - -static char * -learntFrom(qp, server) - struct qinfo *qp; - struct sockaddr_in *server; -{ - static char *buf = NULL; - char *a, *ns, *na; - struct databuf *db; - char nsbuf[20]; - char abuf[20]; - int i; - - if (buf) { - free(buf); - buf = NULL; - } - - a = ns = na = "<Not Available>"; - - 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); -} - -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; - register u_char *tempcp; -#ifdef VALIDATE - struct sockaddr_in *server = &from_addr; - struct { char *name; int type, class; u_int cred; } defer_rm[99]; - int defer_rm_count; -#endif - struct sockaddr_in *nsa; - struct databuf *nsp[NSMAX]; - int i, c, n, qdcount, ancount, aucount, nscount, arcount; - int qtype, qclass, dbflags; - int restart; /* flag for processing cname response */ - int validanswer; - int cname; - int count, founddata, foundname; - int buflen; - int newmsglen; - char name[MAXDNAME], qname[MAXDNAME]; - char *dname; - 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; - - nameserIncr(from_addr.sin_addr, nssRcvdR); -#ifdef DATUMREFCNT - nsp[0] = NULL; -#endif - 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; - GETSHORT(qtype, cp); - GETSHORT(qclass, cp); - 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)) { - char msgbuf[MAXDNAME*2]; - - sprintf(msgbuf, - "query section mismatch (%s %s %s)", - qname, p_class(qclass), p_type(qtype)); - formerrmsg = msgbuf; - goto formerr; - } - } else { - /* Pedantic. */ - qname[0] = '\0'; - qtype = 0; - qclass = 0; - } - - /* 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; - } - -#ifdef ALLOW_UPDATES - if ( (hp->rcode == NOERROR) && - (hp->opcode == UPDATEA || hp->opcode == UPDATED || - hp->opcode == UPDATEDA || hp->opcode == UPDATEM || - hp->opcode == UPDATEMA) ) { - /* - * Update the secondary's copy, now that the primary - * successfully completed the update. Zone doesn't matter - * for dyn. update -- doupdate calls findzone to find it - */ - /* XXX - DB_C_AUTH may be wrong */ - (void) doupdate(qp->q_msg, qp->q_msglen, qp->q_msg + HFIXEDSZ, - 0, (struct databuf *)0, 0, DB_C_AUTH); - dprintf(3, (ddt, "resp: leaving, UPDATE*\n")); - /* return code filled in by doupdate */ - goto return_msg; - } -#endif /* ALLOW_UPDATES */ - - /* - * Determine if the response came from a forwarder. Packets from - * anyplace not listed as a forwarder or as a server to whom we - * might have forwarded the query will be dropped. - */ - for (fwd = fwdtab; fwd != (struct fwdinfo *)NULL; fwd = fwd->next) { - if (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)){ - if (ns->d_nstime == 0) - ns->d_nstime = (u_int32_t)rtrip; - else - ns->d_nstime = (u_int32_t) - (ns->d_nstime * ALPHA - + - (1-ALPHA) * (u_int32_t)rtrip); - /* prevent floating point overflow, - * limit to 1000 sec - */ - if (ns->d_nstime > 1000000) - ns->d_nstime = 1000000; - } - - /* - * Record the source so that we do not use this NS again. - */ - if (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++) { - 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) - ns2->d_nstime = (u_int32_t)(rtrip * BETA); - else - ns2->d_nstime = (u_int32_t)( - ns2->d_nstime * BETA + (1-ALPHA) * rtrip - ); - if (ns2->d_nstime > 1000000) - ns2->d_nstime = 1000000; - } else - ns2->d_nstime = (u_int32_t)(ns2->d_nstime * GAMMA); - 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 - */ - if (qdcount == 1 && 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; - GETSHORT(type, tp); - if (tp >= eom) { - formerrmsg = outofDataAuth; - goto formerr; - } - GETSHORT(class, tp); - if (tp >= eom) { - formerrmsg = outofDataAuth; - 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; - - n = dn_expand(msg, eom, tp, name, sizeof name); - if (n < 0) { - formerrmsg = expandFailedAnswer; - goto formerr; - } - tp += n; /* name */ - GETSHORT(type, tp); /* type */ - GETSHORT(class, tp); /* class */ - tp += INT32SZ; /* ttl */ - GETSHORT(dlen, tp); /* dlen */ - if (tp >= eom) { - formerrmsg = outofDataAnswer; - goto formerr; - } - if (strcasecmp(qname, name) || - qtype != type || - qclass != class) { - char msgbuf[MAXDNAME*2]; - - sprintf(msgbuf, - "qserial answer mismatch (%s %s %s)", - name, p_class(class), p_type(type)); - formerrmsg = msgbuf; - goto formerr; - } - if ((u_int)dlen < (5 * INT32SZ)) { - formerrmsg = dlenUnderrunAnswer; - 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 */ - GETLONG(serial, tp); - - qserial_answer(qp, serial); - } - qremove(qp); - return; - } - - /* - * Add the info received in the response to the data base. - */ - c = ancount + aucount + 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 */ - } - - tp = cp; - - restart = 0; - validanswer = 0; - nscount = 0; - cname = 0; -#ifdef VALIDATE - defer_rm_count = 0; -#endif - - for (i = 0; i < count; i++) { - struct databuf *ns3 = NULL; - u_char cred; - int VCode; - u_int16_t type, class; - - if (cp >= eom) { - formerrmsg = outofDataFinal; - goto formerr; - } - - /* Get the DNAME. */ - tempcp = cp; - n = dn_expand(msg, eom, tempcp, name, sizeof name); - if (n <= 0) { - formerrmsg = outofDataFinal; - goto formerr; - } - tempcp += n; - GETSHORT(type, tempcp); - GETSHORT(class, tempcp); - - /* - * See if there are any NS RRs in the authority section - * for the negative caching logic below. We'll count - * these before validation. - */ - if (type == T_NS && i >= ancount && i < ancount + aucount) - nscount++; - - /* Decide what credibility this ought to have in the cache. */ - if (i < ancount) - cred = (hp->aa && !strcasecmp(name, qname)) - ? DB_C_AUTH - : DB_C_ANSWER; - else - cred = (qp->q_flags & Q_PRIMING) - ? DB_C_ANSWER - : DB_C_ADDITIONAL; -#ifdef VALIDATE - if ((n = dovalidate(msg, msglen, cp, 0, - dbflags, qp->q_domain, server, - &VCode)) < 0) { - formerrmsg = outofDataFinal; - goto formerr; - } - if (VCode == INVALID && !(qp->q_flags & Q_SYSTEM)) { - /* - * If anything in the answer section fails - * validation this means that it definitely did - * not reside below the domain owning the NS RRs - * that we sent the query to. This means either - * that it was the target of a CNAME early in the - * response, in which case we will treat this the - * same as if the answer was incomplete and restart - * the query on the CNAME target, or that someone - * was trying to spoof us. - */ - if (i < ancount) - restart = 1; - /* - * Restart or no, if we're here it means we are not - * going to cache this RR. That being the case, we - * must burn down whatever partial RRset we've got - * in the cache now, lest we inadvertently answer - * with a truncated RRset in some future section. - */ - for (c = 0; c < defer_rm_count; c++) - if (!strcasecmp(defer_rm[c].name, name) && - defer_rm[c].class == class && - defer_rm[c].type == type) - break; - if (c < defer_rm_count) { - if (defer_rm[c].cred < cred) - defer_rm[c].cred = cred; - } else { - if (defer_rm_count+1 >= - (sizeof defer_rm / sizeof defer_rm[0])) { - formerrmsg = "too many RRs in ns_resp"; - goto formerr; - } - defer_rm[defer_rm_count].name = savestr(name); - defer_rm[defer_rm_count].type = type; - defer_rm[defer_rm_count].class = class; - defer_rm[defer_rm_count].cred = cred; - defer_rm_count++; - } - } else { -#endif - if (i < ancount) { - /* - * If there are any non-CNAME RRs (or - * CNAME RRs if they are an acceptable) - * then the query is complete unless an - * intermediate CNAME didn't pass validation, - * but that's OK. - */ - if (type != T_CNAME || qtype == T_CNAME || - qtype == T_ANY) - validanswer = 1; - else - cname = 1; - } - n = doupdate(msg, msglen, cp, 0, &ns3, dbflags, cred); -#ifdef VALIDATE - } -#endif - if (n < 0) { - dprintf(1, (ddt, "resp: leaving, doupdate failed\n")); - formerrmsg = outofDataFinal; - goto formerr; - } - cp += n; - } -#ifdef VALIDATE - if (defer_rm_count > 0) { - for (i = 0; i < defer_rm_count; i++) { - register struct databuf *db = NULL; - - fname = ""; - htp = hashtab; /* lookup relative to root */ - np = nlookup(defer_rm[i].name, &htp, &fname, 0); - if (np && fname == defer_rm[i].name && - defer_rm[i].class != C_ANY && - defer_rm[i].type != T_ANY) { - /* - * If doupdate() wouldn't have cached this - * RR anyway, there's no need to delete it. - */ - for (db = np->n_data; - db != NULL; - db = db->d_next) { - if (!db->d_zone && - match(db, defer_rm[i].class, - defer_rm[i].type) && - db->d_cred >= defer_rm[i].cred) { - break; - } - } - if (db == NULL) - delete_all(np, defer_rm[i].class, - defer_rm[i].type); - /* XXX: should delete name node if empty? */ - } - syslog(LOG_DEBUG, "defer_rm [%s %s %s] (np%#x, db%#x)", - defer_rm[i].name, - p_class(defer_rm[i].class), - p_type(defer_rm[i].type), - np, db); - free(defer_rm[i].name); - } - } -#endif - - if (cp > eom) { - formerrmsg = outofDataAFinal; - goto formerr; - } - - if ((qp->q_flags & Q_SYSTEM) && ancount) { - if (qp->q_flags & Q_PRIMING) - check_root(); - 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 && !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. - */ - 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")); - if (qp->q_cmsglen) { - /* XXX - what about additional CNAMEs in the chain? */ - msg = qp->q_cmsg; - msglen = qp->q_cmsglen; - hp = (HEADER *)msg; - } -#ifdef NCACHE - /* answer was NO */ - if (hp->aa && - ((hp->rcode == NXDOMAIN) || (hp->rcode == NOERROR))) { - cache_n_resp(msg, msglen); - } -#endif /*NCACHE*/ - 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); - 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; - } - 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 */ - 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). - */ -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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; - /* XXX: should return SOA if founddata == 0, - * but old named's are confused by an SOA - * in the auth. section if there's no error. - */ - if (foundname == 0 && np) { - n = doaddauth(hp, cp, buflen, np, nsp[0]); - cp += n; - buflen -= n; - } - } - goto 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 */ -#ifdef DATUMREFCNT - /* XXX - this code should be shared with qfree()'s similar logic. */ - for (i = 0; (u_int)i < qp->q_naddr; i++) { - static const char freed[] = "freed", busy[] = "busy"; - const char *result; - - if (qp->q_addr[i].ns != NULL) { - if ((--(qp->q_addr[i].ns->d_rcnt))) - result = busy; - else - result = freed; - dprintf(1, (ddt, "ns_resp: ns %s rcnt %d (%s)\n", - qp->q_addr[i].ns->d_data, - qp->q_addr[i].ns->d_rcnt, - result)); - if (result == freed) - free((char*)qp->q_addr[i].ns); - } - if (qp->q_addr[i].nsdata != NULL) { - if ((--(qp->q_addr[i].nsdata->d_rcnt))) - result = busy; - else - result = freed; - dprintf(1, (ddt, - "ns_resp: nsdata %08.8X rcnt %d (%s)\n", - *(int32_t *)(qp->q_addr[i].nsdata->d_data), - qp->q_addr[i].nsdata->d_rcnt, - result)); - if (result == freed) - free((char*)qp->q_addr[i].nsdata); - } - } -#endif - qp->q_naddr = 0; - qp->q_curaddr = 0; - qp->q_fwd = fwdtab; -#if defined(LAME_DELEGATION) || defined(VALIDATE) - getname(np, qp->q_domain, sizeof(qp->q_domain)); -#endif /* LAME_DELEGATION */ - if ((n = nslookup(nsp, qp, dname, "ns_resp")) <= 0) { - if (n < 0) { - dprintf(3, (ddt, "resp: nslookup reports danger\n")); - } else { - dprintf(3, (ddt, "resp: no addrs found for NS's\n")); - } - if (cname) /* a remote CNAME that does not have data */ - goto return_newmsg; - goto servfail; - } - 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(BUFSIZ)) == NULL) { - syslog(LOG_NOTICE, "resp: malloc error\n"); - goto servfail; - } - n = res_mkquery(QUERY, dname, qclass, qtype, - NULL, 0, NULL, qp->q_msg, BUFSIZ); - if (n < 0) { - syslog(LOG_INFO, "resp: res_mkquery(%s) failed", - dname); - goto servfail; - } - 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 */ - nameserIncr(nsa->sin_addr, nssSentFwdR); - nameserIncr(qp->q_from.sin_addr, nssRcvdFwdR); - dprintf(3, (ddt, "resp: Query sent.\n")); -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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); - nameserIncr(from_addr.sin_addr, nssSentFErr); -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return; - - return_msg: - nameserIncr(from_addr.sin_addr, nssRcvdFwdR); - nameserIncr(qp->q_from.sin_addr, nssSentFwdR); - /* 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); -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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); -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return; - - servfail: - nameserIncr(qp->q_from.sin_addr, nssSentFail); - hp = (HEADER *)(cname ? 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, (cname ? qp->q_cmsglen : qp->q_msglen), - qp); - qremove(qp); -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return; -} - -/* - * 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, *rrp; - struct databuf **savens; - int msglen, zone, flags; - u_int cred; -{ - register u_char *cp; - register int n; - int class, type, dlen, n1; - u_int32_t ttl; - struct databuf *dp; - char dname[MAXDNAME]; - u_char *cp1; - u_char data[BUFSIZ]; - register HEADER *hp = (HEADER *)msg; -#ifdef ALLOW_UPDATES - int zonenum; -#endif - - dprintf(3, (ddt, "doupdate(zone %d, savens %#lx, flags %#lx)\n", - zone, (u_long)savens, (u_long)flags)); - - cp = rrp; - if ((n = dn_expand(msg, msg + msglen, cp, dname, sizeof dname)) < 0) { - hp->rcode = FORMERR; - return (-1); - } - cp += n; - GETSHORT(type, cp); - GETSHORT(class, cp); - GETLONG(ttl, cp); - GETSHORT(dlen, cp); - dprintf(3, (ddt, "doupdate: 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: - 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_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(cp, 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(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(cp, data, INT16SZ); - cp1 = data + INT16SZ; - cp += INT16SZ; - - /* get MAP822 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; - 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(1, (ddt, - "update type %d: %d bytes is too much data\n", - type, n)); - hp->rcode = FORMERR; - return (-1); - } - -#ifdef ALLOW_UPDATES - /* - * If this is a dynamic update request, process it specially; else, - * execute normal update code. - */ - switch(hp->opcode) { - - /* For UPDATEM and UPDATEMA, do UPDATED/UPDATEDA followed by UPDATEA */ - case UPDATEM: - case UPDATEMA: - - /* - * The named code for UPDATED and UPDATEDA is the same except that for - * UPDATEDA we we ignore any data that was passed: we just delete all - * RRs whose name, type, and class matches - */ - case UPDATED: - case UPDATEDA: - if (type == T_SOA) { /* Not allowed */ - dprintf(1, (ddt, "UDPATE: REFUSED - SOA delete\n")); - hp->rcode = REFUSED; - return (-1); - } - /* - * Don't check message length if doing UPDATEM/UPDATEMA, - * since the whole message wont have been demarshalled until - * we reach the code for UPDATEA - */ - if ( (hp->opcode == UPDATED) || (hp->opcode == UPDATEDA) ) { - if (cp != (u_char *)(msg + msglen)) { - dprintf(1, (ddt, - "FORMERR UPDATE message length off\n" - )); - hp->rcode = FORMERR; - return (-1); - } - } - if ((zonenum = findzone(dname, class)) == 0) { - hp->rcode = NXDOMAIN; - return (-1); - } - if (zones[zonenum].z_flags & Z_DYNADDONLY) { - hp->rcode = NXDOMAIN; - return (-1); - } - if ( (hp->opcode == UPDATED) || (hp->opcode == UPDATEM) ) { - /* Make a dp for use in db_update, as old dp */ - dp = savedata(class, type, 0, cp1, n); - dp->d_zone = zonenum; - dp->d_cred = cred; - dp->d_clev = db_getclev(zones[zonenum].z_origin); - n = db_update(dname, dp, NULL, DB_MEXIST | DB_DELETE, - hashtab); - if (n != OK) { - dprintf(1, (ddt, - "UPDATE: db_update failed\n")); - free((char*) dp); - hp->rcode = NOCHANGE; - return (-1); - } - } else { /* UPDATEDA or UPDATEMA */ - int DeletedOne = 0; - /* Make a dp for use in db_update, as old dp */ - dp = savedata(class, type, 0, NULL, 0); - dp->d_zone = zonenum; - dp->d_cred = cred; - dp->d_clev = db_getclev(zones[zonenum].z_origin); - do { /* Loop and delete all matching RR(s) */ - n = db_update(dname, dp, NULL, DB_DELETE, - hashtab); - if (n != OK) - break; - DeletedOne++; - } while (1); - free((char*) dp); - /* Ok for UPDATEMA not to have deleted any RRs */ - if (!DeletedOne && hp->opcode == UPDATEDA) { - dprintf(1, (ddt, - "UPDATE: db_update failed\n")); - hp->rcode = NOCHANGE; - return (-1); - } - } - if ( (hp->opcode == UPDATED) || (hp->opcode == UPDATEDA) ) - return (cp - rrp);; - /* - * Else unmarshal the RR to be added and continue on to - * UPDATEA code for UPDATEM/UPDATEMA - */ - if ((n = - dn_expand(msg, msg+msglen, cp, dname, sizeof(dname))) < 0) { - dprintf(1, (ddt, - "FORMERR UPDATE expand name failed\n")); - hp->rcode = FORMERR; - return (-1); - } - cp += n; - GETSHORT(type, cp); - GETSHORT(class, cp); - GETLONG(ttl, cp); - GETSHORT(n, cp); - cp1 = cp; -/**** XXX - need bounds checking here ****/ - cp += n; - - case UPDATEA: - if (n > MAXDATA) { - dprintf(1, (ddt, "UPDATE: too much data\n")); - hp->rcode = NOCHANGE; - return (-1); - } - if (cp != (u_char *)(msg + msglen)) { - dprintf(1, (ddt, - "FORMERR UPDATE message length off\n")); - hp->rcode = FORMERR; - return (-1); - } - if ((zonenum = findzone(dname, class)) == 0) { - hp->rcode = NXDOMAIN; - return (-1); - } - if (zones[zonenum].z_flags & Z_DYNADDONLY) { - struct hashbuf *htp = hashtab; - char *fname; - if (nlookup(dname, &htp, &fname, 0) && - !strcasecmp(dname, fname)) { - dprintf(1, (ddt, - "refusing add of existing name\n" - )); - hp->rcode = REFUSED; - return (-1); - } - } - dp = savedata(class, type, ttl, cp1, n); - dp->d_zone = zonenum; - dp->d_cred = cred; - dp->d_clev = db_getclev(zones[zonenum].z_origin); - if ((n = db_update(dname, NULL, dp, DB_NODATA, - hashtab)) != OK) { - dprintf(1, (ddt, "UPDATE: db_update failed\n")); - hp->rcode = NOCHANGE; - free((char*) dp); - return (-1); - } - else - return (cp - rrp); - } -#endif /* ALLOW_UPDATES */ - - if (zone == 0) - ttl += tt.tv_sec; -#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 *)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\"", - data, sin_ntoa(&from_addr), qname); - 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\"", - data, sin_ntoa(&from_addr), qname); - return (cp - rrp); - } -#endif - } -#endif /*TRACEROOT || BOGUSNS*/ - - dp = savedata(class, type, ttl, cp1, n); - 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 - free((char *)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*2]; - - /* 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; - struct namebuf *np; - struct databuf *nsp[NSMAX]; - struct hashbuf *htp; - struct sockaddr_in *nsa; - const char *fname; - int n, count; - -#ifdef DATUMREFCNT - nsp[0] = NULL; -#endif - dprintf(3, (ddt, "sysquery(%s, %d, %d, %#lx, %d)\n", - dname, class, type, (u_long)nss, nsc)); - qp = qnew(); - - 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 (%d) on %s?", - n, dname); - err2: -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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; -#if defined(LAME_DELEGATION) || defined(VALIDATE) - getname(np, qp->q_domain, sizeof(qp->q_domain)); -#endif /* LAME_DELEGATION */ - - if ((qp->q_msg = (u_char *)malloc(BUFSIZ)) == NULL) { - syslog(LOG_NOTICE, "sysquery: malloc failed"); - goto err2; - } - n = res_mkquery(opcode, dname, class, - type, NULL, 0, NULL, - qp->q_msg, BUFSIZ); - 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 { - count = nslookup(nsp, qp, dname, "sysquery"); - if (count <= 0) { - if (count < 0) - syslog(LOG_INFO, - "sysquery: nslookup reports danger (%s)", - dname); - else - /* "." domain gets LOG_WARNING here. */ - syslog(dname[0] ? LOG_INFO : LOG_WARNING, - "sysquery: no addrs found for NS (%s)", - dname); - 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), - 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); -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (qp); -} - -/* - * Check the list of root servers after receiving a response - * to a query for the root servers. - */ -static void -check_root() -{ - register struct databuf *dp, *pdp; - register struct namebuf *np; - int count = 0; - - priming = 0; - for (np = hashtab->h_tab[0]; np != NULL; np = np->n_next) - if (np->n_dname[0] == '\0') - break; - if (np == NULL) { - syslog(LOG_NOTICE, "check_root: Can't find root!\n"); - return; - } - for (dp = np->n_data; dp != NULL; dp = dp->d_next) - if (dp->d_type == T_NS) - count++; - 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; - } - 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; - } - check_ns(); -} - -/* - * Check the root to make sure that for each NS record we have a A RR - */ -static void -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; - - 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 (np->n_dname[0] != 0) - continue; - for (dp = np->n_data; dp != NULL; dp = dp->d_next) { - if (dp->d_type != T_NS) - continue; - - /* look for A records */ - dname = (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; - for (tdp=tnp->n_data; tdp != NULL; tdp=tdp->d_next) { - if (tdp->d_type != T_A || - tdp->d_class != dp->d_class) - continue; - if ((tdp->d_zone == 0) && - (tdp->d_ttl < curtime)) { - dprintf(3, (ddt, - "check_ns: stale entry '%s'\n", - tnp->n_dname)); - /* Cache invalidate the address RR's */ - delete_all(tnp, dp->d_class, T_A); - found_arr = 0; - break; - } - found_arr++; - } - if (!found_arr) - sysquery(dname, dp->d_class, T_A, NULL, - 0, QUERY); - } - } -} - -/* int findns(npp, class, nsp, countp, flag) - * Find NS' 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} - * SERVFAIL: we are auth but zone isn't loaded; or, no root servers found - * OK: success (this is the only case where *countp and nsp[] are valid) - */ -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; - -#ifdef DATUMREFCNT - nsp[0] = NULL; -#endif - - if (priming && (np == NULL || np->n_dname[0] == '\0')) - htp = fcachetab; - else - htp = hashtab; - - try_again: - if (htp == fcachetab) - needs_prime_cache = 1; - while (np == NULL && htp != NULL) { - dprintf(3, (ddt, "findns: using %s\n", - htp == hashtab ? "cache" : "hints")); - for (np = htp->h_tab[0]; np != NULL; np = np->n_next) - if (np->n_dname[0] == '\0') - break; - htp = (htp == hashtab ? fcachetab : NULL); /* Fallback */ - } - while (np != NULL) { - dprintf(5, (ddt, "findns: np %#lx '%s'\n", - (u_long)np, np->n_dname)); - /* 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; -#ifdef DATUMREFCNT - nsp[1] = NULL; - dp->d_rcnt++; -#endif - 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; - 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) && -#ifdef DATUMREFCNT - (dp->d_ttl < tt.tv_sec) && -#else - (dp->d_ttl < (tt.tv_sec+900)) && -#endif - !(dp->d_flags & DB_F_HINT)) { - dprintf(1, (ddt, "findns: stale entry '%s'\n", - np->n_dname)); - /* Cache invalidate the NS RR's. */ -#ifndef DATUMREFCNT - if (dp->d_ttl < tt.tv_sec) -#endif - delete_all(np, class, T_NS); - goto try_parent; - } - if (nspp < &nsp[NSMAX-1]) { - *nspp++ = dp; -#ifdef DATUMREFCNT - dp->d_rcnt++; -#endif - } - } - - *countp = nspp - nsp; - if (*countp > 0) { - dprintf(3, (ddt, "findns: %d NS's added for '%s'\n", - *countp, np->n_dname)); - *nspp = NULL; - *npp = np; - return (OK); /* Success, got some NS's */ - } -try_parent: - np = np->n_parent; - } - if (htp) - 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, foundstale = 0; - -#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 (stale(dp)) { - /* - * Don't use stale data. - * Would like to call delete_all here - * and continue, but the data chain would get - * munged; can't restart, as make_rr has side - * effects (leaving pointers in dnptr). - * Just skip this entry for now - * and call delete_all at the end. - */ - dprintf(3, (ddt, - "finddata: stale entry '%s'\n", - np->n_dname)); - if (dp->d_zone == 0) - foundstale++; - continue; - } - if (dp->d_cred == DB_C_ADDITIONAL) { - /* 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 faster when this datum is - * used often. - */ - dp->d_ttl = tt.tv_sec - + - 0.95 * (int) (dp->d_ttl - tt.tv_sec); - } -#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) { - hp->rcode = NOERROR_NODATA; - *countp = 0; - return 1; /* XXX - we have to report success */ - } - /* don't satisfy T_ANY queries from -$ info */ - continue; - } -#ifndef RETURNSOA - 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; - } - if (type != T_ANY) { - hp->rcode = NXDOMAIN; - *countp = 0; - return 1; /* XXX - we have to report success */ - } - /* don't satisfy T_ANY queries from -$ info */ - continue; - } -#endif -#endif /*NCACHE*/ - - 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) { - if (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 - */ - if (foundstale) { - delete_all(np, class, type); - /* XXX this isn't right if 'type' is something special - * such as T_AXFR or T_MAILB, since the matching done - * by match() in delete_all() is different from that - * done by wanted() above. - */ - } - 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? - */ -int -wanted(dp, class, type) - struct databuf *dp; - int class, type; -{ - 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); - if (type == dp->d_type) - 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 - - switch (dp->d_type) { - case T_ANY: - return (1); - case T_CNAME: -#ifdef NCACHE - if (dp->d_rcode != NOERROR_NODATA) -#endif - return (1); -#ifdef NCACHE - else - break; -#endif - } - 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); -} - -/* - * 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, np->n_dname, 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; - } -} diff --git a/usr.sbin/named/ns_sort.c b/usr.sbin/named/ns_sort.c deleted file mode 100644 index 225aabe..0000000 --- a/usr.sbin/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 1.3 1995/08/20 21:19:01 peter Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986, 1990 - * - - * Copyright (c) 1986, 1990 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/file.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <stdio.h> -#include <syslog.h> -#include <resolv.h> - -#include "named.h" - -static int sort_rr __P((u_char *cp, int count, struct netinfo *ntp, u_char *eom)); - -#ifdef SORT_RESPONSE -struct netinfo * -local(from) - struct sockaddr_in *from; -{ - struct netinfo *ntp; - - if (from->sin_addr.s_addr == netloop.my_addr.s_addr) - return (&netloop); - for (ntp = nettab; ntp != *enettab; ntp = ntp->next) { - if (ntp->addr == (from->sin_addr.s_addr & ntp->mask)) - return (ntp); - } - return (NULL); -} - -void -sort_response(cp, ancount, lp, eom) - register u_char *cp; - register int ancount; - struct netinfo *lp; - u_char *eom; -{ - register struct netinfo *ntp; - - dprintf(3, (ddt, "sort_response(%d)\n", ancount)); - if (ancount > 1) { - if (sort_rr(cp, ancount, lp, eom)) - return; - for (ntp = nettab; ntp != NULL; ntp = ntp->next) { - if ((ntp->addr == lp->addr) && (ntp->mask == lp->mask)) - continue; - if (sort_rr(cp, ancount, ntp, eom)) - break; - } - } -} - -static int -sort_rr(cp, count, ntp, eom) - register u_char *cp; - int count; - register struct netinfo *ntp; - u_char *eom; -{ - int type, class, dlen, n, c; - struct in_addr inaddr; - u_char *rr1; - -#ifdef DEBUG - if (debug > 2) { - inaddr.s_addr = ntp->addr; - fprintf(ddt, "sort_rr(%#lx, %d, [%s])\n", - (u_long)cp, count, inet_ntoa(inaddr)); - } -#endif - rr1 = NULL; - for (c = count; c > 0; --c) { - n = dn_skipname(cp, eom); - if (n < 0) - return (1); /* bogus, stop processing */ - cp += n; - if (cp + QFIXEDSZ > eom) - return (1); - GETSHORT(type, cp); - GETSHORT(class, cp); - cp += INT32SZ; - GETSHORT(dlen, cp); - if (dlen > eom - cp) - return (1); /* bogus, stop processing */ - switch (type) { - case T_A: - switch (class) { - case C_IN: - case C_HS: - bcopy(cp, (char *)&inaddr, INADDRSZ); - if (rr1 == NULL) - rr1 = cp; - if ((ntp->mask & inaddr.s_addr) == ntp->addr) { - dprintf(2, (ddt,"net [%s] best choice\n", - inet_ntoa(inaddr))); - if (rr1 != cp) { - bcopy(rr1, cp, INADDRSZ); - bcopy((char *)&inaddr, rr1, INADDRSZ); - } - return (1); - } - break; - } - break; - } - cp += dlen; - } - return (0); -} -#endif diff --git a/usr.sbin/named/ns_stats.c b/usr.sbin/named/ns_stats.c deleted file mode 100644 index b4c8958..0000000 --- a/usr.sbin/named/ns_stats.c +++ /dev/null @@ -1,398 +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 1.2 1995/05/30 03:49:00 rgrimes Exp $"; -#endif /* not lint */ - -/* - * ++Copyright++ 1986,1994 - * - - * Copyright (c) 1986,1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -/**************************************************************************/ -/* simple monitoring of named behavior */ -/* dumps a bunch of values into a well-known file */ -/**************************************************************************/ - -#include <sys/param.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <stdio.h> -#include <syslog.h> -#include <errno.h> - -#include "named.h" -#include "tree.h" - -static u_long typestats[T_ANY+1]; -static const char *typenames[T_ANY+1] = { - /* 5 types per line */ - "Unknown", "A", "NS", "invalid(MD)", "invalid(MF)", - "CNAME", "SOA", "MB", "MG", "MR", - "NULL", "WKS", "PTR", "HINFO", "MINFO", - "MX", "TXT", "RP", "AFSDB", "X25", - "ISDN", "RT", "NSAP", "NSAP_PTR", "SIG", - "KEY", "PX", "invalid(GPOS)", "AAAA", "LOC", - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - /* 20 per line */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 100 */ - "UINFO", "UID", "GID", "UNSPEC", 0, 0, 0, 0, 0, 0, - /* 110 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 120 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 200 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 240 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 250 */ - 0, 0, "AXFR", "MAILB", "MAILA", "ANY" -}; - -static void nameserStats __P((FILE *)); - -void -ns_stats() -{ - time_t timenow = time(NULL); - register FILE *f; - register int i; - - syslog(LOG_NOTICE, "dumping nameserver stats\n"); - - if (!(f = fopen(statsfile, "a"))) { - syslog(LOG_NOTICE, "cannot open stat file, \"%s\"\n", - statsfile); - return; - } - - fprintf(f, "+++ Statistics Dump +++ (%ld) %s", - (long)timenow, ctime(&timenow)); - fprintf(f, "%ld\ttime since boot (secs)\n", - (long)(timenow - boottime)); - fprintf(f, "%ld\ttime since reset (secs)\n", - (long)(timenow - resettime)); - -#ifdef DMALLOC - /* malloc statistics */ - dmallocstats(f); -#endif - - /* 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] = { - "RQ", /* sent us a query */ - "RR", /* sent us an answer */ - "RIQ", /* sent us an inverse query */ - "RNXD", /* sent us a negative response */ - "RFwdQ", /* sent us a query we had to fwd */ - "RFwdR", /* sent us a response we had to fwd */ - "RDupQ", /* sent us a retry */ - "RDupR", /* sent us an extra answer */ - "RFail", /* sent us a SERVFAIL */ - "RFErr", /* sent us a FORMERR */ - "RErr", /* sent us some other error */ - "RTCP", /* sent us a query using TCP */ - "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 */ - "SFwdR", /* fwdd a response to them */ - "SDupQ", /* sent them a retry */ - "SFail", /* sent them a SERVFAIL */ - "SFErr", /* sent them a FORMERR */ - "SErr", /* sent failed (in sendto) */ -#ifdef XSTATS - "RNotNsQ", /* received from remote port != ns_port */ - "SNaAns", /* sent them a non autoritative answer */ - "SNXD", /* sent them a negative response */ -#endif - }; -#endif /*STATS*/ - -static int -nameserCompar(t1, t2) - const tree_t t1, t2; -{ - u_int32_t a1 = ntohl(((struct nameser *)t1)->addr.s_addr), - a2 = ntohl(((struct nameser *)t2)->addr.s_addr); - - if (a1 < a2) - return (-1); - else if (a1 > a2) - return (1); - else - return (0); -} - -struct nameser * -nameserFind(addr, flags) - struct in_addr addr; - int flags; -{ - struct nameser dummy; - struct nameser *ns; - - if (!nameserInit) { - tree_init(&nameserTree); - nameserInit++; - } - - dummy.addr = addr; - ns = (struct nameser *)tree_srch(&nameserTree, nameserCompar, - (tree_t)&dummy); - if (!ns && (flags & NS_F_INSERT)) { - ns = (struct nameser *)malloc(sizeof(struct nameser)); - if (!ns) { - nomem: if (!haveComplained("nameserFind complaint", "")) - syslog(LOG_NOTICE, - "nameserFind: malloc failed; %m"); - return (NULL); - } - memset(ns, 0, sizeof(struct nameser)); - ns->addr = addr; - if (!tree_add(&nameserTree, nameserCompar, (tree_t)ns, NULL)) { - int save = errno; - free(ns); - errno = save; - goto nomem; - } - } - return (ns); -} - - -void -nameserIncr(addr, which) - struct in_addr addr; - enum nameserStats which; -{ -#ifdef STATS - struct nameser *ns = nameserFind(addr, NS_F_INSERT); - - if ((int)which < (int)nssLast) { - if (ns) - ns->stats[(int)which]++; - globalStats[(int)which]++; - } else { - syslog(LOG_DEBUG, "nameserIncr([%d], %d): bad 'which'", - inet_ntoa(addr), (int)which); - } -#endif /*STATS*/ -} - -#ifdef STATS -static void -nameserStatsOut(f, stats) - FILE *f; - u_long stats[]; -{ - int i; - const char *pre = "\t"; - - for (i = 0; i < (int)nssLast; i++) { - fprintf(f, "%s%lu", pre, (u_long)stats[i]); - pre = ((i+1) % 5) ? " " : " "; - } - fputc('\n', f); -} - -static void -nameserStatsHdr(f) - FILE *f; -{ - int i; - const char *pre = "\t"; - - fprintf(f, "(Legend)\n"); - for (i = 0; i < (int)nssLast; i++) { - fprintf(f, "%s%s", pre, - statNames[i] ? statNames[i] : ""); - pre = ((i+1) % 5) ? "\t" : "\n\t"; - } - fputc('\n', f); -} - -static int -nameserStatsTravUAR(t) - tree_t t; -{ - struct nameser *ns = (struct nameser *)t; - - fprintf(nameserStatsFile, "[%s]\n", /* : rtt %u */ - inet_ntoa(ns->addr) /*, ns->rtt*/ ); - nameserStatsOut(nameserStatsFile, ns->stats); - return (1); -} -#endif /*STATS*/ - -static void -nameserStats(f) - FILE *f; -{ -#ifndef STATS - fprintf(f, "<<No nameserver statistics in this server>>\n"); -#else - nameserStatsFile = f; - fprintf(f, "++ Name Server Statistics ++\n"); - nameserStatsHdr(f); - fprintf(f, "(Global)\n"); - nameserStatsOut(f, globalStats); - tree_trav(&nameserTree, nameserStatsTravUAR); - fprintf(f, "-- Name Server Statistics --\n"); - nameserStatsFile = NULL; -#endif /*STATS*/ -} - -#ifdef XSTATS -/* Benoit Grange, log minimal statistics, called from ns_maint */ -void -ns_logstats() -{ - char buffer[1024]; - char buffer2[32], header[64]; - time_t timenow = time(NULL); - int i; - -#ifdef HAVE_GETRUSAGE -# define tv_float(tv) ((tv).tv_sec + ((tv).tv_usec / 1000000.0)) - struct rusage usage, childu; - - getrusage(RUSAGE_SELF, &usage); - getrusage(RUSAGE_CHILDREN, &childu); - - sprintf(buffer, "CPU=%gu/%gs CHILDCPU=%gu/%gs", - tv_float(usage.ru_utime), tv_float(usage.ru_stime), - tv_float(childu.ru_utime), tv_float(childu.ru_stime)); - syslog(LOG_INFO, "USAGE %lu %lu %s", timenow, boottime, buffer); -# undef tv_float -#endif - - sprintf(header, "NSTATS %lu %lu", timenow, 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/usr.sbin/named/ns_validate.c b/usr.sbin/named/ns_validate.c deleted file mode 100644 index 8142bdc..0000000 --- a/usr.sbin/named/ns_validate.c +++ /dev/null @@ -1,1245 +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 <sys/param.h> -#include <sys/socket.h> -#include <sys/file.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> - -#include <syslog.h> -#include <errno.h> -#include <stdio.h> -#include <resolv.h> - -#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; - -#ifdef DATUMREFCNT - nsp[0] = NULL; -#endif - 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")); -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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, np->n_dname)) { - - /* 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; -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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)) { -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (VALID_CACHE); - } - /* server is not one of those we know of */ - /* stick_in_queue(dname, type, class, data); */ -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - return (INVALID); - default: -#ifdef DATUMREFCNT - free_nsp(nsp); -#endif - 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[BUFSIZ]; - 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; i<c; i++) { - if (Vlist[i] == INVALID) { - inv = 1; - break; - } - } - if (inv != 1) { - /* no invalid records, go about your job */ - return (0); - } - - dprintf(2, (ddt, "update_msg: NEEDS updating:\n")); - - RRlen = (int *)malloc((unsigned)c*sizeof(int)); - if (!RRlen) - panic(errno, "malloc(RRlen)"); - hp = (HEADER *)msg; - new_ancount = ancount = ntohs(hp->ancount); - 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/usr.sbin/named/options.h b/usr.sbin/named/options.h deleted file mode 100644 index 6f58a5e..0000000 --- a/usr.sbin/named/options.h +++ /dev/null @@ -1,167 +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 1.4 1995/08/20 21:19:08 peter 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 DATUMREFCNT /* use reference counts on datums (mpa) */ -#define LAME_DELEGATION /* lame delegations (original-del,reworked-bb&del)*/ -#define LAME_LOGGING LOG_WARNING /* log lame delegations, set log level */ -#define GETSER_LOGGING LOG_INFO /* log errors/timeouts getting serial number */ -/*#define RETURNSOA*/ /* good code that the world isn't ready for yet */ -#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 (draft) LOC record parsing (ckd) */ -#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 - -/* systems with killall(1M) don't need this - */ -#ifdef __sgi -# ifdef WANT_PIDFILE -# undef WANT_PIDFILE -# endif -#endif - -#ifdef LAME_LOGGING -# define LAME_DELEGATION -#endif - -#if defined(XSTATS) && !defined(STATS) -# define STATS -#endif diff --git a/usr.sbin/named/pathnames.h b/usr.sbin/named/pathnames.h deleted file mode 100644 index 5adf1a2..0000000 --- a/usr.sbin/named/pathnames.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * @(#)pathnames.h 5.4 (Berkeley) 6/1/90 - * $Id: pathnames.h,v 1.1.1.1 1994/09/22 19:46:13 pst Exp $ - */ - -/* - * ++Copyright++ 1989 - * - - * Copyright (c) 1989 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#ifdef _PATH_XFER -# define _PATH_XFER_PREDEFINED /* probably from Makefile */ -#endif - -#if defined (__sgi) && !defined(_SYSTYPE_SVR4) && !defined(__SYSTYPE_SVR4) -#define _PATH_BOOT "/usr/etc/named.d/named.boot" -#else -#define _PATH_BOOT "/etc/named.boot" -#endif - -#if defined(BSD) && BSD >= 198810 - -#include <paths.h> -#ifndef _PATH_XFER -# define _PATH_XFER "/usr/libexec/named-xfer" -#endif -#define _PATH_DEBUG "/var/tmp/named.run" -#define _PATH_DUMPFILE "/var/tmp/named_dump.db" -#ifndef _PATH_PIDFILE -# define _PATH_PIDFILE "/var/run/named.pid" -#endif -#define _PATH_STATS "/var/tmp/named.stats" -#define _PATH_XFERTRACE "/var/tmp/xfer.trace" -#define _PATH_XFERDDT "/var/tmp/xfer.ddt" -#define _PATH_TMPXFER "/var/tmp/xfer.ddt.XXXXXX" -#define _PATH_TMPDIR "/var/tmp" - -#else /* BSD */ - -#define _PATH_DEVNULL "/dev/null" -#define _PATH_TTY "/dev/tty" -#ifndef _PATH_XFER -# define _PATH_XFER "/etc/named-xfer" -#endif -#define _PATH_DEBUG "/usr/tmp/named.run" -#define _PATH_DUMPFILE "/usr/tmp/named_dump.db" -#ifndef _PATH_PIDFILE -# define _PATH_PIDFILE "/etc/named.pid" -#endif -#define _PATH_STATS "/usr/tmp/named.stats" -#define _PATH_XFERTRACE "/usr/tmp/xfer.trace" -#define _PATH_XFERDDT "/usr/tmp/xfer.ddt" -#define _PATH_TMPXFER "/usr/tmp/xfer.ddt.XXXXXX" -#define _PATH_TMPDIR "/usr/tmp" -#endif /* BSD */ - -#ifndef _PATH_XFER_PREDEFINED -# if defined(__sgi) || defined(NeXT) || defined(__ultrix) -# undef _PATH_XFER -# define _PATH_XFER "/usr/etc/named-xfer" -# endif -# if defined(__osf__) -# undef _PATH_XFER -# define _PATH_XFER "/usr/sbin/named-xfer" -# endif -# ifdef sun -# undef _PATH_XFER -# define _PATH_XFER "/usr/etc/in.named-xfer" -# endif -#else -# undef _PATH_XFER_PREDEFINED -#endif /*_PATH_XFER_PREDEFINED*/ diff --git a/usr.sbin/named/portability.h b/usr.sbin/named/portability.h deleted file mode 100644 index ed01d22..0000000 --- a/usr.sbin/named/portability.h +++ /dev/null @@ -1,567 +0,0 @@ -/* portability.h - include or define things that aren't present on all systems - * vixie@decwrl 26dec92 [new] - * - * $Id: portability.h,v 1.3 1995/08/20 21:19:11 peter 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-- - */ - -/* XXX: this file has become a hopeless morass, and will be redone someday. */ - -#include <string.h> -#include <signal.h> -#include <sys/types.h> -#include <sys/param.h> -#ifndef TIME_H_INCLUDED -# include <sys/time.h> -# define TIME_H_INCLUDED -#endif - -#ifdef ISC -# ifndef _POSIX_SOURCE -# define _POSIX_SOURCE -# endif -# define SYSV -# define SVR3 -# define _SYSV3 -# define NEED_STRTOUL -# define NEED_FTRUNCATE -# define USE_POSIX -# include <sys/bsdtypes.h> -# include <sys/sioctl.h> -# include <sys/stream.h> -# include <net/errno.h> -#endif - -#if defined(__convex__) -# if !defined(_POSIX_SOURCE) -# define _POSIX_SOURCE -# endif -# define USE_UTIME -# define NEED_PUTENV -#endif - -#if defined(_CRAY) -# if !defined(_POSIX_SOURCE) -# define _POSIX_SOURCE -# endif -# define writev(a,b,c) __writev(a,b,c) -# define setitimer(a,b,c) __setitimer(a,b,c) -#endif - -/* This is defined in the Makefile for ISC 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) -/* XXX - why is this POSIX_SOURCE instead of _POSIX_SOURCE? */ -# undef POSIX_SOURCE -# define POSIX_SIGNALS -# define HAVE_FCHMOD 0 -# define writev(a,b,c) __writev(a,b,c) -# define ftruncate(a,b) __ftruncate(a,b) -#endif - -#ifdef NeXT -# define NEED_PUTENV -# define NEED_SETENV -# define inet_addr(a) __inet_addr(a) -#endif - -#if defined(__sgi) -# define BSD 43 -# define vfork fork -#endif - -#if defined(SUNOS4) -# define BSD 43 -#endif - -#if defined(__osf__) && defined(__alpha) -# 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(SVR4) && !defined(SYSV) -# define SYSV -#endif - -#if defined(_POSIX_SOURCE) || defined(__sgi) || defined(__ultrix) || \ - defined(__hpux) || (defined(BSD) && (BSD >= 199103)) || \ - (defined(sun) && defined(SYSV)) -# define USE_POSIX -#endif - -#if defined(__ultrix) && !defined(BSD) -# define BSD 42 -#endif - -#if defined(host_mips) && defined(SYSTYPE_BSD43) -# define RISCOS_BSD -#endif - -#if defined(SYSV) || defined(__ultrix) || defined(__osf__) \ - || (defined(BSD) && BSD >= 199306) || defined(linux) -# define USE_UTIME -# define HAVE_SETVBUF -#endif - -#if defined(SYSV) && !defined(SVR4) -# define vfork fork -#endif - -#if defined(sun) || defined(SVR4) -# define NETREAD_BROKEN -#endif - -#if defined(BSD) && BSD >= 199006 && !defined(i386) && !defined(RISCOS_BSD) -# define HAVE_DAEMON -#endif - -#if !defined(BSD) || (BSD <= 199006) -# if !defined(NeXT) -# define NEED_INETADDR -# endif -# define NEED_INETATON -#endif - -#if defined(__hpux) -# if defined(__STDC__) -# define select(a,b,c,d,e) select(a, (int *)b, (int *)c, (int *)d, e) -# define ctime(x) ctime((const time_t *)x) -# endif /*__STDC__*/ -# if !defined(SYSV) -# define USE_UTIME -# define setlinebuf(x) setvbuf(x, NULL, _IOLBF, BUFSIZ) -# if !defined(SIGWINCH) /*pre 9.0*/ -# define SIGWINCH SIGWINDOW -# endif -# endif /*SYSV*/ -/* XXX: better autodetection of the need for "struct linger" would be nice */ -# if 0 -struct linger { - int l_onoff; /* option on/off */ - int l_linger; /* linger time */ -}; -# endif -#endif /*__hpux*/ - -#if defined(_SEQUENT_) -# include <netinet/in_systm.h> -# define USE_UTIME -# define USE_POSIX -# define NEED_GETTIMEOFDAY -# define _TIMEZONE timezoneBSD -struct timezoneBSD { - int tz_minuteswest; - int tz_dsttime; -}; -#endif - -#ifndef __P -# if defined(__STDC__) || defined(__GNUC__) -# define __P(x) x -# else -# define __P(x) () -# endif -#endif - -#ifndef _TIMEZONE -# define _TIMEZONE timezone -#endif - -#if defined(USE_POSIX) -# include <stdlib.h> -# include <unistd.h> -# include <limits.h> - -#else - -# define NEED_STRTOUL - -# define STDIN_FILENO 0 -# define STDOUT_FILENO 1 -# define STDERR_FILENO 2 -# ifndef NeXT -extern char *getenv __P((char *)); -# else -extern char *getenv __P((const char *)); -# endif -extern int errno; - -# if !defined(DMALLOC) && !defined(NeXT) -extern char *malloc(), *realloc(), *calloc(); -# if defined(sun) -extern int free(); -# else -extern void free(); -# endif -# endif - -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)); -extern int close(), setitimer(), recv(), sendto(), sigsetmask(), - atoi(), getpid(), fork(), read(), ioctl(), - setsockopt(), socket(), bind(); -#endif - -#if !defined(bcopy) /* some machines have their own macros for this */ -# if defined(USE_POSIX) || \ - (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)) -# define NEED_MKSTEMP -# if !defined(__ultrix) && !defined(apollo) -# define NEED_STRCASECMP -# define NEED_MKTEMP -# if !defined(SVR4) -# define NEED_STRPBRK -# 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(), ntohs(); -extern u_long htonl(), ntohl(); -#endif - -#if defined(USE_POSIX) && !defined(sun) && !defined(__sgi) \ - && !defined(__convex__) && !defined(__ultrix) && !defined(_AUX_SOURCE) -# define PORT_NONBLOCK O_NONBLOCK -# define PORT_WOULDBLK EAGAIN -#else -# define PORT_NONBLOCK O_NDELAY -# define PORT_WOULDBLK EWOULDBLOCK -#endif - -#if defined(USE_POSIX) -# define USE_SETSID -#endif - -#if defined(USE_POSIX) || !defined(SYSV) -#define USE_WAITPID -#endif - -#if !defined(USE_POSIX) -#define waitpid(x,y,z) (wait3(y,z,(struct rusage *)NULL)) -#endif - -#if defined(NeXT) || defined(_AIX) || defined(sun386) -# undef WIFEXITED -# undef WEXITSTATUS -# undef WIFSIGNALED -# undef WTERMSIG -#endif /* NeXT */ - -#if defined(sequent) -#define WEXITSTATUS(x) ((x).w_retcode) -#define WTERMSIG(x) ((x).w_termsig) -#endif /* sequent */ - -#if !defined(WIFEXITED) -# define WIFEXITED(x) (!(x & 0177)) -#endif -#if !defined(WEXITSTATUS) -# define WEXITSTATUS(x) (x >> 8) -#endif -#if !defined(WIFSIGNALED) -# define WIFSIGNALED(x) ((x & 0177) && ((x & 0377) != 0177)) -#endif -#if !defined(WTERMSIG) -# define WTERMSIG(x) (x & 0177) -#endif - -#ifndef S_ISDIR -# ifndef S_IFMT -# define S_IFMT 0170000 -# endif -# ifndef S_IFDIR -# define S_IFDIR 0040000 -# endif -# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) -#endif - -#ifndef S_ISREG -# ifndef S_IFMT -# define S_IFMT 0170000 -# endif -# ifndef S_IFREG -# define S_IFREG 0100000 -# endif -# define S_ISREG(m) ((m & S_IFMT) == S_IFREG) -#endif - -#ifndef S_ISFIFO -# ifndef S_IFMT -# define S_IFMT 0170000 -# endif -# ifndef S_IFIFO -# define S_IFIFO 0010000 -# endif -# define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO) -#endif - -#if defined(NEED_STRTOUL) && \ - (defined(__ultrix) || defined(__osf__) || defined(NeXT)) -# undef NEED_STRTOUL -#endif - -#if defined(__ultrix) || defined(__osf__) -# define MAYBE_HESIOD -#endif - -#ifndef FD_SET -#define NFDBITS 32 -#define FD_SETSIZE 32 -#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) -#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) -#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) -#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p))) -#endif - -#ifndef MIN -# define MIN(x, y) ((x > y) ?y :x) -#endif -#ifndef MAX -# define MAX(x, y) ((x > y) ?x :y) -#endif - -#if !defined(PATH_MAX) -# if defined(_POSIX_PATH_MAX) -# define PATH_MAX _POSIX_PATH_MAX -# else -# if defined(MAXPATHLEN) -# define PATH_MAX MAXPATHLEN -# endif -# endif -#endif - -#if defined(BSD) || defined(__osf__) || defined(__convex__) -# define HAVE_GETRUSAGE -#endif - -/* May be set in the Makefile. */ -#if defined(HAVE_GETRUSAGE) -# include <sys/resource.h> -#endif - -/* - * Because Convex has true library function feof() which is - * patently wrong (it test bit _IOREAD) we need feof() as - * a macro. - */ -#if defined(__convex__) && !defined(feof) -# define feof(p) ((p)->_flag&_IOEOF) -#endif - -#if defined(M_UNIX) || defined(linux) -# define SPURIOUS_ECONNREFUSED -#endif - -/* - * Assume that a system has fchmod() unless something above says otherwise. - */ -#if !defined(HAVE_FCHMOD) -# define HAVE_FCHMOD 1 -#endif - -/* - * 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 diff --git a/usr.sbin/named/storage.c b/usr.sbin/named/storage.c deleted file mode 100644 index 15623f4..0000000 --- a/usr.sbin/named/storage.c +++ /dev/null @@ -1,204 +0,0 @@ -/* - * ++Copyright++ 1985, 1989 - * - - * Copyright (c) 1985, 1989 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#include <sys/param.h> -#include <syslog.h> - -#include "portability.h" -#include "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 1.3 1995/05/30 03:49:05 rgrimes 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/usr.sbin/named/tools/Makefile b/usr.sbin/named/tools/Makefile deleted file mode 100644 index fa23e68..0000000 --- a/usr.sbin/named/tools/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# @(#)Makefile 4.10 (Berkeley) 5/29/90 - -SUBDIR= named.reload named.restart ndc - -.include <bsd.subdir.mk> diff --git a/usr.sbin/named/tools/named.reload/Makefile b/usr.sbin/named/tools/named.reload/Makefile deleted file mode 100644 index bb71c64..0000000 --- a/usr.sbin/named/tools/named.reload/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# @(#)Makefile 5.1 (Berkeley) 5/28/90 - -MAN8= named.reload.8 -CLEANFILES+=named.reload - -PIDDIR=/var/run -INDOT= -DESTSBIN=${DESTDIR}${BINDIR} - -beforeinstall: - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 555 \ - named.reload ${DESTDIR}${BINDIR} - -all: named.reload - -named.reload: named.reload.sh Makefile - sed -e "s|%DESTSBIN%|${DESTSBIN}|" \ - -e "s|%INDOT%|${INDOT}|" \ - < ${.CURDIR}/named.reload.sh > named.reload - -.include "${.CURDIR}/../../../Makefile.inc" -.include <bsd.prog.mk> diff --git a/usr.sbin/named/tools/named.reload/named.reload.8 b/usr.sbin/named/tools/named.reload/named.reload.8 deleted file mode 100644 index 81cc84d..0000000 --- a/usr.sbin/named/tools/named.reload/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 NAMED.RELOAD 8 "June 26, 1993" -.UC 5 -.SH NAME -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 (8). -.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 -named(8), named.restart(8) diff --git a/usr.sbin/named/tools/named.reload/named.reload.sh b/usr.sbin/named/tools/named.reload/named.reload.sh deleted file mode 100644 index c800023..0000000 --- a/usr.sbin/named/tools/named.reload/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 1.2 1994/09/22 20:45:23 pst Exp $ -# - -exec %DESTSBIN%/%INDOT%ndc reload diff --git a/usr.sbin/named/tools/named.restart/Makefile b/usr.sbin/named/tools/named.restart/Makefile deleted file mode 100644 index 4c3a700..0000000 --- a/usr.sbin/named/tools/named.restart/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# @(#)Makefile 5.1 (Berkeley) 5/28/90 -# $Id: Makefile,v 1.4 1995/07/25 00:37:31 bde Exp $ - -MAN8= named.restart.8 -CLEANFILES+=named.restart - -PIDDIR=/var/run -INDOT= -DESTSBIN=${DESTDIR}${DESTBIN} - -beforeinstall: - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 555 \ - named.restart ${DESTDIR}${BINDIR} - -all: named.restart - -named.restart: named.restart.sh Makefile - sed -e "s|%INDOT%|${INDOT}|" \ - -e "s|%DESTSBIN%|${BINDIR}|" \ - < ${.CURDIR}/named.restart.sh > named.restart - -.include "${.CURDIR}/../../../Makefile.inc" -.include <bsd.prog.mk> diff --git a/usr.sbin/named/tools/named.restart/named.restart.8 b/usr.sbin/named/tools/named.restart/named.restart.8 deleted file mode 100644 index 7670dd1..0000000 --- a/usr.sbin/named/tools/named.restart/named.restart.8 +++ /dev/null @@ -1,76 +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-- -.\" -.\" $Id: named.restart.8,v 1.3 1995/05/03 03:26:56 rgrimes Exp $ -.\" from hostname.7 6.4 (Berkeley) 1/16/90 -.\" -.TH NAMED.RESTART 8 "June 26, 1993" -.UC 5 -.SH NAME -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 if -.IR /etc/sysconfig -states that one should be running on this system. -.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 -named(8), named.reload(8) diff --git a/usr.sbin/named/tools/named.restart/named.restart.sh b/usr.sbin/named/tools/named.restart/named.restart.sh deleted file mode 100644 index eb4c7ec..0000000 --- a/usr.sbin/named/tools/named.restart/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 1.3 1995/05/03 03:26:59 rgrimes Exp $ -# - -exec %DESTSBIN%/%INDOT%ndc restart diff --git a/usr.sbin/named/tools/ndc/Makefile b/usr.sbin/named/tools/ndc/Makefile deleted file mode 100644 index 1283121..0000000 --- a/usr.sbin/named/tools/ndc/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -MAN8= ndc.8 -CLEANFILES+=ndc - -PIDDIR=/var/run -INDOT= -PS=ps -IOT=ABRT -DESTSBIN=${DESTDIR}${BINDIR} - -beforeinstall: - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 555 \ - ndc ${DESTDIR}${BINDIR} - -all: ndc - -ndc: ndc.sh Makefile - sed -e "s|%DESTSBIN%|${DESTSBIN}|" \ - -e "s|%INDOT%|${INDOT}|" \ - -e "s|%PIDDIR%|${PIDDIR}|" \ - -e "s|%PS%|${PS}|" \ - -e "s|%IOT%|${IOT}|" \ - < ${.CURDIR}/ndc.sh > ndc - -.include "${.CURDIR}/../../../Makefile.inc" -.include <bsd.prog.mk> diff --git a/usr.sbin/named/tools/ndc/ndc.8 b/usr.sbin/named/tools/ndc/ndc.8 deleted file mode 100644 index 46eda39..0000000 --- a/usr.sbin/named/tools/ndc/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 NDC 8 "November 27, 1994" -.UC 5 -.SH NAME -ndc \- name daemon control interface -.SH SYNOPSYS -.B 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 named -as shown by -.BR ps (1). -.TP -.B dumpdb -Causes -.B named -to dump its database and cache to -.B /var/tmp/named_dump.db -(uses the INT signal.) -.TP -.B reload -Causes -.B 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 named -to dump its statistics to -.B /var/tmp/named.stats -(uses the IOT or ABRT signal.) -.TP -.B trace -Causes -.B 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 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 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 named -to be started, as long as it isn't already running. -.TP -.B stop -Causes -.B named -to be stopped, if it is running. -.TP -.B restart -Causes -.B named -to be killed and restarted. -.SH BUGS -Arguments to -.B 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 -named(8), -named.reload(8), -named.restart(8) diff --git a/usr.sbin/named/tools/ndc/ndc.sh b/usr.sbin/named/tools/ndc/ndc.sh deleted file mode 100644 index 422d669..0000000 --- a/usr.sbin/named/tools/ndc/ndc.sh +++ /dev/null @@ -1,97 +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:$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 - } - # If there is a global system configuration file, suck it in. - if [ -f /etc/sysconfig ]; then - . /etc/sysconfig - fi - rm -f $PIDFILE - # $namedflags is imported from /etc/sysconfig - if [ "X${namedflags}" != "XNO" ]; then - %INDOT%named ${namedflags} && { - sleep 5 - echo Name Server Started - } - fi - ;; - 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 - } - # If there is a global system configuration file, suck it in. - if [ -f /etc/sysconfig ]; then - . /etc/sysconfig - fi - rm -f $PIDFILE - # $namedflags is imported from /etc/sysconfig - if [ "X${namedflags}" != "XNO" ]; then - %INDOT%named ${namedflags} && { - sleep 5 - echo Name Server Restarted - } - fi - ;; - *) eval "$USAGE";; - esac -done -test -z "$ARG" && eval "$USAGE" - -exit 0 diff --git a/usr.sbin/named/tree.c b/usr.sbin/named/tree.c deleted file mode 100644 index 4bad68c..0000000 --- a/usr.sbin/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 <stdio.h> -#ifndef _PATH_XFER -# include <stdlib.h> -#else -# include "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/usr.sbin/named/tree.h b/usr.sbin/named/tree.h deleted file mode 100644 index 030a928..0000000 --- a/usr.sbin/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 1.1.1.2 1995/08/18 21:16:28 peter 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/usr.sbin/named/xfer/Makefile b/usr.sbin/named/xfer/Makefile deleted file mode 100644 index d50a801..0000000 --- a/usr.sbin/named/xfer/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# @(#)Makefile 5.1 (Berkeley) 5/28/90 - -PROG= named-xfer -SRCS= named-xfer.c db_glue.c -OBJS+= version.o -CLEANFILES+=version.c version.o -CFLAGS+=-I${.CURDIR}/.. -.PATH: ${.CURDIR}/.. -BINDIR= /usr/libexec -MAN8= named-xfer.8 - - -VER = 4.9.3-P1 - -version.c: ${.CURDIR}/../Version.c ${.CURDIR}/Makefile ${SRCS} - (LC_TIME=; export LC_TIME; u=$${USER-root} d=`pwd |sed -e 's|/obj/|/src/|'` \ - h=`hostname` t=`date`; \ - sed -e "s|%WHEN%|$${t}|" -e "s|%VERSION%|"${VER}"|" \ - -e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \ - < ${.CURDIR}/../Version.c > version.c) - -.include "../../Makefile.inc" -.include <bsd.prog.mk> diff --git a/usr.sbin/named/xfer/named-xfer.8 b/usr.sbin/named/xfer/named-xfer.8 deleted file mode 100644 index 6c80185..0000000 --- a/usr.sbin/named/xfer/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 NAMED-XFER 8 "June 26, 1993" -.UC 4 -.SH NAME -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 named (8) -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(3) 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 named (8) -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" -named(8), resolver(3), resolver(5), hostname(7), -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/usr.sbin/named/xfer/named-xfer.c b/usr.sbin/named/xfer/named-xfer.c deleted file mode 100644 index b5f384a..0000000 --- a/usr.sbin/named/xfer/named-xfer.c +++ /dev/null @@ -1,1645 +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. - * - - * --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 1.5 1996/01/07 05:48:49 peter Exp $"; -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/file.h> -#include <sys/stat.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#ifdef ISO -#include <netiso/iso.h> -#endif -#if defined(__osf__) -# include <sys/mbuf.h> -# include <net/route.h> -#endif -#if defined(_AIX) -# include <sys/time.h> -# define TIME_H_INCLUDED -#endif -#include <net/if.h> -#include <netdb.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <resolv.h> -#include <stdio.h> -#include <syslog.h> -#if !defined(SVR4) || !defined(sun) -# include <math.h> -#endif -#include <ctype.h> -#include <signal.h> - -#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((u_char *, int, u_char *)), - netread __P((int, char *, int, int)); -static SIG_FN read_alarm __P(()); -static const char *soa_zinfo __P((struct zoneinfo *, u_char *, u_char*)); - -extern char *optarg; -extern int optind, getopt(); - -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); - - case XFER_TIMEOUT: -#ifdef DEBUG - if (!debug) -#endif - (void) unlink(tmpname); - exit(XFER_TIMEOUT); /* servers not reachable exit */ - - case XFER_FAIL: - default: -#ifdef DEBUG - if (!debug) -#endif - (void) unlink(tmpname); - exit(XFER_FAIL); /* yuck exit */ - } - /*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" */ -int minimum_ttl = 0, got_soa = 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, nscnt, soacnt, 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; - struct zoneinfo zp_start, zp_finish; -#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); -#else - bzero((char *)&sv, sizeof sv); - sv.sv_handler = read_alarm; - sv.sv_mask = ~0; - (void) sigvec(SIGALRM, &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 - 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); - 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; - 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. */ - n = dn_expand(buf, eom, tmp, name2, sizeof name2); - if (n < 0) { - badsoa_msg = "aname error"; - goto badsoa; - } - tmp += n; - 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; - soacnt = 0; - nscnt = 0; - 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 ((soacnt == 0) || (zp->z_type == Z_STUB)) { - int type; -#ifdef STUBS - if (zp->z_type == Z_STUB) { - if (!soacnt) - type = T_SOA; - else if (!nscnt) - type = T_NS; - else - type = T_SOA; - } else -#endif - type = T_AXFR; - n = res_mkquery(QUERY, zp->z_origin, - curclass, type, - NULL, 0, - NULL, buf, bufsize); - if (n < 0) { - if (!quiet) { -#ifdef STUBS - if (zp->z_type == Z_STUB) - syslog(LOG_INFO, - (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, - (soacnt == 0) ?300 :XFER_TIMER) - < 0) { - error++; - break; - } - if ((len = _getshort(buf)) == 0) - break; - 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 (cnt = 0 ; cnt < ancount ; cnt++) { - - n = print_output(buf, bufsize, cp); - cp += n; - } - if (hp->nscount) { - /* we should not get here */ - ancount = ntohs(hp->nscount); - for (cnt = 0 ; cnt < ancount ; cnt++) { - n = print_output(buf, bufsize, cp); - cp += n; - } - } - ancount = ntohs(hp->arcount); - for (cnt = 0 ; cnt < ancount ; cnt ++) { - n = print_output(buf, bufsize, cp); - cp += n; - } - 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*/ - n = print_output(buf, bufsize, cp); - if (cp + n != eom) { - syslog(LOG_INFO, - "print_output: short answer (%d, %d), zone %s", - cp - buf, n, zp->z_origin); - error++; - break; - } -#ifdef STUBS - } -#endif - GETSHORT(n, tmp); - if (n == T_SOA) { - if (soacnt == 0) { - soacnt++; - if (dn_expand(buf, buf+PACKETSZ, nmp, - name, sizeof name) < 0) { - badsoa_msg = "soa name error"; - goto badsoa; - } - if (strcasecmp(name, zp->z_origin)!=0){ - syslog(LOG_INFO, - "wrong zone name in AXFR (wanted \"%s\", got \"%s\")", - zp->z_origin, name); - badsoa_msg = "wrong soa name"; - goto badsoa; - } - if (eom - tmp - <= 2 * INT16SZ + INT32SZ) { - badsoa_msg = "soa header"; - goto badsoa; - } - tmp += 2 * INT16SZ + INT32SZ; - if ((n = dn_skipname(tmp, eom)) < 0) { - badsoa_msg = "soa mname"; - goto badsoa; - } - tmp += n; - if ((n = dn_skipname(tmp, eom)) < 0) { - badsoa_msg = "soa hname"; - goto badsoa; - } - tmp += n; - if (eom - tmp <= INT32SZ) { - badsoa_msg = "soa dlen"; - goto badsoa; - } - GETLONG(serial, tmp); - dprintf(3, (ddt, - "first SOA for %s, serial %lu\n", - name, (u_long)serial)); - continue; - } - if (dn_expand(buf, buf+PACKETSZ, nmp, - name2, sizeof name2) == -1) { - badsoa_msg = "soa name error#2"; - goto badsoa; - } - if (strcasecmp((char *)name, - (char *)name2) != 0) { - syslog(LOG_INFO, - "got extra SOA for \"%s\" in zone \"%s\"", - name2, name); - continue; - } - tmp -= INT16SZ; /* Put TYPE back. */ - badsoa_msg = soa_zinfo(&zp_finish, tmp, eom); - if (badsoa_msg) - goto badsoa; - dprintf(2, (ddt, - "SOA, serial %lu\n", - (u_long)zp_finish.z_serial)); - if (serial != zp_finish.z_serial) { - soacnt = 0; - got_soa = 0; - minimum_ttl = 0; - strcpy(prev_origin, zp->z_origin); - prev_dname[0] = DEF_DNAME; - dprintf(1, (ddt, - "serial changed, restart\n" - )); - /* - * 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 (XFER_FAIL); - } - fseek(dbfp, 0L, 0); - } else - break; -#ifdef STUBS - } else if (zp->z_type == Z_STUB && n == T_NS) { - nscnt++; - } else if (zp->z_type == Z_STUB) { - break; -#endif - } - } - (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); -} - -/* - * 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; - - /* 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); - cp += INT16SZ; /* dlen */ - 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); - return (NULL); -} - -/* - * 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(msg, msglen, rrp) - 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; -#ifdef ISO - struct iso_addr isoa; -#endif - char data[BUFSIZ]; - u_char *cp1, *cp2, *temp_ptr; - char *cdata, *origin, *proto, dname[MAXDNAME]; - char *ignore = ""; - - 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); - - origin = strchr(dname, '.'); - if (origin == NULL) - origin = ""; - else - origin++; /* move past the '.' */ - dprintf(3, (ddt, - "print_output: 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_TXT: - case T_X25: - case T_ISDN: - case T_LOC: - case T_NSAP: - case T_UID: - case T_GID: - 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) { - 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_MX: - case T_AFSDB: - case T_RT: - /* grab preference */ - bcopy((char *)cp, data, INT16SZ); - cp1 = (u_char *)data + INT16SZ; - cp += INT16SZ; - - /* get name */ - n = dn_expand(msg, msg + msglen, cp, - (char *)cp1, sizeof data - INT16SZ); - 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 */ - 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); - - cp1 += strlen((char *) cp1) + 1; - 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); - } - cdata = (char *) cp1; - result = cp - rrp; - - /* - * Only print one SOA per db file - */ - if (type == T_SOA) { - if (got_soa) - return (result); - else - got_soa++; - } - -#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, "%d\t", (int) ttl); - else if (tab) - (void) putc('\t', dbfp); - - (void) fprintf(dbfp, "%s\t%s\t", p_class(class), p_type(type)); - cp = (u_char *) 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 = (u_char *) 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 ((*cp == '\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; - (void) putc('"', dbfp); - while (cp < cp1) { - if (i = *cp++) { - for (j = i ; j > 0 && cp < cp1 ; j--) { - if ((*cp == '\n') || (*cp == '"')) { - (void) putc('\\', dbfp); - } - (void) putc(*cp++, dbfp); - } - } - } - (void) fputs("\"\n", dbfp); - break; - -#ifdef ISO - case T_NSAP: - isoa.isoa_len = n; - if (isoa.isoa_len > sizeof(isoa.isoa_genaddr)) - isoa.isoa_len = sizeof(isoa.isoa_genaddr); - bcopy(cp, isoa.isoa_genaddr, isoa.isoa_len); - fprintf(dbfp, "%s\n", iso_ntoa(&isoa)); - break; -#endif - - case T_UINFO: - (void) fprintf(dbfp, "\"%s\"\n", cp); - break; - -#ifdef LOC_RR - case T_LOC: - (void) fprintf(dbfp, "%s\n", loc_ntoa(cp, NULL)); - break; -#endif /* LOC_RR */ - - 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 < (u_char *) 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; - - default: - (void) fprintf(dbfp, "???\n"); - } - if (ferror(dbfp)) { - syslog(LOG_ERR, "%s: %m", tmpname); - 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 */ |