Skip to content

Commit fd03a6a

Browse files
committed
sysext: move extension_release_validate() out of os-util.c
1 parent addddf5 commit fd03a6a

File tree

6 files changed

+94
-76
lines changed

6 files changed

+94
-76
lines changed

src/shared/extension-release.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2+
3+
#include "alloc-util.h"
4+
#include "env-util.h"
5+
#include "extension-release.h"
6+
#include "log.h"
7+
#include "os-util.h"
8+
#include "strv.h"
9+
10+
int extension_release_validate(
11+
const char *name,
12+
const char *host_os_release_id,
13+
const char *host_os_release_version_id,
14+
const char *host_os_release_sysext_level,
15+
char **extension_release) {
16+
17+
const char *extension_release_id = NULL, *extension_release_sysext_level = NULL;
18+
19+
assert(name);
20+
assert(!isempty(host_os_release_id));
21+
22+
/* Now that we can look into the extension image, let's see if the OS version is compatible */
23+
if (strv_isempty(extension_release)) {
24+
log_debug("Extension '%s' carries no extension-release data, ignoring extension.", name);
25+
return 0;
26+
}
27+
28+
extension_release_id = strv_env_pairs_get(extension_release, "ID");
29+
if (isempty(extension_release_id)) {
30+
log_debug("Extension '%s' does not contain ID in extension-release but requested to match '%s'",
31+
name, strna(host_os_release_id));
32+
return 0;
33+
}
34+
35+
if (!streq_ptr(host_os_release_id, extension_release_id)) {
36+
log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.",
37+
name, strna(extension_release_id), strna(host_os_release_id));
38+
return 0;
39+
}
40+
41+
/* Rolling releases do not typically set VERSION_ID (eg: ArchLinux) */
42+
if (isempty(host_os_release_version_id) && isempty(host_os_release_sysext_level)) {
43+
log_debug("No version info on the host (rolling release?), but ID in %s matched.", name);
44+
return 1;
45+
}
46+
47+
/* If the extension has a sysext API level declared, then it must match the host API
48+
* level. Otherwise, compare OS version as a whole */
49+
extension_release_sysext_level = strv_env_pairs_get(extension_release, "SYSEXT_LEVEL");
50+
if (!isempty(host_os_release_sysext_level) && !isempty(extension_release_sysext_level)) {
51+
if (!streq_ptr(host_os_release_sysext_level, extension_release_sysext_level)) {
52+
log_debug("Extension '%s' is for sysext API level '%s', but running on sysext API level '%s'",
53+
name, strna(extension_release_sysext_level), strna(host_os_release_sysext_level));
54+
return 0;
55+
}
56+
} else if (!isempty(host_os_release_version_id)) {
57+
const char *extension_release_version_id;
58+
59+
extension_release_version_id = strv_env_pairs_get(extension_release, "VERSION_ID");
60+
if (isempty(extension_release_version_id)) {
61+
log_debug("Extension '%s' does not contain VERSION_ID in extension-release but requested to match '%s'",
62+
name, strna(host_os_release_version_id));
63+
return 0;
64+
}
65+
66+
if (!streq_ptr(host_os_release_version_id, extension_release_version_id)) {
67+
log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.",
68+
name, strna(extension_release_version_id), strna(host_os_release_version_id));
69+
return 0;
70+
}
71+
} else if (isempty(host_os_release_version_id) && isempty(host_os_release_sysext_level)) {
72+
/* Rolling releases do not typically set VERSION_ID (eg: ArchLinux) */
73+
log_debug("No version info on the host (rolling release?), but ID in %s matched.", name);
74+
return 1;
75+
}
76+
77+
log_debug("Version info of extension '%s' matches host.", name);
78+
return 1;
79+
}

src/shared/extension-release.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2+
#pragma once
3+
4+
/* Given an image name (for logging purposes), a set of os-release values from the host and a key-value pair
5+
* vector of extension-release variables, check that the distro and (system extension level or distro
6+
* version) match and return 1, and 0 otherwise. */
7+
int extension_release_validate(
8+
const char *name,
9+
const char *host_os_release_id,
10+
const char *host_os_release_version_id,
11+
const char *host_os_release_sysext_level,
12+
char **extension_release);

src/shared/meson.build

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ shared_sources = files('''
100100
exec-util.h
101101
exit-status.c
102102
exit-status.h
103+
extension-release.c
104+
extension-release.h
103105
fdset.c
104106
fdset.h
105107
fileio-label.c

src/shared/os-util.c

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -193,74 +193,3 @@ int load_extension_release_pairs(const char *root, const char *extension, char *
193193

194194
return load_env_file_pairs(f, p, ret);
195195
}
196-
197-
int extension_release_validate(
198-
const char *name,
199-
const char *host_os_release_id,
200-
const char *host_os_release_version_id,
201-
const char *host_os_release_sysext_level,
202-
char **extension_release) {
203-
204-
const char *extension_release_id = NULL, *extension_release_sysext_level = NULL;
205-
206-
assert(name);
207-
assert(!isempty(host_os_release_id));
208-
209-
/* Now that we can look into the extension image, let's see if the OS version is compatible */
210-
if (strv_isempty(extension_release)) {
211-
log_debug("Extension '%s' carries no extension-release data, ignoring extension.", name);
212-
return 0;
213-
}
214-
215-
extension_release_id = strv_env_pairs_get(extension_release, "ID");
216-
if (isempty(extension_release_id)) {
217-
log_debug("Extension '%s' does not contain ID in extension-release but requested to match '%s'",
218-
name, strna(host_os_release_id));
219-
return 0;
220-
}
221-
222-
if (!streq_ptr(host_os_release_id, extension_release_id)) {
223-
log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.",
224-
name, strna(extension_release_id), strna(host_os_release_id));
225-
return 0;
226-
}
227-
228-
/* Rolling releases do not typically set VERSION_ID (eg: ArchLinux) */
229-
if (isempty(host_os_release_version_id) && isempty(host_os_release_sysext_level)) {
230-
log_debug("No version info on the host (rolling release?), but ID in %s matched.", name);
231-
return 1;
232-
}
233-
234-
/* If the extension has a sysext API level declared, then it must match the host API
235-
* level. Otherwise, compare OS version as a whole */
236-
extension_release_sysext_level = strv_env_pairs_get(extension_release, "SYSEXT_LEVEL");
237-
if (!isempty(host_os_release_sysext_level) && !isempty(extension_release_sysext_level)) {
238-
if (!streq_ptr(host_os_release_sysext_level, extension_release_sysext_level)) {
239-
log_debug("Extension '%s' is for sysext API level '%s', but running on sysext API level '%s'",
240-
name, strna(extension_release_sysext_level), strna(host_os_release_sysext_level));
241-
return 0;
242-
}
243-
} else if (!isempty(host_os_release_version_id)) {
244-
const char *extension_release_version_id;
245-
246-
extension_release_version_id = strv_env_pairs_get(extension_release, "VERSION_ID");
247-
if (isempty(extension_release_version_id)) {
248-
log_debug("Extension '%s' does not contain VERSION_ID in extension-release but requested to match '%s'",
249-
name, strna(host_os_release_version_id));
250-
return 0;
251-
}
252-
253-
if (!streq_ptr(host_os_release_version_id, extension_release_version_id)) {
254-
log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.",
255-
name, strna(extension_release_version_id), strna(host_os_release_version_id));
256-
return 0;
257-
}
258-
} else if (isempty(host_os_release_version_id) && isempty(host_os_release_sysext_level)) {
259-
/* Rolling releases do not typically set VERSION_ID (eg: ArchLinux) */
260-
log_debug("No version info on the host (rolling release?), but ID in %s matched.", name);
261-
return 1;
262-
}
263-
264-
log_debug("Version info of extension '%s' matches host.", name);
265-
return 1;
266-
}

src/shared/os-util.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,3 @@ int parse_os_release(const char *root, ...) _sentinel_;
2626
int load_extension_release_pairs(const char *root, const char *extension, char ***ret);
2727
int load_os_release_pairs(const char *root, char ***ret);
2828
int load_os_release_pairs_with_prefix(const char *root, const char *prefix, char ***ret);
29-
30-
/* Given an image name (for logging purposes), a set of os-release values from the host
31-
* and a key-value pair vector of extension-release variables, check that the distro and
32-
* (system extension level or distro version) match and return 1, and 0 otherwise. */
33-
int extension_release_validate(const char *name, const char *host_os_release_id, const char *host_os_release_version_id, const char *host_os_release_sysext_level, char **extension_release);

src/sysext/sysext.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "dissect-image.h"
1111
#include "env-util.h"
1212
#include "escape.h"
13+
#include "extension-release.h"
1314
#include "fd-util.h"
1415
#include "fileio.h"
1516
#include "format-table.h"

0 commit comments

Comments
 (0)