summaryrefslogtreecommitdiffstats
path: root/sys-utils/dmesg.c
diff options
context:
space:
mode:
authorKarel Zak2011-07-13 15:06:53 +0200
committerKarel Zak2011-07-13 15:06:53 +0200
commit5c8f6bc6dfad42379e0489c3de6d67a15fedb2dc (patch)
tree7709af0be9e225c8db103d4083cd47135420ec34 /sys-utils/dmesg.c
parentdmesg: don't print non-printable chars, parse records (diff)
downloadkernel-qcow2-util-linux-5c8f6bc6dfad42379e0489c3de6d67a15fedb2dc.tar.gz
kernel-qcow2-util-linux-5c8f6bc6dfad42379e0489c3de6d67a15fedb2dc.tar.xz
kernel-qcow2-util-linux-5c8f6bc6dfad42379e0489c3de6d67a15fedb2dc.zip
dmesg: consolidate level parsiig code
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'sys-utils/dmesg.c')
-rw-r--r--sys-utils/dmesg.c39
1 files changed, 25 insertions, 14 deletions
diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c
index 6be07afe6..baf959d89 100644
--- a/sys-utils/dmesg.c
+++ b/sys-utils/dmesg.c
@@ -106,16 +106,36 @@ static void __attribute__((__noreturn__)) usage(FILE *out)
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
}
-static int string_to_level(const char *name)
+static int parse_level(const char *str, size_t len)
{
int i;
- if (!name)
+ if (!str)
return -1;
+ if (!len)
+ len = strlen(str);
+ errno = 0;
- for (i = 0; i < ARRAY_SIZE(level_names); i++)
- if (strcasecmp(name, level_names[i].name) == 0)
+ if (isdigit(*str)) {
+ char *end = NULL;
+
+ i = strtol(str, &end, 10);
+ if (!errno && end && end > str && end - str == len &&
+ i >= 0 && i < ARRAY_SIZE(level_names))
return i;
+ } else {
+ for (i = 0; i < ARRAY_SIZE(level_names); i++) {
+ const char *n = level_names[i].name;
+
+ if (strncasecmp(str, n, len) == 0 && *(n + len) == '\0')
+ return i;
+ }
+ }
+
+ if (errno)
+ err(EXIT_FAILURE, _("failed to parse level '%s'"), str);
+
+ errx(EXIT_FAILURE, _("unknown level '%s'"), str);
return -1;
}
@@ -309,16 +329,7 @@ int main(int argc, char *argv[])
break;
case 'n':
cmd = SYSLOG_ACTION_CONSOLE_LEVEL;
- if (isdigit(*optarg)) {
- console_level = strtol_or_err(optarg,
- _("failed to parse level"));
- } else {
- console_level = string_to_level(optarg);
- if (console_level < 0)
- errx(EXIT_FAILURE,
- _("%s: unknown log level"),
- optarg);
- }
+ console_level = parse_level(optarg, 0);
break;
case 'r':
flags |= DMESG_FL_RAW;