]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
units: don't enforce a holdoff time for journald, logind, udevd
[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
d88a251b 121 nsec_t 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
8351ceae
LP
167 bool no_new_privileges;
168
64747e2d 169 bool control_group_modify;
891703e1 170 int control_group_persistent;
64747e2d 171
9d58f1db
LP
172 /* This is not exposed to the user but available
173 * internally. We need it to make sure that whenever we spawn
174 * /bin/mount it is run in the same process group as us so
175 * that the autofs logic detects that it belongs to us and we
176 * don't enter a trigger loop. */
74922904 177 bool same_pgrp;
2e22afe9 178
8351ceae
LP
179 uint32_t *syscall_filter;
180
dd6c17b1 181 bool oom_score_adjust_set:1;
7fab9d01
LP
182 bool nice_set:1;
183 bool ioprio_set:1;
184 bool cpu_sched_set:1;
5cb5a6ff
LP
185};
186
9fb86720 187int exec_spawn(ExecCommand *command,
9e2f7c11 188 char **argv,
81a2b7ce 189 const ExecContext *context,
c2748801 190 int fds[], unsigned n_fds,
1137a57c 191 char **environment,
81a2b7ce
LP
192 bool apply_permissions,
193 bool apply_chroot,
1e3ad081 194 bool apply_tty_stdin,
80876c20 195 bool confirm_spawn,
8e274523 196 struct CGroupBonding *cgroup_bondings,
ab1f0633 197 struct CGroupAttribute *cgroup_attributes,
ecedd90f 198 const char *cgroup_suffix,
62bca2c6 199 const char *unit_id,
f2b68789 200 int pipe_fd[2],
81a2b7ce 201 pid_t *ret);
5cb5a6ff 202
43d0fcbd
LP
203void exec_command_done(ExecCommand *c);
204void exec_command_done_array(ExecCommand *c, unsigned n);
205
5cb5a6ff 206void exec_command_free_list(ExecCommand *c);
034c6ed7 207void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 208
9e2f7c11
LP
209char *exec_command_line(char **argv);
210
44d8db9e
LP
211void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
212void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 213void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 214int exec_command_set(ExecCommand *c, const char *path, ...);
44d8db9e 215
034c6ed7
LP
216void exec_context_init(ExecContext *c);
217void exec_context_done(ExecContext *c);
5cb5a6ff 218void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
6ea832a2 219void exec_context_tty_reset(const ExecContext *context);
5cb5a6ff 220
8c7be95e
LP
221int exec_context_load_environment(const ExecContext *c, char ***l);
222
b58b4116 223void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 224void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 225void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 226
94f04347 227const char* exec_output_to_string(ExecOutput i);
1365b53f 228ExecOutput exec_output_from_string(const char *s);
94f04347
LP
229
230const char* exec_input_to_string(ExecInput i);
1365b53f 231ExecInput exec_input_from_string(const char *s);
94f04347 232
8a0867d6
LP
233const char *kill_mode_to_string(KillMode k);
234KillMode kill_mode_from_string(const char *s);
235
236const char *kill_who_to_string(KillWho k);
237KillWho kill_who_from_string(const char *s);
238
5cb5a6ff 239#endif