compare: add a proper flags field for parse_compare_operator()
authorLennart Poettering <lennart@poettering.net>
Fri, 26 Aug 2022 14:51:12 +0000 (16:51 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 1 Sep 2022 21:15:14 +0000 (23:15 +0200)
src/shared/compare-operator.c
src/shared/compare-operator.h
src/shared/condition.c

index a5b6c1ac6b97bed6f53f13141e0ccf31b5966039..1a19e4219d88bcdb6a09f61bce3ca227749356da 100644 (file)
@@ -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;
                 }
index ceb534f26853fcd12e8fc328e3e924f8142304b4..f7137bba1af18f534f10928665e12f551423495d 100644 (file)
@@ -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);
 
index 31b3db1182a3030358c5a38685e97538a9da1ce7..1f9e6d221f2bbe3945d657c51e7937b37da8b68f 100644 (file)
@@ -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;