]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
journal: when we shall go down do so cleanly
[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>
5cb5a6ff
LP
36
37#include "list.h"
034c6ed7 38#include "util.h"
613b411c 39#include "fdset.h"
5cb5a6ff 40
80876c20
LP
41typedef enum ExecInput {
42 EXEC_INPUT_NULL,
43 EXEC_INPUT_TTY,
44 EXEC_INPUT_TTY_FORCE,
45 EXEC_INPUT_TTY_FAIL,
4f2d528d 46 EXEC_INPUT_SOCKET,
80876c20
LP
47 _EXEC_INPUT_MAX,
48 _EXEC_INPUT_INVALID = -1
49} ExecInput;
50
071830ff 51typedef enum ExecOutput {
80876c20 52 EXEC_OUTPUT_INHERIT,
94f04347 53 EXEC_OUTPUT_NULL,
80876c20 54 EXEC_OUTPUT_TTY,
94f04347 55 EXEC_OUTPUT_SYSLOG,
28dbc1e8 56 EXEC_OUTPUT_SYSLOG_AND_CONSOLE,
9a6bca7a 57 EXEC_OUTPUT_KMSG,
28dbc1e8 58 EXEC_OUTPUT_KMSG_AND_CONSOLE,
706343f4
LP
59 EXEC_OUTPUT_JOURNAL,
60 EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
4f2d528d 61 EXEC_OUTPUT_SOCKET,
94f04347
LP
62 _EXEC_OUTPUT_MAX,
63 _EXEC_OUTPUT_INVALID = -1
071830ff
LP
64} ExecOutput;
65
5cb5a6ff 66struct ExecStatus {
63983207
LP
67 dual_timestamp start_timestamp;
68 dual_timestamp exit_timestamp;
9d58f1db 69 pid_t pid;
9152c765
LP
70 int code; /* as in siginfo_t::si_code */
71 int status; /* as in sigingo_t::si_status */
5cb5a6ff
LP
72};
73
74struct ExecCommand {
75 char *path;
76 char **argv;
034c6ed7
LP
77 ExecStatus exec_status;
78 LIST_FIELDS(ExecCommand, command); /* useful for chaining commands */
7fab9d01 79 bool ignore;
5cb5a6ff
LP
80};
81
613b411c
LP
82struct ExecRuntime {
83 int n_ref;
84
85 char *tmp_dir;
86 char *var_tmp_dir;
87
88 int netns_storage_socket[2];
89};
90
5cb5a6ff
LP
91struct ExecContext {
92 char **environment;
8c7be95e
LP
93 char **environment_files;
94
94f04347 95 struct rlimit *rlimit[RLIMIT_NLIMITS];
9eba9da4 96 char *working_directory, *root_directory;
9d58f1db
LP
97
98 mode_t umask;
dd6c17b1 99 int oom_score_adjust;
5cb5a6ff 100 int nice;
9eba9da4 101 int ioprio;
94f04347
LP
102 int cpu_sched_policy;
103 int cpu_sched_priority;
9d58f1db 104
82c121a4
LP
105 cpu_set_t *cpuset;
106 unsigned cpuset_ncpus;
fb33a393 107
80876c20
LP
108 ExecInput std_input;
109 ExecOutput std_output;
110 ExecOutput std_error;
111
d88a251b 112 nsec_t timer_slack_nsec;
071830ff 113
df1f0afe
LP
114 char *tcpwrap_name;
115
9d58f1db 116 char *tty_path;
5cb5a6ff 117
6ea832a2
LP
118 bool tty_reset;
119 bool tty_vhangup;
120 bool tty_vt_disallocate;
121
353e12c2
LP
122 bool ignore_sigpipe;
123
94f04347 124 /* Since resolving these names might might involve socket
5cb5a6ff 125 * connections and we don't want to deadlock ourselves these
94f04347
LP
126 * names are resolved on execution only and in the child
127 * process. */
5cb5a6ff
LP
128 char *user;
129 char *group;
130 char **supplementary_groups;
9d58f1db 131
5b6319dc
LP
132 char *pam_name;
133
169c1bda
LP
134 char *utmp_id;
135
15ae422b
LP
136 char **read_write_dirs, **read_only_dirs, **inaccessible_dirs;
137 unsigned long mount_flags;
138
9d58f1db
LP
139 uint64_t capability_bounding_set_drop;
140
141 cap_t capabilities;
142 int secure_bits;
143
7fab9d01
LP
144 int syslog_priority;
145 char *syslog_identifier;
146 bool syslog_level_prefix;
147
9d58f1db
LP
148 bool cpu_sched_reset_on_fork;
149 bool non_blocking;
15ae422b 150 bool private_tmp;
ff01d048 151 bool private_network;
9d58f1db 152
8351ceae
LP
153 bool no_new_privileges;
154
9d58f1db
LP
155 /* This is not exposed to the user but available
156 * internally. We need it to make sure that whenever we spawn
157 * /bin/mount it is run in the same process group as us so
158 * that the autofs logic detects that it belongs to us and we
159 * don't enter a trigger loop. */
74922904 160 bool same_pgrp;
2e22afe9 161
8351ceae
LP
162 uint32_t *syscall_filter;
163
dd6c17b1 164 bool oom_score_adjust_set:1;
7fab9d01
LP
165 bool nice_set:1;
166 bool ioprio_set:1;
167 bool cpu_sched_set:1;
5cb5a6ff
LP
168};
169
4ad49000
LP
170#include "cgroup.h"
171
9fb86720 172int exec_spawn(ExecCommand *command,
9e2f7c11 173 char **argv,
c17ec25e 174 ExecContext *context,
c2748801 175 int fds[], unsigned n_fds,
1137a57c 176 char **environment,
81a2b7ce
LP
177 bool apply_permissions,
178 bool apply_chroot,
1e3ad081 179 bool apply_tty_stdin,
80876c20 180 bool confirm_spawn,
4ad49000
LP
181 CGroupControllerMask cgroup_mask,
182 const char *cgroup_path,
62bca2c6 183 const char *unit_id,
f2b68789 184 int pipe_fd[2],
613b411c 185 ExecRuntime *runtime,
81a2b7ce 186 pid_t *ret);
5cb5a6ff 187
43d0fcbd
LP
188void exec_command_done(ExecCommand *c);
189void exec_command_done_array(ExecCommand *c, unsigned n);
190
5cb5a6ff 191void exec_command_free_list(ExecCommand *c);
034c6ed7 192void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 193
9e2f7c11
LP
194char *exec_command_line(char **argv);
195
44d8db9e
LP
196void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
197void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 198void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 199int exec_command_set(ExecCommand *c, const char *path, ...);
44d8db9e 200
034c6ed7 201void exec_context_init(ExecContext *c);
613b411c 202void exec_context_done(ExecContext *c);
5cb5a6ff
LP
203void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
204
8c7be95e
LP
205int exec_context_load_environment(const ExecContext *c, char ***l);
206
6ac8fdc9
MS
207bool exec_context_may_touch_console(ExecContext *c);
208
b58b4116 209void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 210void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 211void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 212
613b411c
LP
213int exec_runtime_make(ExecRuntime **rt, ExecContext *c, const char *id);
214ExecRuntime *exec_runtime_ref(ExecRuntime *r);
215ExecRuntime *exec_runtime_unref(ExecRuntime *r);
216
217int exec_runtime_serialize(ExecRuntime *rt, Unit *u, FILE *f, FDSet *fds);
218int exec_runtime_deserialize_item(ExecRuntime **rt, Unit *u, const char *key, const char *value, FDSet *fds);
219
220void exec_runtime_destroy(ExecRuntime *rt);
221
44a6b1b6
ZJS
222const char* exec_output_to_string(ExecOutput i) _const_;
223ExecOutput exec_output_from_string(const char *s) _pure_;
94f04347 224
44a6b1b6
ZJS
225const char* exec_input_to_string(ExecInput i) _const_;
226ExecInput exec_input_from_string(const char *s) _pure_;