|
|
9fc0f6 |
From 6dadf44d7062c38c3f4f782da3cd88114dceb959 Mon Sep 17 00:00:00 2001
|
|
|
9fc0f6 |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
|
9fc0f6 |
Date: Mon, 21 Apr 2014 19:17:40 -0400
|
|
|
9fc0f6 |
Subject: [PATCH] shared/install: do not prefix created symlink with root path
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
Before: /var/tmp/inst1//etc/systemd/system/default.target -> /var/tmp/inst1//usr/lib/systemd/system/graphical.target
|
|
|
9fc0f6 |
After: /var/tmp/inst1/etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
(cherry picked from commit 62b002337727093c21d020c730bd65971f7783a7)
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
Related: #1111199
|
|
|
9fc0f6 |
---
|
|
|
9fc0f6 |
src/shared/install.c | 89 +++++++++++++++++++++++++---------------------------
|
|
|
9fc0f6 |
1 file changed, 43 insertions(+), 46 deletions(-)
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
diff --git a/src/shared/install.c b/src/shared/install.c
|
|
|
9fc0f6 |
index 7dad66d..955a9bc 100644
|
|
|
9fc0f6 |
--- a/src/shared/install.c
|
|
|
9fc0f6 |
+++ b/src/shared/install.c
|
|
|
9fc0f6 |
@@ -1073,67 +1073,64 @@ static int unit_file_search(
|
|
|
9fc0f6 |
assert(info);
|
|
|
9fc0f6 |
assert(paths);
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
- if (info->path)
|
|
|
9fc0f6 |
- return unit_file_load(c, info, info->path, allow_symlink);
|
|
|
9fc0f6 |
+ if (info->path) {
|
|
|
9fc0f6 |
+ char *full_path = NULL;
|
|
|
9fc0f6 |
+
|
|
|
9fc0f6 |
+ if (!isempty(root_dir))
|
|
|
9fc0f6 |
+ full_path = strappenda(root_dir, info->path);
|
|
|
9fc0f6 |
+
|
|
|
9fc0f6 |
+ return unit_file_load(c, info, full_path ?: info->path, allow_symlink);
|
|
|
9fc0f6 |
+ }
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
assert(info->name);
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
STRV_FOREACH(p, paths->unit_path) {
|
|
|
9fc0f6 |
- char *path = NULL;
|
|
|
9fc0f6 |
-
|
|
|
9fc0f6 |
- if (isempty(root_dir))
|
|
|
9fc0f6 |
- asprintf(&path, "%s/%s", *p, info->name);
|
|
|
9fc0f6 |
- else
|
|
|
9fc0f6 |
- asprintf(&path, "%s/%s/%s", root_dir, *p, info->name);
|
|
|
9fc0f6 |
+ _cleanup_free_ char *path = NULL, *full_path = NULL;
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
+ path = strjoin(*p, "/", info->name, NULL);
|
|
|
9fc0f6 |
if (!path)
|
|
|
9fc0f6 |
return -ENOMEM;
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
- r = unit_file_load(c, info, path, allow_symlink);
|
|
|
9fc0f6 |
+ if (!isempty(root_dir)) {
|
|
|
9fc0f6 |
+ full_path = strappend(root_dir, path);
|
|
|
9fc0f6 |
+ if (!full_path)
|
|
|
9fc0f6 |
+ return -ENOMEM;
|
|
|
9fc0f6 |
+ }
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
- if (r >= 0)
|
|
|
9fc0f6 |
+ r = unit_file_load(c, info, full_path ?: path, allow_symlink);
|
|
|
9fc0f6 |
+ if (r >= 0) {
|
|
|
9fc0f6 |
info->path = path;
|
|
|
9fc0f6 |
- else {
|
|
|
9fc0f6 |
- if (r == -ENOENT && unit_name_is_instance(info->name)) {
|
|
|
9fc0f6 |
- /* Unit file doesn't exist, however instance enablement was requested.
|
|
|
9fc0f6 |
- * We will check if it is possible to load template unit file. */
|
|
|
9fc0f6 |
- char *template = NULL,
|
|
|
9fc0f6 |
- *template_path = NULL,
|
|
|
9fc0f6 |
- *template_dir = NULL;
|
|
|
9fc0f6 |
-
|
|
|
9fc0f6 |
- template = unit_name_template(info->name);
|
|
|
9fc0f6 |
- if (!template) {
|
|
|
9fc0f6 |
- free(path);
|
|
|
9fc0f6 |
- return -ENOMEM;
|
|
|
9fc0f6 |
- }
|
|
|
9fc0f6 |
+ path = NULL;
|
|
|
9fc0f6 |
+ } else if (r == -ENOENT && unit_name_is_instance(info->name)) {
|
|
|
9fc0f6 |
+ /* Unit file doesn't exist, however instance enablement was requested.
|
|
|
9fc0f6 |
+ * We will check if it is possible to load template unit file. */
|
|
|
9fc0f6 |
+ _cleanup_free_ char *template = NULL, *template_dir = NULL;
|
|
|
9fc0f6 |
+
|
|
|
9fc0f6 |
+ template = unit_name_template(info->name);
|
|
|
9fc0f6 |
+ if (!template)
|
|
|
9fc0f6 |
+ return -ENOMEM;
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
- /* We will reuse path variable since we don't need it anymore. */
|
|
|
9fc0f6 |
- template_dir = path;
|
|
|
9fc0f6 |
- *(strrchr(path, '/') + 1) = '\0';
|
|
|
9fc0f6 |
+ /* We will reuse path variable since we don't need it anymore. */
|
|
|
9fc0f6 |
+ template_dir = path;
|
|
|
9fc0f6 |
+ *(strrchr(template_dir, '/') + 1) = '\0';
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
- template_path = strjoin(template_dir, template, NULL);
|
|
|
9fc0f6 |
- if (!template_path) {
|
|
|
9fc0f6 |
- free(path);
|
|
|
9fc0f6 |
- free(template);
|
|
|
9fc0f6 |
- return -ENOMEM;
|
|
|
9fc0f6 |
- }
|
|
|
9fc0f6 |
+ path = strappend(template_dir, template);
|
|
|
9fc0f6 |
+ if (!path)
|
|
|
9fc0f6 |
+ return -ENOMEM;
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
- /* Let's try to load template unit. */
|
|
|
9fc0f6 |
- r = unit_file_load(c, info, template_path, allow_symlink);
|
|
|
9fc0f6 |
- if (r >= 0) {
|
|
|
9fc0f6 |
- info->path = strdup(template_path);
|
|
|
9fc0f6 |
- if (!info->path) {
|
|
|
9fc0f6 |
- free(path);
|
|
|
9fc0f6 |
- free(template);
|
|
|
9fc0f6 |
- free(template_path);
|
|
|
9fc0f6 |
- return -ENOMEM;
|
|
|
9fc0f6 |
- }
|
|
|
9fc0f6 |
- }
|
|
|
9fc0f6 |
+ if (!isempty(root_dir)) {
|
|
|
9fc0f6 |
+ free(full_path);
|
|
|
9fc0f6 |
+ full_path = strappend(root_dir, path);
|
|
|
9fc0f6 |
+ if (!full_path)
|
|
|
9fc0f6 |
+ return -ENOMEM;
|
|
|
9fc0f6 |
+ }
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
- free(template);
|
|
|
9fc0f6 |
- free(template_path);
|
|
|
9fc0f6 |
+ /* Let's try to load template unit. */
|
|
|
9fc0f6 |
+ r = unit_file_load(c, info, full_path ?: path, allow_symlink);
|
|
|
9fc0f6 |
+ if (r >= 0) {
|
|
|
9fc0f6 |
+ info->path = path;
|
|
|
9fc0f6 |
+ path = NULL;
|
|
|
9fc0f6 |
}
|
|
|
9fc0f6 |
- free(path);
|
|
|
9fc0f6 |
}
|
|
|
9fc0f6 |
|
|
|
9fc0f6 |
if (r != -ENOENT && r != -ELOOP)
|