]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
Revert "man: systemd.service(5): clarify behavior of SuccessExitStatus"
[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
7b52a628
MS
141 char *selinux_context;
142
15ae422b
LP
143 char **read_write_dirs, **read_only_dirs, **inaccessible_dirs;
144 unsigned long mount_flags;
145
9d58f1db
LP
146 uint64_t capability_bounding_set_drop;
147
148 cap_t capabilities;
149 int secure_bits;
150
7fab9d01
LP
151 int syslog_priority;
152 char *syslog_identifier;
153 bool syslog_level_prefix;
154
9d58f1db
LP
155 bool cpu_sched_reset_on_fork;
156 bool non_blocking;
15ae422b 157 bool private_tmp;
ff01d048 158 bool private_network;
7f112f50 159 bool private_devices;
9d58f1db 160
8351ceae
LP
161 bool no_new_privileges;
162
9d58f1db
LP
163 /* This is not exposed to the user but available
164 * internally. We need it to make sure that whenever we spawn
165 * /bin/mount it is run in the same process group as us so
166 * that the autofs logic detects that it belongs to us and we
167 * don't enter a trigger loop. */
74922904 168 bool same_pgrp;
2e22afe9 169
17df7223 170 Set *syscall_filter;
57183d11 171 Set *syscall_archs;
17df7223
LP
172 int syscall_errno;
173 bool syscall_whitelist:1;
8351ceae 174
dd6c17b1 175 bool oom_score_adjust_set:1;
7fab9d01
LP
176 bool nice_set:1;
177 bool ioprio_set:1;
178 bool cpu_sched_set:1;
5cb5a6ff
LP
179};
180
4ad49000
LP
181#include "cgroup.h"
182
9fb86720 183int exec_spawn(ExecCommand *command,
9e2f7c11 184 char **argv,
c17ec25e 185 ExecContext *context,
c2748801 186 int fds[], unsigned n_fds,
1137a57c 187 char **environment,
81a2b7ce
LP
188 bool apply_permissions,
189 bool apply_chroot,
1e3ad081 190 bool apply_tty_stdin,
80876c20 191 bool confirm_spawn,
4ad49000
LP
192 CGroupControllerMask cgroup_mask,
193 const char *cgroup_path,
62bca2c6 194 const char *unit_id,
09812eb7 195 usec_t watchdog_usec,
f2b68789 196 int pipe_fd[2],
613b411c 197 ExecRuntime *runtime,
81a2b7ce 198 pid_t *ret);
5cb5a6ff 199
43d0fcbd
LP
200void exec_command_done(ExecCommand *c);
201void exec_command_done_array(ExecCommand *c, unsigned n);
202
5cb5a6ff 203void exec_command_free_list(ExecCommand *c);
034c6ed7 204void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 205
9e2f7c11
LP
206char *exec_command_line(char **argv);
207
44d8db9e
LP
208void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
209void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 210void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 211int exec_command_set(ExecCommand *c, const char *path, ...);
44d8db9e 212
034c6ed7 213void exec_context_init(ExecContext *c);
613b411c 214void exec_context_done(ExecContext *c);
5cb5a6ff
LP
215void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
216
8c7be95e
LP
217int exec_context_load_environment(const ExecContext *c, char ***l);
218
6ac8fdc9
MS
219bool exec_context_may_touch_console(ExecContext *c);
220
b58b4116 221void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 222void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 223void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 224
613b411c
LP
225int exec_runtime_make(ExecRuntime **rt, ExecContext *c, const char *id);
226ExecRuntime *exec_runtime_ref(ExecRuntime *r);
227ExecRuntime *exec_runtime_unref(ExecRuntime *r);
228
229int exec_runtime_serialize(ExecRuntime *rt, Unit *u, FILE *f, FDSet *fds);
230int exec_runtime_deserialize_item(ExecRuntime **rt, Unit *u, const char *key, const char *value, FDSet *fds);
231
232void exec_runtime_destroy(ExecRuntime *rt);
233
44a6b1b6
ZJS
234const char* exec_output_to_string(ExecOutput i) _const_;
235ExecOutput exec_output_from_string(const char *s) _pure_;
94f04347 236
44a6b1b6
ZJS
237const char* exec_input_to_string(ExecInput i) _const_;
238ExecInput exec_input_from_string(const char *s) _pure_;