dcavalca / rpms / systemd

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