summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Vereshchagin <evvers@ya.ru>2015-10-20 02:04:10 +0000
committerEvgeny Vereshchagin <evvers@ya.ru>2015-10-20 12:55:07 +0000
commite9876fc9c5aeec0144c15cd288852ea6c6ac8c29 (patch)
tree35ff4884e27a98dcd2ba0106120b206f01ada6e0
parentec566e4c7cee67ec2c39475ef08f18a9f1b80efd (diff)
run: fix Environment parsing
* `Environment=` resets previous assignments * `Environment='a=1 b=2'` sets `a` to `1` and `b` to `2` * `Environment='"a=1 2" b=2"'` sets `a` to `1 2` and `b` to `2`
-rw-r--r--src/core/dbus-execute.c24
-rw-r--r--src/shared/bus-util.c39
2 files changed, 53 insertions, 10 deletions
diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c
index b71e5ad300..98cf0e9ff1 100644
--- a/src/core/dbus-execute.c
+++ b/src/core/dbus-execute.c
@@ -1155,18 +1155,24 @@ int bus_exec_context_set_transient_property(
_cleanup_free_ char *joined = NULL;
char **e;
- e = strv_env_merge(2, c->environment, l);
- if (!e)
- return -ENOMEM;
+ if (strv_length(l) == 0) {
+ c->environment = strv_free(c->environment);
+ unit_write_drop_in_private_format(u, mode, name, "Environment=\n");
+ } else {
+ e = strv_env_merge(2, c->environment, l);
+ if (!e)
+ return -ENOMEM;
- strv_free(c->environment);
- c->environment = e;
+ strv_free(c->environment);
+ c->environment = e;
- joined = strv_join_quoted(c->environment);
- if (!joined)
- return -ENOMEM;
+ joined = strv_join_quoted(c->environment);
+ if (!joined)
+ return -ENOMEM;
+
+ unit_write_drop_in_private_format(u, mode, name, "Environment=%s\n", joined);
+ }
- unit_write_drop_in_private_format(u, mode, name, "Environment=%s\n", joined);
}
return 1;
diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c
index 65ca173876..044862199b 100644
--- a/src/shared/bus-util.c
+++ b/src/shared/bus-util.c
@@ -31,6 +31,7 @@
#include "bus-message.h"
#include "cgroup-util.h"
#include "def.h"
+#include "env-util.h"
#include "macro.h"
#include "missing.h"
#include "path-util.h"
@@ -1642,8 +1643,44 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
r = sd_bus_message_append(m, "v", "i", i);
} else if (streq(field, "Environment")) {
+ const char *p;
- r = sd_bus_message_append(m, "v", "as", 1, eq);
+ r = sd_bus_message_open_container(m, 'v', "as");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_open_container(m, 'a', "s");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ p = eq;
+
+ for (;;) {
+ _cleanup_free_ char *word = NULL;
+
+ r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE);
+ if (r < 0) {
+ log_error("Failed to parse Environment value %s", eq);
+ return -EINVAL;
+ }
+ if (r == 0)
+ break;
+
+ if (!env_assignment_is_valid(word)) {
+ log_error("Invalid environment assignment: %s", eq);
+ return -EINVAL;
+ }
+
+ r = sd_bus_message_append_basic(m, 's', word);
+ if (r < 0)
+ return bus_log_create_error(r);
+ }
+
+ r = sd_bus_message_close_container(m);
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_close_container(m);
} else if (streq(field, "KillSignal")) {
int sig;