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