From: Lennart Poettering Date: Fri, 26 Aug 2022 14:51:12 +0000 (+0200) Subject: compare: add a proper flags field for parse_compare_operator() X-Git-Tag: v252-rc1~273^2~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69f0a6091b8004cba50f49accb73843d25527618;p=thirdparty%2Fsystemd.git compare: add a proper flags field for parse_compare_operator() --- diff --git a/src/shared/compare-operator.c b/src/shared/compare-operator.c index a5b6c1ac6b9..1a19e4219d8 100644 --- a/src/shared/compare-operator.c +++ b/src/shared/compare-operator.c @@ -5,7 +5,7 @@ #include "compare-operator.h" #include "string-util.h" -CompareOperator parse_compare_operator(const char **s, bool allow_fnmatch) { +CompareOperator parse_compare_operator(const char **s, CompareOperatorParseFlags flags) { static const char *const prefix[_COMPARE_OPERATOR_MAX] = { [COMPARE_FNMATCH_EQUAL] = "=$", [COMPARE_FNMATCH_UNEQUAL] = "!=$", @@ -29,8 +29,9 @@ CompareOperator parse_compare_operator(const char **s, bool allow_fnmatch) { e = startswith(*s, prefix[i]); if (e) { - if (!allow_fnmatch && COMPARE_OPERATOR_IS_FNMATCH(i)) - break; + if (!FLAGS_SET(flags, COMPARE_ALLOW_FNMATCH) && COMPARE_OPERATOR_IS_FNMATCH(i)) + return _COMPARE_OPERATOR_INVALID; + *s = e; return i; } diff --git a/src/shared/compare-operator.h b/src/shared/compare-operator.h index ceb534f2685..f7137bba1af 100644 --- a/src/shared/compare-operator.h +++ b/src/shared/compare-operator.h @@ -36,7 +36,11 @@ static inline bool COMPARE_OPERATOR_IS_ORDER(CompareOperator c) { return c >= _COMPARE_OPERATOR_ORDER_FIRST && c <= _COMPARE_OPERATOR_ORDER_LAST; } -CompareOperator parse_compare_operator(const char **s, bool allow_fnmatch); +typedef enum CompareOperatorParseFlags { + COMPARE_ALLOW_FNMATCH = 1 << 0, +} CompareOperatorParseFlags; + +CompareOperator parse_compare_operator(const char **s, CompareOperatorParseFlags flags); int test_order(int k, CompareOperator op); diff --git a/src/shared/condition.c b/src/shared/condition.c index 31b3db1182a..1f9e6d221f2 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -206,7 +206,7 @@ static int condition_test_kernel_version(Condition *c, char **env) { break; s = strstrip(word); - operator = parse_compare_operator(&s, /* allow_fnmatch= */ false); + operator = parse_compare_operator(&s, 0); if (operator >= 0) { s += strspn(s, WHITESPACE); if (isempty(s)) { @@ -267,7 +267,7 @@ static int condition_test_osrelease(Condition *c, char **env) { "Failed to parse parameter, key/value format expected: %m"); /* Do not allow whitespace after the separator, as that's not a valid os-release format */ - operator = parse_compare_operator(&word, /* allow_fnmatch= */ false); + operator = parse_compare_operator(&word, 0); if (operator < 0 || isempty(word) || strchr(WHITESPACE, *word) != NULL) return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse parameter, key/value format expected: %m"); @@ -304,7 +304,7 @@ static int condition_test_memory(Condition *c, char **env) { m = physical_memory(); p = c->parameter; - operator = parse_compare_operator(&p, /* allow_fnmatch= */ false); + operator = parse_compare_operator(&p, 0); if (operator < 0) operator = COMPARE_GREATER_OR_EQUAL; /* default to >= check, if nothing is specified. */ @@ -330,7 +330,7 @@ static int condition_test_cpus(Condition *c, char **env) { return log_debug_errno(n, "Failed to determine CPUs in affinity mask: %m"); p = c->parameter; - operator = parse_compare_operator(&p, /* allow_fnmatch= */ false); + operator = parse_compare_operator(&p, 0); if (operator < 0) operator = COMPARE_GREATER_OR_EQUAL; /* default to >= check, if nothing is specified. */ @@ -534,7 +534,7 @@ static int condition_test_firmware_smbios_field(const char *expression) { delete_trailing_chars(field, WHITESPACE); /* Parse operator */ - operator = parse_compare_operator(&expression, /* allow_fnmatch= */ true); + operator = parse_compare_operator(&expression, COMPARE_ALLOW_FNMATCH); if (operator < 0) return operator;