diff options
Diffstat (limited to 'commands/dmesg.c')
-rw-r--r-- | commands/dmesg.c | 120 |
1 files changed, 79 insertions, 41 deletions
diff --git a/commands/dmesg.c b/commands/dmesg.c index a7def2f158..8a60f07507 100644 --- a/commands/dmesg.c +++ b/commands/dmesg.c @@ -1,21 +1,8 @@ -/* - * dmesg.c - barebox logbuffer handling - * - * Copyright (c) 2014 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ +// SPDX-License-Identifier: GPL-2.0-only +// SPDX-FileCopyrightText: © 2014 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix + +/* dmesg.c - barebox logbuffer handling */ + #include <common.h> #include <malloc.h> #include <command.h> @@ -24,6 +11,42 @@ #include <getopt.h> #include <clock.h> +static int str_to_loglevel(const char *str) +{ + int ret; + unsigned long level; + + ret = kstrtoul(str, 10, &level); + if (!ret) { + if (level > MSG_VDEBUG) + goto unknown; + return level; + } + + if (!strcmp(str, "vdebug")) + return MSG_VDEBUG; + if (!strcmp(str, "debug")) + return MSG_DEBUG; + if (!strcmp(str, "info")) + return MSG_INFO; + if (!strcmp(str, "notice")) + return MSG_NOTICE; + if (!strcmp(str, "warn")) + return MSG_WARNING; + if (!strcmp(str, "err")) + return MSG_ERR; + if (!strcmp(str, "crit")) + return MSG_CRIT; + if (!strcmp(str, "alert")) + return MSG_ALERT; + if (!strcmp(str, "emerg")) + return MSG_EMERG; +unknown: + printf("dmesg: unknown loglevel %s\n", str); + + return -EINVAL; +} + static unsigned dmesg_get_levels(const char *__args) { char *args = xstrdup(__args); @@ -31,28 +54,19 @@ static unsigned dmesg_get_levels(const char *__args) unsigned flags = 0; while (1) { + int level; + str = strsep(&levels, ","); if (!str) break; - if(!strcmp(str, "vdebug")) - flags |= BAREBOX_LOG_PRINT_VDEBUG; - else if(!strcmp(str, "debug")) - flags |= BAREBOX_LOG_PRINT_DEBUG; - else if(!strcmp(str, "info")) - flags |= BAREBOX_LOG_PRINT_INFO; - else if(!strcmp(str, "notice")) - flags |= BAREBOX_LOG_PRINT_NOTICE; - else if(!strcmp(str, "warn")) - flags |= BAREBOX_LOG_PRINT_WARNING; - else if(!strcmp(str, "err")) - flags |= BAREBOX_LOG_PRINT_ERR; - else if(!strcmp(str, "crit")) - flags |= BAREBOX_LOG_PRINT_CRIT; - else if(!strcmp(str, "alert")) - flags |= BAREBOX_LOG_PRINT_ALERT; - else if(!strcmp(str, "emerg")) - flags |= BAREBOX_LOG_PRINT_EMERG; + level = str_to_loglevel(str); + if (level < 0) { + flags = 0; + break; + } + + flags |= BIT(level); } free(args); @@ -62,11 +76,12 @@ static unsigned dmesg_get_levels(const char *__args) static int do_dmesg(int argc, char *argv[]) { - int opt, i; + int opt, ret, i; int delete_buf = 0, emit = 0; unsigned flags = 0, levels = 0; + char *set = NULL; - while ((opt = getopt(argc, argv, "ctderl:")) > 0) { + while ((opt = getopt(argc, argv, "ctderl:n:")) > 0) { switch (opt) { case 'c': delete_buf = 1; @@ -83,16 +98,30 @@ static int do_dmesg(int argc, char *argv[]) case 'l': levels = dmesg_get_levels(optarg); if (!levels) - return COMMAND_ERROR_USAGE; + return COMMAND_ERROR; break; case 'r': flags |= BAREBOX_LOG_PRINT_RAW | BAREBOX_LOG_PRINT_TIME; break; + case 'n': + set = optarg; + break; default: return COMMAND_ERROR_USAGE; } } + if (set) { + int level = str_to_loglevel(set); + + if (level < 0) + return COMMAND_ERROR; + + barebox_loglevel = level; + + return 0; + } + if (emit) { char *buf; int len = 0; @@ -119,7 +148,9 @@ static int do_dmesg(int argc, char *argv[]) return 0; } - log_print(flags, levels); + ret = log_print(flags, levels); + if (ret) + return 1; if (delete_buf) log_clean(10); @@ -127,12 +158,19 @@ static int do_dmesg(int argc, char *argv[]) return 0; } + BAREBOX_CMD_HELP_START(dmesg) +BAREBOX_CMD_HELP_TEXT("print or control the barebox message buffer") +BAREBOX_CMD_HELP_TEXT("Loglevels can be specified as number (0=emerg, 7=vdebug)") +BAREBOX_CMD_HELP_TEXT("Known debug loglevels are: emerg, alert, crit, err, warn, notice, info, debug,") +BAREBOX_CMD_HELP_TEXT("vdebug") +BAREBOX_CMD_HELP_TEXT("") BAREBOX_CMD_HELP_TEXT("Options:") BAREBOX_CMD_HELP_OPT ("-c", "Delete messages after printing them") BAREBOX_CMD_HELP_OPT ("-d", "Show a time delta to the last message") BAREBOX_CMD_HELP_OPT ("-e <msg>", "Emit a log message") -BAREBOX_CMD_HELP_OPT ("-l <vdebug|debug|info|notice|warn|err|crit|alert|emerg>", "Restrict output to the given (comma-separated) list of levels") +BAREBOX_CMD_HELP_OPT ("-l <loglevel>", "Restrict output to the given (comma-separated) list of levels") +BAREBOX_CMD_HELP_OPT ("-n <loglevel>", "Set level at which printing of messages is done to the console") BAREBOX_CMD_HELP_OPT ("-r", "Print timestamp and log-level prefixes.") BAREBOX_CMD_HELP_OPT ("-t", "Show timestamp informations") BAREBOX_CMD_HELP_END |