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 }