diff options
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/syslogd/syslogd.c | 120 |
1 files changed, 69 insertions, 51 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c index 13b30e0..b75c590 100644 --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -39,7 +39,7 @@ static const char copyright[] = static char sccsid[] = "@(#)syslogd.c 8.3 (Berkeley) 4/4/94"; */ static const char rcsid[] = - "$Id: syslogd.c,v 1.10 1996/10/05 15:20:51 peter Exp $"; + "$Id: syslogd.c,v 1.12 1996/10/28 08:25:13 joerg Exp $"; #endif /* not lint */ /* @@ -71,7 +71,7 @@ static const char rcsid[] = #define DEFUPRI (LOG_USER|LOG_NOTICE) #define DEFSPRI (LOG_KERN|LOG_CRIT) #define TIMERINTVL 30 /* interval for checking flush, mark */ -#define TTYMSGTIME 1 /* timeout passed to ttymsg */ +#define TTYMSGTIME 1 /* timed out passed to ttymsg */ #include <sys/param.h> #include <sys/ioctl.h> @@ -213,6 +213,7 @@ char *ttymsg __P((struct iovec *, int, char *, int)); void usage __P((void)); void wallmsg __P((struct filed *, struct iovec *)); int waitdaemon __P((int, int, int)); +void timedout __P((int)); int main(argc, argv) @@ -635,6 +636,7 @@ fprintlog(f, flags, msg) struct iovec *v; int l; char line[MAXLINE + 1], repbuf[80], greetings[200]; + char *msgret; v = iov; if (f->f_type == F_WALL) { @@ -707,40 +709,35 @@ fprintlog(f, flags, msg) } /* FALLTHROUGH */ - case F_TTY: case F_FILE: dprintf(" %s\n", f->f_un.f_fname); - if (f->f_type != F_FILE) { - v->iov_base = "\r\n"; - v->iov_len = 2; - } else { - v->iov_base = "\n"; - v->iov_len = 1; - } - again: + v->iov_base = "\n"; + v->iov_len = 1; if (writev(f->f_file, iov, 6) < 0) { int e = errno; (void)close(f->f_file); - /* - * Check for errors on TTY's due to loss of tty - */ - if ((e == EIO || e == EBADF) && f->f_type != F_FILE) { - f->f_file = open(f->f_un.f_fname, - O_WRONLY|O_APPEND, 0); - if (f->f_file < 0) { - f->f_type = F_UNUSED; - logerror(f->f_un.f_fname); - } else - goto again; - } else { - f->f_type = F_UNUSED; - errno = e; - logerror(f->f_un.f_fname); - } + f->f_type = F_UNUSED; + errno = e; + logerror(f->f_un.f_fname); } else if (flags & SYNC_FILE) (void)fsync(f->f_file); break; + case F_TTY: + dprintf(" %s\n", f->f_un.f_fname); + v->iov_base = "\r\n"; + v->iov_len = 2; + + errno = 0; /* ttymsg() only sometimes returns an errno */ + if ((msgret = ttymsg(iov, 6, f->f_un.f_fname, 10))) { + int e = errno; + (void)close(f->f_file); + f->f_type = F_UNUSED; + errno = e; + logerror(msgret); + } + break; + case F_USERS: case F_WALL: dprintf("\n"); @@ -813,9 +810,9 @@ void reapchild(signo) int signo; { - union wait status; + int status; - while (wait3((int *)&status, WNOHANG, (struct rusage *)NULL) > 0) + while (wait3(&status, WNOHANG, (struct rusage *)NULL) > 0) ; } @@ -911,7 +908,7 @@ die(signo) } if (created_lsock) (void)unlink(LogName); - exit(0); + exit(1); } /* @@ -1227,39 +1224,40 @@ decode(name, codetab) return (-1); } -static char *exitmsg; - -void -timeout(sig) - int sig __unused; -{ - int left; - left = alarm(0); - signal(SIGALRM, SIG_DFL); - if (left == 0) - exitmsg = "timed out waiting for child"; - return; -} - +/* + * fork off and become a daemon, but wait for the child to come online + * before returing to the parent, or we get disk thrashing at boot etc. + * Set a timer so we don't hang forever if it wedges. + */ int waitdaemon(nochdir, noclose, maxwait) int nochdir, noclose, maxwait; { int fd; + int status; + pid_t pid, childpid; - switch (fork()) { + switch (childpid = fork()) { case -1: return (-1); case 0: break; default: - signal(SIGALRM, timeout); + signal(SIGALRM, timedout); alarm(maxwait); - pause(); - if (exitmsg) - err(1, exitmsg); - else - exit(0); + while ((pid = wait3(&status, 0, NULL)) != -1) { + if (WIFEXITED(status)) + errx(1, "child pid %d exited with return code %d", + pid, WEXITSTATUS(status)); + if (WIFSIGNALED(status)) + errx(1, "child pid %d exited on signal %d%s", + pid, WTERMSIG(status), + WCOREDUMP(status) ? " (core dumped)" : + ""); + if (pid == childpid) /* it's gone... */ + break; + } + exit(0); } if (setsid() == -1) @@ -1277,3 +1275,23 @@ waitdaemon(nochdir, noclose, maxwait) } return (getppid()); } + +/* + * We get a SIGALRM from the child when it's running and finished doing it's + * fsync()'s or O_SYNC writes for all the boot messages. + * + * We also get a signal from the kernel if the timer expires, so check to + * see what happened. + */ +void +timedout(sig) + int sig __unused; +{ + int left; + left = alarm(0); + signal(SIGALRM, SIG_DFL); + if (left == 0) + errx(1, "timed out waiting for child"); + else + exit(0); +} |