]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Revert "fix handling of templates instantiated in /usr/lib (#5263)"
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 8 Feb 2017 00:49:47 +0000 (19:49 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 8 Feb 2017 00:49:55 +0000 (19:49 -0500)
This reverts commit 0698b674920aa8a56dbd6a625729a35e5ae9c5df.

It was supposed to be merged, not squashed.

src/shared/install.c
src/test/test-install-root.c

index f25ed685f64a45148aca0099952a0b9205ad28b7..478abac8abfb8fb8f3cf5cbac974cf98361df5d6 100644 (file)
@@ -208,7 +208,7 @@ static int path_is_control(const LookupPaths *p, const char *path) {
                path_equal_ptr(parent, p->runtime_control);
 }
 
-static int path_is_config(const LookupPaths *p, const char *path, bool check_parent) {
+static int path_is_config(const LookupPaths *p, const char *path) {
         _cleanup_free_ char *parent = NULL;
 
         assert(p);
@@ -217,19 +217,15 @@ static int path_is_config(const LookupPaths *p, const char *path, bool check_par
         /* Note that we do *not* have generic checks for /etc or /run in place, since with
          * them we couldn't discern configuration from transient or generated units */
 
-        if (check_parent) {
-                parent = dirname_malloc(path);
-                if (!parent)
-                        return -ENOMEM;
-
-                path = parent;
-        }
+        parent = dirname_malloc(path);
+        if (!parent)
+                return -ENOMEM;
 
-        return path_equal_ptr(path, p->persistent_config) ||
-               path_equal_ptr(path, p->runtime_config);
+        return path_equal_ptr(parent, p->persistent_config) ||
+               path_equal_ptr(parent, p->runtime_config);
 }
 
-static int path_is_runtime(const LookupPaths *p, const char *path, bool check_parent) {
+static int path_is_runtime(const LookupPaths *p, const char *path) {
         _cleanup_free_ char *parent = NULL;
         const char *rpath;
 
@@ -243,20 +239,16 @@ static int path_is_runtime(const LookupPaths *p, const char *path, bool check_pa
         if (rpath && path_startswith(rpath, "/run"))
                 return true;
 
-        if (check_parent) {
-                parent = dirname_malloc(path);
-                if (!parent)
-                        return -ENOMEM;
-
-                path = parent;
-        }
+        parent = dirname_malloc(path);
+        if (!parent)
+                return -ENOMEM;
 
-        return path_equal_ptr(path, p->runtime_config) ||
-               path_equal_ptr(path, p->generator) ||
-               path_equal_ptr(path, p->generator_early) ||
-               path_equal_ptr(path, p->generator_late) ||
-               path_equal_ptr(path, p->transient) ||
-               path_equal_ptr(path, p->runtime_control);
+        return path_equal_ptr(parent, p->runtime_config) ||
+               path_equal_ptr(parent, p->generator) ||
+               path_equal_ptr(parent, p->generator_early) ||
+               path_equal_ptr(parent, p->generator_late) ||
+               path_equal_ptr(parent, p->transient) ||
+               path_equal_ptr(parent, p->runtime_control);
 }
 
 static int path_is_vendor(const LookupPaths *p, const char *path) {
@@ -685,6 +677,7 @@ static int find_symlinks_fd(
                 int fd,
                 const char *path,
                 const char *config_path,
+                const LookupPaths *lp,
                 bool *same_name_link) {
 
         _cleanup_closedir_ DIR *d = NULL;
@@ -695,6 +688,7 @@ static int find_symlinks_fd(
         assert(fd >= 0);
         assert(path);
         assert(config_path);
+        assert(lp);
         assert(same_name_link);
 
         d = fdopendir(fd);
@@ -728,7 +722,7 @@ static int find_symlinks_fd(
                         }
 
                         /* This will close nfd, regardless whether it succeeds or not */
-                        q = find_symlinks_fd(root_dir, name, nfd, p, config_path, same_name_link);
+                        q = find_symlinks_fd(root_dir, name, nfd, p, config_path, lp, same_name_link);
                         if (q > 0)
                                 return 1;
                         if (r == 0)
@@ -806,6 +800,7 @@ static int find_symlinks(
                 const char *root_dir,
                 const char *name,
                 const char *config_path,
+                const LookupPaths *lp,
                 bool *same_name_link) {
 
         int fd;
@@ -822,82 +817,44 @@ static int find_symlinks(
         }
 
         /* This takes possession of fd and closes it */
-        return find_symlinks_fd(root_dir, name, fd, config_path, config_path, same_name_link);
+        return find_symlinks_fd(root_dir, name, fd, config_path, config_path, lp, same_name_link);
 }
 
 static int find_symlinks_in_scope(
+                UnitFileScope scope,
                 const LookupPaths *paths,
                 const char *name,
                 UnitFileState *state) {
 
-        bool same_name_link_runtime = false, same_name_link_config = false;
-        bool enabled_in_runtime = false, enabled_at_all = false;
-        char **p;
+        bool same_name_link_runtime = false, same_name_link = false;
         int r;
 
+        assert(scope >= 0);
+        assert(scope < _UNIT_FILE_SCOPE_MAX);
         assert(paths);
         assert(name);
 
-        STRV_FOREACH(p, paths->search_path)  {
-                bool same_name_link = false;
-
-                r = find_symlinks(paths->root_dir, name, *p, &same_name_link);
-                if (r < 0)
-                        return r;
-                if (r > 0) {
-                        /* We found symlinks in this dir? Yay! Let's see where precisely it is enabled. */
-
-                        r = path_is_config(paths, *p, false);
-                        if (r < 0)
-                                return r;
-                        if (r > 0) {
-                                /* This is the best outcome, let's return it immediately. */
-                                *state = UNIT_FILE_ENABLED;
-                                return 1;
-                        }
-
-                        r = path_is_runtime(paths, *p, false);
-                        if (r < 0)
-                                return r;
-                        if (r > 0)
-                                enabled_in_runtime = true;
-                        else
-                                enabled_at_all = true;
-
-                } else if (same_name_link) {
-
-                        r = path_is_config(paths, *p, false);
-                        if (r < 0)
-                                return r;
-                        if (r > 0)
-                                same_name_link_config = true;
-                        else {
-                                r = path_is_runtime(paths, *p, false);
-                                if (r < 0)
-                                        return r;
-                                if (r > 0)
-                                        same_name_link_runtime = true;
-                        }
-                }
+        /* First look in the persistent config path */
+        r = find_symlinks(paths->root_dir, name, paths->persistent_config, paths, &same_name_link);
+        if (r < 0)
+                return r;
+        if (r > 0) {
+                *state = UNIT_FILE_ENABLED;
+                return r;
         }
 
-        if (enabled_in_runtime) {
+        /* Then look in runtime config path */
+        r = find_symlinks(paths->root_dir, name, paths->runtime_config, paths, &same_name_link_runtime);
+        if (r < 0)
+                return r;
+        if (r > 0) {
                 *state = UNIT_FILE_ENABLED_RUNTIME;
-                return 1;
-        }
-
-        /* Here's a special rule: if the unit we are looking for is an instance, and it symlinked in the search path
-         * outside of runtime and configuration directory, then we consider it statically enabled. Note we do that only
-         * for instance, not for regular names, as those are merely aliases, while instances explicitly instantiate
-         * something, and hence are a much stronger concept. */
-        if (enabled_at_all && unit_name_is_valid(name, UNIT_NAME_INSTANCE)) {
-                *state = UNIT_FILE_STATIC;
-                return 1;
+                return r;
         }
 
         /* Hmm, we didn't find it, but maybe we found the same name
          * link? */
-        if (same_name_link_config) {
+        if (same_name_link) {
                 *state = UNIT_FILE_LINKED;
                 return 1;
         }
@@ -1397,8 +1354,7 @@ static int install_info_follow(
                 InstallContext *c,
                 UnitFileInstallInfo *i,
                 const char *root_dir,
-                SearchFlags flags,
-                bool ignore_different_name) {
+                SearchFlags flags) {
 
         assert(c);
         assert(i);
@@ -1411,7 +1367,7 @@ static int install_info_follow(
         /* If the basename doesn't match, the caller should add a
          * complete new entry for this. */
 
-        if (!ignore_different_name && !streq(basename(i->symlink_target), i->name))
+        if (!streq(basename(i->symlink_target), i->name))
                 return -EXDEV;
 
         free_and_replace(i->path, i->symlink_target);
@@ -1452,14 +1408,14 @@ static int install_info_traverse(
                         return -ELOOP;
 
                 if (!(flags & SEARCH_FOLLOW_CONFIG_SYMLINKS)) {
-                        r = path_is_config(paths, i->path, true);
+                        r = path_is_config(paths, i->path);
                         if (r < 0)
                                 return r;
                         if (r > 0)
                                 return -ELOOP;
                 }
 
-                r = install_info_follow(c, i, paths->root_dir, flags, false);
+                r = install_info_follow(c, i, paths->root_dir, flags);
                 if (r == -EXDEV) {
                         _cleanup_free_ char *buffer = NULL;
                         const char *bn;
@@ -1483,18 +1439,6 @@ static int install_info_traverse(
                                 if (r < 0)
                                         return r;
 
-                                if (streq(buffer, i->name)) {
-
-                                        /* We filled in the instance, and the target stayed the same? If so, then let's
-                                         * honour the link as it is. */
-
-                                        r = install_info_follow(c, i, paths->root_dir, flags, true);
-                                        if (r < 0)
-                                                return r;
-
-                                        continue;
-                                }
-
                                 bn = buffer;
                         }
 
@@ -2083,7 +2027,7 @@ static int path_shall_revert(const LookupPaths *paths, const char *path) {
 
         /* Checks whether the path is one where the drop-in directories shall be removed. */
 
-        r = path_is_config(paths, path, true);
+        r = path_is_config(paths, path);
         if (r != 0)
                 return r;
 
@@ -2191,7 +2135,7 @@ int unit_file_revert(
                                 if (errno != ENOENT)
                                         return -errno;
                         } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-                                r = path_is_config(&paths, path, true);
+                                r = path_is_config(&paths, path);
                                 if (r < 0)
                                         return r;
                                 if (r > 0) {
@@ -2537,7 +2481,7 @@ static int unit_file_lookup_state(
         switch (i->type) {
 
         case UNIT_FILE_TYPE_MASKED:
-                r = path_is_runtime(paths, i->path, true);
+                r = path_is_runtime(paths, i->path);
                 if (r < 0)
                         return r;
 
@@ -2561,7 +2505,7 @@ static int unit_file_lookup_state(
                         break;
                 }
 
-                r = find_symlinks_in_scope(paths, i->name, &state);
+                r = find_symlinks_in_scope(scope, paths, i->name, &state);
                 if (r < 0)
                         return r;
                 if (r == 0) {
index 575401cb91ba148307cb45a7e111c688f91b0467..d0bc8004f3407ff49507071d0a0e9f747fceab29 100644 (file)
@@ -736,28 +736,6 @@ static void test_preset_order(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "prefix-2.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 }
 
-static void test_static_instance(const char *root) {
-        UnitFileState state;
-        const char *p;
-
-        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@.service", &state) == -ENOENT);
-        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@foo.service", &state) == -ENOENT);
-
-        p = strjoina(root, "/usr/lib/systemd/system/static-instance@.service");
-        assert_se(write_string_file(p,
-                                    "[Install]\n"
-                                    "WantedBy=multi-user.target\n", WRITE_STRING_FILE_CREATE) >= 0);
-
-        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
-        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@foo.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
-
-        p = strjoina(root, "/usr/lib/systemd/system/static-instance@foo.service");
-        assert_se(symlink("static-instance@.service", p) >= 0);
-
-        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
-        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@foo.service", &state) >= 0 && state == UNIT_FILE_STATIC);
-}
-
 int main(int argc, char *argv[]) {
         char root[] = "/tmp/rootXXXXXX";
         const char *p;
@@ -788,7 +766,6 @@ int main(int argc, char *argv[]) {
         test_preset_and_list(root);
         test_preset_order(root);
         test_revert(root);
-        test_static_instance(root);
 
         assert_se(rm_rf(root, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);