dmesg.c - ubase - suckless linux base utils
HTML git clone git://git.suckless.org/ubase
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
dmesg.c (1325B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <sys/klog.h>
3
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8
9 #include "util.h"
10
11 enum {
12 SYSLOG_ACTION_READ_ALL = 3,
13 SYSLOG_ACTION_CLEAR = 5,
14 SYSLOG_ACTION_CONSOLE_LEVEL = 8,
15 SYSLOG_ACTION_SIZE_BUFFER = 10
16 };
17
18 static void
19 dmesg_show(const void *buf, size_t n)
20 {
21 const char *p = buf;
22 ssize_t r;
23
24 r = write(1, p, n);
25 if (r < 0)
26 eprintf("write:");
27 if (r > 0 && p[r - 1] != '\n')
28 putchar('\n');
29 }
30
31 static void
32 usage(void)
33 {
34 eprintf("usage: %s [-Ccr] [-n level]\n", argv0);
35 }
36
37 int
38 main(int argc, char *argv[])
39 {
40 int n;
41 char *buf;
42 int cflag = 0;
43 long level;
44
45 ARGBEGIN {
46 case 'C':
47 if (klogctl(SYSLOG_ACTION_CLEAR, NULL, 0) < 0)
48 eprintf("klogctl:");
49 return 0;
50 case 'c':
51 cflag = 1;
52 break;
53 case 'r':
54 break;
55 case 'n':
56 level = estrtol(EARGF(usage()), 10);
57 if (klogctl(SYSLOG_ACTION_CONSOLE_LEVEL, NULL, level) < 0)
58 eprintf("klogctl:");
59 return 0;
60 default:
61 usage();
62 } ARGEND;
63
64 n = klogctl(SYSLOG_ACTION_SIZE_BUFFER, NULL, 0);
65 if (n < 0)
66 eprintf("klogctl:");
67
68 buf = emalloc(n);
69
70 n = klogctl(SYSLOG_ACTION_READ_ALL, buf, n);
71 if (n < 0)
72 eprintf("klogctl:");
73
74 dmesg_show(buf, n);
75
76 if (cflag && klogctl(SYSLOG_ACTION_CLEAR, NULL, 0) < 0)
77 eprintf("klogctl:");
78
79 free(buf);
80 return 0;
81