]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
Merge pull request #6830 from keszybz/generator-dirs
[thirdparty/systemd.git] / src / core / execute.h
CommitLineData
c2f1db8f 1#pragma once
5cb5a6ff 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
5cb5a6ff
LP
22typedef struct ExecStatus ExecStatus;
23typedef struct ExecCommand ExecCommand;
24typedef struct ExecContext ExecContext;
613b411c 25typedef struct ExecRuntime ExecRuntime;
9fa95f85 26typedef struct ExecParameters ExecParameters;
5cb5a6ff 27
71d35b6b 28#include <sched.h>
5cb5a6ff
LP
29#include <stdbool.h>
30#include <stdio.h>
71d35b6b 31#include <sys/capability.h>
5cb5a6ff 32
9ce93478 33#include "cgroup-util.h"
613b411c 34#include "fdset.h"
71d35b6b 35#include "list.h"
517d56b1 36#include "missing.h"
417116f2 37#include "namespace.h"
add00535 38#include "nsflags.h"
5cb5a6ff 39
023a4f67
LP
40typedef enum ExecUtmpMode {
41 EXEC_UTMP_INIT,
42 EXEC_UTMP_LOGIN,
43 EXEC_UTMP_USER,
44 _EXEC_UTMP_MODE_MAX,
2307f37e 45 _EXEC_UTMP_MODE_INVALID = -1
023a4f67
LP
46} ExecUtmpMode;
47
80876c20
LP
48typedef enum ExecInput {
49 EXEC_INPUT_NULL,
50 EXEC_INPUT_TTY,
51 EXEC_INPUT_TTY_FORCE,
52 EXEC_INPUT_TTY_FAIL,
4f2d528d 53 EXEC_INPUT_SOCKET,
52c239d7 54 EXEC_INPUT_NAMED_FD,
80876c20
LP
55 _EXEC_INPUT_MAX,
56 _EXEC_INPUT_INVALID = -1
57} ExecInput;
58
071830ff 59typedef enum ExecOutput {
80876c20 60 EXEC_OUTPUT_INHERIT,
94f04347 61 EXEC_OUTPUT_NULL,
80876c20 62 EXEC_OUTPUT_TTY,
94f04347 63 EXEC_OUTPUT_SYSLOG,
28dbc1e8 64 EXEC_OUTPUT_SYSLOG_AND_CONSOLE,
9a6bca7a 65 EXEC_OUTPUT_KMSG,
28dbc1e8 66 EXEC_OUTPUT_KMSG_AND_CONSOLE,
706343f4
LP
67 EXEC_OUTPUT_JOURNAL,
68 EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
4f2d528d 69 EXEC_OUTPUT_SOCKET,
52c239d7 70 EXEC_OUTPUT_NAMED_FD,
94f04347
LP
71 _EXEC_OUTPUT_MAX,
72 _EXEC_OUTPUT_INVALID = -1
071830ff
LP
73} ExecOutput;
74
53f47dfc
YW
75typedef enum ExecPreserveMode {
76 EXEC_PRESERVE_NO,
77 EXEC_PRESERVE_YES,
78 EXEC_PRESERVE_RESTART,
79 _EXEC_PRESERVE_MODE_MAX,
80 _EXEC_PRESERVE_MODE_INVALID = -1
81} ExecPreserveMode;
82
5cb5a6ff 83struct ExecStatus {
63983207
LP
84 dual_timestamp start_timestamp;
85 dual_timestamp exit_timestamp;
9d58f1db 86 pid_t pid;
9152c765
LP
87 int code; /* as in siginfo_t::si_code */
88 int status; /* as in sigingo_t::si_status */
5cb5a6ff
LP
89};
90
3ed0cd26
LP
91typedef enum ExecCommandFlags {
92 EXEC_COMMAND_IGNORE_FAILURE = 1,
93 EXEC_COMMAND_FULLY_PRIVILEGED = 2,
165a31c0
LP
94 EXEC_COMMAND_NO_SETUID = 4,
95 EXEC_COMMAND_AMBIENT_MAGIC = 8,
3ed0cd26
LP
96} ExecCommandFlags;
97
5cb5a6ff
LP
98struct ExecCommand {
99 char *path;
100 char **argv;
034c6ed7 101 ExecStatus exec_status;
3ed0cd26 102 ExecCommandFlags flags;
034c6ed7 103 LIST_FIELDS(ExecCommand, command); /* useful for chaining commands */
5cb5a6ff
LP
104};
105
613b411c
LP
106struct ExecRuntime {
107 int n_ref;
108
109 char *tmp_dir;
110 char *var_tmp_dir;
111
29206d46
LP
112 /* An AF_UNIX socket pair, that contains a datagram containing a file descriptor referring to the network
113 * namespace. */
613b411c
LP
114 int netns_storage_socket[2];
115};
116
3536f49e
YW
117typedef enum ExecDirectoryType {
118 EXEC_DIRECTORY_RUNTIME = 0,
119 EXEC_DIRECTORY_STATE,
120 EXEC_DIRECTORY_CACHE,
121 EXEC_DIRECTORY_LOGS,
122 EXEC_DIRECTORY_CONFIGURATION,
123 _EXEC_DIRECTORY_MAX,
124 _EXEC_DIRECTORY_INVALID = -1,
125} ExecDirectoryType;
126
127typedef struct ExecDirectory {
128 char **paths;
129 mode_t mode;
130} ExecDirectory;
131
5cb5a6ff
LP
132struct ExecContext {
133 char **environment;
8c7be95e 134 char **environment_files;
b4c14404 135 char **pass_environment;
00819cc1 136 char **unset_environment;
8c7be95e 137
517d56b1 138 struct rlimit *rlimit[_RLIMIT_MAX];
915e6d16 139 char *working_directory, *root_directory, *root_image;
4c08c824 140 bool working_directory_missing_ok;
5f5d8eab 141 bool working_directory_home;
9d58f1db
LP
142
143 mode_t umask;
dd6c17b1 144 int oom_score_adjust;
5cb5a6ff 145 int nice;
9eba9da4 146 int ioprio;
94f04347
LP
147 int cpu_sched_policy;
148 int cpu_sched_priority;
9d58f1db 149
82c121a4
LP
150 cpu_set_t *cpuset;
151 unsigned cpuset_ncpus;
fb33a393 152
80876c20
LP
153 ExecInput std_input;
154 ExecOutput std_output;
155 ExecOutput std_error;
52c239d7 156 char *stdio_fdname[3];
80876c20 157
d88a251b 158 nsec_t timer_slack_nsec;
071830ff 159
1e22b5cd
LP
160 bool stdio_as_fds;
161
9d58f1db 162 char *tty_path;
5cb5a6ff 163
6ea832a2
LP
164 bool tty_reset;
165 bool tty_vhangup;
166 bool tty_vt_disallocate;
167
353e12c2
LP
168 bool ignore_sigpipe;
169
61233823 170 /* Since resolving these names might involve socket
5cb5a6ff 171 * connections and we don't want to deadlock ourselves these
94f04347
LP
172 * names are resolved on execution only and in the child
173 * process. */
5cb5a6ff
LP
174 char *user;
175 char *group;
176 char **supplementary_groups;
9d58f1db 177
5b6319dc
LP
178 char *pam_name;
179
169c1bda 180 char *utmp_id;
023a4f67 181 ExecUtmpMode utmp_mode;
169c1bda 182
5f8640fb 183 bool selinux_context_ignore;
7b52a628
MS
184 char *selinux_context;
185
eef65bf3
MS
186 bool apparmor_profile_ignore;
187 char *apparmor_profile;
188
2ca620c4
WC
189 bool smack_process_label_ignore;
190 char *smack_process_label;
191
2a624c36 192 char **read_write_paths, **read_only_paths, **inaccessible_paths;
15ae422b 193 unsigned long mount_flags;
d2d6c096
LP
194 BindMount *bind_mounts;
195 unsigned n_bind_mounts;
15ae422b 196
a103496c 197 uint64_t capability_bounding_set;
755d4b67 198 uint64_t capability_ambient_set;
9d58f1db
LP
199 int secure_bits;
200
7fab9d01
LP
201 int syslog_priority;
202 char *syslog_identifier;
203 bool syslog_level_prefix;
204
9d58f1db
LP
205 bool cpu_sched_reset_on_fork;
206 bool non_blocking;
15ae422b 207 bool private_tmp;
ff01d048 208 bool private_network;
7f112f50 209 bool private_devices;
d251207d 210 bool private_users;
1b8689f9
LP
211 ProtectSystem protect_system;
212 ProtectHome protect_home;
59eeb84b 213 bool protect_kernel_tunables;
502d704e 214 bool protect_kernel_modules;
59eeb84b 215 bool protect_control_groups;
5d997827 216 bool mount_apivfs;
9d58f1db 217
8351ceae
LP
218 bool no_new_privileges;
219
29206d46 220 bool dynamic_user;
00d9ef85 221 bool remove_ipc;
29206d46 222
9d58f1db
LP
223 /* This is not exposed to the user but available
224 * internally. We need it to make sure that whenever we spawn
f00929ad 225 * /usr/bin/mount it is run in the same process group as us so
9d58f1db
LP
226 * that the autofs logic detects that it belongs to us and we
227 * don't enter a trigger loop. */
74922904 228 bool same_pgrp;
2e22afe9 229
ac45f971 230 unsigned long personality;
78e864e5 231 bool lock_personality;
ac45f971 232
add00535
LP
233 unsigned long restrict_namespaces; /* The CLONE_NEWxyz flags permitted to the unit's processes */
234
17df7223 235 Set *syscall_filter;
57183d11 236 Set *syscall_archs;
17df7223
LP
237 int syscall_errno;
238 bool syscall_whitelist:1;
8351ceae 239
4298d0b5
LP
240 Set *address_families;
241 bool address_families_whitelist:1;
242
53f47dfc 243 ExecPreserveMode runtime_directory_preserve_mode;
3536f49e 244 ExecDirectory directories[_EXEC_DIRECTORY_MAX];
e66cf1a3 245
f4170c67
LP
246 bool memory_deny_write_execute;
247 bool restrict_realtime;
248
dd6c17b1 249 bool oom_score_adjust_set:1;
7fab9d01
LP
250 bool nice_set:1;
251 bool ioprio_set:1;
252 bool cpu_sched_set:1;
5cb5a6ff
LP
253};
254
add00535
LP
255static inline bool exec_context_restrict_namespaces_set(const ExecContext *c) {
256 assert(c);
257
258 return (c->restrict_namespaces & NAMESPACE_FLAGS_ALL) != NAMESPACE_FLAGS_ALL;
259}
260
c39f1ce2 261typedef enum ExecFlags {
1703fa41 262 EXEC_APPLY_SANDBOXING = 1U << 0,
7d5ceb64
FB
263 EXEC_APPLY_CHROOT = 1U << 1,
264 EXEC_APPLY_TTY_STDIN = 1U << 2,
74dd6b51 265 EXEC_NEW_KEYRING = 1U << 3,
af635cf3 266 EXEC_PASS_LOG_UNIT = 1U << 4, /* Whether to pass the unit name to the service's journal stream connection */
8679efde 267 EXEC_CHOWN_DIRECTORIES = 1U << 5, /* chown() the runtime/state/cache/log directories to the user we run as, under all conditions */
ac647978 268 EXEC_NSS_BYPASS_BUS = 1U << 6, /* Set the SYSTEMD_NSS_BYPASS_BUS environment variable, to disable nss-systemd for dbus */
584b8688 269 EXEC_CGROUP_DELEGATE = 1U << 7,
c39f1ce2 270
9c1a61ad 271 /* The following are not used by execute.c, but by consumers internally */
584b8688
LP
272 EXEC_PASS_FDS = 1U << 8,
273 EXEC_IS_CONTROL = 1U << 9,
274 EXEC_SETENV_RESULT = 1U << 10,
275 EXEC_SET_WATCHDOG = 1U << 11,
c39f1ce2
LP
276} ExecFlags;
277
9fa95f85
DM
278struct ExecParameters {
279 char **argv;
a34ceba6 280 char **environment;
8dd4c05b
LP
281
282 int *fds;
283 char **fd_names;
4c47affc 284 unsigned n_storage_fds;
9b141911 285 unsigned n_socket_fds;
8dd4c05b 286
c39f1ce2 287 ExecFlags flags;
a34ceba6 288 bool selinux_context_net:1;
8dd4c05b 289
efdb0237 290 CGroupMask cgroup_supported;
9fa95f85 291 const char *cgroup_path;
8dd4c05b 292
3536f49e 293 char **prefix;
8dd4c05b 294
7d5ceb64
FB
295 const char *confirm_spawn;
296
9fa95f85 297 usec_t watchdog_usec;
8dd4c05b 298
9fa95f85 299 int *idle_pipe;
8dd4c05b 300
a34ceba6
LP
301 int stdin_fd;
302 int stdout_fd;
303 int stderr_fd;
9fa95f85
DM
304};
305
9ce93478 306#include "unit.h"
29206d46 307#include "dynamic-user.h"
9ce93478 308
f2341e0a
LP
309int exec_spawn(Unit *unit,
310 ExecCommand *command,
9fa95f85
DM
311 const ExecContext *context,
312 const ExecParameters *exec_params,
613b411c 313 ExecRuntime *runtime,
29206d46 314 DynamicCreds *dynamic_creds,
81a2b7ce 315 pid_t *ret);
5cb5a6ff 316
43d0fcbd
LP
317void exec_command_done(ExecCommand *c);
318void exec_command_done_array(ExecCommand *c, unsigned n);
319
f1acf85a 320ExecCommand* exec_command_free_list(ExecCommand *c);
034c6ed7 321void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 322
9e2f7c11
LP
323char *exec_command_line(char **argv);
324
44d8db9e
LP
325void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
326void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 327void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 328int exec_command_set(ExecCommand *c, const char *path, ...);
86b23b07 329int exec_command_append(ExecCommand *c, const char *path, ...);
44d8db9e 330
034c6ed7 331void exec_context_init(ExecContext *c);
613b411c 332void exec_context_done(ExecContext *c);
5cb5a6ff
LP
333void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
334
e66cf1a3
LP
335int exec_context_destroy_runtime_directory(ExecContext *c, const char *runtime_root);
336
f2341e0a 337int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l);
52c239d7
LB
338int exec_context_named_iofds(Unit *unit, const ExecContext *c, const ExecParameters *p, int named_iofds[3]);
339const char* exec_context_fdname(const ExecContext *c, int fd_index);
8c7be95e 340
6ac8fdc9 341bool exec_context_may_touch_console(ExecContext *c);
a931ad47 342bool exec_context_maintains_privileges(ExecContext *c);
6ac8fdc9 343
7f452159
LP
344int exec_context_get_effective_ioprio(ExecContext *c);
345
b58b4116 346void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 347void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 348void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 349
613b411c
LP
350int exec_runtime_make(ExecRuntime **rt, ExecContext *c, const char *id);
351ExecRuntime *exec_runtime_ref(ExecRuntime *r);
352ExecRuntime *exec_runtime_unref(ExecRuntime *r);
353
f2341e0a
LP
354int exec_runtime_serialize(Unit *unit, ExecRuntime *rt, FILE *f, FDSet *fds);
355int exec_runtime_deserialize_item(Unit *unit, ExecRuntime **rt, const char *key, const char *value, FDSet *fds);
613b411c
LP
356
357void exec_runtime_destroy(ExecRuntime *rt);
358
44a6b1b6
ZJS
359const char* exec_output_to_string(ExecOutput i) _const_;
360ExecOutput exec_output_from_string(const char *s) _pure_;
94f04347 361
44a6b1b6
ZJS
362const char* exec_input_to_string(ExecInput i) _const_;
363ExecInput exec_input_from_string(const char *s) _pure_;
023a4f67
LP
364
365const char* exec_utmp_mode_to_string(ExecUtmpMode i) _const_;
366ExecUtmpMode exec_utmp_mode_from_string(const char *s) _pure_;
53f47dfc
YW
367
368const char* exec_preserve_mode_to_string(ExecPreserveMode i) _const_;
369ExecPreserveMode exec_preserve_mode_from_string(const char *s) _pure_;
3536f49e
YW
370
371const char* exec_directory_type_to_string(ExecDirectoryType i) _const_;
372ExecDirectoryType exec_directory_type_from_string(const char *s) _pure_;