From: Yu Watanabe Date: Thu, 22 Aug 2024 05:14:03 +0000 (+0900) Subject: log: introduce log_syntax_parse_error() X-Git-Tag: v257-rc1~573^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1e04eb00f79b92657b7981aefdbe764341844ba5;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/basic/log.c b/src/basic/log.c index 571f5e43dce..80789ed2f07 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 0412e8a8715..ac9d72202be 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);