main.c 2.5 KB

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