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