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