From: Zbigniew Jędrzejewski-Szmek Date: Sun, 4 Jan 2026 14:10:42 +0000 (+0100) Subject: shared/install: ignore aliasing failure when doing presets X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a27100d0696d971525efcd8e59b504f56a0b6f8;p=thirdparty%2Fsystemd.git 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 ad5fdd391248432e0c105003a8a13f821bde0b8e: when enabling the unit through 'preset' or 'preset-all', print the message, but suppress the error. When enabling through 'enable', fail the operation. --- diff --git a/src/shared/install.c b/src/shared/install.c index a22c6df2f7b..d85ac2df628 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -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)