struct utsname u;
assert_se(uname(&u) >= 0);
- if (str_verscmp(u.release, "4.15") < 0)
+ if (strverscmp_improved(u.release, "4.15") < 0)
needed_mask = CGROUP_MASK_CPU;
else
needed_mask = 0;
return 0;
}
-/* This is a direct translation of str_verscmp from boot.c */
-static bool is_digit(int c) {
- return c >= '0' && c <= '9';
-}
-
-static int c_order(int c) {
- if (c == 0 || is_digit(c))
- return 0;
-
- if ((c >= 'a') && (c <= 'z'))
- return c;
-
- return c + 0x10000;
-}
-
-int str_verscmp(const char *s1, const char *s2) {
- const char *os1, *os2;
-
- assert(s1);
- assert(s2);
-
- os1 = s1;
- os2 = s2;
-
- while (*s1 || *s2) {
- int first;
-
- while ((*s1 && !is_digit(*s1)) || (*s2 && !is_digit(*s2))) {
- int order;
-
- order = c_order(*s1) - c_order(*s2);
- if (order != 0)
- return order;
- s1++;
- s2++;
- }
-
- while (*s1 == '0')
- s1++;
- while (*s2 == '0')
- s2++;
-
- first = 0;
- while (is_digit(*s1) && is_digit(*s2)) {
- if (first == 0)
- first = *s1 - *s2;
- s1++;
- s2++;
- }
-
- if (is_digit(*s1))
- return 1;
- if (is_digit(*s2))
- return -1;
-
- if (first != 0)
- return first;
- }
-
- return strcmp(os1, os2);
-}
-
/* Turn off core dumps but only if we're running outside of a container. */
void disable_coredumps(void) {
int r;
int version(void);
-int str_verscmp(const char *s1, const char *s2);
-
void disable_coredumps(void);
b += strcspn(b, " ");
b += strspn(b, " ");
- return strverscmp(a, b);
+ return strverscmp_improved(a, b);
}
static int version_check(int fd_from, const char *from, int fd_to, const char *to) {
FreePool(entry);
}
-static BOOLEAN is_digit(CHAR16 c) {
- return (c >= '0') && (c <= '9');
-}
-
-static UINTN c_order(CHAR16 c) {
- if (c == '\0')
- return 0;
- if (is_digit(c))
- return 0;
- else if ((c >= 'a') && (c <= 'z'))
- return c;
- else
- return c + 0x10000;
-}
-
-static INTN str_verscmp(CHAR16 *s1, CHAR16 *s2) {
- CHAR16 *os1 = s1;
- CHAR16 *os2 = s2;
-
- while (*s1 || *s2) {
- INTN first;
-
- while ((*s1 && !is_digit(*s1)) || (*s2 && !is_digit(*s2))) {
- INTN order;
-
- order = c_order(*s1) - c_order(*s2);
- if (order != 0)
- return order;
- s1++;
- s2++;
- }
-
- while (*s1 == '0')
- s1++;
- while (*s2 == '0')
- s2++;
-
- first = 0;
- while (is_digit(*s1) && is_digit(*s2)) {
- if (first == 0)
- first = *s1 - *s2;
- s1++;
- s2++;
- }
-
- if (is_digit(*s1))
- return 1;
- if (is_digit(*s2))
- return -1;
-
- if (first != 0)
- return first;
- }
-
- return StrCmp(os1, os2);
-}
-
static CHAR8 *line_get_key_value(
CHAR8 *content,
CHAR8 *sep,
if (a->tries_left == 0 && b->tries_left != 0)
return -1;
- r = str_verscmp(a->id, b->id);
+ r = strverscmp_improved(a->id, b->id);
if (r != 0)
return r;
}
static int boot_entry_compare(const BootEntry *a, const BootEntry *b) {
- return str_verscmp(a->id, b->id);
+ return strverscmp_improved(a->id, b->id);
}
static int boot_entries_find(
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Unexpected end of expression: %s", p);
}
- r = test_order(str_verscmp(u.release, s), order);
+ r = test_order(strverscmp_improved(u.release, s), order);
} else
/* No prefix? Then treat as glob string */
r = fnmatch(s, u.release, 0) == 0;
return 1;
}
-static int strverscmpp(char *const* a, char *const* b) {
- /* usable in qsort() for sorting a string array with strverscmp() */
- return strverscmp(*a, *b);
+static int strverscmp_improvedp(char *const* a, char *const* b) {
+ /* usable in qsort() for sorting a string array with strverscmp_improved() */
+ return strverscmp_improved(*a, *b);
}
static int validate_version(
return 0;
}
- /* Order by version sort (i.e. libc strverscmp()) */
- typesafe_qsort(extensions, n_extensions, strverscmpp);
+ /* Order by version sort with strverscmp_improved() */
+ typesafe_qsort(extensions, n_extensions, strverscmp_improvedp);
buf = strv_join(extensions, "', '");
if (!buf)