summaryrefslogtreecommitdiff
path: root/src/analyze
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2022-08-26 17:31:34 +0200
committerLennart Poettering <lennart@poettering.net>2022-09-01 23:16:13 +0200
commit2e8fa6274d5c0b5ca540bb1786d57a9491c79f1c (patch)
tree6b5a0eb45feb1872fbc72110fce23264288048e9 /src/analyze
parent6061c86693453162395c46eda5e6fac34dea8985 (diff)
downloadsystemd-2e8fa6274d5c0b5ca540bb1786d57a9491c79f1c.tar.gz
compare: support textual operators, and port analyze over to it
Diffstat (limited to 'src/analyze')
-rw-r--r--src/analyze/analyze-compare-versions.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/src/analyze/analyze-compare-versions.c b/src/analyze/analyze-compare-versions.c
index 202b8a7d09..07b52a55f2 100644
--- a/src/analyze/analyze-compare-versions.c
+++ b/src/analyze/analyze-compare-versions.c
@@ -3,6 +3,7 @@
#include <stdio.h>
#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;
}
}