diff options
Diffstat (limited to 'contrib/bind/bin/named/ns_main.c')
-rw-r--r-- | contrib/bind/bin/named/ns_main.c | 153 |
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; |