summaryrefslogtreecommitdiffstats
path: root/sys-utils/dmesg.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys-utils/dmesg.c')
-rw-r--r--sys-utils/dmesg.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c
index 0ee03eeba..4c85f9fce 100644
--- a/sys-utils/dmesg.c
+++ b/sys-utils/dmesg.c
@@ -227,24 +227,36 @@ static void __attribute__((__noreturn__)) usage(FILE *out)
/*
* LEVEL ::= <number> | <name>
- * <number> ::= number in range <0..N>, where N < ARRAY_SIZE(level_names)
+ * <number> ::= @len is set: number in range <0..N>, where N < ARRAY_SIZE(level_names)
+ * ::= @len not set: number in range <1..N>, where N <= ARRAY_SIZE(level_names)
* <name> ::= case-insensitive text
+ *
+ * Note that @len argument is not set when parsing "-n <level>" command line
+ * option. The console_level is intepreted as "log level less than the value".
+ *
+ * For example "dmesg -n 8" or "dmesg -n debug" enables debug console log
+ * level by klogctl(SYSLOG_ACTION_CONSOLE_LEVEL, NULL, 8). The @str argument
+ * has to be parsed to number in range <1..8>.
*/
static int parse_level(const char *str, size_t len)
{
+ int offset = 0;
+
if (!str)
return -1;
- if (!len)
+ if (!len) {
len = strlen(str);
+ offset = 1;
+ }
errno = 0;
if (isdigit(*str)) {
char *end = NULL;
- long x = strtol(str, &end, 10);
+ long x = strtol(str, &end, 10) - offset;
if (!errno && end && end > str && (size_t) (end - str) == len &&
x >= 0 && (size_t) x < ARRAY_SIZE(level_names))
- return x;
+ return x + offset;
} else {
size_t i;
@@ -252,7 +264,7 @@ static int parse_level(const char *str, size_t len)
const char *n = level_names[i].name;
if (strncasecmp(str, n, len) == 0 && *(n + len) == '\0')
- return i;
+ return i + offset;
}
}