shared/install: ignore aliasing failure when doing presets

In recent Fedora, preset-all fails:
[  155s] Failed to preset unit: File '/buildroot/etc/systemd/user/dbus.service'
         already exists and is a symlink to /usr/lib/systemd/user/dbus-broker.service
[  155s] ‣ "systemctl --root=/buildroot --global preset-all" returned non-zero exit code 1.

Strictly speaking, this is an error in configuration. The presets specify that
both dbus-broker.service and dbus-daemon.service shall be enabled and they both
claim the 'dbus.service' alias. But this kind of error is very easy to make.
Failing the preset operation is too harsh, since in most cases the system will
work fine without an alias and changes in unrelated components can cause the
conflict.

Let's reuse the same logic that was added in
ad5fdd3912: when enabling the unit through
'preset' or 'preset-all', print the message, but suppress the error. When
enabling through 'enable', fail the operation.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2026-01-05 03:06:37 +09:00
committed by Yu Watanabe
parent c1f873b4f4
commit 8a27100d06
+6 -1
View File
@@ -1942,6 +1942,7 @@ int unit_file_verify_alias(
static int install_info_symlink_alias(
RuntimeScope scope,
UnitFileFlags file_flags,
InstallInfo *info,
const LookupPaths *lp,
const char *config_path,
@@ -1996,6 +1997,10 @@ static int install_info_symlink_alias(
broken = r == 0; /* symlink target does not exist? */
r = create_symlink(lp, alias_target ?: info->path, alias_path, force || broken, changes, n_changes);
if (r == -EEXIST && FLAGS_SET(file_flags, UNIT_FILE_IGNORE_AUXILIARY_FAILURE))
/* We cannot realize the alias because a conflicting alias exists.
* Do not propagate this as error. */
continue;
if (r != 0 && ret >= 0)
ret = r;
}
@@ -2160,7 +2165,7 @@ static int install_info_apply(
* because they might would pointing to a non-existent or wrong unit. */
return r;
r = install_info_symlink_alias(scope, info, lp, config_path, force, changes, n_changes);
r = install_info_symlink_alias(scope, file_flags, info, lp, config_path, force, changes, n_changes);
q = install_info_symlink_wants(scope, file_flags, info, lp, config_path, info->wanted_by, ".wants/", changes, n_changes);
if (q != 0 && r >= 0)