]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
compare: support textual operators, and port analyze over to it
authorLennart Poettering <lennart@poettering.net>
Fri, 26 Aug 2022 15:31:34 +0000 (17:31 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 1 Sep 2022 21:16:13 +0000 (23:16 +0200)
src/analyze/analyze-compare-versions.c
src/shared/compare-operator.c
src/shared/compare-operator.h

index 202b8a7d09a28fec5e8d0d516f75dc29ce2e4f77..07b52a55f2ec838afaf832b78fbc682f7a095ed4 100644 (file)
@@ -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;
         }
 }
index d7117f077162c2983df17da6a56ec62821a0aabc..694c778a271494e85db55f19238adc53ab8efe4c 100644 (file)
@@ -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);
index 363b4bdc759f3c82443a2d3e6ccb04811b570e8b..db5c2f0cfc92b14d061472382bc0be1e069fe9e2 100644 (file)
@@ -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);