]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
comapre: add generic implementation for comapring with verscmp+fnmatch
authorLennart Poettering <lennart@poettering.net>
Fri, 26 Aug 2022 14:28:06 +0000 (16:28 +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 385f41894b9cde2bee2b8e1c444484171afa83a8..4baf57a35dfb9a39b0e6ff0ae6c5a03799cc39bf 100644 (file)
@@ -1,5 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
+#include <fnmatch.h>
+
 #include "compare-operator.h"
 #include "string-util.h"
 
@@ -63,3 +65,24 @@ int test_order(int k, CompareOperator op) {
                 return -EINVAL;
         }
 }
+
+int version_or_fnmatch_compare(
+                CompareOperator op,
+                const char *a,
+                const char *b) {
+
+        switch (op) {
+
+        case COMPARE_FNMATCH_EQUAL:
+                return fnmatch(b, a, FNM_EXTMATCH) != FNM_NOMATCH;
+
+        case COMPARE_FNMATCH_UNEQUAL:
+                return fnmatch(b, a, FNM_EXTMATCH) == FNM_NOMATCH;
+
+        case _COMPARE_OPERATOR_ORDER_FIRST..._COMPARE_OPERATOR_ORDER_LAST:
+                return test_order(strverscmp_improved(a, b), op);
+
+        default:
+                return -EINVAL;
+        }
+}
index 9d1b71ed9981b47df0ff0e4259ea6b2046c3d967..ceb534f26853fcd12e8fc328e3e924f8142304b4 100644 (file)
@@ -39,3 +39,5 @@ static inline bool COMPARE_OPERATOR_IS_ORDER(CompareOperator c) {
 CompareOperator parse_compare_operator(const char **s, bool allow_fnmatch);
 
 int test_order(int k, CompareOperator op);
+
+int version_or_fnmatch_compare(CompareOperator op, const char *a, const char *b);
index d5aee1d7935634da6a0f5dc24fa719e68a6c73a2..31b3db1182a3030358c5a38685e97538a9da1ce7 100644 (file)
@@ -562,11 +562,7 @@ static int condition_test_firmware_smbios_field(const char *expression) {
         delete_trailing_chars(actual_value, WHITESPACE);
 
         /* Finally compare actual and expected value */
-        if (operator == COMPARE_FNMATCH_EQUAL)
-                return fnmatch(expected_value, actual_value, FNM_EXTMATCH) != FNM_NOMATCH;
-        if (operator == COMPARE_FNMATCH_UNEQUAL)
-                return fnmatch(expected_value, actual_value, FNM_EXTMATCH) == FNM_NOMATCH;
-        return test_order(strverscmp_improved(actual_value, expected_value), operator);
+        return version_or_fnmatch_compare(operator, actual_value, expected_value);
 }
 
 static int condition_test_firmware(Condition *c, char **env) {