diff options
Diffstat (limited to 'common/console_common.c')
-rw-r--r-- | common/console_common.c | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/common/console_common.c b/common/console_common.c index 91a81e50fa..0113a64138 100644 --- a/common/console_common.c +++ b/common/console_common.c @@ -10,36 +10,39 @@ #include <errno.h> #include <console.h> #include <init.h> +#include <string.h> #include <environment.h> #include <globalvar.h> #include <magicvar.h> +#include <memory.h> #include <of.h> #include <password.h> #include <clock.h> #include <malloc.h> #include <linux/pstore.h> #include <linux/math64.h> +#include <linux/sizes.h> +#include <linux/overflow.h> #ifndef CONFIG_CONSOLE_NONE static const char *colored_log_level[] = { - [MSG_EMERG] = "\033[31mEMERG:\033[0m ", /* red */ - [MSG_ALERT] = "\033[31mALERT:\033[0m ", /* red */ - [MSG_CRIT] = "\033[31mCRITICAL:\033[0m ", /* red */ - [MSG_ERR] = "\033[31mERROR:\033[0m ", /* red */ - [MSG_WARNING] = "\033[33mWARNING:\033[0m ", /* yellow */ - [MSG_NOTICE] = "\033[34mNOTICE:\033[0m ", /* blue */ + [MSG_EMERG] = "\033[1;31mEMERG:\033[0m ", /* red */ + [MSG_ALERT] = "\033[1;31mALERT:\033[0m ", /* red */ + [MSG_CRIT] = "\033[1;31mCRITICAL:\033[0m ", /* red */ + [MSG_ERR] = "\033[1;31mERROR:\033[0m ", /* red */ + [MSG_WARNING] = "\033[1;33mWARNING:\033[0m ", /* yellow */ + [MSG_NOTICE] = "\033[1;34mNOTICE:\033[0m ", /* blue */ }; int barebox_loglevel = CONFIG_DEFAULT_LOGLEVEL; LIST_HEAD(barebox_logbuf); static int barebox_logbuf_num_messages; -static int barebox_log_max_messages = 1000; +static int barebox_log_max_messages; static void log_del(struct log_entry *log) { - free(log->msg); list_del(&log->list); free(log); barebox_logbuf_num_messages--; @@ -68,7 +71,7 @@ void log_clean(unsigned int limit) } } -static void print_colored_log_level(const int level) +static void print_colored_log_level(unsigned int ch, const int level) { if (!console_allow_color()) return; @@ -77,7 +80,7 @@ static void print_colored_log_level(const int level) if (!colored_log_level[level]) return; - puts(colored_log_level[level]); + console_puts(ch, colored_log_level[level]); } static void pr_puts(int level, const char *str) @@ -89,15 +92,14 @@ static void pr_puts(int level, const char *str) log_clean(barebox_log_max_messages - 1); if (barebox_log_max_messages >= 0) { - log = malloc(sizeof(*log)); + int msglen; + + msglen = strlen(str); + log = malloc(struct_size(log, msg, msglen + 1)); if (!log) goto nolog; - log->msg = strdup(str); - if (!log->msg) { - free(log); - goto nolog; - } + memcpy(log->msg, str, msglen + 1); log->timestamp = get_time_ns(); log->level = level; @@ -112,8 +114,8 @@ nolog: if (level > barebox_loglevel) return; - print_colored_log_level(level); - puts(str); + print_colored_log_level(CONSOLE_STDERR, level); + console_puts(CONSOLE_STDERR, str); } int pr_print(int level, const char *fmt, ...) @@ -134,7 +136,7 @@ int pr_print(int level, const char *fmt, ...) return i; } -int dev_printf(int level, const struct device_d *dev, const char *format, ...) +int dev_printf(int level, const struct device *dev, const char *format, ...) { va_list args; int ret = 0; @@ -144,7 +146,7 @@ int dev_printf(int level, const struct device_d *dev, const char *format, ...) if (!IS_ENABLED(CONFIG_LOGBUF) && level > barebox_loglevel) return 0; - if (dev->driver && dev->driver->name) + if (dev && dev->driver && dev->driver->name) ret += snprintf(printbuffer, size, "%s ", dev->driver->name); ret += snprintf(printbuffer + ret, size - ret, "%s: ", dev_name(dev)); @@ -173,15 +175,18 @@ bool console_allow_color(void) static int console_common_init(void) { - if (IS_ENABLED(CONFIG_LOGBUF)) + if (IS_ENABLED(CONFIG_LOGBUF)) { + barebox_log_max_messages + = clamp(mem_malloc_size() / SZ_32K, 1000UL, 100000UL); globalvar_add_simple_int("log_max_messages", &barebox_log_max_messages, "%d"); + } globalvar_add_simple_bool("allow_color", &__console_allow_color); return globalvar_add_simple_int("loglevel", &barebox_loglevel, "%d"); } -device_initcall(console_common_init); +core_initcall(console_common_init); int log_writefile(const char *filepath) { @@ -203,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; @@ -214,10 +219,12 @@ 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))) - print_colored_log_level(log->level); + print_colored_log_level(CONSOLE_STDOUT, log->level); if (flags & BAREBOX_LOG_PRINT_RAW) printf("<%i>", log->level); @@ -242,6 +249,8 @@ void log_print(unsigned flags, unsigned levels) printf("%s", log->msg); } + + return 0; } int printf(const char *fmt, ...) @@ -284,7 +293,7 @@ int vprintf(const char *fmt, va_list args) } EXPORT_SYMBOL(vprintf); -struct console_device *console_get_by_dev(struct device_d *dev) +struct console_device *console_get_by_dev(struct device *dev) { struct console_device *cdev; @@ -336,7 +345,7 @@ EXPORT_SYMBOL(console_get_first_active); struct console_device *of_console_get_by_alias(const char *alias) { struct device_node *node; - struct device_d *dev; + struct device *dev; node = of_find_node_by_alias(NULL, alias); if (!node) |