]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
build-sys: fixups for libsystemd-daemon merge
[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;
5cb5a6ff 28
dacdf153 29#include <linux/types.h>
5cb5a6ff
LP
30#include <sys/time.h>
31#include <sys/resource.h>
32#include <sys/capability.h>
33#include <stdbool.h>
34#include <stdio.h>
94f04347 35#include <sched.h>
c0467cf3
RC
36#ifdef HAVE_SECCOMP
37#include <seccomp.h>
38
39#include "set.h"
40#endif
5cb5a6ff
LP
41
42#include "list.h"
034c6ed7 43#include "util.h"
613b411c 44#include "fdset.h"
5cb5a6ff 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 */
7fab9d01 84 bool ignore;
5cb5a6ff
LP
85};
86
613b411c
LP
87struct ExecRuntime {
88 int n_ref;
89
90 char *tmp_dir;
91 char *var_tmp_dir;
92
93 int netns_storage_socket[2];
94};
95
5cb5a6ff
LP
96struct ExecContext {
97 char **environment;
8c7be95e
LP
98 char **environment_files;
99
94f04347 100 struct rlimit *rlimit[RLIMIT_NLIMITS];
9eba9da4 101 char *working_directory, *root_directory;
9d58f1db
LP
102
103 mode_t umask;
dd6c17b1 104 int oom_score_adjust;
5cb5a6ff 105 int nice;
9eba9da4 106 int ioprio;
94f04347
LP
107 int cpu_sched_policy;
108 int cpu_sched_priority;
9d58f1db 109
82c121a4
LP
110 cpu_set_t *cpuset;
111 unsigned cpuset_ncpus;
fb33a393 112
80876c20
LP
113 ExecInput std_input;
114 ExecOutput std_output;
115 ExecOutput std_error;
116
d88a251b 117 nsec_t timer_slack_nsec;
071830ff 118
df1f0afe
LP
119 char *tcpwrap_name;
120
9d58f1db 121 char *tty_path;
5cb5a6ff 122
6ea832a2
LP
123 bool tty_reset;
124 bool tty_vhangup;
125 bool tty_vt_disallocate;
126
353e12c2
LP
127 bool ignore_sigpipe;
128
94f04347 129 /* Since resolving these names might might involve socket
5cb5a6ff 130 * connections and we don't want to deadlock ourselves these
94f04347
LP
131 * names are resolved on execution only and in the child
132 * process. */
5cb5a6ff
LP
133 char *user;
134 char *group;
135 char **supplementary_groups;
9d58f1db 136
5b6319dc
LP
137 char *pam_name;
138
169c1bda
LP
139 char *utmp_id;
140
5f8640fb 141 bool selinux_context_ignore;
7b52a628
MS
142 char *selinux_context;
143
15ae422b
LP
144 char **read_write_dirs, **read_only_dirs, **inaccessible_dirs;
145 unsigned long mount_flags;
146
9d58f1db
LP
147 uint64_t capability_bounding_set_drop;
148
149 cap_t capabilities;
150 int secure_bits;
151
7fab9d01
LP
152 int syslog_priority;
153 char *syslog_identifier;
154 bool syslog_level_prefix;
155
9d58f1db
LP
156 bool cpu_sched_reset_on_fork;
157 bool non_blocking;
15ae422b 158 bool private_tmp;
ff01d048 159 bool private_network;
7f112f50 160 bool private_devices;
9d58f1db 161
8351ceae
LP
162 bool no_new_privileges;
163
9d58f1db
LP
164 /* This is not exposed to the user but available
165 * internally. We need it to make sure that whenever we spawn
166 * /bin/mount it is run in the same process group as us so
167 * that the autofs logic detects that it belongs to us and we
168 * don't enter a trigger loop. */
74922904 169 bool same_pgrp;
2e22afe9 170
17df7223 171 Set *syscall_filter;
57183d11 172 Set *syscall_archs;
17df7223
LP
173 int syscall_errno;
174 bool syscall_whitelist:1;
8351ceae 175
dd6c17b1 176 bool oom_score_adjust_set:1;
7fab9d01
LP
177 bool nice_set:1;
178 bool ioprio_set:1;
179 bool cpu_sched_set:1;
5cb5a6ff
LP
180};
181
4ad49000
LP
182#include "cgroup.h"
183
9fb86720 184int exec_spawn(ExecCommand *command,
9e2f7c11 185 char **argv,
c17ec25e 186 ExecContext *context,
c2748801 187 int fds[], unsigned n_fds,
1137a57c 188 char **environment,
81a2b7ce
LP
189 bool apply_permissions,
190 bool apply_chroot,
1e3ad081 191 bool apply_tty_stdin,
80876c20 192 bool confirm_spawn,
4ad49000
LP
193 CGroupControllerMask cgroup_mask,
194 const char *cgroup_path,
62bca2c6 195 const char *unit_id,
09812eb7 196 usec_t watchdog_usec,
f2b68789 197 int pipe_fd[2],
613b411c 198 ExecRuntime *runtime,
81a2b7ce 199 pid_t *ret);
5cb5a6ff 200
43d0fcbd
LP
201void exec_command_done(ExecCommand *c);
202void exec_command_done_array(ExecCommand *c, unsigned n);
203
5cb5a6ff 204void exec_command_free_list(ExecCommand *c);
034c6ed7 205void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 206
9e2f7c11
LP
207char *exec_command_line(char **argv);
208
44d8db9e
LP
209void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
210void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 211void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 212int exec_command_set(ExecCommand *c, const char *path, ...);
44d8db9e 213
034c6ed7 214void exec_context_init(ExecContext *c);
613b411c 215void exec_context_done(ExecContext *c);
5cb5a6ff
LP
216void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
217
8c7be95e
LP
218int exec_context_load_environment(const ExecContext *c, char ***l);
219
6ac8fdc9
MS
220bool exec_context_may_touch_console(ExecContext *c);
221
b58b4116 222void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 223void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 224void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 225
613b411c
LP
226int exec_runtime_make(ExecRuntime **rt, ExecContext *c, const char *id);
227ExecRuntime *exec_runtime_ref(ExecRuntime *r);
228ExecRuntime *exec_runtime_unref(ExecRuntime *r);
229
230int exec_runtime_serialize(ExecRuntime *rt, Unit *u, FILE *f, FDSet *fds);
231int exec_runtime_deserialize_item(ExecRuntime **rt, Unit *u, const char *key, const char *value, FDSet *fds);
232
233void exec_runtime_destroy(ExecRuntime *rt);
234
44a6b1b6
ZJS
235const char* exec_output_to_string(ExecOutput i) _const_;
236ExecOutput exec_output_from_string(const char *s) _pure_;
94f04347 237
44a6b1b6
ZJS
238const char* exec_input_to_string(ExecInput i) _const_;
239ExecInput exec_input_from_string(const char *s) _pure_;