xref: /DragonOS/user/apps/dmesg/main.c (revision bc6f0a967c8cb1e9379ced184b25a7722fbda2a4)
18d72b68dSJomo #include "dmesg.h"
2*bc6f0a96S裕依 #include <stdio.h>
3*bc6f0a96S裕依 #include <stdlib.h>
4*bc6f0a96S裕依 #include <sys/klog.h>
5*bc6f0a96S裕依 #include <unistd.h>
68d72b68dSJomo 
main(int argc,char ** argv)78d72b68dSJomo int main(int argc, char **argv)
88d72b68dSJomo {
98d72b68dSJomo     unsigned int len = 1;
108d72b68dSJomo     char *buf = NULL;
118d72b68dSJomo     int opt;
128d72b68dSJomo     unsigned int color = 65280;
138d72b68dSJomo 
148d72b68dSJomo     // 获取内核缓冲区大小
158d72b68dSJomo     len = klogctl(10, buf, len);
168d72b68dSJomo 
178d72b68dSJomo     if (len < 16 * 1024)
188d72b68dSJomo         len = 16 * 1024;
198d72b68dSJomo     if (len > 16 * 1024 * 1024)
208d72b68dSJomo         len = 16 * 1024 * 1024;
218d72b68dSJomo 
228d72b68dSJomo     buf = malloc(len);
238d72b68dSJomo     if (buf == NULL)
248d72b68dSJomo     {
258d72b68dSJomo         perror("");
268d72b68dSJomo         return -1;
278d72b68dSJomo     }
288d72b68dSJomo 
298d72b68dSJomo     if (argc == 1)
308d72b68dSJomo     {
318d72b68dSJomo         // 无选项参数,默认打印所有日志消息
328d72b68dSJomo         len = klogctl(2, buf, len);
338d72b68dSJomo     }
348d72b68dSJomo     else
358d72b68dSJomo     {
368d72b68dSJomo         // 获取第一个选项参数
37*bc6f0a96S裕依         opt = getoption(argv[1]);
388d72b68dSJomo 
398d72b68dSJomo         // 无效参数
408d72b68dSJomo         if (opt == -1)
418d72b68dSJomo         {
428d72b68dSJomo             print_bad_usage_msg();
438d72b68dSJomo             return -1;
448d72b68dSJomo         }
458d72b68dSJomo         // 打印帮助手册
468d72b68dSJomo         else if (opt == 0)
478d72b68dSJomo         {
488d72b68dSJomo             print_help_msg();
498d72b68dSJomo             return 0;
508d72b68dSJomo         }
518d72b68dSJomo         // 4 -> 读取内核缓冲区后,清空缓冲区
528d72b68dSJomo         // 5 -> 清空内核缓冲区
538d72b68dSJomo         else if (opt == 4 || opt == 5)
548d72b68dSJomo         {
558d72b68dSJomo             len = klogctl(opt, buf, len);
568d72b68dSJomo         }
578d72b68dSJomo         // 读取特定日志级别的消息
588d72b68dSJomo         else if (opt == 8)
598d72b68dSJomo         {
608d72b68dSJomo             // 无指定日志级别参数,打印错误使用信息
618d72b68dSJomo             if (argc < 3)
628d72b68dSJomo             {
638d72b68dSJomo                 print_bad_usage_msg();
648d72b68dSJomo                 return -1;
658d72b68dSJomo             }
668d72b68dSJomo 
678d72b68dSJomo             int level = -1;
688d72b68dSJomo 
698d72b68dSJomo             // 获取日志级别
708d72b68dSJomo             // 这里加1的原因是:如果klogctl的第三个参数是0,不会发生系统调用
718d72b68dSJomo             level = getlevel(argv[2]) + 1;
728d72b68dSJomo 
738d72b68dSJomo             if (level == -1)
748d72b68dSJomo                 return -1;
758d72b68dSJomo 
768d72b68dSJomo             klogctl(8, buf, level);
778d72b68dSJomo             len = klogctl(2, buf, len);
788d72b68dSJomo         }
798d72b68dSJomo     }
808d72b68dSJomo 
818d72b68dSJomo     // 当前打印内容
828d72b68dSJomo     // 0: 日志级别
838d72b68dSJomo     // 1: 时间戳
848d72b68dSJomo     // 2: 代码行号
858d72b68dSJomo     // 3: 日志消息
868d72b68dSJomo     unsigned int content = 0;
878d72b68dSJomo     for (int i = 0; i < len; i++)
888d72b68dSJomo     {
898d72b68dSJomo         char c[2];
908d72b68dSJomo         c[0] = buf[i];
918d72b68dSJomo         c[1] = '\0';
928d72b68dSJomo         syscall(100000, &c[0], color, 0);
938d72b68dSJomo         if (content == 0 && buf[i] == '>')
948d72b68dSJomo         {
958d72b68dSJomo             content++;
968d72b68dSJomo         }
978d72b68dSJomo         else if (content == 1 && buf[i] == ']')
988d72b68dSJomo         {
998d72b68dSJomo             color = 16744448;
1008d72b68dSJomo             content++;
1018d72b68dSJomo         }
1028d72b68dSJomo         else if (content == 2 && buf[i] == ')')
1038d72b68dSJomo         {
1048d72b68dSJomo             color = 16777215;
1058d72b68dSJomo             content++;
1068d72b68dSJomo         }
1078d72b68dSJomo         else if (content == 3 && buf[i] == '\n')
1088d72b68dSJomo         {
1098d72b68dSJomo             color = 65280;
1108d72b68dSJomo             content = 0;
1118d72b68dSJomo         }
1128d72b68dSJomo     }
1138d72b68dSJomo 
1148d72b68dSJomo     free(buf);
1158d72b68dSJomo 
1168d72b68dSJomo     return 0;
1178d72b68dSJomo }