dcavalca / rpms / systemd

Forked from rpms/systemd 4 months ago
Clone
Zbigniew Jędrzejewski-Szmek 5509c0
From acefb01e351be2f1dbd05078fdf4522a9dadaa4d Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 5509c0
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek 5509c0
Date: Tue, 17 Jun 2014 00:13:48 +0200
Zbigniew Jędrzejewski-Szmek 5509c0
Subject: [PATCH] install: when looking for a unit file for enabling, search
Zbigniew Jędrzejewski-Szmek 5509c0
 for templates only after traversing all search directories
Zbigniew Jędrzejewski-Szmek 5509c0
Zbigniew Jędrzejewski-Szmek 5509c0
Let's always make sure to look in all search directories for the full
Zbigniew Jędrzejewski-Szmek 5509c0
unit names first, before looking for templates for them.
Zbigniew Jędrzejewski-Szmek 5509c0
Zbigniew Jędrzejewski-Szmek 5509c0
(cherry picked from commit e50bd775163cd96be1888943a8785a436be710e8)
Zbigniew Jędrzejewski-Szmek 5509c0
---
Zbigniew Jędrzejewski-Szmek 5509c0
 src/shared/install.c | 74 +++++++++++++++++++++++++++-------------------------
Zbigniew Jędrzejewski-Szmek 5509c0
 1 file changed, 38 insertions(+), 36 deletions(-)
Zbigniew Jędrzejewski-Szmek 5509c0
Zbigniew Jędrzejewski-Szmek 5509c0
diff --git a/src/shared/install.c b/src/shared/install.c
Zbigniew Jędrzejewski-Szmek 5509c0
index f0d3d1b7..e16de4d6 100644
Zbigniew Jędrzejewski-Szmek 5509c0
--- a/src/shared/install.c
Zbigniew Jędrzejewski-Szmek 5509c0
+++ b/src/shared/install.c
Zbigniew Jędrzejewski-Szmek 5509c0
@@ -1035,67 +1035,69 @@ static int unit_file_search(
Zbigniew Jędrzejewski-Szmek 5509c0
         assert(paths);
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
         if (info->path) {
Zbigniew Jędrzejewski-Szmek 5509c0
-                char *full_path = NULL;
Zbigniew Jędrzejewski-Szmek 5509c0
+                const char *path;
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
-                if (!isempty(root_dir))
Zbigniew Jędrzejewski-Szmek 5509c0
-                        full_path = strappenda(root_dir, info->path);
Zbigniew Jędrzejewski-Szmek 5509c0
+                if (isempty(root_dir))
Zbigniew Jędrzejewski-Szmek 5509c0
+                        path = info->path;
Zbigniew Jędrzejewski-Szmek 5509c0
+                else
Zbigniew Jędrzejewski-Szmek 5509c0
+                        path = strappenda(root_dir, info->path);
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
-                return unit_file_load(c, info, full_path ?: info->path, allow_symlink);
Zbigniew Jędrzejewski-Szmek 5509c0
+                return unit_file_load(c, info, path, allow_symlink);
Zbigniew Jędrzejewski-Szmek 5509c0
         }
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
         assert(info->name);
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
         STRV_FOREACH(p, paths->unit_path) {
Zbigniew Jędrzejewski-Szmek 5509c0
-                _cleanup_free_ char *path = NULL, *full_path = NULL;
Zbigniew Jędrzejewski-Szmek 5509c0
+                _cleanup_free_ char *path = NULL;
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
-                path = strjoin(*p, "/", info->name, NULL);
Zbigniew Jędrzejewski-Szmek 5509c0
+                if (isempty(root_dir))
Zbigniew Jędrzejewski-Szmek 5509c0
+                        path = strjoin(*p, "/", info->name, NULL);
Zbigniew Jędrzejewski-Szmek 5509c0
+                else
Zbigniew Jędrzejewski-Szmek 5509c0
+                        path = strjoin(root_dir, "/", *p, "/", info->name, NULL);
Zbigniew Jędrzejewski-Szmek 5509c0
                 if (!path)
Zbigniew Jędrzejewski-Szmek 5509c0
                         return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
-                if (!isempty(root_dir)) {
Zbigniew Jędrzejewski-Szmek 5509c0
-                        full_path = strappend(root_dir, path);
Zbigniew Jędrzejewski-Szmek 5509c0
-                        if (!full_path)
Zbigniew Jędrzejewski-Szmek 5509c0
-                                return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 5509c0
-                }
Zbigniew Jędrzejewski-Szmek 5509c0
-
Zbigniew Jędrzejewski-Szmek 5509c0
-                r = unit_file_load(c, info, full_path ?: path, allow_symlink);
Zbigniew Jędrzejewski-Szmek 5509c0
+                r = unit_file_load(c, info, path, allow_symlink);
Zbigniew Jędrzejewski-Szmek 5509c0
                 if (r >= 0) {
Zbigniew Jędrzejewski-Szmek 5509c0
                         info->path = path;
Zbigniew Jędrzejewski-Szmek 5509c0
                         path = NULL;
Zbigniew Jędrzejewski-Szmek 5509c0
-                } else if (r == -ENOENT && unit_name_is_instance(info->name)) {
Zbigniew Jędrzejewski-Szmek 5509c0
-                        /* Unit file doesn't exist, however instance enablement was requested.
Zbigniew Jędrzejewski-Szmek 5509c0
-                         * We will check if it is possible to load template unit file. */
Zbigniew Jędrzejewski-Szmek 5509c0
-                        _cleanup_free_ char *template = NULL, *template_dir = NULL;
Zbigniew Jędrzejewski-Szmek 5509c0
+                        return r;
Zbigniew Jędrzejewski-Szmek 5509c0
+                }
Zbigniew Jędrzejewski-Szmek 5509c0
+                if (r != -ENOENT && r != -ELOOP)
Zbigniew Jędrzejewski-Szmek 5509c0
+                        return r;
Zbigniew Jędrzejewski-Szmek 5509c0
+        }
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
-                        template = unit_name_template(info->name);
Zbigniew Jędrzejewski-Szmek 5509c0
-                        if (!template)
Zbigniew Jędrzejewski-Szmek 5509c0
-                                return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 5509c0
+        if (unit_name_is_instance(info->name)) {
Zbigniew Jędrzejewski-Szmek 5509c0
+
Zbigniew Jędrzejewski-Szmek 5509c0
+                /* Unit file doesn't exist, however instance
Zbigniew Jędrzejewski-Szmek 5509c0
+                 * enablement was requested.  We will check if it is
Zbigniew Jędrzejewski-Szmek 5509c0
+                 * possible to load template unit file. */
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
-                        /* We will reuse path variable since we don't need it anymore. */
Zbigniew Jędrzejewski-Szmek 5509c0
-                        template_dir = path;
Zbigniew Jędrzejewski-Szmek 5509c0
-                        *(strrchr(template_dir, '/') + 1) = '\0';
Zbigniew Jędrzejewski-Szmek 5509c0
+                _cleanup_free_ char *template = NULL, *template_dir = NULL;
Zbigniew Jędrzejewski-Szmek 5509c0
+
Zbigniew Jędrzejewski-Szmek 5509c0
+                template = unit_name_template(info->name);
Zbigniew Jędrzejewski-Szmek 5509c0
+                if (!template)
Zbigniew Jędrzejewski-Szmek 5509c0
+                        return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
-                        path = strappend(template_dir, template);
Zbigniew Jędrzejewski-Szmek 5509c0
+                STRV_FOREACH(p, paths->unit_path) {
Zbigniew Jędrzejewski-Szmek 5509c0
+                        _cleanup_free_ char *path = NULL;
Zbigniew Jędrzejewski-Szmek 5509c0
+
Zbigniew Jędrzejewski-Szmek 5509c0
+                        if (isempty(root_dir))
Zbigniew Jędrzejewski-Szmek 5509c0
+                                path = strjoin(*p, "/", template, NULL);
Zbigniew Jędrzejewski-Szmek 5509c0
+                        else
Zbigniew Jędrzejewski-Szmek 5509c0
+                                path = strjoin(root_dir, "/", *p, "/", template, NULL);
Zbigniew Jędrzejewski-Szmek 5509c0
                         if (!path)
Zbigniew Jędrzejewski-Szmek 5509c0
                                 return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
-                        if (!isempty(root_dir)) {
Zbigniew Jędrzejewski-Szmek 5509c0
-                                free(full_path);
Zbigniew Jędrzejewski-Szmek 5509c0
-                                full_path = strappend(root_dir, path);
Zbigniew Jędrzejewski-Szmek 5509c0
-                                if (!full_path)
Zbigniew Jędrzejewski-Szmek 5509c0
-                                        return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 5509c0
-                        }
Zbigniew Jędrzejewski-Szmek 5509c0
-
Zbigniew Jędrzejewski-Szmek 5509c0
-                        /* Let's try to load template unit. */
Zbigniew Jędrzejewski-Szmek 5509c0
-                        r = unit_file_load(c, info, full_path ?: path, allow_symlink);
Zbigniew Jędrzejewski-Szmek 5509c0
+                        r = unit_file_load(c, info, path, allow_symlink);
Zbigniew Jędrzejewski-Szmek 5509c0
                         if (r >= 0) {
Zbigniew Jędrzejewski-Szmek 5509c0
                                 info->path = path;
Zbigniew Jędrzejewski-Szmek 5509c0
                                 path = NULL;
Zbigniew Jędrzejewski-Szmek 5509c0
+                                return r;
Zbigniew Jędrzejewski-Szmek 5509c0
                         }
Zbigniew Jędrzejewski-Szmek 5509c0
+                        if (r != -ENOENT && r != -ELOOP)
Zbigniew Jędrzejewski-Szmek 5509c0
+                                return r;
Zbigniew Jędrzejewski-Szmek 5509c0
                 }
Zbigniew Jędrzejewski-Szmek 5509c0
-
Zbigniew Jędrzejewski-Szmek 5509c0
-                if (r != -ENOENT && r != -ELOOP)
Zbigniew Jędrzejewski-Szmek 5509c0
-                        return r;
Zbigniew Jędrzejewski-Szmek 5509c0
         }
Zbigniew Jędrzejewski-Szmek 5509c0
 
Zbigniew Jędrzejewski-Szmek 5509c0
         return -ENOENT;