119 lines
5.3 KiB
Diff
119 lines
5.3 KiB
Diff
|
From bf160761cd5d35458779e96fa13655dd88350ccd Mon Sep 17 00:00:00 2001
|
||
|
From: Lennart Poettering <lennart@poettering.net>
|
||
|
Date: Mon, 16 Jun 2014 19:48:31 +0200
|
||
|
Subject: [PATCH] install: simplify and clarify disabling logic for instanced
|
||
|
units
|
||
|
|
||
|
(cherry picked from commit bcafe923a74e702abbba3655b0270febe143499f)
|
||
|
---
|
||
|
src/shared/install.c | 50 ++++++++++++++++++++++++++++----------------------
|
||
|
1 file changed, 28 insertions(+), 22 deletions(-)
|
||
|
|
||
|
diff --git a/src/shared/install.c b/src/shared/install.c
|
||
|
index 115d831d..40dc7beb 100644
|
||
|
--- a/src/shared/install.c
|
||
|
+++ b/src/shared/install.c
|
||
|
@@ -194,10 +194,10 @@ static int remove_marked_symlinks_fd(
|
||
|
bool *deleted,
|
||
|
UnitFileChange **changes,
|
||
|
unsigned *n_changes,
|
||
|
- char** files) {
|
||
|
+ char** instance_whitelist) {
|
||
|
|
||
|
- int r = 0;
|
||
|
_cleanup_closedir_ DIR *d = NULL;
|
||
|
+ int r = 0;
|
||
|
|
||
|
assert(remove_symlinks_to);
|
||
|
assert(fd >= 0);
|
||
|
@@ -252,9 +252,8 @@ static int remove_marked_symlinks_fd(
|
||
|
}
|
||
|
|
||
|
/* This will close nfd, regardless whether it succeeds or not */
|
||
|
- q = remove_marked_symlinks_fd(remove_symlinks_to, nfd, p, config_path, deleted, changes, n_changes, files);
|
||
|
-
|
||
|
- if (r == 0)
|
||
|
+ q = remove_marked_symlinks_fd(remove_symlinks_to, nfd, p, config_path, deleted, changes, n_changes, instance_whitelist);
|
||
|
+ if (q < 0 && r == 0)
|
||
|
r = q;
|
||
|
|
||
|
} else if (de->d_type == DT_LNK) {
|
||
|
@@ -262,6 +261,14 @@ static int remove_marked_symlinks_fd(
|
||
|
int q;
|
||
|
bool found;
|
||
|
|
||
|
+ if (!unit_name_is_valid(de->d_name, TEMPLATE_VALID))
|
||
|
+ continue;
|
||
|
+
|
||
|
+ if (unit_name_is_instance(de->d_name) &&
|
||
|
+ instance_whitelist &&
|
||
|
+ !strv_contains(instance_whitelist, de->d_name))
|
||
|
+ continue;
|
||
|
+
|
||
|
p = path_make_absolute(de->d_name, path);
|
||
|
if (!p)
|
||
|
return -ENOMEM;
|
||
|
@@ -280,30 +287,29 @@ static int remove_marked_symlinks_fd(
|
||
|
set_get(remove_symlinks_to, dest) ||
|
||
|
set_get(remove_symlinks_to, basename(dest));
|
||
|
|
||
|
- if (unit_name_is_instance(p))
|
||
|
- found = found && strv_contains(files, basename(p));
|
||
|
-
|
||
|
if (found) {
|
||
|
|
||
|
if (unlink(p) < 0 && errno != ENOENT) {
|
||
|
|
||
|
if (r == 0)
|
||
|
r = -errno;
|
||
|
- } else {
|
||
|
- rmdir_parents(p, config_path);
|
||
|
- path_kill_slashes(p);
|
||
|
+ continue;
|
||
|
+ }
|
||
|
+
|
||
|
+ rmdir_parents(p, config_path);
|
||
|
+
|
||
|
+ path_kill_slashes(p);
|
||
|
|
||
|
- add_file_change(changes, n_changes, UNIT_FILE_UNLINK, p, NULL);
|
||
|
+ add_file_change(changes, n_changes, UNIT_FILE_UNLINK, p, NULL);
|
||
|
|
||
|
- if (!set_get(remove_symlinks_to, p)) {
|
||
|
+ if (!set_get(remove_symlinks_to, p)) {
|
||
|
|
||
|
- q = mark_symlink_for_removal(&remove_symlinks_to, p);
|
||
|
- if (q < 0) {
|
||
|
- if (r == 0)
|
||
|
- r = q;
|
||
|
- } else
|
||
|
- *deleted = true;
|
||
|
- }
|
||
|
+ q = mark_symlink_for_removal(&remove_symlinks_to, p);
|
||
|
+ if (q < 0) {
|
||
|
+ if (r == 0)
|
||
|
+ r = q;
|
||
|
+ } else
|
||
|
+ *deleted = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
@@ -317,7 +323,7 @@ static int remove_marked_symlinks(
|
||
|
const char *config_path,
|
||
|
UnitFileChange **changes,
|
||
|
unsigned *n_changes,
|
||
|
- char** files) {
|
||
|
+ char** instance_whitelist) {
|
||
|
|
||
|
_cleanup_close_ int fd = -1;
|
||
|
int r = 0;
|
||
|
@@ -343,7 +349,7 @@ static int remove_marked_symlinks(
|
||
|
}
|
||
|
|
||
|
/* This takes possession of cfd and closes it */
|
||
|
- q = remove_marked_symlinks_fd(remove_symlinks_to, cfd, config_path, config_path, &deleted, changes, n_changes, files);
|
||
|
+ q = remove_marked_symlinks_fd(remove_symlinks_to, cfd, config_path, config_path, &deleted, changes, n_changes, instance_whitelist);
|
||
|
if (r == 0)
|
||
|
r = q;
|
||
|
} while (deleted);
|