summaryrefslogtreecommitdiffstats
path: root/contrib/bind/bin/named/ns_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind/bin/named/ns_main.c')
-rw-r--r--contrib/bind/bin/named/ns_main.c153
1 files changed, 106 insertions, 47 deletions
diff --git a/contrib/bind/bin/named/ns_main.c b/contrib/bind/bin/named/ns_main.c
index 1d7bfe8..23cf249 100644
--- a/contrib/bind/bin/named/ns_main.c
+++ b/contrib/bind/bin/named/ns_main.c
@@ -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;
OpenPOWER on IntegriCloud