[systemd-devel] [PATCH] Pass environment over daemon-reexec

Oleksii Shevchuk alxchk at gmail.com
Fri Feb 8 00:08:11 PST 2013


Fixes this bug:
alxchk > systemctl --user set-environment A=B
alxchk > systemctl --user show-environment | grep ^A=
A=B
alxchk > systemctl --user daemon-reexec
alxchk > systemctl --user show-environment | grep ^A=
alxchk >
alxchk > dctl set-environment A=$(echo -e "A\nB")
alxchk > dctl show-environment | grep -A 1 ^A=
A=A
B
alxchk > dctl daemon-reexec
alxchk > dctl show-environment | grep -A 1 ^A=
A=A
B
alxchk >
---
 src/core/manager.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/core/manager.c b/src/core/manager.c
index c8d7d70..f54fb7b 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -1852,6 +1852,7 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) {
         Iterator i;
         Unit *u;
         const char *t;
+        char **e;
         int r;
 
         assert(m);
@@ -1875,6 +1876,13 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) {
                 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
         }
 
+        STRV_FOREACH(e, m->environment) {
+                _cleanup_free_ char *ce = cescape(*e);
+
+                if (ce)
+                        fprintf(f, "env=%s\n", *e);
+        }
+
         fputc('\n', f);
 
         HASHMAP_FOREACH_KEY(u, t, m->units, i) {
@@ -1975,6 +1983,27 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
                 else if (startswith(l, "finish-timestamp="))
                         dual_timestamp_deserialize(l+17, &m->finish_timestamp);
+                else if (startswith(l, "env="))
+                        {
+                                _cleanup_free_
+                                char *uce = NULL;
+                                char ** e = NULL;
+
+                                uce = cunescape(l+4);
+                                if (! uce) {
+                                        r = -ENOMEM;
+                                        goto finish;
+                                }
+
+                                e = strv_env_set(m->environment, uce);
+                                if (! e) {
+                                        r = -ENOMEM;
+                                        goto finish;
+                                }
+
+                                strv_free(m->environment);
+                                m->environment = e;
+                        }
                 else
                         log_debug("Unknown serialization item '%s'", l);
         }
-- 
1.8.1.2



More information about the systemd-devel mailing list