diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index d752c427dd5..dd24bf0f416 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -2005,16 +2005,25 @@ int config_parse_routing_policy_rule_type( return 0; } +#define log_rule_section(rule, fmt, ...) \ + ({ \ + const RoutingPolicyRule *_rule = (rule); \ + log_section_warning_errno( \ + _rule ? _rule->section : NULL, \ + SYNTHETIC_ERRNO(EINVAL), \ + fmt " Ignoring [RoutingPolicyRule] section.", \ + ##__VA_ARGS__); \ + }) + static int routing_policy_rule_section_verify(RoutingPolicyRule *rule) { + assert(rule); + if (section_is_invalid(rule->section)) return -EINVAL; if ((rule->family == AF_INET && FLAGS_SET(rule->address_family, ADDRESS_FAMILY_IPV6)) || (rule->family == AF_INET6 && FLAGS_SET(rule->address_family, ADDRESS_FAMILY_IPV4))) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "%s: address family specified by Family= conflicts with the address " - "specified by To= or From=. Ignoring [RoutingPolicyRule] section from line %u.", - rule->section->filename, rule->section->line); + return log_rule_section(rule, "Address family specified by Family= conflicts with To= and/or From=."); if (rule->family == AF_UNSPEC) { if (IN_SET(rule->address_family, ADDRESS_FAMILY_IPV4, ADDRESS_FAMILY_NO)) @@ -2024,24 +2033,18 @@ static int routing_policy_rule_section_verify(RoutingPolicyRule *rule) { /* rule->family can be AF_UNSPEC only when Family=both. */ } + assert(IN_SET(rule->family, AF_INET, AF_INET6) || rule->address_family == ADDRESS_FAMILY_YES); + if (rule->l3mdev) rule->table = RT_TABLE_UNSPEC; if (rule->type == FR_ACT_GOTO) { if (rule->priority_goto <= 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "%s: Type=goto is specified but the target priority GoTo= is unspecified. " - "Ignoring [RoutingPolicyRule] section from line %u.", - rule->section->filename, - rule->section->line); + return log_rule_section(rule, "Type=goto is specified but the target priority GoTo= is unspecified."); if (rule->priority_set && rule->priority >= rule->priority_goto) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "%s: goto target priority %"PRIu32" must be larger than the priority of this rule %"PRIu32". " - "Ignoring [RoutingPolicyRule] section from line %u.", - rule->section->filename, - rule->priority_goto, rule->priority, - rule->section->line); + return log_rule_section(rule, "Goto target priority %"PRIu32" must be larger than the priority of this rule %"PRIu32".", + rule->priority_goto, rule->priority); } return 0; diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index f1860db4485..b73039cc5c8 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -203,6 +203,43 @@ static inline bool section_is_invalid(ConfigSection *section) { DEFINE_TRIVIAL_CLEANUP_FUNC(type*, free_func); \ DEFINE_TRIVIAL_CLEANUP_FUNC(type*, free_func##_or_set_invalid); +#define log_section_full_errno_zerook(section, level, error, ...) \ + ({ \ + const ConfigSection *_s = (section); \ + log_syntax(/* unit = */ NULL, \ + level, \ + _s ? _s->filename : NULL, \ + _s ? _s->line : 0, \ + error, \ + __VA_ARGS__); \ + }) + +#define log_section_full_errno(section, level, error, ...) \ + ({ \ + int _error = (error); \ + ASSERT_NON_ZERO(_error); \ + log_section_full_errno_zerook(section, level, _error, __VA_ARGS__); \ + }) + +#define log_section_full(section, level, fmt, ...) \ + ({ \ + if (BUILD_MODE_DEVELOPER) \ + assert(!strstr(fmt, "%m")); \ + (void) log_section_full_errno_zerook(section, level, 0, fmt, ##__VA_ARGS__); \ + }) + +#define log_section_debug(section, ...) log_section_full(section, LOG_DEBUG, __VA_ARGS__) +#define log_section_info(section, ...) log_section_full(section, LOG_INFO, __VA_ARGS__) +#define log_section_notice(section, ...) log_section_full(section, LOG_NOTICE, __VA_ARGS__) +#define log_section_warning(section, ...) log_section_full(section, LOG_WARNING, __VA_ARGS__) +#define log_section_error(section, ...) log_section_full(section, LOG_ERR, __VA_ARGS__) + +#define log_section_debug_errno(section, error, ...) log_section_full_errno(section, LOG_DEBUG, error, __VA_ARGS__) +#define log_section_info_errno(section, error, ...) log_section_full_errno(section, LOG_INFO, error, __VA_ARGS__) +#define log_section_notice_errno(section, error, ...) log_section_full_errno(section, LOG_NOTICE, error, __VA_ARGS__) +#define log_section_warning_errno(section, error, ...) log_section_full_errno(section, LOG_WARNING, error, __VA_ARGS__) +#define log_section_error_errno(section, error, ...) log_section_full_errno(section, LOG_ERR, error, __VA_ARGS__) + CONFIG_PARSER_PROTOTYPE(config_parse_int); CONFIG_PARSER_PROTOTYPE(config_parse_unsigned); CONFIG_PARSER_PROTOTYPE(config_parse_long);