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