dcavalca / rpms / systemd

Forked from rpms/systemd 2 years ago
Clone
Zbigniew Jędrzejewski-Szmek 7f93bc
From d1c9c8fa18b2c3d16e9db90c6faf839b0d545887 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek a59965
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek a59965
Date: Mon, 16 Jun 2014 19:48:31 +0200
Zbigniew Jędrzejewski-Szmek a59965
Subject: [PATCH] install: simplify and clarify disabling logic for instanced
Zbigniew Jędrzejewski-Szmek a59965
 units
Zbigniew Jędrzejewski-Szmek a59965
Zbigniew Jędrzejewski-Szmek a59965
(cherry picked from commit bcafe923a74e702abbba3655b0270febe143499f)
Zbigniew Jędrzejewski-Szmek a59965
Zbigniew Jędrzejewski-Szmek a59965
Conflicts:
Zbigniew Jędrzejewski-Szmek a59965
	src/shared/install.c
Zbigniew Jędrzejewski-Szmek a59965
---
Zbigniew Jędrzejewski-Szmek a59965
 src/shared/install.c | 50 ++++++++++++++++++++++++++++----------------------
Zbigniew Jędrzejewski-Szmek a59965
 1 file changed, 28 insertions(+), 22 deletions(-)
Zbigniew Jędrzejewski-Szmek a59965
Zbigniew Jędrzejewski-Szmek a59965
diff --git a/src/shared/install.c b/src/shared/install.c
Zbigniew Jędrzejewski-Szmek a59965
index 1f3ea5b..ff0a2a4 100644
Zbigniew Jędrzejewski-Szmek a59965
--- a/src/shared/install.c
Zbigniew Jędrzejewski-Szmek a59965
+++ b/src/shared/install.c
Zbigniew Jędrzejewski-Szmek a59965
@@ -194,10 +194,10 @@ static int remove_marked_symlinks_fd(
Zbigniew Jędrzejewski-Szmek a59965
                 bool *deleted,
Zbigniew Jędrzejewski-Szmek a59965
                 UnitFileChange **changes,
Zbigniew Jędrzejewski-Szmek a59965
                 unsigned *n_changes,
Zbigniew Jędrzejewski-Szmek a59965
-                char** files) {
Zbigniew Jędrzejewski-Szmek a59965
+                char** instance_whitelist) {
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
-        int r = 0;
Zbigniew Jędrzejewski-Szmek a59965
         _cleanup_closedir_ DIR *d = NULL;
Zbigniew Jędrzejewski-Szmek a59965
+        int r = 0;
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
         assert(remove_symlinks_to);
Zbigniew Jędrzejewski-Szmek a59965
         assert(fd >= 0);
Zbigniew Jędrzejewski-Szmek a59965
@@ -253,9 +253,8 @@ static int remove_marked_symlinks_fd(
Zbigniew Jędrzejewski-Szmek a59965
                         }
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
                         /* This will close nfd, regardless whether it succeeds or not */
Zbigniew Jędrzejewski-Szmek a59965
-                        q = remove_marked_symlinks_fd(remove_symlinks_to, nfd, p, config_path, deleted, changes, n_changes, files);
Zbigniew Jędrzejewski-Szmek a59965
-
Zbigniew Jędrzejewski-Szmek a59965
-                        if (r == 0)
Zbigniew Jędrzejewski-Szmek a59965
+                        q = remove_marked_symlinks_fd(remove_symlinks_to, nfd, p, config_path, deleted, changes, n_changes, instance_whitelist);
Zbigniew Jędrzejewski-Szmek a59965
+                        if (q < 0 && r == 0)
Zbigniew Jędrzejewski-Szmek a59965
                                 r = q;
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
                 } else if (de->d_type == DT_LNK) {
Zbigniew Jędrzejewski-Szmek a59965
@@ -263,6 +262,14 @@ static int remove_marked_symlinks_fd(
Zbigniew Jędrzejewski-Szmek a59965
                         int q;
Zbigniew Jędrzejewski-Szmek a59965
                         bool found;
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
+                        if (!unit_name_is_valid(de->d_name, true))
Zbigniew Jędrzejewski-Szmek a59965
+                                continue;
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
+                        if (unit_name_is_instance(de->d_name) &&
Zbigniew Jędrzejewski-Szmek a59965
+                            instance_whitelist &&
Zbigniew Jędrzejewski-Szmek a59965
+                            !strv_contains(instance_whitelist, de->d_name))
Zbigniew Jędrzejewski-Szmek a59965
+                                continue;
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
                         p = path_make_absolute(de->d_name, path);
Zbigniew Jędrzejewski-Szmek a59965
                         if (!p)
Zbigniew Jędrzejewski-Szmek a59965
                                 return -ENOMEM;
Zbigniew Jędrzejewski-Szmek a59965
@@ -281,30 +288,29 @@ static int remove_marked_symlinks_fd(
Zbigniew Jędrzejewski-Szmek a59965
                                 set_get(remove_symlinks_to, dest) ||
Zbigniew Jędrzejewski-Szmek a59965
                                 set_get(remove_symlinks_to, path_get_file_name(dest));
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
-                        if (unit_name_is_instance(p))
Zbigniew Jędrzejewski-Szmek a59965
-                                found = found && strv_contains(files, path_get_file_name(p));
Zbigniew Jędrzejewski-Szmek a59965
-
Zbigniew Jędrzejewski-Szmek a59965
                         if (found) {
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
                                 if (unlink(p) < 0 && errno != ENOENT) {
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
                                         if (r == 0)
Zbigniew Jędrzejewski-Szmek a59965
                                                 r = -errno;
Zbigniew Jędrzejewski-Szmek a59965
-                                } else {
Zbigniew Jędrzejewski-Szmek a59965
-                                        rmdir_parents(p, config_path);
Zbigniew Jędrzejewski-Szmek a59965
-                                        path_kill_slashes(p);
Zbigniew Jędrzejewski-Szmek a59965
+                                        continue;
Zbigniew Jędrzejewski-Szmek a59965
+                                }
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
+                                rmdir_parents(p, config_path);
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
+                                path_kill_slashes(p);
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
-                                        add_file_change(changes, n_changes, UNIT_FILE_UNLINK, p, NULL);
Zbigniew Jędrzejewski-Szmek a59965
+                                add_file_change(changes, n_changes, UNIT_FILE_UNLINK, p, NULL);
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
-                                        if (!set_get(remove_symlinks_to, p)) {
Zbigniew Jędrzejewski-Szmek a59965
+                                if (!set_get(remove_symlinks_to, p)) {
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
-                                                q = mark_symlink_for_removal(&remove_symlinks_to, p);
Zbigniew Jędrzejewski-Szmek a59965
-                                                if (q < 0) {
Zbigniew Jędrzejewski-Szmek a59965
-                                                        if (r == 0)
Zbigniew Jędrzejewski-Szmek a59965
-                                                                r = q;
Zbigniew Jędrzejewski-Szmek a59965
-                                                } else
Zbigniew Jędrzejewski-Szmek a59965
-                                                        *deleted = true;
Zbigniew Jędrzejewski-Szmek a59965
-                                        }
Zbigniew Jędrzejewski-Szmek a59965
+                                        q = mark_symlink_for_removal(&remove_symlinks_to, p);
Zbigniew Jędrzejewski-Szmek a59965
+                                        if (q < 0) {
Zbigniew Jędrzejewski-Szmek a59965
+                                                if (r == 0)
Zbigniew Jędrzejewski-Szmek a59965
+                                                        r = q;
Zbigniew Jędrzejewski-Szmek a59965
+                                        } else
Zbigniew Jędrzejewski-Szmek a59965
+                                                *deleted = true;
Zbigniew Jędrzejewski-Szmek a59965
                                 }
Zbigniew Jędrzejewski-Szmek a59965
                         }
Zbigniew Jędrzejewski-Szmek a59965
                 }
Zbigniew Jędrzejewski-Szmek a59965
@@ -318,7 +324,7 @@ static int remove_marked_symlinks(
Zbigniew Jędrzejewski-Szmek a59965
                 const char *config_path,
Zbigniew Jędrzejewski-Szmek a59965
                 UnitFileChange **changes,
Zbigniew Jędrzejewski-Szmek a59965
                 unsigned *n_changes,
Zbigniew Jędrzejewski-Szmek a59965
-                char** files) {
Zbigniew Jędrzejewski-Szmek a59965
+                char** instance_whitelist) {
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
         _cleanup_close_ int fd = -1;
Zbigniew Jędrzejewski-Szmek a59965
         int r = 0;
Zbigniew Jędrzejewski-Szmek a59965
@@ -344,7 +350,7 @@ static int remove_marked_symlinks(
Zbigniew Jędrzejewski-Szmek a59965
                 }
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
                 /* This takes possession of cfd and closes it */
Zbigniew Jędrzejewski-Szmek a59965
-                q = remove_marked_symlinks_fd(remove_symlinks_to, cfd, config_path, config_path, &deleted, changes, n_changes, files);
Zbigniew Jędrzejewski-Szmek a59965
+                q = remove_marked_symlinks_fd(remove_symlinks_to, cfd, config_path, config_path, &deleted, changes, n_changes, instance_whitelist);
Zbigniew Jędrzejewski-Szmek a59965
                 if (r == 0)
Zbigniew Jędrzejewski-Szmek a59965
                         r = q;
Zbigniew Jędrzejewski-Szmek a59965
         } while (deleted);