summaryrefslogtreecommitdiff
path: root/src/shared/install.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-27 23:11:31 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-29 19:01:41 -0500
commit7584d236eac91f9b7128b1eb08bddf18be2bce9f (patch)
tree734baeee461940fbcb12b13979d1d2541c3a837a /src/shared/install.c
parent0591220f339c313761f9a208e88fb719db566993 (diff)
install: allow specifiers in WantedBy/RequiredBy/Alias
This allows one templated unit to refer to another templated unit at installation time. Examples: > grep WantedBy ~/.config/systemd/user/mpop@.timer WantedBy=services@%i.target > srv disable mpop@iit.timer rm '/home/alxchk/.config/systemd/user/services@iit.target.wants/mpop@iit.timer' > srv enable mpop@iit.timer ln -s '/home/alxchk/.config/systemd/user/mpop@.timer' '/home/alxchk/.config/systemd/user/services@iit.target.wants/mpop@iit.timer' Based-on-patch-by: Oleksii Shevchuk <alxchk@gmail.com>
Diffstat (limited to 'src/shared/install.c')
-rw-r--r--src/shared/install.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/src/shared/install.c b/src/shared/install.c
index 24905e1af6..7fb352cfff 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -36,15 +36,8 @@
#include "install.h"
#include "conf-parser.h"
#include "conf-files.h"
-
-typedef struct {
- char *name;
- char *path;
-
- char **aliases;
- char **wanted_by;
- char **required_by;
-} InstallInfo;
+#include "specifier.h"
+#include "install-printf.h"
typedef struct {
Hashmap *will_install;
@@ -1177,16 +1170,17 @@ static int install_info_symlink_alias(
assert(config_path);
STRV_FOREACH(s, i->aliases) {
- char *alias_path;
+ char _cleanup_free_ *alias_path = NULL, *dst = NULL;
- alias_path = path_make_absolute(*s, config_path);
+ dst = install_full_printf(i, *s);
+ if (!dst)
+ return -ENOMEM;
+ alias_path = path_make_absolute(dst, config_path);
if (!alias_path)
return -ENOMEM;
q = create_symlink(i->path, alias_path, force, changes, n_changes);
- free(alias_path);
-
if (r == 0)
r = q;
}
@@ -1208,18 +1202,21 @@ static int install_info_symlink_wants(
assert(config_path);
STRV_FOREACH(s, i->wanted_by) {
- char *path;
+ char _cleanup_free_ *path = NULL, *dst = NULL;
- if (!unit_name_is_valid(*s, true)) {
+ dst = install_full_printf(i, *s);
+ if (!dst)
+ return -ENOMEM;
+
+ if (!unit_name_is_valid(dst, true)) {
r = -EINVAL;
continue;
}
- if (asprintf(&path, "%s/%s.wants/%s", config_path, *s, i->name) < 0)
+ if (asprintf(&path, "%s/%s.wants/%s", config_path, dst, i->name) < 0)
return -ENOMEM;
q = create_symlink(i->path, path, force, changes, n_changes);
- free(path);
if (r == 0)
r = q;
@@ -1242,18 +1239,21 @@ static int install_info_symlink_requires(
assert(config_path);
STRV_FOREACH(s, i->required_by) {
- char *path;
+ char _cleanup_free_ *path = NULL, *dst = NULL;
- if (!unit_name_is_valid(*s, true)) {
+ dst = install_full_printf(i, *s);
+ if (!dst)
+ return -ENOMEM;
+
+ if (!unit_name_is_valid(dst, true)) {
r = -EINVAL;
continue;
}
- if (asprintf(&path, "%s/%s.requires/%s", config_path, *s, i->name) < 0)
+ if (asprintf(&path, "%s/%s.requires/%s", config_path, dst, i->name) < 0)
return -ENOMEM;
q = create_symlink(i->path, path, force, changes, n_changes);
- free(path);
if (r == 0)
r = q;