]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/execute.h
core: general cgroup rework
[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;
27
dacdf153 28#include <linux/types.h>
5cb5a6ff
LP
29#include <sys/time.h>
30#include <sys/resource.h>
31#include <sys/capability.h>
32#include <stdbool.h>
33#include <stdio.h>
94f04347 34#include <sched.h>
5cb5a6ff
LP
35
36#include "list.h"
034c6ed7 37#include "util.h"
5cb5a6ff 38
4ad49000
LP
39typedef struct Unit Unit;
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
82struct ExecContext {
83 char **environment;
8c7be95e
LP
84 char **environment_files;
85
94f04347 86 struct rlimit *rlimit[RLIMIT_NLIMITS];
9eba9da4 87 char *working_directory, *root_directory;
9d58f1db
LP
88
89 mode_t umask;
dd6c17b1 90 int oom_score_adjust;
5cb5a6ff 91 int nice;
9eba9da4 92 int ioprio;
94f04347
LP
93 int cpu_sched_policy;
94 int cpu_sched_priority;
9d58f1db 95
82c121a4
LP
96 cpu_set_t *cpuset;
97 unsigned cpuset_ncpus;
fb33a393 98
80876c20
LP
99 ExecInput std_input;
100 ExecOutput std_output;
101 ExecOutput std_error;
102
d88a251b 103 nsec_t timer_slack_nsec;
071830ff 104
df1f0afe
LP
105 char *tcpwrap_name;
106
9d58f1db 107 char *tty_path;
5cb5a6ff 108
6ea832a2
LP
109 bool tty_reset;
110 bool tty_vhangup;
111 bool tty_vt_disallocate;
112
353e12c2
LP
113 bool ignore_sigpipe;
114
94f04347 115 /* Since resolving these names might might involve socket
5cb5a6ff 116 * connections and we don't want to deadlock ourselves these
94f04347
LP
117 * names are resolved on execution only and in the child
118 * process. */
5cb5a6ff
LP
119 char *user;
120 char *group;
121 char **supplementary_groups;
9d58f1db 122
5b6319dc
LP
123 char *pam_name;
124
169c1bda
LP
125 char *utmp_id;
126
15ae422b
LP
127 char **read_write_dirs, **read_only_dirs, **inaccessible_dirs;
128 unsigned long mount_flags;
129
9d58f1db
LP
130 uint64_t capability_bounding_set_drop;
131
132 cap_t capabilities;
133 int secure_bits;
134
7fab9d01
LP
135 int syslog_priority;
136 char *syslog_identifier;
137 bool syslog_level_prefix;
138
9d58f1db
LP
139 bool cpu_sched_reset_on_fork;
140 bool non_blocking;
15ae422b 141 bool private_tmp;
ff01d048 142 bool private_network;
c17ec25e
MS
143 char *tmp_dir;
144 char *var_tmp_dir;
9d58f1db 145
8351ceae
LP
146 bool no_new_privileges;
147
9d58f1db
LP
148 /* This is not exposed to the user but available
149 * internally. We need it to make sure that whenever we spawn
150 * /bin/mount it is run in the same process group as us so
151 * that the autofs logic detects that it belongs to us and we
152 * don't enter a trigger loop. */
74922904 153 bool same_pgrp;
2e22afe9 154
8351ceae
LP
155 uint32_t *syscall_filter;
156
dd6c17b1 157 bool oom_score_adjust_set:1;
7fab9d01
LP
158 bool nice_set:1;
159 bool ioprio_set:1;
160 bool cpu_sched_set:1;
5cb5a6ff
LP
161};
162
4ad49000
LP
163#include "cgroup.h"
164
9fb86720 165int exec_spawn(ExecCommand *command,
9e2f7c11 166 char **argv,
c17ec25e 167 ExecContext *context,
c2748801 168 int fds[], unsigned n_fds,
1137a57c 169 char **environment,
81a2b7ce
LP
170 bool apply_permissions,
171 bool apply_chroot,
1e3ad081 172 bool apply_tty_stdin,
80876c20 173 bool confirm_spawn,
4ad49000
LP
174 CGroupControllerMask cgroup_mask,
175 const char *cgroup_path,
62bca2c6 176 const char *unit_id,
f2b68789 177 int pipe_fd[2],
81a2b7ce 178 pid_t *ret);
5cb5a6ff 179
43d0fcbd
LP
180void exec_command_done(ExecCommand *c);
181void exec_command_done_array(ExecCommand *c, unsigned n);
182
5cb5a6ff 183void exec_command_free_list(ExecCommand *c);
034c6ed7 184void exec_command_free_array(ExecCommand **c, unsigned n);
5cb5a6ff 185
9e2f7c11
LP
186char *exec_command_line(char **argv);
187
44d8db9e
LP
188void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
189void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
a6a80b4f 190void exec_command_append_list(ExecCommand **l, ExecCommand *e);
26fd040d 191int exec_command_set(ExecCommand *c, const char *path, ...);
44d8db9e 192
034c6ed7 193void exec_context_init(ExecContext *c);
c17ec25e
MS
194void exec_context_done(ExecContext *c, bool reloading_or_reexecuting);
195void exec_context_tmp_dirs_done(ExecContext *c);
5cb5a6ff 196void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
6ea832a2 197void exec_context_tty_reset(const ExecContext *context);
5cb5a6ff 198
8c7be95e
LP
199int exec_context_load_environment(const ExecContext *c, char ***l);
200
6ac8fdc9 201bool exec_context_may_touch_console(ExecContext *c);
c17ec25e 202void exec_context_serialize(const ExecContext *c, Unit *u, FILE *f);
6ac8fdc9 203
b58b4116 204void exec_status_start(ExecStatus *s, pid_t pid);
6ea832a2 205void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
9fb86720 206void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
5cb5a6ff 207
44a6b1b6
ZJS
208const char* exec_output_to_string(ExecOutput i) _const_;
209ExecOutput exec_output_from_string(const char *s) _pure_;
94f04347 210
44a6b1b6
ZJS
211const char* exec_input_to_string(ExecInput i) _const_;
212ExecInput exec_input_from_string(const char *s) _pure_;