mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 16:37:19 +09:00
analyze: also check for version string validity
It's highly interesting to see if tools such as systemd-sysupdate consider a version valid, hence let's output that too (though gracefully, not fatally)
This commit is contained in:
@@ -9,17 +9,26 @@
|
||||
#include "strv.h"
|
||||
|
||||
int verb_compare_versions(int argc, char *argv[], void *userdata) {
|
||||
const char *v1 = ASSERT_PTR(argv[1]), *v2 = ASSERT_PTR(argv[argc-1]);
|
||||
int r;
|
||||
|
||||
assert(IN_SET(argc, 3, 4));
|
||||
assert(argv);
|
||||
|
||||
/* We only output a warning on invalid version strings (instead of failing), since the comparison
|
||||
* functions try to handle invalid strings graceful and it's still interesting to see what the
|
||||
* comparison result will be. */
|
||||
if (!version_is_valid(v1))
|
||||
log_warning("Version string 1 is not valid, comparing anyway: %s", v1);
|
||||
if (!version_is_valid(v2))
|
||||
log_warning("Version string 2 is not valid, comparing anyway: %s", v2);
|
||||
|
||||
if (argc == 3) {
|
||||
r = strverscmp_improved(ASSERT_PTR(argv[1]), ASSERT_PTR(argv[2]));
|
||||
r = strverscmp_improved(v1, v2);
|
||||
printf("%s %s %s\n",
|
||||
isempty(argv[1]) ? "''" : argv[1],
|
||||
isempty(v1) ? "''" : v1,
|
||||
comparison_operator(r),
|
||||
isempty(argv[2]) ? "''" : argv[2]);
|
||||
isempty(v2) ? "''" : v2);
|
||||
|
||||
/* This matches the exit convention used by rpmdev-vercmp.
|
||||
* We don't use named values because 11 and 12 don't have names. */
|
||||
@@ -28,12 +37,13 @@ int verb_compare_versions(int argc, char *argv[], void *userdata) {
|
||||
} else {
|
||||
const char *op = ASSERT_PTR(argv[2]);
|
||||
CompareOperator operator;
|
||||
assert(argc == 4);
|
||||
|
||||
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]));
|
||||
r = version_or_fnmatch_compare(operator, v1, v2);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to compare versions: %m");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user