mirror of
https://github.com/systemd/systemd.git
synced 2025-03-31 14:50:15 +03:00
core/manager: move environment serialization out to basic/env-util.c
This protocol is generally useful, we might just as well reuse it for the env. generators. The implementation is changed a bit: instead of making a new strv and freeing the old one, just mutate the original. This is much faster with larger arrays, while in fact atomicity is preserved, since we only either insert the new entry or not, without being in inconsistent state. v2: - fix confusion with return value
This commit is contained in:
parent
71cb7d306a
commit
fe902fa496
@ -26,6 +26,7 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "env-util.h"
|
||||
#include "escape.h"
|
||||
#include "extract-word.h"
|
||||
#include "macro.h"
|
||||
#include "parse-util.h"
|
||||
@ -644,3 +645,36 @@ int getenv_bool(const char *p) {
|
||||
|
||||
return parse_boolean(e);
|
||||
}
|
||||
|
||||
int serialize_environment(FILE *f, char **environment) {
|
||||
char **e;
|
||||
|
||||
STRV_FOREACH(e, environment) {
|
||||
_cleanup_free_ char *ce;
|
||||
|
||||
ce = cescape(*e);
|
||||
if (!ce)
|
||||
return -ENOMEM;
|
||||
|
||||
fprintf(f, "env=%s\n", *e);
|
||||
}
|
||||
|
||||
/* caller should call ferror() */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int deserialize_environment(char ***environment, const char *line) {
|
||||
char *uce = NULL;
|
||||
int r;
|
||||
|
||||
assert(line);
|
||||
assert(environment);
|
||||
|
||||
assert(startswith(line, "env="));
|
||||
r = cunescape(line + 4, UNESCAPE_RELAX, &uce);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return strv_env_replace(environment, uce);
|
||||
}
|
||||
|
@ -21,6 +21,7 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "macro.h"
|
||||
|
||||
@ -50,3 +51,6 @@ char *strv_env_get_n(char **l, const char *name, size_t k) _pure_;
|
||||
char *strv_env_get(char **x, const char *n) _pure_;
|
||||
|
||||
int getenv_bool(const char *p);
|
||||
|
||||
int serialize_environment(FILE *f, char **environment);
|
||||
int deserialize_environment(char ***environment, const char *line);
|
||||
|
@ -2459,7 +2459,6 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
const char *t;
|
||||
char **e;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
@ -2489,17 +2488,8 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
|
||||
dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
|
||||
}
|
||||
|
||||
if (!switching_root) {
|
||||
STRV_FOREACH(e, m->environment) {
|
||||
_cleanup_free_ char *ce;
|
||||
|
||||
ce = cescape(*e);
|
||||
if (!ce)
|
||||
return -ENOMEM;
|
||||
|
||||
fprintf(f, "env=%s\n", *e);
|
||||
}
|
||||
}
|
||||
if (!switching_root)
|
||||
(void) serialize_environment(f, m->environment);
|
||||
|
||||
if (m->notify_fd >= 0) {
|
||||
int copy;
|
||||
@ -2662,21 +2652,9 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
|
||||
else if ((val = startswith(l, "units-load-finish-timestamp=")))
|
||||
dual_timestamp_deserialize(val, &m->units_load_finish_timestamp);
|
||||
else if (startswith(l, "env=")) {
|
||||
_cleanup_free_ char *uce = NULL;
|
||||
char **e;
|
||||
|
||||
r = cunescape(l + 4, UNESCAPE_RELAX, &uce);
|
||||
r = deserialize_environment(&m->environment, l);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
|
||||
e = strv_env_set(m->environment, uce);
|
||||
if (!e) {
|
||||
r = -ENOMEM;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
strv_free(m->environment);
|
||||
m->environment = e;
|
||||
return r;
|
||||
|
||||
} else if ((val = startswith(l, "notify-fd="))) {
|
||||
int fd;
|
||||
|
Loading…
x
Reference in New Issue
Block a user