dmesg: try to detect buffer size
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 10 Jul 2009 12:14:14 +0000 (14:14 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 10 Jul 2009 12:14:14 +0000 (14:14 +0200)
function                                             old     new   delta
dmesg_main                                           214     246     +32

Signed-off-by: Randy Robertson <rmrobert@vmware.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
util-linux/dmesg.c

index f52026c2fdee5649739c4c2a6083849d8d625b7b..b0dc592d2263893ae60a38b74c2d13c5c6c1eb29 100644 (file)
@@ -8,38 +8,44 @@
  *
  * Licensed under GPLv2, see file LICENSE in this tarball for details.
  */
-
 #include <sys/klog.h>
 #include "libbb.h"
 
 int dmesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int dmesg_main(int argc UNUSED_PARAM, char **argv)
 {
-       int len;
+       int len, level;
        char *buf;
-       char *size, *level;
-       unsigned flags = getopt32(argv, "cs:n:", &size, &level);
+       unsigned opts;
        enum {
-               OPT_c = 1<<0,
-               OPT_s = 1<<1,
-               OPT_n = 1<<2
+               OPT_c = 1 << 0,
+               OPT_s = 1 << 1,
+               OPT_n = 1 << 2
        };
 
-       if (flags & OPT_n) {
-               if (klogctl(8, NULL, xatoul_range(level, 0, 10)))
+       opt_complementary = "s+:n+"; /* numeric */
+       opts = getopt32(argv, "cs:n:", &len, &level);
+       if (opts & OPT_n) {
+               if (klogctl(8, NULL, (long) level))
                        bb_perror_msg_and_die("klogctl");
                return EXIT_SUCCESS;
        }
 
-       len = (flags & OPT_s) ? xatoul_range(size, 2, INT_MAX) : 16384;
+       if (!(opts & OPT_s))
+               len = klogctl(10, NULL, 0); /* read ring buffer size */
+       if (len < 16*1024)
+               len = 16*1024;
+       if (len > 16*1024*1024)
+               len = 16*1024*1024;
+
        buf = xmalloc(len);
-       len = klogctl(3 + (flags & OPT_c), buf, len);
+       len = klogctl(3 + (opts & OPT_c), buf, len); /* read ring buffer */
        if (len < 0)
                bb_perror_msg_and_die("klogctl");
        if (len == 0)
                return EXIT_SUCCESS;
 
-       /* Skip <#> at the start of lines, and make sure we end with a newline. */
+       /* Skip <#> at the start of lines, and make sure we end with a newline */
 
        if (ENABLE_FEATURE_DMESG_PRETTY) {
                int last = '\n';