Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Nov 2000 21:40:41 +0100
From:      Poul-Henning Kamp <phk@freebsd.org>
To:        current@freebsd.org, arch@freebsd.org
Subject:   RFC: /dev/console -> /var/log/messages idea/patch
Message-ID:  <1050.974925641@critter>

next in thread | raw e-mail | index | archive | help

The attached patch is a "proof-of-concept" on which I would like
to get some comments:

It bugs me big time that the output from /etc/rc and all other output
to /dev/console is volatile and lost once it scrolls of your console.

It particular bugs me for systems which are configured with a modem
on a serial port as console, if something choked badly in /etc/rc
I will never know.

(Don't tell me to use a SilentWriter or DecWriter as console, OK ?
Been There, Done That, Got The Piles Of Paper To Prove It. :-)

Ideally our console would be much more functional, but that is a project
which would fall sideways off my todo list if I tried to balance it there.

(If anybody is looking for a medium complex kernel task, a new console
system is a place to look.  Enquire within).

So I though about it from a "how little can we get away with" and realized
that by simply grabbing a copy of everything written to /dev/console and
feeding it to syslogd would gain us a lot of mileage.

Now, there are several issues to understand here, so please read on before
you apply paint to this bikeshed:

By "/dev/console" output I mean just and only that.  Characters
which arrive by write(2)/writev(2) on a fd opened to "/dev/console".

Kernel printfs are not /dev/console output in this context.

Characters written directly to your console device ("/dev/ttyd0",
"/dev/ttyv0" or "/dev/cuaa0") are *not* /dev/console output either.

Input from /dev/console are not part of this.  You will not be able
to see the answers people give fsck.

The output do of course still also arrive on your console device.

Obviously, if syslogd were to write these messages back to /dev/console
bad things would happen.  Syslogd may need to gain a tabu there.

The formatting cannot be preserved.  If somebody were to:
	echo -n "You're screwed now ---> " > /dev/console
we would never see the message in syslogd if the code waited
for the final '\n' to arrive.  (I guess a timeout based solution
could be feasible, what do people think ?)

In this patch I have deliberatly output a '"' in front of all
messages, this is merely for debugging right now.

The patch probably has all sorts of issues, style, locking, you name
it.  It is only intended as a proof-of-concept patch.

Sample output from /var/log/messages attached below.

Comments, volounteers, ideas most welcome...

Poul-Henning

Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "swapon: adding /dev/ad1s1b as swap device
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "swapon: adding /dev/ad0s1b as swap device
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Automatic boot in progress...
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad0s1a: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad0s1a: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 134807 free 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(823 frags, 16748 blocks, 0.4% fragmentation)
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad1s1e: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad1s1e: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 184706 free 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(138 frags, 23071 blocks, 0.1% fragmentation)
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad1s1f: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad1s1f: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 1775231 free 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(13343 frags, 220236 blocks, 0.7% fragmentation)
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad0s1e: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ad0s1e: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 2032838 free 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(14 frags, 254103 blocks, 0.0% fragmentation)
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ccd0c: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "FILESYSTEM CLEAN; SKIPPING CHECKS
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/dev/ccd0c: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "clean, 3464429 free 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "(3245 frags, 865296 blocks, 0.1% fragmentation)
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Can't use /entropy as an entropy file, trying other sources
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "cat: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "malloc.conf
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ": 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "No such file or directory
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Doing initial network setup:
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " hostname
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "	inet 212.242.40.133 netmask 0xfffffff0 broadcast 212.242.40.143
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "	ether 00:90:27:2c:60:72 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "	media: autoselect (100baseTX <full-duplex>) status: active
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "	supported media: autoselect 100baseTX <full-duplex> 100baseTX 10baseT/UTP <full-duplex> 10baseT/UTP
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "	inet 127.0.0.1 netmask 0xff000000 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "add net default: gateway 212.242.40.129
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Additional routing options:
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " tcp extensions=NO
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " TCP keepalive=YES
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "routing daemons:
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "additional daemons:
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " syslogd
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "rm: 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "/var/run/dev.db
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: ": 
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "No such file or directory
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: "Doing additional network setup:
Nov 22 21:16:38 <console.info> syv /boot/kernel/kernel: " portmap
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "Starting final network daemons:
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib /usr/local/lib
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "setting a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "starting standard daemons:
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: " inetd
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: " cron
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: " sendmail
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: " sshd
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:39 <console.info> syv /boot/kernel/kernel: "Recovering vi editor sessions
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "Initial rc.i386 initialization:
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "rc.i386 configuring syscons:
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: " blank_time
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "additional ABI support:
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "Local package initialization:
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ".
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: "Additional TCP options:
Nov 22 21:16:40 <console.info> syv /boot/kernel/kernel: ".









Index: sys/syslog.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/syslog.h,v
retrieving revision 1.19
diff -u -r1.19 syslog.h
--- sys/syslog.h	1999/12/29 04:24:48	1.19
+++ sys/syslog.h	2000/11/22 20:02:26
@@ -107,6 +107,7 @@
 #define	LOG_FTP		(11<<3)	/* ftp daemon */
 #define	LOG_NTP		(12<<3)	/* NTP subsystem */
 #define	LOG_SECURITY	(13<<3) /* security subsystems (firewalling, etc.) */
+#define	LOG_CONSOLE	(14<<3) /* /dev/console output */
 
 	/* other codes through 15 reserved for system use */
 #define	LOG_LOCAL0	(16<<3)	/* reserved for local use */
@@ -127,6 +128,7 @@
 CODE facilitynames[] = {
 	{ "auth",	LOG_AUTH,	},
 	{ "authpriv",	LOG_AUTHPRIV,	},
+	{ "console", 	LOG_CONSOLE,	},
 	{ "cron", 	LOG_CRON,	},
 	{ "daemon",	LOG_DAEMON,	},
 	{ "ftp",	LOG_FTP,	},
Index: kern/subr_prf.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/subr_prf.c,v
retrieving revision 1.64
diff -u -r1.64 subr_prf.c
--- kern/subr_prf.c	2000/10/02 07:13:10	1.64
+++ kern/subr_prf.c	2000/11/22 20:14:50
@@ -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
@@ -223,6 +224,52 @@
 	logwakeup();
 	return retval;
 }
+
+#define CONSCHUNK 4096
+static char consbuffer[CONSCHUNK];
+
+void
+log_console(struct uio *uio)
+{
+	int s, c, i, error, iovlen, nlf = 0;
+	struct uio muio;
+	struct iovec *miov = NULL;
+
+	muio = *uio;
+	iovlen = uio->uio_iovcnt * sizeof (struct iovec);
+	MALLOC(miov, struct iovec *, iovlen, M_TEMP, M_WAITOK);
+	bcopy((caddr_t)muio.uio_iov, (caddr_t)miov, iovlen);
+	muio.uio_iov = miov;
+	uio = &muio;
+
+	s = splhigh();
+	error = 0;
+	while (error == 0 && uio->uio_resid > 0) {
+		c = imin(uio->uio_resid, CONSCHUNK);
+		error = uiomove(consbuffer, c, uio);
+		if (!error) {
+			for (i = 0; i < c; i++) {
+				if (!nlf) {
+					logpri(LOG_INFO | LOG_CONSOLE);
+					msglogchar('"', 0);
+					nlf = 1;
+				}
+				msglogchar(consbuffer[i], 0);
+				if (consbuffer[i] == '\n') {
+					nlf = 0;
+					logwakeup();
+				}
+			}
+		}
+	}
+	if (nlf)
+		msglogchar('\n', 0);
+	logwakeup();
+	splx(s);
+	FREE(miov, M_TEMP);
+	return;
+}
+
 
 static void
 logpri(level)
Index: kern/tty_cons.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/tty_cons.c,v
retrieving revision 1.84
diff -u -r1.84 tty_cons.c
--- kern/tty_cons.c	2000/10/29 16:06:34	1.84
+++ kern/tty_cons.c	2000/11/22 20:20:20
@@ -352,6 +352,7 @@
 		dev = constty->t_dev;
 	else
 		dev = cn_tab->cn_dev;
+	log_console(uio);
 	return ((*devsw(dev)->d_write)(dev, uio, flag));
 }
 
--
Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
phk@FreeBSD.ORG         | TCP/IP since RFC 956
FreeBSD committer       | BSD since 4.3-tahoe
Never attribute to malice what can adequately be explained by incompetence.


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1050.974925641>