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 }