[git commit] dmesg: try to detect buffer size

Denys Vlasenko vda.linux at googlemail.com
Fri Jul 10 12:14:14 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=874201fee5a57acf25efe1b0b9c7e58ef6ef98a5
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master


function                                             old     new   delta
dmesg_main                                           214     246     +32

Signed-off-by: Randy Robertson <rmrobert at vmware.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 util-linux/dmesg.c |   30 ++++++++++++++++++------------
 1 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/util-linux/dmesg.c b/util-linux/dmesg.c
index f52026c..b0dc592 100644
--- a/util-linux/dmesg.c
+++ b/util-linux/dmesg.c
@@ -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';
-- 
1.6.3.3


More information about the busybox-cvs mailing list