summaryrefslogtreecommitdiff
path: root/src/activate
diff options
context:
space:
mode:
Diffstat (limited to 'src/activate')
-rw-r--r--src/activate/activate.c86
1 files changed, 27 insertions, 59 deletions
diff --git a/src/activate/activate.c b/src/activate/activate.c
index 79fdd0cdbf..0c32152671 100644
--- a/src/activate/activate.c
+++ b/src/activate/activate.c
@@ -9,6 +9,7 @@
#include "sd-daemon.h"
#include "alloc-util.h"
+#include "env-util.h"
#include "errno-util.h"
#include "escape.h"
#include "fd-util.h"
@@ -123,9 +124,7 @@ static int open_sockets(int *epoll_fd, bool accept) {
static int exec_process(const char *name, char **argv, int start_fd, size_t n_fds) {
_cleanup_strv_free_ char **envp = NULL;
- _cleanup_free_ char *joined = NULL;
- size_t n_env = 0, length;
- const char *tocopy;
+ const char *var;
char **s;
int r;
@@ -133,55 +132,16 @@ static int exec_process(const char *name, char **argv, int start_fd, size_t n_fd
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--inetd only supported for single file descriptors.");
- length = strv_length(arg_setenv);
-
- /* PATH, TERM, HOME, USER, LISTEN_FDS, LISTEN_PID, LISTEN_FDNAMES, NULL */
- envp = new0(char *, length + 8);
- if (!envp)
- return log_oom();
-
- STRV_FOREACH(s, arg_setenv) {
-
- if (strchr(*s, '=')) {
- char *k;
-
- k = strdup(*s);
- if (!k)
- return log_oom();
-
- envp[n_env++] = k;
- } else {
- _cleanup_free_ char *p = NULL;
- const char *n;
-
- p = strjoin(*s, "=");
- if (!p)
- return log_oom();
-
- n = strv_find_prefix(environ, p);
- if (!n)
- continue;
-
- envp[n_env] = strdup(n);
- if (!envp[n_env])
- return log_oom();
-
- n_env++;
- }
- }
-
- FOREACH_STRING(tocopy, "TERM=", "PATH=", "USER=", "HOME=") {
+ FOREACH_STRING(var, "TERM", "PATH", "USER", "HOME") {
const char *n;
- n = strv_find_prefix(environ, tocopy);
+ n = strv_find_prefix(environ, var);
if (!n)
continue;
- envp[n_env] = strdup(n);
- if (!envp[n_env])
- return log_oom();
-
- n_env++;
+ r = strv_extend(&envp, n);
+ if (r < 0)
+ return r;
}
if (arg_inetd) {
@@ -201,16 +161,17 @@ static int exec_process(const char *name, char **argv, int start_fd, size_t n_fd
safe_close(start_fd);
}
- if (asprintf((char **) (envp + n_env++), "LISTEN_FDS=%zu", n_fds) < 0)
- return log_oom();
+ r = strv_extendf(&envp, "LISTEN_FDS=%zu", n_fds);
+ if (r < 0)
+ return r;
- if (asprintf((char **) (envp + n_env++), "LISTEN_PID=" PID_FMT, getpid_cached()) < 0)
- return log_oom();
+ r = strv_extendf(&envp, "LISTEN_PID=" PID_FMT, getpid_cached());
+ if (r < 0)
+ return r;
if (arg_fdnames) {
_cleanup_free_ char *names = NULL;
size_t len;
- char *e;
len = strv_length(arg_fdnames);
if (len == 1)
@@ -226,15 +187,23 @@ static int exec_process(const char *name, char **argv, int start_fd, size_t n_fd
if (!names)
return log_oom();
- e = strjoin("LISTEN_FDNAMES=", names);
- if (!e)
+ char *t = strjoin("LISTEN_FDNAMES=", names);
+ if (!t)
return log_oom();
- envp[n_env++] = e;
+ r = strv_consume(&envp, t);
+ if (r < 0)
+ return r;
}
}
- joined = strv_join(argv, " ");
+ STRV_FOREACH(s, arg_setenv) {
+ r = strv_env_replace_strdup(&envp, *s);
+ if (r < 0)
+ return r;
+ }
+
+ _cleanup_free_ char *joined = strv_join(argv, " ");
if (!joined)
return log_oom();
@@ -414,10 +383,9 @@ static int parse_argv(int argc, char *argv[]) {
break;
case 'E':
- r = strv_extend(&arg_setenv, optarg);
+ r = strv_env_replace_strdup_passthrough(&arg_setenv, optarg);
if (r < 0)
- return log_oom();
-
+ return log_error_errno(r, "Cannot assign environment variable %s: %m", optarg);
break;
case ARG_FDNAME: {