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 }