xref: /DragonOS/user/apps/dmesg/main.c (revision fae6e9ade46a52976ad5d099643d51cc20876448)
1 #include "dmesg.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/klog.h>
5 #include <unistd.h>
6 
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 }