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