diff options
Diffstat (limited to 'package/toolbox/src/src/dmesg.c')
-rw-r--r-- | package/toolbox/src/src/dmesg.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/package/toolbox/src/src/dmesg.c b/package/toolbox/src/src/dmesg.c new file mode 100644 index 000000000..9fac63287 --- /dev/null +++ b/package/toolbox/src/src/dmesg.c @@ -0,0 +1,64 @@ +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> +#include <errno.h> +#include <sys/klog.h> +#include <string.h> + +#define FALLBACK_KLOG_BUF_SHIFT 17 /* CONFIG_LOG_BUF_SHIFT from our kernel */ +#define FALLBACK_KLOG_BUF_LEN (1 << FALLBACK_KLOG_BUF_SHIFT) + +#ifndef KLOG_SIZE_BUFFER +#define KLOG_READ_ALL 3 +#define KLOG_READ_CLEAR 4 +#define KLOG_SIZE_BUFFER 10 +#endif + +int main(int argc, char **argv) +{ + char *buffer; + char *p; + ssize_t ret; + int n, op, klog_buf_len; + + klog_buf_len = klogctl(KLOG_SIZE_BUFFER, 0, 0); + + if (klog_buf_len <= 0) { + klog_buf_len = FALLBACK_KLOG_BUF_LEN; + } + + buffer = (char *)malloc(klog_buf_len + 1); + + if (!buffer) { + perror("malloc"); + return EXIT_FAILURE; + } + + p = buffer; + + if((argc == 2) && (!strcmp(argv[1],"-c"))) { + op = KLOG_READ_CLEAR; + } else { + op = KLOG_READ_ALL; + } + + n = klogctl(op, buffer, klog_buf_len); + if (n < 0) { + perror("klogctl"); + return EXIT_FAILURE; + } + buffer[n] = '\0'; + + while((ret = write(STDOUT_FILENO, p, n))) { + if (ret == -1) { + if (errno == EINTR) + continue; + perror("write"); + return EXIT_FAILURE; + } + p += ret; + n -= ret; + } + + return 0; +} |