Mercurial > hg > toybox
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))