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