From 1e04eb00f79b92657b7981aefdbe764341844ba5 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 22 Aug 2024 14:14:03 +0900 Subject: [PATCH] log: introduce log_syntax_parse_error() This provides generic error message for failures in conf parsers. Currently this is not used, but will be used later. --- src/basic/log.c | 38 ++++++++++++++++++++++++++++++++++++++ src/basic/log.h | 18 ++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/src/basic/log.c b/src/basic/log.c index 571f5e43dc..80789ed2f0 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -1689,6 +1689,44 @@ int log_syntax_invalid_utf8_internal( "String is not UTF-8 clean, ignoring assignment: %s", strna(p)); } +int log_syntax_parse_error_internal( + const char *unit, + const char *config_file, + unsigned config_line, + int error, + bool critical, + const char *file, + int line, + const char *func, + const char *lvalue, + const char *rvalue) { + + PROTECT_ERRNO; + _cleanup_free_ char *escaped = NULL; + + /* OOM is always handled as critical. */ + if (ERRNO_VALUE(error) == ENOMEM) + return log_oom_internal(LOG_ERR, file, line, func); + + if (rvalue && !utf8_is_valid(rvalue)) { + escaped = utf8_escape_invalid(rvalue); + if (!escaped) + rvalue = "(oom)"; + else + rvalue = " (escaped)"; + } + + log_syntax_internal(unit, critical ? LOG_ERR : LOG_WARNING, config_file, config_line, error, + file, line, func, + "Failed to parse %s=%s%s%s%s%s", + strna(lvalue), strempty(escaped), strempty(rvalue), + critical ? "" : ", ignoring", + error == 0 ? "." : ": ", + error == 0 ? "" : STRERROR(error)); + + return critical ? -ERRNO_VALUE(error) : 0; +} + void log_set_upgrade_syslog_to_journal(bool b) { upgrade_syslog_to_journal = b; diff --git a/src/basic/log.h b/src/basic/log.h index 0412e8a871..ac9d72202b 100644 --- a/src/basic/log.h +++ b/src/basic/log.h @@ -359,6 +359,18 @@ int log_syntax_invalid_utf8_internal( const char *func, const char *rvalue); +int log_syntax_parse_error_internal( + const char *unit, + const char *config_file, + unsigned config_line, + int error, + bool critical, /* When true, propagate the passed error, otherwise this always returns 0. */ + const char *file, + int line, + const char *func, + const char *lvalue, + const char *rvalue); + #define log_syntax(unit, level, config_file, config_line, error, ...) \ ({ \ int _level = (level), _e = (error); \ @@ -375,6 +387,12 @@ int log_syntax_invalid_utf8_internal( : -EINVAL; \ }) +#define log_syntax_parse_error_full(unit, config_file, config_line, error, critical, lvalue, rvalue) \ + log_syntax_parse_error_internal(unit, config_file, config_line, error, critical, PROJECT_FILE, __LINE__, __func__, lvalue, rvalue) + +#define log_syntax_parse_error(unit, config_file, config_line, error, lvalue, rvalue) \ + log_syntax_parse_error_full(unit, config_file, config_line, error, /* critical = */ false, lvalue, rvalue) + #define DEBUG_LOGGING _unlikely_(log_get_max_level() >= LOG_DEBUG) void log_setup(void); -- 2.25.1