Import of ISC BIND 8.3.1-REL.

This commit is contained in:
Jacques Vidrine 2002-02-04 19:12:46 +00:00
parent 2cf92774d2
commit 9a93429761
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/bind/dist/; revision=90209
211 changed files with 9894 additions and 3704 deletions

View File

@ -1,4 +1,315 @@
--- 8.2.4-REL released --- (Wed May 9 14:36:23 PDT 2001)
--- 8.3.1-REL released --- (Thu Jan 31 21:28:59 PST 2002)
1332. [func] "allow-query" is now supported for forward zones.
#define FORWARD_ALLOWS in bin/named/named.h to enable.
1331. [bug] rrsetadd() should explictly attach to the databuf
rather than inheriting the reference count.
1330. [bug] potential reference after free.
1329. [port] linux: ensure that CC is correctly propgated to
probe_ipv6.
1328. [port] linux: res_init.c failed to compile on certian older
machines.
1327. [contrib] add mysqlBind reference.
1326. [bug] named-xfer could incorrectly report a fopen() failure
as a fdopen() failure.
1325. [bug] if fdopen() failed empty files could be left behind.
1324. [bug] certian bad delegations could result in a DNS storm.
1323. [bug] cached NXDOMAIN/NODATA responses were being ignored
when when fetching missing additional data.
--- 8.3.0-REL released --- (Fri Jan 11 04:00:00 PST 2002)
1323. [bug] don't assume statp->_u._ext.ext is valid unless
RES_INIT is set when calling res_*init().
1322. [bug] call res_ndestroy() if RES_INIT is set when
res_*init() is called.
1321. [cleanup] YPKLUDGE in no longer default.
1320. [port] winnt: namespace collision #undef the system's EV_ERR.
1319. [port] winnt: make __res_nopt() visible externally.
1318. [port] Tru64 UNIX V5.1 can return spurious EINVAL on
close() after connect() failure.
1317. [bug] NULL used where zero was required.
--- 8.3.0-RC2 released --- (Wed Jan 2 17:14:23 PST 2002)
1316. [bug] memory leak when a ixfr update or a re-applied update
was rejected.
1315. [bug] the wrong options level check-names value was used
when merging ixfr updates.
1314. [bug] corrupt update / ixfr updates should result in
merge errors being reported.
1313. [bug] set current_serial in db_ixfr.c:ixfr_getdelta().
1312. [bug] use serial space arithmetic when selecting deltas for
IXFR.
1311. [contrib] mdnkit update to 2.2.3
1310. [bug] TSIG signed IXFR's wern't correctly verified.
1309. [port] winnt: re-order fclose/unlink so that the unlink
succeeds.
1308. [doc] miscellaneous nroff fixes.
1307. [func] preferred-glue can now be used to partially order
the additional section.
1306. [bug] It was possible to trigger an INSIST failure with
certian EDNS responses.
1305. [bug] named-xfer could return a false up-to-date status.
1304. [bug] "named-xfer -x" didn't attempt to use the specified
address for all possible masters if earlier connects
failed.
1303. [contrib] nslint upgraded from 2.0.2 to 2.1a3 (by author).
1302. [bug] res_nametotype() and res_nametoclass() were broken.
1301. [bug] "ndc reload zone" without class was broken.
1300. [port] Tru64 UNIX 5.1 does not like __align as a element name.
1299. [bug] host failed to handle "." in search list correctly.
1298. [bug] max-ixfr-log-size default was unreasonable.
1297. [bug] read buffer overflows.
1296. [protocol] NAPTR additional section processing.
--- 8.3.0-RC1 released --- (Wed Nov 21 20:41:32 PST 2001)
1295. [bug] be more aggressive at dropping messages from certian
well known ports.
1294. [bug] hint zones and root stub zones were not being removed
correctly.
1293. [port] MPE/iX workaround recvfrom() not supporting larger
address buffers required for IPv6.
1292. [bug] memory leak: free_flushset().
1291. [func] accept and generate EDNS0 queries.
1290. [func] allow initial notifies on startup to be suppressed.
[Kenneth Karoliussen, kenneth@activeisp.com]
1289. [func] allow keys to be specified in the masters clause.
1288. [func] named-xfer report if response was signed.
1287. [bug] named-xfer could report false TSIG failures under
certian conditions.
1286. [bug] don't allow rtt estimates to drop to zero.
1285. [bug] non-answering servers rtt estimates were not always
penalised.
1284. [bug] struct __res_state was still broken after #1265.
1283. [port] addition platform support for _r functions.
1282. [port] pw->pw_class is platform dependant.
1281. [port] namespace collision: dprintf -> res_dprintf,
ERR -> EV_ERR, OK -> EV_OK.
1280. [cleanup] gai_strerror() re-written.
1279. [bug] non-glue was not being reported on reload.
1278. [bug] Remove the INSIST at the end if zone_maint().
1277. [func] hostname.bind/txt/chaos now returns the name of
the machine hosting the nameserver. This is useful
in diagnosing problems with anycast servers.
1276. [bug] dns_ho.c:add_hostent() was not returning the amount
of memory consumed resulting in garbage address
being returned. Alignment calculations were
wasting space. We wern't suppressing duplicate
addresses.
1275. [port] sunos: old sprintf.
1274. [port] MPE/iX C.70
1273. [bug] host was sorting multiple RRs into the wrong order
prior to verifying.
--- 8.3.0-T2A released --- (Thu Sep 27 18:15:00 PDT 2001)
1272. [bug] "ndc trace 0" should behave like "ndc notrace".
1271. [func] inet_{cidr,net}_{pton,ntop}() now have IPv6 support.
1270. [bug] AXFR style IXFR responses were not handled properly,
transfer-format single-answer.
1269. [bug] misc: more string format fixes, open va_end(),
call exit() with positive values, include <string.h>.
1268. [func] Resolver, dig: "DNSSEC OK" (DO) support.
1267. [port] HP e3000 MPE is big-endian.
1266. [func] dig +[no]tr: use relative names when printing
out a zone transfer ([NO]TRuncate).
1265. [bug] struct __res_state to large on 64 bit arch.
1264. [port] winnt: pass the root zone as "." to named-xfer
rather than "".
1263. [port] #1227 broke sunos.
1262. [func] log type as well as class for denied queries.
1261. [bug] get*by*() failed to check if res_init() had been
called.
1260. [func] resolver option: no-tld-query. disables trying
unqualified as a tld. no_tld_query is also supported
for FreeBSD compatability.
1259. [func] enable NOADDITIONAL code by default.
1258. [func] treat class ANY as class IN for access control for
non-xfr queries.
1257. [func] increase nameserver chaining distance from 1 to 3
(NS_MAX_DISTANCE).
1256. [bug] increased loop avoidance with well known ports.
1255. [bug] cached NXDOMAIN responses were being ignored when
selecting servers to query.
1254. [support] improved support for parallel make.
1253. [port] winnt: support for change #1218
1252. [port] winnt: the stat structure does not have st_blksize.
1251. [bug] AXFR style IXFR responses were not handled properly.
1250. [doc] document support-ixfr.
1249. [func] add support gcc's format string checking.
1248. [bug] string formats.
1247. [bug] dig -t axfr attempted to use UDP not TCP.
1246. [doc] miscellaneous nroff fixes.
1245. [port] winnt: named-xfer failures. improved recvfrom()
emulation.
1244. [port] winnt: bug in tracking "file" file descriptors
extend "file" file descriptors support to 2048.
1243. [cleanup] defining REPORT_ERRORS in lib/dst caused compile time
errors.
1242. [bug] inet_pton() failed to reject octal input.
1241. [bug] memory leaks: zone forwarder table, server key list,
global forwarder table, query tsig info, unused
channels, key names, xfr tsig info.
1240. [bug] restore message if ns_forw() fails.
1239. [bug] call res_ndestroy() in net_data_destroy().
1238. [func] named-bootconf now supports HP's "no-round-robin".
1237. [bug] buffer overrun, access mode read.
1236. [bug] ignore white space after address of nameserver.
1235. [port] solaris 2.4: use ioctl(FIONBIO) rather than fcntl().
--- 8.3.0-T1A released --- (Wed Jun 20 19:05:01 PDT 2001)
1234. [bug] memory leak with "use-id-pool no;".
1233. [func] res_setservers(), res_getservers().
1232. [bug] don't assume the forwarder has dropped bogus records.
1231. [bug] always restart a query if we dropped records when
parsing.
1230. [func] report the address the server learnt the record from
in lame server messages.
1229. [func] opaque rdata support for unknown types.
1228. [protocol] IXFR don't test for AA, don't check that the question
is returned.
1227. [port] solaris: sys_nerr and sys_errlist do not exist when
compiling in 64 bit mode.
1226. [placeholder]
1225. [bug] don't send cross class additional records.
1224. [bug] use after realloc(), non portable pointer arithmetic in
grmerge().
1223. [bug] allow all KEY records in parent zone at bottom of zone
cut.
1222. [bug] HMAC-MD5 key files are now mode 0600.
1221. [port] aix: 4.3.3.0 (4.3.2.0?) and later have strndup().
1220. [port] winnt: isc_movefile() and syslog() updated.
1219. [bug] winnt: zone transfers could fail.
1218. [func] add IPv6 transport support to the resolver from the
KAME project. Includes initial bitstring support.
1217. [bug] #1186 broke the command-line programs that relied on
the fact that HMAC-MD5 keys have keyid 0.
1216. [bug] #1180 completely broke inet_nsap_addr(),
inet_nsap_ntoa() still didn't emit the leading 0x.
1215. [bug] long UNIX domain control socket names were not being
printed in full.
1214. [bug] getrgnam()/getgrgid() leaked memory.
1213. [bug] #1199 introduced a reference after free bug.
1212. [bug] some function declarations wern't protected by
__BEGIN_DECL/__END_DECL in resolv.h.
@ -9,7 +320,8 @@
1209. [port] winnt: issues.
--- 8.2.4-T2B released --- (Thu May 3 05:48:14 PDT 2001)
1208. [func] close "dynamic" file channels when debug is set to
zero allowing them to be removed and re-opened.
1207. [contrib] new h2n from author.
@ -23,10 +335,21 @@
1202. [bug] memory leak: dynamic update was leaking.
1201. [bug] ISO/IEC 9945-1 versions of getpwuid_r(), getpwnam_r(),
getgrgid_r() and getgrnam_r() were not ISO/IEC 9945-1
compliant.
1200. [bug] memory leak: when following CNAMES from of req_query().
1199. [bug] memory leak: when defining keys.
1198. [func] reference count all databuf activity.
1197. [func] deallocate-on-exit yes; will call abort() if there
is still active memory.
1196. [func] memactive(): report if there is still active memory.
1195. [bug] memory leak: include in named.conf leaked file name.
1194. [port] MPE/IX port updated by Mark Bixby of the

View File

@ -203,6 +203,10 @@ Operating System Notes
Read src/port/next/README.FIRST before trying to build.
MPE/iX IPv6 is *not* supported. src/port/mpe/recvfrom.c needs to
be re-written to support IPv6 if and when the OS supports
IPv6.
Certain older versions of FreeBSD, NetBSD and BSD/OS
These systems have a /bin/sh based on "ash", which doesn't

View File

@ -1,4 +1,4 @@
## Copyright (c) 1996,1999 by Internet Software Consortium, Inc.
## Copyright (c) 1996,1999 by Internet Software Consortium.
##
## Permission to use, copy, modify, and distribute this software for any
## purpose with or without fee is hereby granted, provided that the above
@ -13,58 +13,56 @@
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
# $Id: Makefile,v 1.10 2000/11/13 02:26:12 vixie Exp $
# $Id: Makefile,v 8.52 2000/11/21 12:54:37 marka Exp $
# This is just for making distributions. For the real Makefile, cd src.
TOP=
SUBDIRS= include port lib bin
all clean depend: FRC
@echo go to the ./src directory, you cannot make '"'$@'"' here.
@false
SH=sh
tar: bind-doc.tar.gz bind-src.tar.gz bind-contrib.tar.gz
default: all
pgp: bind-doc.tar.gz.asc bind-src.tar.gz.asc bind-contrib.tar.gz.asc
all clean depend install distclean:: FRC
@set -e; \
version=`cat ${TOP}Version`; \
systype=`${SH} ${TOP}port/systype ${TOP}.systype`; \
if [ $$systype = "unknown" ]; then \
echo "There is no BIND port for this system in this kit."; \
else \
settings=`${SH} ${TOP}port/settings ${TOP}.settings \
< ${TOP}port/$$systype/Makefile.set`; \
PATH=`pwd`/port/$$systype/bin:$$PATH; export PATH; \
for x in ${SUBDIRS}; do \
( cd $$x; pwd; \
eval "${MAKE} $$settings ${MARGS} SYSTYPE=$$systype \
VER=$$version \
$@"; \
) || exit 1; \
done \
fi
bind-doc.tar.gz: Makefile
cd doc/bog; make clean file.psf file.lst
cd doc/man; make clean all
cd doc/man; make MANROFF="groff -t" OUT_EXT=psf clean all
tar cf - Makefile doc | gzip > bind-doc.tar.gz
cd doc/man; make clean
cd doc/man; make MANROFF="groff -t" OUT_EXT=psf clean
clean distclean::
rm -f .systype .settings
bind-src.tar.gz: Makefile
cd src; make distclean
cd src/bin/nslookup; make commands.c
cd src/bin/named; make ns_parser.c
tar cf - Makefile src | gzip > bind-src.tar.gz
links: FRC
@set -e; mkdir ${DST}; cd ${DST}; pwd; ln -s ${SRC} SRC; \
ln -s SRC/Version .; cp SRC/Makefile .; chmod +w Makefile; \
systype=`${SH} SRC/port/systype`; \
for x in ${SUBDIRS} ; do \
( mkdir $$x; cd $$x; pwd; ln -s ../SRC/$$x SRC; \
cp SRC/Makefile Makefile; chmod +w Makefile; \
${MAKE} ${MARGS} SYSTYPE=$$systype links; \
) || exit 1; \
done
bind-contrib.tar.gz: Makefile
tar cf - Makefile contrib | gzip > bind-contrib.tar.gz
stdlinks: FRC
if [ ! -d /var/obj ]; then \
mkdir /var/obj; \
fi
${MAKE} ${MARGS} SRC=`pwd` DST=/var/obj/bind links
bind-doc.tar.gz.asc: bind-doc.tar.gz
rm -f bind-doc.tar.gz.asc
pgp -u pgpkey@isc.org -sba bind-doc.tar.gz
chmod o+r bind-doc.tar.gz.asc
bind-src.tar.gz.asc: bind-src.tar.gz
rm -f bind-src.tar.gz.asc
pgp -u pgpkey@isc.org -sba bind-src.tar.gz
chmod o+r bind-src.tar.gz.asc
bind-contrib.tar.gz.asc: bind-contrib.tar.gz
rm -f bind-contrib.tar.gz.asc
pgp -u pgpkey@isc.org -sba bind-contrib.tar.gz
chmod o+r bind-contrib.tar.gz.asc
noesw: src/Version src/lib/Makefile src/lib/dst/Makefile \
src/lib/cylink/. src/lib/dnssafe/.
perl -pi.BAK -e 's/$$/-NOESW/' src/Version
perl -pi.BAK -e 's/ cylink dnssafe//' src/lib/Makefile
perl -pi.BAK -e 's:-I../cylink::' src/lib/dst/Makefile
perl -pi.BAK -e 's:-I../dnssafe::' src/lib/dst/Makefile
perl -pi.BAK -e 's/-DCYLINK_DSS//' src/lib/dst/Makefile
perl -pi.BAK -e 's/-DDNSSAFE//' src/lib/dst/Makefile
rm -rf src/lib/cylink src/lib/dnssafe
uplinks: FRC
@set -e; systype=`${SH} ${TOP}port/systype`; pwd=`pwd`; \
${MAKE} ${MARGS} SRC=../`basename $$pwd` "DST=../$$systype" links
FRC:

View File

@ -10,9 +10,23 @@ artifacts including BIND, INN, and DHCP.
Note that BIND 8 is in "end-of-life", having been replaced by BIND 9. See
http://www.isc.org/ for more details.
BIND 8.3.1 Highlights
Critical bug fix to prevent DNS storms. If you have BIND 8.3.0 you
need to upgrade.
BIND 8.3.0 Highlights
IPv6 transport support in resolver (from KAME).
Opaque rdata support.
EDNS0 support.
Glue ordering to help non-ENDS0 aware clients (servers) cope with
larger responses as a result of IPv6 by allowing A records to be added
first to the additional section. IPv6 capable clients are expected to
use EDNS0 to allow larger responses to be sent.
Bug Fixes, includes BIND 8.2.5 changes.
BIND 8.2.4 Highlights
NSAP processing was not RFC 1706 compliant. NOTE: OLD MASTER FILES
NEED TO BE CORRECTED (0x added to NSAP) AND CACHE FILES REMOVED.
NEED TO BE CORRECTED AND CACHE FILES REMOVED.
Fixes long-standing protocol incompatibility in DNSSEC support.
Avoids fwd'ing to root name servers if response will be rejected.
new port/cygwin contributed by s_c_biggs@bigfoot.com.

View File

@ -1 +1 @@
8.2.4-REL
8.3.1-REL

View File

@ -13,7 +13,7 @@
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
# $Id: Makefile,v 8.30 2000/12/23 08:02:48 vixie Exp $
# $Id: Makefile,v 8.31 2001/08/14 05:57:57 marka Exp $
DESTDIR=
CC= cc
@ -64,10 +64,10 @@ CPPFLAGS= -I${PORTINCL} -I${INCL}
SUBDIRS = addr nslookup dig dnsquery host named named-xfer ndc nsupdate \
mkservdb irpd dnskeygen named-bootconf
all: ${SUBDIRS}
${SUBDIRS}: FRC
@(cd $@; pwd; ${MAKE} ${MARGS}) || exit 1
all:
@for x in ${SUBDIRS}; do \
(cd $$x; pwd; ${MAKE} ${MARGS} $@) || exit 1; \
done
install depend tags clean distclean::
@for x in ${SUBDIRS}; do \

View File

@ -1,5 +1,5 @@
#ifndef lint
static const char rcsid[] = "$Id: dig.c,v 8.46 2001/04/01 17:35:01 vixie Exp $";
static const char rcsid[] = "$Id: dig.c,v 8.51 2001/12/19 02:25:17 marka Exp $";
#endif
/*
@ -188,9 +188,15 @@ static const char rcsid[] = "$Id: dig.c,v 8.46 2001/04/01 17:35:01 vixie Exp $";
#define VERSION 83
#define VSTRING "8.3"
#define PRF_DEF 0x2ff9
#define PRF_MIN 0xA930
#define PRF_ZONE 0x24f9
#define PRF_DEF (RES_PRF_STATS | RES_PRF_CMD | RES_PRF_QUES | \
RES_PRF_ANS | RES_PRF_AUTH | RES_PRF_ADD | \
RES_PRF_HEAD1 | RES_PRF_HEAD2 | RES_PRF_TTLID | \
RES_PRF_HEADX | RES_PRF_REPLY | RES_PRF_TRUNC)
#define PRF_MIN (RES_PRF_QUES | RES_PRF_ANS | RES_PRF_HEAD1 | \
RES_PRF_HEADX | RES_PRF_REPLY | RES_PRF_TRUNC)
#define PRF_ZONE (RES_PRF_STATS | RES_PRF_CMD | RES_PRF_QUES | \
RES_PRF_ANS | RES_PRF_AUTH | RES_PRF_ADD | \
RES_PRF_TTLID | RES_PRF_REPLY | RES_PRF_TRUNC)
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 256
@ -219,7 +225,7 @@ int queryType, queryClass;
extern int StringToClass(), StringToType(); /* subr.c */
#if defined(BSD) && BSD >= 199006 && !defined(RISCOS_BSD)
FILE *yyin = NULL;
void yyrestart(FILE *f) { }
void yyrestart(FILE *f) { UNUSED(f); }
#endif
char *pager = NULL;
/* end of nslookup stuff */
@ -448,13 +454,21 @@ main(int argc, char **argv) {
printf("; no arg for -t?\n");
else if ((tmp = atoi(*argv))
|| *argv[0]=='0') {
queryType = tmp;
qtypeSet++;
if (ns_t_xfr_p(tmp)) {
xfr = tmp;
} else {
queryType = tmp;
qtypeSet++;
}
} else if ((tmp = StringToType(*argv,
0, NULL)
) != 0) {
queryType = tmp;
qtypeSet++;
if (ns_t_xfr_p(tmp)) {
xfr = tmp;
} else {
queryType = tmp;
qtypeSet++;
}
} else {
printf(
"; invalid type specified\n"
@ -832,6 +846,7 @@ main(int argc, char **argv) {
if (n < 0) {
fflush(stderr);
printf(";; res_nmkquery: buffer too small\n\n");
fflush(stdout);
continue;
}
if (queryType == T_IXFR) {
@ -857,6 +872,13 @@ main(int argc, char **argv) {
bytes_out = n = cpp - packet;
};
#if defined(RES_USE_EDNS0) && defined(RES_USE_DNSSEC)
if (n > 0 &&
(res.options & (RES_USE_EDNS0|RES_USE_DNSSEC)) != 0)
bytes_out = n = res_nopt(&res, n, packet,
sizeof(packet), 4096);
#endif
eecode = 0;
if (res.pfcode & RES_PRF_HEAD1)
fp_resstat(&res, stdout);
@ -954,14 +976,15 @@ where: server,\n\
d-opt is of the form ``+keyword=value'' where keyword is one of:\n\
[no]debug [no]d2 [no]recurse retry=# time=# [no]ko [no]vc\n\
[no]defname [no]search domain=NAME [no]ignore [no]primary\n\
[no]aaonly [no]cmd [no]stats [no]Header [no]header\n\
[no]aaonly [no]cmd [no]stats [no]Header [no]header [no]trunc\n\
[no]ttlid [no]cl [no]qr [no]reply [no]ques [no]answer\n\
[no]author [no]addit pfdef pfmin pfset=# pfand=# pfor=#\n\
[no]author [no]addit [no]dnssec pfdef pfmin\n\
pfset=# pfand=# pfor=#\n\
", stderr);
fputs("\
notes: defname and search don't work; use fully-qualified names.\n\
this is DiG version " VSTRING "\n\
$Id: dig.c,v 8.46 2001/04/01 17:35:01 vixie Exp $\n\
$Id: dig.c,v 8.51 2001/12/19 02:25:17 marka Exp $\n\
", stderr);
}
@ -1000,6 +1023,10 @@ setopt(const char *string) {
res.options |= RES_DEFNAMES;
} else if (strncmp(option, "nodef", 5) == 0) {
res.options &= ~RES_DEFNAMES;
} else if (strncmp(option, "dn", 2) == 0) { /* dnssec */
res.options |= RES_USE_DNSSEC;
} else if (strncmp(option, "nodn", 4) == 0) {
res.options &= ~RES_USE_DNSSEC;
} else if (strncmp(option, "sea", 3) == 0) { /* search list */
res.options |= RES_DNSRCH;
} else if (strncmp(option, "nosea", 5) == 0) {
@ -1075,6 +1102,10 @@ setopt(const char *string) {
res.pfcode |= RES_PRF_TTLID;
} else if (strncmp(option, "nott", 4) == 0) {
res.pfcode &= ~RES_PRF_TTLID;
} else if (strncmp(option, "tr", 2) == 0) { /* TTL & ID */
res.pfcode |= RES_PRF_TRUNC;
} else if (strncmp(option, "notr", 4) == 0) {
res.pfcode &= ~RES_PRF_TRUNC;
} else if (strncmp(option, "he", 2) == 0) { /* head flags stats */
res.pfcode |= RES_PRF_HEAD2;
} else if (strncmp(option, "nohe", 4) == 0) {
@ -1191,14 +1222,14 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
static int answerLen = 0;
querybuf buf;
int msglen, amtToRead, numRead, result = 0, sockFD, len;
int msglen, amtToRead, numRead, result, sockFD, len;
int count, type, class, rlen, done, n;
int numAnswers = 0, numRecords = 0, soacnt = 0;
int numAnswers, numRecords, soacnt;
u_char *cp, tmp[NS_INT16SZ];
char dname[2][NS_MAXDNAME];
enum { NO_ERRORS, ERR_READING_LEN, ERR_READING_MSG, ERR_PRINTING }
error = NO_ERRORS;
pid_t zpid;
error;
pid_t zpid = -1;
u_char *newmsg;
int newmsglen;
ns_tcp_tsig_state tsig_state;
@ -1302,7 +1333,7 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
sockFD = -1;
return (e);
}
if (connect(sockFD, (struct sockaddr *)sin, sizeof *sin) < 0) {
if (connect(sockFD, (const struct sockaddr *)sin, sizeof *sin) < 0) {
int e = errno;
perror(";; connect");
@ -1325,7 +1356,8 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
(void) close(sockFD);
sockFD = -1;
return (e);
}
} else if (key)
free (newmsg);
/*
* If we're compressing, push a gzip into the pipeline.
@ -1336,8 +1368,6 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
if (pipe(z) < 0) {
int e = errno;
if (key)
free (newmsg);
perror(";; pipe");
(void) close(sockFD);
@ -1347,8 +1377,6 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
zpid = vfork();
if (zpid < 0) {
int e = errno;
if (key)
free (newmsg);
perror(";; fork");
(void) close(sockFD);
@ -1370,6 +1398,11 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
(void) dup2(z[rd], sockFD);
(void) close(z[rd]);
}
result = 0;
numAnswers = 0;
numRecords = 0;
soacnt = 0;
error = NO_ERRORS;
dname[0][0] = '\0';
for (done = 0; !done; (void)NULL) {
@ -1538,10 +1571,6 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
WCOREDUMP(status) ? 't' : 'f');
}
/* XXX This should probably happen sooner than here */
if (key)
free (newmsg);
switch (error) {
case NO_ERRORS:
return (0);
@ -1604,9 +1633,12 @@ print_axfr(FILE *file, const u_char *msg, size_t msglen) {
fprintf(file, "$ORIGIN %s.\n", origin);
if (strcmp(name, ".") == 0)
strcpy(origin, name);
strcpy(name_ctx, "@");
if (res.pfcode & RES_PRF_TRUNC)
strcpy(name_ctx, "@");
}
if (ns_sprintrr(&handle, &rr, name_ctx, origin,
if (ns_sprintrr(&handle, &rr,
(res.pfcode & RES_PRF_TRUNC) ? name_ctx : NULL,
(res.pfcode & RES_PRF_TRUNC) ? origin : NULL,
buf, sizeof buf) < 0) {
fprintf(file, ";; ns_sprintrr: %s\n", strerror(errno));
return (FORMERR);

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: dnskeygen.c,v 1.11.2.1 2001/04/26 02:56:06 marka Exp $";
static const char rcsid[] = "$Id: dnskeygen.c,v 1.14 2001/09/25 04:50:14 marka Exp $";
#endif /* not lint */
/*
@ -37,7 +37,7 @@ static const char rcsid[] = "$Id: dnskeygen.c,v 1.11.2.1 2001/04/26 02:56:06 mar
#define PATH_SEP '/'
#endif
static void usage(char *str, int full);
static void usage(const char *str, int full);
static short dsa_sizes[] = {512, 576, 640, 704, 768, 832, 896, 960, 1024, 0};
static char *prog;
@ -274,9 +274,10 @@ main(int argc, char **argv) {
}
static void
usage(char *str, int flag){
usage(const char *str, int flag) {
int i;
printf ("\nNo key generated\n");
printf("\nNo key generated\n");
if (*str != '\0')
printf("Usage:%s: %s\n",prog, str);
printf("Usage:%s -{DHR} <size> [-F] -{zhu} [-ac] [-p <no>]"
@ -316,7 +317,5 @@ usage(char *str, int flag){
printf("\n");
}
exit (-3);
exit (3);
}

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: dnsquery.c,v 8.15 2000/12/23 08:14:32 vixie Exp $";
static const char rcsid[] = "$Id: dnsquery.c,v 8.16 2001/09/25 04:50:15 marka Exp $";
#endif /* not lint */
/*
@ -66,7 +66,7 @@ main(int argc, char *argv[]) {
/* if no args, exit */
if (argc == 1) {
fprintf(stderr, "Usage: %s [-h] host [-n ns] [-t type] [-c class] [-r retry] [-p period] [-s] [-v] [-d] [-a]\n", argv[0]);
exit(-1);
exit(1);
}
/* handle args */
@ -82,7 +82,7 @@ main(int argc, char *argv[]) {
case 'h' : if (strlen(optarg) >= sizeof(name)) {
fprintf(stderr,
"Domain name too long (%s)\n", optarg);
exit(-1);
exit(1);
} else
strcpy(name, optarg);
break;
@ -96,7 +96,7 @@ main(int argc, char *argv[]) {
class = proto_class;
else {
fprintf(stderr, "Bad class (%s)\n", optarg);
exit(-1);
exit(1);
}
}
break;
@ -110,7 +110,7 @@ main(int argc, char *argv[]) {
type = proto_type;
else {
fprintf(stderr, "Bad type (%s)\n", optarg);
exit(-1);
exit(1);
}
}
break;
@ -135,7 +135,7 @@ main(int argc, char *argv[]) {
fprintf(stderr,
"res_ninit() failed\n"
);
exit(-1);
exit(1);
}
if (nameservers >= MAXNS) break;
(void) inet_aton(optarg,
@ -146,7 +146,7 @@ main(int argc, char *argv[]) {
fprintf(stderr,
"Bad nameserver (%s)\n",
optarg);
exit(-1);
exit(1);
}
memcpy(&q_nsaddr[nameservers],
q_nsname->h_addr, INADDRSZ);
@ -158,14 +158,14 @@ main(int argc, char *argv[]) {
default : fprintf(stderr,
"\tUsage: %s [-n ns] [-h host] [-t type] [-c class] [-r retry] [-p period] [-s] [-v] [-d] [-a]\n", argv[0]);
exit(-1);
exit(1);
}
}
if (optind < argc) {
if (strlen(argv[optind]) >= sizeof(name)) {
fprintf(stderr,
"Domain name too long (%s)\n", argv[optind]);
exit(-1);
exit(1);
} else {
strcpy(name, argv[optind]);
}
@ -176,7 +176,7 @@ main(int argc, char *argv[]) {
if (!(res.options & RES_INIT))
if (res_ninit(&res) == -1) {
fprintf(stderr, "res_ninit() failed\n");
exit(-1);
exit(1);
}
/*
@ -208,13 +208,13 @@ main(int argc, char *argv[]) {
if (n < 0) {
fprintf(stderr, "Query failed (h_errno = %d) : %s\n",
h_errno, h_errlist[h_errno]);
exit(-1);
exit(1);
}
} else if ((n = res_nsearch(&res, name, class, type,
answer, len)) < 0) {
fprintf(stderr, "Query failed (h_errno = %d) : %s\n",
h_errno, h_errlist[h_errno]);
exit(-1);
exit(1);
}
res_pquery(&res, answer, n, stdout);
exit(0);

View File

@ -1,5 +1,5 @@
#ifndef lint
static const char rcsid[] = "$Id: host.c,v 8.43.2.2 2001/08/09 14:04:45 marka Exp $";
static const char rcsid[] = "$Id: host.c,v 8.49 2001/12/17 04:24:37 marka Exp $";
#endif /* not lint */
/*
@ -119,7 +119,7 @@ static const char copyright[] =
#define PATH_SEP '/'
#endif
#define SIG_RDATA_BY_NAME 18
#define NS_HEADERDATA_SIZE 10
#define NS_HEADERDATA_SIZE 10 /* type + class + ttl + rdlen */
#define NUMNS 8
#define NUMNSADDR 16
@ -354,7 +354,7 @@ main(int argc, char **argv) {
printf ("%s for %s not found, last verified key %s\n",
chase_step & SD_SIG ? "Key" : "Signature",
chase_step & SD_SIG ? chase_signer : chase_domain,
chase_lastgoodkey ? chase_lastgoodkey : "None");
chase_lastgoodkey[0] ? chase_lastgoodkey : "None");
}
}
if (!getdomain[0] && cname) {
@ -611,7 +611,8 @@ getinfo(const char *name, const char *domain, int type) {
int n;
char host[NS_MAXDNAME];
if (domain == NULL)
if (domain == NULL ||
(domain[0] == '.' && domain[1] == '\0'))
sprintf(host, "%.*s", NS_MAXDNAME, name);
else
sprintf(host, "%.*s.%.*s",
@ -647,7 +648,7 @@ printinfo(const querybuf *answer, const u_char *eom, int filter, int isls,
/*
* Find first satisfactory answer.
*/
hp = (HEADER *) answer;
hp = (const HEADER *) answer;
ancount = ntohs(hp->ancount);
qdcount = ntohs(hp->qdcount);
nscount = ntohs(hp->nscount);
@ -725,12 +726,12 @@ printinfo(const querybuf *answer, const u_char *eom, int filter, int isls,
if (nscount) {
printf("For authoritative answers, see:\n");
while (--nscount >= 0 && cp && cp < eom)
cp = (u_char *)pr_rr(cp, answer->qb2, stdout, filter);
cp = pr_rr(cp, answer->qb2, stdout, filter);
}
if (arcount) {
printf("Additional information:\n");
while (--arcount >= 0 && cp && cp < eom)
cp = (u_char *)pr_rr(cp, answer->qb2, stdout, filter);
cp = pr_rr(cp, answer->qb2, stdout, filter);
}
/* restore sigchase value */
@ -740,7 +741,8 @@ printinfo(const querybuf *answer, const u_char *eom, int filter, int isls,
return (1);
}
void print_hex_field (u_int8_t field[], int length, int width, char *pref)
static void print_hex_field (u_int8_t field[], int length, int width,
const char *pref)
{
/* Prints an arbitrary bit field, from one address for some number of
bytes. Output is formatted via the width, and includes the raw
@ -772,7 +774,7 @@ void print_hex_field (u_int8_t field[], int length, int width, char *pref)
} while (start < length);
}
void memswap (void *s1, void *s2, size_t n)
static void memswap (void *s1, void *s2, size_t n)
{
void *tmp;
@ -789,23 +791,6 @@ void memswap (void *s1, void *s2, size_t n)
free (tmp);
}
void print_hex (u_int8_t field[], int length)
{
/* Prints the hex values of a field...not as pretty as the print_hex_field.
*/
int i, start, stop;
start=0;
do
{
stop=length;
for (i = start; i < stop; i++)
printf ("%02x ", (u_char) field[i]);
start = stop;
if (start < length) printf ("\n");
} while (start < length);
}
/*
* Print resource record fields in human readable form.
*/
@ -826,7 +811,8 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
u_char canonrr[MY_PACKETSZ];
size_t canonrr_len = 0;
if ((cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name))) == NULL)
cp = pr_cdname(cp, msg, name, sizeof(name));
if (cp == NULL)
return (NULL); /* compression error */
strcpy(thisdomain, name);
@ -895,7 +881,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
const u_char *startrdata = cp;
u_char cdname[NS_MAXCDNAME];
cp = (u_char *)pr_cdname(cp, msg, name, sizeof name);
cp = pr_cdname(cp, msg, name, sizeof name);
if (doprint)
fprintf(file, "%c%s", punc, name);
@ -944,7 +930,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
const u_char *startname = cp;
u_char cdname[NS_MAXCDNAME];
cp = (u_char *)pr_cdname(cp, msg, name, sizeof name);
cp = pr_cdname(cp, msg, name, sizeof name);
if (doprint)
fprintf(file, "\t%s", name);
@ -961,7 +947,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
}
startname = cp;
cp = (u_char *)pr_cdname(cp, msg, name, sizeof name);
cp = pr_cdname(cp, msg, name, sizeof name);
if (doprint)
fprintf(file, " %s", name);
@ -1020,7 +1006,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
fprintf(file," ");
}
cp += sizeof(u_short);
cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name));
cp = pr_cdname(cp, msg, name, sizeof(name));
if (doprint)
fprintf(file, "%s", name);
@ -1056,7 +1042,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
if (doprint)
fprintf(file," %d", ns_get16(cp));
cp += sizeof(u_short);
cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name));
cp = pr_cdname(cp, msg, name, sizeof(name));
if (doprint)
fprintf(file, " %s", name);
break;
@ -1098,14 +1084,14 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
}
cp += n;
/* replacement */
cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name));
cp = pr_cdname(cp, msg, name, sizeof(name));
if (doprint)
fprintf(file, "%s", name);
break;
case ns_t_minfo:
case ns_t_rp:
cp = (u_char *)pr_cdname(cp, msg, name, sizeof name);
cp = pr_cdname(cp, msg, name, sizeof name);
if (doprint) {
if (type == ns_t_rp) {
char *p;
@ -1116,7 +1102,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
}
fprintf(file, "%c%s", punc, name);
}
cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name));
cp = pr_cdname(cp, msg, name, sizeof(name));
if (doprint)
fprintf(file, " %s", name);
break;
@ -1201,7 +1187,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
u_char cdname[NS_MAXCDNAME];
size_t bitmaplen;
cp = (u_char *) pr_cdname(cp, msg, name, sizeof name);
cp = pr_cdname(cp, msg, name, sizeof name);
if (doprint)
fprintf(file, "%c%s", punc, name);
bitmaplen = dlen - (cp - startrdata);
@ -1265,7 +1251,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
fprintf(file, " %d", ns_get16(cp));
cp += sizeof(u_short);
/* signer's name */
cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name));
cp = pr_cdname(cp, msg, name, sizeof(name));
if (doprint && verbose)
fprintf(file, " %s", name);
else if (doprint && !verbose)
@ -1299,7 +1285,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
SIG_RDATA_BY_NAME);
memcpy(chase_sigrdata + SIG_RDATA_BY_NAME,
cdname, n);
chase_sigrdata_len += SIG_RDATA_BY_NAME + n;
chase_sigrdata_len = SIG_RDATA_BY_NAME + n;
memcpy(chase_signature, cp, len);
chase_signature_len = len;
@ -1376,10 +1362,14 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
/* sort rr's (qsort() is too slow) */
for (i = 0; i < NUMRR && chase_rr[i].len; i++)
for (j = i + 1; i < NUMRR && chase_rr[j].len; j++)
if (memcmp(chase_rr[i].data, chase_rr[j].data, MY_PACKETSZ) > 0)
memswap(&chase_rr[i], &chase_rr[j], sizeof(rrstruct));
for (j = i + 1; j < NUMRR && chase_rr[j].len;
j++)
if (memcmp(chase_rr[i].data,
chase_rr[j].data,
MY_PACKETSZ) < 0)
memswap(&chase_rr[i],
&chase_rr[j],
sizeof(rrstruct));
/* append rr's to sigrdata */
for (i = 0; i < NUMRR && chase_rr[i].len; i++)
@ -1392,6 +1382,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
/* print rr-data and signature */
if (verbose) {
fprintf(file, "\n");
print_hex_field(chase_sigrdata,
chase_sigrdata_len,
21,"DATA: ");

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: mkservdb.c,v 1.9 2001/01/26 06:54:11 vixie Exp $";
static const char rcsid[] = "$Id: mkservdb.c,v 1.10 2001/06/18 14:42:46 marka Exp $";
#endif /* not lint */
/*
@ -69,9 +69,9 @@ main(int argc, char **argv) {
DB *db;
DBT key;
DBT data;
char *filename = _PATH_SERVICES;
char *tmpdatabase = _PATH_SERVICES_DB_TMP;
char *database = _PATH_SERVICES_DB;
const char *filename = _PATH_SERVICES;
const char *tmpdatabase = _PATH_SERVICES_DB_TMP;
const char *database = _PATH_SERVICES_DB;
char dbuf[1024];
char kbuf[512];
u_short *ports;
@ -152,7 +152,7 @@ main(int argc, char **argv) {
if (sv->s_aliases != NULL)
for (n = 0; sv->s_aliases[n] != NULL; n++)
if ((p + strlen(sv->s_aliases[n]) + 1) - dbuf
<= sizeof dbuf) {
<= (int)sizeof dbuf) {
strcpy(p, sv->s_aliases[n]);
p += strlen(p) + 1;
}

View File

@ -143,6 +143,11 @@ while read CMD ARGS; do
no-recursion )
echo " recursion no;" >>$OPTIONFILE
;;
no-round-robin ) # HP extention
echo " rrset-order {" >>$OPTIONFILE
echo " class ANY type ANY name \"*\" order fixed;" >>$OPTIONFILE
echo " };" >>$OPTIONFILE
;;
esac
done
rm -f $COMMENTFILE

View File

@ -0,0 +1,30 @@
directory /var/named
forwarders 1.2.3.4 1.2.3.5
limit datasize 10000000
limit files 1000
limit transfers-in 100
limit transfers-per-ns 20
; no-round-robin in HP specific
options no-round-robin fake-iquery forward-only no-fetch-glue no-recursion
slave
tcplist 10.0.0.1
xfrnets 10.0.0.2
cache . rootservers
primary example.net example.net.db
secondary example.com 127.0.0.1 example.com.db
stub example.org 127.0.0.1 example.org.db
primary/IN example.net example.net.db
secondary/IN example.com 127.0.0.1 example.com.db
stub/IN example.org 127.0.0.1 example.org.db
secondary/IN example.com 127.0.0.1
stub/IN example.org 127.0.0.1
primary/CHAOS example.net example.net.db
secondary/CHAOS example.com 127.0.0.1 example.com.db
stub/CHAOS example.org 127.0.0.1 example.org.db
secondary/CHAOS example.com 127.0.0.1
stub/CHAOS example.org 127.0.0.1
primary/HS example.net example.net.db
secondary/HS example.com 127.0.0.1 example.com.db
stub/HS example.org 127.0.0.1 example.org.db
secondary/HS example.com 127.0.0.1
stub/HS example.org 127.0.0.1

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/*
* from db.h 4.16 (Berkeley) 6/1/90
* $Id: db_defs.h,v 8.41 2001/02/08 02:05:50 marka Exp $
* $Id: db_defs.h,v 8.46 2001/11/17 15:16:46 marka Exp $
*/
/*
@ -111,7 +111,14 @@
* indicate what the union is being used for. This should require less
* memory than making d_addr a union of struct in6_addr and struct in_addr.
*/
#ifdef CHECK_MAGIC
#define DATABUF_MAGIC (('D'<<24)|('A'<<16)|('T'<<8)|'A')
#endif
struct databuf {
#ifdef CHECK_MAGIC
u_int32_t d_magic; /* magic number */
#endif
struct databuf *d_next; /* linked list */
struct in_addr d_addr; /* NS from whence this came */
u_int32_t d_ttl; /* time to live */
@ -130,6 +137,7 @@ struct databuf {
unsigned d_clev :6;
unsigned d_rcode :4; /* rcode for negative caching */
unsigned d_mark :3; /* place to mark data */
unsigned d_noedns :1; /* this server does not support edns */
int16_t d_type; /* type number */
int16_t d_size; /* size of data area */
u_int32_t d_rcnt;
@ -184,11 +192,14 @@ struct namebuf {
struct databuf *n_data; /* data records */
struct namebuf *n_parent; /* parent domain */
struct hashbuf *n_hash; /* hash table for children */
char _n_name[sizeof(void*)]; /* Counted str (dynamic). */
union {
char _n_name[sizeof(void*)];
unsigned char _n_len[sizeof(void*)];
} _n; /* Counted str (dynamic). */
};
#define NAMESIZE(n) (sizeof(struct namebuf) - sizeof(void*) + 1 + n + 1)
#define NAMELEN(nb) (((u_char *)((nb)._n_name))[0])
#define NAME(nb) ((nb)._n_name + 1)
#define NAMELEN(nb) ((((nb)._n._n_len))[0])
#define NAME(nb) ((nb)._n._n_name + 1)
struct hashbuf {
int h_size; /* size of hash table */
@ -211,6 +222,7 @@ struct tsig_record {
u_int8_t sig[TSIG_SIG_SIZE];
struct dst_key *key;
int siglen;
int tsig_size;
};
struct sig_record {
@ -227,7 +239,7 @@ struct dnode {
struct databuf *dp;
struct dnode *dn_next;
int line;
char *file;
const char *file;
};
typedef struct dnode * dlist;
@ -280,6 +292,7 @@ struct db_rrset {
#endif
#define CNAMEANDOTHER (-12)
#define DNSSECFAIL (-13) /* db_set_update */
#define NONGLUE (-14)
/*
* getnum() options

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)db_dump.c 4.33 (Berkeley) 3/3/91";
static const char rcsid[] = "$Id: db_dump.c,v 8.49 2001/02/06 06:42:19 marka Exp $";
static const char rcsid[] = "$Id: db_dump.c,v 8.51 2001/06/18 14:42:49 marka Exp $";
#endif /* not lint */
/*
@ -120,6 +120,7 @@ static const char rcsid[] = "$Id: db_dump.c,v 8.49 2001/02/06 06:42:19 marka Exp
#include <isc/eventlib.h>
#include <isc/logging.h>
#include <isc/misc.h>
#include "port_after.h"
@ -177,7 +178,8 @@ zt_dump(FILE *fp) {
fprintf(fp, ";; ++zone table++\n");
for (zp = &zones[0]; zp < &zones[nzones]; zp++) {
char *pre, buf[64];
const char *pre;
char buf[64];
u_int cnt;
if (!zp->z_origin)
@ -230,7 +232,7 @@ fwd_dump(FILE *fp) {
}
int
db_dump(struct hashbuf *htp, FILE *fp, int zone, char *origin) {
db_dump(struct hashbuf *htp, FILE *fp, int zone, const char *origin) {
struct databuf *dp = NULL;
struct namebuf *np;
struct namebuf **npp, **nppend;
@ -621,9 +623,14 @@ db_dump(struct hashbuf *htp, FILE *fp, int zone, char *origin) {
break;
default:
fprintf(fp, "%s?d_type=%d?",
sep, dp->d_type);
sep = " ";
fprintf(fp, "\\# %u", dp->d_size);
if (dp->d_size != 0) {
fputs(" ( ", fp);
isc_puthexstring(fp, dp->d_data,
dp->d_size, 40, 48,
"\n\t\t\t\t");
fputs(" ) ", fp);
}
}
if (dp->d_cred < DB_C_ZONE) {
fprintf(fp, "%sCr=%s",

View File

@ -90,7 +90,7 @@
/* db_proc.h - prototypes for functions in db_*.c
*
* $Id: db_func.h,v 8.44 2000/12/02 23:28:33 vixie Exp $
* $Id: db_func.h,v 8.46 2001/06/18 14:42:51 marka Exp $
*/
/* ++from db_update.c++ */
@ -113,7 +113,7 @@ struct hashbuf * savehash(struct hashbuf *);
/* --from db_save.c-- */
/* ++from db_dump.c++ */
int db_dump(struct hashbuf *, FILE *, int, char *),
int db_dump(struct hashbuf *, FILE *, int, const char *),
zt_dump(FILE *);
void doadump(void);
/* --from db_dump.c-- */
@ -142,7 +142,7 @@ int parse_sec_rdata(char *inp, int inp_len, int inp_full,
char *domain, u_int32_t ttl,
int type, enum context context,
enum transport transport,
char **errmsg);
const char **errmsg);
/* --from db_load.c-- */
/* ++from db_glue.c++ */
@ -165,7 +165,7 @@ struct namebuf * rm_name(struct namebuf *,
struct namebuf **,
struct namebuf *);
void rm_hash(struct hashbuf *);
void db_freedata(struct databuf *);
void db_detach(struct databuf **);
void db_lame_add(char *zone, char *server, time_t when);
time_t db_lame_find(char *zone, struct databuf *dp);
void db_lame_clean(void);
@ -203,7 +203,7 @@ int db_set_update(char *name, struct databuf *dp,
/* --from db_sec.c-- */
/* ++from db_tsig.c++ */
char * tsig_alg_name(int value);
const char * tsig_alg_name(int value);
int tsig_alg_value(char *name);
struct dst_key * tsig_key_from_addr(struct in_addr addr);
struct tsig_record * new_tsig(struct dst_key *key, u_char *sig, int siglen);

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)db_glue.c 4.4 (Berkeley) 6/1/90";
static const char rcsid[] = "$Id: db_glue.c,v 8.42 2000/12/23 08:14:35 vixie Exp $";
static const char rcsid[] = "$Id: db_glue.c,v 8.46 2001/11/25 23:52:19 marka Exp $";
#endif /* not lint */
/*
@ -145,8 +145,8 @@ destroyservicelist() {
for (slp = servicelist; slp != NULL; slp = slp_next) {
slp_next = slp->next;
freestr(slp->name);
freestr(slp->proto);
slp->name = freestr(slp->name);
slp->proto = freestr(slp->proto);
memput(slp, sizeof *slp);
}
servicelist = NULL;
@ -183,7 +183,7 @@ destroyprotolist() {
for (plp = protolist; plp != NULL; plp = plp_next) {
plp_next = plp->next;
freestr(plp->name);
plp->name = freestr(plp->name);
memput(plp, sizeof *plp);
}
protolist = NULL;
@ -354,31 +354,7 @@ rm_datum(struct databuf *dp, struct namebuf *np, struct databuf *pdp,
} else
dp->d_next = NULL;
dp->d_flags &= ~DB_F_ACTIVE;
DRCNTDEC(dp);
if (dp->d_rcnt) {
#ifdef DEBUG
int32_t ii;
#endif
switch(dp->d_type) {
case T_NS:
ns_debug(ns_log_db, 3, "rm_datum: %s rcnt = %d",
dp->d_data, dp->d_rcnt);
break;
#ifdef DEBUG
case T_A:
memcpy(&ii, dp->d_data, sizeof ii);
ns_debug(ns_log_db, 3,
"rm_datum: %08.8X rcnt = %d",
ii, dp->d_rcnt);
break;
#endif
default:
ns_debug(ns_log_db, 3,
"rm_datum: rcnt = %d", dp->d_rcnt);
}
} else
db_freedata(dp);
db_detach(&dp);
return (ndp);
}
@ -393,10 +369,10 @@ rm_name(struct namebuf *np, struct namebuf **pp, struct namebuf *pnp) {
const char *msg;
/* verify */
if ( (np->n_data && (msg = "data"))
|| (np->n_hash && (msg = "hash"))
if ( (np->n_data != NULL && (msg = "data") != NULL)
|| (np->n_hash != NULL && (msg = "hash") != NULL)
) {
ns_panic(ns_log_db, 1, "rm_name(%#x(%s)): non-nil %s pointer",
ns_panic(ns_log_db, 1, "rm_name(%p(%s)): non-nil %s pointer",
np, NAME(*np), msg);
}
@ -463,7 +439,7 @@ nhash(const char *name) {
return (hval);
}
void
static void
db_freedata(struct databuf *dp) {
int bytes = DATASIZE(dp->d_size);
@ -476,9 +452,28 @@ db_freedata(struct databuf *dp) {
if (dp->d_next != NULL)
panic("db_free: d_next != NULL", NULL);
dp->d_flags |= DB_F_FREE;
#ifdef CHECK_MAGIC
dp->d_magic = 0;
#endif
memput(dp, bytes);
}
void
db_detach(struct databuf **dpp) {
struct databuf *dp;
INSIST(dpp != NULL && *dpp != NULL);
dp = *dpp;
#ifdef CHECK_MAGIC
INSIST(dp->d_magic == DATABUF_MAGIC);
#endif
DRCNTDEC(dp);
if (dp->d_rcnt == 0)
db_freedata(dp);
*dpp = NULL;
}
struct lame_hash {
struct lame_hash *next;
char *zone;
@ -550,9 +545,9 @@ db_lame_add(char *zone, char *server, time_t when) {
this->zone = savestr(zone, 0);
if (this->server == NULL || this->zone == NULL) {
if (this->server != NULL)
freestr(this->server);
this->server = freestr(this->server);
if (this->zone != NULL)
freestr(this->zone);
this->zone = freestr(this->zone);
memput(this, sizeof *this);
return;
}
@ -602,8 +597,8 @@ db_lame_clean(void) {
this = lame_hash[i];
while (this != NULL) {
if (this->when < tt.tv_sec) {
freestr(this->zone);
freestr(this->server);
this->zone = freestr(this->zone);
this->server = freestr(this->server);
if (last != NULL) {
last->next = this->next;
memput(this, sizeof *this);
@ -635,8 +630,8 @@ db_lame_destroy(void) {
while (this != NULL) {
last = this;
this = this->next;
freestr(last->zone);
freestr(last->server);
last->zone = freestr(last->zone);
last->server = freestr(last->server);
memput(last, sizeof *this);
}
}

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static char rcsid[] = "$Id: db_ixfr.c,v 8.23.2.2 2001/05/03 03:53:18 marka Exp $";
static char rcsid[] = "$Id: db_ixfr.c,v 8.31 2002/01/02 04:47:10 marka Exp $";
#endif
/*
@ -52,6 +52,7 @@ static char rcsid[] = "$Id: db_ixfr.c,v 8.23.2.2 2001/05/03 03:53:18 marka E
#include <isc/eventlib.h>
#include <isc/logging.h>
#include <isc/memcluster.h>
#include <isc/misc.h>
#include "port_after.h"
@ -108,25 +109,29 @@ ixfr_get_change_list(struct zoneinfo *zp,
case DBIXFR_ERROR:
ns_warning(ns_log_db, "Logical error in %s: unlinking",
zp->z_ixfr_base);
if (fp != NULL) {
(void) my_fclose(fp);
fp = NULL;
}
unlink(zp->z_ixfr_base);
goto cleanup;
case DBIXFR_FOUND_RR:
ns_debug(ns_log_default, 4, "ixfr_getdelta DBIXFR_FOUND_RR (%s)",
zp->z_origin);
ns_debug(ns_log_default, 4,
"ixfr_getdelta DBIXFR_FOUND_RR (%s)",
zp->z_origin);
if (EMPTY(*dlhead)) {
/* skip updates prior to the one we want */
uprec = HEAD(dl->d_changes);
INSIST(uprec != NULL);
if ((uprec->r_zone < from_serial) ||
(uprec->r_zone > to_serial))
if (SEQ_LT(uprec->r_zone, from_serial) ||
SEQ_GT(uprec->r_zone, to_serial))
{
while ((uprec = HEAD(dl->d_changes)) != NULL) {
UNLINK(dl->d_changes, uprec, r_link);
if (uprec->r_dp != NULL)
db_freedata(uprec->r_dp);
uprec->r_dp = NULL;
db_detach(&uprec->r_dp);
res_freeupdrec(uprec);
}
memput(dl, sizeof *dl);
@ -174,7 +179,7 @@ ixfr_get_change_list(struct zoneinfo *zp,
UNLINK(dl->d_changes, uprec, r_link);
if (uprec->r_dp != NULL)
db_freedata(uprec->r_dp);
db_detach(&uprec->r_dp);
uprec->r_dp = NULL;
res_freeupdrec(uprec);
}
@ -373,8 +378,9 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
char data[MAXDATA], dnbuf[MAXDNAME], sclass[3];
char *dname, *cp, *cp1;
char buf[MAXDATA];
u_int32_t serial, ttl;
u_int32_t current_serial;
long unsigned lutmp;
u_int32_t serial = 0, ttl;
u_int32_t current_serial = 0;
int nonempty_lineno = -1, prev_pktdone = 0, cont = 0,
inside_next = 0;
int id;
@ -384,7 +390,6 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
enum transport transport;
struct map *mp;
int zonelist[MAXDNAME];
struct databuf *dp;
struct in_addr ina;
int datasize;
ns_updrec * rrecp;
@ -395,7 +400,19 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
err = 0;
transport = primary_trans;
lineno = 1;
zonenum = 0;
/*
* Look for serial if "first" call othewise use new_serial to
* for current_serial.
*/
if (*old_serial == *new_serial && *old_serial == 0)
current_serial = 0;
else
current_serial = *new_serial;
for (;;) {
dname = NULL;
if (!getword(buf, sizeof buf, fp, 0)) {
if (lineno == (nonempty_lineno + 1) && !(feof(fp))) {
/*
@ -475,13 +492,15 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
class = zp->z_class;
n = 0;
data[0] = '\0';
opcode = -1;
switch (section) {
case S_ZONE:
cp = fgets(buf, sizeof buf, fp);
if (!cp)
*buf = '\0';
n = sscanf(cp, "origin %s class %s serial %lu",
origin, sclass, &serial);
origin, sclass, &lutmp);
serial = lutmp;
if (current_serial == 0)
current_serial = serial;
else if (current_serial != serial) {
@ -501,8 +520,7 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
dname = origin;
type = T_SOA;
class = sym_ston(__p_class_syms, sclass,
&success);
class = res_nametoclass(sclass, &success);
if (!success) {
err++;
break;
@ -522,7 +540,6 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
err++;
break;
}
opcode = -1;
if (buf[0] == '{') {
n = strlen(buf);
for (i = 0; (u_int32_t) i < n; i++)
@ -567,8 +584,7 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
int success;
int maybe_class;
maybe_class = sym_ston(__p_class_syms,
buf, &success);
maybe_class = res_nametoclass(buf, &success);
if (success) {
class = maybe_class;
(void) getword(buf, sizeof buf, fp, 1);
@ -579,8 +595,7 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
int success;
int maybe_type;
maybe_type = sym_ston(__p_type_syms,
buf, &success);
maybe_type = res_nametotype(buf, &success);
if (success) {
type = maybe_type;
@ -817,7 +832,7 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
case ns_t_nxt:
case ns_t_key:
case ns_t_cert:{
char *errmsg = NULL;
const char *errmsg = NULL;
n = parse_sec_rdata(buf, sizeof(buf), 1,
(u_char *) data,
@ -833,7 +848,38 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
break;
}
default:
err++;
if (strcmp(buf, "\\#") != 0) {
err++;
break;
}
if (!getword(buf, sizeof buf, fp, 0) ||
!isdigit((unsigned char)buf[0])) {
err++;
break;
}
n = strtoul(buf, &cp, 10);
if (n > 0xffff || *cp != '\0') {
err++;
break;
}
multiline = 0;
i = isc_gethexstring((u_char *)data,
sizeof(data), n, fp,
&multiline);
if (i == -1) {
err++;
break;
}
if (multiline) {
c = getnonblank(fp, zp->z_updatelog, 1);
if (c != ')') {
ungetc(c, fp);
err++;
break;
}
multiline = 0;
}
endline(fp);
}
if (section == S_PREREQ) {
ttl = 0;
@ -880,6 +926,7 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
}
rrecp = res_mkupdrec(section, dname, class, type, ttl);
if (section != S_ZONE) {
struct databuf *dp;
dp = savedata(class, type, ttl, (u_char *) data, n);
dp->d_zone = zonenum;
dp->d_cred = DB_C_ZONE;
@ -904,13 +951,13 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
opcode == ADD) ||
(opcode == DELETE &&
arp->r_opcode == ADD)) &&
arp->r_dp->d_type == dp->d_type &&
arp->r_dp->d_class == dp->d_class &&
arp->r_dp->d_ttl == dp->d_ttl &&
arp->r_dp->d_type == rrecp->r_dp->d_type &&
arp->r_dp->d_class == rrecp->r_dp->d_class &&
arp->r_dp->d_ttl == rrecp->r_dp->d_ttl &&
ns_samename(arp->r_dname, dname) == 1 &&
db_cmp(arp->r_dp, dp) == 0) {
db_freedata(dp);
db_freedata(arp->r_dp);
db_cmp(arp->r_dp, rrecp->r_dp) == 0) {
db_detach(&rrecp->r_dp);
db_detach(&arp->r_dp);
UNLINK(*listuprec, arp, r_link);
res_freeupdrec(arp);
res_freeupdrec(rrecp);

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)db_load.c 4.38 (Berkeley) 3/2/91";
static const char rcsid[] = "$Id: db_load.c,v 8.113.2.1 2001/05/03 03:26:48 marka Exp $";
static const char rcsid[] = "$Id: db_load.c,v 8.121 2001/11/12 21:22:22 marka Exp $";
#endif /* not lint */
/*
@ -130,6 +130,7 @@ static const char rcsid[] = "$Id: db_load.c,v 8.113.2.1 2001/05/03 03:26:48 mark
#include <isc/eventlib.h>
#include <isc/logging.h>
#include <isc/memcluster.h>
#include <isc/misc.h>
#include "port_after.h"
@ -149,15 +150,16 @@ static int get_nxt_types(u_char *, FILE *, const char *);
static int parse_sig_rr(char *, int, u_char *, int, FILE *,
struct zoneinfo *, char *, u_int32_t ,
enum context , enum transport , char **);
enum context, enum transport,
const char **);
static int parse_key_rr(char *, int, u_char *, int, FILE *,
struct zoneinfo *, char *, enum context,
enum transport, char **);
const char **);
static int parse_cert_rr(char *, int, u_char *, int, FILE *, char **);
static int parse_nxt_rr(char *, int, u_char *, int, FILE *,
static int parse_cert_rr(char *, int, u_char *, int, FILE *,
const char **);
static int parse_nxt_rr(char *, u_char *, int, FILE *,
struct zoneinfo *, char *, enum context,
enum transport, char **);
enum transport, const char **);
static int wordtouint32_error = 0;
@ -237,7 +239,7 @@ db_load(const char *filename, const char *in_origin,
char buf[MAXDATA];
char genlhs[MAXDNAME], genrhs[MAXDNAME];
u_char data[MAXDATA];
int data_size = sizeof(data);
unsigned int data_size = sizeof(data);
int c, someclass, class, type, dbflags, dataflags, multiline = 0;
int slineno, i, errs, didinclude, ininclude, escape, success;
u_int32_t ttl, n, serial;
@ -404,7 +406,7 @@ db_load(const char *filename, const char *in_origin,
ERRTOZ("$GENERATE missing LHS");
if (!getword(buf, sizeof(buf), fp, 0))
ERRTOZ("GENERATE missing TYPE");
type = sym_ston(__p_type_syms, buf, &success);
type = res_nametotype(buf, &success);
if (success == 0 || type == ns_t_any) {
ns_info(ns_log_load,
"%s: Line %d: $GENERATE unknown type: %s.",
@ -509,9 +511,10 @@ db_load(const char *filename, const char *in_origin,
empty_from, &rrcount, lineno,
filename);
if (c != OK) {
if (c == CNAMEANDOTHER)
if (c == CNAMEANDOTHER || c == NONGLUE)
errs++;
}
db_detach(&dp);
}
endline(fp);
continue;
@ -578,7 +581,7 @@ db_load(const char *filename, const char *in_origin,
}
/* Parse class (IN, etc) */
someclass = sym_ston(__p_class_syms, buf, &success);
someclass = res_nametoclass(buf, &success);
if (success && someclass != zp->z_class) {
ns_info(ns_log_load,
"%s: Line %d: wrong class: %s.",
@ -593,7 +596,7 @@ db_load(const char *filename, const char *in_origin,
}
/* Parse RR type (A, MX, etc) */
type = sym_ston(__p_type_syms, buf, &success);
type = res_nametotype(buf, &success);
if (success == 0 || type == ns_t_any) {
ns_info(ns_log_load,
"%s: Line %d: Unknown type: %s.",
@ -635,8 +638,52 @@ db_load(const char *filename, const char *in_origin,
case ns_t_ptr:
escape = 1;
break;
default:
case ns_t_a:
case ns_t_md:
case ns_t_mf:
case ns_t_null:
case ns_t_hinfo:
case ns_t_mx:
case ns_t_txt:
case ns_t_afsdb:
case ns_t_x25:
case ns_t_isdn:
case ns_t_rt:
case ns_t_nsap:
case ns_t_nsap_ptr:
case ns_t_px:
case ns_t_gpos:
case ns_t_aaaa:
case ns_t_loc:
case ns_t_eid:
case ns_t_nimloc:
case ns_t_srv:
case ns_t_atma:
case ns_t_naptr:
case ns_t_kx:
case ns_t_dname:
case ns_t_sink:
escape = 0;
break;
case ns_t_opt:
case ns_t_tkey:
case ns_t_tsig:
case ns_t_ixfr:
case ns_t_axfr:
case ns_t_mailb:
case ns_t_maila:
case ns_t_any:
case ns_t_zxfr:
escape = 0;
ns_info(ns_log_load,
"%s: Line %d: meta type: %s.",
filename, lineno, p_type(type));
errs++;
break;
case ns_t_a6: /* not implemented */
default:
escape = 1;
break;
}
if (!getword(buf, sizeof buf, fp, escape))
break;
@ -710,7 +757,8 @@ db_load(const char *filename, const char *in_origin,
ns_notice(ns_log_load,
"%s:%d: WARNING: new serial number < old (%lu < %lu)",
filename , lineno,
zp->z_serial, serial);
(unsigned long)zp->z_serial,
(unsigned long)serial);
}
if (getttl(fp, filename, lineno, &n,
&multiline) <= 0) {
@ -1004,7 +1052,7 @@ db_load(const char *filename, const char *in_origin,
case ns_t_key:
case ns_t_cert:
case ns_t_sig: {
char *errmsg = NULL;
const char *errmsg = NULL;
int ret;
if (ttl == USE_MINIMUM) /* no ttl set */
ttl = 0;
@ -1043,9 +1091,28 @@ db_load(const char *filename, const char *in_origin,
endline(fp);
break;
default:
goto err;
if (strcmp(buf, "\\#") != 0)
goto err;
if (!getword(buf, sizeof buf, fp, 0) ||
!isdigit((unsigned char)buf[0]))
ERRTO("opaque length");
n = strtoul(buf, &cp, 10);
if (n > 0xffff || *cp != '\0')
ERRTO("opaque length");
multiline = 0;
i = isc_gethexstring(data, sizeof(data), n, fp,
&multiline);
if (i == -1)
ERRTO("opaque data read failed");
if (multiline) {
buf[0] = getnonblank(fp, filename, 1);
buf[1] = '\0';
if (buf[0] != ')')
ERRTO("\")\" expected");
multiline = 0;
}
endline(fp);
}
/*
* Ignore data outside the zone.
@ -1072,8 +1139,9 @@ db_load(const char *filename, const char *in_origin,
&fcachetab : &hashtab,
empty_from, &rrcount, lineno,
filename);
if (c == CNAMEANDOTHER)
if (c == CNAMEANDOTHER || c == NONGLUE)
errs++;
db_detach(&dp);
continue;
case ERRTOK:
@ -1091,7 +1159,7 @@ db_load(const char *filename, const char *in_origin,
(dataflags & DB_F_HINT) ? &fcachetab : &hashtab,
empty_from, &rrcount, lineno, filename);
if (c != OK) {
if (c == CNAMEANDOTHER)
if (c == CNAMEANDOTHER || c == NONGLUE)
errs++;
}
@ -1130,7 +1198,7 @@ db_load(const char *filename, const char *in_origin,
while (filenames) {
fn = filenames;
filenames = filenames->next;
freestr(fn->name);
fn->name = freestr(fn->name);
memput(fn, sizeof *fn);
}
if (errs != 0) {
@ -1155,7 +1223,8 @@ db_load(const char *filename, const char *in_origin,
zp->z_ftime = 0;
}
#ifdef BIND_NOTIFY
if (errs == 0 && (!ininclude) &&
if (errs == 0 && (!ininclude) && (initial_configuration == 0 ||
!NS_OPTION_P(OPTION_SUPNOTIFY_INITIAL)) &&
(zp->z_type == z_master || zp->z_type == z_slave))
ns_notify(zp->z_origin, zp->z_class, ns_t_soa);
#endif
@ -1332,6 +1401,7 @@ getword(char *buf, size_t size, FILE *fp, int preserve) {
if (preserve == 1)
break;
case '\\':
case '#':
case '.':
case '0':
case '1':
@ -1994,7 +2064,7 @@ get_nxt_types(u_char *data, FILE *fp, const char *filename) {
continue;
/* Parse RR type (A, MX, etc) */
type = sym_ston(__p_type_syms, (char *)b, &success);
type = res_nametotype((char *)b, &success);
if ((!success) || type == ns_t_any) {
errs++;
ns_info(ns_log_db,
@ -2064,7 +2134,8 @@ fixup_soa(const char *fn, struct zoneinfo *zp) {
static int
parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size,
FILE *fp, struct zoneinfo *zp, char *domain, u_int32_t ttl,
enum context domain_ctx, enum transport transport, char **errmsg)
enum context domain_ctx, enum transport transport,
const char **errmsg)
{
/* The SIG record looks like this in the db file:
Name Cl SIG RRtype Algid [OTTL] Texp Tsig Kfoot Signer Sig
@ -2097,7 +2168,7 @@ parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size,
u_int32_t origTTL;
enum context context;
time_t now;
char *errtype = "SIG error";
const char *errtype = "SIG error";
int i, my_buf_size = MAXDATA, errs = 0;
@ -2122,7 +2193,7 @@ parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size,
if (buf && buf_len == 0)
if (!getmlword((char*)buf, my_buf_size, fp, 0))
ERRTO("SIG record doesn't specify type");
sig_type = sym_ston(__p_type_syms, buf, &success);
sig_type = res_nametotype(buf, &success);
if (!success || sig_type == ns_t_any) {
/*
* We'll also accept a numeric RR type,
@ -2324,9 +2395,9 @@ parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size,
}
static int
parse_nxt_rr(char *buf, int buf_len, u_char *data, int data_size,
FILE *fp, struct zoneinfo *zp, char *domain, enum context context,
enum transport transport, char **errmsg)
parse_nxt_rr(char *buf, u_char *data, int data_size, FILE *fp,
struct zoneinfo *zp, char *domain, enum context context,
enum transport transport, const char **errmsg)
{
/* The NXT record looks like:
@ -2364,7 +2435,7 @@ parse_nxt_rr(char *buf, int buf_len, u_char *data, int data_size,
static int
parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
FILE *fp, char **errmsg)
FILE *fp, const char **errmsg)
{
/* Cert record looks like:
* Type Key_tag Alg Cert
@ -2375,7 +2446,7 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
*/
u_char *cp;
u_int32_t cert_type, key_tag, alg;
char *errtype = "CERT parse error";
const char *errtype = "CERT parse error";
int certlen, i, n, success;
i = 0;
@ -2386,6 +2457,8 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
if (wordtouint32_error || cert_type > 0xFFFF)
ERRTO("CERT type out of range");
}
if (i + INT16SZ > data_size)
ERRTO("CERT no space");
PUTSHORT((u_int16_t)cert_type, cp);
i += INT16SZ;
@ -2396,6 +2469,8 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
if (wordtouint32_error || key_tag > 0xFFFF)
ERRTO("CERT KEY tag out of range");
if (i + INT16SZ > data_size)
ERRTO("CERT no space");
PUTSHORT((u_int16_t)key_tag, cp);
i += INT16SZ;
@ -2408,7 +2483,8 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
if (wordtouint32_error || alg > 0xFF)
ERRTO("CERT KEY alg out of range");
}
if (i + 1 > data_size)
ERRTO("CERT no space");
data[i++] = (u_char)alg;
if (!getallwords(buf, buf_len, fp, 0)) {
@ -2431,8 +2507,7 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
static int
parse_key_rr(char *buf, int buf_len, u_char *data, int data_size,
FILE *fp, struct zoneinfo *zp, char *domain, enum context context,
enum transport transport, char **errmsg)
FILE *fp, const char **errmsg)
{
/* The KEY record looks like this in the db file:
* Name Cl KEY Flags Proto Algid PublicKeyData
@ -2449,7 +2524,7 @@ parse_key_rr(char *buf, int buf_len, u_char *data, int data_size,
u_int32_t al, pr;
int nk, klen,i, n;
u_int32_t keyflags;
char *errtype = "KEY error";
const char *errtype = "KEY error";
u_char *cp, *expstart;
u_int expbytes, modbytes;
@ -2636,7 +2711,7 @@ int
parse_sec_rdata(char *buf, int buf_len, int buf_full, u_char *data,
int data_size, FILE *fp, struct zoneinfo *zp,
char *domain, u_int32_t ttl, int type, enum context context,
enum transport transport, char **errmsg)
enum transport transport, const char **errmsg)
{
int ret = -1;
@ -2653,11 +2728,10 @@ parse_sec_rdata(char *buf, int buf_len, int buf_full, u_char *data,
domain, ttl, context, transport, errmsg);
break;
case ns_t_key:
ret = parse_key_rr(buf, buf_len, data, data_size, fp, zp,
domain, context, transport, errmsg);
ret = parse_key_rr(buf, buf_len, data, data_size, fp, errmsg);
break;
case ns_t_nxt:
ret = parse_nxt_rr(buf, buf_len, data, data_size, fp, zp,
ret = parse_nxt_rr(buf, data, data_size, fp, zp,
domain, context, transport, errmsg);
break;
case ns_t_cert:
@ -2673,4 +2747,3 @@ parse_sec_rdata(char *buf, int buf_len, int buf_full, u_char *data,
endline(fp);
return (ret);
}

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)db_lookup.c 4.18 (Berkeley) 3/21/91";
static const char rcsid[] = "$Id: db_lookup.c,v 8.26 2000/04/21 06:54:03 vixie Exp $";
static const char rcsid[] = "$Id: db_lookup.c,v 8.27 2001/06/18 14:42:55 marka Exp $";
#endif /* not lint */
/*
@ -258,7 +258,7 @@ match(struct databuf *dp, int class, int type) {
return (0);
if (dp->d_type != type && dp->d_type != T_SIG && type != T_ANY)
return (0);
if (type != T_SIG && dp->d_type == T_SIG && SIG_COVERS(dp) != type)
if (type != T_SIG && dp->d_type == T_SIG && (int)SIG_COVERS(dp) != type)
return (0);
return (1);
}

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)db_save.c 4.16 (Berkeley) 3/21/91";
static const char rcsid[] = "$Id: db_save.c,v 8.28 2000/11/29 06:55:48 marka Exp $";
static const char rcsid[] = "$Id: db_save.c,v 8.29 2001/04/25 13:53:09 marka Exp $";
#endif /* not lint */
/*
@ -158,6 +158,10 @@ savedata(class, type, ttl, data, size)
dp->d_rcode = NOERROR;
dp->d_addr.s_addr = htonl(0);
dp->d_nstime = 0;
dp->d_rcnt = 1;
#ifdef CHECK_MAGIC
dp->d_magic = DATABUF_MAGIC;
#endif
memcpy(dp->d_data, data, dp->d_size);
return (dp);
}

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: db_sec.c,v 8.32 2000/12/23 08:14:36 vixie Exp $";
static const char rcsid[] = "$Id: db_sec.c,v 8.35 2001/06/18 14:42:57 marka Exp $";
#endif /* not lint */
/*
@ -139,7 +139,7 @@ static struct zpubkey *
tree_srch_pubkey (const char *name) {
struct zpubkey tkey, *key;
tkey.zpk_name = (char *) name;
DE_CONST(name, tkey.zpk_name);
if (trusted_keys == NULL) {
tree_init(&trusted_keys);
return (NULL);
@ -270,7 +270,7 @@ convert_databuf(struct databuf *dp, struct converted_databuf *cdp) {
case ns_t_soa:
case ns_t_minfo:
case ns_t_rp:
if (eob - bp < strlen((char *)cp) + 1)
if (eob - bp < (int)strlen((char *)cp) + 1)
return (-1);
if (ns_name_pton((char *)cp, buf, sizeof buf) < 0)
return (-1);
@ -280,7 +280,7 @@ convert_databuf(struct databuf *dp, struct converted_databuf *cdp) {
bp += len;
cp += strlen((char *)cp) + 1;
if (eob - bp < strlen((char *)cp) + 1)
if (eob - bp < (int)strlen((char *)cp) + 1)
return (-1);
if (ns_name_pton((char *)cp, buf, sizeof buf) < 0)
return (-1);
@ -307,7 +307,7 @@ convert_databuf(struct databuf *dp, struct converted_databuf *cdp) {
case ns_t_mr:
case ns_t_ptr:
case ns_t_nxt:
if (eob - bp < strlen((char *)cp) + 1)
if (eob - bp < (int)strlen((char *)cp) + 1)
return (-1);
if (ns_name_pton((char *)cp, buf, sizeof buf) < 0)
return (-1);
@ -343,7 +343,7 @@ convert_databuf(struct databuf *dp, struct converted_databuf *cdp) {
bp += INT16SZ;
cp += INT16SZ;
if (eob - bp < strlen((char *)cp) + 1)
if (eob - bp < (int)strlen((char *)cp) + 1)
return (-1);
if (ns_name_pton((char *)cp, buf, sizeof buf) < 0)
return (-1);
@ -354,7 +354,7 @@ convert_databuf(struct databuf *dp, struct converted_databuf *cdp) {
cp += strlen((char *)cp) + 1;
if (dp->d_type == ns_t_px) {
if (eob - bp < strlen((char *)cp) + 1)
if (eob - bp < (int)strlen((char *)cp) + 1)
return (-1);
if (ns_name_pton((char *)cp, buf, sizeof buf) < 0)
return (-1);
@ -473,7 +473,7 @@ rrset_trim_sigs(struct db_rrset *rrset) {
}
}
int
static int
verify_set(struct db_rrset *rrset) {
DST_KEY *key = NULL;
struct sig_record *sigdata;
@ -527,13 +527,13 @@ verify_set(struct db_rrset *rrset) {
* Don't verify a set if the SIG inception time is in
* the future. This should be fixed before 2038 (BEW)
*/
if (ntohl(sigdata->sig_time_n) > now)
if ((time_t)ntohl(sigdata->sig_time_n) > now)
continue;
/* An expired set is dropped, but the data is not. */
if (ntohl(sigdata->sig_exp_n) < now) {
db_freedata(sigdp);
sigdn->dp = NULL;
if ((time_t)ntohl(sigdata->sig_exp_n) < now) {
db_detach(&sigdn->dp);
sigdp = NULL;
continue;
}
@ -715,8 +715,8 @@ verify_set(struct db_rrset *rrset) {
if (ret < 0) {
dnssec_failed++;
db_freedata(sigdp);
sigdn->dp = NULL;
db_detach(&sigdn->dp);
sigdp = NULL;
}
else
dnssec_succeeded++;
@ -746,40 +746,27 @@ end:
}
static void
rrset_free_partial(struct db_rrset *rrset, int free_data, struct dnode *start) {
rrset_free(struct db_rrset *rrset) {
struct dnode *dnp;
int found_start = 0;
ns_debug(ns_log_default, 5, "rrset_free(%s)", rrset->rr_name);
if (start == NULL)
found_start = 1;
while (rrset->rr_list) {
dnp = rrset->rr_list;
if (dnp == start)
found_start = 1;
rrset->rr_list = rrset->rr_list->dn_next;
if (dnp->dp != NULL && free_data == 1 && found_start == 1)
db_freedata(dnp->dp);
if (dnp->dp != NULL)
db_detach(&dnp->dp);
memput(dnp, sizeof(struct dnode));
}
while (rrset->rr_sigs) {
dnp = rrset->rr_sigs;
if (dnp == start)
found_start = 1;
rrset->rr_sigs = rrset->rr_sigs->dn_next;
if (dnp->dp != NULL && free_data == 1 && found_start == 1)
db_freedata(dnp->dp);
if (dnp->dp != NULL)
db_detach(&dnp->dp);
memput(dnp, sizeof(struct dnode));
}
}
static void
rrset_free(struct db_rrset *rrset, int free_data) {
rrset_free_partial(rrset, free_data, NULL);
}
/*
* This is called when we have an rrset with SIGs and no other data.
* Returns 1 if we either found the necessary data or if the SIG can be added
@ -838,7 +825,6 @@ rrset_db_update(struct db_rrset *rrset, int flags, struct hashbuf **htpp,
struct sockaddr_in from, int *rrcount)
{
struct dnode *dnp;
struct databuf *dp;
int ret;
/* If we have any unattached SIG records that are DNSSEC signatures,
@ -848,57 +834,51 @@ rrset_db_update(struct db_rrset *rrset, int flags, struct hashbuf **htpp,
*/
if (rrset->rr_list == NULL) {
if (attach_data(rrset) == 0) {
rrset_free(rrset, 1);
rrset_free(rrset);
return (OK);
}
if (rrset->rr_list != NULL &&
verify_set(rrset) == DB_S_FAILED)
{
rrset_free(rrset, 1);
rrset_free(rrset);
return (OK);
}
}
for (dnp = rrset->rr_list; dnp != NULL; dnp = dnp->dn_next) {
dp = dnp->dp;
ret = db_update(rrset->rr_name, dp, dp, NULL,
ret = db_update(rrset->rr_name, dnp->dp, dnp->dp, NULL,
flags, (*htpp), from);
if (ret != OK) {
/* XXX Probably should do rollback. */
db_err(ret, rrset->rr_name, dp->d_type,
db_err(ret, rrset->rr_name, dnp->dp->d_type,
dnp->file, dnp->line);
if (ret != DATAEXISTS) {
rrset_free_partial(rrset, 1, dnp);
rrset_free(rrset);
return (ret);
}
db_freedata(dp);
}
if (rrcount != NULL)
(*rrcount)++;
dnp->dp = NULL;
}
for (dnp = rrset->rr_sigs; dnp != NULL; dnp = dnp->dn_next) {
dp = dnp->dp;
if (dp == NULL) /* verifyset() can remove sigs */
if (dnp->dp == NULL) /* verifyset() can remove sigs */
continue;
ret = db_update(rrset->rr_name, dp, dp, NULL,
ret = db_update(rrset->rr_name, dnp->dp, dnp->dp, NULL,
flags, (*htpp), from);
if (ret != OK) {
/* XXX Probably should do rollback. */
db_err(ret, rrset->rr_name, dp->d_type,
db_err(ret, rrset->rr_name, dnp->dp->d_type,
dnp->file, dnp->line);
if (ret != DATAEXISTS) {
rrset_free_partial(rrset, 1, dnp);
rrset_free(rrset);
return (ret);
}
db_freedata(dp);
}
if (rrcount != NULL)
(*rrcount)++;
dnp->dp = NULL;
}
rrset_free(rrset, 0);
rrset_free(rrset);
return (OK);
}
@ -927,7 +907,7 @@ add_to_rrset_list(struct db_rrset **rrsets, char *name, struct databuf *dp,
while (rrset != NULL) {
if (rrset->rr_type != ns_t_nxt || dp->d_type != ns_t_nxt) {
if (dp->d_type == ns_t_sig) {
if (SIG_COVERS(dp) == rrset->rr_type)
if ((int)SIG_COVERS(dp) == rrset->rr_type)
break;
} else {
if (dp->d_type == rrset->rr_type)
@ -942,10 +922,7 @@ add_to_rrset_list(struct db_rrset **rrsets, char *name, struct databuf *dp,
if (rrset != NULL) {
if ((dp->d_type == ns_t_sig && rr_in_set(dp, rrset->rr_sigs)) ||
(dp->d_type != ns_t_sig && rr_in_set(dp, rrset->rr_list)))
{
db_freedata(dp);
return (DATAEXISTS);
}
} else {
rrset = (struct db_rrset *) memget(sizeof(struct db_rrset));
if (rrset == NULL)
@ -968,6 +945,7 @@ add_to_rrset_list(struct db_rrset **rrsets, char *name, struct databuf *dp,
"add_to_rrset_list: memget failed(%s)", name);
memset(dnp, 0, sizeof(struct dnode));
dnp->dp = dp;
DRCNTINC(dnp->dp);
if (dp->d_type == ns_t_sig) {
if (rrset->rr_sigs != NULL) {
struct dnode *fdnp;
@ -995,7 +973,7 @@ add_to_rrset_list(struct db_rrset **rrsets, char *name, struct databuf *dp,
} else
rrset->rr_list = dnp;
}
dnp->file = (char *) file;
dnp->file = file;
dnp->line = line;
return (0);
}
@ -1035,10 +1013,10 @@ update_rrset_list(struct db_rrset **rrsets, int flags, struct hashbuf **htpp,
result = tresult;
}
else {
rrset_free(rrset, 1);
rrset_free(rrset);
result = DNSSECFAIL;
}
freestr(rrset->rr_name);
rrset->rr_name = freestr(rrset->rr_name);
next = rrset->rr_next;
memput(rrset, sizeof(struct db_rrset));
rrset = next;

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: db_tsig.c,v 8.6 2000/04/21 06:54:04 vixie Exp $";
static const char rcsid[] = "$Id: db_tsig.c,v 8.7 2001/06/18 14:42:59 marka Exp $";
#endif /* not lint */
/*
@ -110,7 +110,7 @@ typedef struct {
#define TSIG_ALG_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
#define TSIG_ALG_MD5_SHORT "hmac-md5"
char *
const char *
tsig_alg_name(int value) {
if (value == KEY_HMAC_MD5)
return(TSIG_ALG_MD5);

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)db_update.c 4.28 (Berkeley) 3/21/91";
static const char rcsid[] = "$Id: db_update.c,v 8.46 2001/02/08 02:05:51 marka Exp $";
static const char rcsid[] = "$Id: db_update.c,v 8.50 2001/10/24 23:53:09 marka Exp $";
#endif /* not lint */
/*
@ -117,7 +117,7 @@ isRefByNS(const char *name, struct hashbuf *htp) {
dp->d_class == C_HS) &&
dp->d_type == T_NS &&
!dp->d_rcode &&
ns_samename(name, (char *)dp->d_data) == 1) {
ns_samename(name, (const char *)dp->d_data) == 1) {
return (1);
}
}
@ -227,7 +227,7 @@ db_update(const char *name,
struct databuf *tmpdp;
#endif
ns_debug(ns_log_db, 3, "db_update(%s, %#x, %#x, %#x, 0%o, %#x)%s",
ns_debug(ns_log_db, 3, "db_update(%s, %p, %p, %p, 0%o, %p)%s",
name, odp, newdp, savedpp, flags, htp,
(odp && (odp->d_flags&DB_F_HINT)) ? " hint" : "");
np = nlookup(name, &htp, &fname, newdp != NULL);
@ -267,9 +267,21 @@ db_update(const char *name,
if (newdp && zn && !(flags & DB_NOTAUTH)) {
if (nlabels(zones[zn].z_origin) > newdp->d_clev) {
ns_debug(ns_log_db, 5,
"attempted update child zone %s, %s",
zones[zn].z_origin, name);
if ((!ISVALIDGLUE(newdp) &&
zones[newdp->d_zone].z_type == Z_PRIMARY) ||
(newdp->d_type == T_NS &&
!ns_samename(name, zones[zn].z_origin))) {
ns_info(ns_log_db,
"domain %s %s record in zone %s should be in zone %s",
name, p_type(newdp->d_type),
zones[newdp->d_zone].z_origin,
zones[zn].z_origin);
return (NONGLUE);
} else
ns_debug(ns_log_db, 5,
"attempted update child zone %s, %s %s",
zones[zn].z_origin, name,
p_type(newdp->d_type));
return (AUTH);
}
}
@ -319,11 +331,10 @@ db_update(const char *name,
dp, dp, NULL,
(flags|DB_NOHINTS),
fcachetab, from)
!= OK) {
!= OK)
ns_debug(ns_log_db, 3,
"db_update: hint %#x freed", dp);
db_freedata(dp);
}
"db_update: hint %p freed", dp);
db_detach(&dp);
}
if (odp != NULL) {
@ -749,7 +760,7 @@ db_update(const char *name,
* response source address here if flags&NOTAUTH.
*/
fixttl(newdp);
ns_debug(ns_log_db, 3, "db_update: adding%s %#x",
ns_debug(ns_log_db, 3, "db_update: adding%s %p",
(newdp->d_flags&DB_F_HINT) ? " hint":"", newdp);
if (newdp->d_zone == DB_Z_CACHE &&
@ -840,7 +851,8 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) {
case T_MG:
case T_MR:
/* Only a domain name */
if (ns_samename((char *)dp1->d_data, (char *)dp2->d_data) == 1)
if (ns_samename((const char *)dp1->d_data,
(const char *)dp2->d_data) == 1)
return (0);
else
return (1);
@ -852,9 +864,9 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) {
if (memcmp(dp1->d_data, dp2->d_data, NS_SIG_SIGNER))
return (1);
len = NS_SIG_SIGNER +
strlen((char *)dp1->d_data + NS_SIG_SIGNER);
if (ns_samename((char *)dp1->d_data + NS_SIG_SIGNER,
(char *)dp2->d_data + NS_SIG_SIGNER) != 1)
strlen((const char *)dp1->d_data + NS_SIG_SIGNER);
if (ns_samename((const char *)dp1->d_data + NS_SIG_SIGNER,
(const char *)dp2->d_data + NS_SIG_SIGNER) != 1)
return (1);
return (memcmp(dp1->d_data + len,
dp2->d_data + len,
@ -862,9 +874,10 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) {
case T_NXT:
/* First a domain name, then binary data */
if (ns_samename((char *)dp1->d_data, (char *)dp2->d_data) != 1)
if (ns_samename((const char *)dp1->d_data,
(const char *)dp2->d_data) != 1)
return (1);
len = strlen((char *)dp1->d_data)+1;
len = strlen((const char *)dp1->d_data)+1;
return (memcmp(dp1->d_data + len,
dp2->d_data + len,
dp1->d_size - len));
@ -877,7 +890,7 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) {
len2 = *cp2;
if (len != len2)
return (1);
if (strncasecmp((char *)++cp1, (char *)++cp2, len))
if (strncasecmp((const char *)++cp1, (const char *)++cp2, len))
return (1);
cp1 += len;
cp2 += len;
@ -885,21 +898,23 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) {
len2 = *cp2;
if (len != len2)
return (1);
return (strncasecmp((char *)++cp1, (char *)++cp2, len));
return (strncasecmp((const char *)++cp1, (const char *)++cp2,
len));
case T_SOA:
case T_MINFO:
case T_RP:
if (ns_samename((char *)dp1->d_data, (char *)dp2->d_data) != 1)
if (ns_samename((const char *)dp1->d_data,
(const char *)dp2->d_data) != 1)
return (1);
cp1 = dp1->d_data + strlen((char *)dp1->d_data) + 1;
cp2 = dp2->d_data + strlen((char *)dp2->d_data) + 1;
if (ns_samename((char *)cp1, (char *)cp2) != 1)
cp1 = dp1->d_data + strlen((const char *)dp1->d_data) + 1;
cp2 = dp2->d_data + strlen((const char *)dp2->d_data) + 1;
if (ns_samename((const char *)cp1, (const char *)cp2) != 1)
return (1);
if (dp1->d_type != T_SOA)
return (0);
cp1 += strlen((char *)cp1) + 1;
cp2 += strlen((char *)cp2) + 1;
cp1 += strlen((const char *)cp1) + 1;
cp2 += strlen((const char *)cp2) + 1;
return (memcmp(cp1, cp2, INT32SZ * 5));
case T_NAPTR: {
@ -937,7 +952,7 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) {
cp1 += t1; cp2 += t2;
/* Replacement */
if (ns_samename((char *)cp1, (char *)cp2) != 1)
if (ns_samename((const char *)cp1, (const char *)cp2) != 1)
return (1);
/* they all checked out! */
@ -958,7 +973,7 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) {
if (*cp1++ != *cp2++ || *cp1++ != *cp2++) /* port */
return (1);
}
if (ns_samename((char *)cp1, (char *)cp2) != 1)
if (ns_samename((const char *)cp1, (const char *)cp2) != 1)
return (1);
return (0);
@ -967,11 +982,11 @@ db_cmp(const struct databuf *dp1, const struct databuf *dp2) {
cp2 = dp2->d_data;
if (*cp1++ != *cp2++ || *cp1++ != *cp2++) /* cmp prio */
return (1);
if (ns_samename((char *)cp1, (char *)cp2) != 1)
if (ns_samename((const char *)cp1, (const char *)cp2) != 1)
return (1);
cp1 += strlen((char *)cp1) + 1;
cp2 += strlen((char *)cp2) + 1;
if (ns_samename((char *)cp1, (char *)cp2) != 1)
cp1 += strlen((const char *)cp1) + 1;
cp2 += strlen((const char *)cp2) + 1;
if (ns_samename((const char *)cp1, (const char *)cp2) != 1)
return (1);
return (0);

View File

@ -14,6 +14,16 @@
// watch out for ";" -- it's important!
key sample_key { // for TSIG
algorithm hmac-md5; // hmac-md5 is the supported algorithm
secret "abcdefgh"; // base 64 encoded secret
};
key key2 {
algorithm hmac-md5;
secret "87654321";
};
options {
directory "."; // use current directory
named-xfer "/usr/libexec/named-xfer"; // _PATH_XFER
@ -42,7 +52,7 @@ options {
// notify on a zone-by-zone
// basis in the "zone" statement
// see (below)
max-serial-queries 4; // number of parallel SOA queries
serial-queries 4; // number of parallel SOA queries
// we can have outstanding for master
// zone change testing purposes
auth-nxdomain yes; // always set AA on NXDOMAIN.
@ -194,7 +204,7 @@ zone "slave.demo.zone" {
ixfr-base "slave.demo.zone.ixfr"; // File name for IXFR transaction log file
masters {
1.2.3.4; // where to zone transfer from
5.6.7.8;
5.6.7.8 key key2;
};
transfer-source 10.0.0.53; // fixes multihoming problems
check-names warn;
@ -250,16 +260,6 @@ zone "non-default-acl.demo.zone" {
};
};
key sample_key { // for TSIG
algorithm hmac-md5; // hmac-md5 is the supported algorithm
secret "abcdefgh"; // base 64 encoded secret
};
key key2 {
algorithm hmac-md5;
secret "87654321";
};
acl key_acl { key sample_key; }; // a request signed with sample_key
server 1.2.3.4 {

View File

@ -16,7 +16,7 @@
*/
/*
* $Id: named.h,v 8.28 2001/02/12 05:56:15 marka Exp $
* $Id: named.h,v 8.31 2002/02/01 00:05:38 marka Exp $
*/
/* Options. Change them at your peril. */
@ -28,7 +28,7 @@
#define TRACEROOT
#define XFRNETS
#define QRYLOG
#define YPKLUDGE
#undef YPKLUDGE
#define RENICE
#define BIND_IXFR
#define BIND_NOTIFY
@ -45,6 +45,8 @@
#define STRICT_RFC2308
#undef BIND_ZXFR
#undef LOG_TSIG_BUG
#define NOADDITIONAL
#undef FORWARD_ALLOWS /* enable allow-query for forward zones. */
#include <isc/assertions.h>
#include <isc/list.h>

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_config.c,v 8.121 2001/02/08 02:05:53 marka Exp $";
static const char rcsid[] = "$Id: ns_config.c,v 8.133 2002/02/01 00:05:39 marka Exp $";
#endif /* not lint */
/*
@ -89,7 +89,6 @@ static int default_logging_installed;
static int options_installed = 0;
static int logging_installed = 0;
static int default_options_installed;
static int initial_configuration = 1;
static char **logging_categories;
static char *current_pid_filename = NULL;
@ -102,7 +101,7 @@ static symbol_table zone_symbol_table;
void
free_zone_timerinfo(struct zoneinfo *zp) {
if (zp->z_timerinfo != NULL) {
freestr(zp->z_timerinfo->name);
zp->z_timerinfo->name = freestr(zp->z_timerinfo->name);
memput(zp->z_timerinfo, sizeof *zp->z_timerinfo);
zp->z_timerinfo = NULL;
} else
@ -125,17 +124,13 @@ free_zone_contents(struct zoneinfo *zp, int undefine_sym) {
strerror(errno));
}
if (zp->z_origin != NULL)
freestr(zp->z_origin);
zp->z_origin = NULL;
zp->z_origin = freestr(zp->z_origin);
if (zp->z_source != NULL)
freestr(zp->z_source);
zp->z_source = NULL;
zp->z_source = freestr(zp->z_source);
if (zp->z_ixfr_base != NULL)
freestr(zp->z_ixfr_base);
zp->z_ixfr_base = NULL;
zp->z_ixfr_base = freestr(zp->z_ixfr_base);
if (zp->z_ixfr_tmp != NULL)
freestr(zp->z_ixfr_tmp);
zp->z_ixfr_tmp = NULL;
zp->z_ixfr_tmp = freestr(zp->z_ixfr_tmp);
if (zp->z_update_acl != NULL)
free_ip_match_list(zp->z_update_acl);
zp->z_update_acl = NULL;
@ -147,8 +142,7 @@ free_zone_contents(struct zoneinfo *zp, int undefine_sym) {
zp->z_transfer_acl = NULL;
#ifdef BIND_UPDATE
if (zp->z_updatelog != NULL)
freestr(zp->z_updatelog);
zp->z_updatelog = NULL;
zp->z_updatelog = freestr(zp->z_updatelog);
#endif /* BIND_UPDATE */
#ifdef BIND_NOTIFY
if (zp->z_also_notify != NULL)
@ -156,6 +150,9 @@ free_zone_contents(struct zoneinfo *zp, int undefine_sym) {
zp->z_notify_count * sizeof *zp->z_also_notify);
zp->z_also_notify = NULL;
#endif
if (zp->z_fwdtab != NULL)
free_forwarders(zp->z_fwdtab);
zp->z_fwdtab = NULL;
block_signals();
if (LINKED(zp, z_reloadlink))
UNLINK(reloadingzones, zp, z_reloadlink);
@ -189,7 +186,7 @@ find_zone(const char *name, int class) {
}
static struct zoneinfo *
new_zone(int class, int type) {
new_zone(void) {
struct zoneinfo *zp;
if (EMPTY(freezones))
@ -303,9 +300,16 @@ validate_zone(struct zoneinfo *zp) {
if (zp->z_query_acl) {
if (zp->z_type != z_master &&
zp->z_type != z_slave &&
#ifdef FORWARD_ALLOWS
zp->z_type != z_forward &&
#endif
zp->z_type != z_stub) {
ns_error(ns_log_config,
#ifdef FORWARD_ALLOWS
"'allow-query' option for hint zone '%s'",
#else
"'allow-query' option for non-{master,slave,stub} zone '%s'",
#endif
zp->z_origin);
return (0);
}
@ -472,7 +476,7 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
* any data that was dynamically allocated.
*/
if (zp->z_origin != NULL)
freestr(zp->z_origin);
(void)freestr(zp->z_origin);
zp->z_origin = new_zp->z_origin;
new_zp->z_origin = NULL;
zp->z_maintain_ixfr_base = new_zp->z_maintain_ixfr_base;
@ -480,8 +484,10 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
zp->z_class = new_zp->z_class;
zp->z_type = new_zp->z_type;
zp->z_checknames = new_zp->z_checknames;
for (i = 0; i < new_zp->z_addrcnt; i++)
for (i = 0; i < new_zp->z_addrcnt; i++) {
zp->z_addr[i] = new_zp->z_addr[i];
zp->z_keys[i] = new_zp->z_keys[i];
}
zp->z_addrcnt = new_zp->z_addrcnt;
if (zp->z_update_acl)
free_ip_match_list(zp->z_update_acl);
@ -529,7 +535,7 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
zp->z_dumpintvl = new_zp->z_dumpintvl;
zp->z_deferupdcnt = new_zp->z_deferupdcnt;
if (zp->z_updatelog)
freestr(zp->z_updatelog);
(void)freestr(zp->z_updatelog);
zp->z_updatelog = new_zp->z_updatelog;
new_zp->z_updatelog = NULL;
#endif /* BIND_UPDATE */
@ -554,7 +560,7 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
/* File has changed, or hasn't been loaded yet. */
if (zp->z_source) {
freestr(zp->z_source);
zp->z_source = freestr(zp->z_source);
ns_stopxfrs(zp);
purge_zone(zp->z_origin, fcachetab, zp->z_class);
}
@ -562,12 +568,12 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
new_zp->z_source = NULL;
if (zp->z_ixfr_base)
freestr(zp->z_ixfr_base);
(void)freestr(zp->z_ixfr_base);
zp->z_ixfr_base = new_zp->z_ixfr_base;
new_zp->z_ixfr_base = NULL;
if (zp->z_ixfr_tmp)
freestr(zp->z_ixfr_tmp);
(void)freestr(zp->z_ixfr_tmp);
zp->z_ixfr_tmp = new_zp->z_ixfr_tmp;
new_zp->z_ixfr_tmp = NULL;
@ -597,17 +603,17 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
primary_reload:
#endif /* BIND_UPDATE */
if (zp->z_source != NULL)
freestr(zp->z_source);
(void)freestr(zp->z_source);
zp->z_source = new_zp->z_source;
new_zp->z_source = NULL;
if (zp->z_ixfr_base != NULL)
freestr(zp->z_ixfr_base);
(void)freestr(zp->z_ixfr_base);
zp->z_ixfr_base = new_zp->z_ixfr_base;
new_zp->z_ixfr_base = NULL;
if (zp->z_ixfr_tmp != NULL)
freestr(zp->z_ixfr_tmp);
(void)freestr(zp->z_ixfr_tmp);
zp->z_ixfr_tmp = new_zp->z_ixfr_tmp;
new_zp->z_ixfr_tmp = NULL;
@ -649,8 +655,7 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
((!reconfiging) && zonefile_changed_p(zp)))) {
ns_debug(ns_log_config, 1,
"backup file changed or missing");
freestr(zp->z_source);
zp->z_source = NULL;
zp->z_source = freestr(zp->z_source);
zp->z_serial = 0; /* force xfer */
ns_stopxfrs(zp);
/*
@ -674,7 +679,7 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
}
if (zp->z_ixfr_base != NULL)
freestr(zp->z_ixfr_base);
(void)freestr(zp->z_ixfr_base);
zp->z_ixfr_base = new_zp->z_ixfr_base;
new_zp->z_ixfr_base = NULL;
@ -727,7 +732,7 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
void
end_zone(zone_config zh, int should_install) {
struct zoneinfo *zp, *new_zp;
char *zname;
const char *zname;
symbol_value value;
new_zp = zh.opaque;
@ -753,11 +758,11 @@ end_zone(zone_config zh, int should_install) {
zp = NULL;
}
if (zp == NULL) {
zp = new_zone(new_zp->z_class, new_zp->z_type);
zp = new_zone();
INSIST(zp != NULL);
value.integer = (zp - zones);
define_symbol(zone_symbol_table, savestr(new_zp->z_origin, 1),
new_zp->z_class, value, SYMBOL_FREE_KEY);
define_symbol(zone_symbol_table, new_zp->z_origin,
new_zp->z_class, value, 0);
}
ns_debug(ns_log_config, 5, "zone '%s', type = %d, class = %d", zname,
new_zp->z_type, new_zp->z_class);
@ -930,7 +935,7 @@ set_zone_query_acl(zone_config zh, ip_match_list iml) {
zp = zh.opaque;
INSIST(zp != NULL);
/* Fail if checknames already set for this zone */
/* Fail if allow-query acl already set for this zone */
if (zp->z_query_acl != NULL)
return (0);
zp->z_query_acl = iml;
@ -960,7 +965,7 @@ set_zone_transfer_acl(zone_config zh, ip_match_list iml) {
zp = zh.opaque;
INSIST(zp != NULL);
/* Fail if checknames already set for this zone */
/* Fail if allow-transfer acl already set for this zone */
if (zp->z_transfer_acl != NULL)
return (0);
zp->z_transfer_acl = iml;
@ -974,7 +979,7 @@ set_zone_transfer_time_in(zone_config zh, long max_time) {
zp = zh.opaque;
INSIST(zp != NULL);
/* Fail if checknames already set for this zone */
/* Fail if max-transfer-time-in already set for this zone */
if (zp->z_max_transfer_time_in)
return (0);
zp->z_max_transfer_time_in = max_time;
@ -1013,13 +1018,14 @@ set_trusted_key(const char *name, const int flags, const int proto,
}
int
add_zone_master(zone_config zh, struct in_addr address) {
add_zone_master(zone_config zh, struct in_addr address, struct dst_key * key) {
struct zoneinfo *zp;
zp = zh.opaque;
INSIST(zp != NULL);
zp->z_addr[zp->z_addrcnt] = address;
zp->z_keys[zp->z_addrcnt] = key;
zp->z_addrcnt++;
if (zp->z_addrcnt >= NSMAX) {
ns_warning(ns_log_config, "NSMAX reached for zone '%s'",
@ -1084,12 +1090,17 @@ add_zone_notify(zone_config zh, struct in_addr address) {
options
new_options() {
options op;
char hostname[256];
op = (options)memget(sizeof (struct options));
if (op == NULL)
panic("memget failed in new_options()", NULL);
op->version = savestr(ShortVersion, 1);
if (gethostname(hostname, sizeof(hostname)) == 0)
op->hostname = savestr(hostname, 1);
else
op->hostname = NULL;
op->directory = savestr(".", 1);
op->pid_filename = savestr(_PATH_PIDFILE, 1);
op->named_xfer = savestr(_PATH_XFER, 1);
@ -1136,8 +1147,9 @@ new_options() {
op->max_host_stats = 0;
op->lame_ttl = NTTL;
op->heartbeat_interval = 3600;
op->max_log_size_ixfr = 20;
op->max_log_size_ixfr = 0;
op->minroots = MINROOTS;
op->preferred_glue = 0;
return (op);
}
@ -1145,20 +1157,22 @@ void
free_options(options op) {
INSIST(op != NULL);
if (op->hostname)
op->hostname = freestr(op->hostname);
if (op->version)
freestr(op->version);
op->version = freestr(op->version);
if (op->directory)
freestr(op->directory);
op->directory = freestr(op->directory);
if (op->pid_filename)
freestr(op->pid_filename);
op->pid_filename = freestr(op->pid_filename);
if (op->named_xfer)
freestr(op->named_xfer);
op->named_xfer = freestr(op->named_xfer);
if (op->dump_filename)
freestr(op->dump_filename);
op->dump_filename = freestr(op->dump_filename);
if (op->stats_filename)
freestr(op->stats_filename);
op->stats_filename = freestr(op->stats_filename);
if (op->memstats_filename)
freestr(op->memstats_filename);
op->memstats_filename = freestr(op->memstats_filename);
#ifdef BIND_NOTIFY
if (op->also_notify)
free_also_notify(op);
@ -1197,6 +1211,7 @@ set_boolean_option(u_int *op_flags, int bool_opt, int value) {
case OPTION_FORWARD_ONLY:
case OPTION_FAKE_IQUERY:
case OPTION_NONOTIFY:
case OPTION_SUPNOTIFY_INITIAL:
case OPTION_NONAUTH_NXDOMAIN:
case OPTION_MULTIPLE_CNAMES:
case OPTION_USE_IXFR:
@ -1290,7 +1305,7 @@ ns_rlimit(enum limit limit, u_long limit_value) {
struct rlimit limits, old_limits;
int rlimit = -1;
int fdlimit = evHighestFD(ev) + 1;
char *name;
const char *name;
rlimit_type value;
if (limit_value == ULONG_MAX) {
@ -1337,7 +1352,7 @@ ns_rlimit(enum limit limit, u_long limit_value) {
name = "max number of open files";
if (value == 0)
limits = initial_num_files;
if (value > fdlimit)
if ((int)value > fdlimit)
limits.rlim_cur = limits.rlim_max = value = fdlimit;
break;
default:
@ -1455,8 +1470,10 @@ write_open(char *filename) {
return (NULL);
(void) fchown(fd, user_id, group_id);
stream = fdopen(fd, "w");
if (stream == NULL)
if (stream == NULL) {
(void)unlink(filename);
(void)close(fd);
}
return (stream);
}
@ -1470,8 +1487,7 @@ update_pid_file() {
/* XXX */ ns_debug(ns_log_default, 1, "update_pid_file()");
if (current_pid_filename != NULL) {
(void)unlink(current_pid_filename);
freestr(current_pid_filename);
current_pid_filename = NULL;
current_pid_filename = freestr(current_pid_filename);
}
current_pid_filename = savestr(server_options->pid_filename, 0);
if (current_pid_filename == NULL) {
@ -1521,6 +1537,11 @@ static void
periodic_getnetconf(evContext ctx, void *uap, struct timespec due,
struct timespec inter)
{
UNUSED(ctx);
UNUSED(uap);
UNUSED(due);
UNUSED(inter);
getnetconf(1);
}
@ -1709,11 +1730,11 @@ use_default_options() {
* rrset order types
*/
static struct res_sym order_table [] = {
{ unknown_order, " unknown " }, /* can't match */
{ fixed_order, "fixed" },
{ cyclic_order, "cyclic" },
{ random_order, "random" },
{ unknown_order, NULL }
{ unknown_order, " unknown ", NULL }, /* can't match */
{ fixed_order, "fixed", NULL },
{ cyclic_order, "cyclic", NULL },
{ random_order, "random", NULL },
{ unknown_order, NULL, NULL }
};
/*
@ -1759,7 +1780,7 @@ free_rrset_order_list(rrset_order_list rol) {
for (roe = rol->first; roe != NULL; roe = next_element) {
next_element = roe->next;
freestr(roe->name);
roe->name = freestr(roe->name);
memput(roe, sizeof (*roe));
}
memput(rol, sizeof (*rol));
@ -1778,6 +1799,7 @@ add_to_rrset_order_list(rrset_order_list rol, rrset_order_element roe) {
rol->first = roe;
}
#ifdef notyet
/* XXX this isn't being used yet, but it probably should be. Where? */
void
dprint_rrset_order_list(int category, rrset_order_list rol, int indent,
@ -1799,7 +1821,7 @@ dprint_rrset_order_list(int category, rrset_order_list rol, int indent,
roe->name, p_order(roe->order));
}
}
#endif
rrset_order_element
new_rrset_order_element(int class, int type, char *name, enum ordering order)
@ -1986,7 +2008,7 @@ add_to_ip_match_list(ip_match_list iml, ip_match_element ime) {
void
dprint_ip_match_list(int category, ip_match_list iml, int indent,
char *allow, char *deny) {
const char *allow, const char *deny) {
ip_match_element ime;
char spaces[40+1];
char addr_text[sizeof "255.255.255.255"];
@ -2083,6 +2105,7 @@ ip_match_addr_or_key(ip_match_list iml, struct in_addr address,
continue;
}
default:
indirect = 0;
panic("unexpected ime type in ip_match_addr_or_key()",
NULL);
}
@ -2278,7 +2301,6 @@ find_forwarder(struct in_addr address)
{
struct fwddata *fdp;
struct fwddata **fdpp = NULL;
struct databuf *ns, *nsdata;
register int i;
for (i = 0; i < fwddata_count; i++) {
@ -2299,28 +2321,19 @@ find_forwarder(struct in_addr address)
if (!fdp)
panic("memget failed in find_forwarder", NULL);
memset(&fdp->fwdaddr, 0, sizeof(fdp->fwdaddr));
fdp->fwdaddr.sin_family = AF_INET;
fdp->fwdaddr.sin_addr = address;
fdp->fwdaddr.sin_port = ns_port;
ns = fdp->ns = (struct databuf *)memget(sizeof(*ns));
if (!ns)
fdp->ns = savedata(C_IN, T_NS, 0, NULL, 0);
if (!fdp->ns)
panic("memget failed in find_forwarder", NULL);
memset(ns, 0, sizeof(*ns));
nsdata = fdp->nsdata = (struct databuf *)memget(sizeof(*nsdata));
if (!nsdata)
fdp->nsdata = savedata(C_IN, T_A, 0, NULL, 0);
if (!fdp->nsdata)
panic("memget failed in find_forwarder", NULL);
memset(nsdata, 0, sizeof(*nsdata));
ns->d_type = T_NS;
ns->d_class = C_IN;
ns->d_rcnt = 1;
nsdata->d_type = T_A;
nsdata->d_class = C_IN;
nsdata->d_nstime = 1 + (int)(25.0*rand()/(RAND_MAX + 1.0));
nsdata->d_rcnt = 1;
fdp->nsdata->d_nstime = 1 + (int)(25.0*rand()/(RAND_MAX + 1.0));
fdp->ref_count = 1;
@ -2480,7 +2493,7 @@ set_zone_forward(zone_config zh) {
void
add_zone_forwarder(zone_config zh, struct in_addr address) {
struct zoneinfo *zp;
char *zname;
const char *zname;
zp = zh.opaque;
INSIST(zp != NULL);
@ -2507,9 +2520,8 @@ free_forwarders(struct fwdinfo *fwdtab) {
fwddata[i] = NULL;
break;
}
memput(ftp->fwddata->ns, sizeof *ftp->fwddata->ns);
memput(ftp->fwddata->nsdata,
sizeof *ftp->fwddata->nsdata);
db_detach(&ftp->fwddata->ns);
db_detach(&ftp->fwddata->nsdata);
memput(ftp->fwddata, sizeof *ftp->fwddata);
}
memput(ftp, sizeof *ftp);
@ -2543,7 +2555,8 @@ new_server(struct in_addr address) {
static void
free_server(server_info si) {
/* Don't free key; it'll be done when the auth table is freed. */
if (si->key_list)
free_key_info_list(si->key_list);
memput(si, sizeof *si);
}
@ -2999,7 +3012,7 @@ use_default_logging() {
static void
init_default_log_channels() {
u_int flags;
char *name;
const char *name;
FILE *stream;
syslog_channel = log_new_syslog_channel(0, log_info, ISC_FACILITY);
@ -3072,7 +3085,8 @@ shutdown_logging() {
log_free_context(log_ctx);
for (s = category_constants; s != NULL && s->name != NULL; s++)
freestr(logging_categories[s->number]);
logging_categories[s->number] =
freestr(logging_categories[s->number]);
size = ns_log_max_category * (sizeof (char *));
memput(logging_categories, size);
logging_categories = NULL;
@ -3108,11 +3122,15 @@ shutdown_configuration() {
server_options = NULL;
}
if (current_pid_filename != NULL)
freestr(current_pid_filename);
current_pid_filename = freestr(current_pid_filename);
free_nameserver_info();
free_secretkey_info();
free_symbol_table(zone_symbol_table);
parser_shutdown();
if (fwddata != NULL)
memput(fwddata, fwddata_count * sizeof *fwddata);
fwddata = NULL;
fwddata_count = 0;
config_initialized = 0;
}

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_ctl.c,v 8.39 2000/12/19 23:31:38 marka Exp $";
static const char rcsid[] = "$Id: ns_ctl.c,v 8.46 2001/12/19 11:53:48 marka Exp $";
#endif /* not lint */
/*
@ -91,55 +91,56 @@ static void propagate_changes(const control, control);
static void install(control);
static void install_inet(control);
static void install_unix(control);
static void logger(enum ctl_severity, const char *fmt, ...);
static void logger(enum ctl_severity, const char *fmt, ...)
ISC_FORMAT_PRINTF(2,3);
static void verb_connect(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_getpid(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void getpid_closure(struct ctl_sctx *, struct ctl_sess *,
void *);
static void verb_status(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void status_closure(struct ctl_sctx *, struct ctl_sess *,
void *);
static void verb_stop(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_exec(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_reload(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_reconfig(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_dumpdb(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_stats(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_trace(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void trace_closure(struct ctl_sctx *, struct ctl_sess *,
void *);
static void verb_notrace(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_querylog(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_help(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
static void verb_quit(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *,
const char *, u_int, void *, void *);
const char *, u_int, const void *, void *);
/* Private data. */
@ -226,7 +227,7 @@ ns_ctl_new_inet(struct in_addr saddr, u_int sport, ip_match_list allow) {
#ifndef NO_SOCKADDR_UN
control
ns_ctl_new_unix(char *path, mode_t mode, uid_t owner, gid_t group) {
ns_ctl_new_unix(const char *path, mode_t mode, uid_t owner, gid_t group) {
control new = new_control();
INIT_LINK(new, link);
@ -525,11 +526,11 @@ install_unix(control ctl) {
if (slash != path)
*slash = '\0';
else {
freestr(path);
(void)freestr(path);
path = savestr("/", 1);
}
} else {
freestr(path);
(void)freestr(path);
path = savestr(".", 1);
}
if (mkdir(path, ctl->var.v_unix.mode) < 0) {
@ -567,7 +568,7 @@ install_unix(control ctl) {
}
}
#ifdef NEED_SECURE_DIRECTORY
freestr(path);
(void)freestr(path);
#endif
}
#endif
@ -581,7 +582,8 @@ logger(enum ctl_severity ctlsev, const char *format, ...) {
case ctl_debug: logsev = log_debug(5); break;
case ctl_warning: logsev = log_warning; break;
case ctl_error: logsev = log_error; break;
default: panic("invalid ctlsev in logger", NULL);
default: logsev = 0;
panic("invalid ctlsev in logger", NULL);
}
if (!log_ctx_valid)
return;
@ -593,13 +595,18 @@ logger(enum ctl_severity ctlsev, const char *format, ...) {
static void
verb_connect(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
const struct sockaddr *sa = (struct sockaddr *)respctx;
const struct sockaddr *sa = (const struct sockaddr *)respctx;
control nsctl = (control)uctx;
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
if (sa->sa_family == AF_INET) {
const struct sockaddr_in *in = (struct sockaddr_in *)sa;
const struct sockaddr_in *in = (const struct sockaddr_in *)sa;
const ip_match_list acl = nsctl->var.v_inet.allow;
if (!ip_address_allowed(acl, in->sin_addr)) {
@ -615,10 +622,17 @@ verb_connect(struct ctl_sctx *ctl, struct ctl_sess *sess,
static void
verb_getpid(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
char *msg = memget(MAX_STR_LEN);
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
if (msg == NULL) {
ctl_response(sess, 503, "(out of memory)", 0,
NULL, NULL, NULL, NULL, 0);
@ -632,6 +646,9 @@ static void
getpid_closure(struct ctl_sctx *sctx, struct ctl_sess *sess, void *uap) {
char *msg = uap;
UNUSED(sctx);
UNUSED(sess);
memput(msg, MAX_STR_LEN);
}
@ -656,10 +673,17 @@ struct pvt_status {
static void
verb_status(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
struct pvt_status *pvt = ctl_getcsctx(sess);
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
if (pvt == NULL) {
pvt = memget(sizeof *pvt);
if (pvt == NULL) {
@ -717,6 +741,9 @@ static void
status_closure(struct ctl_sctx *sctx, struct ctl_sess *sess, void *uap) {
struct pvt_status *pvt = ctl_getcsctx(sess);
UNUSED(sctx);
UNUSED(uap);
memput(pvt, sizeof *pvt);
ctl_setcsctx(sess, NULL);
}
@ -724,8 +751,15 @@ status_closure(struct ctl_sctx *sctx, struct ctl_sess *sess, void *uap) {
static void
verb_stop(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
ns_need(main_need_exit);
ctl_response(sess, 250, "Shutdown initiated.", 0, NULL, NULL, NULL,
NULL, 0);
@ -734,10 +768,16 @@ verb_stop(struct ctl_sctx *ctl, struct ctl_sess *sess,
static void
verb_exec(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
struct stat sb;
UNUSED(ctl);
UNUSED(verb);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
if (rest != NULL && *rest != '\0') {
if (stat(rest, &sb) < 0) {
ctl_response(sess, 503, strerror(errno),
@ -764,14 +804,21 @@ verb_exec(struct ctl_sctx *ctl, struct ctl_sess *sess,
static void
verb_reload(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
static const char spaces[] = " \t";
struct zoneinfo *zp;
char *tmp = NULL, *x;
const char *cl;
const char *msg;
int class, code, success;
UNUSED(ctl);
UNUSED(verb);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
/* If there are no args, this is a classic reload of the config. */
if (rest == NULL || *rest == '\0') {
ns_need(main_need_reload);
@ -787,9 +834,8 @@ verb_reload(struct ctl_sctx *ctl, struct ctl_sess *sess,
*x++ = '\0';
x += strspn(x, spaces);
}
if (x == NULL || *x == '\0')
x = "in";
class = sym_ston(__p_class_syms, x, &success);
cl = (x == NULL || *x == '\0') ? "in" : x;
class = res_nametoclass(cl, &success);
if (!success) {
code = 507;
msg = "unrecognized class";
@ -833,14 +879,20 @@ verb_reload(struct ctl_sctx *ctl, struct ctl_sess *sess,
respond:
ctl_response(sess, code, msg, 0, NULL, NULL, NULL, NULL, 0);
if (tmp != NULL)
freestr(tmp);
(void)freestr(tmp);
}
static void
verb_reconfig(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
UNUSED(ctl);
UNUSED(verb);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
if (strcmp(rest, "-noexpired") != 0)
ns_need(main_need_reconfig);
else
@ -852,8 +904,15 @@ verb_reconfig(struct ctl_sctx *ctl, struct ctl_sess *sess,
static void
verb_dumpdb(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
ns_need(main_need_dump);
ctl_response(sess, 250, "Database dump initiated.", 0, NULL,
NULL, NULL, NULL, 0);
@ -862,8 +921,14 @@ verb_dumpdb(struct ctl_sctx *ctl, struct ctl_sess *sess,
static void
verb_stats(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
UNUSED(ctl);
UNUSED(verb);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
if (rest != NULL && strcmp(rest, "clear") == 0) {
ns_need(main_need_statsdumpandclear);
ctl_response(sess, 250, "Statistics dump and clear initiated.",
@ -878,22 +943,31 @@ verb_stats(struct ctl_sctx *ctl, struct ctl_sess *sess,
static void
verb_trace(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
int i = atoi(rest);
char *msg = memget(MAX_STR_LEN);
UNUSED(ctl);
UNUSED(verb);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
if (msg == NULL) {
ctl_response(sess, 503, "(out of memory)", 0,
NULL, NULL, NULL, NULL, 0);
return;
}
if (i > 0)
if (isdigit(*(const unsigned char *)rest) && i >= 0)
desired_debug = i;
else
desired_debug++;
ns_need(main_need_debug);
sprintf(msg, "Debug level: %d", desired_debug);
if (desired_debug == 0)
sprintf(msg, "Debugging turned off.");
else
sprintf(msg, "Debug level: %d", desired_debug);
ctl_response(sess, 250, msg, 0, NULL, trace_closure, msg, NULL, 0);
}
@ -901,14 +975,24 @@ static void
trace_closure(struct ctl_sctx *sctx, struct ctl_sess *sess, void *uap) {
char *msg = uap;
UNUSED(sctx);
UNUSED(sess);
memput(msg, MAX_STR_LEN);
}
static void
verb_notrace(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
desired_debug = 0;
ns_need(main_need_debug);
ctl_response(sess, 250, "Debugging turned off.",
@ -918,11 +1002,18 @@ verb_notrace(struct ctl_sctx *ctl, struct ctl_sess *sess,
static void
verb_querylog(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
static const char on[] = "Query logging is now on.",
off[] = "Query logging is now off.";
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
toggle_qrylog();
ctl_response(sess, 250, qrylog ? on : off,
0, NULL, NULL, NULL, NULL, 0);
@ -931,16 +1022,30 @@ verb_querylog(struct ctl_sctx *ctl, struct ctl_sess *sess,
static void
verb_help(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
ctl_sendhelp(sess, 214);
}
static void
verb_quit(struct ctl_sctx *ctl, struct ctl_sess *sess,
const struct ctl_verb *verb, const char *rest,
u_int respflags, void *respctx, void *uctx)
u_int respflags, const void *respctx, void *uctx)
{
UNUSED(ctl);
UNUSED(verb);
UNUSED(rest);
UNUSED(respflags);
UNUSED(respctx);
UNUSED(uctx);
ctl_response(sess, 221, "End of control session.", CTL_EXIT, NULL,
NULL, NULL, NULL, 0);
}

View File

@ -1,6 +1,6 @@
/*
* from ns.h 4.33 (Berkeley) 8/23/90
* $Id: ns_defs.h,v 8.105 2001/04/01 22:41:24 marka Exp $
* $Id: ns_defs.h,v 8.115 2002/01/29 03:59:35 marka Exp $
*/
/*
@ -147,6 +147,7 @@
#define MAX_SYNCDELAY 3 /* Presumed timeout in use by our clients. */
#define MAX_SYNCDRAIN 100000 /* How long we'll spin in drain_all_rcvbuf. */
#define MAX_SYNCSTORE 500
#define NS_MAX_DISTANCE 3 /* maximum nameserver chaining before failure */
/* maximum time to cache negative answers */
#define DEFAULT_MAX_NCACHE_TTL (3*60*60)
@ -176,27 +177,30 @@ typedef enum need {
} main_need;
/* What global options are set? */
#define OPTION_NORECURSE 0x0001 /* Don't recurse even if asked. */
#define OPTION_NOFETCHGLUE 0x0002 /* Don't fetch missing glue. */
#define OPTION_FORWARD_ONLY 0x0004 /* Don't use NS RR's, just forward. */
#define OPTION_FAKE_IQUERY 0x0008 /* Fake up bogus response to IQUERY. */
#define OPTION_NORECURSE 0x00000001 /* Don't recurse even if asked. */
#define OPTION_NOFETCHGLUE 0x00000002 /* Don't fetch missing glue. */
#define OPTION_FORWARD_ONLY 0x00000004 /* Don't use NS RR's, just forward. */
#define OPTION_FAKE_IQUERY 0x00000008 /* Fake up bogus response to IQUERY. */
#ifdef BIND_NOTIFY
#define OPTION_NONOTIFY 0x0010 /* Turn off notify */
#define OPTION_NONOTIFY 0x00000010 /* Turn off notify */
#define OPTION_SUPNOTIFY_INITIAL 0x00000020 /* Supress initial notify */
#endif
#define OPTION_NONAUTH_NXDOMAIN 0x0020 /* Generate non-auth NXDOMAINs? */
#define OPTION_MULTIPLE_CNAMES 0x0040 /* Allow a name to have multiple
* CNAME RRs */
#define OPTION_HOSTSTATS 0x0080 /* Maintain per-host statistics? */
#define OPTION_DEALLOC_ON_EXIT 0x0100 /* Deallocate everything on exit? */
#define OPTION_NODIALUP 0x0200 /* Turn off dialup support */
#define OPTION_NORFC2308_TYPE1 0x0400 /* Prevent type1 respones (RFC 2308)
* to cached negative respones */
#define OPTION_USE_ID_POOL 0x0800 /* Use the memory hogging query ID */
#define OPTION_TREAT_CR_AS_SPACE 0x1000 /* Treat CR in zone files as space */
#define OPTION_USE_IXFR 0x2000 /* Use by delault ixfr in zone transfer */
#define OPTION_MAINTAIN_IXFR_BASE 0x4000 /* Part of IXFR file name logic. */
#define OPTION_HITCOUNT 0x8000 /* Keep track of each time an RR gets
* hit in the database */
#define OPTION_NONAUTH_NXDOMAIN 0x00000040 /* Generate non-auth NXDOMAINs? */
#define OPTION_MULTIPLE_CNAMES 0x00000080 /* Allow a name to have multiple
* CNAME RRs */
#define OPTION_HOSTSTATS 0x00000100 /* Maintain per-host statistics? */
#define OPTION_DEALLOC_ON_EXIT 0x00000200 /* Deallocate everything on exit? */
#define OPTION_NODIALUP 0x00000400 /* Turn off dialup support */
#define OPTION_NORFC2308_TYPE1 0x00000800 /* Prevent type1 respones (RFC 2308)
* to cached negative respones */
#define OPTION_USE_ID_POOL 0x00001000 /* Use the memory hogging query ID */
#define OPTION_TREAT_CR_AS_SPACE 0x00002000 /* Treat CR in zone files as
* space */
#define OPTION_USE_IXFR 0x00004000 /* Use by default ixfr in zone
* transfer */
#define OPTION_MAINTAIN_IXFR_BASE 0x00008000 /* Part of IXFR file name logic. */
#define OPTION_HITCOUNT 0x00010000 /* Keep track of each time an
* RR gets hit in the database */
#define DEFAULT_OPTION_FLAGS (OPTION_NODIALUP|OPTION_NONAUTH_NXDOMAIN|\
OPTION_USE_ID_POOL|OPTION_NORFC2308_TYPE1)
@ -236,6 +240,7 @@ typedef enum need {
/* Sequence space arithmetic. */
#define SEQ_GT(a,b) ((int32_t)((a)-(b)) > 0)
#define SEQ_LT(a,b) ((int32_t)((a)-(b)) < 0)
#define NS_OPTION_P(option) ((server_options == NULL) ? \
(panic(panic_msg_no_options, NULL), 0) : \
@ -332,6 +337,7 @@ struct zoneinfo {
time_t z_ftime; /* modification time of source file */
struct in_addr z_axfr_src; /* bind() the axfr socket to this */
struct in_addr z_addr[NSMAX]; /* list of master servers for zone */
struct dst_key * z_keys[NSMAX]; /* tsig key associated with master */
u_char z_addrcnt; /* number of entries in z_addr[] */
struct in_addr z_xaddr[NSMAX]; /* list of master servers for xfer */
u_char z_xaddrcnt; /* number of entries in z_xaddr[] */
@ -442,7 +448,8 @@ struct qserv {
struct databuf *nsdata; /* databuf for server address */
struct timeval stime; /* time first query started */
unsigned int forwarder:1; /* this entry is for a forwarder */
unsigned int nretry:31; /* # of times addr retried */
unsigned int noedns:1; /* don't try edns */
unsigned int nretry:30; /* # of times addr retried */
u_int32_t serial; /* valid if Q_ZSERIAL */
};
@ -461,6 +468,10 @@ struct qinfo {
q_cmsglen, /* len of cname message */
q_cmsgsize; /* allocated size of cname message */
int16_t q_dfd; /* UDP file descriptor */
int16_t q_udpsize; /* UDP message size */
int q_distance; /* distance this query is from the
* original query that the server
* received. */
time_t q_time; /* time to retry */
time_t q_expire; /* time to expire */
struct qinfo *q_next; /* rexmit list (sorted by time) */
@ -470,6 +481,7 @@ struct qinfo {
#ifdef notyet
struct nameser *q_ns[NSMAX]; /* name servers */
#endif
struct dst_key *q_keys[NSMAX]; /* keys to use with this address */
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[] */
@ -497,6 +509,7 @@ struct qinfo {
#define Q_PRIMING 0x02 /* generated during priming phase */
#define Q_ZSERIAL 0x04 /* getting zone serial for xfer test */
#define Q_USEVC 0x08 /* forward using tcp not udp */
#define Q_EDNS 0x10 /* add edns opt record to answer */
#define Q_NEXTADDR(qp,n) (&(qp)->q_addr[n].ns_addr)
@ -731,7 +744,8 @@ typedef struct rrset_order_list {
typedef struct options {
u_int flags;
u_int32_t flags;
char *hostname;
char *version;
char *directory;
char *dump_filename;
@ -775,6 +789,7 @@ typedef struct options {
u_int max_host_stats;
u_int lame_ttl;
int minroots;
u_int16_t preferred_glue;
} *options;
typedef struct key_list_element {
@ -832,8 +847,8 @@ typedef struct server_info {
*/
struct ns_sym {
int number; /* Identifying number, like ns_log_default */
char * name; /* Its symbolic name, like "default" */
int number; /* Identifying number, like ns_log_default */
const char * name; /* Its symbolic name, like "default" */
};
/*
@ -877,7 +892,7 @@ typedef struct log_config {
} *log_config;
struct map {
char * token;
const char * token;
int val;
};
@ -908,3 +923,5 @@ enum req_action { Finish, Refuse, Return };
#define INIT(x)
#define DECL extern
#endif
#define EDNS_MESSAGE_SZ 4096

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_forw.c 4.32 (Berkeley) 3/3/91";
static const char rcsid[] = "$Id: ns_forw.c,v 8.78 2000/12/23 08:14:37 vixie Exp $";
static const char rcsid[] = "$Id: ns_forw.c,v 8.89 2002/01/29 03:59:36 marka Exp $";
#endif /* not lint */
/*
@ -133,10 +133,10 @@ ns_forw(struct databuf *nsp[], u_char *msg, int msglen,
HEADER *hp;
u_int16_t id;
int sendto_errno = 0;
int n, has_tsig, oldqlen;
u_char *oldqbuf;
u_char *smsg;
int smsglen, smsgsize, siglen;
int n, has_tsig, oldqlen = 0;
u_char *oldqbuf = NULL;
u_char *smsg = NULL;
int smsglen, smsgsize = 0, siglen;
u_char sig[TSIG_SIG_SIZE];
DST_KEY *key;
@ -225,39 +225,50 @@ ns_forw(struct databuf *nsp[], u_char *msg, int msglen,
if (debug >= 10)
res_pquery(&res, msg, msglen, log_get_stream(packet_channel));
#endif
key = tsig_key_from_addr(nsa->sin_addr);
if (key != NULL) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE;
key = qp->q_keys[0];
if (key == NULL)
key = qp->q_keys[0] = tsig_key_from_addr(nsa->sin_addr);
if (key != NULL || !qp->q_addr[0].noedns) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE + 11;
smsg = memget(smsgsize);
if (smsg == NULL)
ns_panic(ns_log_default, 1, "ns_forw: memget failed");
smsglen = qp->q_msglen;
siglen = sizeof(sig);
memcpy(smsg, qp->q_msg, qp->q_msglen);
}
if (!qp->q_addr[0].noedns)
smsglen += ns_add_opt(smsg, smsg + smsglen, smsgsize, 0, 0,
EDNS_MESSAGE_SZ, 0, NULL, 0);
if (key != NULL) {
n = ns_sign(smsg, &smsglen, smsgsize, NOERROR, key, NULL, 0,
sig, &siglen, 0);
if (n == 0) {
oldqbuf = qp->q_msg;
oldqlen = qp->q_msglen;
qp->q_msglen = smsglen;
qp->q_msg = smsg;
hp = (HEADER *) qp->q_msg;
has_tsig = 1;
free_tsig(qp->q_nstsig);
qp->q_nstsig = new_tsig(key, sig, siglen);
}
else {
} else {
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
INSIST(0);
}
}
else {
} else {
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
}
if (smsg != NULL) {
oldqbuf = qp->q_msg;
oldqlen = qp->q_msglen;
qp->q_msglen = smsglen;
qp->q_msg = smsg;
hp = (HEADER *) qp->q_msg;
}
if (qp->q_flags & Q_USEVC) {
if (tcp_send(qp) != NOERROR) {
if (!haveComplained(ina_ulong(nsa->sin_addr),
@ -269,15 +280,16 @@ ns_forw(struct databuf *nsp[], u_char *msg, int msglen,
} else if (sendto(ds, (char *)qp->q_msg, qp->q_msglen, 0,
(struct sockaddr *)nsa,
sizeof(struct sockaddr_in)) < 0) {
sendto_errno = errno;
sendto_errno = errno;
if (!haveComplained(ina_ulong(nsa->sin_addr),
(u_long)sendtoStr))
ns_info(ns_log_default, "ns_forw: sendto(%s): %s",
sin_ntoa(*nsa), strerror(errno));
nameserIncr(nsa->sin_addr, nssSendtoErr);
}
if (has_tsig == 1) {
memput(qp->q_msg, smsgsize);
if (smsgsize != 0) {
memput(smsg, smsgsize);
qp->q_msg = oldqbuf;
qp->q_msglen = oldqlen;
hp = (HEADER *) qp->q_msg;
@ -456,8 +468,8 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
int oldn, naddr, class, found_arr, potential_ns, lame_ns;
time_t curtime;
ns_debug(ns_log_default, 3, "nslookup(nsp=%#x, qp=%#x, \"%s\")",
nsp, qp, syslogdname);
ns_debug(ns_log_default, 3, "nslookup(nsp=%p, qp=%p, \"%s\", d=%d)",
nsp, qp, syslogdname, qp->q_distance);
lame_ns = potential_ns = 0;
naddr = n = qp->q_naddr;
@ -494,7 +506,7 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
tmphtp = ((nsdp->d_flags & DB_F_HINT) ?fcachetab :hashtab);
np = nlookup(dname, &tmphtp, &fname, 0);
if (np == NULL) {
ns_debug(ns_log_default, 3, "%s: not found %s %#x",
ns_debug(ns_log_default, 3, "%s: not found %s %p",
dname, fname, np);
found_arr = 0;
goto need_sysquery;
@ -520,6 +532,8 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
complaint, dname, dp, nsdp);
goto skipserver;
}
if (dp->d_rcode == NXDOMAIN && dp->d_class == class)
goto skipserver;
if (dp->d_type != T_A || dp->d_class != class)
continue;
if (dp->d_rcode) {
@ -587,9 +601,11 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
qs->ns_addr.sin_family = AF_INET;
qs->ns_addr.sin_port = ns_port;
qs->ns_addr.sin_addr = nsa;
qp->q_keys[n] = NULL;
qs->ns = nsdp;
qs->nsdata = dp;
qs->forwarder = 0;
qs->noedns = dp->d_noedns;
qs->nretry = 0;
/*
* If this A RR has no RTT, initialize its RTT to a
@ -615,7 +631,8 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
* gdonl mar96
*/
if (aIsUs(nsa)) {
static char *complaint = "contains our address";
static const char *complaint =
"contains our address";
nslookupComplain(sysloginfo, syslogdname,
complaint, dname, dp, nsdp);
continue;
@ -632,7 +649,7 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
if (memcmp(&qp->q_from, &qs->ns_addr,
sizeof(qp->q_from)) == 0)
{
static char *complaint = "forwarding loop";
static const char *complaint = "forwarding loop";
nslookupComplain(sysloginfo, syslogdname,
complaint, dname, dp, nsdp);
continue;
@ -668,9 +685,10 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
need_sysquery:
if (found_arr == 0) {
potential_ns++;
if (!(qp->q_flags & Q_SYSTEM))
(void) sysquery(dname, class, T_A, NULL, 0,
ns_port, QUERY);
if (qp->q_distance < NS_MAX_DISTANCE)
(void) sysquery(dname, class, T_A, NULL, NULL,
0, ns_port, QUERY,
qp->q_distance + 1);
}
skipserver:
(void)NULL;
@ -678,7 +696,7 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
ns_debug(ns_log_default, 3, "nslookup: %d ns addrs total", n);
qp->q_naddr = n;
if (n == 0 && potential_ns == 0 && !NS_ZFWDTAB(qp->q_fzone)) {
static char *complaint = "No possible A RRs";
static const char *complaint = "No possible A RRs";
if (lame_ns != 0)
complaint = "All possible A RR's lame";
if (sysloginfo && syslogdname &&
@ -784,7 +802,7 @@ qcomp(struct qserv *qs1, struct qserv *qs2) {
strcpy(t, inet_ntoa(qs1->ns_addr.sin_addr));
ns_debug(ns_log_default, 10,
"qcomp(%s, %s) %lu (%lu) - %lu (%lu) = %lu",
"qcomp(%s, %s) %u (%u) - %u (%u) = %u",
t, inet_ntoa(qs2->ns_addr.sin_addr),
rtt1, rttr1, rtt2, rttr2, rtt1 - rtt2);
}
@ -813,7 +831,7 @@ void
schedretry(struct qinfo *qp, time_t t) {
struct qinfo *qp1, *qp2;
ns_debug(ns_log_default, 4, "schedretry(%#x, %ld sec)", qp, (long)t);
ns_debug(ns_log_default, 4, "schedretry(%p, %ld sec)", qp, (long)t);
if (qp->q_time)
ns_debug(ns_log_default, 4,
"WARNING: schedretry(%#lx, %ld) q_time already %ld",
@ -885,22 +903,28 @@ reset_retrytimer() {
void
retrytimer(evContext ctx, void *uap, struct timespec due,
struct timespec ival) {
UNUSED(ctx);
UNUSED(uap);
UNUSED(due);
UNUSED(ival);
retry_timer_set = 0;
retry(retryqp);
retry(retryqp, 0);
}
/*
* Retry is called to retransmit query 'qp'.
*/
void
retry(struct qinfo *qp) {
int n, has_tsig, oldqlen;
retry(struct qinfo *qp, int samehost) {
int n, has_tsig, oldqlen = 0;
HEADER *hp;
struct sockaddr_in *nsa;
int sendto_errno = 0;
u_char *oldqbuf;
u_char *smsg;
int smsglen, smsgsize, siglen;
u_char *oldqbuf = NULL;
u_char *smsg = NULL;
int smsglen, smsgsize = 0, siglen;
u_char sig[TSIG_SIG_SIZE];
DST_KEY *key;
@ -923,7 +947,15 @@ retry(struct qinfo *qp) {
/* Try next address. */
n = qp->q_curaddr;
if (samehost) {
qp->q_addr[n].nretry++;
if (qp->q_addr[n].nretry < MAXRETRY)
goto found;
qp->q_addr[n].nretry--;
}
if (qp->q_naddr > 0) {
qp->q_addr[n].noedns = 1;
++qp->q_addr[n].nretry;
do {
if (++n >= (int)qp->q_naddr)
@ -970,7 +1002,7 @@ retry(struct qinfo *qp) {
}
ns_debug(ns_log_default, 5, "give up");
if ((qp->q_flags & Q_SYSTEM) == 0) {
n = ((HEADER *)qp->q_cmsg ? qp->q_cmsglen : qp->q_msglen);
n = (qp->q_cmsg ? qp->q_cmsglen : qp->q_msglen);
hp->id = qp->q_id;
hp->qr = 1;
hp->ra = (NS_OPTION_P(OPTION_NORECURSE) == 0);
@ -1015,24 +1047,29 @@ retry(struct qinfo *qp) {
res_pquery(&res, qp->q_msg, qp->q_msglen,
log_get_stream(packet_channel));
#endif
key = tsig_key_from_addr(nsa->sin_addr);
if (key != NULL) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE;
key = qp->q_keys[n];
if (key == NULL)
key = qp->q_keys[n] = tsig_key_from_addr(nsa->sin_addr);
if (key != NULL || !qp->q_addr[n].noedns) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE + 11;
smsg = memget(smsgsize);
smsglen = qp->q_msglen;
siglen = sizeof(sig);
memcpy(smsg, qp->q_msg, qp->q_msglen);
}
if (!qp->q_addr[n].noedns)
smsglen += ns_add_opt(smsg, smsg + smsglen, smsgsize, 0, 0,
EDNS_MESSAGE_SZ, 0, NULL, 0);
if (key != NULL) {
n = ns_sign(smsg, &smsglen, smsgsize, NOERROR, key, NULL, 0,
sig, &siglen, 0);
if (n == 0) {
oldqbuf = qp->q_msg;
oldqlen = qp->q_msglen;
qp->q_msglen = smsglen;
qp->q_msg = smsg;
has_tsig = 1;
free_tsig(qp->q_nstsig);
qp->q_nstsig = new_tsig(key, sig, siglen);
}
else {
} else {
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
@ -1044,6 +1081,13 @@ retry(struct qinfo *qp) {
qp->q_nstsig = NULL;
}
if (smsg != NULL) {
oldqbuf = qp->q_msg;
oldqlen = qp->q_msglen;
qp->q_msglen = smsglen;
qp->q_msg = smsg;
}
if (qp->q_flags & Q_USEVC) {
if (tcp_send(qp) != NOERROR)
ns_debug(ns_log_default, 3,
@ -1057,8 +1101,8 @@ retry(struct qinfo *qp) {
ns_debug(ns_log_default, 3, "error resending msg: %s",
strerror(errno));
}
if (has_tsig == 1) {
memput(qp->q_msg, smsgsize);
if (smsgsize != 0) {
memput(smsg, smsgsize);
qp->q_msg = oldqbuf;
qp->q_msglen = oldqlen;
}
@ -1171,33 +1215,14 @@ qnew(const char *name, int class, int type, int forward) {
}
void
ns_freeqns(struct qinfo *qp, char *where) {
static const char freed[] = "freed", busy[] = "busy";
const char *result;
struct databuf *dp;
int i;
ns_freeqns(struct qinfo *qp) {
unsigned int i;
for (i = 0 ; i < (int)qp->q_naddr ; i++) {
dp = qp->q_addr[i].ns;
if (dp) {
DRCNTDEC(dp);
result = (dp->d_rcnt) ? busy : freed;
ns_debug(ns_log_default, 3, "%s: ns %s rcnt %d (%s)",
where, dp->d_data, dp->d_rcnt, result);
if (result == freed)
db_freedata(dp);
}
dp = qp->q_addr[i].nsdata;
if (dp) {
DRCNTDEC(dp);
result = (dp->d_rcnt) ? busy : freed;
ns_debug(ns_log_default, 3,
"%s: nsdata %s rcnt %d (%s)",
where, inet_ntoa(ina_get(dp->d_data)),
dp->d_rcnt, result);
if (result == freed)
db_freedata(dp);
}
for (i = 0 ; i < qp->q_naddr ; i++) {
if (qp->q_addr[i].ns != NULL)
db_detach(&qp->q_addr[i].ns);
if (qp->q_addr[i].nsdata != NULL)
db_detach(&qp->q_addr[i].nsdata);
}
}
@ -1214,14 +1239,14 @@ ns_freeqry(struct qinfo *qp) {
if (qp->q_cmsg != NULL)
memput(qp->q_cmsg, qp->q_cmsgsize);
if (qp->q_domain != NULL)
freestr(qp->q_domain);
qp->q_domain = freestr(qp->q_domain);
if (qp->q_name != NULL)
freestr(qp->q_name);
qp->q_name = freestr(qp->q_name);
if (qp->q_tsig != NULL)
memput(qp->q_tsig, sizeof(struct tsig_record));
if (qp->q_nstsig != NULL)
memput(qp->q_nstsig, sizeof(struct tsig_record));
ns_freeqns(qp, "ns_freeqry");
ns_freeqns(qp);
if (nsqhead == qp)
nsqhead = qp->q_link;
else {
@ -1245,7 +1270,7 @@ nsfwdadd(struct qinfo *qp, struct fwdinfo *fwd) {
n = qp->q_naddr;
while (fwd != NULL && n < NSMAX) {
qs = qp->q_addr;
for (i = 0; i < (u_int)n; i++, qs++)
for (i = 0; i < n; i++, qs++)
if (ina_equal(qs->ns_addr.sin_addr,
fwd->fwddata->fwdaddr.sin_addr))
goto nextfwd;
@ -1253,6 +1278,7 @@ nsfwdadd(struct qinfo *qp, struct fwdinfo *fwd) {
qs->ns = fwd->fwddata->ns;
qs->nsdata = fwd->fwddata->nsdata;
qs->forwarder = 1;
qs->noedns = fwd->fwddata->nsdata->d_noedns;
qs->nretry = 0;
n++;
nextfwd:
@ -1260,7 +1286,7 @@ nsfwdadd(struct qinfo *qp, struct fwdinfo *fwd) {
}
/* Update the refcounts before the sort. */
for (i = qp->q_naddr; i < (u_int)n; i++) {
for (i = qp->q_naddr; i < n; i++) {
DRCNTINC(qp->q_addr[i].nsdata);
DRCNTINC(qp->q_addr[i].ns);
}

View File

@ -90,43 +90,43 @@
/* ns_func.h - declarations for ns_*.c's externally visible functions
*
* $Id: ns_func.h,v 8.105 2001/02/16 04:46:12 marka Exp $
* $Id: ns_func.h,v 8.115 2002/01/29 03:59:38 marka Exp $
*/
/* ++from ns_glue.c++ */
struct in_addr ina_get(const u_char *data);
const char * sin_ntoa(struct sockaddr_in);
int ns_wouldlog(int category, int level);
void ns_debug(int, int, const char *, ...);
void ns_info(int, const char *, ...);
void ns_notice(int, const char *, ...);
void ns_warning(int, const char *, ...);
void ns_error(int, const char *, ...);
void ns_critical(int, const char *, ...);
void ns_panic(int, int, const char *, ...);
void ns_assertion_failed(char *file, int line,
assertion_type type, char *cond,
int print_errno);
void ns_debug(int, int, const char *, ...) ISC_FORMAT_PRINTF(3, 4);
void ns_info(int, const char *, ...) ISC_FORMAT_PRINTF(2, 3);
void ns_notice(int, const char *, ...) ISC_FORMAT_PRINTF(2, 3);
void ns_warning(int, const char *, ...) ISC_FORMAT_PRINTF(2, 3);
void ns_error(int, const char *, ...) ISC_FORMAT_PRINTF(2, 3);
void ns_critical(int, const char *, ...) ISC_FORMAT_PRINTF(2, 3);
void ns_panic(int, int, const char *, ...) ISC_FORMAT_PRINTF(3, 4);
void ns_assertion_failed(const char *file, int line,
assertion_type type,
const char *cond, int print_errno);
void panic(const char *, const void *);
void gettime(struct timeval *);
int nlabels(const char *);
int my_close(int);
int my_fclose(FILE *);
void __freestr(char *);
void * __freestr(char *);
char * __newstr(size_t, int);
char * __savestr(const char *, int);
char * checked_ctime(const time_t *t);
char * ctimel(long);
void __freestr_record(char *, char *, int);
char * __newstr_record(size_t, int, char *, int);
char * __savestr_record(const char *, int, char *, int);
const char * checked_ctime(const time_t *t);
const char * ctimel(long);
void * __freestr_record(char *, const char *, int);
char * __newstr_record(size_t, int, const char *, int);
char * __savestr_record(const char *, int, const char *, int);
u_char * ina_put(struct in_addr ina, u_char *data);
u_char * savebuf(const u_char *, size_t, int);
void dprintf(int level, const char *format, ...);
void dprintf(int level, const char *format, ...) ISC_FORMAT_PRINTF(2, 3);
#ifdef DEBUG_STRINGS
char * debug_newstr(size_t, int, const char *, int);
char * debug_savestr(const char *, int, const char *, int);
void debug_freestr(char *, const char *, int);
void * debug_freestr(char *, const char *, int);
#define newstr(l, n) debug_newstr((l), (n), __FILE__, __LINE__)
#define savestr(s, n) debug_savestr((s), (n), __FILE__, __LINE__)
#define freestr(s) debug_freestr((s), __FILE__, __LINE__)
@ -159,7 +159,8 @@ void prime_cache(void);
void delete_all(struct namebuf *, int, int);
int delete_stale(struct namebuf *);
struct qinfo * sysquery(const char *, int, int,
struct in_addr *, int, u_int16_t, int);
struct in_addr *, struct dst_key **keys,
int, u_int16_t, int, int);
int doupdate(u_char *, u_char *, struct databuf **,
int, int, int, u_int, struct sockaddr_in);
int send_msg(u_char *, int, struct qinfo *);
@ -174,6 +175,14 @@ int trunc_adjust(u_char *, int, int);
/* --from ns_resp.c-- */
/* ++from ns_req.c++ */
int ns_get_opt(u_char *msg, u_char *eom,
u_int8_t *versionp, u_int16_t *rcodep,
u_int16_t *flagp, u_int16_t *bufsizep,
u_char **optionsp, size_t *optsizep);
int ns_add_opt(u_char *msg, u_char *cp, size_t buflen,
u_int8_t version, u_int16_t rcode,
u_int16_t size, u_int16_t flags,
u_char *options, size_t optlen);
void ns_req(u_char *, int, int,
struct qstream *,
struct sockaddr_in,
@ -192,6 +201,7 @@ int doaddauth(HEADER *, u_char *, int,
int findZonePri(const struct zoneinfo *,
const struct sockaddr_in);
#endif
int drop_port(u_int16_t);
/* --from ns_req.c-- */
/* ++from ns_xfr.c++ */
@ -212,8 +222,8 @@ void ns_ctl_shutdown(void);
void ns_ctl_defaults(controls *);
void ns_ctl_add(controls *, control);
control ns_ctl_new_inet(struct in_addr, u_int, ip_match_list);
#ifndef WINNT
control ns_ctl_new_unix(char *, mode_t, uid_t, gid_t);
#ifndef NO_SOCKADDR_UN
control ns_ctl_new_unix(const char *, mode_t, uid_t, gid_t);
#endif
void ns_ctl_install(controls *);
/* --from ns_ctl.c-- */
@ -249,10 +259,10 @@ void unsched(struct qinfo *);
void reset_retrytimer(void);
void retrytimer(evContext ctx, void *uap,
struct timespec due, struct timespec ival);
void retry(struct qinfo *);
void retry(struct qinfo *, int);
void qflush(void);
void qremove(struct qinfo *);
void ns_freeqns(struct qinfo *, char *);
void ns_freeqns(struct qinfo *);
void ns_freeqry(struct qinfo *);
void freeComplaints(void);
void nsfwdadd(struct qinfo *, struct fwdinfo *);
@ -267,7 +277,7 @@ void sq_remove(struct qstream *);
void sq_flushw(struct qstream *);
void sq_flush(struct qstream *allbut);
void dq_remove_gen(time_t gen);
void dq_remove_all();
void dq_remove_all(void);
void sq_done(struct qstream *);
void ns_setproctitle(char *, int);
void getnetconf(int);
@ -386,8 +396,7 @@ int merge_logs(struct zoneinfo *zp, char *logname);
int zonedump(struct zoneinfo *zp, int isixfr);
void dynamic_about_to_exit(void);
enum req_action req_update(HEADER *hp, u_char *cp, u_char *eom,
u_char *msg, struct qstream *qsp,
int dfd, struct sockaddr_in from,
u_char *msg, struct sockaddr_in from,
struct tsig_record *in_tsig);
void rdata_dump(struct databuf *dp, FILE *fp);
/* --from ns_update.c-- */
@ -422,7 +431,8 @@ int set_zone_transfer_source(zone_config, struct in_addr);
int set_zone_pubkey(zone_config, const int, const int,
const int, const char *);
int set_zone_transfer_time_in(zone_config, long);
int add_zone_master(zone_config, struct in_addr);
int add_zone_master(zone_config, struct in_addr,
struct dst_key *);
#ifdef BIND_NOTIFY
int add_zone_notify(zone_config, struct in_addr);
#endif
@ -453,8 +463,8 @@ ip_match_element new_ip_match_localhost(void);
ip_match_element new_ip_match_localnets(void);
void ip_match_negate(ip_match_element);
void add_to_ip_match_list(ip_match_list, ip_match_element);
void dprint_ip_match_list(int, ip_match_list, int, char *,
char *);
void dprint_ip_match_list(int, ip_match_list, int,
const char *, const char *);
int ip_match_address(ip_match_list, struct in_addr);
int ip_match_addr_or_key(ip_match_list, struct in_addr,
struct dst_key *key);
@ -503,10 +513,10 @@ time_t load_configuration(const char *);
/* --from ns_config.c-- */
/* ++from parser.y++ */
ip_match_list lookup_acl(char *);
void define_acl(char *, ip_match_list);
ip_match_list lookup_acl(const char *);
void define_acl(const char *, ip_match_list);
struct dst_key *lookup_key(char *);
void define_key(char *, struct dst_key *);
void define_key(const char *, struct dst_key *);
time_t parse_configuration(const char *);
void parser_initialize(void);
void parser_shutdown(void);

View File

@ -1,6 +1,6 @@
/*
* from ns.h 4.33 (Berkeley) 8/23/90
* $Id: ns_glob.h,v 8.56 2000/12/02 18:39:25 vixie Exp $
* $Id: ns_glob.h,v 8.57 2001/11/12 21:22:26 marka Exp $
*/
/*
@ -342,3 +342,4 @@ DECL int loading INIT(0);
DECL int xfers_running INIT(0);
DECL int xfers_deferred INIT(0);
DECL int qserials_running INIT(0);
DECL int initial_configuration INIT(1);

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_glue.c,v 8.20 2001/02/16 04:46:14 marka Exp $";
static const char rcsid[] = "$Id: ns_glue.c,v 8.24 2002/01/07 02:54:37 marka Exp $";
#endif /* not lint */
/*
@ -179,8 +179,8 @@ ns_panic(int category, int dump_core, const char *format, ...) {
}
void
ns_assertion_failed(char *file, int line, assertion_type type, char *cond,
int print_errno)
ns_assertion_failed(const char *file, int line, assertion_type type,
const char *cond, int print_errno)
{
ns_panic(ns_log_insist, 1, "%s:%d: %s(%s)%s%s failed.",
file, line, assertion_type_to_text(type), cond,
@ -277,7 +277,11 @@ my_close(int fd) {
s = close(fd);
} while (s < 0 && errno == EINTR);
if (s < 0 && errno != EBADF)
/*
* Tru64 UNIX V5.1 can return a spurious EINVAL after connect()
* failures.
*/
if (s < 0 && errno != EBADF && errno != EINVAL)
ns_info(ns_log_default, "close(%d) failed: %s", fd,
strerror(errno));
else
@ -328,9 +332,10 @@ __savestr(const char *str, int needpanic) {
return (__savestr_record(str, needpanic, __FILE__, __LINE__));
}
void
void *
__freestr(char *str) {
__freestr_record(str, __FILE__, __LINE__);
return (NULL);
}
#ifdef DEBUG_STRINGS
@ -364,7 +369,7 @@ debug_freestr(char *str, const char *file, int line) {
len += 3; /* 2 length bytes + NUL. */
printf("%s:%d: freestr %d %s\n", file, line, len, str);
__freestr_record(str, file, line);
return;
return (NULL);
}
#endif /* DEBUG_STRINGS */
@ -372,7 +377,7 @@ debug_freestr(char *str, const char *file, int line) {
* Return a counted string buffer big enough for a string of length 'len'.
*/
char *
__newstr_record(size_t len, int needpanic, char *file, int line) {
__newstr_record(size_t len, int needpanic, const char *file, int line) {
u_char *buf, *bp;
REQUIRE(len <= 65536);
@ -393,7 +398,7 @@ __newstr_record(size_t len, int needpanic, char *file, int line) {
* Save a NUL terminated string and return a pointer to it.
*/
char *
__savestr_record(const char *str, int needpanic, char *file, int line) {
__savestr_record(const char *str, int needpanic, const char *file, int line) {
char *buf;
size_t len;
@ -410,8 +415,8 @@ __savestr_record(const char *str, int needpanic, char *file, int line) {
return (buf);
}
void
__freestr_record(char *str, char *file, int line) {
void *
__freestr_record(char *str, const char *file, int line) {
u_char *buf, *bp;
size_t len;
@ -419,11 +424,12 @@ __freestr_record(char *str, char *file, int line) {
bp = buf;
NS_GET16(len, bp);
__memput_record(buf, 2/*Len*/ + len + 1/*Nul*/, file, line);
return (NULL);
}
char *
const char *
checked_ctime(const time_t *t) {
char *ctime_result;
const char *ctime_result;
ctime_result = ctime(t);
if (ctime_result == NULL) {
@ -438,7 +444,7 @@ checked_ctime(const time_t *t) {
* 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 *
const char *
ctimel(long l) {
time_t t = (time_t)l;

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_init.c 4.38 (Berkeley) 3/21/91";
static const char rcsid[] = "$Id: ns_init.c,v 8.73 2001/04/20 00:21:40 vixie Exp $";
static const char rcsid[] = "$Id: ns_init.c,v 8.76 2001/12/19 01:41:51 marka Exp $";
#endif /* not lint */
/*
@ -294,7 +294,10 @@ do_reload(const char *domain, int type, int class, int mark) {
* Clean up any leftover data.
*/
ns_stopxfrs(zp);
purge_zone(domain, hashtab, class);
if (type == z_hint || (type == z_stub && *domain == 0))
purge_zone(domain, fcachetab, class);
else
purge_zone(domain, hashtab, class);
/*
* Reload
@ -534,9 +537,9 @@ ns_nameok(const struct qinfo *qry, const char *name, int class,
if (severity == warn)
ok = 1;
if (s != NULL)
freestr(s);
(void)freestr(s);
if (o != NULL)
freestr(o);
(void)freestr(o);
}
return (ok);
}

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_ixfr.c,v 8.26.2.2 2001/08/10 03:00:08 marka Exp $";
static const char rcsid[] = "$Id: ns_ixfr.c,v 8.31 2002/01/02 05:15:20 marka Exp $";
#endif /* not lint */
/*
@ -232,8 +232,7 @@ sx_send_ixfr(struct qstream *qsp) {
if (sx_addrr(qsp, rp->r_dname,
rp->r_dp) < 0)
goto cleanup;
db_freedata(rp->r_dp);
rp->r_dp = NULL;
db_detach(&rp->r_dp);
foundsoa = 1;
break;
}
@ -268,8 +267,7 @@ sx_send_ixfr(struct qstream *qsp) {
sx_addrr(qsp, rp->r_dname,
rp->r_dp) < 0)
goto cleanup;
db_freedata(rp->r_dp);
rp->r_dp = NULL;
db_detach(&rp->r_dp);
}
rp = NEXT(rp, r_link);
}
@ -292,8 +290,7 @@ sx_send_ixfr(struct qstream *qsp) {
if (sx_addrr(qsp, rp->r_dname,
rp->r_dp) < 0)
goto cleanup;
db_freedata(rp->r_dp);
rp->r_dp = NULL;
db_detach(&rp->r_dp);
foundsoa = 1;
break;
}
@ -332,8 +329,7 @@ sx_send_ixfr(struct qstream *qsp) {
if (sx_addrr(qsp, rp->r_dname,
rp->r_dp) < 0)
goto cleanup;
db_freedata(rp->r_dp);
rp->r_dp = NULL;
db_detach(&rp->r_dp);
}
rp = NEXT(rp, r_link);
}
@ -344,10 +340,8 @@ sx_send_ixfr(struct qstream *qsp) {
/* clean up old update */
while ((rp = HEAD(dp->d_changes)) != NULL) {
UNLINK(dp->d_changes, rp, r_link);
if (rp->r_dp != NULL) {
db_freedata(rp->r_dp);
rp->r_dp = NULL;
}
if (rp->r_dp != NULL)
db_detach(&rp->r_dp);
res_freeupdrec(rp);
}
memput(dp, sizeof (*dp));
@ -379,8 +373,7 @@ sx_send_ixfr(struct qstream *qsp) {
while ((rp = HEAD(dp->d_changes)) != NULL) {
UNLINK(dp->d_changes, rp, r_link);
if (rp->r_dp != NULL)
db_freedata(rp->r_dp);
rp->r_dp = NULL;
db_detach(&rp->r_dp);
res_freeupdrec(rp);
}
memput(dp, sizeof *dp);
@ -432,9 +425,8 @@ ixfr_log_maint(struct zoneinfo *zp) {
return (-1);
}
(void) my_fclose(db_fp);
ns_debug(ns_log_default, 3, "%s, size %d blk %d",
zp->z_source, db_sb.st_size,
db_sb.st_size);
ns_debug(ns_log_default, 3, "%s, size %ld",
zp->z_source, (long)db_sb.st_size);
/* open up the zone ixfr log */
if ((from_fp = fopen(zp->z_ixfr_base, "r")) == NULL) {
@ -449,10 +441,8 @@ ixfr_log_maint(struct zoneinfo *zp) {
(void) my_fclose(from_fp);
return (-1);
}
ns_debug(ns_log_default, 3, "%s, size %d max %d\n",
zp->z_ixfr_base,
sb.st_size,
zp->z_max_log_size_ixfr);
ns_debug(ns_log_default, 3, "%s, size %ld max %ld\n", zp->z_ixfr_base,
(long)sb.st_size, (long)zp->z_max_log_size_ixfr);
if (zp->z_max_log_size_ixfr) {
if (sb.st_size > zp->z_max_log_size_ixfr)
seek = sb.st_size -
@ -467,7 +457,7 @@ ixfr_log_maint(struct zoneinfo *zp) {
else
seek = 0;
}
ns_debug(ns_log_default, 3, "seek: %d", seek);
ns_debug(ns_log_default, 3, "seek: %ld", (long)seek);
if (seek < 1) {
ns_debug(ns_log_default, 3, "%s does not need to be reduced",
zp->z_ixfr_base);
@ -489,7 +479,7 @@ ixfr_log_maint(struct zoneinfo *zp) {
(void) strcat(tmpname, ".XXXXXX");
if ((fd = mkstemp(tmpname)) == -1) {
ns_warning(ns_log_db, "can't make tmpfile (%s): %s",
ns_warning(ns_log_db, "can't make tmpfile (%s): %s",
tmpname, strerror(errno));
memput(tmpname, len);
(void) my_fclose(from_fp);
@ -536,7 +526,8 @@ ixfr_log_maint(struct zoneinfo *zp) {
break;
}
if (found) {
ns_debug(ns_log_default, 1, "ixfr_log_maint(): found [END_DELTA]");
ns_debug(ns_log_default, 1,
"ixfr_log_maint(): found [END_DELTA]");
fprintf(to_fp, "%s", LogSignature);
@ -557,7 +548,8 @@ ixfr_log_maint(struct zoneinfo *zp) {
(void) my_fclose(from_fp);
if (error == 0) {
if (isc_movefile(tmpname, zp->z_ixfr_base) == -1) {
ns_warning(ns_log_default, "can not rename %s to %s :%s",
ns_warning(ns_log_default,
"can not rename %s to %s :%s",
tmpname, zp->z_ixfr_base, strerror(errno));
}
if ((from_fp = fopen(zp->z_ixfr_base, "r")) == NULL) {
@ -576,25 +568,23 @@ ixfr_log_maint(struct zoneinfo *zp) {
if (sb.st_size <= 0)
(void) unlink(zp->z_ixfr_base);
else if (chmod(zp->z_ixfr_base, 0644) < 0)
ns_error(ns_log_update,
"chmod(%s,%o) failed, pressing on: %s",
zp->z_source, sb.st_mode,
strerror(errno));
ns_error(ns_log_update,
"chmod(%s,%o) failed, pressing on: %s",
zp->z_source, sb.st_mode, strerror(errno));
(void) my_fclose(from_fp);
}
(void) unlink(tmpname);
memput(tmpname, len);
zp->z_serial_ixfr_start = 0; /* signal to read for lowest serial number */
/* signal to read for lowest serial number */
zp->z_serial_ixfr_start = 0;
ns_debug(ns_log_default, 3, "%s, size %d max %d\n",
zp->z_ixfr_base,
sb.st_size,
zp->z_max_log_size_ixfr);
ns_debug(ns_log_default, 3, "%s, size %ld max %ld\n", zp->z_ixfr_base,
(long)sb.st_size, (long)zp->z_max_log_size_ixfr);
if (error)
return(-1);
else
return (0);
return (0);
}

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_lexer.c,v 8.22 2000/11/29 06:55:58 marka Exp $";
static const char rcsid[] = "$Id: ns_lexer.c,v 8.28 2001/12/28 04:07:47 marka Exp $";
#endif /* not lint */
/*
@ -140,6 +140,10 @@ token_to_text(int token, YYSTYPE lval) {
static char where[MAXPATHLEN + 100];
static char message[20480];
static void
parser_complain(int is_warning, int print_last_token, const char *format,
va_list args) ISC_FORMAT_PRINTF(3, 0);
static void
parser_complain(int is_warning, int print_last_token, const char *format,
va_list args)
@ -199,7 +203,7 @@ parser_error(int print_last_token, const char *format, ...) {
void
yyerror(const char *message) {
parser_error(1, message);
parser_error(1, "%s", message);
}
/*
@ -207,7 +211,7 @@ yyerror(const char *message) {
*/
struct keyword {
char *name;
const char *name;
int token;
};
@ -265,6 +269,7 @@ static struct keyword keywords[] = {
#endif /* HITCOUNTS */
{"host-statistics", T_HOSTSTATS},
{"host-statistics-max", T_HOSTSTATSMAX},
{"hostname", T_HOSTNAME},
{"if-no-answer", T_IF_NO_ANSWER},
{"if-no-domain", T_IF_NO_DOMAIN},
{"ignore", T_IGNORE},
@ -303,6 +308,7 @@ static struct keyword keywords[] = {
{"perm", T_PERM},
{"pid-file", T_PIDFILE},
{"port", T_PORT},
{"preferred-glue", T_PREFERRED_GLUE},
{"print-category", T_PRINT_CATEGORY},
{"print-severity", T_PRINT_SEVERITY},
{"print-time", T_PRINT_TIME},
@ -324,6 +330,9 @@ static struct keyword keywords[] = {
{"statistics-interval", T_STATS_INTERVAL},
{"stub", T_STUB},
{"support-ixfr", T_SUPPORT_IXFR},
#ifdef BIND_NOTIFY
{"suppress-initial-notify", T_NOTIFY_INITIAL},
#endif
{"syslog", T_SYSLOG},
{"topology", T_TOPOLOGY},
{"transfer-format", T_TRANSFER_FORMAT},
@ -474,7 +483,7 @@ scan_to_comment_end(int c_plus_plus_style) {
}
}
int
static int
get_next_char(int comment_ok) {
int c, nc;
@ -518,7 +527,7 @@ get_next_char(int comment_ok) {
return (c);
}
void
static void
put_back_char(int c) {
if (c == EOF)
current_file->flags |= LEX_EOF;

View File

@ -30,8 +30,8 @@
#define SYM_LOGGING 0x04
#define SYM_SYSLOG 0x08
int parser_warning(int, const char *, ...);
int parser_error(int, const char *, ...);
int parser_warning(int, const char *, ...) ISC_FORMAT_PRINTF(2, 3);
int parser_error(int, const char *, ...) ISC_FORMAT_PRINTF(2, 3);
void yyerror(const char *);
void lexer_begin_file(const char *, FILE *);
void lexer_end_file(void);

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_main.c 4.55 (Berkeley) 7/1/91";
static const char rcsid[] = "$Id: ns_main.c,v 8.145 2001/03/16 12:07:57 marka Exp $";
static const char rcsid[] = "$Id: ns_main.c,v 8.155 2001/11/16 05:37:27 marka Exp $";
#endif /* not lint */
/*
@ -233,14 +233,14 @@ usage() {
exit(1);
}
static char bad_p_option[] =
static const char bad_p_option[] =
"-p remote/local obsolete; use 'listen-on' in config file to specify local";
static char bad_directory[] = "chdir failed for directory '%s': %s";
static const char bad_directory[] = "chdir failed for directory '%s': %s";
/*ARGSUSED*/
int
main(int argc, char *argv[], char *envp[]) {
main(int argc, char *argv[]) {
int n;
char *p;
int ch;
@ -281,7 +281,7 @@ main(int argc, char *argv[], char *envp[]) {
case 'b':
case 'c':
if (conffile != NULL)
freestr(conffile);
(void)freestr(conffile);
conffile = savestr(optarg, 1);
break;
@ -367,7 +367,7 @@ main(int argc, char *argv[], char *envp[]) {
case 'g':
if (group_name != NULL)
freestr(group_name);
(void)freestr(group_name);
group_name = savestr(optarg, 1);
if (only_digits(group_name))
group_id = atoi(group_name);
@ -394,7 +394,7 @@ main(int argc, char *argv[], char *envp[]) {
if (argc) {
if (conffile != NULL)
freestr(conffile);
(void)freestr(conffile);
conffile = savestr(*argv, 1);
argc--, argv++;
}
@ -431,8 +431,7 @@ main(int argc, char *argv[], char *envp[]) {
}
#else
fprintf(stderr, "warning: chroot() not available\n");
freestr(chroot_dir);
chroot_dir = NULL;
chroot_dir = freestr(chroot_dir);
#endif
}
@ -608,13 +607,17 @@ stream_accept(evContext lev, void *uap, int rfd,
interface *ifp = uap;
struct qstream *sp;
struct iovec iov;
int len, n;
ISC_SOCKLEN_T len;
int n;
const int on = 1;
#ifdef IP_OPTIONS /* XXX */
u_char ip_opts[IP_OPT_BUF_SIZE];
#endif
const struct sockaddr_in *la, *ra;
UNUSED(lalen);
UNUSED(ralen);
la = (const struct sockaddr_in *)lav;
ra = (const struct sockaddr_in *)rav;
@ -714,7 +717,7 @@ stream_accept(evContext lev, void *uap, int rfd,
#ifndef CANNOT_SET_SNDBUF
if (setsockopt(rfd, SOL_SOCKET, SO_SNDBUF,
(char*)&sbufsize, sizeof sbufsize) < 0) {
(const char*)&sbufsize, sizeof sbufsize) < 0) {
ns_info(ns_log_default, "setsockopt(rfd, SO_SNDBUF, %d): %s",
sbufsize, strerror(errno));
(void) close(rfd);
@ -722,13 +725,21 @@ stream_accept(evContext lev, void *uap, int rfd,
}
#endif
if (setsockopt(rfd, SOL_SOCKET, SO_KEEPALIVE,
(char *)&on, sizeof on) < 0) {
(const char *)&on, sizeof on) < 0) {
ns_info(ns_log_default, "setsockopt(rfd, KEEPALIVE): %s",
strerror(errno));
(void) close(rfd);
return;
}
#ifdef USE_FIONBIO_IOCTL
if (ioctl(ifp->dfd, FIONBIO, (char *) &on) == -1) {
ns_info(ns_log_default, "ioctl(rfd, FIONBIO): %s",
strerror(errno));
(void) close(rfd);
return;
}
#else
if ((n = fcntl(rfd, F_GETFL, 0)) == -1) {
ns_info(ns_log_default, "fcntl(rfd, F_GETFL): %s",
strerror(errno));
@ -741,6 +752,7 @@ stream_accept(evContext lev, void *uap, int rfd,
(void) close(rfd);
return;
}
#endif
/*
* We don't like IP options. Turn them off if the connection came in
@ -830,6 +842,12 @@ tcp_send(struct qinfo *qp) {
sq_remove(sp);
return (SERVFAIL);
}
#ifdef USE_FIONBIO_IOCTL
if (ioctl(sp->s_rfd, FIONBIO, (char *) &on) == -1) {
sq_remove(sp);
return (SERVFAIL);
}
#else
if ((n = fcntl(sp->s_rfd, F_GETFL, 0)) == -1) {
sq_remove(sp);
return (SERVFAIL);
@ -838,6 +856,7 @@ tcp_send(struct qinfo *qp) {
sq_remove(sp);
return (SERVFAIL);
}
#endif
if (sq_openw(sp, qp->q_msglen + INT16SZ) == -1) {
sq_remove(sp);
return (SERVFAIL);
@ -872,6 +891,12 @@ stream_send(evContext lev, void *uap, int fd, const void *la, int lalen,
const void *ra, int ralen) {
struct qstream *sp = uap;
UNUSED(lev);
UNUSED(la);
UNUSED(lalen);
UNUSED(ra);
UNUSED(ralen);
ns_debug(ns_log_default, 1, "stream_send");
sp->flags &= ~STREAM_CONNECT_EV;
@ -923,6 +948,8 @@ stream_getlen(evContext lev, void *uap, int fd, int bytes) {
struct qstream *sp = uap;
struct iovec iov;
UNUSED(fd);
sp->flags &= ~STREAM_READ_EV;
if (bytes != INT16SZ) {
/*
@ -979,7 +1006,7 @@ stream_getlen(evContext lev, void *uap, int fd, int bytes) {
if (evRead(lev, sp->s_rfd, &iov, 1, stream_getmsg, sp, &sp->evID_r)
== -1)
ns_panic(ns_log_default, 1, "evRead(fd %d): %s",
(void *)sp->s_rfd, strerror(errno));
sp->s_rfd, strerror(errno));
sp->flags |= STREAM_READ_EV;
}
@ -987,6 +1014,9 @@ static void
stream_getmsg(evContext lev, void *uap, int fd, int bytes) {
struct qstream *sp = uap;
UNUSED(lev);
UNUSED(fd);
sp->flags &= ~STREAM_READ_EV;
if (bytes == -1) {
ns_info(ns_log_default, "stream_getmsg(%s): %s",
@ -999,8 +1029,10 @@ stream_getmsg(evContext lev, void *uap, int fd, int bytes) {
sp->s_time = tt.tv_sec;
if (ns_wouldlog(ns_log_default,5)) {
ns_debug(ns_log_default, 5, "sp %#x rfd %d size %d time %d next %#x",
sp, sp->s_rfd, sp->s_size, sp->s_time, sp->s_next);
ns_debug(ns_log_default, 5,
"sp %p rfd %d size %d time %ld next %p",
sp, sp->s_rfd, sp->s_size, (long)sp->s_time,
sp->s_next);
ns_debug(ns_log_default, 5, "\tbufsize %d bytes %d", sp->s_bufsize,
bytes);
}
@ -1034,13 +1066,16 @@ static void
datagram_read(evContext lev, void *uap, int fd, int evmask) {
interface *ifp = uap;
struct sockaddr_in from;
int from_len = sizeof from;
ISC_SOCKLEN_T from_len = sizeof from;
int n, nudp;
union {
HEADER h; /* Force alignment of 'buf'. */
u_char buf[PACKETSZ+1];
u_char buf[EDNS_MESSAGE_SZ+1];
} u;
UNUSED(lev);
UNUSED(evmask);
tt = evTimeVal(evNowTime());
nudp = 0;
@ -1088,16 +1123,16 @@ datagram_read(evContext lev, void *uap, int fd, int evmask) {
sin_ntoa(from), fd, n);
}
if (n > PACKETSZ) {
if (n > EDNS_MESSAGE_SZ) {
/*
* The message is too big. It's probably a response to
* one of our questions, so we truncate it and press on.
*/
n = trunc_adjust(u.buf, PACKETSZ, PACKETSZ);
n = trunc_adjust(u.buf, EDNS_MESSAGE_SZ, EDNS_MESSAGE_SZ);
ns_debug(ns_log_default, 1, "truncated oversize UDP packet");
}
dispatch_message(u.buf, n, PACKETSZ, NULL, from, fd, ifp);
dispatch_message(u.buf, n, EDNS_MESSAGE_SZ, NULL, from, fd, ifp);
if (++nudp < nudptrans)
goto more;
}
@ -1106,8 +1141,11 @@ static void
savedg_waitfunc(evContext ctx, void *uap, const void *tag) {
savedg *dg = (savedg *)uap;
UNUSED(ctx);
UNUSED(tag);
if (!EMPTY(iflist) && HEAD(iflist)->gen == dg->gen) {
u_char buf[PACKETSZ];
u_char buf[EDNS_MESSAGE_SZ];
memcpy(buf, dg->buf, dg->buflen);
dispatch_message(buf, dg->buflen, sizeof buf, NULL,
@ -1222,8 +1260,7 @@ getnetconf(int periodic_scan) {
for (;;) {
buf = memget(bufsiz);
if (!buf)
ns_panic(ns_log_default, 1,
"memget(interface)", NULL);
ns_panic(ns_log_default, 1, "memget(interface)");
ifc.ifc_len = bufsiz;
ifc.ifc_buf = buf;
#ifdef IRIX_EMUL_IOCTL_SIOCGIFCONF
@ -1244,7 +1281,7 @@ getnetconf(int periodic_scan) {
* buffer we will grow it just in case and
* retry.
*/
if (ifc.ifc_len + 2 * sizeof(ifreq) < bufsiz)
if ((int)(ifc.ifc_len + 2 * sizeof(ifreq)) < bufsiz)
break;
}
#endif
@ -1345,7 +1382,7 @@ getnetconf(int periodic_scan) {
ifp = (interface *)memget(sizeof *ifp);
if (!ifp)
ns_panic(ns_log_default, 1,
"memget(interface)", NULL);
"memget(interface)");
memset(ifp, 0, sizeof *ifp);
INIT_LINK(ifp, link);
APPEND(iflist, ifp, link);
@ -1491,8 +1528,8 @@ static int
opensocket_d(interface *ifp) {
struct sockaddr_in nsa;
const int on = 1;
int m, n;
int fd;
ISC_SOCKLEN_T m;
int n;
memset(&nsa, 0, sizeof nsa);
nsa.sin_family = AF_INET;
@ -1509,6 +1546,14 @@ opensocket_d(interface *ifp) {
close(ifp->dfd);
return (-1);
}
#ifdef USE_FIONBIO_IOCTL
if (ioctl(ifp->dfd, FIONBIO, (char *) &on) == -1) {
ns_info(ns_log_default, "ioctl(ifp->dfd, FIONBIO): %s",
strerror(errno));
(void) close(ifp->dfd);
return (-1);
}
#else
if ((n = fcntl(ifp->dfd, F_GETFL, 0)) == -1) {
ns_info(ns_log_default, "fcntl(ifp->dfd, F_GETFL): %s",
strerror(errno));
@ -1521,6 +1566,7 @@ opensocket_d(interface *ifp) {
(void) close(ifp->dfd);
return (-1);
}
#endif
if (fcntl(ifp->dfd, F_SETFD, 1) < 0) {
ns_error(ns_log_default, "F_SETFD: %s", strerror(errno));
close(ifp->dfd);
@ -1529,7 +1575,7 @@ opensocket_d(interface *ifp) {
ns_debug(ns_log_default, 1, "ifp->addr %s d_dfd %d",
sin_ntoa(nsa), ifp->dfd);
if (setsockopt(ifp->dfd, SOL_SOCKET, SO_REUSEADDR,
(char *)&on, sizeof(on)) != 0) {
(const char *)&on, sizeof(on)) != 0) {
ns_notice(ns_log_default, "setsockopt(REUSEADDR): %s",
strerror(errno));
/* XXX press on regardless, this is not too serious. */
@ -1540,12 +1586,12 @@ opensocket_d(interface *ifp) {
&& (m == sizeof n)
&& (n < drbufsize)) {
(void) setsockopt(ifp->dfd, SOL_SOCKET, SO_RCVBUF,
(char *)&drbufsize, sizeof drbufsize);
(const char *)&drbufsize, sizeof drbufsize);
}
#endif /* SO_RCVBUF */
#ifndef CANNOT_SET_SNDBUF
if (setsockopt(ifp->dfd, SOL_SOCKET, SO_SNDBUF,
(char*)&dsbufsize, sizeof dsbufsize) < 0) {
(const char*)&dsbufsize, sizeof dsbufsize) < 0) {
ns_info(ns_log_default,
"setsockopt(dfd=%d, SO_SNDBUF, %d): %s",
ifp->dfd, dsbufsize, strerror(errno));
@ -1583,10 +1629,10 @@ drain_rcvbuf(evContext ctx, interface *ifp, int fd, int *mread, int *mstore) {
for (; *mread > 0; (*mread)--) {
union {
HEADER h;
u_char buf[PACKETSZ+1];
u_char buf[EDNS_MESSAGE_SZ+1];
} u;
struct sockaddr_in from;
int from_len = sizeof from;
ISC_SOCKLEN_T from_len = sizeof from;
savedg *dg;
int n;
@ -1595,7 +1641,7 @@ drain_rcvbuf(evContext ctx, interface *ifp, int fd, int *mread, int *mstore) {
if (n <= 0)
break; /* Socket buffer assumed empty. */
drop++; /* Pessimistic assumption. */
if (n > PACKETSZ)
if (n > EDNS_MESSAGE_SZ)
continue; /* Oversize message - EDNS0 needed. */
if (from.sin_family != AF_INET)
continue; /* Not IPv4 - IPv6 needed. */
@ -1655,7 +1701,6 @@ opensocket_s(interface *ifp) {
struct sockaddr_in nsa;
const int on = 1;
int n;
int fd;
memset(&nsa, 0, sizeof nsa);
nsa.sin_family = AF_INET;
@ -1683,7 +1728,7 @@ opensocket_s(interface *ifp) {
return (-1);
}
if (setsockopt(ifp->sfd, SOL_SOCKET, SO_REUSEADDR,
(char *)&on, sizeof on) != 0) {
(const char *)&on, sizeof on) != 0) {
ns_notice(ns_log_default, "setsockopt(REUSEADDR): %s",
strerror(errno));
/* Consider that your first warning of trouble to come. */
@ -1728,7 +1773,8 @@ opensocket_f() {
static interface *prev_ifp;
struct sockaddr_in nsa;
const int on = 1;
int n, need_close;
ISC_SOCKLEN_T n;
int need_close;
interface *ifp;
need_close = 0;
@ -1786,7 +1832,7 @@ opensocket_f() {
if (fcntl(ds, F_SETFD, 1) < 0)
ns_panic(ns_log_default, 1, "F_SETFD: %s", strerror(errno));
if (setsockopt(ds, SOL_SOCKET, SO_REUSEADDR,
(char *)&on, sizeof on) != 0) {
(const char *)&on, sizeof on) != 0) {
ns_notice(ns_log_default, "setsockopt(REUSEADDR): %s",
strerror(errno));
/* XXX press on regardless, this is not too serious. */
@ -1816,7 +1862,7 @@ opensocket_f() {
if (evSelectFD(ev, ds, EV_READ, datagram_read, NULL, &ds_evID) == -1)
ns_panic(ns_log_default, 1, "evSelectFD(fd %d): %s",
(void *)ds, strerror(errno));
ds, strerror(errno));
/* XXX: should probably use a different FileFunc that only accepts
* responses, since requests on this socket make no sense.
*/
@ -1833,6 +1879,8 @@ setdebug(int new_debug) {
debug = new_debug;
log_option(log_ctx, LOG_OPTION_DEBUG, debug);
log_option(log_ctx, LOG_OPTION_LEVEL, debug);
if (old_debug && !debug)
log_close_debug_channels(log_ctx);
evSetDebug(ev, debug, log_get_stream(eventlib_channel));
if (debug) {
if (!old_debug)
@ -2017,6 +2065,8 @@ static void
sq_writable(evContext ctx, void *uap, int fd, int evmask) {
struct qstream *qs = uap;
UNUSED(ctx);
INSIST(evmask & EV_WRITE);
INSIST(fd == qs->s_rfd);
if (sq_dowrite(qs) < 0) {
@ -2118,7 +2168,7 @@ sq_done(struct qstream *sp) {
if (evRead(ev, sp->s_rfd, &iov, 1, stream_getlen, sp, &sp->evID_r) ==
-1)
ns_panic(ns_log_default, 1, "evRead(fd %d): %s",
(void *)sp->s_rfd, strerror(errno));
sp->s_rfd, strerror(errno));
sp->flags |= STREAM_READ_EV;
}
@ -2359,7 +2409,7 @@ nsid_hash(u_char *data, size_t len) {
* fast.
*/
while (len-- > 0) {
HASHROTATE(nsid_hash_state);
nsid_hash_state = HASHROTATE(nsid_hash_state);
nsid_hash_state += *data++;
}
}
@ -2566,8 +2616,7 @@ nsid_init(void) {
nsid_vtable = memget(NSID_SHUFFLE_TABLE_SIZE *
(sizeof(u_int16_t)) );
if (!nsid_vtable)
ns_panic(ns_log_default, 1, "memget(nsid_vtable)",
NULL);
ns_panic(ns_log_default, 1, "memget(nsid_vtable)");
for (i = 0; i < NSID_SHUFFLE_TABLE_SIZE; i++) {
nsid_vtable[i] = nsid_state;
nsid_state = (((u_long) nsid_a1 * nsid_state) + nsid_c1)
@ -2579,7 +2628,7 @@ nsid_init(void) {
nsid_algorithm = NSID_USE_POOL;
nsid_pool = memget(0x10000 * (sizeof(u_int16_t)));
if (!nsid_pool)
ns_panic(ns_log_default, 1, "memget(nsid_pool)", NULL);
ns_panic(ns_log_default, 1, "memget(nsid_pool)");
for (i = 0; ; i++) {
nsid_pool[i] = nsid_state;
nsid_state = (((u_long) nsid_a1 * nsid_state) + nsid_c1) & 0xFFFF;
@ -2632,8 +2681,10 @@ nsid_next() {
nsid_state = 0;
else
nsid_state++;
} else
ns_panic(ns_log_default, 1, "Unknown ID algorithm", NULL);
} else {
id = 0; /* silence compiler */
ns_panic(ns_log_default, 1, "Unknown ID algorithm");
}
/* Now lets obfuscate ... */
id = (((u_long) nsid_a2 * id) + nsid_c2) & 0xFFFF;
@ -2682,11 +2733,17 @@ deallocate_everything(void) {
if (nsid_pool != NULL)
memput(nsid_pool, 0x10000 * (sizeof(u_int16_t)));
nsid_pool = NULL;
if (nsid_vtable != NULL)
memput(nsid_vtable, NSID_SHUFFLE_TABLE_SIZE *
(sizeof(u_int16_t)));
nsid_vtable = NULL;
irs_destroy();
if (f != NULL) {
memstats(f);
(void)fclose(f);
}
if (memactive())
abort();
}
static void
@ -2753,7 +2810,7 @@ toggle_qrylog(void) {
static void
wild(void) {
ns_panic(ns_log_default, 1, "wild need", NULL);
ns_panic(ns_log_default, 1, "wild need");
}
/*
@ -2803,7 +2860,7 @@ handle_needs(void) {
INSIST_ERR(evDo(ev, (void *)handle_needs) != -1);
return;
}
ns_panic(ns_log_default, 1, "ns_handle_needs: queued == 0", NULL);
ns_panic(ns_log_default, 1, "ns_handle_needs: queued == 0");
}
static void
@ -2812,6 +2869,8 @@ need_waitfunc(evContext ctx, void *uap, const void *tag) {
time_t begin;
long syncdelay;
UNUSED(tag);
begin = time(NULL);
(*hand)();
syncdelay = time(NULL) - begin;

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_maint.c 4.39 (Berkeley) 3/2/91";
static const char rcsid[] = "$Id: ns_maint.c,v 8.122.2.4 2001/08/10 03:00:11 marka Exp $";
static const char rcsid[] = "$Id: ns_maint.c,v 8.131 2001/11/12 04:49:32 marka Exp $";
#endif /* not lint */
/*
@ -267,11 +267,8 @@ zone_maint(struct zoneinfo *zp) {
break;
}
/*
* It is essential that we never try to set a timer in the past
* or for now because doing so could cause an infinite loop.
*/
INSIST(zp->z_time == 0 || zp->z_time > tt.tv_sec);
if (zp->z_time != 0 && zp->z_time < tt.tv_sec)
zp->z_time = tt.tv_sec;
sched_zone_maint(zp);
}
@ -282,6 +279,10 @@ do_zone_maint(evContext ctx, void *uap, struct timespec due,
ztimer_info zti = uap;
struct zoneinfo *zp;
UNUSED(ctx);
UNUSED(due);
UNUSED(inter);
INSIST(zti != NULL);
ns_debug(ns_log_maint, 1, "do_zone_maint for zone %s (class %s)",
@ -403,6 +404,10 @@ ns_cleancache(evContext ctx, void *uap,
{
int deleted;
UNUSED(ctx);
UNUSED(due);
UNUSED(inter);
gettime(&tt);
INSIST(uap == NULL);
deleted = clean_cache(hashtab, 0);
@ -416,6 +421,10 @@ ns_heartbeat(evContext ctx, void *uap, struct timespec due,
{
struct zoneinfo *zp;
UNUSED(ctx);
UNUSED(due);
UNUSED(inter);
gettime(&tt);
INSIST(uap == NULL);
@ -515,9 +524,9 @@ qserial_query(struct zoneinfo *zp) {
}
qp = sysquery(zp->z_origin, zp->z_class, T_SOA,
zp->z_addr, zp->z_addrcnt,
zp->z_addr, zp->z_keys, zp->z_addrcnt,
ntohs(zp->z_port) ? zp->z_port : ns_port,
QUERY);
QUERY, 0);
if (qp == NULL) {
ns_debug(ns_log_default, 1,
"qserial_query(%s): sysquery FAILED",
@ -572,7 +581,7 @@ qserial_answer(struct qinfo *qp) {
qs = &qp->q_addr[n];
ns_debug(ns_log_default, 1, "qserial_answer(%s): [%s] -> %lu",
zp->z_origin, inet_ntoa(qs->ns_addr.sin_addr),
qs->serial);
(unsigned long)qs->serial);
/* Don't consider serials which weren't set by a response. */
if (qs->serial == 0)
continue;
@ -607,7 +616,7 @@ qserial_answer(struct qinfo *qp) {
ns_debug(ns_log_default, 1,
"qserial_answer after sort: [%s] -> %lu",
inet_ntoa(qs->ns_addr.sin_addr),
qs->serial);
(unsigned long)qs->serial);
}
}
@ -647,18 +656,28 @@ qserial_answer(struct qinfo *qp) {
* 1: Tsig info successfully written.
*/
static int
write_tsig_info(struct in_addr addr, char *name, int *fd) {
write_tsig_info(struct zoneinfo *zp, struct in_addr addr, char *name, int *fd) {
server_info si;
DST_KEY *dst_key;
DST_KEY *dst_key = NULL;
int tsig_fd = *fd;
char tsig_str[1024], secret_buf64[172];
u_char secret_buf[128];
int secret_len, len;
int i;
si = find_server(addr);
if (si == NULL || si->key_list == NULL || si->key_list->first == NULL)
return(0);
dst_key = si->key_list->first->key;
for (i = 0; i < zp->z_addrcnt ; i++)
if (memcmp(&addr, &zp->z_addr[i], sizeof(addr)) == 0) {
dst_key = zp->z_keys[i];
break;
}
if (dst_key == NULL) {
si = find_server(addr);
if (si == NULL || si->key_list == NULL ||
si->key_list->first == NULL)
return(0);
dst_key = si->key_list->first->key;
}
if (tsig_fd == -1) {
*fd = tsig_fd = mkstemp(name);
if (tsig_fd < 0) {
@ -679,7 +698,7 @@ write_tsig_info(struct in_addr addr, char *name, int *fd) {
if (len == -1)
return (-1);
/* We need snprintf! */
if (strlen(dst_key->dk_key_name) + len + sizeof("XXX.XXX.XXX.XXX"),
if (strlen(dst_key->dk_key_name) + len + sizeof("XXX.XXX.XXX.XXX") +
sizeof("123") + 5 > sizeof(tsig_str))
return (-1);
sprintf(tsig_str, "%s\n%s\n%d\n%s\n",
@ -707,7 +726,7 @@ write_tsigs(struct zoneinfo *zp, char *tsig_name) {
if (aIsUs(a) && ns_port == zp->z_port)
continue;
tsig_ret = write_tsig_info(a, tsig_name, &tsig_fd);
tsig_ret = write_tsig_info(zp, a, tsig_name, &tsig_fd);
switch (tsig_ret) {
case -1:
goto error;
@ -757,7 +776,8 @@ supports_ixfr(struct zoneinfo *zp) {
*/
static void
startxfer(struct zoneinfo *zp) {
char *argv[NSMAX*2 + 20], argv_ns[NSMAX][MAXDNAME];
char *argv[NSMAX*2 + 20];
char argv_ns[NSMAX][MAXDNAME];
int argc = 0, argc_ns = 0, i;
pid_t pid;
u_int cnt;
@ -773,50 +793,50 @@ startxfer(struct zoneinfo *zp) {
zp->z_origin[0] != '\0' ? zp->z_origin : ".");
argv[argc++] = server_options->named_xfer;
argv[argc++] = "-z";
argv[argc++] = zp->z_origin;
argv[argc++] = "-f";
DE_CONST("-z", argv[argc++]);
DE_CONST(*zp->z_origin ? zp->z_origin : ".", argv[argc++]);
DE_CONST("-f", argv[argc++]);
argv[argc++] = zp->z_source;
#ifdef BIND_IXFR
if (supports_ixfr(zp) && zp->z_ixfr_tmp != NULL) {
argv[argc++] = "-i";
DE_CONST("-i", argv[argc++]);
argv[argc++] = zp->z_ixfr_tmp;
}
#endif
if (zp->z_serial != 0) {
argv[argc++] = "-s";
DE_CONST("-s", argv[argc++]);
sprintf(serial_str, "%u", zp->z_serial);
argv[argc++] = serial_str;
}
if (zp->z_axfr_src.s_addr != 0 ||
server_options->axfr_src.s_addr != 0) {
argv[argc++] = "-x";
DE_CONST("-x", argv[argc++]);
argv[argc++] = strcpy(src_str, inet_ntoa(
(zp->z_axfr_src.s_addr != 0) ? zp->z_axfr_src :
server_options->axfr_src));
}
argv[argc++] = "-C";
DE_CONST("-C", argv[argc++]);
sprintf(class_str, "%d", zp->z_class);
argv[argc++] = class_str;
if (zp->z_flags & Z_SYSLOGGED)
argv[argc++] = "-q";
argv[argc++] = "-P";
DE_CONST("-q", argv[argc++]);
DE_CONST("-P", argv[argc++]);
sprintf(port_str, "%d", ntohs(zp->z_port) != 0 ? zp->z_port : ns_port);
argv[argc++] = port_str;
#ifdef STUBS
if (zp->z_type == Z_STUB)
argv[argc++] = "-S";
DE_CONST("-S", argv[argc++]);
#endif
#ifdef DEBUG
if (debug) {
argv[argc++] = "-d";
DE_CONST("-d", argv[argc++]);
sprintf(debug_str, "%d", debug);
argv[argc++] = debug_str;
argv[argc++] = "-l";
argv[argc++] = _PATH_XFERDDT;
DE_CONST("-l", argv[argc++]);
DE_CONST(_PATH_XFERDDT, argv[argc++]);
if (debug > 5) {
argv[argc++] = "-t";
argv[argc++] = _PATH_XFERTRACE;
DE_CONST("-t", argv[argc++]);
DE_CONST(_PATH_XFERTRACE, argv[argc++]);
}
}
#endif
@ -840,7 +860,7 @@ startxfer(struct zoneinfo *zp) {
return;
}
if (tsig_ret != 0) {
argv[argc++] = "-T";
DE_CONST("-T", argv[argc++]);
argv[argc++] = tsig_name;
}
@ -867,9 +887,9 @@ startxfer(struct zoneinfo *zp) {
if (si != NULL &&
(si->flags & SERVER_INFO_SUPPORT_IXFR) != 0)
argv[argc++] = "ixfr";
DE_CONST("ixfr", argv[argc++]);
else
argv[argc++] = "axfr";
DE_CONST("axfr", argv[argc++]);
}
#endif
}
@ -985,8 +1005,9 @@ printzoneinfo(int zonenum, int category, int level) {
if (zp->z_type == z_master && (zp->z_flags & Z_DYNAMIC) != 0) {
ns_debug(category, level,
"\tdumpintvl %lu, soaincrintvl %lu deferupdcnt %lu",
zp->z_dumpintvl, zp->z_soaincrintvl,
zp->z_deferupdcnt);
(unsigned long)zp->z_dumpintvl,
(unsigned long)zp->z_soaincrintvl,
(unsigned long)zp->z_deferupdcnt);
if (zp->z_soaincrtime)
ns_debug(category, level,
"\tz_soaincrtime %lu (now %lu, left: %lu)",
@ -1240,9 +1261,8 @@ valid_glue(struct databuf *dp, char *name, int belowcut) {
ns_samedomain((char*)dp->d_data, zones[dp->d_zone].z_origin))
return (1);
/* NOKEY is in parent zone otherwise child zone */
if (dp->d_type == T_KEY && dp->d_size == 4 &&
(dp->d_data[0] & 0xc3) == 0xc1)
/* KEY RRset may be in the parent */
if (dp->d_type == T_KEY)
return (1);
/* NXT & KEY records may be signed */
@ -1593,10 +1613,11 @@ endxfer() {
zp->z_xferpid = XFER_ISAXFR;
if (exitstatus == XFER_SUCCESSAXFRIXFRFILE) {
zp->z_xferpid = XFER_ISAXFRIXFR;
if (zp->z_ixfr_tmp != NULL)
isc_movefile(
zp->z_ixfr_tmp,
zp->z_source);
}
if (zp->z_ixfr_tmp != NULL)
isc_movefile(zp->z_ixfr_tmp,
zp->z_source);
/* XXX should incorporate loadxfer() */
zp->z_flags |= Z_NEED_RELOAD;
zp->z_flags &= ~Z_SYSLOGGED;

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_ncache.c,v 8.27 2000/04/21 06:54:09 vixie Exp $";
static const char rcsid[] = "$Id: ns_ncache.c,v 8.29 2001/06/18 14:43:16 marka Exp $";
#endif /* not lint */
/*
@ -121,7 +121,7 @@ cache_n_resp(u_char *msg, int msglen, struct sockaddr_in from,
while (ancount--) {
u_int32_t ttl;
u_int atype, aclass;
int atype, aclass;
n = dn_skipname(cp, eom);
if (n < 0) {
@ -257,14 +257,14 @@ cache_n_resp(u_char *msg, int msglen, struct sockaddr_in from,
flags = DB_NOTAUTH|DB_NOHINTS;
}
if ((n = db_update(dname, dp, dp, NULL, flags, hashtab, from)) != OK) {
n = db_update(dname, dp, dp, NULL, flags, hashtab, from);
if (n != OK)
ns_debug(ns_log_ncache, 1,
"db_update failed (%d), cache_n_resp()", n);
db_freedata(dp);
return;
}
ns_debug(ns_log_ncache, 4,
"ncache succeeded: [%s %s %s] rcode:%d ttl:%ld",
dname, p_type(type), p_class(class),
dp->d_rcode, (long)(dp->d_ttl - tt.tv_sec));
else
ns_debug(ns_log_ncache, 4,
"ncache succeeded: [%s %s %s] rcode:%d ttl:%ld",
dname, p_type(type), p_class(class),
dp->d_rcode, (long)(dp->d_ttl - tt.tv_sec));
db_detach(&dp);
}

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_notify.c,v 8.14 2001/04/01 18:38:36 vixie Exp $";
static const char rcsid[] = "$Id: ns_notify.c,v 8.18 2001/11/12 04:49:33 marka Exp $";
#endif /* not lint */
/*
@ -146,7 +146,7 @@ ns_notify(const char *dname, ns_class class, ns_type type) {
evConsTime(0, 0), &ni->timer) < 0) {
ns_error(ns_log_notify, "evSetTimer() failed: %s",
strerror(errno));
freestr(ni->name);
ni->name = freestr(ni->name);
memput(ni, sizeof *ni);
return;
}
@ -168,7 +168,7 @@ notify_afterload() {
while ((ni = HEAD(loading_notifies)) != NULL) {
UNLINK(loading_notifies, ni, link);
ns_notify(ni->name, ni->class, ni->type);
freestr(ni->name);
ni->name = freestr(ni->name);
memput(ni, sizeof *ni);
}
}
@ -262,8 +262,8 @@ sysnotify(const char *dname, ns_class class, ns_type type) {
for (i = 0; i < zp->z_notify_count; i++) {
ns_debug(ns_log_notify, 4, "notifying %s",
inet_ntoa(*also_addr));
sysquery(dname, class, type, also_addr, 1, ns_port,
NS_NOTIFY_OP);
sysquery(dname, class, type, also_addr, NULL, 1,
ns_port, NS_NOTIFY_OP, 0);
also_addr++;
}
nns += zp->z_notify_count;
@ -275,8 +275,8 @@ sysnotify(const char *dname, ns_class class, ns_type type) {
for (i = 0; i < server_options->notify_count; i++) {
ns_debug(ns_log_notify, 3, "notifying %s",
inet_ntoa(*also_addr));
sysquery(dname, class, type, also_addr,
1, ns_port, ns_o_notify);
sysquery(dname, class, type, also_addr, NULL, 1,
ns_port, ns_o_notify, 0);
also_addr++;
}
nns += server_options->notify_count;
@ -387,14 +387,14 @@ sysnotify_ns(const char *dname, const char *aname,
if (!is_us && !cname && !NS_OPTION_P(OPTION_NOFETCHGLUE)) {
struct qinfo *qp;
qp = sysquery(aname, class, ns_t_a, 0, 0, ns_port,
ns_o_query);
qp = sysquery(aname, class, ns_t_a, NULL, NULL, 0,
ns_port, ns_o_query, 0);
if (qp != NULL)
qp->q_notifyzone = zn;
}
return;
}
sysquery(dname, class, type, nss, nsc, ns_port, ns_o_notify);
sysquery(dname, class, type, nss, NULL, nsc, ns_port, ns_o_notify, 0);
(*nns)++;
*na += nsc;
}
@ -413,7 +413,7 @@ free_notify(struct notify *ni) {
evClearTimer(ev, ni->timer);
evInitID(&ni->timer);
}
freestr(ni->name);
ni->name = freestr(ni->name);
memput(ni, sizeof *ni);
}
@ -424,6 +424,10 @@ notify_timer(evContext ctx, void *uap,
{
struct notify *ni = uap;
UNUSED(ctx);
UNUSED(due);
UNUSED(inter);
INSIST(evTestID(ni->timer));
evInitID(&ni->timer);
INSIST(LINKED(ni, link));

View File

@ -1,6 +1,6 @@
%{
#if !defined(lint) && !defined(SABER)
static char rcsid[] = "$Id: ns_parser.y,v 8.63.2.4 2001/04/30 08:03:02 marka Exp $";
static char rcsid[] = "$Id: ns_parser.y,v 8.78 2001/12/28 04:07:48 marka Exp $";
#endif /* not lint */
/*
@ -65,6 +65,7 @@ static symbol_table symtab;
#define AUTH_TABLE_SIZE 397 /* should always be prime */
static symbol_table authtab = NULL;
static symbol_table channeltab = NULL;
static zone_config current_zone;
static int should_install;
@ -94,7 +95,7 @@ static int chan_versions;
static u_long chan_max_size;
static log_channel lookup_channel(char *);
static void define_channel(char *, log_channel);
static void define_channel(const char *, log_channel);
static char *canonical_name(char *);
int yyparse();
@ -132,7 +133,7 @@ int yyparse();
%token T_DIRECTORY T_PIDFILE T_NAMED_XFER
%token T_DUMP_FILE T_STATS_FILE T_MEMSTATS_FILE
%token T_FAKE_IQUERY T_RECURSION T_FETCH_GLUE
%token T_HITCOUNT
%token T_HITCOUNT T_PREFERRED_GLUE
%token T_QUERY_SOURCE T_LISTEN_ON T_PORT T_ADDRESS
%token T_RRSET_ORDER T_ORDER T_NAME T_CLASS
%token T_CONTROLS T_INET T_UNIX T_PERM T_OWNER T_GROUP T_ALLOW
@ -143,14 +144,16 @@ int yyparse();
%type <ip_addr> maybe_wild_addr
%token T_DATASIZE T_STACKSIZE T_CORESIZE
%token T_DEFAULT T_UNLIMITED
%token T_FILES T_VERSION
%token T_FILES T_VERSION T_HOSTNAME
%token T_HOSTSTATS T_HOSTSTATSMAX T_DEALLOC_ON_EXIT
%token T_TRANSFERS_IN T_TRANSFERS_OUT T_TRANSFERS_PER_NS
%token T_TRANSFER_FORMAT T_MAX_TRANSFER_TIME_IN
%token T_SERIAL_QUERIES T_ONE_ANSWER T_MANY_ANSWERS
%type <axfr_fmt> transfer_format
%token T_NOTIFY T_AUTH_NXDOMAIN T_MULTIPLE_CNAMES T_USE_IXFR T_MAINTAIN_IXFR_BASE
%token T_CLEAN_INTERVAL T_INTERFACE_INTERVAL T_STATS_INTERVAL T_MAX_LOG_SIZE_IXFR
%token T_NOTIFY T_NOTIFY_INITIAL T_AUTH_NXDOMAIN
%token T_MULTIPLE_CNAMES T_USE_IXFR T_MAINTAIN_IXFR_BASE
%token T_CLEAN_INTERVAL T_INTERFACE_INTERVAL T_STATS_INTERVAL
%token T_MAX_LOG_SIZE_IXFR
%token T_HEARTBEAT T_USE_ID_POOL
%token T_MAX_NCACHE_TTL T_HAS_OLD_CLIENTS T_RFC2308_TYPE1
%token T_LAME_TTL T_MIN_ROOTS
@ -268,7 +271,7 @@ statement: include_stmt
include_stmt: T_INCLUDE L_QSTRING L_EOS
{
lexer_begin_file($2, NULL);
freestr($2);
(void)freestr($2);
}
;
@ -298,48 +301,59 @@ options: option L_EOS
;
option: /* Empty */
| T_HOSTNAME L_QSTRING
{
if (current_options->hostname != NULL)
(void)freestr(current_options->hostname);
current_options->hostname = $2;
}
| T_VERSION L_QSTRING
{
if (current_options->version != NULL)
freestr(current_options->version);
(void)freestr(current_options->version);
current_options->version = $2;
}
| T_DIRECTORY L_QSTRING
{
if (current_options->directory != NULL)
freestr(current_options->directory);
(void)freestr(current_options->directory);
current_options->directory = $2;
}
| T_NAMED_XFER L_QSTRING
{
if (current_options->named_xfer != NULL)
freestr(current_options->named_xfer);
(void)freestr(current_options->named_xfer);
current_options->named_xfer = $2;
}
| T_PIDFILE L_QSTRING
{
if (current_options->pid_filename != NULL)
freestr(current_options->pid_filename);
(void)freestr(current_options->pid_filename);
current_options->pid_filename = $2;
}
| T_STATS_FILE L_QSTRING
{
if (current_options->stats_filename != NULL)
freestr(current_options->stats_filename);
(void)freestr(current_options->stats_filename);
current_options->stats_filename = $2;
}
| T_MEMSTATS_FILE L_QSTRING
{
if (current_options->memstats_filename != NULL)
freestr(current_options->memstats_filename);
(void)freestr(current_options->memstats_filename);
current_options->memstats_filename = $2;
}
| T_DUMP_FILE L_QSTRING
{
if (current_options->dump_filename != NULL)
freestr(current_options->dump_filename);
(void)freestr(current_options->dump_filename);
current_options->dump_filename = $2;
}
| T_PREFERRED_GLUE L_STRING
{
current_options->preferred_glue =
strcasecmp($2, "aaaa") ? T_A : T_AAAA;
}
| T_FAKE_IQUERY yea_or_nay
{
set_global_boolean_option(current_options,
@ -365,6 +379,14 @@ option: /* Empty */
set_global_boolean_option(current_options,
OPTION_NONOTIFY, !$2);
}
| T_NOTIFY_INITIAL yea_or_nay
{
if (initial_configuration && $2)
ns_notice(ns_log_default,
"suppressing initial notifies");
set_global_boolean_option(current_options,
OPTION_SUPNOTIFY_INITIAL, $2);
}
| T_HOSTSTATS yea_or_nay
{
set_global_boolean_option(current_options,
@ -428,8 +450,7 @@ option: /* Empty */
else {
add_listen_on(current_options, $2, $4);
value.pointer = NULL;
define_symbol(symtab, savestr(port_string, 1),
SYM_PORT, value, SYMBOL_FREE_KEY);
define_symbol(symtab, port_string, SYM_PORT, value, 0);
}
}
@ -600,6 +621,20 @@ control: /* Empty */
{
ns_ctl_add(&current_controls, ns_ctl_new_inet($2, $4, $7));
}
| T_INET maybe_wild_addr
T_ALLOW '{' address_match_list '}'
T_KEYS '{' dummy_key_list '}'
{
parser_warning(0, "Ignoring BIND 9 inet control clause");
free_ip_match_list($5);
}
| T_INET maybe_wild_addr T_PORT in_port
T_ALLOW '{' address_match_list '}'
T_KEYS '{' dummy_key_list '}'
{
parser_warning(0, "Ignoring BIND 9 inet control clause");
free_ip_match_list($7);
}
| T_UNIX L_QSTRING T_PERM L_NUMBER T_OWNER L_NUMBER T_GROUP L_NUMBER
{
#ifndef NO_SOCKADDR_UN
@ -644,7 +679,7 @@ ordering_class: /* nothing */
parser_error(0, "unknown class '%s'; using ANY", $2);
$$ = C_ANY;
}
freestr($2);
(void)freestr($2);
}
;
@ -667,7 +702,7 @@ ordering_type: /* nothing */
$2);
}
}
freestr($2);
(void)freestr($2);
}
ordering_name: /* nothing */
@ -678,7 +713,7 @@ ordering_name: /* nothing */
{
if (strcmp(".",$2) == 0 || strcmp("*.",$2) == 0) {
$$ = savestr("*", 1);
freestr($2);
(void)freestr($2);
} else {
$$ = $2 ;
}
@ -702,7 +737,7 @@ rrset_ordering_element: ordering_class ordering_type ordering_name T_ORDER L_STR
$5, p_order(o));
}
freestr($5);
(void)freestr($5);
$$ = new_rrset_order_element($1, $2, $3, o);
}
@ -859,7 +894,7 @@ size_spec: any_string
/* 0 means "use default" */
$$ = 0;
}
freestr($1);
(void)freestr($1);
}
| L_NUMBER
{
@ -966,7 +1001,6 @@ logging_opt: T_CATEGORY category
if (lookup_channel($2) != NULL) {
parser_error(0, "can't redefine channel '%s'", $2);
freestr($2);
} else {
switch (chan_type) {
case log_file:
@ -978,8 +1012,7 @@ logging_opt: T_CATEGORY category
chan_max_size);
log_set_file_owner(current_channel,
user_id, group_id);
freestr(chan_name);
chan_name = NULL;
chan_name = freestr(chan_name);
break;
case log_syslog:
current_channel =
@ -1000,6 +1033,7 @@ logging_opt: T_CATEGORY category
"couldn't create channel");
define_channel($2, current_channel);
}
(void)freestr($2);
}
;
@ -1013,7 +1047,7 @@ channel_severity: any_string
parser_error(0, "unknown severity '%s'", $1);
chan_level = log_debug(99);
}
freestr($1);
(void)freestr($1);
}
| T_DEBUG
{
@ -1087,7 +1121,7 @@ maybe_syslog_facility: /* nothing */ { $$ = LOG_DAEMON; }
parser_error(0, "unknown facility '%s'", $1);
$$ = LOG_DAEMON;
}
freestr($1);
(void)freestr($1);
}
;
@ -1149,7 +1183,7 @@ channel: channel_name
} else
parser_error(0, "unknown channel '%s'", $1);
}
freestr($1);
(void)freestr($1);
}
;
@ -1174,7 +1208,7 @@ category: category_name
$1);
$$ = -1;
}
freestr($1);
(void)freestr($1);
}
;
@ -1197,9 +1231,8 @@ server_stmt: T_SERVER L_IPADDR
parser_error(0, "cannot redefine server '%s'",
ip_printable);
else
define_symbol(symtab, savestr(ip_printable, 1),
SYM_SERVER, value,
SYMBOL_FREE_KEY);
define_symbol(symtab, ip_printable, SYM_SERVER, value,
0);
current_server = begin_server($2);
}
'{' server_info_list '}'
@ -1279,6 +1312,7 @@ address_match_element: address_match_simple
else
$$ = new_ip_match_key(dst_key);
(void)freestr(key_name);
freestr($2);
}
;
@ -1329,7 +1363,7 @@ address_match_simple: L_IPADDR
* we give it a name and treat it like any other acl.
*/
sprintf(name, "__internal_%p", $2);
define_acl(savestr(name, 1), $2);
define_acl(name, $2);
$$ = new_ip_match_indirect($2);
}
;
@ -1344,7 +1378,7 @@ address_name: any_string
$$ = NULL;
} else
$$ = new_ip_match_indirect(iml);
freestr($1);
(void)freestr($1);
}
;
@ -1369,9 +1403,9 @@ key_ref: any_string
$$ = NULL;
} else
$$ = dst_key;
freestr(key_name);
key_name = freestr(key_name);
}
freestr($1);
(void)freestr($1);
}
;
@ -1389,6 +1423,13 @@ key_list: key_list_element L_EOS
| error
;
dummy_key_list_element: key_ref;
dummy_key_list: dummy_key_list_element L_EOS
| dummy_key_list dummy_key_list_element L_EOS
| error
;
key_stmt: T_SEC_KEY
{
current_algorithm = NULL;
@ -1425,15 +1466,12 @@ key_stmt: T_SEC_KEY
}
}
if (key_name != NULL)
freestr(key_name);
key_name = NULL;
key_name = freestr(key_name);
if (current_algorithm != NULL)
freestr(current_algorithm);
current_algorithm = NULL;
current_algorithm = freestr(current_algorithm);
if (current_secret != NULL)
freestr(current_secret);
current_secret = NULL;
freestr($3);
current_secret = freestr(current_secret);
(void)freestr($3);
}
;
@ -1468,9 +1506,9 @@ acl_stmt: T_ACL any_string '{' address_match_list '}'
{
if (lookup_acl($2) != NULL) {
parser_error(0, "can't redefine ACL '%s'", $2);
freestr($2);
} else
define_acl($2, $4);
(void)freestr($2);
}
;
@ -1506,12 +1544,11 @@ zone_stmt: T_ZONE L_QSTRING optional_class
p_class($3));
} else {
should_install = 1;
define_symbol(symtab, savestr(zone_name, 1),
sym_type, value,
SYMBOL_FREE_KEY);
define_symbol(symtab, zone_name, sym_type,
value, 0);
}
}
freestr($2);
(void)freestr($2);
current_zone = begin_zone(zone_name, $3);
}
optional_zone_options_list
@ -1538,7 +1575,7 @@ optional_class: /* Empty */
/* the zone validator will give the error */
$$ = C_NONE;
}
freestr($1);
(void)freestr($1);
}
;
@ -1688,7 +1725,11 @@ master_in_addr_list: master_in_addr L_EOS
master_in_addr: L_IPADDR
{
add_zone_master(current_zone, $1);
add_zone_master(current_zone, $1, NULL);
}
| L_IPADDR T_SEC_KEY key_ref
{
add_zone_master(current_zone, $1, $3);
}
;
@ -1788,7 +1829,7 @@ in_port: L_NUMBER
if ($1 < 0 || $1 > 65535) {
parser_warning(0,
"invalid IP port number '%d'; setting port to 0",
$1);
(int)$1);
$1 = 0;
} else
$$ = htons($1);
@ -1827,26 +1868,26 @@ init_acls() {
ime = new_ip_match_pattern(address, 0);
iml = new_ip_match_list();
add_to_ip_match_list(iml, ime);
define_acl(savestr("any", 1), iml);
define_acl("any", iml);
/* ACL "none" */
ime = new_ip_match_pattern(address, 0);
ip_match_negate(ime);
iml = new_ip_match_list();
add_to_ip_match_list(iml, ime);
define_acl(savestr("none", 1), iml);
define_acl("none", iml);
/* ACL "localhost" */
ime = new_ip_match_localhost();
iml = new_ip_match_list();
add_to_ip_match_list(iml, ime);
define_acl(savestr("localhost", 1), iml);
define_acl("localhost", iml);
/* ACL "localnets" */
ime = new_ip_match_localnets();
iml = new_ip_match_list();
add_to_ip_match_list(iml, ime);
define_acl(savestr("localnets", 1), iml);
define_acl("localnets", iml);
}
static void
@ -1861,6 +1902,9 @@ free_sym_value(int type, void *value) {
case SYM_KEY:
free_key_info(value);
break;
case SYM_CHANNEL:
INSIST(log_free_channel(value) == 0);
break;
default:
ns_panic(ns_log_parser, 1,
"unhandled case in free_sym_value()");
@ -1873,25 +1917,26 @@ static log_channel
lookup_channel(char *name) {
symbol_value value;
if (lookup_symbol(symtab, name, SYM_CHANNEL, &value))
if (lookup_symbol(channeltab, name, SYM_CHANNEL, &value))
return ((log_channel)(value.pointer));
return (NULL);
}
static void
define_channel(char *name, log_channel channel) {
define_channel(const char *name, log_channel channel) {
symbol_value value;
value.pointer = channel;
define_symbol(symtab, name, SYM_CHANNEL, value, SYMBOL_FREE_KEY);
INSIST(log_inc_references(channel) == 0);
define_symbol(channeltab, name, SYM_CHANNEL, value, SYMBOL_FREE_VALUE);
}
static void
define_builtin_channels() {
define_channel(savestr("default_syslog", 1), syslog_channel);
define_channel(savestr("default_debug", 1), debug_channel);
define_channel(savestr("default_stderr", 1), stderr_channel);
define_channel(savestr("null", 1), null_channel);
define_channel("default_syslog", syslog_channel);
define_channel("default_debug", debug_channel);
define_channel("default_stderr", stderr_channel);
define_channel("null", null_channel);
}
static void
@ -1903,6 +1948,9 @@ parser_setup() {
if (authtab != NULL)
free_symbol_table(authtab);
authtab = new_symbol_table(AUTH_TABLE_SIZE, free_sym_value);
if (channeltab != NULL)
free_symbol_table(channeltab);
channeltab = new_symbol_table(AUTH_TABLE_SIZE, free_sym_value);
init_acls();
define_builtin_channels();
INIT_LIST(current_controls);
@ -1924,7 +1972,7 @@ parser_cleanup() {
*/
ip_match_list
lookup_acl(char *name) {
lookup_acl(const char *name) {
symbol_value value;
if (lookup_symbol(authtab, name, SYM_ACL, &value))
@ -1933,15 +1981,14 @@ lookup_acl(char *name) {
}
void
define_acl(char *name, ip_match_list iml) {
define_acl(const char *name, ip_match_list iml) {
symbol_value value;
INSIST(name != NULL);
INSIST(iml != NULL);
value.pointer = iml;
define_symbol(authtab, name, SYM_ACL, value,
SYMBOL_FREE_KEY|SYMBOL_FREE_VALUE);
define_symbol(authtab, name, SYM_ACL, value, SYMBOL_FREE_VALUE);
ns_debug(ns_log_parser, 7, "acl %s", name);
dprint_ip_match_list(ns_log_parser, iml, 2, "allow ", "deny ");
}
@ -1956,7 +2003,7 @@ lookup_key(char *name) {
}
void
define_key(char *name, struct dst_key *dst_key) {
define_key(const char *name, struct dst_key *dst_key) {
symbol_value value;
INSIST(name != NULL);
@ -1996,5 +2043,7 @@ void
parser_shutdown(void) {
if (authtab != NULL)
free_symbol_table(authtab);
if (channeltab != NULL)
free_symbol_table(channeltab);
lexer_shutdown();
}

View File

@ -66,8 +66,7 @@ new_symbol_table(int size_guess, free_function free_value) {
void
free_symbol(symbol_table st, symbol_entry ste) {
if (ste->flags & SYMBOL_FREE_KEY)
freestr(ste->key);
ste->key = freestr(ste->key);
if (ste->flags & SYMBOL_FREE_VALUE)
(st->free_value)(ste->type, ste->value.pointer);
}
@ -147,7 +146,7 @@ lookup_symbol(symbol_table st, const char *key, int type,
}
void
define_symbol(symbol_table st, char *key, int type, symbol_value value,
define_symbol(symbol_table st, const char *key, int type, symbol_value value,
unsigned int flags) {
int hash;
symbol_entry ste;
@ -161,7 +160,7 @@ define_symbol(symbol_table st, char *key, int type, symbol_value value,
ste = (symbol_entry)memget(sizeof *ste);
if (ste == NULL)
panic("memget failed in define_symbol()", NULL);
ste->key = key;
ste->key = savestr(key, 1);
ste->type = type;
ste->value = value;
ste->flags = flags;
@ -171,7 +170,7 @@ define_symbol(symbol_table st, char *key, int type, symbol_value value,
ns_debug(ns_log_parser, 7, "redefined symbol %s type %d",
key, type);
free_symbol(st, ste);
ste->key = key;
ste->key = savestr(key, 1);
ste->value = value;
ste->flags = flags;
}

View File

@ -22,7 +22,6 @@
* Symbol Table
*/
#define SYMBOL_FREE_KEY 0x01
#define SYMBOL_FREE_VALUE 0x02
typedef union symbol_value {
@ -52,8 +51,8 @@ void free_symbol_table(symbol_table);
void dprint_symbol_table(int, symbol_table);
int lookup_symbol(symbol_table, const char *, int,
symbol_value *);
void define_symbol(symbol_table, char *, int, symbol_value,
unsigned int);
void define_symbol(symbol_table, const char *, int,
symbol_value, unsigned int);
void undefine_symbol(symbol_table, char *, int type);
/*

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_req.c 4.47 (Berkeley) 7/1/91";
static const char rcsid[] = "$Id: ns_req.c,v 8.138.2.4 2001/08/10 03:00:14 marka Exp $";
static const char rcsid[] = "$Id: ns_req.c,v 8.162 2002/02/01 00:05:36 marka Exp $";
#endif /* not lint */
/*
@ -153,17 +153,143 @@ static enum req_action req_query(HEADER *hp, u_char **cpp, u_char *eom,
int *buflenp, int *msglenp,
u_char *msg, int dfd, int *ra,
struct sockaddr_in from,
struct tsig_record *in_tsig);
struct tsig_record *in_tsig,
u_int16_t udpsize);
static enum req_action req_iquery(HEADER *hp, u_char **cpp, u_char *eom,
int *buflenp, u_char *msg,
struct sockaddr_in from);
int *buflenp, struct sockaddr_in from);
#ifdef BIND_NOTIFY
static enum req_action req_notify(HEADER *hp, u_char **cpp, u_char *eom,
u_char *msg,struct sockaddr_in from);
#endif
/*
* See if there is a OPT record at the end of the message.
*
* Results:
* -1 FORMERR
* 0 last RR is not a OPT record
* n>0 lenght of OPT record
*/
int
ns_get_opt(u_char *msg, u_char *eom,
u_int8_t *versionp, u_int16_t *rcodep, u_int16_t *flagp,
u_int16_t *bufsizep, u_char **optionsp, size_t *optsizep)
{
HEADER *hp = (HEADER *) msg;
u_char *start, *options, *cp;
u_int8_t version;
u_int16_t rdlen, type, bufsize, flags, optsize, rcode;
int i, n, root;
if (msg == NULL || eom == NULL || (msg + HFIXEDSZ) > eom)
return (-1);
if (ntohs(hp->arcount) == 0)
return (0);
cp = msg + HFIXEDSZ;
n = ns_skiprr(cp, eom, ns_s_qd, ntohs(hp->qdcount));
if (n < 0)
return (-1);
cp += n;
n = ns_skiprr(cp, eom, ns_s_an, ntohs(hp->ancount));
if (n < 0)
return (-1);
cp += n;
n = ns_skiprr(cp, eom, ns_s_ns, ntohs(hp->nscount));
if (n < 0)
return (-1);
cp += n;
i = ntohs(hp->arcount);
while (i-- > 0) {
start = cp;
if (cp >= eom)
return (-1);
root = (*cp == 0);
n = dn_skipname(cp, eom);
if (n < 0)
return (-1);
cp += n;
if (cp + (2 + 2 + 4 + 2) > eom)
return (-1);
GETSHORT(type, cp);
if (type != ns_t_opt) {
cp += INT16SZ + INT32SZ; /* class, ttl */
GETSHORT(rdlen, cp);
if (cp + rdlen > eom)
return (-1);
cp += rdlen;
continue;
}
/* We have the OPT record. Check it out in detail. */
if (!root)
return (-1);
GETSHORT(bufsize, cp);
rcode = (*cp++ <<4) + hp->rcode ;
version = *cp++;
GETSHORT(flags, cp);
GETSHORT(rdlen, cp);
/* ensure options are well formed */
options = cp;
optsize = rdlen;
while (rdlen != 0) {
u_int16_t code;
u_int16_t len;
if (rdlen < 4)
return (-1);
GETSHORT(code, cp);
GETSHORT(len, cp);
rdlen -= 4;
if (len > rdlen)
return (-1);
cp += len;
rdlen -= len;
}
/* Everything checks out. */
if (versionp != NULL)
*versionp = version;
if (rcodep != NULL)
*rcodep = rcode;
if (flagp != NULL)
*flagp = flags;
if (bufsizep != NULL)
*bufsizep = bufsize;
if (optionsp != NULL)
*optionsp = options;
if (optsizep != NULL)
*optsizep = optsize;
return (cp - start);
}
/* OPT not found */
return (0);
}
int
ns_add_opt(u_char *msg, u_char *cp, size_t buflen, u_int8_t version,
u_int16_t rcode, u_int16_t size, u_int16_t flags,
u_char *options, size_t optlen)
{
HEADER *hp = (HEADER *) msg;
if ((cp + 1 + 2 + 2 + 4 + 2 + optlen) > (msg + buflen))
return (-1);
*cp++ = 0; /* "." */
PUTSHORT(ns_t_opt, cp); /* type */
PUTSHORT(size, cp); /* class (udp size) */
*cp++ = (rcode >> 4) & 0xff; /* ttl (rcode + version + flags) */
hp->rcode = rcode & 0xf;
*cp++ = version;
PUTSHORT(flags, cp);
PUTSHORT(optlen, cp); /* rdlen */
memcpy(cp, options, optlen); /* options */
hp->arcount = htons(ntohs(hp->arcount) + 1);
return (1 + 2 + 2 + 4 + 2 + optlen);
}
/*
* Process request using database; assemble and send response.
*/
@ -173,8 +299,8 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
{
HEADER *hp = (HEADER *) msg;
u_char *cp, *eom;
enum req_action action;
int n, ra, has_tsig, tsig_size, sig2len;
enum req_action action = Return;
int n, ra, has_tsig, tsig_size = 0, opt_size = 0, sig2len;
u_char *tsigstart;
u_char sig[TSIG_SIG_SIZE], sig2[TSIG_SIG_SIZE];
struct tsig_record *in_tsig = NULL;
@ -182,8 +308,13 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
int msglen_orig = msglen;
int buflen_orig = buflen;
int siglen = sizeof sig;
DST_KEY *key;
DST_KEY *key = NULL;
time_t tsig_time;
int opt = 0;
u_int8_t version = 0;
u_int16_t rcode = ns_r_noerror;
u_int16_t udpsize = 0;
int drop;
#ifdef DEBUG
if (debug > 3) {
@ -192,6 +323,10 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
}
#endif
drop = drop_port(ntohs(from.sin_port));
if (qsp == NULL && drop == 1)
return;
tsigstart = ns_find_tsig(msg, msg + msglen);
if (tsigstart == NULL)
has_tsig = 0;
@ -260,6 +395,7 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
in_tsig->siglen = siglen;
memcpy(in_tsig->sig, sig, siglen);
tsig_size = msglen_orig - msglen;
in_tsig->tsig_size = tsig_size;
} else if (has_tsig) {
action = Finish;
in_tsig = memget(sizeof(struct tsig_record));
@ -268,6 +404,7 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
in_tsig->key = NULL;
in_tsig->siglen = 0;
tsig_size = msg + msglen - tsigstart;
in_tsig->tsig_size = tsig_size;
msglen = tsigstart - msg;
}
@ -275,6 +412,30 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
nsid_hash((u_char *)&tt, sizeof(tt));
nsid_hash(msg, (msglen > 512) ? 512 : msglen);
if (error == NOERROR) {
opt = ns_get_opt(msg, msg + msglen, &version,
NULL, NULL, &udpsize, NULL, NULL);
if (opt < 0) {
rcode = ns_r_formerr;
action = Finish;
} else if (opt == 0) {
if (qsp == NULL && buflen > PACKETSZ)
buflen_orig = buflen = PACKETSZ;
} else if (opt > 0) {
if (version != 0) {
rcode = ns_r_badvers;
action = Finish;
}
opt_size = 11;
if (udpsize < 512)
udpsize = 512;
if (qsp == NULL && buflen > udpsize)
buflen_orig = buflen = udpsize;
}
} else if (qsp == NULL && buflen > PACKETSZ)
buflen_orig = buflen = PACKETSZ;
/*
* It's not a response so these bits have no business
* being set. will later simplify work if we can
@ -290,6 +451,8 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
if (error == NOERROR)
hp->rcode = ns_r_noerror;
if (rcode == ns_r_noerror)
rcode = hp->rcode;
cp = msg + HFIXEDSZ;
eom = msg + msglen;
buflen -= HFIXEDSZ;
@ -297,16 +460,17 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
free_addinfo(); /* sets addcount to zero */
dnptrs[0] = NULL;
if (error == NOERROR) {
if (error == NOERROR && rcode == ns_r_noerror) {
switch (hp->opcode) {
case ns_o_query:
action = req_query(hp, &cp, eom, qsp,
&buflen, &msglen,
msg, dfd, &ra, from, in_tsig);
msg, dfd, &ra, from,
in_tsig, udpsize);
break;
case ns_o_iquery:
action = req_iquery(hp, &cp, eom, &buflen, msg, from);
action = req_iquery(hp, &cp, eom, &buflen, from);
break;
#ifdef BIND_NOTIFY
@ -317,8 +481,7 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
#ifdef BIND_UPDATE
case ns_o_update:
action = req_update(hp, cp, eom, msg, qsp, dfd, from,
in_tsig);
action = req_update(hp, cp, eom, msg, from, in_tsig);
break;
#endif /* BIND_UPDATE */
@ -334,6 +497,7 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
hp->rcode = ns_r_notimpl;
action = Finish;
}
rcode = hp->rcode;
}
if (in_tsig != NULL) {
@ -341,6 +505,13 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
in_tsig = NULL;
}
/*
* Loop advoidance.
*/
if (qsp == NULL && drop == 2 &&
(hp->rcode == FORMERR || hp->rcode == NOTIMP))
action = Return;
/*
* Vector via internal opcode.
*/
@ -348,7 +519,7 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
case Return:
return;
case Refuse:
hp->rcode = ns_r_refused;
rcode = hp->rcode = ns_r_refused;
cp = eom;
/*FALLTHROUGH*/
case Finish:
@ -365,13 +536,14 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
hp->qr = 1; /* set Response flag */
hp->ra = ra; /* init above, may be modified by req_query */
if (!hp->tc && has_tsig > 0 && buflen < tsig_size)
if (!hp->tc && (has_tsig > 0 || opt > 0) &&
buflen < (tsig_size + opt_size))
hp->tc = 1;
/*
* If there was a format error, then we don't know what the msg has.
*/
if (hp->rcode == ns_r_formerr) {
if (hp->rcode == ns_r_formerr || rcode == ns_r_badvers) {
hp->qdcount = htons(0);
hp->ancount = htons(0);
hp->nscount = htons(0);
@ -380,44 +552,67 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
}
/*
* If the query had a TSIG and the message is truncated or there was
* a TSIG error, build a new message with no data and a TSIG.
* If the query had a TSIG / OPT and the message is truncated or
* there was a TSIG error, build a new message with no data and a
* TSIG / OPT.
*/
if ((hp->tc || error != NOERROR) && has_tsig > 0) {
if ((hp->tc || error != NOERROR) && (has_tsig > 0 || opt > 0)) {
sign_again:
hp->ancount = htons(0);
hp->nscount = htons(0);
hp->arcount = htons(0);
cp = msg + HFIXEDSZ;
cp += ns_skiprr(cp, msg + msglen, ns_s_qd, ntohs(hp->qdcount));
sig2len = sizeof sig2;
msglen = cp - msg;
buflen = buflen_orig - msglen;
n = ns_sign(msg, &msglen, msglen + buflen, error, key,
sig, siglen, sig2, &sig2len, tsig_time);
if (n == NS_TSIG_ERROR_NO_SPACE && ntohs(hp->qdcount) != 0) {
hp->qdcount = htons(0);
goto sign_again;
if (opt > 0) {
n = ns_add_opt(msg, cp, buflen_orig, 0,
rcode, EDNS_MESSAGE_SZ, 0, NULL, 0);
if (n < 0) {
hp->qdcount = htons(0);
goto sign_again;
}
cp += n;
}
if (has_tsig > 0) {
sig2len = sizeof sig2;
msglen = cp - msg;
buflen = buflen_orig - msglen;
n = ns_sign(msg, &msglen, msglen + buflen, error, key,
sig, siglen, sig2, &sig2len, tsig_time);
if (n == NS_TSIG_ERROR_NO_SPACE &&
ntohs(hp->qdcount) != 0) {
hp->qdcount = htons(0);
goto sign_again;
}
if (n != 0)
ns_info(ns_log_default,
"ns_req: unable to sign response");
cp = msg + msglen;
}
if (n != 0)
ns_info(ns_log_default,
"ns_req: unable to sign response");
cp = msg + msglen;
}
/* Either the message is not truncated or there was no TSIG */
/* Either the message is not truncated or there was no TSIG & OPT */
else {
/*
* Reserve space for tsig if required.
*/
if (has_tsig > 0)
buflen -= tsig_size;
if (has_tsig > 0 || opt_size != 0)
buflen -= tsig_size + opt_size;
INSIST(buflen >= 0);
msglen = cp - msg;
n = doaddinfo(hp, cp, buflen);
cp += n;
buflen -= n;
msglen += n;
if (opt > 0) {
buflen += opt_size;
n = ns_add_opt(msg, cp, msglen + buflen, 0,
rcode, EDNS_MESSAGE_SZ, 0, NULL, 0);
INSIST(n > 0);
cp += n;
buflen -= n;
}
if (has_tsig > 0) {
buflen += tsig_size;
sig2len = sizeof sig2;
msglen = cp - msg;
n = ns_sign(msg, &msglen, msglen + buflen, error, key,
sig, siglen, sig2, &sig2len, tsig_time);
if (n != 0) {
@ -608,16 +803,42 @@ req_notify(HEADER *hp, u_char **cpp, u_char *eom, u_char *msg,
}
#endif /*BIND_NOTIFY*/
static int
add_bind(HEADER *hp, u_char **cpp, u_char *msg, int *msglenp,
const char *label, const char *data)
{
u_char *tp;
hp->ancount = htons(1);
hp->nscount = htons(0);
hp->arcount = htons(0);
hp->rcode = ns_r_noerror;
hp->aa = 1;
hp->ra = 0;
copyCharString(cpp, label); /* Name */
copyCharString(cpp, "BIND");
*(*cpp)++ = 0x00;
PUTSHORT(T_TXT, *cpp); /* Type */
PUTSHORT(C_CHAOS, *cpp); /* Class */
PUTLONG(0, *cpp); /* TTL */
tp = *cpp; /* Temp RdLength */
PUTSHORT(0, *cpp);
copyCharString(cpp, data);
PUTSHORT((*cpp) - (tp + INT16SZ), tp); /* Real RdLength */
*msglenp = *cpp - msg; /* Total message length */
return (Finish);
}
static enum req_action
req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
int *buflenp, int *msglenp, u_char *msg, int dfd, int *ra,
struct sockaddr_in from, struct tsig_record *in_tsig)
struct sockaddr_in from, struct tsig_record *in_tsig,
u_int16_t udpsize)
{
int n, class, type, count, zone, foundname, founddata, omsglen, cname;
int recursion_blocked_by_acl;
u_int16_t id;
u_int32_t serial_ixfr;
u_int32_t serial_ixfr = 0;
int ixfr_found;
int ixfr_error = 0;
char dnbuf2[MAXDNAME];
@ -631,6 +852,8 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
struct zoneinfo *zp;
struct databuf *dp;
DST_KEY *in_key = (in_tsig != NULL) ? in_tsig->key : NULL;
int access_class;
int adjustlen = 0;
nameserIncr(from.sin_addr, nssRcvdQ);
@ -648,14 +871,19 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
/* valid queries have one question and zero answers */
if ((ntohs(hp->qdcount) != 1)
|| ntohs(hp->ancount) != 0
|| ntohs(hp->arcount) != 0) {
|| ntohs(hp->ancount) != 0) {
ns_debug(ns_log_default, 1,
"FORMERR Query header counts wrong");
hp->rcode = ns_r_formerr;
return (Finish);
}
if (ntohs(hp->arcount) != 0) {
ns_debug(ns_log_default, 1, "Ignoring addition section");
hp->arcount = htons(0);
adjustlen = 1;
}
/*
* Get domain name, class, and type.
*/
@ -680,8 +908,9 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
GETSHORT(type, *cpp);
GETSHORT(class, *cpp);
if (*cpp < eom && type != ns_t_ixfr) {
ns_debug(ns_log_default, 6,
"message length > received message");
if (!adjustlen)
ns_debug(ns_log_default, 6,
"message length > received message");
*msglenp = *cpp - msg;
}
@ -748,7 +977,7 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
}
GETLONG(serial_ixfr, *cpp);
/* ignore other soa counters */
if ((*cpp + (4 * INT32SZ)) < eom)
if ((*cpp + (4 * INT32SZ)) < eom && !adjustlen)
ns_debug(ns_log_default, 6,
"ixfr: message length > received message");
/* Reset msglenp to cover just the question. */
@ -838,9 +1067,15 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
/*
* Begin Access Control Point
*/
zone = DB_Z_CACHE;
/*
* Map class ANY to to class IN for the purpose of access control.
*/
access_class = (class == C_ANY && !ns_t_xfr_p(type)) ? C_IN : class;
if (np) {
#ifndef FORWARD_ALLOWS
struct namebuf *access_np;
/*
@ -855,13 +1090,35 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
for (access_np = np; access_np != NULL;
access_np = np_parent(access_np)) {
dp = access_np->n_data;
while (dp && dp->d_class != class)
while (dp && dp->d_class != access_class)
dp = dp->d_next;
if (dp != NULL) {
zone = dp->d_zone;
break;
}
}
#else
/*
* Try looking for forward zone. It can be deeper than
* any entry in the cache.
*/
if (zone == DB_Z_CACHE) {
char *s = dname;
int escape = 0;
while ((zp = find_zone(s, access_class)) == NULL) {
if (*s == '\0')
break;
while (*s != '\0' && (escape || *s != '.')) {
escape = escape ? 0 : (*s == '\\');
s++;
}
if (*s == '.')
s++;
}
if (zp != NULL)
zone = zp - zones;
}
#endif
}
zp = &zones[zone];
@ -941,8 +1198,9 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
for (access_np = np; access_np != NULL;
access_np = np_parent(access_np)) {
dp = access_np->n_data;
while (dp && (dp->d_class != class ||
dp->d_zone == DB_Z_CACHE))
while (dp &&
(dp->d_class != access_class ||
dp->d_zone == DB_Z_CACHE))
dp = dp->d_next;
if (dp != NULL) {
zone = dp->d_zone;
@ -961,9 +1219,9 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
}
}
ns_notice(ns_log_security,
"denied query from %s for \"%s\" %s",
"denied query from %s for \"%s\" %s/%s",
sin_ntoa(from), *dname ? dname : ".",
p_class(class));
p_type(type), p_class(class));
nameserIncr(from.sin_addr, nssRcvdUQ);
return (Refuse);
}
@ -1054,28 +1312,18 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
* Yow!
*/
if (class == ns_c_chaos && type == ns_t_txt &&
ns_samename(dnbuf, "VERSION.BIND") == 1) {
u_char *tp;
ns_samename(dnbuf, "VERSION.BIND") == 1 &&
server_options->version != NULL &&
server_options->version[0] != '\0')
return (add_bind(hp, cpp, msg, msglenp,
"VERSION", server_options->version));
hp->ancount = htons(1);
hp->nscount = htons(0);
hp->arcount = htons(0);
hp->rcode = ns_r_noerror;
hp->aa = 1;
hp->ra = 0;
copyCharString(cpp, "VERSION"); /* Name */
copyCharString(cpp, "BIND");
*(*cpp)++ = 0x00;
PUTSHORT(T_TXT, *cpp); /* Type */
PUTSHORT(C_CHAOS, *cpp); /* Class */
PUTLONG(0, *cpp); /* TTL */
tp = *cpp; /* Temp RdLength */
PUTSHORT(0, *cpp);
copyCharString(cpp, server_options->version);
PUTSHORT((*cpp) - (tp + INT16SZ), tp); /* Real RdLength */
*msglenp = *cpp - msg; /* Total message length */
return (Finish);
}
if (class == ns_c_chaos && type == ns_t_txt &&
ns_samename(dnbuf, "HOSTNAME.BIND") == 1 &&
server_options->hostname != NULL &&
server_options->hostname[0] != '\0')
return (add_bind(hp, cpp, msg, msglenp,
"HOSTNAME", server_options->hostname));
/*
* If we don't know anything about the requested name,
@ -1365,8 +1613,9 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
if (n < 0) {
ns_info(ns_log_default, "res_mkquery(%s) failed",
dname);
hp->rcode = ns_r_servfail;
memcpy(msg, omsg, omsglen);
memput(omsg, omsglen);
hp->rcode = ns_r_servfail;
free_nsp(nsp);
return (Finish);
}
@ -1375,7 +1624,9 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
n = ns_forw(nsp, msg, *msglenp, from, qsp, dfd, &qp,
dname, class, type, np, 0, in_tsig);
if (n != FW_OK && cname) {
memcpy(msg, omsg, omsglen);
memput(omsg, omsglen);
*msglenp = omsglen;
omsg = NULL;
}
switch (n) {
@ -1387,6 +1638,11 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
qp->q_cmsgsize = omsglen;
qp->q_id = id;
}
if (udpsize != 0) {
qp->q_flags |= Q_EDNS;
qp->q_udpsize = udpsize;
} else
qp->q_udpsize = PACKETSZ;
break;
case FW_DUP:
break; /* Duplicate request dropped */
@ -1441,7 +1697,7 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
static enum req_action
req_iquery(HEADER *hp, u_char **cpp, u_char *eom, int *buflenp,
u_char *msg, struct sockaddr_in from)
struct sockaddr_in from)
{
u_int rdata_offset;
size_t alen;
@ -1561,7 +1817,7 @@ req_iquery(HEADER *hp, u_char **cpp, u_char *eom, int *buflenp,
*buflenp -= INT16SZ;
hp->qdcount = htons(1);
if (alen > *buflenp) {
if ((int)alen > *buflenp) {
hp->tc = 1;
return (Finish);
}
@ -1578,6 +1834,10 @@ int
stale(struct databuf *dp) {
struct zoneinfo *zp = &zones[dp->d_zone];
#ifdef CHECK_MAGIC
INSIST(dp->d_magic == DATABUF_MAGIC);
#endif
switch (zp->z_type) {
case z_master:
@ -1662,6 +1922,7 @@ make_rr(const char *name, struct databuf *dp, u_char *buf,
int32_t n;
int16_t type = dp->d_type;
u_int32_t ttl;
u_char naptr_flag;
ns_debug(ns_log_default, 5,
"make_rr(%s, %lx, %lx, %d, %d) %d zone %d ttl %lu",
@ -1801,6 +2062,7 @@ make_rr(const char *name, struct databuf *dp, u_char *buf,
buflen -= n + 1;
if (buflen < 0)
goto cleanup;
naptr_flag = (n == 1) ? *cp1 : 0;
*cp++ = n;
memcpy(cp, cp1, n);
cp += n;
@ -1839,6 +2101,14 @@ make_rr(const char *name, struct databuf *dp, u_char *buf,
if (n < 0)
goto cleanup;
cp += n;
if (doadd && *cp1 != 0) {
if (naptr_flag == 's' || naptr_flag == 'S')
addname((char*)cp1, name, type, T_SRV,
dp->d_class);
if (naptr_flag == 'a' || naptr_flag == 'A')
addname((char*)cp1, name, type, T_A,
dp->d_class);
}
/* save data length */
n = (u_int16_t)((cp - sp) - INT16SZ);
@ -2022,8 +2292,9 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
const char *fname;
register int n, count;
register int ns_logging;
int finishedA = 0;
int save_addcount = addcount;
int pass = 0;
int i, doadd;
if (!addcount)
return (0);
@ -2043,15 +2314,18 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
count = 0;
cp = msg;
loop:
for (ap = addinfo; --addcount >= 0; ap++) {
for (ap = addinfo, i = 0; i < addcount; ap++, i++) {
int foundany = 0,
foundcname = 0,
save_count = count,
save_msglen = msglen;
u_char *save_cp = cp;
if ((finishedA == 1 && ap->a_type == T_A) ||
(finishedA == 0 && ap->a_type == T_KEY))
if ((pass != 0 &&
(pass != 1 || server_options->preferred_glue == 0) &&
ap->a_type == T_A) ||
(pass != 0 && ap->a_type == T_SRV) ||
(pass != 2 && ap->a_type == T_KEY))
continue;
if (ns_logging)
ns_debug(ns_log_default, 3,
@ -2066,35 +2340,52 @@ loop:
/* look for the data */
(void)delete_stale(np);
for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
if (dp->d_rcode)
if (dp->d_rcode == NXDOMAIN) {
if (dp->d_class == ap->a_class)
foundany++;
continue;
}
if ((match(dp, (int)ap->a_class, T_CNAME) &&
dp->d_type == T_CNAME) ||
(match(dp, C_IN, T_CNAME) &&
dp->d_type == T_CNAME)) {
foundcname++;
break;
}
if (pass == 0 && ap->a_type == T_A &&
server_options->preferred_glue != 0 &&
!match(dp, (int)ap->a_class,
server_options->preferred_glue)) {
continue;
}
if (pass != 0 && ap->a_type == T_A &&
server_options->preferred_glue != 0 &&
match(dp, (int)ap->a_class,
server_options->preferred_glue)) {
continue;
}
if (ap->a_type == T_A &&
!match(dp, (int)ap->a_class, T_A) &&
!match(dp, C_IN, T_A) &&
!match(dp, (int)ap->a_class, T_AAAA) &&
!match(dp, C_IN, T_AAAA) &&
!match(dp, (int)ap->a_class, ns_t_a6) &&
!match(dp, C_IN, ns_t_a6)) {
!match(dp, (int)ap->a_class, ns_t_a6)) {
continue;
}
if (ap->a_type == T_KEY &&
!match(dp, (int)ap->a_class, T_KEY) &&
!match(dp, C_IN, T_KEY))
!match(dp, (int)ap->a_class, T_KEY))
continue;
if (ap->a_type == T_SRV &&
!match(dp, (int)ap->a_class, T_SRV))
continue;
foundany++;
if (dp->d_rcode)
continue;
/*
* Should be smart and eliminate duplicate
* data here. XXX
*/
if ((n = make_rr(ap->a_dname, dp, cp, msglen, 0,
doadd = 0;
if (ap->a_type == T_SRV)
doadd = 1;
if ((n = make_rr(ap->a_dname, dp, cp, msglen, doadd,
dnptrs, dnptrs_end, 0)) < 0) {
/* truncation in the additional-data section
* is not all that serious. we do not set TC,
@ -2130,7 +2421,8 @@ loop:
(ap->a_type == T_A || ap->a_type == T_AAAA)) {
/* ask a real server for this info */
(void) sysquery(ap->a_dname, (int)ap->a_class,
ap->a_type, NULL, 0, ns_port, QUERY);
ap->a_type, NULL, NULL, 0, ns_port,
QUERY, 0);
}
if (foundcname) {
if (!haveComplained(nhash(ap->a_dname),
@ -2141,15 +2433,15 @@ loop:
p_type(ap->a_rtype), ap->a_dname);
}
}
freestr(ap->a_dname);
freestr(ap->a_rname);
}
if (finishedA == 0) {
finishedA = 1;
addcount = save_addcount;
if (pass++ < 2)
goto loop; /* now do the KEYs... */
}
hp->arcount = htons((u_int16_t)count);
for (ap = addinfo, i = 0; i < addcount; ap++, i++) {
ap->a_dname = freestr(ap->a_dname);
ap->a_rname = freestr(ap->a_rname);
}
addcount = 0;
return (cp - msg);
}
@ -2188,27 +2480,16 @@ free_addinfo() {
struct addinfo *ap;
for (ap = addinfo; --addcount >= 0; ap++) {
freestr(ap->a_dname);
freestr(ap->a_rname);
ap->a_dname = freestr(ap->a_dname);
ap->a_rname = freestr(ap->a_rname);
}
addcount = 0;
}
void
free_nsp(struct databuf **nsp) {
while (*nsp) {
DRCNTDEC(*nsp);
if ((*nsp)->d_rcnt)
ns_debug(ns_log_default, 3, "free_nsp: %s rcnt %d",
(*nsp)->d_data, (*nsp)->d_rcnt);
else {
ns_debug(ns_log_default, 3,
"free_nsp: %s rcnt %d delayed",
(*nsp)->d_data, (*nsp)->d_rcnt);
db_freedata(*nsp); /* delayed free */
}
*nsp++ = NULL;
}
while (*nsp)
db_detach(nsp++);
}
static void
@ -2218,3 +2499,20 @@ copyCharString(u_char **dst, const char *src) {
memcpy(*dst, src, len);
*dst += len;
}
/*
* Questionable source ports for queries / responses.
*/
int
drop_port(u_int16_t port) {
switch (port) {
case 7: /* echo */
case 13: /* daytime */
case 19: /* chargen */
case 37: /* time */
return (1);
case 464: /* kpasswd */
return (2);
}
return (0);
}

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_resp.c 4.65 (Berkeley) 3/3/91";
static const char rcsid[] = "$Id: ns_resp.c,v 8.152 2001/02/13 23:28:31 marka Exp $";
static const char rcsid[] = "$Id: ns_resp.c,v 8.172 2002/01/31 00:06:41 marka Exp $";
#endif /* not lint */
/*
@ -182,7 +182,9 @@ static int rrsetcmp(char *, struct db_list *, struct hashbuf *),
struct sockaddr_in, char **);
static void mark_bad(struct qinfo *qp, struct sockaddr_in from);
static void mark_lame(struct qinfo *qp, struct sockaddr_in from);
static void fast_retry(struct qinfo *qp, struct sockaddr_in from);
static int mark_noedns(struct qinfo *qp, struct sockaddr_in from);
static void fast_retry(struct qinfo *qp, struct sockaddr_in from,
int samehost);
static void add_related_additional(char *);
static void free_related_additional(void);
static int related_additional(char *);
@ -198,11 +200,12 @@ static char *related[MAX_RELATED];
static char *
learntFrom(struct qinfo *qp, struct sockaddr_in *server) {
static char *buf = NULL;
char *a, *ns, *na;
const char *a, *ns, *na;
struct databuf *db;
int i;
char nsbuf[20];
char abuf[20];
static const char fmt[] = " '%s': learnt (A=%s,NS=%s)";
a = ns = na = "<Not Available>";
@ -243,23 +246,11 @@ learntFrom(struct qinfo *qp, struct sockaddr_in *server) {
if (*na == '\0')
na = "\".\"";
if (NS_OPTION_P(OPTION_HOSTSTATS)) {
static const char fmt[] = " '%s': learnt (A=%s,NS=%s)";
buf = newstr(sizeof fmt + strlen(na) + strlen(a) + strlen(ns),
0);
if (buf == NULL)
return (NULL);
sprintf(buf, fmt, na, a, ns);
} else {
static const char fmt[] = " '%s'";
buf = newstr(sizeof fmt + strlen(na), 0);
if (buf == NULL)
return (NULL);
sprintf(buf, fmt, na);
}
buf = newstr(sizeof fmt + strlen(na) + strlen(a) + strlen(ns), 0);
if (buf == NULL)
return (NULL);
sprintf(buf, fmt, na, a, ns);
return (buf);
}
@ -289,7 +280,7 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
char *dname, tmpdomain[MAXDNAME];
const char *fname;
const char *formerrmsg = "brain damage";
u_char newmsg[PACKETSZ];
u_char newmsg[EDNS_MESSAGE_SZ];
u_char **dpp, *tp;
time_t rtrip;
struct hashbuf *htp;
@ -299,10 +290,10 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
int forcecmsg = 0;
char *tname = NULL;
int sendto_errno = 0;
int has_tsig, oldqlen;
u_char *oldqbuf;
u_char *smsg;
int smsglen, smsgsize, siglen;
int has_tsig, oldqlen = 0;
u_char *oldqbuf = NULL;
u_char *smsg = NULL;
int smsglen, smsgsize = 0, siglen;
u_char sig[TSIG_SIG_SIZE];
time_t tsig_time;
DST_KEY *key;
@ -419,25 +410,34 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
&& hp->opcode != NS_NOTIFY_OP
#endif
)) {
int noedns = 1;
ns_debug(ns_log_default, 2,
"resp: error (ret %d, op %d), dropped",
hp->rcode, hp->opcode);
switch (hp->rcode) {
case SERVFAIL:
nameserIncr(from.sin_addr, nssRcvdFail);
noedns = mark_noedns(qp, from);
break;
case FORMERR:
nameserIncr(from.sin_addr, nssRcvdFErr);
noedns = mark_noedns(qp, from);
break;
case NOTIMP:
nameserIncr(from.sin_addr, nssRcvdErr);
noedns = mark_noedns(qp, from);
break;
default:
nameserIncr(from.sin_addr, nssRcvdErr);
break;
}
if (ns_samename(qp->q_name, qp->q_domain) == 1 &&
hp->rcode == SERVFAIL && hp->opcode == QUERY)
hp->rcode == SERVFAIL && hp->opcode == QUERY &&
noedns)
mark_lame(qp, from);
mark_bad(qp, from);
fast_retry(qp, from);
if (noedns)
mark_bad(qp, from);
fast_retry(qp, from, noedns ? 0 : 1);
return;
}
@ -540,6 +540,8 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
(1 - ALPHA) * rtrip;
if (t > 65535)
t = 65535;
else if (t == 0)
t = 1;
ns->d_nstime = (u_int16_t)t;
}
@ -580,15 +582,17 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
continue;
if (qs->stime.tv_sec) {
if (ns2->d_nstime == 0)
t = (rtrip * BETA);
t = (rtrip * BETA) + 1;
else
t = ns2->d_nstime * BETA
+
(1 - ALPHA) * rtrip;
(1 - ALPHA) * rtrip + 1;
} else
t = ns2->d_nstime * GAMMA;
if (t > 65535)
t = 65535;
else if (t == 0)
t = 1;
ns2->d_nstime = (u_int16_t)t;
if (ns_wouldlog(ns_log_default, 2)) {
ns_debug(ns_log_default, 2,
@ -688,7 +692,7 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
}
qs->serial = serial;
}
retry(qp);
retry(qp, 0);
return;
}
@ -702,7 +706,7 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
#endif
) {
u_char *tp;
int type, class, dlen;
int type, class = 0, dlen;
int foundns, foundsoa;
#ifdef DEBUG
if (debug > 0)
@ -778,7 +782,7 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
(learnt_from == NULL) ? "" :
learnt_from);
if (learnt_from != NULL)
freestr(learnt_from);
learnt_from = freestr(learnt_from);
} else if (fwd != NULL) {
if (!haveComplained(ina_ulong(from.sin_addr),
(u_long)nonRecursiveForwarder))
@ -787,7 +791,7 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
sin_ntoa(from));
}
fast_retry(qp, from);
fast_retry(qp, from, 0);
return;
}
}
@ -833,7 +837,10 @@ tcp_retry:
nsa = Q_NEXTADDR(qp, 0);
key = tsig_key_from_addr(nsa->sin_addr);
key = qp->q_keys[0];
if (key != NULL)
key = qp->q_keys[0] =
tsig_key_from_addr(nsa->sin_addr);
if (key != NULL) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE;
smsg = memget(smsgsize);
@ -849,17 +856,16 @@ tcp_retry:
qp->q_msglen = smsglen;
qp->q_msg = smsg;
has_tsig = 1;
free_tsig(qp->q_nstsig);
qp->q_nstsig = new_tsig(key, sig,
siglen);
}
else {
} else {
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
INSIST(0);
}
}
else {
} else {
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
@ -871,7 +877,7 @@ tcp_retry:
* failed, but we'll try to press on because
* there isn't anything else to do.
*/
retry(qp);
retry(qp, 0);
if (has_tsig == 1) {
memput(qp->q_msg, smsgsize);
@ -892,14 +898,14 @@ tcp_retry:
/* mark this server as bad */
mark_bad(qp, from);
/* try another server, it may have a bigger write buffer */
retry(qp);
retry(qp, 0);
return;
}
tp = cp;
restart = 0;
validanswer = 0;
validanswer = -1;
nscount = 0;
soacount = 0;
cname = 0;
@ -958,7 +964,8 @@ tcp_retry:
ns_debug(ns_log_resp_checks, 3,
"ignoring answer '%s' after external cname",
name);
db_freedata(dp);
db_detach(&dp);
validanswer = 0;
continue;
}
if (type == T_CNAME &&
@ -969,7 +976,8 @@ tcp_retry:
cname++;
lastwascname = 1;
} else {
validanswer = 1;
if (validanswer)
validanswer = 1;
lastwascname = 0;
}
@ -986,7 +994,8 @@ tcp_retry:
if (lastwascname) {
ns_debug(ns_log_resp_checks, 3,
"last was cname, ignoring auth. and add.");
db_freedata(dp);
db_detach(&dp);
validanswer = 0;
break;
}
if (i < arfirst) {
@ -1000,19 +1009,21 @@ tcp_retry:
aname[0] ? aname : ".",
name[0] ? name : ".",
sin_ntoa(from));
db_freedata(dp);
db_detach(&dp);
validanswer = 0;
continue;
} else if (fwd == NULL &&
!ns_samedomain(name,
} else if (!ns_samedomain(name,
qp->q_domain)) {
if (!externalcname)
if (fwd == NULL &&
!externalcname)
ns_info(ns_log_resp_checks,
"bad referral (%s !< %s) from %s",
name[0] ? name : ".",
qp->q_domain[0] ?
qp->q_domain : ".",
sin_ntoa(from));
db_freedata(dp);
db_detach(&dp);
validanswer = 0;
continue;
}
if (type == T_NS) {
@ -1036,7 +1047,8 @@ tcp_retry:
"invalid RR type '%s' in authority section (name = '%s') from %s",
p_type(type), name,
sin_ntoa(from));
db_freedata(dp);
db_detach(&dp);
validanswer = 0;
continue;
}
dp->d_cred = (hp->aa && (cname == 0)) ?
@ -1048,12 +1060,14 @@ tcp_retry:
switch (type) {
case T_A:
case T_AAAA:
case T_SRV:
if (externalcname ||
!ns_samedomain(name, qp->q_domain)) {
ns_debug(ns_log_resp_checks, 3,
"ignoring additional info '%s' type %s",
name, p_type(type));
db_freedata(dp);
db_detach(&dp);
validanswer = 0;
continue;
}
if (!related_additional(name)) {
@ -1061,9 +1075,14 @@ tcp_retry:
"unrelated additional info '%s' type %s from %s",
name, p_type(type),
sin_ntoa(from));
db_freedata(dp);
db_detach(&dp);
validanswer = 0;
continue;
}
if (type == T_SRV && tname != NULL) {
add_related_additional(tname);
tname = NULL;
}
break;
case T_KEY:
/* XXX check? */
@ -1076,12 +1095,20 @@ tcp_retry:
* it might be a transaction signature.
*/
break;
case ns_t_opt:
/*
* OPT does not get cached.
*/
db_detach(&dp);
validanswer = 0;
continue;
default:
ns_info(ns_log_resp_checks,
"invalid RR type '%s' in additional section (name = '%s') from %s",
p_type(type), name,
sin_ntoa(from));
db_freedata(dp);
db_detach(&dp);
validanswer = 0;
continue;
}
dp->d_cred = (qp->q_flags & Q_PRIMING)
@ -1094,6 +1121,7 @@ tcp_retry:
++db_total_hits;
#endif /* HITCOUNTS */
rrsetadd(flushset, name, dp);
db_detach(&dp);
}
free_related_additional();
freestr_maybe(&tname);
@ -1121,7 +1149,7 @@ tcp_retry:
if ((qp->q_flags & Q_PRIMING) && !check_root()) {
/* mark server as bad */
mark_bad(qp, from);
fast_retry(qp, from);
fast_retry(qp, from, 0);
return;
}
ns_debug(ns_log_default, 3,
@ -1138,7 +1166,7 @@ tcp_retry:
return;
}
if (ancount && count && !validanswer) {
if (ancount && count && validanswer != 1) {
/*
* Everything passed validation but we didn't get the
* final answer. The response must have contained
@ -1212,10 +1240,10 @@ tcp_retry:
*/
if (qp->q_cmsglen != 0) {
ns_debug(ns_log_default, 1, "Cname second pass");
newmsglen = MIN(PACKETSZ, qp->q_cmsglen);
newmsglen = MIN(EDNS_MESSAGE_SZ, qp->q_cmsglen);
memcpy(newmsg, qp->q_cmsg, newmsglen);
} else {
newmsglen = MIN(PACKETSZ, msglen);
newmsglen = MIN(EDNS_MESSAGE_SZ, msglen);
memcpy(newmsg, msg, newmsglen);
}
hp = (HEADER *) newmsg;
@ -1398,13 +1426,13 @@ tcp_retry:
/* Reset the query control structure */
ns_freeqns(qp, "ns_resp");
ns_freeqns(qp);
qp->q_naddr = 0;
qp->q_curaddr = 0;
nsfwdadd(qp, NS_ZFWDTAB(qp->q_fzone));
if (qp->q_domain != NULL)
freestr(qp->q_domain);
(void)freestr(qp->q_domain);
getname(np, tmpdomain, sizeof tmpdomain);
qp->q_domain = savestr(tmpdomain, 1);
@ -1471,7 +1499,7 @@ tcp_retry:
goto servfail;
}
if (qp->q_name != NULL)
freestr(qp->q_name);
(void)freestr(qp->q_name);
qp->q_name = savestr(dname, 1);
qp->q_msglen = n;
hp = (HEADER *) qp->q_msg;
@ -1497,36 +1525,46 @@ tcp_retry:
res_pquery(&res, qp->q_msg, qp->q_msglen,
log_get_stream(packet_channel));
#endif
key = tsig_key_from_addr(nsa->sin_addr);
if (key != NULL) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE;
key = qp->q_keys[0];
if (key == NULL)
key = qp->q_keys[0] = tsig_key_from_addr(nsa->sin_addr);
if (key != NULL || !qp->q_addr[0].noedns) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE + 11;
smsg = memget(smsgsize);
smsglen = qp->q_msglen;
siglen = sizeof(sig);
memcpy(smsg, qp->q_msg, qp->q_msglen);
}
if (!qp->q_addr[0].noedns)
smsglen += ns_add_opt(smsg, smsg + smsglen, smsgsize, 0, 0,
EDNS_MESSAGE_SZ, 0, NULL, 0);
if (key != NULL) {
n = ns_sign(smsg, &smsglen, smsgsize, NOERROR, key, NULL, 0,
sig, &siglen, 0);
if (n == 0) {
oldqbuf = qp->q_msg;
oldqlen = qp->q_msglen;
qp->q_msglen = smsglen;
qp->q_msg = smsg;
has_tsig = 1;
free_tsig(qp->q_nstsig);
qp->q_nstsig = new_tsig(key, sig, siglen);
}
else {
} else {
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
INSIST(0);
}
}
else {
} else {
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
}
if (smsg != NULL) {
oldqbuf = qp->q_msg;
oldqlen = qp->q_msglen;
qp->q_msglen = smsglen;
qp->q_msg = smsg;
}
if (qp->q_flags & Q_USEVC) {
if (tcp_send(qp) != NOERROR) {
if (!haveComplained(ina_ulong(nsa->sin_addr),
@ -1546,8 +1584,9 @@ tcp_retry:
sin_ntoa(*nsa), strerror(errno));
nameserIncr(nsa->sin_addr, nssSendtoErr);
}
if (has_tsig == 1) {
memput(qp->q_msg, smsgsize);
if (smsgsize != 0) {
memput(smsg, smsgsize);
qp->q_msg = oldqbuf;
qp->q_msglen = oldqlen;
}
@ -1570,7 +1609,7 @@ tcp_retry:
if (!haveComplained(ina_ulong(from.sin_addr), (u_long)formerrmsg))
ns_info(ns_log_resp_checks, "Malformed response from %s (%s)",
sin_ntoa(from), formerrmsg);
fast_retry(qp, from);
fast_retry(qp, from, 0);
free_nsp(nsp);
return;
@ -1682,7 +1721,7 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
BOUNDS_CHECK(cp, 2*INT16SZ + INT32SZ + INT16SZ);
GETSHORT(type, cp);
GETSHORT(class, cp);
if (class > CLASS_MAX) {
if (type != ns_t_opt && class > CLASS_MAX) {
ns_debug(ns_log_default, 3, "bad class in rrextract");
hp->rcode = FORMERR;
return (-1);
@ -1867,6 +1906,9 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
}
cp += n;
if (tnamep != NULL && *cp1 != 0)
*tnamep = savestr((char *)cp1, 1);
/* compute end of data */
cp1 += strlen((char *)cp1) + 1;
/* compute size of data */
@ -1959,7 +2001,7 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
break;
case T_SIG: {
u_long origTTL, exptime, signtime, timetilexp, now;
u_int32_t origTTL, exptime, signtime, timetilexp, now;
u_int8_t alg;
/* Check signature time, expiration, and adjust TTL. */
@ -1978,8 +2020,8 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
/* Don't let bogus name servers increase the signed TTL */
if (ttl > origTTL) {
ns_debug(ns_log_default, 3,
"shrinking SIG TTL from %d to origTTL %d",
ttl, origTTL);
"shrinking SIG TTL from %lu to origTTL %lu",
(unsigned long)ttl, (unsigned long)origTTL);
ttl = origTTL;
}
@ -2020,7 +2062,7 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
/* then the signer's name */
n = dn_expand(msg, eom, cp, (char *)cp1, (sizeof data) - 18);
if (n < 0 || n + NS_SIG_SIGNER > dlen) {
if (n < 0 || n + NS_SIG_SIGNER > (int)dlen) {
hp->rcode = FORMERR;
return (-1);
}
@ -2031,7 +2073,7 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
Its size is the total data length, minus what we copied. */
n = dlen - (NS_SIG_SIGNER + n);
if (n > (sizeof data) - (cp1 - (u_char *)data)) {
if (n > (int)(sizeof data) - (cp1 - (u_char *)data)) {
hp->rcode = FORMERR;
return (-1); /* out of room! */
}
@ -2072,7 +2114,7 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
* because we always have to look at the 0 bit to see if
* this is a "different format" NXT or not.
*/
if (n < 0 || n >= dlen) {
if (n < 0 || n >= (int)dlen) {
hp->rcode = FORMERR;
return (-1);
}
@ -2109,7 +2151,7 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
return (-1);
}
}
if (n2 > sizeof data - n1) {
if (n2 > (int)(sizeof data - n1)) {
hp->rcode = FORMERR;
return (-1);
}
@ -2123,8 +2165,11 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
break;
default:
/* treat as opaque data */
ns_debug(ns_log_default, 3, "unknown type %d", type);
return ((cp - rrp) + dlen);
cp1 = cp;
n = dlen;
cp += n;
}
if (cp > eom) {
@ -2147,6 +2192,8 @@ rrextract(u_char *msg, int msglen, u_char *rrp, struct databuf **dpp,
}
ttl += tt.tv_sec;
if (type == ns_t_opt)
class = 0; /* Lie. */
*dpp = savedata(class, type, ttl, cp1, n);
return (cp - rrp);
}
@ -2155,14 +2202,23 @@ int
send_msg(u_char *msg, int msglen, struct qinfo *qp) {
HEADER *hp = (HEADER *) msg;
u_char *oldmsg;
int oldlen;
int oldlen = 0;
int msgsize;
int ret;
int trunc;
int adjust = 0;
if (qp->q_flags & Q_SYSTEM)
return (1);
if (!qp->q_stream && (msglen > PACKETSZ))
msglen = trunc_adjust(msg, msglen, PACKETSZ);
trunc = (qp->q_stream != NULL) ? 65535 : qp->q_udpsize;
if (qp->q_tsig != NULL)
adjust += qp->q_tsig->tsig_size;
if ((qp->q_flags & Q_EDNS) != 0)
adjust += 11;
if (msglen > trunc - adjust)
msglen = trunc_adjust(msg, msglen, trunc - adjust);
if (ns_wouldlog(ns_log_default, 1)) {
ns_debug(ns_log_default, 1, "send_msg -> %s (%s %d) id=%d",
sin_ntoa(qp->q_from),
@ -2187,21 +2243,25 @@ send_msg(u_char *msg, int msglen, struct qinfo *qp) {
(u_long)qp->q_next, (u_long)qp->q_link);
}
}
if (debug >= 6)
res_pquery(&res, msg, msglen, log_get_stream(packet_channel));
#endif /* DEBUG */
if (adjust != 0) {
oldmsg = msg;
oldlen = msglen;
msgsize = msglen + adjust;
msg = memget(msgsize);
memcpy(msg, oldmsg, oldlen);
} else
msgsize = msglen; /* silence compiler */
if ((qp->q_flags & Q_EDNS) != 0)
msglen += ns_add_opt(msg, msg + msglen, msgsize, 0,
hp->rcode, EDNS_MESSAGE_SZ, 0, NULL, 0);
if (qp->q_tsig != NULL) {
u_char sig[TSIG_SIG_SIZE];
int siglen = sizeof(sig);
oldmsg = msg;
oldlen = msglen;
msgsize = msglen + TSIG_BUF_SIZE;
msg = memget(msgsize);
memcpy(msg, oldmsg, oldlen);
ret = ns_sign(msg, &msglen, msgsize, NOERROR, qp->q_tsig->key,
qp->q_tsig->sig, qp->q_tsig->siglen,
sig, &siglen, 0);
@ -2210,22 +2270,19 @@ send_msg(u_char *msg, int msglen, struct qinfo *qp) {
INSIST(0);
}
}
#ifdef DEBUG
if (debug >= 6)
res_pquery(&res, msg, msglen, log_get_stream(packet_channel));
#endif /* DEBUG */
if (qp->q_stream == NULL) {
/*
* Don't send FORMERR to these well known ports
* (loop avoidance).
* Don't send FORMERR to certian well known ports.
*/
switch (ntohs(qp->q_from.sin_port)) {
case 7: /* echo */
case 13: /* daytime */
case 19: /* chargen */
case 37: /* time */
if (hp->rcode == FORMERR)
if (hp->rcode == FORMERR &&
drop_port(ntohs(qp->q_from.sin_port)))
return (-1);
default:
break;
}
if (sendto(qp->q_dfd, (char*)msg, msglen, 0,
(struct sockaddr *)&qp->q_from,
sizeof(qp->q_from)) < 0) {
@ -2244,8 +2301,8 @@ send_msg(u_char *msg, int msglen, struct qinfo *qp) {
} else
writestream(qp->q_stream, (u_char*)msg, msglen);
if (qp->q_tsig != NULL)
memput(msg, oldlen + TSIG_BUF_SIZE);
if (adjust != 0)
memput(msg, oldlen + adjust);
return (0);
}
@ -2266,7 +2323,8 @@ prime_cache(void) {
priming, root);
if (!priming && !root) {
struct qinfo *qp = sysquery("", ns_c_in, ns_t_ns,
NULL, 0, ns_port, ns_o_query);
NULL, NULL, 0, ns_port,
ns_o_query, 0);
if (qp != NULL) {
qp->q_flags |= (Q_SYSTEM | Q_PRIMING);
@ -2278,7 +2336,8 @@ prime_cache(void) {
struct qinfo *
sysquery(const char *dname, int class, int type,
struct in_addr *nss, int nsc, u_int16_t port, int opcode)
struct in_addr *nss, struct dst_key **keys, int nsc,
u_int16_t port, int opcode, int distance)
{
struct qinfo *qp, *oqp;
HEADER *hp;
@ -2292,18 +2351,20 @@ sysquery(const char *dname, int class, int type,
const char *fname;
int n, count;
int sendto_errno = 0;
u_char *oldqbuf;
int oldqlen, has_tsig;
u_char *smsg;
int smsglen, smsgsize, siglen;
u_char *oldqbuf = NULL;
int oldqlen = 0, has_tsig;
u_char *smsg = NULL;
int smsglen, smsgsize = 0, siglen;
u_char sig[TSIG_SIG_SIZE];
DST_KEY *key;
nsp[0] = NULL;
ns_debug(ns_log_default, 3, "sysquery(%s, %d, %d, %#x, %d, %d)",
dname, class, type, nss, nsc, ntohs(port));
ns_debug(ns_log_default, 3, "sysquery(%s, %d, %d, %p, %p, %d, %d)",
dname, class, type, nss, keys, nsc, ntohs(port));
qp = qnew(dname, class, type, (nss != NULL && nsc != 0) ? 0 : 1);
qp->q_distance = distance;
if (nss != NULL && nsc != 0)
np = NULL;
else if (!NS_ZOPTION_P(qp->q_fzone, OPTION_FORWARD_ONLY)) {
@ -2396,10 +2457,13 @@ sysquery(const char *dname, int class, int type,
qs->ns_addr.sin_family = AF_INET;
qs->ns_addr.sin_addr = nss[i];
qs->ns_addr.sin_port = port;
if (keys != NULL)
qp->q_keys[i] = keys[i];
qs->ns = NULL;
qs->nsdata = NULL;
qs->stime = tt;
qs->forwarder = 0;
qs->noedns = 1; /* XXXMPA */
qs->nretry = 0;
}
qp->q_naddr = nsc;
@ -2451,7 +2515,7 @@ sysquery(const char *dname, int class, int type,
}
getname(np, tmpdomain, sizeof tmpdomain);
if (qp->q_domain != NULL)
freestr(qp->q_domain);
(void)freestr(qp->q_domain);
qp->q_domain = savestr(tmpdomain, 1);
goto fetch_a;
}
@ -2476,37 +2540,47 @@ sysquery(const char *dname, int class, int type,
log_get_stream(packet_channel));
#endif
key = tsig_key_from_addr(nsa->sin_addr);
if (key != NULL) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE;
key = qp->q_keys[0];
if (key == NULL)
key = qp->q_keys[0] = tsig_key_from_addr(nsa->sin_addr);
if (key != NULL || !qp->q_addr[0].noedns) {
smsgsize = qp->q_msglen + TSIG_BUF_SIZE + 11;
smsg = memget(smsgsize);
smsglen = qp->q_msglen;
siglen = sizeof(sig);
memcpy(smsg, qp->q_msg, qp->q_msglen);
}
if (!qp->q_addr[0].noedns)
smsglen += ns_add_opt(smsg, smsg + smsglen, smsgsize, 0, 0,
EDNS_MESSAGE_SZ, 0, NULL, 0);
if (key != NULL) {
n = ns_sign(smsg, &smsglen, smsgsize, NOERROR, key, NULL, 0,
sig, &siglen, 0);
if (n == 0) {
oldqbuf = qp->q_msg;
oldqlen = qp->q_msglen;
qp->q_msglen = smsglen;
qp->q_msg = smsg;
has_tsig = 1;
qp->q_nstsig = new_tsig(key, sig, siglen); /* BEW? */
}
else {
free_tsig(qp->q_nstsig);
qp->q_nstsig = new_tsig(key, sig, siglen);
} else {
INSIST(0);
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
}
}
else {
} else {
has_tsig = 0;
free_tsig(qp->q_nstsig);
qp->q_nstsig = NULL;
}
if (smsgsize != 0) {
oldqbuf = qp->q_msg;
oldqlen = qp->q_msglen;
qp->q_msglen = smsglen;
qp->q_msg = smsg;
}
if (sendto(qp->q_dfd, (char*)qp->q_msg, qp->q_msglen, 0,
(struct sockaddr *)nsa,
sizeof(struct sockaddr_in)) < 0) {
@ -2517,8 +2591,9 @@ sysquery(const char *dname, int class, int type,
sin_ntoa(*nsa), strerror(errno));
nameserIncr(nsa->sin_addr, nssSendtoErr);
}
if (has_tsig == 1) {
memput(qp->q_msg, smsgsize);
if (smsgsize != 0) {
memput(smsg, smsgsize);
qp->q_msg = oldqbuf;
qp->q_msglen = oldqlen;
}
@ -2626,8 +2701,8 @@ check_ns() {
ns_debug(ns_log_default, 3,
"check_ns: %s: not found %s %#lx",
dname, fname, (u_long)tnp);
sysquery(dname, dp->d_class, T_A, NULL,
0, ns_port, QUERY);
sysquery(dname, dp->d_class, T_A, NULL, NULL,
0, ns_port, QUERY, 0);
continue;
}
/* look for name server addresses */
@ -2660,8 +2735,8 @@ check_ns() {
"Root NS %s -> CNAME %s",
NAME(*np), NAME(*tnp));
else
sysquery(dname, dp->d_class, T_A, NULL,
0, ns_port, QUERY);
sysquery(dname, dp->d_class, T_A, NULL, NULL,
0, ns_port, QUERY, 0);
}
}
@ -2718,7 +2793,7 @@ findns(struct namebuf **npp, int class,
break;
}
while (np != NULL) {
ns_debug(ns_log_default, 5, "findns: np %#x '%s'", np,
ns_debug(ns_log_default, 5, "findns: np %p '%s'", np,
NAME(*np));
/* Look first for SOA records. */
#ifdef ADDAUTH
@ -2776,10 +2851,8 @@ findns(struct namebuf **npp, int class,
* them here as we just got them from the
* cache.
*/
while (nspp > &nsp[0]) {
nspp--;
DRCNTDEC(*nspp);
}
while (nspp > &nsp[0])
db_detach(--nspp);
nsp[0] = NULL;
goto try_parent;
}
@ -3232,7 +3305,7 @@ wanted(const struct databuf *dp, int class, int type) {
#ifdef DEBUG
strcpy(pclass, p_class(class));
strcpy(ptype, p_type(type));
ns_debug(ns_log_default, 3, "wanted(%#x, %s %s) [%s %s]",
ns_debug(ns_log_default, 3, "wanted(%p, %s %s) [%s %s]",
dp, pclass, ptype,
p_class(dp->d_class), p_type(dp->d_type));
#endif
@ -3312,7 +3385,7 @@ wantedsig(const struct databuf *dp, int class, int type) {
#ifdef DEBUG
strcpy(pclass, p_class(class));
strcpy(ptype, p_type(type));
ns_debug(ns_log_default, 3, "wantedtsig(%#x, %s %s) [%s %s]",
ns_debug(ns_log_default, 3, "wantedtsig(%p, %s %s) [%s %s]",
dp, pclass, ptype,
p_class(dp->d_class), p_type(dp->d_type));
#endif
@ -3400,6 +3473,7 @@ rrsetadd(struct flush_set *flushset, const char *name, struct databuf *dp) {
panic("rrsetadd: out of memory", NULL);
dbl->db_next = NULL;
dbl->db_dp = dp;
DRCNTINC(dbl->db_dp);
if (fs->fs_last == NULL)
fs->fs_list = dbl;
else
@ -3664,6 +3738,7 @@ rrsetupdate(struct flush_set * flushset, int flags, struct sockaddr_in from,
n);
odbp = dbp;
dbp = dbp->db_next;
db_detach(&odbp->db_dp);
memput(odbp, sizeof *odbp);
}
ns_debug(ns_log_default, 3,
@ -3674,7 +3749,7 @@ rrsetupdate(struct flush_set * flushset, int flags, struct sockaddr_in from,
(void)ttlcheck(fs->fs_name,fs->fs_list, 1);
dbp = fs->fs_list;
while (dbp) {
db_freedata(dbp->db_dp);
db_detach(&dbp->db_dp);
odbp = dbp;
dbp = dbp->db_next;
memput(odbp, sizeof *odbp);
@ -3704,15 +3779,23 @@ flushrrset(struct flush_set * fs, struct sockaddr_in from) {
from);
ns_debug(ns_log_default, 3, "flushrrset: %d", n);
} while (n == OK);
db_freedata(dp);
db_detach(&dp);
}
static void
free_flushset(struct flush_set *flushset, int flushset_size) {
struct flush_set *fs;
struct db_list *dbl;
for (fs = flushset; fs->fs_name != NULL; fs++)
freestr(fs->fs_name);
for (fs = flushset; fs->fs_name != NULL; fs++) {
fs->fs_name = freestr(fs->fs_name);
while ((dbl = fs->fs_list) != NULL) {
fs->fs_list = dbl->db_next;
dbl->db_next = NULL;
db_detach(&dbl->db_dp);
memput(dbl, sizeof(*dbl));
}
}
memput(flushset, flushset_size);
}
@ -3727,7 +3810,7 @@ void
delete_all(struct namebuf *np, int class, int type) {
struct databuf *dp, *pdp;
ns_debug(ns_log_default, 3, "delete_all(%#x:\"%s\" %s %s)",
ns_debug(ns_log_default, 3, "delete_all(%p:\"%s\" %s %s)",
np, NAME(*np), p_class(class), p_type(type));
pdp = NULL;
dp = np->n_data;
@ -3849,6 +3932,22 @@ trunc_adjust(u_char *msg, int msglen, int outlen) {
/*
* mark the server "from" bad in the qp structure so it won't be retried.
*/
static int
mark_noedns(struct qinfo *qp, struct sockaddr_in from) {
int i;
for (i = 0; i < (int)qp->q_naddr; i++)
if (ina_equal(qp->q_addr[i].ns_addr.sin_addr, from.sin_addr)) {
if (qp->q_addr[i].noedns)
return (1);
if (qp->q_addr[i].nsdata)
qp->q_addr[i].nsdata->d_noedns = 1;
qp->q_addr[i].noedns = 1;
break;
}
return (0);
}
static void
mark_bad(struct qinfo *qp, struct sockaddr_in from) {
int i;
@ -3878,10 +3977,10 @@ mark_lame(struct qinfo *qp, struct sockaddr_in from) {
* wrong interface an a multihomed server.
*/
static void
fast_retry(struct qinfo *qp, struct sockaddr_in from) {
fast_retry(struct qinfo *qp, struct sockaddr_in from, int samehost) {
if (ina_equal(qp->q_addr[qp->q_curaddr].ns_addr.sin_addr,
from.sin_addr))
retry(qp);
retry(qp, samehost);
}
static void
@ -3892,7 +3991,7 @@ add_related_additional(char *name) {
return;
for (i = 0; i < num_related; i++)
if (ns_samename(name, related[i]) == 1) {
freestr(name);
(void)freestr(name);
return;
}
related[num_related++] = name;
@ -3903,7 +4002,7 @@ free_related_additional() {
int i;
for (i = 0; i < num_related; i++)
freestr(related[i]);
related[i] = freestr(related[i]);
num_related = 0;
}
@ -3921,8 +4020,7 @@ static void
freestr_maybe(char **tname) {
if (tname == NULL || *tname == NULL)
return;
freestr(*tname);
*tname = NULL;
*tname = freestr(*tname);
}
/*

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_main.c 4.55 (Berkeley) 7/1/91";
static const char rcsid[] = "$Id: ns_signal.c,v 8.13 2000/07/11 07:10:12 vixie Exp $";
static const char rcsid[] = "$Id: ns_signal.c,v 8.14 2001/06/18 14:43:25 marka Exp $";
#endif /* not lint */
/*
@ -162,28 +162,43 @@ static int blocked = 0;
static SIG_FN
onhup(int sig) {
UNUSED(sig);
ns_need_unsafe(main_need_reload);
}
static SIG_FN
onintr(int sig) {
UNUSED(sig);
ns_need_unsafe(main_need_exit);
}
static SIG_FN
setdumpflg(int sig) {
UNUSED(sig);
ns_need_unsafe(main_need_dump);
}
#ifdef DEBUG
static SIG_FN
setIncrDbgFlg(int sig) {
UNUSED(sig);
desired_debug++;
ns_need_unsafe(main_need_debug);
}
static SIG_FN
setNoDbgFlg(int sig) {
UNUSED(sig);
desired_debug = 0;
ns_need_unsafe(main_need_debug);
}
@ -192,12 +207,18 @@ setNoDbgFlg(int sig) {
#if defined(QRYLOG) && defined(SIGWINCH)
static SIG_FN
setQrylogFlg(int sig) {
UNUSED(sig);
ns_need_unsafe(main_need_qrylog);
}
#endif /*QRYLOG && SIGWINCH*/
static SIG_FN
setstatsflg(int sig) {
UNUSED(sig);
ns_need_unsafe(main_need_statsdump);
}
@ -207,6 +228,8 @@ discard_pipe(int sig) {
int saved_errno = errno;
struct sigaction sa;
UNUSED(sig);
memset(&sa, 0, sizeof sa);
sa.sa_mask = mask;
sa.sa_handler = discard_pipe;
@ -214,11 +237,16 @@ discard_pipe(int sig) {
ns_error(ns_log_os, "sigaction failed in discard_pipe: %s",
strerror(errno));
errno = saved_errno;
#else
UNUSED(sig);
#endif
}
static SIG_FN
setreapflg(int sig) {
UNUSED(sig);
ns_need_unsafe(main_need_reap);
}
@ -226,7 +254,7 @@ setreapflg(int sig) {
void
init_signals(void) {
int sh;
size_t sh;
/* The mask of all our handlers will block all our other handlers. */
(void)sigemptyset(&mask);

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_sort.c 4.10 (Berkeley) 3/3/91";
static const char rcsid[] = "$Id: ns_sort.c,v 8.6 2000/04/21 06:54:13 vixie Exp $";
static const char rcsid[] = "$Id: ns_sort.c,v 8.8 2001/09/25 04:50:22 marka Exp $";
#endif /* not lint */
/*
@ -183,6 +183,7 @@ static const char rcsid[] = "$Id: ns_sort.c,v 8.6 2000/04/21 06:54:13 vixie Exp
#include <stdio.h>
#include <syslog.h>
#include <resolv.h>
#include <string.h>
#include <isc/eventlib.h>
#include <isc/logging.h>
@ -240,6 +241,7 @@ sort_response(u_char *cp, u_char *eom, int ancount, struct sockaddr_in *from) {
indirect = 1;
break;
default:
indirect = 0;
panic("unexpected ime type in ip_match_address()",
NULL);
}
@ -282,6 +284,7 @@ sort_response(u_char *cp, u_char *eom, int ancount, struct sockaddr_in *from) {
iml = imematch->next->u.indirect.list;
break;
default:
iml = NULL;
panic("unexpected ime type in ip_match_address()",
NULL);
}
@ -303,9 +306,9 @@ sort_response(u_char *cp, u_char *eom, int ancount, struct sockaddr_in *from) {
static int
sort_rr(u_char *cp, u_char *eom, int ancount, ip_match_list iml) {
int type, class, dlen, n, c, distance, closest;
int type, class, dlen, n, c, distance, closest = 0;
struct in_addr inaddr;
u_char *rr1 = NULL, *rrbest, *cpstart;
u_char *rr1 = NULL, *rrbest = NULL, *cpstart;
rr1 = NULL;
cpstart = cp;
@ -384,6 +387,7 @@ ip_match_address_elt(ip_match_list iml, struct in_addr address,
indirect = 1;
break;
default:
indirect = 0;
panic("unexpected ime type in ip_match_address()",
NULL);
}

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)ns_stats.c 4.10 (Berkeley) 6/27/90";
static const char rcsid[] = "$Id: ns_stats.c,v 8.32.2.1 2001/08/09 14:04:49 marka Exp $";
static const char rcsid[] = "$Id: ns_stats.c,v 8.34 2001/08/09 13:17:21 marka Exp $";
#endif /* not lint */
/*
@ -381,6 +381,11 @@ ns_logstats(evContext ctx, void *uap, struct timespec due,
#ifdef HAVE_GETRUSAGE
# define tv_float(tv) ((tv).tv_sec + ((tv).tv_usec / 1000000.0))
UNUSED(ctx);
UNUSED(uap);
UNUSED(due);
UNUSED(inter);
getrusage(RUSAGE_SELF, &usage);
getrusage(RUSAGE_CHILDREN, &childu);

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_update.c,v 8.91.2.2 2001/04/30 03:20:46 marka Exp $";
static const char rcsid[] = "$Id: ns_update.c,v 8.103 2002/01/03 00:25:02 marka Exp $";
#endif /* not lint */
/*
@ -105,7 +105,7 @@ static struct map m_opcode[] = {
#define M_CLASS_CNT m_class_cnt
#define M_TYPE_CNT m_type_cnt
static char *opcodes[] = {
static const char *opcodes[] = {
"delete",
"add",
"",
@ -734,53 +734,59 @@ prescan_nameok(ns_updrec *ur, int *rcodep, u_int16_t zclass,
u_int16_t type = ur->r_type;
char *cp = (char *)ur->r_dp->d_data;
enum context context;
enum transport transport;
/* We don't care about deletes */
if (ur->r_class != zclass)
return (1);
context = ns_ownercontext(type, primary_trans);
if (!ns_nameok(NULL, owner, class, zp, primary_trans, context, owner,
if (zp->z_type == Z_PRIMARY)
transport = primary_trans;
else
transport = secondary_trans;
context = ns_ownercontext(type, transport);
if (!ns_nameok(NULL, owner, class, zp, transport, context, owner,
inaddr_any))
goto refused;
switch (type) {
case ns_t_soa:
context = hostname_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
cp += strlen(cp) + 1;
context = mailname_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
case ns_t_rp:
context = mailname_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
cp += strlen(cp) + 1;
context = domain_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
case ns_t_minfo:
context = mailname_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
cp += strlen(cp) + 1;
context = mailname_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
case ns_t_ns:
context = hostname_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
@ -789,13 +795,13 @@ prescan_nameok(ns_updrec *ur, int *rcodep, u_int16_t zclass,
case ns_t_mg:
case ns_t_mr:
context = domain_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
case ns_t_ptr:
context = ns_ptrcontext(owner);
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
@ -812,7 +818,7 @@ prescan_nameok(ns_updrec *ur, int *rcodep, u_int16_t zclass,
/* Pattern (txt) */
cp += (*cp&0xff) + 1;
context = domain_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans,
if (!ns_nameok(NULL, cp, class, zp, transport,
context, owner, inaddr_any))
goto refused;
break;
@ -825,18 +831,18 @@ prescan_nameok(ns_updrec *ur, int *rcodep, u_int16_t zclass,
case ns_t_kx:
cp += 2;
context = hostname_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
case ns_t_px:
cp += 2;
context = domain_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
cp += strlen(cp) + 1;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
@ -852,13 +858,13 @@ prescan_nameok(ns_updrec *ur, int *rcodep, u_int16_t zclass,
*/
cp += 18;
context = domain_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
case ns_t_nxt:
context = domain_ctx;
if (!ns_nameok(NULL, cp, class, zp, primary_trans, context, owner,
if (!ns_nameok(NULL, cp, class, zp, transport, context, owner,
inaddr_any))
goto refused;
break;
@ -977,7 +983,7 @@ process_updates(const ns_updque *updlist, int *rcodep,
ns_debug(ns_log_update, 3,
"process_update: record section=%s, dname=%s, \
class=%s, type=%s, ttl=%d, dp=0x%0x",
class=%s, type=%s, ttl=%d, dp=%p",
p_section(section, ns_o_update), dname,
p_class(class), p_type(type), ttl, rdp);
@ -1048,7 +1054,7 @@ class=%s, type=%s, ttl=%d, dp=0x%0x",
n);
} else {
ns_debug(ns_log_update, 3,
"process_updates: added databuf 0x%0x",
"process_updates: added databuf %p",
dp);
dp->d_mark = D_MARK_ADDED;
numupdated++;
@ -1135,8 +1141,8 @@ class=%s, type=%s, ttl=%d, dp=0x%0x",
static enum req_action
req_update_private(HEADER *hp, u_char *cp, u_char *eom, u_char *msg,
struct qstream *qsp, int dfd, struct sockaddr_in from,
struct tsig_record *in_tsig, ns_updque *curupd)
struct sockaddr_in from, struct tsig_record *in_tsig,
ns_updque *curupd)
{
char dnbuf[MAXDNAME], *dname;
u_int zocount, prcount, upcount, adcount, class, type, dlen;
@ -1340,7 +1346,6 @@ req_update_private(HEADER *hp, u_char *cp, u_char *eom, u_char *msg,
dp->d_secure = DB_S_INSECURE; /* should be UNCHECKED */
dp->d_clev = nlabels(zp->z_origin);
/* XXX - also record in dp->d_ns, which host this came from */
DRCNTINC(dp);
rrecp->r_dp = dp;
/* Append the current record to the end of list of records. */
APPEND(*curupd, rrecp, r_link);
@ -1380,7 +1385,8 @@ void
free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) {
ns_updrec *rrecp, *first_rrecp, *next_rrecp;
struct databuf *dp, *tmpdp;
char *dname, *msg;
char *dname;
const char *msg;
if (rcode == NOERROR) {
first_rrecp = HEAD(*updlist);
@ -1389,7 +1395,7 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) {
first_rrecp = TAIL(*updlist);
msg = "free_rrecp: update transaction aborted, rolling back";
}
ns_debug(ns_log_update, 1, msg);
ns_debug(ns_log_update, 1, "%s", msg);
for (rrecp = first_rrecp; rrecp != NULL; rrecp = next_rrecp) {
if (rcode == NOERROR)
next_rrecp = NEXT(rrecp, r_link);
@ -1397,12 +1403,8 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) {
next_rrecp = PREV(rrecp, r_link);
UNLINK(*updlist, rrecp, r_link);
if (rrecp->r_section != S_UPDATE) {
if (rrecp->r_dp) {
DRCNTDEC(rrecp->r_dp);
if (rrecp->r_dp->d_rcnt == 0)
db_freedata(rrecp->r_dp);
rrecp->r_dp = NULL;
}
if (rrecp->r_dp)
db_detach(&rrecp->r_dp);
INSIST(rrecp->r_deldp == NULL);
res_freeupdrec(rrecp);
continue;
@ -1428,24 +1430,12 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) {
dname, p_type(dp->d_type));
} else {
ns_debug(ns_log_update, 3,
"free_rrecp: deleted databuf 0x%0x",
"free_rrecp: deleted databuf %p",
dp);
/*
* XXXRTH
*
* We used to db_freedata() here,
* but I removed it because 'dp' was
* part of a hashtab before we called
* db_update(), and since our delete
* has succeeded, it should have been
* freed.
*/
}
}
}
DRCNTDEC(dp);
if (dp->d_rcnt == 0)
db_freedata(dp);
db_detach(&dp);
/* Process deleted databuf's. */
dp = rrecp->r_deldp;
@ -1464,13 +1454,11 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) {
dname, p_type(tmpdp->d_type));
} else {
ns_debug(ns_log_update, 3,
"free_rrecp: added back databuf 0x%0x",
"free_rrecp: added back databuf %p",
tmpdp);
}
}
DRCNTDEC(tmpdp);
if (tmpdp->d_rcnt == 0)
db_freedata(tmpdp);
db_detach(&tmpdp);
}
res_freeupdrec(rrecp);
}
@ -1478,15 +1466,13 @@ free_rrecp(ns_updque *updlist, int rcode, struct sockaddr_in from) {
enum req_action
req_update(HEADER *hp, u_char *cp, u_char *eom, u_char *msg,
struct qstream *qsp, int dfd, struct sockaddr_in from,
struct tsig_record *in_tsig)
struct sockaddr_in from, struct tsig_record *in_tsig)
{
enum req_action ret;
ns_updque curupd;
INIT_LIST(curupd);
ret = req_update_private(hp, cp, eom, msg, qsp, dfd, from,
in_tsig, &curupd);
ret = req_update_private(hp, cp, eom, msg, from, in_tsig, &curupd);
free_rrecp(&curupd, ret == Refuse ? ns_r_refused : hp->rcode, from);
if (ret == Finish) {
hp->qdcount = hp->ancount = hp->nscount = hp->arcount = 0;
@ -1628,13 +1614,13 @@ rdata_expand(const u_char *msg, const u_char *eom, const u_char *cp,
cp += SIG_HDR_SIZE;
cp1 += SIG_HDR_SIZE;
n = dn_expand(msg, eom, cp, (char *)cp1, size);
if (n < 0 || n + SIG_HDR_SIZE > dlen)
if (n < 0 || n + SIG_HDR_SIZE > (int)dlen)
return (0);
cp += n;
n1 = dlen - n - SIG_HDR_SIZE;
n = strlen((char *)cp1) + 1;
cp1 += n;
if (size < n1)
if ((int)size < n1)
return (0);
memcpy(cp1, cp, n1);
cp1 += n1;
@ -1665,14 +1651,16 @@ rdata_expand(const u_char *msg, const u_char *eom, const u_char *cp,
if (n1 < 4 || n1 > 16)
return (0);
}
if (n1 > size)
if (n1 > (int)size)
return (0);
memcpy(cp1, cp, n1);
cp1 += n1;
return (cp1 - cp1init);
default:
ns_debug(ns_log_update, 3, "unknown type %d", type);
return (0);
if (size < dlen)
return (0);
memcpy(cp1, cp, dlen);
return (dlen);
}
}
@ -1917,7 +1905,13 @@ rdata_dump(struct databuf *dp, FILE *fp) {
break;
}
default:
fprintf(fp, "\t;?d_type=%d?", dp->d_type);
fprintf(fp, "\\# %u", dp->d_size);
if (dp->d_size) {
fputs(" ( ", fp);
isc_puthexstring(fp, dp->d_data, dp->d_size,
28, 48, "\n\t\t\t\t");
fputs(" )", fp);
}
}
}
@ -1937,7 +1931,7 @@ findzone(const char *dname, int class, int depth, int *zonelist, int maxzones){
int escaped, found, done;
ns_debug(ns_log_update, 4, "findzone(dname=%s, class=%d, depth=%d, \
zonelist=0x%x, maxzones=%d)",
zonelist=%p, maxzones=%d)",
dname, class, depth, zonelist, maxzones);
#ifdef DEBUG
if (debug >= 5) {
@ -2068,7 +2062,7 @@ merge_logs(struct zoneinfo *zp, char *logname) {
u_int32_t serial, ttl, old_serial, new_serial;
char *dname, *cp, *cp1;
int type, class;
int i, c, section, opcode, matches, zonenum, err, multiline;
int i, c, section, opcode, matches, zonenum = 0, err, multiline;
int nonempty_lineno = -1, prev_pktdone = 0, cont = 0, inside_next = 0;
int id, rcode = NOERROR;
u_int32_t n;
@ -2082,6 +2076,7 @@ merge_logs(struct zoneinfo *zp, char *logname) {
int datasize;
unsigned long l;
ns_updque curupd;
unsigned long lutmp;
empty_from.sin_family = AF_INET;
empty_from.sin_addr.s_addr = htonl(INADDR_ANY);
@ -2151,6 +2146,7 @@ merge_logs(struct zoneinfo *zp, char *logname) {
INIT_LIST(curupd);
for (;;) {
err = 0;
dname = NULL;
if (!getword(buf, sizeof buf, fp, 0)) {
if (lineno == (nonempty_lineno + 1) && !(feof(fp))) {
/*
@ -2223,6 +2219,7 @@ merge_logs(struct zoneinfo *zp, char *logname) {
if (!EMPTY(curupd)) {
n = process_updates(&curupd, &rcode,
empty_from);
free_rrecp(&curupd, rcode, empty_from);
if (n > 0)
ns_info(ns_log_update,
"successfully merged update id %d from log file %s",
@ -2234,7 +2231,6 @@ merge_logs(struct zoneinfo *zp, char *logname) {
fclose(fp);
return(-1);
}
free_rrecp(&curupd, rcode, empty_from);
}
prev_pktdone = 0;
if (feof(fp))
@ -2270,7 +2266,8 @@ merge_logs(struct zoneinfo *zp, char *logname) {
if (!cp)
*buf = '\0';
n = sscanf(cp, "origin %s class %s serial %lu",
origin, sclass, &serial);
origin, sclass, &lutmp);
serial = lutmp;
if (n != 3 || ns_samename(origin, zp->z_origin) != 1)
err++;
if (cp)
@ -2288,8 +2285,7 @@ merge_logs(struct zoneinfo *zp, char *logname) {
dname = origin;
type = T_SOA;
class = sym_ston(__p_class_syms, sclass,
&success);
class = res_nametoclass(sclass, &success);
if (!success) {
err++;
break;
@ -2355,9 +2351,7 @@ merge_logs(struct zoneinfo *zp, char *logname) {
int success;
int maybe_class;
maybe_class = sym_ston(__p_class_syms,
buf,
&success);
maybe_class = res_nametoclass(buf, &success);
if (success) {
class = maybe_class;
(void) getword(buf,
@ -2370,9 +2364,7 @@ merge_logs(struct zoneinfo *zp, char *logname) {
int success;
int maybe_type;
maybe_type = sym_ston(__p_type_syms,
buf,
&success);
maybe_type = res_nametotype(buf, &success);
if (success) {
type = maybe_type;
@ -2618,7 +2610,7 @@ merge_logs(struct zoneinfo *zp, char *logname) {
case ns_t_nxt:
case ns_t_cert:
{
char * errmsg = NULL;
const char * errmsg = NULL;
int s;
s = parse_sec_rdata(buf, sizeof(buf),
@ -2637,7 +2629,40 @@ merge_logs(struct zoneinfo *zp, char *logname) {
break;
}
default:
err++;
if (strcmp(buf, "\\#") != 0) {
err++;
break;
}
if (!getword(buf, sizeof buf, fp, 0) ||
!isdigit((unsigned char)buf[0])) {
err++;
break;
}
n = strtoul(buf, &cp, 10);
if (n > 0xffff || *cp != '\0') {
err++;
break;
}
multiline = 0;
i = isc_gethexstring((u_char *)data,
sizeof(data),
n, fp, &multiline);
if (i == -1) {
err++;
break;
}
if (multiline) {
c = getnonblank(fp,
zp->z_updatelog,
1);
if (c != ')') {
ungetc(c, fp);
err++;
break;
}
multiline = 0;
}
endline(fp);
}
if (section == S_PREREQ) {
ttl = 0;
@ -2687,12 +2712,12 @@ merge_logs(struct zoneinfo *zp, char *logname) {
err++;
}
if (err) {
inside_next = 0;
ns_debug(ns_log_update, 1,
"merge of update id %d failed due to error at line %d",
id, lineno);
free_rrecp(&curupd, FORMERR, empty_from);
continue;
fclose(fp);
return(-1);
}
rrecp = res_mkupdrec(section, dname, class, type, ttl);
if (section != S_ZONE) {
@ -2701,7 +2726,6 @@ merge_logs(struct zoneinfo *zp, char *logname) {
dp->d_cred = DB_C_ZONE;
dp->d_clev = nlabels(zp->z_origin);
dp->d_secure = DB_S_INSECURE; /* should be UNCHECKED */
DRCNTINC(dp);
rrecp->r_dp = dp;
} else {
rrecp->r_zone = zonenum;

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ns_xfr.c,v 8.64 2001/02/15 00:18:46 marka Exp $";
static const char rcsid[] = "$Id: ns_xfr.c,v 8.67 2001/07/10 05:06:50 marka Exp $";
#endif /* not lint */
/*
@ -107,7 +107,7 @@ ns_xfr(struct qstream *qsp, struct namebuf *znp,
* write() data from us.
*/
(void) setsockopt(qsp->s_rfd, SOL_SOCKET, SO_SNDBUF,
(char *)&sndbuf, sizeof sndbuf);
(const char *)&sndbuf, sizeof sndbuf);
#endif
#ifdef SO_SNDLOWAT
/*
@ -115,7 +115,7 @@ ns_xfr(struct qstream *qsp, struct namebuf *znp,
* an XFER_BUFSIZE block of data.
*/
(void) setsockopt(qsp->s_rfd, SOL_SOCKET, SO_SNDLOWAT,
(char *)&sndlowat, sizeof sndlowat);
(const char *)&sndlowat, sizeof sndlowat);
#endif
if (sq_openw(qsp, 64*1024) == -1) {
ns_error(ns_log_xfer_out, "ns_xfr: out of memory");
@ -263,8 +263,7 @@ ns_freexfr(struct qstream *qsp) {
while ((rp = HEAD(dp->d_changes)) != NULL) {
UNLINK(dp->d_changes, rp, r_link);
if (rp->r_dp != NULL)
db_freedata(rp->r_dp);
rp->r_dp = NULL;
db_detach(&rp->r_dp);
res_freeupdrec(rp);
}
memput(dp, sizeof *dp);
@ -274,6 +273,10 @@ ns_freexfr(struct qstream *qsp) {
}
while (qsp->xfr.lev)
qsp->xfr.lev = sx_freelev(qsp->xfr.lev);
if (qsp->xfr.tsig_state != NULL) {
memput(qsp->xfr.tsig_state, sizeof(ns_tcp_tsig_state));
qsp->xfr.tsig_state = NULL;
}
zones[qsp->xfr.zone].z_numxfrs--;
qsp->flags &= ~(STREAM_AXFR | STREAM_AXFRIXFR);
}
@ -416,7 +419,7 @@ sx_addrr(struct qstream *qsp, const char *dname, struct databuf *dp) {
* side effects:
* if progress was made, header and pointers will be advanced.
*/
int
static int
sx_soarr(struct qstream *qsp) {
struct databuf *dp;
int added_soa = 0;
@ -840,11 +843,8 @@ static struct qs_x_lev *
sx_freelev(struct qs_x_lev *lev) {
struct qs_x_lev *next = lev->next;
if (lev->dp) {
DRCNTDEC(lev->dp);
if (lev->dp->d_rcnt == 0)
db_freedata(lev->dp);
}
if (lev->dp)
db_detach(&lev->dp);
memput(lev, sizeof *lev);
return (next);
}
@ -853,10 +853,7 @@ static struct databuf *
db_next(struct databuf *dp) {
struct databuf *next = dp->d_next;
DRCNTDEC(dp);
if (dp->d_rcnt == 0)
db_freedata(dp);
db_detach(&dp);
if (next)
DRCNTINC(next);

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: ndc.c,v 1.16.2.1 2001/04/26 02:56:10 marka Exp $";
static const char rcsid[] = "$Id: ndc.c,v 1.21 2001/12/19 23:16:23 marka Exp $";
#endif /* not lint */
/*
@ -60,7 +60,7 @@ typedef void (*closure)(void *, const char *, int);
static const char * program = "amnesia";
static enum { e_channel, e_signals } mode = e_channel;
static char * channel = _PATH_NDCSOCK;
static const char * channel = _PATH_NDCSOCK;
static const char helpfmt[] = "\t%-16s\t%s\n";
static const char * pidfile = _PATH_PIDFILE;
static sockaddr_t client, server;
@ -77,23 +77,23 @@ static int builtincmd(void);
static void command(void);
static int running(int, pid_t *);
static void command_channel(void);
static void channel_loop(char *, int, closure, void *);
static void channel_loop(const char *, int, closure, void *);
static void getpid_closure(void *, const char *, int);
static void banner(struct ctl_cctx *, void *, const char *, u_int);
static void done(struct ctl_cctx *, void *, const char *, u_int);
static void logger(enum ctl_severity, const char *fmt, ...);
static void logger(enum ctl_severity, const char *fmt, ...) ISC_FORMAT_PRINTF(2, 3);
static void command_signals(void);
static void stop_named(pid_t);
static void start_named(const char *, int);
static int fgetpid(const char *, pid_t *);
static int get_sockaddr(char *, sockaddr_t *);
static int get_sockaddr(const char *, sockaddr_t *);
static size_t impute_addrlen(const struct sockaddr *);
static void vtrace(const char *, va_list);
static void trace(const char *, ...);
static void result(const char *, ...);
static void fatal(const char *, ...);
static void verror(const char *, va_list);
static void error(const char *, ...);
static void trace(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
static void result(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
static void fatal(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
static void verror(const char *, va_list) ISC_FORMAT_PRINTF(1, 0);
static void error(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
static void
usage(const char *fmt, ...) {
@ -114,7 +114,7 @@ usage(const char *fmt, ...) {
/* Public. */
int
main(int argc, char *argv[], char *envp[]) {
main(int argc, char *argv[]) {
char *p;
int ch;
@ -402,7 +402,7 @@ struct args {
};
static void
channel_loop(char *cmdtext, int show, closure cl, void *ua) {
channel_loop(const char *cmdtext, int show, closure cl, void *ua) {
struct ctl_cctx *ctl;
struct sockaddr *client_addr;
struct args a;
@ -457,6 +457,8 @@ static void
done(struct ctl_cctx *ctl, void *uap, const char *msg, u_int flags) {
struct args *a = uap;
UNUSED(ctl);
if (msg == NULL) {
trace("EOF");
doneflag = 1;
@ -488,6 +490,7 @@ logger(enum ctl_severity ctlsev, const char *format, ...) {
verror(format, args);
break;
default:
va_end(args);
abort();
}
va_end(args);
@ -507,7 +510,7 @@ static struct cmdsig {
{ "querylog", SIGWINCH, "toggle query logging" },
{ "qrylog", SIGWINCH, "alias for querylog" },
#endif
{ NULL, 0 }
{ NULL, 0, NULL }
};
static void
@ -599,15 +602,15 @@ fgetpid(const char *f, pid_t *pid) {
long t;
for (try = 0; try < 5; try++) {
trace("pidfile is \"%s\" (try #%d)", pidfile, try + 1);
if ((fp = fopen(pidfile, "r")) == NULL)
trace("pidfile is \"%s\" (try #%d)", f, try + 1);
if ((fp = fopen(f, "r")) == NULL)
trace("pid file (%s) unavailable - %s",
pidfile, strerror(errno));
f, strerror(errno));
else if (fscanf(fp, "%ld\n", &t) != 1)
trace("pid file (%s) format is bad", pidfile);
trace("pid file (%s) format is bad", f);
else if (*pid = (pid_t)t, fclose(fp), kill(*pid, 0) < 0)
trace("pid file (%s) contains unusable pid (%d) - %s",
pidfile, *pid, strerror(errno));
f, *pid, strerror(errno));
else {
trace("pid is %ld", (long)*pid);
return (1);
@ -619,7 +622,7 @@ fgetpid(const char *f, pid_t *pid) {
}
static int
get_sockaddr(char *name, sockaddr_t *addr) {
get_sockaddr(const char *name, sockaddr_t *addr) {
char *slash;
#ifndef NO_SOCKADDR_UN
@ -651,7 +654,7 @@ get_sockaddr(char *name, sockaddr_t *addr) {
static size_t
impute_addrlen(const struct sockaddr *sa) {
if (sa == 0)
if (sa == NULL)
return (0);
switch (sa->sa_family) {
case AF_INET:
@ -663,6 +666,7 @@ impute_addrlen(const struct sockaddr *sa) {
default:
abort();
}
/*NOTREACHED*/
}
static void

View File

@ -53,7 +53,7 @@
#ifndef lint
static const char sccsid[] = "@(#)debug.c 5.26 (Berkeley) 3/21/91";
static const char rcsid[] = "$Id: debug.c,v 8.17 2000/11/08 06:47:31 marka Exp $";
static const char rcsid[] = "$Id: debug.c,v 8.19 2001/09/25 04:50:26 marka Exp $";
#endif /* not lint */
/*
@ -80,6 +80,7 @@ static const char rcsid[] = "$Id: debug.c,v 8.17 2000/11/08 06:47:31 marka Exp $
#include <netdb.h>
#include <resolv.h>
#include <stdio.h>
#include <string.h>
#include "port_after.h"
@ -113,12 +114,12 @@ Fprint_query(const u_char *msg, const u_char *eom, int printHeader, FILE *file)
const u_char *cp;
const HEADER *hp;
int n;
u_int class, type;
u_int class, type = 0;
/*
* Print header fields.
*/
hp = (HEADER *)msg;
hp = (const HEADER *)msg;
cp = msg + HFIXEDSZ;
if (printHeader || (res.options & RES_DEBUG2)) {
fprintf(file," HEADER:\n");
@ -162,9 +163,9 @@ Fprint_query(const u_char *msg, const u_char *eom, int printHeader, FILE *file)
cp = Print_cdname(cp, msg, eom, file);
if (cp == NULL)
return;
type = ns_get16((u_char*)cp);
type = ns_get16((const u_char*)cp);
cp += INT16SZ;
class = ns_get16((u_char*)cp);
class = ns_get16((const u_char*)cp);
cp += INT16SZ;
fprintf(file,", type = %s", p_type(type));
fprintf(file,", class = %s\n", p_class(class));
@ -217,7 +218,7 @@ Fprint_query(const u_char *msg, const u_char *eom, int printHeader, FILE *file)
fprintf(file,"\n------------\n");
}
const u_char *
static const u_char *
Print_cdname_sub(const u_char *cp, const u_char *msg, const u_char *eom,
FILE *file, int format)
{
@ -323,16 +324,16 @@ Print_rr(const u_char *ocp, const u_char *msg, const u_char *eom, FILE *file) {
case T_MX:
BOUNDS_CHECK(cp, INT16SZ);
fprintf(file,"\tpreference = %u",ns_get16((u_char*)cp));
fprintf(file,"\tpreference = %u",ns_get16((const u_char*)cp));
cp += INT16SZ;
fprintf(file,", mail exchanger = ");
goto doname;
case T_NAPTR:
BOUNDS_CHECK(cp, 2 * INT16SZ);
fprintf(file, "\torder = %u",ns_get16((u_char*)cp));
fprintf(file, "\torder = %u",ns_get16((const u_char*)cp));
cp += INT16SZ;
fprintf(file,", preference = %u\n", ns_get16((u_char*)cp));
fprintf(file,", preference = %u\n", ns_get16((const u_char*)cp));
cp += INT16SZ;
/* Flags */
BOUNDS_CHECK(cp, 1);
@ -364,11 +365,11 @@ Print_rr(const u_char *ocp, const u_char *msg, const u_char *eom, FILE *file) {
case T_SRV:
BOUNDS_CHECK(cp, 3 * INT16SZ);
fprintf(file, "\tpriority = %u",ns_get16((u_char*)cp));
fprintf(file, "\tpriority = %u",ns_get16((const u_char*)cp));
cp += INT16SZ;
fprintf(file,", weight = %u", ns_get16((u_char*)cp));
fprintf(file,", weight = %u", ns_get16((const u_char*)cp));
cp += INT16SZ;
fprintf(file,", port= %u\n", ns_get16((u_char*)cp));
fprintf(file,", port= %u\n", ns_get16((const u_char*)cp));
cp += INT16SZ;
fprintf(file,"\thost = ");
@ -376,7 +377,7 @@ Print_rr(const u_char *ocp, const u_char *msg, const u_char *eom, FILE *file) {
case T_PX:
BOUNDS_CHECK(cp, INT16SZ);
fprintf(file,"\tpreference = %u",ns_get16((u_char*)cp));
fprintf(file,"\tpreference = %u",ns_get16((const u_char*)cp));
cp += INT16SZ;
fprintf(file,", RFC 822 = ");
cp = Print_cdname(cp, msg, eom, file);
@ -395,14 +396,14 @@ Print_rr(const u_char *ocp, const u_char *msg, const u_char *eom, FILE *file) {
case T_RT:
BOUNDS_CHECK(cp, INT16SZ);
fprintf(file,"\tpreference = %u",ns_get16((u_char*)cp));
fprintf(file,"\tpreference = %u",ns_get16((const u_char*)cp));
cp += INT16SZ;
fprintf(file,", router = ");
goto doname;
case T_AFSDB:
BOUNDS_CHECK(cp, INT16SZ);
fprintf(file,"\tsubtype = %d",ns_get16((u_char*)cp));
fprintf(file,"\tsubtype = %d",ns_get16((const u_char*)cp));
cp += INT16SZ;
fprintf(file,", DCE/AFS server = ");
goto doname;
@ -469,18 +470,18 @@ Print_rr(const u_char *ocp, const u_char *msg, const u_char *eom, FILE *file) {
return (NULL); /* compression error */
}
BOUNDS_CHECK(cp, 5 * INT32SZ);
fprintf(file,"\n\tserial = %lu", ns_get32((u_char*)cp));
fprintf(file,"\n\tserial = %lu", ns_get32((const u_char*)cp));
cp += INT32SZ;
ttl = ns_get32((u_char*)cp);
ttl = ns_get32((const u_char*)cp);
fprintf(file,"\n\trefresh = %lu (%s)", ttl, p_time(ttl));
cp += INT32SZ;
ttl = ns_get32((u_char*)cp);
ttl = ns_get32((const u_char*)cp);
fprintf(file,"\n\tretry = %lu (%s)", ttl, p_time(ttl));
cp += INT32SZ;
ttl = ns_get32((u_char*)cp);
ttl = ns_get32((const u_char*)cp);
fprintf(file,"\n\texpire = %lu (%s)", ttl, p_time(ttl));
cp += INT32SZ;
ttl = ns_get32((u_char*)cp);
ttl = ns_get32((const u_char*)cp);
fprintf(file,
"\n\tminimum ttl = %lu (%s)\n", ttl, p_time(ttl));
cp += INT32SZ;

View File

@ -53,7 +53,7 @@
#ifndef lint
static const char sccsid[] = "@(#)getinfo.c 5.26 (Berkeley) 3/21/91";
static const char rcsid[] = "$Id: getinfo.c,v 8.18 2001/02/27 06:03:40 vixie Exp $";
static const char rcsid[] = "$Id: getinfo.c,v 8.20 2001/06/20 12:30:33 marka Exp $";
#endif /* not lint */
/*
@ -88,8 +88,6 @@ static const char rcsid[] = "$Id: getinfo.c,v 8.18 2001/02/27 06:03:40 vixie Exp
#include "res.h"
extern char *res_skip();
static char *addr_list[MAXADDRS + 1];
static char *host_aliases[MAXALIASES];
@ -148,7 +146,7 @@ GetAnswer(nsAddrPtr, queryType, msg, msglen, iquery, hostPtr, isServer)
Boolean isServer;
{
register HEADER *headerPtr;
register u_char *cp;
register const u_char *cp;
querybuf answer;
char **aliasPtr;
u_char *eom, *bp;
@ -157,7 +155,7 @@ GetAnswer(nsAddrPtr, queryType, msg, msglen, iquery, hostPtr, isServer)
char *dnamePtr;
int type, class;
int qdcount, ancount, arcount, nscount, buflen;
int origClass;
int origClass = 0;
int numAliases = 0;
int numAddresses = 0;
int n, i, j;
@ -238,8 +236,8 @@ GetAnswer(nsAddrPtr, queryType, msg, msglen, iquery, hostPtr, isServer)
if (queryType != T_A && !(iquery && queryType == T_PTR)) {
while (--ancount >= 0 && cp < eom) {
if ((cp = (u_char *)Print_rr(cp,
(u_char *)&answer, eom, stdout)) == NULL) {
if ((cp = Print_rr(cp, (u_char *)&answer,
eom, stdout)) == NULL) {
return(ERROR);
}
}
@ -391,7 +389,7 @@ GetAnswer(nsAddrPtr, queryType, msg, msglen, iquery, hostPtr, isServer)
printf("Authoritative answers can be found from:\n");
}
cp = (u_char *)res_skip((char *) &answer, 2, eom);
cp = res_skip((u_char *)&answer, 2, eom);
numServers = 0;
if (queryType != T_A) {
@ -399,8 +397,8 @@ GetAnswer(nsAddrPtr, queryType, msg, msglen, iquery, hostPtr, isServer)
* If we don't need to save the record, just print it.
*/
while (--nscount >= 0 && cp < eom) {
if ((cp = (u_char *)Print_rr(cp,
(u_char *) &answer, eom, stdout)) == NULL) {
if ((cp = Print_rr(cp, (u_char *) &answer,
eom, stdout)) == NULL) {
return(ERROR);
}
}
@ -476,15 +474,15 @@ GetAnswer(nsAddrPtr, queryType, msg, msglen, iquery, hostPtr, isServer)
/*
* Additional resource records contain addresses of servers.
*/
cp = (u_char *)res_skip((char *) &answer, 3, eom);
cp = res_skip((u_char*)&answer, 3, eom);
if (queryType != T_A) {
/*
* If we don't need to save the record, just print it.
*/
while (--arcount >= 0 && cp < eom) {
if ((cp = (u_char *)Print_rr(cp,
(u_char *) &answer, eom, stdout)) == NULL) {
if ((cp = Print_rr(cp, (u_char *) &answer,
eom, stdout)) == NULL) {
return(ERROR);
}
}
@ -592,7 +590,7 @@ GetHostInfoByName(nsAddrPtr, queryClass, queryType, name, hostPtr, isServer)
struct in_addr *nsAddrPtr;
int queryClass;
int queryType;
char *name;
const char *name;
HostInfo *hostPtr;
Boolean isServer;
{
@ -698,13 +696,14 @@ GetHostDomain(nsAddrPtr, queryClass, queryType, name, domain, hostPtr, isServer)
struct in_addr *nsAddrPtr;
int queryClass;
int queryType;
char *name, *domain;
const char *name;
char *domain;
HostInfo *hostPtr;
Boolean isServer;
{
querybuf buf;
char nbuf[2*MAXDNAME+2];
char *longname = nbuf;
const char *longname = nbuf;
int n;
if (domain == NULL) {
@ -713,7 +712,7 @@ GetHostDomain(nsAddrPtr, queryClass, queryType, name, domain, hostPtr, isServer)
* copy without '.' if present.
*/
n = strlen(name) - 1;
if (name[n] == '.' && n < sizeof(nbuf) - 1) {
if (name[n] == '.' && n < (int)sizeof(nbuf) - 1) {
memcpy(nbuf, name, n);
nbuf[n] = '\0';
} else

View File

@ -53,7 +53,7 @@
#ifndef lint
static const char sccsid[] = "@(#)list.c 5.23 (Berkeley) 3/21/91";
static const char rcsid[] = "$Id: list.c,v 8.25 2000/12/23 08:14:46 vixie Exp $";
static const char rcsid[] = "$Id: list.c,v 8.26 2001/06/18 14:43:38 marka Exp $";
#endif /* not lint */
/*
@ -434,7 +434,7 @@ ListSubr(int qtype, char *domain, char *cmd) {
strcpy(origin, name);
strcpy(name_ctx, "@");
}
if (qtype == T_ANY || ns_rr_type(rr) == qtype) {
if (qtype == T_ANY || (int)ns_rr_type(rr) == qtype) {
if (ns_sprintrr(&handle, &rr, name_ctx, origin,
buf, sizeof buf) < 0) {
perror("ns_sprintrr");

View File

@ -77,7 +77,7 @@ char copyright[] =
#ifndef lint
static const char sccsid[] = "@(#)main.c 5.42 (Berkeley) 3/3/91";
static const char rcsid[] = "$Id: main.c,v 8.16 2000/12/23 08:14:47 vixie Exp $";
static const char rcsid[] = "$Id: main.c,v 8.20 2001/06/20 12:40:06 marka Exp $";
#endif /* not lint */
/*
@ -168,7 +168,7 @@ int queryClass = C_IN;
* Stuff for Interrupt (control-C) signal handler.
*/
extern SIG_FN IntrHandler();
extern SIG_FN IntrHandler(int);
FILE *filePtr;
jmp_buf env;
@ -176,10 +176,10 @@ jmp_buf env;
/*
* Browser command for help.
*/
char *pager;
const char *pager;
static void CvtAddrToPtr();
static void ReadRC();
static void CvtAddrToPtr(char *name);
static void ReadRC(void);
/*
* Forward declarations.
@ -188,6 +188,7 @@ static void LocalServer(HostInfo *defaultPtr);
static void res_re_init(void);
static void res_dnsrch(char *cp);
static void Usage(void);
static void ShowOptions(void);
/*
******************************************************************************
@ -381,7 +382,7 @@ main(int argc, char **argv) {
}
void
static void
LocalServer(defaultPtr)
HostInfo *defaultPtr;
{
@ -436,10 +437,10 @@ Usage(void) {
Boolean
IsAddr(host, addrPtr)
char *host;
const char *host;
struct in_addr *addrPtr; /* If return TRUE, contains IP address */
{
register char *cp;
register const char *cp;
if (isdigit(host[0])) {
/* Make sure it has only digits and dots. */
@ -1028,7 +1029,7 @@ SetOption(option)
/*
* Fake a reinitialization when the domain is changed.
*/
void
static void
res_re_init(void) {
register char *cp, **pp;
int n;
@ -1050,7 +1051,7 @@ res_re_init(void) {
#define SRCHLIST_SEP '/'
void
static void
res_dnsrch(char *cp) {
char **pp;
int n;
@ -1093,8 +1094,8 @@ res_dnsrch(char *cp) {
******************************************************************************
*/
void
ShowOptions()
static void
ShowOptions(void)
{
register char **cp;
@ -1144,7 +1145,7 @@ ShowOptions()
*/
void
PrintHelp()
PrintHelp(void)
{
char cmd[PATH_MAX];
@ -1193,7 +1194,7 @@ CvtAddrToPtr(name)
*/
static void
ReadRC()
ReadRC(void)
{
register FILE *fp;
register char *cp;

View File

@ -55,7 +55,7 @@
/*
* @(#)res.h 5.10 (Berkeley) 6/1/90
* $Id: res.h,v 8.7 2000/12/23 08:14:47 vixie Exp $
* $Id: res.h,v 8.9 2001/06/20 12:30:34 marka Exp $
*/
/*
@ -169,7 +169,6 @@ extern struct __res_state res;
*/
/* XXX need prototypes */
extern Boolean IsAddr();
void Print_query(const u_char *msg, const u_char *eom, int printHeader);
void Fprint_query(const u_char *msg, const u_char *eom, int printHeader,
FILE *file);
@ -186,14 +185,14 @@ extern char *Malloc();
extern void NsError();
extern void PrintServer();
extern void PrintHostInfo();
extern void ShowOptions();
extern void FreeHostInfoPtr();
extern FILE *OpenFile();
extern char *res_skip();
extern int pickString(const char *, char *, size_t);
extern int GetHostInfoByName();
extern int GetHostInfoByName(struct in_addr *, int, int, const char *,
HostInfo *, Boolean);
extern int GetHostInfoByAddr();
extern int GetHostDomain();
extern int GetHostDomain(struct in_addr *, int, int, const char *, char *,
HostInfo *, Boolean);
extern int matchString(const char *, const char *);
extern int StringToType(char *, int, FILE *);
extern int StringToClass(char *, int, FILE *);
@ -208,3 +207,17 @@ void ListHost_close(void);
int SetOption(char *);
int LookupHost(char *, Boolean);
int LookupHostWithServer(char *, Boolean);
const char * DecodeType(int);
const char * DecodeError(int);
FILE * OpenFile(char *, char *, size_t);
void PrintHostInfo(FILE *, const char *, HostInfo *);
char * Calloc(int, int);
char * Malloc(int);
SIG_FN IntrHandler(int);
int ListSubr(int, char *, char *);
void FreeHostInfoPtr(HostInfo *);
unsigned char * res_skip(unsigned char *, int, unsigned char *);
extern Boolean IsAddr(const char *, struct in_addr *);
void PrintHelp(void);
int GetHostInfoByAddr(struct in_addr *, struct in_addr *, HostInfo *);

View File

@ -53,7 +53,7 @@
#ifndef lint
static const char sccsid[] = "@(#)send.c 5.18 (Berkeley) 3/2/91";
static const char rcsid[] = "$Id: send.c,v 8.10 2000/12/23 08:14:47 vixie Exp $";
static const char rcsid[] = "$Id: send.c,v 8.12 2001/07/03 06:27:12 marka Exp $";
#endif /* not lint */
/*
@ -123,14 +123,15 @@ int
SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen,
u_char *answer, u_int anslen, int *trueLenPtr)
{
int n, try, v_circuit, resplen, salen;
int n, try, v_circuit, resplen;
ISC_SOCKLEN_T salen;
int gotsomewhere = 0, connected = 0;
int connreset = 0;
u_short id, len;
u_char *cp;
fd_set dsmask;
struct timeval timeout;
const HEADER *hp = (HEADER *) buf;
const HEADER *hp = (const HEADER *) buf;
HEADER *anhp = (HEADER *) answer;
struct iovec iov[2];
int terrno = ETIMEDOUT;
@ -183,7 +184,7 @@ SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen,
__putshort(buflen, (u_char *)&len);
iov[0].iov_base = (caddr_t)&len;
iov[0].iov_len = INT16SZ;
iov[1].iov_base = (caddr_t)buf;
DE_CONST(buf, iov[1].iov_base);
iov[1].iov_len = buflen;
if (writev(s, iov, 2) != INT16SZ + buflen) {
terrno = errno;
@ -224,7 +225,7 @@ SendRequest(struct in_addr *nsAddrPtr, const u_char *buf, int buflen,
continue;
}
cp = answer;
if ((resplen = ns_get16((u_char*)cp)) > anslen) {
if ((resplen = ns_get16((u_char*)cp)) > (int)anslen) {
if (res.options & RES_DEBUG)
fprintf(stderr, "response truncated\n");
len = anslen;

View File

@ -53,7 +53,7 @@
#ifndef lint
static const char sccsid[] = "@(#)skip.c 5.12 (Berkeley) 3/21/91";
static const char rcsid[] = "$Id: skip.c,v 8.5 1999/10/13 16:39:20 vixie Exp $";
static const char rcsid[] = "$Id: skip.c,v 8.7 2001/06/20 12:30:35 marka Exp $";
#endif /* not lint */
/*
@ -84,8 +84,9 @@ static const char rcsid[] = "$Id: skip.c,v 8.5 1999/10/13 16:39:20 vixie Exp $";
#include <stdio.h>
#include "port_after.h"
#include "res.h"
char *res_skip_rr();
static unsigned char *res_skip_rr(unsigned char *cp, unsigned char *eom);
/*
@ -109,13 +110,13 @@ char *res_skip_rr();
*******************************************************************************
*/
char *
unsigned char *
res_skip(msg, numFieldsToSkip, eom)
char *msg;
unsigned char *msg;
int numFieldsToSkip;
char *eom;
unsigned char *eom;
{
register char *cp;
register unsigned char *cp;
register HEADER *hp;
register int tmp;
register int n;
@ -132,7 +133,7 @@ res_skip(msg, numFieldsToSkip, eom)
n = ntohs(hp->qdcount);
if (n > 0) {
while (--n >= 0 && cp < eom) {
tmp = dn_skipname((u_char *)cp, (u_char *)eom);
tmp = dn_skipname(cp, eom);
if (tmp == -1) return(NULL);
cp += tmp;
cp += INT16SZ; /* type */
@ -193,15 +194,15 @@ res_skip(msg, numFieldsToSkip, eom)
*******************************************************************************
*/
char *
static unsigned char *
res_skip_rr(cp, eom)
char *cp;
char *eom;
unsigned char *cp;
unsigned char *eom;
{
int tmp;
int dlen;
if ((tmp = dn_skipname((u_char *)cp, (u_char *)eom)) == -1)
if ((tmp = dn_skipname(cp, eom)) == -1)
return (NULL); /* compression error */
cp += tmp;
if ((cp + RRFIXEDSZ) > eom)
@ -209,7 +210,7 @@ res_skip_rr(cp, eom)
cp += INT16SZ; /* type */
cp += INT16SZ; /* class */
cp += INT32SZ; /* ttl */
dlen = ns_get16((u_char*)cp);
dlen = ns_get16(cp);
cp += INT16SZ; /* dlen */
cp += dlen;
if (cp > eom)

View File

@ -53,7 +53,7 @@
#ifndef lint
static const char sccsid[] = "@(#)subr.c 5.24 (Berkeley) 3/2/91";
static const char rcsid[] = "$Id: subr.c,v 8.14 2000/12/23 08:14:48 vixie Exp $";
static const char rcsid[] = "$Id: subr.c,v 8.15 2001/06/18 14:43:45 marka Exp $";
#endif /* not lint */
/*
@ -120,7 +120,7 @@ static const char rcsid[] = "$Id: subr.c,v 8.14 2000/12/23 08:14:48 vixie Exp $"
*/
SIG_FN
IntrHandler()
IntrHandler(int sig)
{
extern jmp_buf env;
#if defined(BSD) && BSD >= 199006 && !defined(RISCOS_BSD) && !defined(__osf__)
@ -129,6 +129,8 @@ IntrHandler()
#endif
extern void ListHost_close(void);
UNUSED(sig);
SendRequest_close();
ListHost_close();
if (filePtr != NULL && filePtr != stdout) {
@ -233,7 +235,7 @@ Calloc(num, size)
void
PrintHostInfo(file, title, hp)
FILE *file;
char *title;
const char *title;
register HostInfo *hp;
{
register char **cp;
@ -387,21 +389,21 @@ OpenFile(string, file, size)
*/
const struct res_sym error_syms[] = {
{ NOERROR, "Success" },
{ FORMERR, "Format error" },
{ SERVFAIL, "Server failed" },
{ NXDOMAIN, "Non-existent host/domain" },
{ NOTIMP, "Not implemented" },
{ REFUSED, "Query refused" },
{ NOERROR, "Success", NULL },
{ FORMERR, "Format error", NULL },
{ SERVFAIL, "Server failed", NULL },
{ NXDOMAIN, "Non-existent host/domain", NULL },
{ NOTIMP, "Not implemented", NULL },
{ REFUSED, "Query refused", NULL },
#ifdef NOCHANGE
{ NOCHANGE, "No change" },
{ NOCHANGE, "No change", NULL },
#endif
{ TIME_OUT, "Timed out" },
{ NO_INFO, "No information" },
{ ERROR, "Unspecified error" },
{ NONAUTH, "Non-authoritative answer" },
{ NO_RESPONSE, "No response from server" },
{ 0, NULL }
{ TIME_OUT, "Timed out", NULL },
{ NO_INFO, "No information", NULL },
{ ERROR, "Unspecified error", NULL },
{ NONAUTH, "Non-authoritative answer", NULL },
{ NO_RESPONSE, "No response from server", NULL },
{ 0, NULL, NULL }
};
const char *

View File

@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
static const char rcsid[] = "$Id: nsupdate.c,v 8.26 2000/12/23 08:14:48 vixie Exp $";
static const char rcsid[] = "$Id: nsupdate.c,v 8.27 2001/06/18 14:43:46 marka Exp $";
#endif /* not lint */
/*
@ -390,7 +390,7 @@ main(int argc, char **argv) {
exit (1);
}
r_dname = dnbuf;
r_ttl = (r_opcode == ADD) ? -1 : 0;
r_ttl = (r_opcode == ADD) ? (~0U) : 0;
r_type = -1;
r_class = C_IN; /* default to IN */
r_size = 0;
@ -493,7 +493,7 @@ main(int argc, char **argv) {
r_size = endp - cp + 1;
break;
case ADD:
if (r_ttl == -1) {
if (r_ttl == ~0U) {
fprintf (stderr,
"ttl must be specified for record to be added: %s\n", buf);
exit (1);

View File

@ -0,0 +1,11 @@
#!/bin/sh
trap "" 1
sleep 60
while :; do
/usr/sbin/named -f >> /var/log/named 2>&1 < /dev/null
/usr/ucb/logger -p emerg "named restart"
sleep 32
done
exit

View File

@ -0,0 +1,57 @@
options {
directory "/var/named";
listen-on { 204.152.184.67; 127.0.0.1; };
query-source address 204.152.184.67 port 53;
pid-file "/var/run/named-res1.pid";
};
controls {
unix "/var/run/ndc-res1" perm 0600 owner 0 group 0;
};
zone "." {
type hint;
file "root.cache";
};
zone "localhost" {
type master;
file "pri/localhost";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "pri/127.0.0";
};
zone "pa.vix.com" {
type stub;
file "stub/pa.vix.com";
masters { 204.152.184.64; };
};
zone "184.152.204.in-addr.arpa" {
type stub;
file "stub/204.152.184";
masters { 204.152.184.64; };
};
zone "rc.vix.com" {
type stub;
file "stub/rc.vix.com";
masters { 204.152.187.21; };
};
zone "186.152.204.in-addr.arpa" {
type stub;
file "stub/204.152.186";
masters { 204.152.187.21; };
};
zone "187.152.204.in-addr.arpa" {
type stub;
file "stub/204.152.187";
masters { 204.152.187.21; };
};
include "named.conf.rfc1918-stubs";

View File

@ -0,0 +1,174 @@
acl rfc1918_query {
10.0.0.0/8 ;
127.0.0.1 ;
172.16.0.0/12 ;
192.168.0.0/16 ;
204.152.184.0/21 ;
} ;
acl rfc1918_transfer {
rfc1918_query ;
} ;
// RFC 1918 zones
//
zone "10.in-addr.arpa" {
type stub ;
file "stub/10" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "16.172.in-addr.arpa" {
type stub ;
file "stub/172.16" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "17.172.in-addr.arpa" {
type stub ;
file "stub/172.17" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "18.172.in-addr.arpa" {
type stub ;
file "stub/172.18" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "19.172.in-addr.arpa" {
type stub ;
file "stub/172.19" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "20.172.in-addr.arpa" {
type stub ;
file "stub/172.20" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "21.172.in-addr.arpa" {
type stub ;
file "stub/172.21" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "22.172.in-addr.arpa" {
type stub ;
file "stub/172.22" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "23.172.in-addr.arpa" {
type stub ;
file "stub/172.23" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "24.172.in-addr.arpa" {
type stub ;
file "stub/172.24" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "25.172.in-addr.arpa" {
type stub ;
file "stub/172.25" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "26.172.in-addr.arpa" {
type stub ;
file "stub/172.26" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "27.172.in-addr.arpa" {
type stub ;
file "stub/172.27" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "28.172.in-addr.arpa" {
type stub ;
file "stub/172.28" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "29.172.in-addr.arpa" {
type stub ;
file "stub/172.29" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "30.172.in-addr.arpa" {
type stub ;
file "stub/172.30" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "31.172.in-addr.arpa" {
type stub ;
file "stub/172.31" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "168.192.in-addr.arpa" {
type stub ;
file "stub/192.168" ;
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
} ;
zone "local.isc.org" {
type stub;
file "stub/local.isc.org";
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
};
zone "local.mibh.net" {
type stub;
file "stub/local.mibh.net";
masters {204.152.184.64; };
allow-query { rfc1918_query ; } ;
allow-transfer { rfc1918_transfer ; } ;
};

View File

@ -0,0 +1,12 @@
; 0.0.127.in-addr.arpa
$TTL 3600
@ in soa localhost. postmaster.localhost. (
1993050801 ;serial
3600 ;refresh
1800 ;retry
604800 ;expiration
3600 ) ;minimum
ns localhost.
1 ptr localhost.

View File

@ -0,0 +1,12 @@
; localhost.
$TTL 3600
@ in soa localhost. postmaster.localhost. (
1993050801 ;serial
3600 ;refresh
1800 ;retry
604800 ;expiration
3600 ) ;minimum
ns localhost.
a 127.0.0.1

View File

@ -0,0 +1,45 @@
; <<>> DiG 8.2 <<>> @f.root-servers.net . ns
; (1 server found)
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13
;; QUERY SECTION:
;; ., type = NS, class = IN
;; ANSWER SECTION:
. 6D IN NS G.ROOT-SERVERS.NET.
. 6D IN NS J.ROOT-SERVERS.NET.
. 6D IN NS K.ROOT-SERVERS.NET.
. 6D IN NS L.ROOT-SERVERS.NET.
. 6D IN NS M.ROOT-SERVERS.NET.
. 6D IN NS A.ROOT-SERVERS.NET.
. 6D IN NS H.ROOT-SERVERS.NET.
. 6D IN NS B.ROOT-SERVERS.NET.
. 6D IN NS C.ROOT-SERVERS.NET.
. 6D IN NS D.ROOT-SERVERS.NET.
. 6D IN NS E.ROOT-SERVERS.NET.
. 6D IN NS I.ROOT-SERVERS.NET.
. 6D IN NS F.ROOT-SERVERS.NET.
;; ADDITIONAL SECTION:
G.ROOT-SERVERS.NET. 5w6d16h IN A 192.112.36.4
J.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.10
K.ROOT-SERVERS.NET. 5w6d16h IN A 193.0.14.129
L.ROOT-SERVERS.NET. 5w6d16h IN A 198.32.64.12
M.ROOT-SERVERS.NET. 5w6d16h IN A 202.12.27.33
A.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.4
H.ROOT-SERVERS.NET. 5w6d16h IN A 128.63.2.53
B.ROOT-SERVERS.NET. 5w6d16h IN A 128.9.0.107
C.ROOT-SERVERS.NET. 5w6d16h IN A 192.33.4.12
D.ROOT-SERVERS.NET. 5w6d16h IN A 128.8.10.90
E.ROOT-SERVERS.NET. 5w6d16h IN A 192.203.230.10
I.ROOT-SERVERS.NET. 5w6d16h IN A 192.36.148.17
F.ROOT-SERVERS.NET. 5w6d16h IN A 192.5.5.241
;; Total query time: 10 msec
;; FROM: power.rc.vix.com to SERVER: f.root-servers.net 192.5.5.241
;; WHEN: Thu Jun 3 14:55:57 1999
;; MSG SIZE sent: 17 rcvd: 436

View File

@ -0,0 +1,36 @@
options {
directory "/var/named";
};
zone "." {
type hint;
file "root.cache";
};
zone "localhost" {
type master;
file "pri/localhost";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "pri/127.0.0";
};
zone "rc.vix.com" {
type stub;
file "stub/rc.vix.com";
masters { 204.152.187.21; };
};
zone "186.152.204.in-addr.arpa" {
type stub;
file "stub/204.152.186";
masters { 204.152.187.21; };
};
zone "187.152.204.in-addr.arpa" {
type stub;
file "stub/204.152.187";
masters { 204.152.187.21; };
};

View File

@ -0,0 +1,12 @@
; 0.0.127.in-addr.arpa
$TTL 3600
@ in soa localhost. postmaster.localhost. (
1993050801 ;serial
3600 ;refresh
1800 ;retry
604800 ;expiration
3600 ) ;minimum
ns localhost.
1 ptr localhost.

View File

@ -0,0 +1,12 @@
; localhost.
$TTL 3600
@ in soa localhost. postmaster.localhost. (
1993050801 ;serial
3600 ;refresh
1800 ;retry
604800 ;expiration
3600 ) ;minimum
ns localhost.
a 127.0.0.1

View File

@ -0,0 +1,45 @@
; <<>> DiG 8.2 <<>> @f.root-servers.net . ns
; (1 server found)
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13
;; QUERY SECTION:
;; ., type = NS, class = IN
;; ANSWER SECTION:
. 6D IN NS G.ROOT-SERVERS.NET.
. 6D IN NS J.ROOT-SERVERS.NET.
. 6D IN NS K.ROOT-SERVERS.NET.
. 6D IN NS L.ROOT-SERVERS.NET.
. 6D IN NS M.ROOT-SERVERS.NET.
. 6D IN NS A.ROOT-SERVERS.NET.
. 6D IN NS H.ROOT-SERVERS.NET.
. 6D IN NS B.ROOT-SERVERS.NET.
. 6D IN NS C.ROOT-SERVERS.NET.
. 6D IN NS D.ROOT-SERVERS.NET.
. 6D IN NS E.ROOT-SERVERS.NET.
. 6D IN NS I.ROOT-SERVERS.NET.
. 6D IN NS F.ROOT-SERVERS.NET.
;; ADDITIONAL SECTION:
G.ROOT-SERVERS.NET. 5w6d16h IN A 192.112.36.4
J.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.10
K.ROOT-SERVERS.NET. 5w6d16h IN A 193.0.14.129
L.ROOT-SERVERS.NET. 5w6d16h IN A 198.32.64.12
M.ROOT-SERVERS.NET. 5w6d16h IN A 202.12.27.33
A.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.4
H.ROOT-SERVERS.NET. 5w6d16h IN A 128.63.2.53
B.ROOT-SERVERS.NET. 5w6d16h IN A 128.9.0.107
C.ROOT-SERVERS.NET. 5w6d16h IN A 192.33.4.12
D.ROOT-SERVERS.NET. 5w6d16h IN A 128.8.10.90
E.ROOT-SERVERS.NET. 5w6d16h IN A 192.203.230.10
I.ROOT-SERVERS.NET. 5w6d16h IN A 192.36.148.17
F.ROOT-SERVERS.NET. 5w6d16h IN A 192.5.5.241
;; Total query time: 10 msec
;; FROM: power.rc.vix.com to SERVER: f.root-servers.net 192.5.5.241
;; WHEN: Thu Jun 3 14:55:57 1999
;; MSG SIZE sent: 17 rcvd: 436

View File

@ -0,0 +1 @@
this file is only here so that cvs will let the directory exist

View File

@ -49,7 +49,7 @@
*/
/*
* $Id: nameser.h,v 8.41 2000/12/23 08:14:50 vixie Exp $
* $Id: nameser.h,v 8.46 2001/11/16 05:37:33 marka Exp $
*/
#ifndef _ARPA_NAMESER_H_
@ -119,7 +119,7 @@ typedef struct __ns_msg {
const u_char *_sections[ns_s_max];
ns_sect _sect;
int _rrnum;
const u_char *_ptr;
const u_char *_msg_ptr;
} ns_msg;
/* Private data structure - do not use from outside library. */
@ -203,7 +203,9 @@ typedef enum __ns_rcode {
ns_r_notauth = 9, /* Not authoritative for zone */
ns_r_notzone = 10, /* Zone of record different from zone section */
ns_r_max = 11,
/* The following are TSIG extended errors */
/* The following are EDNS extended rcodes */
ns_r_badvers = 16,
/* The following are TSIG errors */
ns_r_badsig = 16,
ns_r_badkey = 17,
ns_r_badtime = 18
@ -425,11 +427,16 @@ typedef enum __ns_cert_types {
#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS)))
#define NS_NXT_MAX 127
/*
* EDNS0 extended flags, host order.
*/
#define NS_OPT_DNSSEC_OK 0x8000U
/*
* Inline versions of get/put short/long. Pointer is advanced.
*/
#define NS_GET16(s, cp) do { \
register u_char *t_cp = (u_char *)(cp); \
register const u_char *t_cp = (const u_char *)(cp); \
(s) = ((u_int16_t)t_cp[0] << 8) \
| ((u_int16_t)t_cp[1]) \
; \
@ -437,7 +444,7 @@ typedef enum __ns_cert_types {
} while (0)
#define NS_GET32(l, cp) do { \
register u_char *t_cp = (u_char *)(cp); \
register const u_char *t_cp = (const u_char *)(cp); \
(l) = ((u_int32_t)t_cp[0] << 24) \
| ((u_int32_t)t_cp[1] << 16) \
| ((u_int32_t)t_cp[2] << 8) \

View File

@ -32,7 +32,7 @@
/*
* from nameser.h 8.1 (Berkeley) 6/2/93
* $Id: nameser_compat.h,v 8.11 1999/01/02 08:00:58 vixie Exp $
* $Id: nameser_compat.h,v 8.13 2001/09/24 02:20:25 marka Exp $
*/
#ifndef _ARPA_NAMESER_COMPAT_
@ -64,6 +64,7 @@
defined(apollo) || defined(__convex__) || defined(_CRAY) || \
defined(__hppa) || defined(__hp9000) || \
defined(__hp9000s300) || defined(__hp9000s700) || \
defined(__hp3000s900) || defined(MPE) || \
defined (BIT_ZERO_ON_LEFT) || defined(m68k) || \
(defined(__Lynx__) && \
(defined(__68k__) || defined(__sparc__) || defined(__powerpc__)))
@ -207,6 +208,7 @@ typedef struct {
#define T_SRV ns_t_srv
#define T_ATMA ns_t_atma
#define T_NAPTR ns_t_naptr
#define T_A6 ns_t_a6
#define T_TSIG ns_t_tsig
#define T_IXFR ns_t_ixfr
#define T_AXFR ns_t_axfr

View File

@ -16,7 +16,7 @@
*/
/*
* $Id: irs.h,v 8.5 2000/12/23 08:14:49 vixie Exp $
* $Id: irs.h,v 8.6 2001/05/29 05:47:00 marka Exp $
*/
#ifndef _IRS_H_INCLUDED
@ -30,6 +30,7 @@
#include <netdb.h>
#include <resolv.h>
#include <pwd.h>
#include <netgroup.h>
/*
* This is the group map class.
@ -114,6 +115,8 @@ struct irs_ho {
struct __res_state * (*res_get) __P((struct irs_ho *));
void (*res_set) __P((struct irs_ho *, res_state,
void (*)(void *)));
struct addrinfo *(*addrinfo) __P((struct irs_ho *, const char *,
const struct addrinfo *));
};
/*
@ -138,8 +141,8 @@ struct irs_nw {
struct irs_ng {
void * private;
void (*close) __P((struct irs_ng *));
int (*next) __P((struct irs_ng *, char **, char **,
char **));
int (*next) __P((struct irs_ng *, const char **,
const char **, const char **));
int (*test) __P((struct irs_ng *, const char *,
const char *, const char *,
const char *));
@ -261,6 +264,12 @@ extern struct hostent *gethostent_p __P((struct net_data *net_data));
extern void sethostent_p __P((int stayopen,
struct net_data *net_data));
extern void endhostent_p __P((struct net_data *net_data));
extern struct hostent *getipnodebyname_p __P((const char *name, int af,
int flags, int *errp,
struct net_data *net_data));
extern struct hostent *getipnodebyaddr_p __P((const void *addr, size_t len,
int af, int *errp,
struct net_data *net_data));
extern struct netent *getnetent_p __P((struct net_data *net_data));
extern struct netent *getnetbyname_p __P((const char *name,
@ -279,8 +288,8 @@ extern int innetgr_p __P((const char *netgroup,
const char *user,
const char *domain,
struct net_data *net_data));
extern int getnetgrent_p __P((char **host, char **user,
char **domain,
extern int getnetgrent_p __P((const char **host, const char **user,
const char **domain,
struct net_data *net_data));
extern struct protoent *getprotoent_p __P((struct net_data *net_data));

View File

@ -16,7 +16,7 @@
*/
/*
* $Id: assertions.h,v 8.3 2000/07/17 07:53:59 vixie Exp $
* $Id: assertions.h,v 8.4 2001/05/29 05:47:07 marka Exp $
*/
#ifndef ASSERTIONS_H
@ -26,12 +26,12 @@ typedef enum {
assert_require, assert_ensure, assert_insist, assert_invariant
} assertion_type;
typedef void (*assertion_failure_callback)(char *, int, assertion_type, char *,
int);
typedef void (*assertion_failure_callback)(const char *, int, assertion_type,
const char *, int);
extern assertion_failure_callback __assertion_failed;
void set_assertion_failure_callback(assertion_failure_callback f);
char *assertion_type_to_text(assertion_type type);
const char *assertion_type_to_text(assertion_type type);
#ifdef CHECK_ALL
#define CHECK_REQUIRE 1

View File

@ -19,7 +19,7 @@
*/
/*
* $Id: ctl.h,v 8.9 1999/08/08 20:16:45 vixie Exp $
* $Id: ctl.h,v 8.11 2001/08/10 02:40:49 marka Exp $
*/
#include <sys/types.h>
@ -46,7 +46,7 @@ typedef void (*ctl_logfunc)(enum ctl_severity, const char *fmt, ...);
typedef void (*ctl_verbfunc)(struct ctl_sctx *, struct ctl_sess *,
const struct ctl_verb *, const char *rest,
u_int respflags, void *respctx, void *uctx);
u_int respflags, const void *respctx, void *uctx);
typedef void (*ctl_srvrdone)(struct ctl_sctx *, struct ctl_sess *, void *);
@ -62,7 +62,12 @@ struct ctl_verb {
#define ctl_logger __ctl_logger
#ifdef __GNUC__
void ctl_logger(enum ctl_severity, const char *, ...)
__attribute__((__format__(__printf__, 2, 3)));
#else
void ctl_logger(enum ctl_severity, const char *, ...);
#endif
/* Client symbols. */
@ -94,7 +99,7 @@ struct ctl_sctx * ctl_server(evContext, const struct sockaddr *, size_t,
ctl_logfunc, void *);
void ctl_endserver(struct ctl_sctx *);
void ctl_response(struct ctl_sess *, u_int,
const char *, u_int, void *,
const char *, u_int, const void *,
ctl_srvrdone, void *,
const char *, size_t);
void ctl_sendhelp(struct ctl_sess *, u_int);

View File

@ -18,7 +18,7 @@
/* eventlib.h - exported interfaces for eventlib
* vix 09sep95 [initial]
*
* $Id: eventlib.h,v 1.22 1999/08/18 22:09:04 vixie Exp $
* $Id: eventlib.h,v 1.23 2001/05/29 05:47:09 marka Exp $
*/
#ifndef _EVENTLIB_H
@ -106,7 +106,7 @@ int evHighestFD __P((evContext ctx));
int evListen __P((evContext ctx, int fd, int maxconn,
evConnFunc func, void *uap, evConnID *id));
int evConnect __P((evContext ctx, int fd, void *ra, int ralen,
int evConnect __P((evContext ctx, int fd, const void *ra, int ralen,
evConnFunc func, void *uap, evConnID *id));
int evCancelConn __P((evContext ctx, evConnID id));
int evHold __P((evContext, evConnID));

View File

@ -16,7 +16,7 @@
*/
/*
* $Id: irpmarshall.h,v 8.1 1999/01/18 07:46:47 vixie Exp $
* $Id: irpmarshall.h,v 8.2 2001/05/29 05:47:10 marka Exp $
*/
#ifndef _IRPMARSHALL_H_INCLUDED
@ -57,7 +57,8 @@ int irp_marshall_ho(struct hostent *ho, char **buffer, size_t *len);
int irp_unmarshall_ho(struct hostent *ho, char *buffer);
int irp_marshall_ng(const char *host, const char *user, const char *domain,
char **buffer, size_t *len);
int irp_unmarshall_ng(char **host, char **user, char **domain, char *buffer);
int irp_unmarshall_ng(const char **host, const char **user,
const char **domain, char *buffer);
int irp_marshall_nw(struct nwent *ne, char **buffer, size_t *len);
int irp_unmarshall_nw(struct nwent *ne, char *buffer);
int irp_marshall_ne(struct netent *ne, char **buffer, size_t *len);

View File

@ -72,6 +72,7 @@ typedef struct log_channel *log_channel;
#define log_dec_references __log_dec_references
#define log_get_channel_type __log_get_channel_type
#define log_free_channel __log_free_channel
#define log_close_debug_channels __log_close_debug_channels
FILE * log_open_stream(log_channel);
int log_close_stream(log_channel);
@ -81,7 +82,12 @@ int log_check_channel(log_context, int, log_channel);
int log_check(log_context, int, int);
void log_vwrite(log_context, int, int, const char *,
va_list args);
#ifdef __GNUC__
void log_write(log_context, int, int, const char *, ...)
__attribute__((__format__(__printf__, 4, 5)));
#else
void log_write(log_context, int, int, const char *, ...);
#endif
int log_new_context(int, char **, log_context *);
void log_free_context(log_context);
int log_add_channel(log_context, int, log_channel);
@ -89,7 +95,7 @@ int log_remove_channel(log_context, int, log_channel);
int log_option(log_context, int, int);
int log_category_is_active(log_context, int);
log_channel log_new_syslog_channel(unsigned int, int, int);
log_channel log_new_file_channel(unsigned int, int, char *,
log_channel log_new_file_channel(unsigned int, int, const char *,
FILE *, unsigned int,
unsigned long);
int log_set_file_owner(log_channel, uid_t, gid_t);
@ -98,5 +104,6 @@ int log_inc_references(log_channel);
int log_dec_references(log_channel);
log_channel_type log_get_channel_type(log_channel);
int log_free_channel(log_channel);
void log_close_debug_channels(log_context);
#endif /* !LOGGING_H */

View File

@ -34,6 +34,7 @@
#endif /*MEMCLUSTER_RECORD*/
#endif /*MEMCLUSTER_DEBUG*/
#define memstats __memstats
#define memactive __memactive
int meminit(size_t, size_t);
void * __memget(size_t);
@ -43,5 +44,6 @@ void __memput_debug(void *, size_t, const char *, int);
void * __memget_record(size_t, const char *, int);
void __memput_record(void *, size_t, const char *, int);
void memstats(FILE *);
int memactive(void);
#endif /* MEMCLUSTER_H */

View File

@ -16,16 +16,24 @@
*/
/*
* $Id: misc.h,v 8.4 2000/12/23 08:14:52 vixie Exp $
* $Id: misc.h,v 8.5 2001/06/18 06:40:43 marka Exp $
*/
#ifndef _ISC_MISC_H
#define _ISC_MISC_H
#include <stdio.h>
#define bitncmp __bitncmp
/*#define isc_movefile __isc_movefile */
extern int bitncmp(const void *l, const void *r, int n);
extern int isc_movefile(const char *, const char *);
extern int isc_gethexstring(unsigned char *, size_t, int, FILE *,
int *);
extern void isc_puthexstring(FILE *, const unsigned char *, size_t,
size_t, size_t, const char *);
extern void isc_tohex(const unsigned char *, size_t, char *);
#endif /*_ISC_MISC_H*/

View File

@ -86,17 +86,19 @@
/*
* @(#)netdb.h 8.1 (Berkeley) 6/2/93
* $Id: netdb.h,v 8.15 1999/09/18 06:23:46 vixie Exp $
* $Id: netdb.h,v 8.17 2001/06/18 14:43:48 marka Exp $
*/
#ifndef _NETDB_H_
#define _NETDB_H_
#include <sys/param.h>
#include <sys/types.h>
#if (!defined(BSD)) || (BSD < 199306)
# include <sys/bitypes.h>
#endif
#include <sys/cdefs.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
@ -116,10 +118,10 @@
#define _PATH_SERVICES "/etc/services"
#endif
#ifdef _REENTRANT
__BEGIN_DECLS
extern int * __h_errno __P((void));
__END_DECLS
#ifdef _REENTRANT
#define h_errno (*__h_errno())
#else
extern int h_errno;
@ -236,10 +238,17 @@ struct addrinfo {
#define NI_NAMEREQD 0x00000004
#define NI_NUMERICSERV 0x00000008
#define NI_DGRAM 0x00000010
#define NI_WITHSCOPEID 0x00000020
#define NI_NUMERICSCOPE 0x00000040
/*
* Scope delimit character
*/
#define SCOPE_DELIMITER '%'
#ifdef _REENTRANT
#if defined (__hpux) || defined(__osf__)
#if defined (__hpux) || defined(__osf__) || defined(_AIX)
#define _MAXALIASES 35
#define _MAXLINELEN 1024
#define _MAXADDRS 35
@ -334,10 +343,13 @@ void endhostent __P((void));
void endnetent __P((void));
void endprotoent __P((void));
void endservent __P((void));
void freehostent __P((struct hostent *));
struct hostent *gethostbyaddr __P((const char *, int, int));
struct hostent *gethostbyname __P((const char *));
struct hostent *gethostbyname2 __P((const char *, int));
struct hostent *gethostent __P((void));
struct hostent *getipnodebyaddr __P((const void *, size_t, int, int *));
struct hostent *getipnodebyname __P((const char *, int, int, int *));
struct netent *getnetbyaddr __P((unsigned long, int));
struct netent *getnetbyname __P((const char *));
struct netent *getnetent __P((void));
@ -359,20 +371,24 @@ int getaddrinfo __P((const char *, const char *,
int getnameinfo __P((const struct sockaddr *, size_t, char *,
size_t, char *, size_t, int));
void freeaddrinfo __P((struct addrinfo *));
char *gai_strerror __P((int));
const char *gai_strerror __P((int));
struct hostent *getipnodebyname __P((const char *, int, int, int *));
struct hostent *getipnodebyaddr __P((const void *, size_t, int, int *));
void freehostent __P((struct hostent *));
#ifdef _REENTRANT
#if defined(__hpux) || defined(__osf__)
#if defined(__hpux) || defined(__osf__) || defined(_AIX)
int gethostbyaddr_r __P((const char *, int, int, struct hostent *,
struct hostent_data *));
int gethostbyname_r __P((const char *, struct hostent *,
struct hostent_data *));
int gethostent_r __P((struct hostent *, struct hostent_data *));
#if defined(_AIX)
void sethostent_r __P((int, struct hostent_data *));
#else
int sethostent_r __P((int, struct hostent_data *));
#endif
#if defined(__hpux)
int endhostent_r __P((struct hostent_data *));
#else
@ -419,8 +435,8 @@ int endservent_r __P((struct servent_data *));
#else
void endservent_r __P((struct servent_data *));
#endif
#endif
#if defined(sun) || defined(bsdi)
#else
/* defined(sun) || defined(bsdi) */
struct hostent *gethostbyaddr_r __P((const char *, int, int, struct hostent *,
char *, int, int *));
struct hostent *gethostbyname_r __P((const char *, struct hostent *,

View File

@ -0,0 +1,17 @@
#ifndef netgroup_h
#define netgroup_h
int getnetgrent(const char **machinep, const char **userp,
const char **domainp);
int getnetgrent_r(char **machinep, char **userp, char **domainp,
char *buffer, int buflen);
void setnetgrent(const char *netgroup);
void endnetgrent(void);
int innetgr(const char *netgroup, const char *machine,
const char *user, const char *domain);
#endif

View File

@ -50,7 +50,7 @@
/*
* @(#)resolv.h 8.1 (Berkeley) 6/2/93
* $Id: resolv.h,v 8.32.2.1 2001/05/17 03:01:30 marka Exp $
* $Id: resolv.h,v 8.44 2001/12/19 01:44:19 marka Exp $
*/
#ifndef _RESOLV_H_
@ -63,7 +63,9 @@
# include <sys/types.h>
#endif
#include <sys/cdefs.h>
#include <sys/socket.h>
#include <stdio.h>
#include <arpa/nameser.h>
/*
* Revision information. This is the release date in YYYYMMDD format.
@ -113,14 +115,14 @@ __END_DECLS
typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
res_sendhookact;
typedef res_sendhookact (*res_send_qhook)__P((struct sockaddr_in * const *ns,
typedef res_sendhookact (*res_send_qhook)__P((struct sockaddr * const *ns,
const u_char **query,
int *querylen,
u_char *ans,
int anssiz,
int *resplen));
typedef res_sendhookact (*res_send_rhook)__P((const struct sockaddr_in *ns,
typedef res_sendhookact (*res_send_rhook)__P((const struct sockaddr *ns,
const u_char *query,
int querylen,
u_char *ans,
@ -128,9 +130,9 @@ typedef res_sendhookact (*res_send_rhook)__P((const struct sockaddr_in *ns,
int *resplen));
struct res_sym {
int number; /* Identifying number, like T_MX */
char * name; /* Its symbolic name, like "MX" */
char * humanname; /* Its fun name, like "mail exchanger" */
int number; /* Identifying number, like T_MX */
const char * name; /* Its symbolic name, like "MX" */
const char * humanname; /* Its fun name, like "mail exchanger" */
};
/*
@ -149,6 +151,8 @@ struct res_sym {
#define RES_DFLRETRY 2 /* Default #/tries. */
#define RES_MAXTIME 65535 /* Infinity, in milliseconds. */
struct __res_state_ext;
struct __res_state {
int retrans; /* retransmition time interval */
int retry; /* number of times to retransmit */
@ -174,23 +178,38 @@ struct __res_state {
int _vcsock; /* PRIVATE: for res_send VC i/o */
u_int _flags; /* PRIVATE: see below */
union {
char pad[52]; /* On an i386 this means 512b total. */
/* On an 32-bit arch this means 512b total. */
char pad[72 - 3*sizeof (int) - 2*sizeof (void *)];
struct {
u_int16_t nscount;
u_int16_t nstimes[MAXNS]; /* ms. */
int nssocks[MAXNS];
struct sockaddr_in nsaddrs[MAXNS];
struct __res_state_ext *ext; /* extention for IPv6 */
} _ext;
} _u;
};
typedef struct __res_state *res_state;
union res_sockaddr_union {
struct sockaddr_in sin;
#ifdef IN6ADDR_ANY_INIT
struct sockaddr_in6 sin6;
#endif
#ifdef ISC_ALIGN64
int64_t __align64; /* 64bit alignment */
#else
int32_t __align32; /* 32bit alignment */
#endif
char __space[128]; /* max size */
};
/*
* Resolver flags (used to be discrete per-module statics ints).
*/
#define RES_F_VC 0x00000001 /* socket is TCP */
#define RES_F_CONN 0x00000002 /* socket is connected */
#define RES_F_EDNS0ERR 0x00000004 /* EDNS0 caused errors */
/* res_findzonecut() options */
#define RES_EXHAUSTIVE 0x00000001 /* always do all queries */
@ -216,6 +235,14 @@ typedef struct __res_state *res_state;
#define RES_NOCHECKNAME 0x00008000 /* do not check names for sanity. */
#define RES_KEEPTSIG 0x00010000 /* do not strip TSIG records */
#define RES_BLAST 0x00020000 /* blast all recursive servers */
#define RES_NO_NIBBLE 0x00040000 /* disable IPv6 nibble mode reverse */
#define RES_NO_BITSTRING 0x00080000 /* disable IPv6 bitstring mode reverse */
#define RES_NOTLDQUERY 0x00100000 /* don't unqualified name as a tld */
#define RES_USE_DNSSEC 0x00200000 /* use DNSSEC using OK bit in OPT */
/* KAME extensions: use higher bit to avoid conflict with ISC use */
#define RES_USE_DNAME 0x10000000 /* use DNAME */
#define RES_USE_A6 0x20000000 /* use A6 */
#define RES_USE_EDNS0 0x40000000 /* use EDNS0 if configured */
#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH)
@ -237,7 +264,8 @@ typedef struct __res_state *res_state;
#define RES_PRF_QUERY 0x00001000
#define RES_PRF_REPLY 0x00002000
#define RES_PRF_INIT 0x00004000
/* 0x00008000 */
#define RES_PRF_TRUNC 0x00008000
/* 0x00010000 */
/* Things involving an internal (static) resolver context. */
#ifdef _REENTRANT
@ -345,6 +373,12 @@ extern const struct res_sym __p_rcode_syms[];
#define sym_ntop __sym_ntop
#define sym_ntos __sym_ntos
#define sym_ston __sym_ston
#define res_nopt __res_nopt
#define res_ndestroy __res_ndestroy
#define res_nametoclass __res_nametoclass
#define res_nametotype __res_nametotype
#define res_setservers __res_setservers
#define res_getservers __res_getservers
__BEGIN_DECLS
int res_hnok __P((const char *));
int res_ownok __P((const char *));
@ -360,6 +394,10 @@ const char * loc_ntoa __P((const u_char *binary, char *ascii));
int dn_skipname __P((const u_char *, const u_char *));
void putlong __P((u_int32_t, u_char *));
void putshort __P((u_int16_t, u_char *));
#ifndef __ultrix__
u_int16_t _getshort __P((const u_char *src));
u_int32_t _getlong __P((const u_char *src));
#endif
const char * p_class __P((int));
const char * p_time __P((u_int32_t));
const char * p_type __P((int));
@ -406,6 +444,24 @@ int res_nsendsigned __P((res_state, const u_char *, int,
int res_findzonecut __P((res_state, const char *, ns_class, int,
char *, size_t, struct in_addr *, int));
void res_nclose __P((res_state));
int res_nopt __P((res_state, int, u_char *, int, int));
void res_send_setqhook __P((res_send_qhook hook));
void res_send_setrhook __P((res_send_rhook hook));
int __res_vinit __P((res_state, int));
void res_destroyservicelist __P((void));
const char * res_servicename __P((u_int16_t port, const char *proto));
const char * res_protocolname __P((int num));
void res_destroyprotolist __P((void));
void res_buildprotolist __P((void));
const char * res_get_nibblesuffix __P((res_state));
const char * res_get_bitstringsuffix __P((res_state));
void res_ndestroy __P((res_state));
u_int16_t res_nametoclass __P((const char *buf, int *success));
u_int16_t res_nametotype __P((const char *buf, int *success));
void res_setservers __P((res_state,
const union res_sockaddr_union *, int));
int res_getservers __P((res_state,
union res_sockaddr_union *, int));
__END_DECLS
#endif /* !_RESOLV_H_ */

View File

@ -13,7 +13,7 @@
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
# SOFTWARE.
# $Id: Makefile,v 8.25 2000/12/23 08:02:56 vixie Exp $
# $Id: Makefile,v 8.26 2001/08/14 05:57:58 marka Exp $
SUBDIRS = resolv irs isc bsd inet nameser dst cylink dnssafe
@ -60,6 +60,9 @@ LIBTS = ${TOP}/lib/libbind.ts
LIBR = libbind_r.${A}
LIBRTS = ${TOP}/lib/libbindr.ts
.NOTPARALLEL:
.NO_PARALLEL:
all depend clean install distclean::
@for x in ${SUBDIRS}; do \
(cd $$x; pwd; ${MAKE} ${MARGS} $@) || exit 1; \

View File

@ -13,7 +13,7 @@
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
# SOFTWARE.
# $Id: Makefile,v 1.18 2000/12/23 08:02:58 vixie Exp $
# $Id: Makefile,v 1.19 2001/08/14 05:58:03 marka Exp $
# these are only appropriate for BSD 4.4 or derivatives, and are used in
# development. normal builds will be done in the top level directory and
@ -64,7 +64,7 @@ ${LIBBIND}: ${OBJS}
${RANLIB} ${LIBBIND}
.c.${O}:
if test ! -d ${THREADED} ; then mkdir ${THREADED} ; else true ; fi
mkdir ${THREADED} 2> /dev/null || test -d ${THREADED} -a -w ${THREADED}
${CC} ${CPPFLAGS} ${CFLAGS} ${BOUNDS} ${REENTRANT} ${CRYPTINCL} ${CRYPTFLAGS} -c $*.c -o ${THREADED}/$*.${O}
-${LDS} ${LD} ${LD_LIBFLAGS} ${THREADED}/$*.${O} \
-o ${THREADED}/$*.out && \

View File

@ -1,5 +1,5 @@
#if defined(BSAFE) || defined(DNSSAFE)
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/bsafe_link.c,v 1.12 2001/04/05 21:59:59 bwelling Exp $";
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/bsafe_link.c,v 1.15 2001/09/25 04:50:28 marka Exp $";
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@ -118,7 +118,7 @@ static void *dst_bsafe_free_key_structure(void *key);
* BSAFE/DNSSAFE related functions
*/
int
dst_bsafe_init()
dst_bsafe_init(void)
{
if (dst_t_func[KEY_RSA] != NULL)
return (1);
@ -327,7 +327,8 @@ dst_bsafe_verify(const int mode, DST_KEY *dkey, void **context,
if (ret == 0 &&
(status = B_DecryptUpdate(rsaEncryptor, work_area,
&u_bytes, 0,
(u_char *) signature, sig_len,
(const u_char *) signature,
sig_len,
NULL_PTR, NULL_SURRENDER)))
ret = VERIFY_FINAL_FAILURE;
@ -385,24 +386,28 @@ dst_bsafe_to_dns_key(const DST_KEY *in_key, u_char *out_str,
public = (B_KEY_OBJ)((RSA_Key *) in_key->dk_KEY_struct)->rk_Public_Key;
n = B_GetKeyInfo((POINTER *) &pub, public, KI_RSAPublic);
if (out_len < pub->exponent.len) /* not enough space */
if (n != 0)
return (-1);
if (pub->exponent.len < 256) /* key exponent is <= 2040 bits */
if (pub->exponent.len < 256) { /* key exponent is <= 2040 bits */
if ((unsigned int)out_len < pub->exponent.len + 1)
return (-1);
*op++ = (u_int8_t) pub->exponent.len;
else { /* key exponent is > 2040 bits */
} else { /* key exponent is > 2040 bits */
u_int16_t e = (u_int16_t) pub->exponent.len;
*op++ = 0; /* 3 byte lenght field */
if ((unsigned int)out_len < pub->exponent.len + 3)
return (-1);
*op++ = 0; /* 3 byte length field */
dst_s_put_int16(op, e);
op += sizeof(e);
n = 2;
}
n += pub->exponent.len;
memcpy(op, pub->exponent.data, n);
op += n;
n++;
memcpy(op, pub->exponent.data, pub->exponent.len);
op += pub->exponent.len;
n += pub->exponent.len;
if ((out_len - n) > pub->modulus.len) {
if ((unsigned int)(out_len - n) >= pub->modulus.len) {
/*copy exponent */
memcpy(op, pub->modulus.data, pub->modulus.len);
n += pub->modulus.len;
@ -612,7 +617,6 @@ dst_bsafe_key_from_file_format(DST_KEY *d_key, const char *buff,
int status;
char s[RAW_KEY_SIZE];
int len, s_len = sizeof(s);
int tag = -1;
const char *p = buff;
RSA_Key *b_key;
A_RSA_KEY *public;
@ -1041,7 +1045,7 @@ dst_bsafe_md5digest(const int mode, B_ALGORITHM_OBJ *digest_obj,
if (digest_obj == NULL || *digest_obj == NULL) {
printf("NO digest obj\n");
exit(-33);
exit(33);
}
if ((mode & SIG_MODE_INIT) &&
@ -1050,8 +1054,7 @@ dst_bsafe_md5digest(const int mode, B_ALGORITHM_OBJ *digest_obj,
return (SIGN_INIT_FAILURE);
if ((mode & SIG_MODE_UPDATE) && data && (len > 0) &&
(status = B_DigestUpdate(*digest_obj, (u_char *) data, len,
NULL_SURRENDER)))
(status = B_DigestUpdate(*digest_obj, data, len, NULL_SURRENDER)))
return (SIGN_UPDATE_FAILURE);
if (mode & SIG_MODE_FINAL) {
@ -1080,13 +1083,13 @@ T_malloc(unsigned int len)
}
int
T_memcmp(POINTER firstBlock, POINTER secondBlock, unsigned int len)
T_memcmp(CPOINTER firstBlock, CPOINTER secondBlock, unsigned int len)
{
return (memcmp(firstBlock, secondBlock, len));
}
void
T_memcpy(POINTER output, POINTER input, unsigned int len)
T_memcpy(POINTER output, CPOINTER input, unsigned int len)
{
memcpy(output, input, len);
}

View File

@ -1,5 +1,5 @@
#ifdef CYLINK_DSS
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/cylink_link.c,v 1.8 2001/04/05 22:00:00 bwelling Exp $";
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/cylink_link.c,v 1.9 2001/05/29 05:48:05 marka Exp $";
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@ -147,7 +147,7 @@ dst_cylink_sign(const int mode, DST_KEY *dkey, void **context,
SHAInit(ctx);
if ((mode & SIG_MODE_UPDATE) && (data && len > 0)) {
status = SHAUpdate(ctx, (u_char *) data, len);
status = SHAUpdate(ctx, data, len);
if (status != SUCCESS)
return (SIGN_UPDATE_FAILURE);
}
@ -228,7 +228,7 @@ dst_cylink_verify(const int mode, DST_KEY *dkey, void **context,
SHAInit(ctx);
if ((mode & SIG_MODE_UPDATE) && (data && len > 0)) {
status = SHAUpdate(ctx, (u_char *) data, len);
status = SHAUpdate(ctx, data, len);
if (status != SUCCESS)
return (VERIFY_UPDATE_FAILURE);
}
@ -576,6 +576,8 @@ dst_cylink_generate_keypair(DST_KEY *key, int nothing)
DSA_Key *dsa;
u_char rand[SHA_LENGTH];
UNUSED(nothing);
if (key == NULL || key->dk_alg != KEY_DSA)
return (0);

View File

@ -1,5 +1,5 @@
#ifndef LINT
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/dst_api.c,v 1.17.2.2 2001/07/26 01:58:06 marka Exp $";
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/dst_api.c,v 1.20 2001/07/26 01:20:08 marka Exp $";
#endif
/*
@ -62,8 +62,8 @@ static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/dst_api.c,
/* static variables */
static int done_init = 0;
dst_func *dst_t_func[DST_MAX_ALGS];
char *key_file_fmt_str = "Private-key-format: v%s\nAlgorithm: %d (%s)\n";
char *dst_path = "";
const char *key_file_fmt_str = "Private-key-format: v%s\nAlgorithm: %d (%s)\n";
const char *dst_path = "";
/* internal I/O functions */
static DST_KEY *dst_s_read_public_key(const char *in_name,
@ -109,12 +109,14 @@ dst_init()
} else if (stat(s, &statbuf) != 0 || !S_ISDIR(statbuf.st_mode)) {
EREPORT(("%s is not a valid directory\n", s));
} else {
dst_path = (char *) malloc(len + 2);
memcpy(dst_path, s, len + 1);
if (dst_path[strlen(dst_path) - 1] != '/') {
dst_path[strlen(dst_path) + 1] = 0;
dst_path[strlen(dst_path)] = '/';
char *tmp;
tmp = (char *) malloc(len + 2);
memcpy(tmp, s, len + 1);
if (tmp[strlen(tmp) - 1] != '/') {
tmp[strlen(tmp) + 1] = 0;
tmp[strlen(tmp)] = '/';
}
dst_path = tmp;
}
}
memset(dst_t_func, 0, sizeof(dst_t_func));
@ -555,7 +557,7 @@ dst_s_read_public_key(const char *in_name, const u_int16_t in_id, int in_alg)
enckey[--len] = '\0';
/* remove leading spaces */
for (notspace = (char *) enckey; isspace(*notspace); len--)
for (notspace = (char *) enckey; isspace((*notspace)&0xff); len--)
notspace++;
dlen = b64_pton(notspace, deckey, sizeof(deckey));
@ -589,6 +591,7 @@ dst_s_write_public_key(const DST_KEY *key)
u_char out_key[RAW_KEY_SIZE];
char enc_key[RAW_KEY_SIZE];
int len = 0;
int mode;
memset(out_key, 0, sizeof(out_key));
if (key == NULL) {
@ -604,8 +607,10 @@ dst_s_write_public_key(const DST_KEY *key)
key->dk_key_name, key->dk_id, PUBLIC_KEY));
return (0);
}
/* XXX in general this should be a check for symmetric keys */
mode = (key->dk_alg == KEY_HMAC_MD5) ? 0600 : 0644;
/* create public key file */
if ((fp = dst_s_fopen(filename, "w+", 0644)) == NULL) {
if ((fp = dst_s_fopen(filename, "w+", mode)) == NULL) {
EREPORT(("DST_write_public_key: open of file:%s failed (errno=%d)\n",
filename, errno));
return (0);

View File

@ -65,13 +65,14 @@ typedef struct dst_key {
#ifdef REPORT_ERRORS
#define EREPORT(str) printf str
#else
#define EREPORT(str)
#define EREPORT(str) (void)0
#endif
/* use our own special macro to FRRE memory */
#ifndef SAFE_FREE
#define SAFE_FREE(a) if(a != NULL){memset(a,0, sizeof(*a)); free(a); a=NULL;}
#define SAFE_FREE(a) \
do{if(a != NULL){memset(a,0, sizeof(*a)); free(a); a=NULL;}} while (0)
#define SAFE_FREE2(a,s) if (a != NULL && s > 0){memset(a,0, s);free(a); a=NULL;}
#endif
@ -98,22 +99,22 @@ typedef struct dst_func {
} dst_func;
extern dst_func *dst_t_func[DST_MAX_ALGS];
extern char *key_file_fmt_str;
extern char *dst_path;
extern const char *key_file_fmt_str;
extern const char *dst_path;
#ifndef DST_HASH_SIZE
#define DST_HASH_SIZE 20 /* RIPEMD160 and SHA-1 are 20 bytes MD5 is 16 */
#endif
int dst_bsafe_init();
int dst_bsafe_init(void);
int dst_rsaref_init();
int dst_rsaref_init(void);
int dst_hmac_md5_init();
int dst_hmac_md5_init(void);
int dst_cylink_init();
int dst_cylink_init(void);
int dst_eay_dss_init();
int dst_eay_dss_init(void);
/* support functions */
/* base64 to bignum conversion routines */
@ -158,6 +159,10 @@ void dst_s_put_int32( u_int8_t *buf, const u_int32_t val);
#else
# define DUMP(a,b,c,d)
#endif
void
dst_s_dump(const int mode, const u_char *data, const int size,
const char *msg);
#endif /* DST_INTERNAL_H */

View File

@ -1,5 +1,5 @@
#ifdef EAY_DSS
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/eay_dss_link.c,v 1.5 2001/04/05 22:00:03 bwelling Exp $";
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/eay_dss_link.c,v 1.6 2001/05/29 05:48:09 marka Exp $";
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@ -44,6 +44,7 @@ static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/eay_dss_li
#include "port_after.h"
static int dst_eay_dss_sign(const int mode, DST_KEY *dkey, void **context,
const u_char *data, const int len,
u_char *signature, const int sig_len);
@ -71,7 +72,7 @@ static int dst_eay_dss_compare_keys(const DST_KEY *key1, const DST_KEY *key2);
* EAY DSS related functions
*/
int
dst_eay_dss_init()
dst_eay_dss_init(void)
{
if (dst_t_func[KEY_DSA] != NULL)
return (1);
@ -608,8 +609,21 @@ dst_eay_dss_compare_keys(const DST_KEY *key1, const DST_KEY *key2)
return (0);
}
#else
#include "port_before.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <sys/param.h>
#include <sys/time.h>
#include <netinet/in.h>
#include "dst_internal.h"
#include "port_after.h"
int
dst_eay_dss_init()
dst_eay_dss_init(void)
{
return (0);
}

View File

@ -1,6 +1,6 @@
#ifdef HMAC_MD5
#ifndef LINT
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/hmac_link.c,v 1.8 1999/10/15 21:30:07 vixie Exp $";
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/hmac_link.c,v 1.9 2001/05/29 05:48:10 marka Exp $";
#endif
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@ -103,7 +103,7 @@ dst_hmac_md5_sign(const int mode, DST_KEY *d_key, void **context,
}
if ((mode & SIG_MODE_UPDATE) && (data && len > 0))
MD5Update(ctx, (u_char *)data, len);
MD5Update(ctx, data, len);
if (mode & SIG_MODE_FINAL) {
if (signature == NULL || sig_len < MD5_LEN)
@ -169,7 +169,7 @@ dst_hmac_md5_verify(const int mode, DST_KEY *d_key, void **context,
MD5Update(ctx, key->hk_ipad, HMAC_LEN);
}
if ((mode & SIG_MODE_UPDATE) && (data && len > 0))
MD5Update(ctx, (u_char *)data, len);
MD5Update(ctx, data, len);
if (mode & SIG_MODE_FINAL) {
u_char digest[MD5_LEN];
@ -229,7 +229,7 @@ dst_buffer_to_hmac_md5(DST_KEY *dkey, const u_char *key, const int keylen)
if (keylen > HMAC_LEN) {
u_char tk[MD5_LEN];
MD5Init(&ctx);
MD5Update(&ctx, (u_char *)key, keylen);
MD5Update(&ctx, key, keylen);
MD5Final(tk, &ctx);
memset((void *) &ctx, 0, sizeof(ctx));
key = tk;
@ -431,6 +431,8 @@ dst_hmac_md5_generate_key(DST_KEY *key, const int nothing)
u_char *buff;
int i, n, size;
i = nothing;
if (key == NULL || key->dk_alg != KEY_HMAC_MD5)
return (0);
size = (key->dk_key_size + 7) / 8; /* convert to bytes */

View File

@ -80,7 +80,7 @@ typedef struct MD5state_st
#ifndef NOPROTO
void MD5_Init(MD5_CTX *c);
void MD5_Update(MD5_CTX *c, unsigned char *data, unsigned long len);
void MD5_Update(MD5_CTX *c, const unsigned char *data, unsigned long len);
void MD5_Final(unsigned char *md, MD5_CTX *c);
unsigned char *MD5(unsigned char *d, unsigned long n, unsigned char *md);
#else

View File

@ -56,11 +56,13 @@
* [including the GNU Public Licence.]
*/
#include <stdio.h>
#ifdef USE_MD5 /* Added by ogud@tis.com 1998/1/26 */
#include <port_before.h>
#include <stdio.h>
#include "md5_locl.h"
#include <port_after.h>
char *MD5_version="MD5 part of SSLeay 0.8.1 19-Jul-1997";
const char *MD5_version="MD5 part of SSLeay 0.8.1 19-Jul-1997";
/* Implemented from RFC1321 The MD5 Message-Digest Algorithm
*/
@ -90,7 +92,7 @@ MD5_CTX *c;
void MD5_Update(c, data, len)
MD5_CTX *c;
register unsigned char *data;
register const unsigned char *data;
unsigned long len;
{
register ULONG *p;

View File

@ -1,5 +1,5 @@
#ifndef LINT
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/prandom.c,v 1.10 2001/02/12 23:13:46 marka Exp $";
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/prandom.c,v 1.12 2001/07/26 01:20:09 marka Exp $";
#endif
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@ -119,9 +119,9 @@ static int unix_cmd(dst_work *work);
static int digest_file(dst_work *work);
static void force_hash(dst_work *work, prand_hash *hash);
static int do_hash(dst_work *work, prand_hash *hash, u_char *input,
static int do_hash(dst_work *work, prand_hash *hash, const u_char *input,
int size);
static int my_digest(dst_work *tmp, u_char *input, int size);
static int my_digest(dst_work *tmp, const u_char *input, int size);
static prand_hash *get_hmac_key(int step, int block);
static int own_random(dst_work *work);
@ -257,11 +257,10 @@ do_ls(dst_work *work)
else if (i==1) /* if starting a new round cut what we accept */
d_round += (tv.tv_sec - d_round)/2;
if (buf.st_atime < d_round)
if (buf.st_atime < (time_t)d_round)
return (0);
EREPORT(("do_ls i %d filled %4d in_temp %4d\n",
i-1, work->filled, work->in_temp));
EREPORT(("do_ls i %d filled %4d\n", i-1, work->filled));
memcpy(tmp_buff, &buf, sizeof(buf));
tb_i += sizeof(buf);
@ -322,8 +321,7 @@ unix_cmd(dst_work *work)
if (cmds[cmd_index] == NULL)
cmd_index = 0;
EREPORT(("unix_cmd() i %d filled %4d in_temp %4d\n",
cmd_index, work->filled, work->in_temp));
EREPORT(("unix_cmd() i %d filled %4d\n", cmd_index, work->filled));
pipe = popen(cmds[cmd_index++], "r"); /* execute the command */
while ((n = fread(buffer, sizeof(char), sizeof(buffer), pipe)) > 0) {
@ -334,7 +332,7 @@ unix_cmd(dst_work *work)
cnt += do_time(work);
}
while ((n = fread(buffer, sizeof(char), sizeof(buffer), pipe)) > 0)
NULL; /* drain the pipe */
(void)NULL; /* drain the pipe */
pclose(pipe);
return (cnt); /* read how many bytes where read in */
}
@ -377,7 +375,7 @@ digest_file(dst_work *work)
}
if (access(name, R_OK) || stat(name, &st))
return (0); /* no such file or not allowed to read it */
if (strncmp(name, "/proc/", 6) && st.st_mtime < f_round)
if (strncmp(name, "/proc/", 6) && st.st_mtime < (time_t)f_round)
return(0); /* file has not changed recently enough */
if (dst_sign_data(SIG_MODE_INIT, work->file_digest, &ctx,
NULL, 0, NULL, 0)) {
@ -401,7 +399,7 @@ digest_file(dst_work *work)
}
else if (i > 0)
my_digest(work, buf, i);
my_digest(work, (u_char *)name, strlen(name));
my_digest(work, (const u_char *)name, strlen(name));
return (no + strlen(name));
}
@ -439,9 +437,10 @@ force_hash(dst_work *work, prand_hash *hash)
*
*/
static int
do_hash(dst_work *work, prand_hash *hash, u_char *input, int size)
do_hash(dst_work *work, prand_hash *hash, const u_char *input, int size)
{
u_char *tmp = input, *tp;
const u_char *tmp = input;
u_char *save = NULL, *tp;
int i, cnt = size, n, needed, avail, dig, tmp_size = 0;
if (cnt <= 0 || input == NULL)
@ -449,7 +448,7 @@ do_hash(dst_work *work, prand_hash *hash, u_char *input, int size)
if (hash->step > 1) { /* if using subset of input data */
tmp_size = size / hash->step + 2;
tp = tmp = malloc(tmp_size);
tmp = tp = save = malloc(tmp_size);
for (cnt = 0, i = hash->curr; i < size; i += hash->step, cnt++)
*(tp++) = input[i];
/* calcutate the starting point in the next input set */
@ -466,13 +465,13 @@ do_hash(dst_work *work, prand_hash *hash, u_char *input, int size)
if (hash->digested >= hash->block)
force_hash(work, hash);
if (work->needed < work->filled) {
if (tmp != input)
SAFE_FREE2(tmp, tmp_size);
if (tmp_size > 0)
SAFE_FREE2(save, tmp_size);
return (1);
}
}
if (tmp_size > 0)
SAFE_FREE2(tmp, tmp_size);
SAFE_FREE2(save, tmp_size);
return (0);
}
@ -482,7 +481,7 @@ do_hash(dst_work *work, prand_hash *hash, u_char *input, int size)
* if work-block needs more data, keep filling with the rest of the input.
*/
static int
my_digest(dst_work *work, u_char *input, int size)
my_digest(dst_work *work, const u_char *input, int size)
{
int i, full = 0;
@ -603,8 +602,8 @@ own_random(dst_work *work)
* proceed while needed
*/
while (work->filled < work->needed) {
EREPORT(("own_random r %08x b %6d t %6d f %6d\n",
ran_val, bytes, work->in_temp, work->filled));
EREPORT(("own_random r %08x b %6d f %6d\n",
ran_val, bytes, work->filled));
/* pick a random number in the range of 0..7 based on that random number
* perform some operations that yield random data
*/
@ -840,8 +839,10 @@ dst_s_semi_random(u_char *output, int size)
i = dst_sign_data(SIG_MODE_ALL, my_key, NULL,
(u_char *) counter, hb_size,
semi_old, sizeof(semi_old));
#ifdef REPORT_ERRORS
if (i != hb_size)
EREPORT(("HMAC SIGNATURE FAILURE %d\n", i));
#endif
cnt++;
if (size - out < i) /* Not all data is needed */
semi_loc = i = size - out;

View File

@ -1,5 +1,5 @@
#ifdef RSAREF
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/rsaref_link.c,v 1.9 2001/04/05 22:00:04 bwelling Exp $";
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/rsaref_link.c,v 1.10 2001/05/29 05:48:15 marka Exp $";
/*
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
@ -740,6 +740,19 @@ dst_rsaref_init_random_struct(R_RANDOM_STRUCT * randomstruct)
#else
#include "port_before.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <sys/param.h>
#include <sys/time.h>
#include <netinet/in.h>
#include "dst_internal.h"
#include "port_after.h"
int /* rsaref is not available */
dst_rsaref_init()
{

View File

@ -1,4 +1,4 @@
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/support.c,v 1.9.2.1 2001/06/06 21:45:17 marka Exp $";
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/support.c,v 1.11 2001/05/29 05:48:16 marka Exp $";
/*
@ -241,7 +241,7 @@ dst_s_dns_key_id(const u_char *dns_key_rdata, const int rdata_len)
/* compute id */
if (dns_key_rdata[3] == KEY_RSA) /* Algorithm RSA */
return dst_s_get_int16((u_char *)
return dst_s_get_int16((const u_char *)
&dns_key_rdata[rdata_len - 3]);
else if (dns_key_rdata[3] == KEY_HMAC_MD5)
/* compatibility */
@ -393,7 +393,7 @@ dst_s_build_filename(char *filename, const char *name, u_int16_t id,
return (-1);
my_id = id;
sprintf(filename, "K%s+%03d+%05d.%s", name, alg, my_id,
(char *) suffix);
(const char *) suffix);
if (strrchr(filename, '/'))
return (-1);
if (strrchr(filename, '\\'))
@ -420,7 +420,7 @@ dst_s_fopen(const char *filename, const char *mode, int perm)
{
FILE *fp;
char pathname[PATH_MAX];
int plen = sizeof(pathname);
size_t plen = sizeof(pathname);
if (*dst_path != '\0') {
strcpy(pathname, dst_path);
@ -444,6 +444,8 @@ void
dst_s_dump(const int mode, const u_char *data, const int size,
const char *msg)
{
UNUSED(data);
if (size > 0) {
#ifdef LONG_TEST
static u_char scratch[1000];

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