summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-06-17 00:13:48 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-06-22 22:46:03 -0400
commitacefb01e351be2f1dbd05078fdf4522a9dadaa4d (patch)
tree4d3debd463c57ff37bdad5a1bae9301c92506b2a
parentb533ed36a5ca33ba718ad37b18d1aa175f232d03 (diff)
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)
-rw-r--r--src/shared/install.c74
1 files changed, 38 insertions, 36 deletions
diff --git a/src/shared/install.c b/src/shared/install.c
index f0d3d1b7d..e16de4d69 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -1035,67 +1035,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;