systemctl: enable: overwrite broken alias symlinks

When switching to an alternative alias provider,
the previous one might have been uninstalled or so.
It should be fine for us to overwrite them directly.

Closes #23694
This commit is contained in:
Mike Yuan 2022-12-29 14:51:06 +08:00 committed by Luca Boccassi
parent 44db9fbb39
commit c067e61b85

View file

@ -1892,6 +1892,7 @@ static int install_info_symlink_alias(
STRV_FOREACH(s, info->aliases) {
_cleanup_free_ char *alias_path = NULL, *dst = NULL, *dst_updated = NULL;
bool broken;
q = install_name_printf(scope, info, *s, &dst);
if (q < 0) {
@ -1912,7 +1913,14 @@ static int install_info_symlink_alias(
if (!alias_path)
return -ENOMEM;
q = create_symlink(lp, info->path, alias_path, force, changes, n_changes);
q = chase_symlinks(alias_path, lp->root_dir, CHASE_NONEXISTENT, NULL, NULL);
if (q < 0 && q != -ENOENT) {
r = r < 0 ? r : q;
continue;
}
broken = q == 0; /* symlink target does not exist? */
q = create_symlink(lp, info->path, alias_path, force || broken, changes, n_changes);
r = r < 0 ? r : q;
}