summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/update-alternatives.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/utils/update-alternatives.c b/utils/update-alternatives.c
index 03ceb6d26..e7516aaef 100644
--- a/utils/update-alternatives.c
+++ b/utils/update-alternatives.c
@@ -1646,25 +1646,39 @@ alternative_commit(struct alternative *a)
alternative_commit_operations_free(a);
}
-static bool
-alternative_can_replace_path(const char *linkname)
+enum alternative_path_status {
+ ALT_PATH_SYMLINK,
+ ALT_PATH_MISSING,
+ ALT_PATH_OTHER,
+};
+
+static enum alternative_path_status
+alternative_path_classify(const char *linkname)
{
struct stat st;
- bool replace_link;
-
- if (opt_force)
- return true;
errno = 0;
if (lstat(linkname, &st) == -1) {
if (errno != ENOENT)
syserr(_("cannot stat file '%s'"), linkname);
- replace_link = true;
+ return ALT_PATH_MISSING;
+ } else if (S_ISLNK(st.st_mode)) {
+ return ALT_PATH_SYMLINK;
} else {
- replace_link = S_ISLNK(st.st_mode);
+ return ALT_PATH_OTHER;
}
+}
- return replace_link;
+static bool
+alternative_can_replace_path(const char *linkname)
+{
+ if (opt_force)
+ return true;
+
+ if (alternative_path_classify(linkname) == ALT_PATH_OTHER)
+ return false;
+ else
+ return true;
}
static void