From: Mike Yuan Date: Thu, 29 Dec 2022 06:51:06 +0000 (+0800) Subject: systemctl: enable: overwrite broken alias symlinks X-Git-Tag: v253-rc1~189 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c067e61b85f7b542125c16cc35db9194d23d9455;p=thirdparty%2Fsystemd.git 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 --- diff --git a/src/shared/install.c b/src/shared/install.c index db150247fc9..dc6e12fd06f 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -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; }