Vladimir N. Oleynik writes:
[oweals/busybox.git] / util-linux / dmesg.c
1 /* vi: set sw=4 ts=4: */
2 /* dmesg.c -- Print out the contents of the kernel ring buffer
3  * Created: Sat Oct  9 16:19:47 1993
4  * Revised: Thu Oct 28 21:52:17 1993 by faith@cs.unc.edu
5  * Copyright 1993 Theodore Ts'o (tytso@athena.mit.edu)
6  * This program comes with ABSOLUTELY NO WARRANTY.
7  * Modifications by Rick Sladkey (jrs@world.std.com)
8  * Larger buffersize 3 June 1998 by Nicolai Langfeldt, based on a patch
9  * by Peeter Joot.  This was also suggested by John Hudson.
10  * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org>
11  * - added Native Language Support
12  *
13  * from util-linux -- adapted for busybox by 
14  * Erik Andersen <andersen@codepoet.org>. I ripped out Native Language 
15  * Support, replaced getopt, added some gotos for redundant stuff.
16  *
17  * Audited and cleaned up on 7 March 2003 to reduce size of
18  * check error handling by Erik Andersen <andersen@codepoet.org>
19  */
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <getopt.h>
24 #include <errno.h>
25 #include <sys/klog.h>
26
27 #include "busybox.h"
28
29 int dmesg_main(int argc, char **argv)
30 {
31         char *buf;
32         int bufsize = 8196;
33         int i, n;
34         int level = 0;
35         int lastc;
36         int cmd = 3;
37
38         while ((i = getopt(argc, argv, "cn:s:")) > 0) {
39                 switch (i) {
40                         case 'c':
41                                 cmd = 4;
42                                 break;
43                         case 'n':
44                                 cmd = 8;
45                                 level = bb_xgetlarg(optarg, 10, 0, 10);
46                                 break;
47                         case 's':
48                                 /* I think a 512k max kernel ring buffer is big enough for
49                                  * anybody, as the default is 16k...  Could be wrong though.
50                                  * If so I'm sure I'll hear about it by the enraged masses*/
51                                 bufsize = bb_xgetlarg(optarg, 10, 4096, 512*1024);
52                                 break;
53                         default:
54                                 bb_show_usage();
55                 }
56         }
57
58         if (optind < argc) {
59                 bb_show_usage();
60         }
61
62         if (cmd == 8) {
63                 if (klogctl(cmd, NULL, level) < 0)
64                         goto die_the_death;
65                 goto all_done;
66         }
67
68         buf = xmalloc(bufsize);
69         if ((n = klogctl(cmd, buf, bufsize)) < 0)
70                 goto die_the_death;
71
72         lastc = '\n';
73         for (i = 0; i < n; i++) {
74                 if (lastc == '\n' && buf[i] == '<') {
75                         i++;
76                         while (buf[i] >= '0' && buf[i] <= '9')
77                                 i++;
78                         if (buf[i] == '>')
79                                 i++;
80                 }
81                 lastc = buf[i];
82                 putchar(lastc);
83         }
84         if (lastc != '\n')
85                 putchar('\n');
86 all_done:
87 #ifdef CONFIG_FEATURE_CLEAN_UP
88         if (buf) {
89                 free(buf);
90         }
91 #endif
92         return EXIT_SUCCESS;
93 die_the_death:
94         bb_perror_nomsg_and_die();
95 }