main.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "dmesg.h"
  2. int main(int argc, char **argv)
  3. {
  4. unsigned int len = 1;
  5. char *buf = NULL;
  6. int opt;
  7. unsigned int color = 65280;
  8. // 获取内核缓冲区大小
  9. len = klogctl(10, buf, len);
  10. if (len < 16 * 1024)
  11. len = 16 * 1024;
  12. if (len > 16 * 1024 * 1024)
  13. len = 16 * 1024 * 1024;
  14. buf = malloc(len);
  15. if (buf == NULL)
  16. {
  17. perror("");
  18. return -1;
  19. }
  20. if (argc == 1)
  21. {
  22. // 无选项参数,默认打印所有日志消息
  23. len = klogctl(2, buf, len);
  24. }
  25. else
  26. {
  27. // 获取第一个选项参数
  28. opt = getopt(argv[1]);
  29. // 无效参数
  30. if (opt == -1)
  31. {
  32. print_bad_usage_msg();
  33. return -1;
  34. }
  35. // 打印帮助手册
  36. else if (opt == 0)
  37. {
  38. print_help_msg();
  39. return 0;
  40. }
  41. // 4 -> 读取内核缓冲区后,清空缓冲区
  42. // 5 -> 清空内核缓冲区
  43. else if (opt == 4 || opt == 5)
  44. {
  45. len = klogctl(opt, buf, len);
  46. }
  47. // 读取特定日志级别的消息
  48. else if (opt == 8)
  49. {
  50. // 无指定日志级别参数,打印错误使用信息
  51. if (argc < 3)
  52. {
  53. print_bad_usage_msg();
  54. return -1;
  55. }
  56. int level = -1;
  57. // 获取日志级别
  58. // 这里加1的原因是:如果klogctl的第三个参数是0,不会发生系统调用
  59. level = getlevel(argv[2]) + 1;
  60. if (level == -1)
  61. return -1;
  62. klogctl(8, buf, level);
  63. len = klogctl(2, buf, len);
  64. }
  65. }
  66. // 当前打印内容
  67. // 0: 日志级别
  68. // 1: 时间戳
  69. // 2: 代码行号
  70. // 3: 日志消息
  71. unsigned int content = 0;
  72. for (int i = 0; i < len; i++)
  73. {
  74. char c[2];
  75. c[0] = buf[i];
  76. c[1] = '\0';
  77. syscall(100000, &c[0], color, 0);
  78. if (content == 0 && buf[i] == '>')
  79. {
  80. content++;
  81. }
  82. else if (content == 1 && buf[i] == ']')
  83. {
  84. color = 16744448;
  85. content++;
  86. }
  87. else if (content == 2 && buf[i] == ')')
  88. {
  89. color = 16777215;
  90. content++;
  91. }
  92. else if (content == 3 && buf[i] == '\n')
  93. {
  94. color = 65280;
  95. content = 0;
  96. }
  97. }
  98. free(buf);
  99. return 0;
  100. }