1 #include "dmesg.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/klog.h>
5 #include <unistd.h>
6
main(int argc,char ** argv)7 int main(int argc, char **argv)
8 {
9 unsigned int len = 1;
10 char *buf = NULL;
11 int opt;
12 unsigned int color = 65280;
13
14 // 获取内核缓冲区大小
15 len = klogctl(10, buf, len);
16
17 if (len < 16 * 1024)
18 len = 16 * 1024;
19 if (len > 16 * 1024 * 1024)
20 len = 16 * 1024 * 1024;
21
22 buf = malloc(len);
23 if (buf == NULL)
24 {
25 perror("");
26 return -1;
27 }
28
29 if (argc == 1)
30 {
31 // 无选项参数,默认打印所有日志消息
32 len = klogctl(2, buf, len);
33 }
34 else
35 {
36 // 获取第一个选项参数
37 opt = getoption(argv[1]);
38
39 // 无效参数
40 if (opt == -1)
41 {
42 print_bad_usage_msg();
43 return -1;
44 }
45 // 打印帮助手册
46 else if (opt == 0)
47 {
48 print_help_msg();
49 return 0;
50 }
51 // 4 -> 读取内核缓冲区后,清空缓冲区
52 // 5 -> 清空内核缓冲区
53 else if (opt == 4 || opt == 5)
54 {
55 len = klogctl(opt, buf, len);
56 }
57 // 读取特定日志级别的消息
58 else if (opt == 8)
59 {
60 // 无指定日志级别参数,打印错误使用信息
61 if (argc < 3)
62 {
63 print_bad_usage_msg();
64 return -1;
65 }
66
67 int level = -1;
68
69 // 获取日志级别
70 // 这里加1的原因是:如果klogctl的第三个参数是0,不会发生系统调用
71 level = getlevel(argv[2]) + 1;
72
73 if (level == -1)
74 return -1;
75
76 klogctl(8, buf, level);
77 len = klogctl(2, buf, len);
78 }
79 }
80
81 // 当前打印内容
82 // 0: 日志级别
83 // 1: 时间戳
84 // 2: 代码行号
85 // 3: 日志消息
86 unsigned int content = 0;
87 for (int i = 0; i < len; i++)
88 {
89 char c[2];
90 c[0] = buf[i];
91 c[1] = '\0';
92 syscall(100000, &c[0], color, 0);
93 if (content == 0 && buf[i] == '>')
94 {
95 content++;
96 }
97 else if (content == 1 && buf[i] == ']')
98 {
99 color = 16744448;
100 content++;
101 }
102 else if (content == 2 && buf[i] == ')')
103 {
104 color = 16777215;
105 content++;
106 }
107 else if (content == 3 && buf[i] == '\n')
108 {
109 color = 65280;
110 content = 0;
111 }
112 }
113
114 free(buf);
115
116 return 0;
117 }