chiark / gitweb /
manager: pass environment over daemon-reexec
authorOleksii Shevchuk <alxchk@gmail.com>
Mon, 11 Feb 2013 23:14:39 +0000 (01:14 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 12 Feb 2013 23:17:17 +0000 (00:17 +0100)
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 >

src/core/manager.c

index 4bebb2996fcaaa8c06c280795a7b5334bcd3c261..bd49892cd46a9b08e61b91be3f7d219fb61c5d7e 100644 (file)
@@ -1856,6 +1856,7 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) {
         Iterator i;
         Unit *u;
         const char *t;
         Iterator i;
         Unit *u;
         const char *t;
+        char **e;
         int r;
 
         assert(m);
         int r;
 
         assert(m);
@@ -1879,6 +1880,14 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) {
                 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
         }
 
                 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
         }
 
+        STRV_FOREACH(e, m->environment) {
+                _cleanup_free_ char *ce;
+
+                ce = cescape(*e);
+                if (ce)
+                        fprintf(f, "env=%s\n", *e);
+        }
+
         fputc('\n', f);
 
         HASHMAP_FOREACH_KEY(u, t, m->units, i) {
         fputc('\n', f);
 
         HASHMAP_FOREACH_KEY(u, t, m->units, i) {
@@ -1979,7 +1988,25 @@ 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);
                         dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
                 else if (startswith(l, "finish-timestamp="))
                         dual_timestamp_deserialize(l+17, &m->finish_timestamp);
-                else
+                else if (startswith(l, "env=")) {
+                        _cleanup_free_ char *uce = NULL;
+                        char **e;
+
+                        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);
         }
 
                         log_debug("Unknown serialization item '%s'", l);
         }