From 8bd2cf6e11a1145a01c648663e45cc946f0495d9 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 26 Aug 2022 16:28:06 +0200 Subject: [PATCH] comapre: add generic implementation for comapring with verscmp+fnmatch --- src/shared/compare-operator.c | 23 +++++++++++++++++++++++ src/shared/compare-operator.h | 2 ++ src/shared/condition.c | 6 +----- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/shared/compare-operator.c b/src/shared/compare-operator.c index 385f41894b9..4baf57a35df 100644 --- a/src/shared/compare-operator.c +++ b/src/shared/compare-operator.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #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; + } +} diff --git a/src/shared/compare-operator.h b/src/shared/compare-operator.h index 9d1b71ed998..ceb534f2685 100644 --- a/src/shared/compare-operator.h +++ b/src/shared/compare-operator.h @@ -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); diff --git a/src/shared/condition.c b/src/shared/condition.c index d5aee1d7935..31b3db1182a 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -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) { -- 2.47.3