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;
 }