chiark / gitweb /
core: remove tcpwrap support
[elogind.git] / src / core / execute.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
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
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
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
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 typedef struct ExecStatus ExecStatus;
25 typedef struct ExecCommand ExecCommand;
26 typedef struct ExecContext ExecContext;
27 typedef struct ExecRuntime ExecRuntime;
28
29 #include <linux/types.h>
30 #include <sys/time.h>
31 #include <sys/resource.h>
32 #include <sys/capability.h>
33 #include <stdbool.h>
34 #include <stdio.h>
35 #include <sched.h>
36
37 #include "list.h"
38 #include "util.h"
39 #include "set.h"
40 #include "fdset.h"
41 #include "missing.h"
42
43 typedef enum ExecInput {
44         EXEC_INPUT_NULL,
45         EXEC_INPUT_TTY,
46         EXEC_INPUT_TTY_FORCE,
47         EXEC_INPUT_TTY_FAIL,
48         EXEC_INPUT_SOCKET,
49         _EXEC_INPUT_MAX,
50         _EXEC_INPUT_INVALID = -1
51 } ExecInput;
52
53 typedef enum ExecOutput {
54         EXEC_OUTPUT_INHERIT,
55         EXEC_OUTPUT_NULL,
56         EXEC_OUTPUT_TTY,
57         EXEC_OUTPUT_SYSLOG,
58         EXEC_OUTPUT_SYSLOG_AND_CONSOLE,
59         EXEC_OUTPUT_KMSG,
60         EXEC_OUTPUT_KMSG_AND_CONSOLE,
61         EXEC_OUTPUT_JOURNAL,
62         EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
63         EXEC_OUTPUT_SOCKET,
64         _EXEC_OUTPUT_MAX,
65         _EXEC_OUTPUT_INVALID = -1
66 } ExecOutput;
67
68 struct ExecStatus {
69         dual_timestamp start_timestamp;
70         dual_timestamp exit_timestamp;
71         pid_t pid;
72         int code;     /* as in siginfo_t::si_code */
73         int status;   /* as in sigingo_t::si_status */
74 };
75
76 struct ExecCommand {
77         char *path;
78         char **argv;
79         ExecStatus exec_status;
80         LIST_FIELDS(ExecCommand, command); /* useful for chaining commands */
81         bool ignore;
82 };
83
84 struct ExecRuntime {
85         int n_ref;
86
87         char *tmp_dir;
88         char *var_tmp_dir;
89
90         int netns_storage_socket[2];
91 };
92
93 struct ExecContext {
94         char **environment;
95         char **environment_files;
96
97         struct rlimit *rlimit[_RLIMIT_MAX];
98         char *working_directory, *root_directory;
99
100         mode_t umask;
101         int oom_score_adjust;
102         int nice;
103         int ioprio;
104         int cpu_sched_policy;
105         int cpu_sched_priority;
106
107         cpu_set_t *cpuset;
108         unsigned cpuset_ncpus;
109
110         ExecInput std_input;
111         ExecOutput std_output;
112         ExecOutput std_error;
113
114         nsec_t timer_slack_nsec;
115
116         char *tty_path;
117
118         bool tty_reset;
119         bool tty_vhangup;
120         bool tty_vt_disallocate;
121
122         bool ignore_sigpipe;
123
124         /* Since resolving these names might might involve socket
125          * connections and we don't want to deadlock ourselves these
126          * names are resolved on execution only and in the child
127          * process. */
128         char *user;
129         char *group;
130         char **supplementary_groups;
131
132         char *pam_name;
133
134         char *utmp_id;
135
136         bool selinux_context_ignore;
137         char *selinux_context;
138
139         bool apparmor_profile_ignore;
140         char *apparmor_profile;
141
142         char **read_write_dirs, **read_only_dirs, **inaccessible_dirs;
143         unsigned long mount_flags;
144
145         uint64_t capability_bounding_set_drop;
146
147         cap_t capabilities;
148         int secure_bits;
149
150         int syslog_priority;
151         char *syslog_identifier;
152         bool syslog_level_prefix;
153
154         bool cpu_sched_reset_on_fork;
155         bool non_blocking;
156         bool private_tmp;
157         bool private_network;
158         bool private_devices;
159
160         bool no_new_privileges;
161
162         /* This is not exposed to the user but available
163          * internally. We need it to make sure that whenever we spawn
164          * /bin/mount it is run in the same process group as us so
165          * that the autofs logic detects that it belongs to us and we
166          * don't enter a trigger loop. */
167         bool same_pgrp;
168
169         unsigned long personality;
170
171         Set *syscall_filter;
172         Set *syscall_archs;
173         int syscall_errno;
174         bool syscall_whitelist:1;
175
176         Set *address_families;
177         bool address_families_whitelist:1;
178
179         char **runtime_directory;
180         mode_t runtime_directory_mode;
181
182         bool oom_score_adjust_set:1;
183         bool nice_set:1;
184         bool ioprio_set:1;
185         bool cpu_sched_set:1;
186         bool no_new_privileges_set:1;
187 };
188
189 #include "cgroup.h"
190
191 int exec_spawn(ExecCommand *command,
192                char **argv,
193                ExecContext *context,
194                int fds[], unsigned n_fds,
195                char **environment,
196                bool apply_permissions,
197                bool apply_chroot,
198                bool apply_tty_stdin,
199                bool confirm_spawn,
200                CGroupControllerMask cgroup_mask,
201                const char *cgroup_path,
202                const char *runtime_prefix,
203                const char *unit_id,
204                usec_t watchdog_usec,
205                int pipe_fd[2],
206                ExecRuntime *runtime,
207                pid_t *ret);
208
209 void exec_command_done(ExecCommand *c);
210 void exec_command_done_array(ExecCommand *c, unsigned n);
211
212 void exec_command_free_list(ExecCommand *c);
213 void exec_command_free_array(ExecCommand **c, unsigned n);
214
215 char *exec_command_line(char **argv);
216
217 void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
218 void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
219 void exec_command_append_list(ExecCommand **l, ExecCommand *e);
220 int exec_command_set(ExecCommand *c, const char *path, ...);
221
222 void exec_context_init(ExecContext *c);
223 void exec_context_done(ExecContext *c);
224 void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
225
226 int exec_context_destroy_runtime_directory(ExecContext *c, const char *runtime_root);
227
228 int exec_context_load_environment(const ExecContext *c, char ***l);
229
230 bool exec_context_may_touch_console(ExecContext *c);
231
232 void exec_status_start(ExecStatus *s, pid_t pid);
233 void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
234 void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
235
236 int exec_runtime_make(ExecRuntime **rt, ExecContext *c, const char *id);
237 ExecRuntime *exec_runtime_ref(ExecRuntime *r);
238 ExecRuntime *exec_runtime_unref(ExecRuntime *r);
239
240 int exec_runtime_serialize(ExecRuntime *rt, Unit *u, FILE *f, FDSet *fds);
241 int exec_runtime_deserialize_item(ExecRuntime **rt, Unit *u, const char *key, const char *value, FDSet *fds);
242
243 void exec_runtime_destroy(ExecRuntime *rt);
244
245 const char* exec_output_to_string(ExecOutput i) _const_;
246 ExecOutput exec_output_from_string(const char *s) _pure_;
247
248 const char* exec_input_to_string(ExecInput i) _const_;
249 ExecInput exec_input_from_string(const char *s) _pure_;