]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
core: only apply NonBlocking= to fds passed via socket activation
[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
5cb5a6ff 75struct ExecStatus {
63983207
LP
76 dual_timestamp start_timestamp;
77 dual_timestamp exit_timestamp;
9d58f1db 78 pid_t pid;
9152c765
LP
79 int code; /* as in siginfo_t::si_code */
80 int status; /* as in sigingo_t::si_status */
5cb5a6ff
LP
81};
82
83struct ExecCommand {
84 char *path;
85 char **argv;
034c6ed7
LP
86 ExecStatus exec_status;
87 LIST_FIELDS(ExecCommand, command); /* useful for chaining commands */
cf677fe6
AP
88 bool ignore:1;
89 bool privileged:1;
5cb5a6ff
LP
90};
91
613b411c
LP
92struct ExecRuntime {
93 int n_ref;
94
95 char *tmp_dir;
96 char *var_tmp_dir;
97
29206d46
LP
98 /* An AF_UNIX socket pair, that contains a datagram containing a file descriptor referring to the network
99 * namespace. */
613b411c
LP
100 int netns_storage_socket[2];
101};
102
5cb5a6ff
LP
103struct ExecContext {
104 char **environment;
8c7be95e 105 char **environment_files;
b4c14404 106 char **pass_environment;
8c7be95e 107
517d56b1 108 struct rlimit *rlimit[_RLIMIT_MAX];
915e6d16 109 char *working_directory, *root_directory, *root_image;
4c08c824 110 bool working_directory_missing_ok;
5f5d8eab 111 bool working_directory_home;
9d58f1db
LP
112
113 mode_t umask;
dd6c17b1 114 int oom_score_adjust;
5cb5a6ff 115 int nice;
9eba9da4 116 int ioprio;
94f04347
LP
117 int cpu_sched_policy;
118 int cpu_sched_priority;
9d58f1db 119
82c121a4
LP
120 cpu_set_t *cpuset;
121 unsigned cpuset_ncpus;
fb33a393 122
80876c20
LP
123 ExecInput std_input;
124 ExecOutput std_output;
125 ExecOutput std_error;
52c239d7 126 char *stdio_fdname[3];
80876c20 127
d88a251b 128 nsec_t timer_slack_nsec;
071830ff 129
1e22b5cd
LP
130 bool stdio_as_fds;
131
9d58f1db 132 char *tty_path;
5cb5a6ff 133
6ea832a2
LP
134 bool tty_reset;
135 bool tty_vhangup;
136 bool tty_vt_disallocate;
137
353e12c2
LP
138 bool ignore_sigpipe;
139
61233823 140 /* Since resolving these names might involve socket
5cb5a6ff 141 * connections and we don't want to deadlock ourselves these
94f04347
LP
142 * names are resolved on execution only and in the child
143 * process. */
5cb5a6ff
LP
144 char *user;
145 char *group;
146 char **supplementary_groups;
9d58f1db 147
5b6319dc
LP
148 char *pam_name;
149
169c1bda 150 char *utmp_id;
023a4f67 151 ExecUtmpMode utmp_mode;
169c1bda 152
5f8640fb 153 bool selinux_context_ignore;
7b52a628
MS
154 char *selinux_context;
155
eef65bf3
MS
156 bool apparmor_profile_ignore;
157 char *apparmor_profile;
158
2ca620c4
WC
159 bool smack_process_label_ignore;
160 char *smack_process_label;
161
2a624c36 162 char **read_write_paths, **read_only_paths, **inaccessible_paths;
15ae422b 163 unsigned long mount_flags;
d2d6c096
LP
164 BindMount *bind_mounts;
165 unsigned n_bind_mounts;
15ae422b 166
a103496c 167 uint64_t capability_bounding_set;
755d4b67 168 uint64_t capability_ambient_set;
9d58f1db
LP
169 int secure_bits;
170
7fab9d01
LP
171 int syslog_priority;
172 char *syslog_identifier;
173 bool syslog_level_prefix;
174
9d58f1db
LP
175 bool cpu_sched_reset_on_fork;
176 bool non_blocking;
15ae422b 177 bool private_tmp;
ff01d048 178 bool private_network;
7f112f50 179 bool private_devices;
d251207d 180 bool private_users;
1b8689f9
LP
181 ProtectSystem protect_system;
182 ProtectHome protect_home;
59eeb84b 183 bool protect_kernel_tunables;
502d704e 184 bool protect_kernel_modules;
59eeb84b 185 bool protect_control_groups;
5d997827 186 bool mount_apivfs;
9d58f1db 187
8351ceae
LP
188 bool no_new_privileges;
189
29206d46 190 bool dynamic_user;
00d9ef85 191 bool remove_ipc;
29206d46 192
9d58f1db
LP
193 /* This is not exposed to the user but available
194 * internally. We need it to make sure that whenever we spawn
f00929ad 195 * /usr/bin/mount it is run in the same process group as us so
9d58f1db
LP
196 * that the autofs logic detects that it belongs to us and we
197 * don't enter a trigger loop. */
74922904 198 bool same_pgrp;
2e22afe9 199
ac45f971
LP
200 unsigned long personality;
201
add00535
LP
202 unsigned long restrict_namespaces; /* The CLONE_NEWxyz flags permitted to the unit's processes */
203
17df7223 204 Set *syscall_filter;
57183d11 205 Set *syscall_archs;
17df7223
LP
206 int syscall_errno;
207 bool syscall_whitelist:1;
8351ceae 208
4298d0b5
LP
209 Set *address_families;
210 bool address_families_whitelist:1;
211
e66cf1a3
LP
212 char **runtime_directory;
213 mode_t runtime_directory_mode;
214
f4170c67
LP
215 bool memory_deny_write_execute;
216 bool restrict_realtime;
217
dd6c17b1 218 bool oom_score_adjust_set:1;
7fab9d01
LP
219 bool nice_set:1;
220 bool ioprio_set:1;
221 bool cpu_sched_set:1;
5cb5a6ff
LP
222};
223
add00535
LP
224static inline bool exec_context_restrict_namespaces_set(const ExecContext *c) {
225 assert(c);
226
227 return (c->restrict_namespaces & NAMESPACE_FLAGS_ALL) != NAMESPACE_FLAGS_ALL;
228}
229
c39f1ce2 230typedef enum ExecFlags {
7d5ceb64
FB
231 EXEC_APPLY_PERMISSIONS = 1U << 0,
232 EXEC_APPLY_CHROOT = 1U << 1,
233 EXEC_APPLY_TTY_STDIN = 1U << 2,
74dd6b51 234 EXEC_NEW_KEYRING = 1U << 3,
c39f1ce2 235
9c1a61ad 236 /* The following are not used by execute.c, but by consumers internally */
74dd6b51
LP
237 EXEC_PASS_FDS = 1U << 4,
238 EXEC_IS_CONTROL = 1U << 5,
239 EXEC_SETENV_RESULT = 1U << 6,
240 EXEC_SET_WATCHDOG = 1U << 7,
c39f1ce2
LP
241} ExecFlags;
242
9fa95f85
DM
243struct ExecParameters {
244 char **argv;
a34ceba6 245 char **environment;
8dd4c05b
LP
246
247 int *fds;
248 char **fd_names;
249 unsigned n_fds;
9b141911 250 unsigned n_socket_fds;
8dd4c05b 251
c39f1ce2 252 ExecFlags flags;
a34ceba6 253 bool selinux_context_net:1;
8dd4c05b 254
a34ceba6 255 bool cgroup_delegate:1;
efdb0237 256 CGroupMask cgroup_supported;
9fa95f85 257 const char *cgroup_path;
8dd4c05b 258
9fa95f85 259 const char *runtime_prefix;
8dd4c05b 260
7d5ceb64
FB
261 const char *confirm_spawn;
262
9fa95f85 263 usec_t watchdog_usec;
8dd4c05b 264
9fa95f85 265 int *idle_pipe;
8dd4c05b 266
a34ceba6
LP
267 int stdin_fd;
268 int stdout_fd;
269 int stderr_fd;
9fa95f85
DM
270};
271
9ce93478 272#include "unit.h"
29206d46 273#include "dynamic-user.h"
9ce93478 274
f2341e0a
LP
275int exec_spawn(Unit *unit,
276 ExecCommand *command,
9fa95f85
DM
277 const ExecContext *context,
278 const ExecParameters *exec_params,
613b411c 279 ExecRuntime *runtime,
29206d46 280 DynamicCreds *dynamic_creds,
81a2b7ce 281 pid_t *ret);
5cb5a6ff 282
43d0fcbd
LP
283void exec_command_done(ExecCommand *c);
284void exec_command_done_array(ExecCommand *c, unsigned n);
285
f1acf85a 286ExecCommand* exec_command_free_list(ExecCommand *c);
034c6ed7 287void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 288
9e2f7c11
LP
289char *exec_command_line(char **argv);
290
44d8db9e
LP
291void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
292void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 293void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 294int exec_command_set(ExecCommand *c, const char *path, ...);
86b23b07 295int exec_command_append(ExecCommand *c, const char *path, ...);
44d8db9e 296
034c6ed7 297void exec_context_init(ExecContext *c);
613b411c 298void exec_context_done(ExecContext *c);
5cb5a6ff
LP
299void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
300
e66cf1a3
LP
301int exec_context_destroy_runtime_directory(ExecContext *c, const char *runtime_root);
302
f2341e0a 303int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l);
52c239d7
LB
304int exec_context_named_iofds(Unit *unit, const ExecContext *c, const ExecParameters *p, int named_iofds[3]);
305const char* exec_context_fdname(const ExecContext *c, int fd_index);
8c7be95e 306
6ac8fdc9 307bool exec_context_may_touch_console(ExecContext *c);
a931ad47 308bool exec_context_maintains_privileges(ExecContext *c);
6ac8fdc9 309
b58b4116 310void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 311void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 312void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 313
613b411c
LP
314int exec_runtime_make(ExecRuntime **rt, ExecContext *c, const char *id);
315ExecRuntime *exec_runtime_ref(ExecRuntime *r);
316ExecRuntime *exec_runtime_unref(ExecRuntime *r);
317
f2341e0a
LP
318int exec_runtime_serialize(Unit *unit, ExecRuntime *rt, FILE *f, FDSet *fds);
319int exec_runtime_deserialize_item(Unit *unit, ExecRuntime **rt, const char *key, const char *value, FDSet *fds);
613b411c
LP
320
321void exec_runtime_destroy(ExecRuntime *rt);
322
44a6b1b6
ZJS
323const char* exec_output_to_string(ExecOutput i) _const_;
324ExecOutput exec_output_from_string(const char *s) _pure_;
94f04347 325
44a6b1b6
ZJS
326const char* exec_input_to_string(ExecInput i) _const_;
327ExecInput exec_input_from_string(const char *s) _pure_;
023a4f67
LP
328
329const char* exec_utmp_mode_to_string(ExecUtmpMode i) _const_;
330ExecUtmpMode exec_utmp_mode_from_string(const char *s) _pure_;