1 #include <stdlib.h>
2 #include <unistd.h>
3 #include <stdio.h>
4 #include <errno.h>
5 #include <sys/klog.h>
6 #include <string.h>
7 
8 #define FALLBACK_KLOG_BUF_SHIFT	17	/* CONFIG_LOG_BUF_SHIFT from our kernel */
9 #define FALLBACK_KLOG_BUF_LEN	(1 << FALLBACK_KLOG_BUF_SHIFT)
10 
dmesg_main(int argc,char ** argv)11 int dmesg_main(int argc, char **argv)
12 {
13     char *buffer;
14     char *p;
15     ssize_t ret;
16     int n, op, klog_buf_len;
17 
18     klog_buf_len = klogctl(KLOG_SIZE_BUFFER, 0, 0);
19 
20     if (klog_buf_len <= 0) {
21         klog_buf_len = FALLBACK_KLOG_BUF_LEN;
22     }
23 
24     buffer = (char *)malloc(klog_buf_len + 1);
25 
26     if (!buffer) {
27         perror("malloc");
28         return EXIT_FAILURE;
29     }
30 
31     p = buffer;
32 
33     if((argc == 2) && (!strcmp(argv[1],"-c"))) {
34         op = KLOG_READ_CLEAR;
35     } else {
36         op = KLOG_READ_ALL;
37     }
38 
39     n = klogctl(op, buffer, klog_buf_len);
40     if (n < 0) {
41         perror("klogctl");
42         return EXIT_FAILURE;
43     }
44     buffer[n] = '\0';
45 
46     while((ret = write(STDOUT_FILENO, p, n))) {
47         if (ret == -1) {
48 	    if (errno == EINTR)
49                 continue;
50 	    perror("write");
51 	    return EXIT_FAILURE;
52 	}
53 	p += ret;
54 	n -= ret;
55     }
56 
57     return 0;
58 }
59