| #include <stdlib.h> |
| #include <unistd.h> |
| #include <stdio.h> |
| #include <errno.h> |
| #include <sys/klog.h> |
| #include <string.h> |
| |
| // From Android sys/klog.h |
| #ifndef KLOG_READ_ALL |
| #define KLOG_READ_ALL 3 |
| #endif |
| #ifndef KLOG_READ_CLEAR |
| #define KLOG_READ_CLEAR 4 |
| #endif |
| #ifndef KLOG_SIZE_BUFFER |
| #define KLOG_SIZE_BUFFER 10 |
| #endif |
| |
| int dmesg_main(int argc, char **argv) |
| { |
| char *buffer; |
| char *p; |
| ssize_t ret; |
| int n, op, bufsize, err = EXIT_FAILURE; |
| |
| bufsize = klogctl(KLOG_SIZE_BUFFER, NULL, 0); |
| if (bufsize <= 0) { |
| perror("klogctl size_buffer"); |
| goto done; |
| } |
| buffer = malloc(bufsize); |
| if (!buffer) { |
| perror("malloc"); |
| goto done; |
| } |
| buffer[0] = 0; |
| |
| if((argc == 2) && (!strcmp(argv[1],"-c"))) { |
| op = KLOG_READ_CLEAR; |
| } else { |
| op = KLOG_READ_ALL; |
| } |
| |
| n = klogctl(op, buffer, bufsize); |
| if (n < 0) { |
| perror("klogctl"); |
| goto done_free; |
| } |
| buffer[n] = '\0'; |
| |
| p = buffer; |
| while ((ret = write(STDOUT_FILENO, p, n))) { |
| if (ret == -1) { |
| if (errno == EINTR) |
| continue; |
| perror("write"); |
| goto done_free; |
| } |
| p += ret; |
| n -= ret; |
| } |
| err = 0; |
| done_free: |
| free(buffer); |
| done: |
| return err; |
| } |