Merge remote-tracking branch 'remotes/gfiber-internal/master' into master_merge
diff --git a/dmesg.c b/dmesg.c
index 94e80ca..788b058 100644
--- a/dmesg.c
+++ b/dmesg.c
@@ -5,9 +5,6 @@
#include <sys/klog.h>
#include <string.h>
-#define KLOG_BUF_SHIFT 17 /* CONFIG_LOG_BUF_SHIFT from our kernel */
-#define KLOG_BUF_LEN (1 << KLOG_BUF_SHIFT)
-
// From Android sys/klog.h
#ifndef KLOG_READ_ALL
#define KLOG_READ_ALL 3
@@ -15,13 +12,28 @@
#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[KLOG_BUF_LEN + 1];
- char *p = buffer;
+ char *buffer;
+ char *p;
ssize_t ret;
- int n, op;
+ 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;
@@ -29,23 +41,27 @@
op = KLOG_READ_ALL;
}
- n = klogctl(op, buffer, KLOG_BUF_LEN);
+ n = klogctl(op, buffer, bufsize);
if (n < 0) {
perror("klogctl");
- return EXIT_FAILURE;
+ goto done_free;
}
buffer[n] = '\0';
- while((ret = write(STDOUT_FILENO, p, n))) {
+ p = buffer;
+ while ((ret = write(STDOUT_FILENO, p, n))) {
if (ret == -1) {
if (errno == EINTR)
continue;
perror("write");
- return EXIT_FAILURE;
+ goto done_free;
}
p += ret;
n -= ret;
}
-
- return 0;
+ err = 0;
+done_free:
+ free(buffer);
+done:
+ return err;
}