dmesg: try to detect buffer size
No binary (build failed)
—
(log yok)
| @@ -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'; | |