]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
Merge pull request #1033 from poettering/machine-fixes
[thirdparty/systemd.git] / src / core / execute.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5cb5a6ff 2
c2f1db8f 3#pragma once
5cb5a6ff 4
a7334b09
LP
5/***
6 This file is part of systemd.
7
8 Copyright 2010 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 18 Lesser General Public License for more details.
a7334b09 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
5cb5a6ff
LP
24typedef struct ExecStatus ExecStatus;
25typedef struct ExecCommand ExecCommand;
26typedef struct ExecContext ExecContext;
613b411c 27typedef struct ExecRuntime ExecRuntime;
9fa95f85 28typedef struct ExecParameters ExecParameters;
5cb5a6ff 29
5cb5a6ff
LP
30#include <sys/capability.h>
31#include <stdbool.h>
32#include <stdio.h>
94f04347 33#include <sched.h>
5cb5a6ff
LP
34
35#include "list.h"
613b411c 36#include "fdset.h"
517d56b1 37#include "missing.h"
417116f2 38#include "namespace.h"
bb7dd0b0 39#include "bus-endpoint.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,
46 _EXEC_UTMP_MODE_INVALID,
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,
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,
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 */
7fab9d01 87 bool ignore;
5cb5a6ff
LP
88};
89
613b411c
LP
90struct ExecRuntime {
91 int n_ref;
92
93 char *tmp_dir;
94 char *var_tmp_dir;
95
96 int netns_storage_socket[2];
97};
98
5cb5a6ff
LP
99struct ExecContext {
100 char **environment;
8c7be95e
LP
101 char **environment_files;
102
517d56b1 103 struct rlimit *rlimit[_RLIMIT_MAX];
9eba9da4 104 char *working_directory, *root_directory;
4c08c824 105 bool working_directory_missing_ok;
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
9d58f1db 123 char *tty_path;
5cb5a6ff 124
6ea832a2
LP
125 bool tty_reset;
126 bool tty_vhangup;
127 bool tty_vt_disallocate;
128
353e12c2
LP
129 bool ignore_sigpipe;
130
94f04347 131 /* Since resolving these names might might involve socket
5cb5a6ff 132 * connections and we don't want to deadlock ourselves these
94f04347
LP
133 * names are resolved on execution only and in the child
134 * process. */
5cb5a6ff
LP
135 char *user;
136 char *group;
137 char **supplementary_groups;
9d58f1db 138
5b6319dc
LP
139 char *pam_name;
140
169c1bda 141 char *utmp_id;
023a4f67 142 ExecUtmpMode utmp_mode;
169c1bda 143
5f8640fb 144 bool selinux_context_ignore;
7b52a628
MS
145 char *selinux_context;
146
eef65bf3
MS
147 bool apparmor_profile_ignore;
148 char *apparmor_profile;
149
2ca620c4
WC
150 bool smack_process_label_ignore;
151 char *smack_process_label;
152
15ae422b
LP
153 char **read_write_dirs, **read_only_dirs, **inaccessible_dirs;
154 unsigned long mount_flags;
155
9d58f1db
LP
156 uint64_t capability_bounding_set_drop;
157
158 cap_t capabilities;
159 int secure_bits;
160
7fab9d01
LP
161 int syslog_priority;
162 char *syslog_identifier;
163 bool syslog_level_prefix;
164
9d58f1db
LP
165 bool cpu_sched_reset_on_fork;
166 bool non_blocking;
15ae422b 167 bool private_tmp;
ff01d048 168 bool private_network;
7f112f50 169 bool private_devices;
1b8689f9
LP
170 ProtectSystem protect_system;
171 ProtectHome protect_home;
9d58f1db 172
8351ceae
LP
173 bool no_new_privileges;
174
9d58f1db
LP
175 /* This is not exposed to the user but available
176 * internally. We need it to make sure that whenever we spawn
f00929ad 177 * /usr/bin/mount it is run in the same process group as us so
9d58f1db
LP
178 * that the autofs logic detects that it belongs to us and we
179 * don't enter a trigger loop. */
74922904 180 bool same_pgrp;
2e22afe9 181
ac45f971
LP
182 unsigned long personality;
183
17df7223 184 Set *syscall_filter;
57183d11 185 Set *syscall_archs;
17df7223
LP
186 int syscall_errno;
187 bool syscall_whitelist:1;
8351ceae 188
4298d0b5
LP
189 Set *address_families;
190 bool address_families_whitelist:1;
191
e66cf1a3
LP
192 char **runtime_directory;
193 mode_t runtime_directory_mode;
194
dd6c17b1 195 bool oom_score_adjust_set:1;
7fab9d01
LP
196 bool nice_set:1;
197 bool ioprio_set:1;
198 bool cpu_sched_set:1;
760b9d7c 199 bool no_new_privileges_set:1;
bb7dd0b0
DM
200
201 /* custom dbus enpoint */
202 BusEndpoint *bus_endpoint;
5cb5a6ff
LP
203};
204
4ad49000 205#include "cgroup.h"
c1ff5570 206#include "cgroup-util.h"
4ad49000 207
9fa95f85
DM
208struct ExecParameters {
209 char **argv;
210 int *fds; unsigned n_fds;
211 char **environment;
212 bool apply_permissions;
213 bool apply_chroot;
214 bool apply_tty_stdin;
215 bool confirm_spawn;
16115b0a 216 bool selinux_context_net;
9fa95f85
DM
217 CGroupControllerMask cgroup_supported;
218 const char *cgroup_path;
a931ad47 219 bool cgroup_delegate;
9fa95f85 220 const char *runtime_prefix;
9fa95f85
DM
221 usec_t watchdog_usec;
222 int *idle_pipe;
e44da745
DM
223 char *bus_endpoint_path;
224 int bus_endpoint_fd;
9fa95f85
DM
225};
226
f2341e0a
LP
227int exec_spawn(Unit *unit,
228 ExecCommand *command,
9fa95f85
DM
229 const ExecContext *context,
230 const ExecParameters *exec_params,
613b411c 231 ExecRuntime *runtime,
81a2b7ce 232 pid_t *ret);
5cb5a6ff 233
43d0fcbd
LP
234void exec_command_done(ExecCommand *c);
235void exec_command_done_array(ExecCommand *c, unsigned n);
236
f1acf85a 237ExecCommand* exec_command_free_list(ExecCommand *c);
034c6ed7 238void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 239
9e2f7c11
LP
240char *exec_command_line(char **argv);
241
44d8db9e
LP
242void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
243void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 244void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 245int exec_command_set(ExecCommand *c, const char *path, ...);
86b23b07 246int exec_command_append(ExecCommand *c, const char *path, ...);
44d8db9e 247
034c6ed7 248void exec_context_init(ExecContext *c);
613b411c 249void exec_context_done(ExecContext *c);
5cb5a6ff
LP
250void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
251
e66cf1a3
LP
252int exec_context_destroy_runtime_directory(ExecContext *c, const char *runtime_root);
253
f2341e0a 254int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l);
8c7be95e 255
6ac8fdc9 256bool exec_context_may_touch_console(ExecContext *c);
a931ad47 257bool exec_context_maintains_privileges(ExecContext *c);
6ac8fdc9 258
b58b4116 259void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 260void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 261void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 262
613b411c
LP
263int exec_runtime_make(ExecRuntime **rt, ExecContext *c, const char *id);
264ExecRuntime *exec_runtime_ref(ExecRuntime *r);
265ExecRuntime *exec_runtime_unref(ExecRuntime *r);
266
f2341e0a
LP
267int exec_runtime_serialize(Unit *unit, ExecRuntime *rt, FILE *f, FDSet *fds);
268int exec_runtime_deserialize_item(Unit *unit, ExecRuntime **rt, const char *key, const char *value, FDSet *fds);
613b411c
LP
269
270void exec_runtime_destroy(ExecRuntime *rt);
271
44a6b1b6
ZJS
272const char* exec_output_to_string(ExecOutput i) _const_;
273ExecOutput exec_output_from_string(const char *s) _pure_;
94f04347 274
44a6b1b6
ZJS
275const char* exec_input_to_string(ExecInput i) _const_;
276ExecInput exec_input_from_string(const char *s) _pure_;
023a4f67
LP
277
278const char* exec_utmp_mode_to_string(ExecUtmpMode i) _const_;
279ExecUtmpMode exec_utmp_mode_from_string(const char *s) _pure_;