summaryrefslogtreecommitdiff
path: root/package/toolbox/src/src/dmesg.c
diff options
context:
space:
mode:
Diffstat (limited to 'package/toolbox/src/src/dmesg.c')
-rw-r--r--package/toolbox/src/src/dmesg.c64
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;
+}