summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2024-03-06 19:45:19 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2024-03-08 08:02:01 +0100
commit9eb0055d0ae9b08b0c03be72bc761657402483c3 (patch)
tree4d851ba60b473f3046624eeabc0a445d69a487ca
parent2c04db06987189ec310f2f02a532604206b8cac5 (diff)
downloadbarebox-9eb0055d0ae9.tar.gz
barebox-9eb0055d0ae9.tar.xz
commands: dmesg: support aborting dmesg output with ctrl-c
dmesg output can get very long, especially if debug messages are compiled in and the maximum number of retained log messages is increased. Therefore, follow what we do for other potentially long-running commands and allow the user to abort it with ctrl+c. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240306184519.626594-2-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--commands/dmesg.c6
-rw-r--r--common/console_common.c6
-rw-r--r--include/linux/printk.h2
3 files changed, 10 insertions, 4 deletions
diff --git a/commands/dmesg.c b/commands/dmesg.c
index 83410234e1..8a60f07507 100644
--- a/commands/dmesg.c
+++ b/commands/dmesg.c
@@ -76,7 +76,7 @@ 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;
@@ -148,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);
diff --git a/common/console_common.c b/common/console_common.c
index d25fb0dc5d..631756e480 100644
--- a/common/console_common.c
+++ b/common/console_common.c
@@ -208,7 +208,7 @@ int log_writefile(const char *filepath)
return ret < 0 ? ret : nbytes;
}
-void log_print(unsigned flags, unsigned levels)
+int log_print(unsigned flags, unsigned levels)
{
struct log_entry *log;
unsigned long last = 0;
@@ -219,6 +219,8 @@ void log_print(unsigned flags, unsigned levels)
if (levels && !(levels & (1 << log->level)))
continue;
+ if (ctrlc())
+ return -EINTR;
if (!(flags & (BAREBOX_LOG_PRINT_RAW | BAREBOX_LOG_PRINT_TIME
| BAREBOX_LOG_DIFF_TIME)))
@@ -247,6 +249,8 @@ void log_print(unsigned flags, unsigned levels)
printf("%s", log->msg);
}
+
+ return 0;
}
int printf(const char *fmt, ...)
diff --git a/include/linux/printk.h b/include/linux/printk.h
index 0e9604bbe9..07403ea60c 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -189,7 +189,7 @@ extern void log_clean(unsigned int limit);
#define BAREBOX_LOG_PRINT_TIME BIT(0)
int log_writefile(const char *filepath);
-void log_print(unsigned flags, unsigned levels);
+int log_print(unsigned flags, unsigned levels);
struct va_format {
const char *fmt;