mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +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:
parent
4803b0bcaa
commit
c990742523
@ -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><</literal>,
|
||||
<literal><=</literal>, <literal>=</literal> (or <literal>==</literal>), <literal>!=</literal>
|
||||
(or <literal><></literal>), <literal>>=</literal>, <literal>></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><</literal>, <literal><=</literal>,
|
||||
<literal>=</literal> (or <literal>==</literal>), <literal>!=</literal> (or
|
||||
<literal><></literal>), <literal>>=</literal>, <literal>></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
|
||||
|
@ -206,30 +206,30 @@ static int condition_test_kernel_version(Condition *c, char **env) {
|
||||
break;
|
||||
|
||||
s = strstrip(word);
|
||||
operator = parse_compare_operator(&s, 0);
|
||||
if (operator >= 0) {
|
||||
s += strspn(s, WHITESPACE);
|
||||
if (isempty(s)) {
|
||||
if (first) {
|
||||
/* For backwards compatibility, allow whitespace between the operator and
|
||||
* value, without quoting, but only in the first expression. */
|
||||
word = mfree(word);
|
||||
r = extract_first_word(&p, &word, NULL, 0);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to parse condition string \"%s\": %m", p);
|
||||
if (r == 0)
|
||||
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Unexpected end of expression: %s", p);
|
||||
s = word;
|
||||
} else
|
||||
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) {
|
||||
/* For backwards compatibility, allow whitespace between the operator and
|
||||
* value, without quoting, but only in the first expression. */
|
||||
word = mfree(word);
|
||||
r = extract_first_word(&p, &word, NULL, 0);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to parse condition string \"%s\": %m", p);
|
||||
if (r == 0)
|
||||
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Unexpected end of expression: %s", p);
|
||||
}
|
||||
s = word;
|
||||
} else
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user