summaryrefslogtreecommitdiffstats
path: root/src/shared/install.c
diff options
context:
space:
mode:
authorFrantisek Sumsal <frantisek@sumsal.cz>2023-12-06 16:24:21 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2023-12-08 03:20:12 +0100
commitfe6e0cfa19dd1de4ac599ae207182fd556adcfa7 (patch)
treef4120d811dfeace9d0758def52e51f37084a2005 /src/shared/install.c
parentcore: relax dependency on RootImage= storage from Requires= to Wants= (diff)
downloadsystemd-fe6e0cfa19dd1de4ac599ae207182fd556adcfa7.tar.xz
systemd-fe6e0cfa19dd1de4ac599ae207182fd556adcfa7.zip
install: don't translate unit instances to paths when reenabling them
For unit instances install_info_discover() returns path to the template, which then generates confusing errors when passed to do_unit_file_enable(): ~# build/systemctl --root=/tmp/systemctl-test.N9ysbz reenable templ1@two.service Unit name: templ1@two.service; p: /etc/systemd/system/templ1@.service Removed "/tmp/systemctl-test.N9ysbz/etc/systemd/system/services.target.wants/templ1@two.service". Failed to reenable templ1@.service, destination unit services.target is a non-template unit. This can also be seen with a different reproducer using getty@.service and a simple bind mount to / - there's no error this time, but it tries to create a symlink for the default instance (from DefaultInstance=tty1), which is also incorrect: ~# SYSTEMD_LOG_LEVEL=debug systemctl --root /mnt/bindroot/ reenable getty@test.service Symlink /mnt/bindroot/etc/systemd/system/getty.target.wants/getty@tty1.service → /usr/lib/systemd/system/getty@.service already exists Follow-up to: 29a7c59abbe Resolves: #24740
Diffstat (limited to 'src/shared/install.c')
-rw-r--r--src/shared/install.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/shared/install.c b/src/shared/install.c
index 0f4dab4aa2..97707e50b4 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -2894,7 +2894,7 @@ static int normalize_linked_files(
return log_debug_errno(SYNTHETIC_ERRNO(EISDIR),
"Unexpected path to a directory \"%s\", refusing.", *a);
- if (!is_path(*a)) {
+ if (!is_path(*a) && !unit_name_is_valid(*a, UNIT_NAME_INSTANCE)) {
r = install_info_discover(&ctx, lp, n, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, &i, NULL, NULL);
if (r < 0)
log_debug_errno(r, "Failed to discover unit \"%s\", operating on name: %m", n);