From 2e8fa6274d5c0b5ca540bb1786d57a9491c79f1c Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 26 Aug 2022 17:31:34 +0200 Subject: [PATCH] compare: support textual operators, and port analyze over to it --- src/analyze/analyze-compare-versions.c | 27 +++++++++++--------------- src/shared/compare-operator.c | 7 +++++++ src/shared/compare-operator.h | 1 + 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/analyze/analyze-compare-versions.c b/src/analyze/analyze-compare-versions.c index 202b8a7d09a..07b52a55f2e 100644 --- a/src/analyze/analyze-compare-versions.c +++ b/src/analyze/analyze-compare-versions.c @@ -3,6 +3,7 @@ #include #include "analyze-compare-versions.h" +#include "compare-operator.h" #include "macro.h" #include "string-util.h" #include "strv.h" @@ -26,22 +27,16 @@ int verb_compare_versions(int argc, char *argv[], void *userdata) { } else { const char *op = ASSERT_PTR(argv[2]); + CompareOperator operator; - r = strverscmp_improved(ASSERT_PTR(argv[1]), ASSERT_PTR(argv[3])); - - if (STR_IN_SET(op, "lt", "<")) - return r < 0 ? EXIT_SUCCESS : EXIT_FAILURE; - if (STR_IN_SET(op, "le", "<=")) - return r <= 0 ? EXIT_SUCCESS : EXIT_FAILURE; - if (STR_IN_SET(op, "eq", "==")) - return r == 0 ? EXIT_SUCCESS : EXIT_FAILURE; - if (STR_IN_SET(op, "ne", "!=")) - return r != 0 ? EXIT_SUCCESS : EXIT_FAILURE; - if (STR_IN_SET(op, "ge", ">=")) - return r >= 0 ? EXIT_SUCCESS : EXIT_FAILURE; - if (STR_IN_SET(op, "gt", ">")) - return r > 0 ? EXIT_SUCCESS : EXIT_FAILURE; - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Unknown operator \"%s\".", op); + operator = parse_compare_operator(&op, COMPARE_ALLOW_TEXTUAL); + if (operator < 0 || !isempty(op)) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown operator \"%s\".", op); + + r = version_or_fnmatch_compare(operator, ASSERT_PTR(argv[1]), ASSERT_PTR(argv[3])); + if (r < 0) + return log_error_errno(r, "Failed to compare versions: %m"); + + return r ? EXIT_SUCCESS : EXIT_FAILURE; } } diff --git a/src/shared/compare-operator.c b/src/shared/compare-operator.c index d7117f07716..694c778a271 100644 --- a/src/shared/compare-operator.c +++ b/src/shared/compare-operator.c @@ -25,6 +25,13 @@ CompareOperator parse_compare_operator(const char **s, CompareOperatorParseFlags { COMPARE_EQUAL, "=" }, { COMPARE_STRING_UNEQUAL, "!=", .need_mask = COMPARE_EQUAL_BY_STRING }, { COMPARE_UNEQUAL, "!=" }, + + { COMPARE_LOWER, "lt", .valid_mask = COMPARE_ALLOW_TEXTUAL }, + { COMPARE_LOWER_OR_EQUAL, "le", .valid_mask = COMPARE_ALLOW_TEXTUAL }, + { COMPARE_EQUAL, "eq", .valid_mask = COMPARE_ALLOW_TEXTUAL }, + { COMPARE_UNEQUAL, "ne", .valid_mask = COMPARE_ALLOW_TEXTUAL }, + { COMPARE_GREATER_OR_EQUAL, "ge", .valid_mask = COMPARE_ALLOW_TEXTUAL }, + { COMPARE_GREATER, "gt", .valid_mask = COMPARE_ALLOW_TEXTUAL }, }; assert(s); diff --git a/src/shared/compare-operator.h b/src/shared/compare-operator.h index 363b4bdc759..db5c2f0cfc9 100644 --- a/src/shared/compare-operator.h +++ b/src/shared/compare-operator.h @@ -49,6 +49,7 @@ static inline bool COMPARE_OPERATOR_IS_ORDER(CompareOperator c) { typedef enum CompareOperatorParseFlags { COMPARE_ALLOW_FNMATCH = 1 << 0, COMPARE_EQUAL_BY_STRING = 1 << 1, + COMPARE_ALLOW_TEXTUAL = 1 << 2, } CompareOperatorParseFlags; CompareOperator parse_compare_operator(const char **s, CompareOperatorParseFlags flags); -- 2.47.3