changeset 169:56034b162074

Implement dmesg.
author Rob Landley <rob@landley.net>
date Tue, 20 Nov 2007 01:06:29 -0600
parents 14fa82969ea3
children 58a97722d745
files toys/Config.in toys/dmesg.c toys/toylist.h
diffstat 3 files changed, 59 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/toys/Config.in	Mon Nov 19 07:07:50 2007 -0600
+++ b/toys/Config.in	Tue Nov 20 01:06:29 2007 -0600
@@ -68,6 +68,18 @@
 
 	  -k	Sets units back to 1024 bytes (the default without -P)
 
+config DMESG
+	bool "dmesg"
+	default y
+	help
+	  usage: dmesg [-n level] [-s bufsize] | -c
+
+	  Print or control the kernel ring buffer.
+
+	  -n	Set kernel logging level (1-9).
+	  -s	Size of buffer to read (in bytes), default 16384.
+	  -c	Clear the ring buffer after printing.
+
 config ECHO
 	bool "echo"
 	default y
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toys/dmesg.c	Tue Nov 20 01:06:29 2007 -0600
@@ -0,0 +1,40 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * dmesg.c - display/control kernel ring buffer.
+ *
+ * Copyright 2006 Rob Landley <rob@landley.net>
+ */
+
+#include "toys.h"
+#include <sys/klog.h>
+
+#define TT toy.dmesg
+
+int dmesg_main(void)
+{
+	// For -n just tell kernel to which messages to keep.
+	if (toys.optflags & 2) {
+		if (klogctl(8, NULL, TT.level))
+			error_exit("klogctl");
+	} else {
+		int size, i, last = '\n';
+		char *data;
+
+		// Figure out how much data we need, and fetch it.
+		size = TT.size;
+		if (size<2) size = 16384;
+		data = xmalloc(size);
+		size = klogctl(3 + (toys.optflags&1), data, size);
+		if (size < 0) error_exit("klogctl");
+
+		// Display data, filtering out level markers.
+		for (i=0; i<size; ) {
+			if (last=='\n' && data[i]=='<') i += 3;
+			else putchar(last = data[i++]);
+		}
+		if (last!='\n') putchar('\n');
+		if (CFG_TOYBOX_FREE) free(data);
+	}
+
+	return 0;
+}
--- a/toys/toylist.h	Mon Nov 19 07:07:50 2007 -0600
+++ b/toys/toylist.h	Tue Nov 20 01:06:29 2007 -0600
@@ -21,6 +21,11 @@
 // Still to go: "E:jJ:L:m:O:"
 #define MKE2FS_OPTSTRING "<1>2g:Fnqm#N#i#b#"
 
+struct dmesg_data {
+	long level;
+	long size;
+};
+
 struct mke2fs_data {
 	// Command line arguments.
 	long blocksize;
@@ -67,6 +72,7 @@
 };
 
 extern union toy_union {
+	struct dmesg_data dmesg;
 	struct df_data df;
 	struct mke2fs_data mke2fs;
 	struct mkfifo_data mkfifo;
@@ -104,6 +110,7 @@
 USE_COUNT(NEWTOY(count, "", TOYFLAG_USR|TOYFLAG_BIN))
 USE_TOYSH(NEWTOY(cd, NULL, TOYFLAG_NOFORK))
 USE_DF(NEWTOY(df, "Pkt*a", TOYFLAG_USR|TOYFLAG_SBIN))
+USE_DMESG(NEWTOY(dmesg, "s#n#c", TOYFLAG_BIN))
 USE_ECHO(NEWTOY(echo, "+en", TOYFLAG_BIN))
 USE_TOYSH(NEWTOY(exit, NULL, TOYFLAG_NOFORK))
 USE_FALSE(NEWTOY(false, NULL, TOYFLAG_BIN))