richardphibel / rpms / systemd

Forked from rpms/systemd 2 years ago
Clone
8d419f
From d424adce45d593d41e52294bd8f32fd33c625498 Mon Sep 17 00:00:00 2001
8d419f
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
8d419f
Date: Mon, 7 Mar 2022 18:54:50 +0100
8d419f
Subject: [PATCH] basic: add new variable $SYSTEMD_OS_RELEASE to override
8d419f
 location of os-release
8d419f
8d419f
The test for the variable is added in test-systemctl-enable because there we
8d419f
can do it almost for free, and the variable is most likely to be used with
8d419f
'systemctl enable --root' anyway.
8d419f
8d419f
(cherry picked from commit df78419d107662dd49892d76a745c294d7031d66)
8d419f
8d419f
Related: #2082131
8d419f
---
8d419f
 docs/ENVIRONMENT.md           |  5 +++++
8d419f
 src/basic/os-util.c           | 16 +++++++++++-----
8d419f
 test/test-systemctl-enable.sh | 12 ++++++++++--
8d419f
 3 files changed, 26 insertions(+), 7 deletions(-)
8d419f
8d419f
diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md
8d419f
index 71d6c55010..5e9548449c 100644
8d419f
--- a/docs/ENVIRONMENT.md
8d419f
+++ b/docs/ENVIRONMENT.md
8d419f
@@ -43,6 +43,11 @@ All tools:
8d419f
   debugging, in order to test generators and other code against specific kernel
8d419f
   command lines.
8d419f
 
8d419f
+* `$SYSTEMD_OS_RELEASE` — if set, use this path instead of `/etc/os-release` or
8d419f
+  `/usr/lib/os-release`. When operating under some root (e.g. `systemctl
8d419f
+  --root=…`), the path is taken relative to the outside root. Only useful for
8d419f
+  debugging.
8d419f
+
8d419f
 * `$SYSTEMD_FSTAB` — if set, use this path instead of `/etc/fstab`. Only useful
8d419f
   for debugging.
8d419f
 
8d419f
diff --git a/src/basic/os-util.c b/src/basic/os-util.c
8d419f
index a6e4d09473..38b2179e48 100644
8d419f
--- a/src/basic/os-util.c
8d419f
+++ b/src/basic/os-util.c
8d419f
@@ -170,13 +170,19 @@ int open_extension_release(const char *root, const char *extension, char **ret_p
8d419f
                         }
8d419f
                 }
8d419f
         } else {
8d419f
-                FOREACH_STRING(p, "/etc/os-release", "/usr/lib/os-release") {
8d419f
-                        r = chase_symlinks(p, root, CHASE_PREFIX_ROOT,
8d419f
+                const char *var = secure_getenv("SYSTEMD_OS_RELEASE");
8d419f
+                if (var)
8d419f
+                        r = chase_symlinks(var, root, 0,
8d419f
                                            ret_path ? &q : NULL,
8d419f
                                            ret_fd ? &fd : NULL);
8d419f
-                        if (r != -ENOENT)
8d419f
-                                break;
8d419f
-                }
8d419f
+                else
8d419f
+                        FOREACH_STRING(path, "/etc/os-release", "/usr/lib/os-release") {
8d419f
+                                r = chase_symlinks(path, root, CHASE_PREFIX_ROOT,
8d419f
+                                                   ret_path ? &q : NULL,
8d419f
+                                                   ret_fd ? &fd : NULL);
8d419f
+                                if (r != -ENOENT)
8d419f
+                                        break;
8d419f
+                        }
8d419f
         }
8d419f
         if (r < 0)
8d419f
                 return r;
8d419f
diff --git a/test/test-systemctl-enable.sh b/test/test-systemctl-enable.sh
8d419f
index 30ba6532e7..769341129c 100644
8d419f
--- a/test/test-systemctl-enable.sh
8d419f
+++ b/test/test-systemctl-enable.sh
8d419f
@@ -518,6 +518,14 @@ check_alias z 'z' && { echo "Expected failure because %z is not known" >&2; exit
8d419f
 
8d419f
 # FIXME: if there's an invalid Alias=, we shouldn't preach about empty [Install]
8d419f
 
8d419f
-exit 0  # yes, this is needed because the last test above fails
8d419f
-
8d419f
 # TODO: repeat the tests above for presets
8d419f
+
8d419f
+: -------SYSTEMD_OS_RELEASE relative to root------------------
8d419f
+# check that os-release overwriting works as expected with root
8d419f
+test -e "$root/etc/os-release"
8d419f
+
8d419f
+cat >"$root/etc/os-release2" <
8d419f
+ID='the-id2'
8d419f
+EOF
8d419f
+
8d419f
+SYSTEMD_OS_RELEASE="$root/etc/os-release2" check_alias o 'the-id2'