dmesg.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <errno.h>
  5. #include <sys/klog.h>
  6. #include <string.h>
  7. #define FALLBACK_KLOG_BUF_SHIFT 17 /* CONFIG_LOG_BUF_SHIFT from our kernel */
  8. #define FALLBACK_KLOG_BUF_LEN (1 << FALLBACK_KLOG_BUF_SHIFT)
  9. #ifndef KLOG_SIZE_BUFFER
  10. #define KLOG_READ_ALL 3
  11. #define KLOG_READ_CLEAR 4
  12. #define KLOG_SIZE_BUFFER 10
  13. #endif
  14. int main(int argc, char **argv)
  15. {
  16. char *buffer;
  17. char *p;
  18. ssize_t ret;
  19. int n, op, klog_buf_len;
  20. klog_buf_len = klogctl(KLOG_SIZE_BUFFER, 0, 0);
  21. if (klog_buf_len <= 0) {
  22. klog_buf_len = FALLBACK_KLOG_BUF_LEN;
  23. }
  24. buffer = (char *)malloc(klog_buf_len + 1);
  25. if (!buffer) {
  26. perror("malloc");
  27. return EXIT_FAILURE;
  28. }
  29. p = buffer;
  30. if((argc == 2) && (!strcmp(argv[1],"-c"))) {
  31. op = KLOG_READ_CLEAR;
  32. } else {
  33. op = KLOG_READ_ALL;
  34. }
  35. n = klogctl(op, buffer, klog_buf_len);
  36. if (n < 0) {
  37. perror("klogctl");
  38. return EXIT_FAILURE;
  39. }
  40. buffer[n] = '\0';
  41. while((ret = write(STDOUT_FILENO, p, n))) {
  42. if (ret == -1) {
  43. if (errno == EINTR)
  44. continue;
  45. perror("write");
  46. return EXIT_FAILURE;
  47. }
  48. p += ret;
  49. n -= ret;
  50. }
  51. return 0;
  52. }