summaryrefslogtreecommitdiffstats
path: root/commands/dmesg.c
diff options
context:
space:
mode:
Diffstat (limited to 'commands/dmesg.c')
-rw-r--r--commands/dmesg.c120
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