1
0
mirror of https://github.com/systemd/systemd.git synced 2025-09-20 05:44:42 +03:00

condition: allow fnmatch() matches in ConditionKernelVersion=

This is mostly to make things systematic, and brings no new
functionality, as not specifying any operator is identical to prefixing
with =$ anyway.
This commit is contained in:
Lennart Poettering
2022-08-29 11:10:18 +02:00
parent 4803b0bcaa
commit c990742523
2 changed files with 27 additions and 27 deletions

View File

@@ -1334,11 +1334,11 @@
<listitem><para><varname>ConditionKernelVersion=</varname> may be used to check whether the kernel
version (as reported by <command>uname -r</command>) matches a certain expression (or if prefixed
with the exclamation mark does not match it). The argument must be a list of (potentially quoted)
expressions. For each of the expressions, if it starts with one of <literal>&lt;</literal>,
<literal>&lt;=</literal>, <literal>=</literal> (or <literal>==</literal>), <literal>!=</literal>
(or <literal>&lt;&gt;</literal>), <literal>&gt;=</literal>, <literal>&gt;</literal> a relative
version comparison is done, otherwise the specified string is matched with shell-style
globs.</para>
expressions. Each expression starts with one of <literal>&lt;</literal>, <literal>&lt;=</literal>,
<literal>=</literal> (or <literal>==</literal>), <literal>!=</literal> (or
<literal>&lt;&gt;</literal>), <literal>&gt;=</literal>, <literal>&gt;</literal> for a relative
version comparison, or <literal>=$</literal>, <literal>!=$</literal> for a shell-style glob
match. If no operator is specified <literal>=$</literal> is implied.</para>
<para>Note that using the kernel version string is an unreliable way to determine which features
are supported by a kernel, because of the widespread practice of backporting drivers, features, and

View File

@@ -206,8 +206,10 @@ static int condition_test_kernel_version(Condition *c, char **env) {
break;
s = strstrip(word);
operator = parse_compare_operator(&s, 0);
if (operator >= 0) {
operator = parse_compare_operator(&s, COMPARE_ALLOW_FNMATCH);
if (operator < 0) /* No prefix? Then treat as glob string */
operator = COMPARE_FNMATCH_EQUAL;
s += strspn(s, WHITESPACE);
if (isempty(s)) {
if (first) {
@@ -224,12 +226,10 @@ static int condition_test_kernel_version(Condition *c, char **env) {
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Unexpected end of expression: %s", p);
}
r = test_order(strverscmp_improved(u.release, s), operator);
} else
/* No prefix? Then treat as glob string */
r = fnmatch(s, u.release, 0) == 0;
if (r == 0)
r = version_or_fnmatch_compare(operator, u.release, s);
if (r < 0)
return r;
if (!r)
return false;
first = false;