Merge pull request #27890 from bluca/executor
core: add systemd-executor binary
This commit is contained in:
@@ -36,7 +36,7 @@ typedef enum CGroupController {
|
||||
CGROUP_CONTROLLER_BPF_SOCKET_BIND,
|
||||
CGROUP_CONTROLLER_BPF_RESTRICT_NETWORK_INTERFACES,
|
||||
/* The BPF hook implementing RestrictFileSystems= is not defined here.
|
||||
* It's applied as late as possible in exec_child() so we don't block
|
||||
* It's applied as late as possible in exec_invoke() so we don't block
|
||||
* our own unit setup code. */
|
||||
|
||||
_CGROUP_CONTROLLER_MAX,
|
||||
|
||||
@@ -1074,3 +1074,22 @@ int getenv_steal_erase(const char *name, char **ret) {
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int set_full_environment(char **env) {
|
||||
int r;
|
||||
|
||||
clearenv();
|
||||
|
||||
STRV_FOREACH(e, env) {
|
||||
_cleanup_free_ char *k = NULL, *v = NULL;
|
||||
|
||||
r = split_pair(*e, "=", &k, &v);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (setenv(k, v, /* overwrite= */ true) < 0)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -77,3 +77,5 @@ int setenv_systemd_exec_pid(bool update_only);
|
||||
int getenv_path_list(const char *name, char ***ret_paths);
|
||||
|
||||
int getenv_steal_erase(const char *name, char **ret);
|
||||
|
||||
int set_full_environment(char **env);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <limits.h>
|
||||
#include <linux/oom.h>
|
||||
#include <pthread.h>
|
||||
#include <spawn.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -1732,6 +1733,51 @@ int make_reaper_process(bool b) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int posix_spawn_wrapper(const char *path, char *const *argv, char *const *envp, pid_t *ret_pid) {
|
||||
posix_spawnattr_t attr;
|
||||
sigset_t mask;
|
||||
pid_t pid;
|
||||
int r;
|
||||
|
||||
/* Forks and invokes 'path' with 'argv' and 'envp' using CLONE_VM and CLONE_VFORK, which means the
|
||||
* caller will be blocked until the child either exits or exec's. The memory of the child will be
|
||||
* fully shared with the memory of the parent, so that there are no copy-on-write or memory.max
|
||||
* issues. */
|
||||
|
||||
assert(path);
|
||||
assert(argv);
|
||||
assert(ret_pid);
|
||||
|
||||
assert_se(sigfillset(&mask) >= 0);
|
||||
|
||||
r = posix_spawnattr_init(&attr);
|
||||
if (r != 0)
|
||||
return -r; /* These functions return a positive errno on failure */
|
||||
r = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGMASK);
|
||||
if (r != 0)
|
||||
goto fail;
|
||||
r = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGDEF); /* Set all signals to SIG_DFL */
|
||||
if (r != 0)
|
||||
goto fail;
|
||||
r = posix_spawnattr_setsigmask(&attr, &mask);
|
||||
if (r != 0)
|
||||
goto fail;
|
||||
|
||||
r = posix_spawn(&pid, path, NULL, &attr, argv, envp);
|
||||
if (r != 0)
|
||||
goto fail;
|
||||
|
||||
*ret_pid = pid;
|
||||
|
||||
posix_spawnattr_destroy(&attr);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
assert(r > 0);
|
||||
posix_spawnattr_destroy(&attr);
|
||||
return -r;
|
||||
}
|
||||
|
||||
static const char *const sigchld_code_table[] = {
|
||||
[CLD_EXITED] = "exited",
|
||||
[CLD_KILLED] = "killed",
|
||||
|
||||
@@ -210,3 +210,5 @@ int get_process_threads(pid_t pid);
|
||||
|
||||
int is_reaper_process(void);
|
||||
int make_reaper_process(bool b);
|
||||
|
||||
int posix_spawn_wrapper(const char *path, char *const *argv, char *const *envp, pid_t *ret_pid);
|
||||
|
||||
Reference in New Issue
Block a user