diff options
Diffstat (limited to 'usr.sbin/named/ns_main.c')
-rw-r--r-- | usr.sbin/named/ns_main.c | 151 |
1 files changed, 64 insertions, 87 deletions
diff --git a/usr.sbin/named/ns_main.c b/usr.sbin/named/ns_main.c index 6a960a1..13576d7 100644 --- a/usr.sbin/named/ns_main.c +++ b/usr.sbin/named/ns_main.c @@ -1,6 +1,6 @@ #if !defined(lint) && !defined(SABER) static char sccsid[] = "@(#)ns_main.c 4.55 (Berkeley) 7/1/91"; -static char rcsid[] = "$Id: ns_main.c,v 1.4 1995/10/23 11:11:47 peter Exp $"; +static char rcsid[] = "$Id: ns_main.c,v 1.5 1996/01/01 08:44:53 peter Exp $"; #endif /* not lint */ /* @@ -62,12 +62,12 @@ static char rcsid[] = "$Id: ns_main.c,v 1.4 1995/10/23 11:11:47 peter Exp $"; char copyright[] = "@(#) Copyright (c) 1986, 1989, 1990 The Regents of the University of California.\n\ portions Copyright (c) 1993 Digital Equipment Corporation\n\ - portions Copyright (c) 1993 Berkeley Network Software Consortium\n\ + portions Copyright (c) 1995 Internet Software Consortium\n\ All rights reserved.\n"; #endif /* not lint */ /* - * Internet Name server (see rfc883 & others). + * Internet Name server (see RCF1035 & others). */ #include <sys/param.h> @@ -393,19 +393,14 @@ main(argc, argv, envp) /* * named would be terminated if one of these is sent and no handler. */ - (void) signal(SIGINT, setdumpflg); - (void) signal(SIGQUIT, setchkptflg); - (void) signal(SIGIOT, setstatsflg); -#if defined(SIGUSR1) && defined(SIGUSR2) - (void) signal(SIGUSR1, setIncrDbgFlg); - (void) signal(SIGUSR2, setNoDbgFlg); -#else /* SIGUSR1&&SIGUSR2 */ - (void) signal(SIGEMT, setIncrDbgFlg); - (void) signal(SIGFPE, setNoDbgFlg); -#endif /* SIGUSR1&&SIGUSR2 */ + setsignal(SIGINT, -1, setdumpflg); + setsignal(SIGQUIT, -1, setchkptflg); + setsignal(SIGIOT, -1, setstatsflg); + setsignal(SIGUSR1, -1, setIncrDbgFlg); + setsignal(SIGUSR2, -1, setNoDbgFlg); #if defined(SIGWINCH) && defined(QRYLOG) - (void) signal(SIGWINCH, setQrylogFlg); + setsignal(SIGWINCH, -1, setQrylogFlg); #endif /* @@ -432,50 +427,29 @@ main(argc, argv, envp) time(&boottime); resettime = boottime; - (void) signal(SIGHUP, onhup); + setsignal(SIGALRM, SIGCHLD, maint_alarm); + setsignal(SIGCHLD, SIGALRM, reapchild); + setsignal(SIGPIPE, -1, (SIG_FN (*)())SIG_IGN); + setsignal(SIGHUP, -1, onhup); + #if defined(SIGXFSZ) - (void) signal(SIGXFSZ, onhup); /* wierd DEC Hesiodism, harmless */ + /* Wierd DEC Hesiodism, harmless. */ + setsignal(SIGXFSZ, -1, onhup); #endif -#if defined(POSIX_SIGNALS) - bzero((char *)&sact, sizeof(sact)); - sact.sa_handler = maint_alarm; - sigemptyset(&sact.sa_mask); - sigaddset(&sact.sa_mask, SIGCHLD); - (void) sigaction(SIGALRM, &sact, (struct sigaction *)NULL); - - sact.sa_handler = endxfer; - sigemptyset(&sact.sa_mask); - sigaddset(&sact.sa_mask, SIGALRM); - (void) sigaction(SIGCHLD, &sact, (struct sigaction *)NULL); -#else -#if defined(SYSV) - (void) signal(SIGCLD, (SIG_FN (*)()) endxfer); - (void) signal(SIGALRM, maint_alarm); -#else - bzero((char *)&vec, sizeof(vec)); - vec.sv_handler = maint_alarm; - vec.sv_mask = sigmask(SIGCHLD); - (void) sigvec(SIGALRM, &vec, (struct sigvec *)NULL); - - vec.sv_handler = endxfer; - vec.sv_mask = sigmask(SIGALRM); - (void) sigvec(SIGCHLD, &vec, (struct sigvec *)NULL); -#endif /* SYSV */ -#endif /* POSIX_SIGNALS */ - (void) signal(SIGPIPE, SIG_IGN); + #ifdef SIGSYS - (void) signal(SIGSYS, sigprof); + setsignal(SIGSYS, -1, sigprof); #endif /* SIGSYS */ #ifdef ALLOW_UPDATES /* Catch SIGTERM so we can dump the database upon shutdown if it has changed since it was last dumped/booted */ - (void) signal(SIGTERM, onintr); + setsignal(SIGTERM, -1, onintr); #endif #ifdef XSTATS /* Catch SIGTERM so we can write stats before exiting. */ - (void) signal(SIGTERM, onintr); + setsignal(SIGTERM, -1, onintr); #endif dprintf(1, (ddt, "database initialized\n")); @@ -621,6 +595,12 @@ main(argc, argv, envp) needStatsDump = 0; ns_stats(); } + if (needendxfer) { + holdsigchld(); + needendxfer = 0; /* should be safe even if not held */ + endxfer(); /* releases SIGCHLD */ + } + releasesigchld(); if (needzoneload) { needzoneload = 0; loadxfer(); @@ -849,11 +829,11 @@ main(argc, argv, envp) } if ((sp->s_bufp - (u_char *)&sp->s_tempsize) == INT16SZ) { - sp->s_size = htons(sp->s_tempsize); + sp->s_size = ntohs(sp->s_tempsize); if (sp->s_bufsize == 0) { - if ( (sp->s_buf = (u_char *) + if (!(sp->s_buf = (u_char *) malloc(rbufsize)) - == NULL) { + ) { sp->s_buf = buf; sp->s_size = sizeof(buf); } else { @@ -957,7 +937,7 @@ getnetconf() exit(1); } ntp = NULL; -#if defined(AF_LINK) && !defined(RISCOS_BSD) +#if defined(AF_LINK) && !defined(RISCOS_BSD) && !defined(M_UNIX) #define my_max(a, b) (a > b ? a : b) #define my_size(p) my_max((p).sa_len, sizeof(p)) #else @@ -1039,6 +1019,8 @@ getnetconf() */ if (ntp == NULL) { ntp = (struct netinfo *)malloc(sizeof(struct netinfo)); + if (!ntp) + panic(errno, "malloc(netinfo)"); } ntp->my_addr = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr; @@ -1113,10 +1095,8 @@ getnetconf() * wildcard address. */ if (first) { - if (!(dqp = (struct qdatagram *)calloc(1, sizeof(*dqp)))) { - syslog(LOG_ERR, "getnetconf: malloc: %m"); - exit(12); - } + if (!(dqp = (struct qdatagram *)calloc(1, sizeof(*dqp)))) + panic(errno, "malloc(qdatagram)"); dqp->dq_next = datagramq; datagramq = dqp; dqp->dq_addr.s_addr = INADDR_ANY; @@ -1135,11 +1115,9 @@ getnetconf() if (findnetinfo(ntp->my_addr)) continue; ontp = (struct netinfo *) - malloc(sizeof(struct netinfo)); - if (ontp == NULL) { - syslog(LOG_ERR, "getnetconf: malloc: %m"); - exit(12); - } + malloc(sizeof(struct netinfo)); + if (!ontp) + panic(errno, "malloc(netinfo)"); ontp->my_addr = ntp->my_addr; ontp->mask = nm; ontp->addr = ontp->my_addr.s_addr & nm; @@ -1251,9 +1229,8 @@ static SIG_FN onhup() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGHUP, (SIG_FN (*)())onhup); -#endif /* SYSV */ + + resignal(SIGHUP, -1, onhup); needreload = 1; errno = save_errno; } @@ -1268,9 +1245,8 @@ static SIG_FN maint_alarm() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGALRM, (SIG_FN (*)())maint_alarm); -#endif /* SYSV */ + + resignal(SIGALRM, SIGCHLD, maint_alarm); needmaint = 1; errno = save_errno; } @@ -1284,7 +1260,11 @@ maint_alarm() static SIG_FN onintr() { + int save_errno = errno; + + resignal(SIGTERM, -1, onintr); needToExit = 1; + errno = save_errno; } #endif /* ALLOW_UPDATES */ @@ -1295,7 +1275,11 @@ onintr() static SIG_FN onintr() { - needToExit = 1; + int save_errno = errno; + + resignal(SIGTERM, -1, onintr); + needToExit = 1; /* XXX variable reuse */ + errno = save_errno; } #endif /* XSTATS */ @@ -1309,9 +1293,8 @@ static SIG_FN setdumpflg() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGINT, (SIG_FN (*)())setdumpflg); -#endif /* SYSV */ + + resignal(SIGINT, -1, setdumpflg); needToDoadump = 1; errno = save_errno; } @@ -1368,9 +1351,8 @@ static SIG_FN setIncrDbgFlg() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGUSR1, (SIG_FN (*)())setIncrDbgFlg); -#endif /* SYSV */ + + resignal(SIGUSR1, -1, setIncrDbgFlg); #ifdef DEBUG if (debug == 0) { debug++; @@ -1392,9 +1374,8 @@ static SIG_FN setNoDbgFlg() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGUSR2, (SIG_FN (*)())setNoDbgFlg); -#endif /* SYSV */ + + resignal(SIGUSR2, -1, setNoDbgFlg); setdebug(0); errno = save_errno; } @@ -1407,9 +1388,8 @@ static SIG_FN setQrylogFlg() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGWINCH, (SIG_FN (*)())setQrylogFlg); -#endif /* SYSV */ + + resignal(SIGWINCH, -1, setQrylogFlg); qrylog = !qrylog; syslog(LOG_NOTICE, "query log %s\n", qrylog ?"on" :"off"); errno = save_errno; @@ -1423,9 +1403,8 @@ static SIG_FN setstatsflg() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGIOT, (SIG_FN (*)())setstatsflg); -#endif /* SYSV */ + + resignal(SIGIOT, -1, setstatsflg); needStatsDump = 1; errno = save_errno; } @@ -1434,9 +1413,8 @@ static SIG_FN setchkptflg() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGQUIT, (SIG_FN (*)())setchkptflg); -#endif /* SYSV */ + + resignal(SIGQUIT, -1, setchkptflg); needToChkpt = 1; errno = save_errno; } @@ -1453,9 +1431,8 @@ static SIG_FN sigprof() { int save_errno = errno; -#if defined(SYSV) - (void)signal(SIGSYS, (SIG_FN (*)())sigprof); -#endif /* SYSV */ + + resignal(SIGSYS, -1, sigprof); dprintf(1, (ddt, "sigprof()\n")); if (fork() == 0) { |