source: MondoRescue/branches/3.3/mindi-busybox/util-linux/dmesg.c@ 3625

Last change on this file since 3625 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 2.0 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 *
4 * dmesg - display/control kernel ring buffer.
5 *
6 * Copyright 2006 Rob Landley <rob@landley.net>
7 * Copyright 2006 Bernhard Reutner-Fischer <rep.nop@aon.at>
8 *
9 * Licensed under GPLv2, see file LICENSE in this source tree.
10 */
11
12//usage:#define dmesg_trivial_usage
13//usage: "[-c] [-n LEVEL] [-s SIZE]"
14//usage:#define dmesg_full_usage "\n\n"
15//usage: "Print or control the kernel ring buffer\n"
16//usage: "\n -c Clear ring buffer after printing"
17//usage: "\n -n LEVEL Set console logging level"
18//usage: "\n -s SIZE Buffer size"
19//usage: "\n -r Print raw message buffer"
20
21#include <sys/klog.h>
22#include "libbb.h"
23
24int dmesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
25int dmesg_main(int argc UNUSED_PARAM, char **argv)
26{
27 int len, level;
28 char *buf;
29 unsigned opts;
30 enum {
31 OPT_c = 1 << 0,
32 OPT_s = 1 << 1,
33 OPT_n = 1 << 2,
34 OPT_r = 1 << 3
35 };
36
37 opt_complementary = "s+:n+"; /* numeric */
38 opts = getopt32(argv, "cs:n:r", &len, &level);
39 if (opts & OPT_n) {
40 if (klogctl(8, NULL, (long) level))
41 bb_perror_msg_and_die("klogctl");
42 return EXIT_SUCCESS;
43 }
44
45 if (!(opts & OPT_s))
46 len = klogctl(10, NULL, 0); /* read ring buffer size */
47 if (len < 16*1024)
48 len = 16*1024;
49 if (len > 16*1024*1024)
50 len = 16*1024*1024;
51
52 buf = xmalloc(len);
53 len = klogctl(3 + (opts & OPT_c), buf, len); /* read ring buffer */
54 if (len < 0)
55 bb_perror_msg_and_die("klogctl");
56 if (len == 0)
57 return EXIT_SUCCESS;
58
59
60 if (ENABLE_FEATURE_DMESG_PRETTY && !(opts & OPT_r)) {
61 int last = '\n';
62 int in = 0;
63
64 /* Skip <[0-9]+> at the start of lines */
65 while (1) {
66 if (last == '\n' && buf[in] == '<') {
67 while (buf[in++] != '>' && in < len)
68 ;
69 } else {
70 last = buf[in++];
71 putchar(last);
72 }
73 if (in >= len)
74 break;
75 }
76 /* Make sure we end with a newline */
77 if (last != '\n')
78 bb_putchar('\n');
79 } else {
80 full_write(STDOUT_FILENO, buf, len);
81 if (buf[len-1] != '\n')
82 bb_putchar('\n');
83 }
84
85 if (ENABLE_FEATURE_CLEAN_UP) free(buf);
86
87 return EXIT_SUCCESS;
88}
Note: See TracBrowser for help on using the repository browser.