summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>2001-01-16 12:26:22 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>2001-01-16 12:26:22 +0000
commit576bf6563035ef7c2d49c98919b3a453ec47a5b7 (patch)
tree328521471be89f3c98fdeccee7a66a0e66ae3885
parent7a18e907dcbc5943dcd9edbce55ef888ab8c5317 (diff)
Notes
-rw-r--r--etc/syslog.conf2
-rw-r--r--sys/kern/subr_log.c63
-rw-r--r--sys/kern/subr_prf.c207
-rw-r--r--sys/kern/tty_cons.c3
-rw-r--r--sys/sys/msgbuf.h1
-rw-r--r--sys/sys/systm.h1
-rw-r--r--sys/ufs/ufs/ufs_disksubr.c1
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;