summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-07-01 01:13:47 +0200
committerLennart Poettering <lennart@poettering.net>2011-07-01 01:13:47 +0200
commit8fef76590052b235eec789f1acd24a0d1acbdaef (patch)
tree5fda27b947f5d165a827a242841cbf4825858f87
parent1fd45a90f5c99a88c268981de321d0ef8542bd4f (diff)
unit: support wildcards in Environment=, EnvironmentFile=
-rw-r--r--TODO4
-rw-r--r--src/load-fragment.c46
2 files changed, 42 insertions, 8 deletions
diff --git a/TODO b/TODO
index 155f09fc83..5901a90cdd 100644
--- a/TODO
+++ b/TODO
@@ -73,10 +73,6 @@ Features:
* GC unreferenced jobs (such as .device jobs)
-* support wildcard expansion in ListenStream= and friends
-
-* support wildcard expansion in EnvironmentFile= and friends
-
* add JoinControllers= to system.conf to mount certain cgroup
controllers together in order to guarantee atomic creation/addition
of cgroups
diff --git a/src/load-fragment.c b/src/load-fragment.c
index 30fbb57f6b..8f39839986 100644
--- a/src/load-fragment.c
+++ b/src/load-fragment.c
@@ -188,6 +188,35 @@ static int config_parse_string_printf(
return 0;
}
+static int config_parse_strv_printf(
+ const char *filename,
+ unsigned line,
+ const char *section,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ Unit *u = userdata;
+ char *k;
+ int r;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(u);
+
+ k = unit_full_printf(u, rvalue);
+ if (!k)
+ return -ENOMEM;
+
+ r = config_parse_strv(filename, line, section, lvalue, ltype, k, data, userdata);
+ free(k);
+
+ return r;
+}
+
static int config_parse_path_printf(
const char *filename,
unsigned line,
@@ -1496,18 +1525,27 @@ static int config_parse_env_file(
void *userdata) {
char ***env = data, **k;
+ Unit *u = userdata;
+ char *s;
assert(filename);
assert(lvalue);
assert(rvalue);
assert(data);
- if (!path_is_absolute(rvalue[0] == '-' ? rvalue + 1 : rvalue)) {
- log_error("[%s:%u] Path '%s' is not absolute, ignoring.", filename, line, rvalue);
+ s = unit_full_printf(u, rvalue);
+ if (!s)
+ return -ENOMEM;
+
+ if (!path_is_absolute(s[0] == '-' ? s + 1 : s)) {
+ log_error("[%s:%u] Path '%s' is not absolute, ignoring.", filename, line, s);
+ free(s);
return 0;
}
- if (!(k = strv_append(*env, rvalue)))
+ k = strv_append(*env, s);
+ free(s);
+ if (!k)
return -ENOMEM;
strv_free(*env);
@@ -1892,7 +1930,7 @@ static int load_from_path(Unit *u, const char *path) {
{ "CPUSchedulingResetOnFork", config_parse_bool, 0, &(context).cpu_sched_reset_on_fork, section }, \
{ "CPUAffinity", config_parse_cpu_affinity, 0, &(context), section }, \
{ "UMask", config_parse_mode, 0, &(context).umask, section }, \
- { "Environment", config_parse_strv, 0, &(context).environment, section }, \
+ { "Environment", config_parse_strv_printf, 0, &(context).environment, section }, \
{ "EnvironmentFile", config_parse_env_file, 0, &(context).environment_files, section }, \
{ "StandardInput", config_parse_input, 0, &(context).std_input, section }, \
{ "StandardOutput", config_parse_output, 0, &(context).std_output, section }, \