]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
manager: drop MountAuto= and SwapAuto= options
[thirdparty/systemd.git] / src / core / execute.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5cb5a6ff
LP
2
3#ifndef fooexecutehfoo
4#define fooexecutehfoo
5
a7334b09
LP
6/***
7 This file is part of systemd.
8
9 Copyright 2010 Lennart Poettering
10
11 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
12 under the terms of the GNU Lesser General Public License as published by
13 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
14 (at your option) any later version.
15
16 systemd is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 19 Lesser General Public License for more details.
a7334b09 20
5430f7f2 21 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
22 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23***/
24
5cb5a6ff
LP
25typedef struct ExecStatus ExecStatus;
26typedef struct ExecCommand ExecCommand;
27typedef struct ExecContext ExecContext;
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>
5cb5a6ff 36
8e274523 37struct CGroupBonding;
ab1f0633 38struct CGroupAttribute;
8e274523 39
5cb5a6ff 40#include "list.h"
034c6ed7 41#include "util.h"
5cb5a6ff 42
2e22afe9
LP
43typedef enum KillMode {
44 KILL_CONTROL_GROUP = 0,
2e22afe9
LP
45 KILL_PROCESS,
46 KILL_NONE,
47 _KILL_MODE_MAX,
48 _KILL_MODE_INVALID = -1
49} KillMode;
50
8a0867d6
LP
51typedef enum KillWho {
52 KILL_MAIN,
53 KILL_CONTROL,
54 KILL_ALL,
55 _KILL_WHO_MAX,
56 _KILL_WHO_INVALID = -1
57} KillWho;
58
80876c20
LP
59typedef enum ExecInput {
60 EXEC_INPUT_NULL,
61 EXEC_INPUT_TTY,
62 EXEC_INPUT_TTY_FORCE,
63 EXEC_INPUT_TTY_FAIL,
4f2d528d 64 EXEC_INPUT_SOCKET,
80876c20
LP
65 _EXEC_INPUT_MAX,
66 _EXEC_INPUT_INVALID = -1
67} ExecInput;
68
071830ff 69typedef enum ExecOutput {
80876c20 70 EXEC_OUTPUT_INHERIT,
94f04347 71 EXEC_OUTPUT_NULL,
80876c20 72 EXEC_OUTPUT_TTY,
94f04347 73 EXEC_OUTPUT_SYSLOG,
28dbc1e8 74 EXEC_OUTPUT_SYSLOG_AND_CONSOLE,
9a6bca7a 75 EXEC_OUTPUT_KMSG,
28dbc1e8 76 EXEC_OUTPUT_KMSG_AND_CONSOLE,
706343f4
LP
77 EXEC_OUTPUT_JOURNAL,
78 EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
4f2d528d 79 EXEC_OUTPUT_SOCKET,
94f04347
LP
80 _EXEC_OUTPUT_MAX,
81 _EXEC_OUTPUT_INVALID = -1
071830ff
LP
82} ExecOutput;
83
5cb5a6ff 84struct ExecStatus {
63983207
LP
85 dual_timestamp start_timestamp;
86 dual_timestamp exit_timestamp;
9d58f1db 87 pid_t pid;
9152c765
LP
88 int code; /* as in siginfo_t::si_code */
89 int status; /* as in sigingo_t::si_status */
5cb5a6ff
LP
90};
91
92struct ExecCommand {
93 char *path;
94 char **argv;
034c6ed7
LP
95 ExecStatus exec_status;
96 LIST_FIELDS(ExecCommand, command); /* useful for chaining commands */
7fab9d01 97 bool ignore;
5cb5a6ff
LP
98};
99
100struct ExecContext {
101 char **environment;
8c7be95e
LP
102 char **environment_files;
103
94f04347 104 struct rlimit *rlimit[RLIMIT_NLIMITS];
9eba9da4 105 char *working_directory, *root_directory;
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
7fab9d01 121 unsigned long timer_slack_nsec;
071830ff 122
df1f0afe
LP
123 char *tcpwrap_name;
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
94f04347 133 /* Since resolving these names might 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
LP
143 char *utmp_id;
144
15ae422b
LP
145 char **read_write_dirs, **read_only_dirs, **inaccessible_dirs;
146 unsigned long mount_flags;
147
9d58f1db
LP
148 uint64_t capability_bounding_set_drop;
149
7fab9d01
LP
150 /* Not relevant for spawning processes, just for killing */
151 KillMode kill_mode;
152 int kill_signal;
ba035df2 153 bool send_sigkill;
7fab9d01 154
9d58f1db
LP
155 cap_t capabilities;
156 int secure_bits;
157
7fab9d01
LP
158 int syslog_priority;
159 char *syslog_identifier;
160 bool syslog_level_prefix;
161
9d58f1db
LP
162 bool cpu_sched_reset_on_fork;
163 bool non_blocking;
15ae422b 164 bool private_tmp;
ff01d048 165 bool private_network;
9d58f1db 166
64747e2d 167 bool control_group_modify;
891703e1 168 int control_group_persistent;
64747e2d 169
9d58f1db
LP
170 /* This is not exposed to the user but available
171 * internally. We need it to make sure that whenever we spawn
172 * /bin/mount it is run in the same process group as us so
173 * that the autofs logic detects that it belongs to us and we
174 * don't enter a trigger loop. */
74922904 175 bool same_pgrp;
2e22afe9 176
dd6c17b1 177 bool oom_score_adjust_set:1;
7fab9d01
LP
178 bool nice_set:1;
179 bool ioprio_set:1;
180 bool cpu_sched_set:1;
181 bool timer_slack_nsec_set:1;
5cb5a6ff
LP
182};
183
9fb86720 184int exec_spawn(ExecCommand *command,
9e2f7c11 185 char **argv,
81a2b7ce 186 const 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,
8e274523 193 struct CGroupBonding *cgroup_bondings,
ab1f0633 194 struct CGroupAttribute *cgroup_attributes,
ecedd90f 195 const char *cgroup_suffix,
81a2b7ce 196 pid_t *ret);
5cb5a6ff 197
43d0fcbd
LP
198void exec_command_done(ExecCommand *c);
199void exec_command_done_array(ExecCommand *c, unsigned n);
200
5cb5a6ff 201void exec_command_free_list(ExecCommand *c);
034c6ed7 202void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 203
9e2f7c11
LP
204char *exec_command_line(char **argv);
205
44d8db9e
LP
206void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
207void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 208void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 209int exec_command_set(ExecCommand *c, const char *path, ...);
44d8db9e 210
034c6ed7
LP
211void exec_context_init(ExecContext *c);
212void exec_context_done(ExecContext *c);
5cb5a6ff 213void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
6ea832a2 214void exec_context_tty_reset(const ExecContext *context);
5cb5a6ff 215
8c7be95e
LP
216int exec_context_load_environment(const ExecContext *c, char ***l);
217
b58b4116 218void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 219void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 220void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 221
94f04347 222const char* exec_output_to_string(ExecOutput i);
1365b53f 223ExecOutput exec_output_from_string(const char *s);
94f04347
LP
224
225const char* exec_input_to_string(ExecInput i);
1365b53f 226ExecInput exec_input_from_string(const char *s);
94f04347 227
8a0867d6
LP
228const char *kill_mode_to_string(KillMode k);
229KillMode kill_mode_from_string(const char *s);
230
231const char *kill_who_to_string(KillWho k);
232KillWho kill_who_from_string(const char *s);
233
5cb5a6ff 234#endif