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 }