]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic: add new variable $SYSTEMD_OS_RELEASE to override location of os-release
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 7 Mar 2022 17:54:50 +0000 (18:54 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 29 Mar 2022 14:17:56 +0000 (16:17 +0200)
The test for the variable is added in test-systemctl-enable because there we
can do it almost for free, and the variable is most likely to be used with
'systemctl enable --root' anyway.

docs/ENVIRONMENT.md
src/basic/os-util.c
test/test-systemctl-enable.sh

index 5477110bcc823d80c36dad4ec40ce5ab372e0009..0cbe5cfb6bca7c70a7a085bfcd359a5ab39d7786 100644 (file)
@@ -43,6 +43,11 @@ All tools:
   debugging, in order to test generators and other code against specific kernel
   command lines.
 
+* `$SYSTEMD_OS_RELEASE` — if set, use this path instead of `/etc/os-release` or
+  `/usr/lib/os-release`. When operating under some root (e.g. `systemctl
+  --root=…`), the path is taken relative to the outside root. Only useful for
+  debugging.
+
 * `$SYSTEMD_FSTAB` — if set, use this path instead of `/etc/fstab`. Only useful
   for debugging.
 
index bf86f6434845b804d12b1d7864b1bbf3306977a7..acfff24319bb7585afb691eb306077bb51164854 100644 (file)
@@ -170,13 +170,19 @@ int open_extension_release(const char *root, const char *extension, char **ret_p
                         }
                 }
         } else {
-                FOREACH_STRING(p, "/etc/os-release", "/usr/lib/os-release") {
-                        r = chase_symlinks(p, root, CHASE_PREFIX_ROOT,
+                const char *var = secure_getenv("SYSTEMD_OS_RELEASE");
+                if (var)
+                        r = chase_symlinks(var, root, 0,
                                            ret_path ? &q : NULL,
                                            ret_fd ? &fd : NULL);
-                        if (r != -ENOENT)
-                                break;
-                }
+                else
+                        FOREACH_STRING(path, "/etc/os-release", "/usr/lib/os-release") {
+                                r = chase_symlinks(path, root, CHASE_PREFIX_ROOT,
+                                                   ret_path ? &q : NULL,
+                                                   ret_fd ? &fd : NULL);
+                                if (r != -ENOENT)
+                                        break;
+                        }
         }
         if (r < 0)
                 return r;
index 30ba6532e74612c9dd2aab9286316ef7dd93b65c..769341129ca15be9130449306ddc18c6987282cc 100644 (file)
@@ -518,6 +518,14 @@ check_alias z 'z' && { echo "Expected failure because %z is not known" >&2; exit
 
 # FIXME: if there's an invalid Alias=, we shouldn't preach about empty [Install]
 
-exit 0  # yes, this is needed because the last test above fails
-
 # TODO: repeat the tests above for presets
+
+: -------SYSTEMD_OS_RELEASE relative to root------------------
+# check that os-release overwriting works as expected with root
+test -e "$root/etc/os-release"
+
+cat >"$root/etc/os-release2" <<EOF
+ID='the-id2'
+EOF
+
+SYSTEMD_OS_RELEASE="$root/etc/os-release2" check_alias o 'the-id2'