diff options
| author | Poul-Henning Kamp <phk@FreeBSD.org> | 2001-01-16 12:26:22 +0000 |
|---|---|---|
| committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2001-01-16 12:26:22 +0000 |
| commit | 576bf6563035ef7c2d49c98919b3a453ec47a5b7 (patch) | |
| tree | 328521471be89f3c98fdeccee7a66a0e66ae3885 | |
| parent | 7a18e907dcbc5943dcd9edbce55ef888ab8c5317 (diff) | |
Notes
| -rw-r--r-- | etc/syslog.conf | 2 | ||||
| -rw-r--r-- | sys/kern/subr_log.c | 63 | ||||
| -rw-r--r-- | sys/kern/subr_prf.c | 207 | ||||
| -rw-r--r-- | sys/kern/tty_cons.c | 3 | ||||
| -rw-r--r-- | sys/sys/msgbuf.h | 1 | ||||
| -rw-r--r-- | sys/sys/systm.h | 1 | ||||
| -rw-r--r-- | sys/ufs/ufs/ufs_disksubr.c | 1 |
7 files changed, 169 insertions, 109 deletions
diff --git a/etc/syslog.conf b/etc/syslog.conf index 54a2876b455d..823fff5a5f06 100644 --- a/etc/syslog.conf +++ b/etc/syslog.conf @@ -12,6 +12,8 @@ cron.* /var/log/cron *.notice;news.err root *.alert root *.emerg * +# uncomment this to log all writes to /dev/console to /var/log/console +#console.info /var/log/console # uncomment this to enable logging of all log messages to /var/log/all.log #*.* /var/log/all.log # uncomment this to enable logging to a remote loghost named loghost diff --git a/sys/kern/subr_log.c b/sys/kern/subr_log.c index a6f03d0fd41b..ad65eefd8638 100644 --- a/sys/kern/subr_log.c +++ b/sys/kern/subr_log.c @@ -50,6 +50,7 @@ #include <sys/kernel.h> #include <sys/poll.h> #include <sys/filedesc.h> +#include <sys/sysctl.h> #define LOG_RDPRI (PZERO + 1) @@ -62,6 +63,8 @@ static d_read_t logread; static d_ioctl_t logioctl; static d_poll_t logpoll; +static void logtimeout(void *arg); + #define CDEV_MAJOR 7 static struct cdevsw log_cdevsw = { /* open */ logopen, @@ -84,32 +87,36 @@ static struct logsoftc { int sc_state; /* see above for possibilities */ struct selinfo sc_selp; /* process waiting on select call */ struct sigio *sc_sigio; /* information for async I/O */ + struct callout sc_callout; /* callout to wakeup syslog */ } logsoftc; int log_open; /* also used in log() */ +/* Times per second to check for a pending syslog wakeup. */ +static int log_wakeups_per_second = 5; +SYSCTL_INT(_kern, OID_AUTO, log_wakeups_per_second, CTLFLAG_RW, + &log_wakeups_per_second, 0, ""); + /*ARGSUSED*/ static int -logopen(dev, flags, mode, p) - dev_t dev; - int flags, mode; - struct proc *p; +logopen(dev_t dev, int flags, int mode, struct proc *p) { if (log_open) return (EBUSY); log_open = 1; + callout_init(&logsoftc.sc_callout); fsetown(p->p_pid, &logsoftc.sc_sigio); /* signal process only */ + callout_reset(&logsoftc.sc_callout, hz / log_wakeups_per_second, + logtimeout, NULL); return (0); } /*ARGSUSED*/ static int -logclose(dev, flag, mode, p) - dev_t dev; - int flag, mode; - struct proc *p; +logclose(dev_t dev, int flag, int mode, struct proc *p) { + callout_stop(&logsoftc.sc_callout); log_open = 0; logsoftc.sc_state = 0; funsetown(logsoftc.sc_sigio); @@ -118,14 +125,11 @@ logclose(dev, flag, mode, p) /*ARGSUSED*/ static int -logread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +logread(dev_t dev, struct uio *uio, int flag) { - register struct msgbuf *mbp = msgbufp; - register long l; - register int s; + struct msgbuf *mbp = msgbufp; + long l; + int s; int error = 0; s = splhigh(); @@ -164,10 +168,7 @@ logread(dev, uio, flag) /*ARGSUSED*/ static int -logpoll(dev, events, p) - dev_t dev; - int events; - struct proc *p; +logpoll(dev_t dev, int events, struct proc *p) { int s; int revents = 0; @@ -184,9 +185,13 @@ logpoll(dev, events, p) return (revents); } -void -logwakeup() +static void +logtimeout(void *arg) { + + if (msgbuftrigger == 0) + return; + msgbuftrigger = 0; if (!log_open) return; selwakeup(&logsoftc.sc_selp); @@ -196,16 +201,13 @@ logwakeup() wakeup((caddr_t)msgbufp); logsoftc.sc_state &= ~LOG_RDWAIT; } + callout_reset(&logsoftc.sc_callout, hz / log_wakeups_per_second, + logtimeout, NULL); } /*ARGSUSED*/ static int -logioctl(dev, com, data, flag, p) - dev_t dev; - u_long com; - caddr_t data; - int flag; - struct proc *p; +logioctl(dev_t dev, u_long com, caddr_t data, int flag, struct proc *p) { long l; int s; @@ -254,13 +256,10 @@ logioctl(dev, com, data, flag, p) return (0); } - -static void log_drvinit __P((void *unused)); - static void -log_drvinit(unused) - void *unused; +log_drvinit(void *unused) { + make_dev(&log_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "klog"); } diff --git a/sys/kern/subr_prf.c b/sys/kern/subr_prf.c index e8d523e393d8..c554fe98b736 100644 --- a/sys/kern/subr_prf.c +++ b/sys/kern/subr_prf.c @@ -49,6 +49,7 @@ #include <sys/tprintf.h> #include <sys/syslog.h> #include <sys/cons.h> +#include <sys/uio.h> /* * Note that stdarg.h and the ANSI style va_start macro is used for both @@ -65,6 +66,7 @@ struct putchar_arg { int flags; + int pri; struct tty *tty; }; @@ -73,11 +75,13 @@ struct snprintf_arg { size_t remain; }; +extern int log_open; + struct tty *constty; /* pointer to console "window" tty */ static void (*v_putc)(int) = cnputc; /* routine to putc on virtual console */ -static void logpri __P((int level)); -static void msglogchar(int c, void *dummyarg); +static void msglogchar(int c, int pri); +static void msgaddchar(int c, void *dummy); static void putchar __P((int ch, void *arg)); static char *ksprintn __P((char *nbuf, u_long num, int base, int *len)); static char *ksprintqn __P((char *nbuf, u_quad_t num, int base, int *len)); @@ -85,13 +89,13 @@ static void snprintf_func __P((int ch, void *arg)); static int consintr = 1; /* Ok to handle console interrupts? */ static int msgbufmapped; /* Set when safe to use msgbuf */ +int msgbuftrigger; /* * Warn that a system table is full. */ void -tablefull(tab) - const char *tab; +tablefull(const char *tab) { log(LOG_ERR, "%s: table is full\n", tab); @@ -110,7 +114,8 @@ uprintf(const char *fmt, ...) struct putchar_arg pca; int retval = 0; - if (p->p_flag & P_CONTROLT && p->p_session->s_ttyvp) { + if (p && p->p_flag & P_CONTROLT && + p->p_session->s_ttyvp) { va_start(ap, fmt); pca.tty = p->p_session->s_ttyp; pca.flags = TOTTY; @@ -155,7 +160,6 @@ tprintf(tpr_t tpr, const char *fmt, ...) struct putchar_arg pca; int retval; - logpri(LOG_INFO); if (sess && sess->s_ttyvp && ttycheckoutq(sess->s_ttyp, 0)) { flags |= TOTTY; tp = sess->s_ttyp; @@ -163,9 +167,10 @@ tprintf(tpr_t tpr, const char *fmt, ...) va_start(ap, fmt); pca.tty = tp; pca.flags = flags; + pca.pri = LOG_INFO; retval = kvprintf(fmt, putchar, &pca, 10, ap); va_end(ap); - logwakeup(); + msgbuftrigger = 1; return retval; } @@ -189,8 +194,6 @@ ttyprintf(struct tty *tp, const char *fmt, ...) return retval; } -extern int log_open; - /* * Log writes to the log buffer, and guarantees not to sleep (so can be * called by interrupt routines). If there is no process reading the @@ -199,72 +202,88 @@ extern int log_open; int log(int level, const char *fmt, ...) { - register int s; va_list ap; int retval; + struct putchar_arg pca; - s = splhigh(); - logpri(level); - va_start(ap, fmt); + pca.tty = NULL; + pca.pri = level; + pca.flags = log_open ? TOLOG : TOCONS; - retval = kvprintf(fmt, msglogchar, NULL, 10, ap); + va_start(ap, fmt); + retval = kvprintf(fmt, putchar, &pca, 10, ap); va_end(ap); - splx(s); - if (!log_open) { - struct putchar_arg pca; - va_start(ap, fmt); - pca.tty = NULL; - pca.flags = TOCONS; - retval += kvprintf(fmt, putchar, &pca, 10, ap); - va_end(ap); - } - logwakeup(); - return retval; -} - -static void -logpri(level) - int level; -{ - char nbuf[MAXNBUF]; - register char *p; - - msglogchar('<', NULL); - for (p = ksprintn(nbuf, (u_long)level, 10, NULL); *p;) - msglogchar(*p--, NULL); - msglogchar('>', NULL); + msgbuftrigger = 1; + return (retval); } int addlog(const char *fmt, ...) { - register int s; va_list ap; int retval; + struct putchar_arg pca; + + pca.tty = NULL; + pca.pri = -1; + pca.flags = log_open ? TOLOG : TOCONS; - s = splhigh(); va_start(ap, fmt); - retval = kvprintf(fmt, msglogchar, NULL, 10, ap); - splx(s); + retval = kvprintf(fmt, putchar, &pca, 10, ap); va_end(ap); - if (!log_open) { - struct putchar_arg pca; - va_start(ap, fmt); - pca.tty = NULL; - pca.flags = TOCONS; - retval += kvprintf(fmt, putchar, &pca, 10, ap); - va_end(ap); - } - logwakeup(); + + msgbuftrigger = 1; return (retval); } +#define CONSCHUNK 128 + +void +log_console(struct uio *uio) +{ + int c, i, error, iovlen, nl; + struct uio muio; + struct iovec *miov = NULL; + char *consbuffer; + int pri; + + pri = LOG_INFO | LOG_CONSOLE; + muio = *uio; + iovlen = uio->uio_iovcnt * sizeof (struct iovec); + MALLOC(miov, struct iovec *, iovlen, M_TEMP, M_WAITOK); + MALLOC(consbuffer, char *, CONSCHUNK, M_TEMP, M_WAITOK); + bcopy((caddr_t)muio.uio_iov, (caddr_t)miov, iovlen); + muio.uio_iov = miov; + uio = &muio; + + nl = 0; + while (uio->uio_resid > 0) { + c = imin(uio->uio_resid, CONSCHUNK); + error = uiomove(consbuffer, c, uio); + if (error != 0) + return; + for (i = 0; i < c; i++) { + msglogchar(consbuffer[i], pri); + if (consbuffer[i] == '\n') + nl = 1; + else + nl = 0; + } + } + if (!nl) + msglogchar('\n', pri); + msgbuftrigger = 1; + FREE(miov, M_TEMP); + FREE(consbuffer, M_TEMP); + return; +} + int printf(const char *fmt, ...) { va_list ap; - register int savintr; + int savintr; struct putchar_arg pca; int retval; @@ -273,10 +292,11 @@ printf(const char *fmt, ...) va_start(ap, fmt); pca.tty = NULL; pca.flags = TOCONS | TOLOG; + pca.pri = -1; retval = kvprintf(fmt, putchar, &pca, 10, ap); va_end(ap); if (!panicstr) - logwakeup(); + msgbuftrigger = 1; consintr = savintr; /* reenable interrupts */ return retval; } @@ -284,7 +304,7 @@ printf(const char *fmt, ...) int vprintf(const char *fmt, va_list ap) { - register int savintr; + int savintr; struct putchar_arg pca; int retval; @@ -292,9 +312,10 @@ vprintf(const char *fmt, va_list ap) consintr = 0; pca.tty = NULL; pca.flags = TOCONS | TOLOG; + pca.pri = -1; retval = kvprintf(fmt, putchar, &pca, 10, ap); if (!panicstr) - logwakeup(); + msgbuftrigger = 1; consintr = savintr; /* reenable interrupts */ return retval; } @@ -320,7 +341,7 @@ putchar(int c, void *arg) (flags & TOCONS) && tp == constty) constty = NULL; if ((flags & TOLOG)) - msglogchar(c, NULL); + msglogchar(c, ap->pri); if ((flags & TOCONS) && constty == NULL && c != '\0') (*v_putc)(c); } @@ -406,10 +427,10 @@ snprintf_func(int ch, void *arg) static char * ksprintn(nbuf, ul, base, lenp) char *nbuf; - register u_long ul; - register int base, *lenp; + u_long ul; + int base, *lenp; { - register char *p; + char *p; p = nbuf; *p = '\0'; @@ -424,10 +445,10 @@ ksprintn(nbuf, ul, base, lenp) static char * ksprintqn(nbuf, uq, base, lenp) char *nbuf; - register u_quad_t uq; - register int base, *lenp; + u_quad_t uq; + int base, *lenp; { - register char *p; + char *p; p = nbuf; *p = '\0'; @@ -664,6 +685,7 @@ reswitch: switch (ch = (u_char)*fmt++) { base = 10; goto nosign; case 'x': + case 'X': if (qflag) uq = va_arg(ap, u_quad_t); else if (lflag) @@ -740,23 +762,58 @@ number: } /* - * Put character in log buffer. + * Put character in log buffer with a particular priority. */ static void -msglogchar(int c, void *dummyarg) +msglogchar(int c, int pri) { - struct msgbuf *mbp; + static int lastpri = -1; + static int dangling; + char nbuf[MAXNBUF]; + char *p; - if (c != '\0' && c != '\r' && c != 0177 && msgbufmapped) { - mbp = msgbufp; - mbp->msg_ptr[mbp->msg_bufx++] = c; - if (mbp->msg_bufx >= mbp->msg_size) - mbp->msg_bufx = 0; - /* If the buffer is full, keep the most recent data. */ - if (mbp->msg_bufr == mbp->msg_bufx) { - if (++mbp->msg_bufr >= mbp->msg_size) - mbp->msg_bufr = 0; + if (!msgbufmapped) + return; + if (c == '\0' || c == '\r') + return; + if (pri != -1 && pri != lastpri) { + if (dangling) { + msgaddchar('\n', NULL); + dangling = 0; } + msgaddchar('<', NULL); + for (p = ksprintn(nbuf, (u_long)pri, 10, NULL); *p;) + msgaddchar(*p--, NULL); + msgaddchar('>', NULL); + lastpri = pri; + } + msgaddchar(c, NULL); + if (c == '\n') { + dangling = 0; + lastpri = -1; + } else { + dangling = 1; + } +} + +/* + * Put char in log buffer + */ +static void +msgaddchar(int c, void *dummy) +{ + struct msgbuf *mbp; + + if (!msgbufmapped) + return; + mbp = msgbufp; + mbp->msg_ptr[mbp->msg_bufx++] = c; + if (mbp->msg_bufx >= mbp->msg_size) + mbp->msg_bufx = 0; + /* If the buffer is full, keep the most recent data. */ + if (mbp->msg_bufr == mbp->msg_bufx) { + if (++mbp->msg_bufr >= mbp->msg_size) + mbp->msg_bufr = 0; } } @@ -767,7 +824,7 @@ msgbufcopy(struct msgbuf *oldp) pos = oldp->msg_bufr; while (pos != oldp->msg_bufx) { - msglogchar(oldp->msg_ptr[pos], NULL); + msglogchar(oldp->msg_ptr[pos], -1); if (++pos >= oldp->msg_size) pos = 0; } diff --git a/sys/kern/tty_cons.c b/sys/kern/tty_cons.c index f4e2bd45d467..784fecad98e2 100644 --- a/sys/kern/tty_cons.c +++ b/sys/kern/tty_cons.c @@ -44,9 +44,9 @@ #include <sys/conf.h> #include <sys/cons.h> #include <sys/kernel.h> +#include <sys/proc.h> #include <sys/reboot.h> #include <sys/sysctl.h> -#include <sys/proc.h> #include <sys/tty.h> #include <sys/uio.h> @@ -353,6 +353,7 @@ cnwrite(dev, uio, flag) dev = constty->t_dev; else dev = cn_tab->cn_dev; + log_console(uio); return ((*devsw(dev)->d_write)(dev, uio, flag)); } diff --git a/sys/sys/msgbuf.h b/sys/sys/msgbuf.h index fe833a967ded..a2cede71339a 100644 --- a/sys/sys/msgbuf.h +++ b/sys/sys/msgbuf.h @@ -48,6 +48,7 @@ struct msgbuf { #ifdef _KERNEL extern int msgbufmapped; +extern int msgbuftrigger; extern struct msgbuf *msgbufp; void msgbufinit __P((void *ptr, size_t size)); diff --git a/sys/sys/systm.h b/sys/sys/systm.h index b8d4b646e4cf..2b16f11f52d1 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -115,6 +115,7 @@ int kvprintf __P((char const *, void (*)(int, void*), void *, int, _BSD_VA_LIST_)) __printflike(1, 0); int log __P((int, const char *, ...)) __printflike(2, 3); void logwakeup __P((void)); +void log_console __P((struct uio *)); int printf __P((const char *, ...)) __printflike(1, 2); int snprintf __P((char *, size_t, const char *, ...)) __printflike(3, 4); int sprintf __P((char *buf, const char *, ...)) __printflike(2, 3); diff --git a/sys/ufs/ufs/ufs_disksubr.c b/sys/ufs/ufs/ufs_disksubr.c index 6042f328c5a0..571ddfc4a107 100644 --- a/sys/ufs/ufs/ufs_disksubr.c +++ b/sys/ufs/ufs/ufs_disksubr.c @@ -363,7 +363,6 @@ diskerr(bp, what, pri, blkdone, lp) int unit = dkunit(bp->b_dev); int slice = dkslice(bp->b_dev); int part = dkpart(bp->b_dev); - int (*pr) __P((const char *, ...)); char partname[2]; char *sname; daddr_t sn; |
