Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : : #pragma once
3 : :
4 : : #include <sched.h>
5 : : #include <stdio.h>
6 : :
7 : : #if HAVE_SECCOMP
8 : : #include <seccomp.h>
9 : : #endif
10 : :
11 : : #include "sd-bus.h"
12 : : #include "sd-id128.h"
13 : :
14 : : #include "capability-util.h"
15 : : #include "conf-parser.h"
16 : : #include "cpu-set-util.h"
17 : : #include "macro.h"
18 : : #include "missing_resource.h"
19 : : #include "nspawn-expose-ports.h"
20 : : #include "nspawn-mount.h"
21 : : #include "time-util.h"
22 : :
23 : : typedef enum StartMode {
24 : : START_PID1, /* Run parameters as command line as process 1 */
25 : : START_PID2, /* Use stub init process as PID 1, run parameters as command line as process 2 */
26 : : START_BOOT, /* Search for init system, pass arguments as parameters */
27 : : _START_MODE_MAX,
28 : : _START_MODE_INVALID = -1
29 : : } StartMode;
30 : :
31 : : typedef enum UserNamespaceMode {
32 : : USER_NAMESPACE_NO,
33 : : USER_NAMESPACE_FIXED,
34 : : USER_NAMESPACE_PICK,
35 : : _USER_NAMESPACE_MODE_MAX,
36 : : _USER_NAMESPACE_MODE_INVALID = -1,
37 : : } UserNamespaceMode;
38 : :
39 : : typedef enum ResolvConfMode {
40 : : RESOLV_CONF_OFF,
41 : : RESOLV_CONF_COPY_HOST,
42 : : RESOLV_CONF_COPY_STATIC,
43 : : RESOLV_CONF_BIND_HOST,
44 : : RESOLV_CONF_BIND_STATIC,
45 : : RESOLV_CONF_DELETE,
46 : : RESOLV_CONF_AUTO,
47 : : _RESOLV_CONF_MODE_MAX,
48 : : _RESOLV_CONF_MODE_INVALID = -1
49 : : } ResolvConfMode;
50 : :
51 : : typedef enum LinkJournal {
52 : : LINK_NO,
53 : : LINK_AUTO,
54 : : LINK_HOST,
55 : : LINK_GUEST,
56 : : _LINK_JOURNAL_MAX,
57 : : _LINK_JOURNAL_INVALID = -1
58 : : } LinkJournal;
59 : :
60 : : typedef enum TimezoneMode {
61 : : TIMEZONE_OFF,
62 : : TIMEZONE_COPY,
63 : : TIMEZONE_BIND,
64 : : TIMEZONE_SYMLINK,
65 : : TIMEZONE_DELETE,
66 : : TIMEZONE_AUTO,
67 : : _TIMEZONE_MODE_MAX,
68 : : _TIMEZONE_MODE_INVALID = -1
69 : : } TimezoneMode;
70 : :
71 : : typedef enum ConsoleMode {
72 : : CONSOLE_INTERACTIVE,
73 : : CONSOLE_READ_ONLY,
74 : : CONSOLE_PASSIVE,
75 : : CONSOLE_PIPE,
76 : : _CONSOLE_MODE_MAX,
77 : : _CONSOLE_MODE_INVALID = -1,
78 : : } ConsoleMode;
79 : :
80 : : typedef enum SettingsMask {
81 : : SETTING_START_MODE = UINT64_C(1) << 0,
82 : : SETTING_ENVIRONMENT = UINT64_C(1) << 1,
83 : : SETTING_USER = UINT64_C(1) << 2,
84 : : SETTING_CAPABILITY = UINT64_C(1) << 3,
85 : : SETTING_KILL_SIGNAL = UINT64_C(1) << 4,
86 : : SETTING_PERSONALITY = UINT64_C(1) << 5,
87 : : SETTING_MACHINE_ID = UINT64_C(1) << 6,
88 : : SETTING_NETWORK = UINT64_C(1) << 7,
89 : : SETTING_EXPOSE_PORTS = UINT64_C(1) << 8,
90 : : SETTING_READ_ONLY = UINT64_C(1) << 9,
91 : : SETTING_VOLATILE_MODE = UINT64_C(1) << 10,
92 : : SETTING_CUSTOM_MOUNTS = UINT64_C(1) << 11,
93 : : SETTING_WORKING_DIRECTORY = UINT64_C(1) << 12,
94 : : SETTING_USERNS = UINT64_C(1) << 13,
95 : : SETTING_NOTIFY_READY = UINT64_C(1) << 14,
96 : : SETTING_PIVOT_ROOT = UINT64_C(1) << 15,
97 : : SETTING_SYSCALL_FILTER = UINT64_C(1) << 16,
98 : : SETTING_HOSTNAME = UINT64_C(1) << 17,
99 : : SETTING_NO_NEW_PRIVILEGES = UINT64_C(1) << 18,
100 : : SETTING_OOM_SCORE_ADJUST = UINT64_C(1) << 19,
101 : : SETTING_CPU_AFFINITY = UINT64_C(1) << 20,
102 : : SETTING_RESOLV_CONF = UINT64_C(1) << 21,
103 : : SETTING_LINK_JOURNAL = UINT64_C(1) << 22,
104 : : SETTING_TIMEZONE = UINT64_C(1) << 23,
105 : : SETTING_EPHEMERAL = UINT64_C(1) << 24,
106 : : SETTING_SLICE = UINT64_C(1) << 25,
107 : : SETTING_DIRECTORY = UINT64_C(1) << 26,
108 : : SETTING_USE_CGNS = UINT64_C(1) << 27,
109 : : SETTING_CLONE_NS_FLAGS = UINT64_C(1) << 28,
110 : : SETTING_CONSOLE_MODE = UINT64_C(1) << 29,
111 : : SETTING_RLIMIT_FIRST = UINT64_C(1) << 30, /* we define one bit per resource limit here */
112 : : SETTING_RLIMIT_LAST = UINT64_C(1) << (30 + _RLIMIT_MAX - 1),
113 : : _SETTINGS_MASK_ALL = (UINT64_C(1) << (30 + _RLIMIT_MAX)) -1,
114 : : _SETTING_FORCE_ENUM_WIDTH = UINT64_MAX
115 : : } SettingsMask;
116 : :
117 : : /* We want to use SETTING_RLIMIT_FIRST in shifts, so make sure it is really 64 bits
118 : : * when used in expressions. */
119 : : #define SETTING_RLIMIT_FIRST ((uint64_t) SETTING_RLIMIT_FIRST)
120 : : #define SETTING_RLIMIT_LAST ((uint64_t) SETTING_RLIMIT_LAST)
121 : :
122 : : assert_cc(sizeof(SettingsMask) == 8);
123 : : assert_cc(sizeof(SETTING_RLIMIT_FIRST) == 8);
124 : : assert_cc(sizeof(SETTING_RLIMIT_LAST) == 8);
125 : :
126 : : typedef struct DeviceNode {
127 : : char *path;
128 : : unsigned major;
129 : : unsigned minor;
130 : : mode_t mode;
131 : : uid_t uid;
132 : : gid_t gid;
133 : : } DeviceNode;
134 : :
135 : : typedef struct OciHook {
136 : : char *path;
137 : : char **args;
138 : : char **env;
139 : : usec_t timeout;
140 : : } OciHook;
141 : :
142 : : typedef struct Settings {
143 : : /* [Run] */
144 : : StartMode start_mode;
145 : : bool ephemeral;
146 : : char **parameters;
147 : : char **environment;
148 : : char *user;
149 : : uint64_t capability;
150 : : uint64_t drop_capability;
151 : : int kill_signal;
152 : : unsigned long personality;
153 : : sd_id128_t machine_id;
154 : : char *working_directory;
155 : : char *pivot_root_new;
156 : : char *pivot_root_old;
157 : : UserNamespaceMode userns_mode;
158 : : uid_t uid_shift, uid_range;
159 : : bool notify_ready;
160 : : char **syscall_whitelist;
161 : : char **syscall_blacklist;
162 : : struct rlimit *rlimit[_RLIMIT_MAX];
163 : : char *hostname;
164 : : int no_new_privileges;
165 : : int oom_score_adjust;
166 : : bool oom_score_adjust_set;
167 : : CPUSet cpu_set;
168 : : ResolvConfMode resolv_conf;
169 : : LinkJournal link_journal;
170 : : bool link_journal_try;
171 : : TimezoneMode timezone;
172 : :
173 : : /* [Image] */
174 : : int read_only;
175 : : VolatileMode volatile_mode;
176 : : CustomMount *custom_mounts;
177 : : size_t n_custom_mounts;
178 : : int userns_chown;
179 : :
180 : : /* [Network] */
181 : : int private_network;
182 : : int network_veth;
183 : : char *network_bridge;
184 : : char *network_zone;
185 : : char **network_interfaces;
186 : : char **network_macvlan;
187 : : char **network_ipvlan;
188 : : char **network_veth_extra;
189 : : ExposePort *expose_ports;
190 : :
191 : : /* Additional fields, that are specific to OCI runtime case */
192 : : char *bundle;
193 : : char *root;
194 : : OciHook *oci_hooks_prestart, *oci_hooks_poststart, *oci_hooks_poststop;
195 : : size_t n_oci_hooks_prestart, n_oci_hooks_poststart, n_oci_hooks_poststop;
196 : : char *slice;
197 : : sd_bus_message *properties;
198 : : CapabilityQuintet full_capabilities;
199 : : uid_t uid;
200 : : gid_t gid;
201 : : gid_t *supplementary_gids;
202 : : size_t n_supplementary_gids;
203 : : unsigned console_width, console_height;
204 : : ConsoleMode console_mode;
205 : : DeviceNode *extra_nodes;
206 : : size_t n_extra_nodes;
207 : : unsigned long clone_ns_flags;
208 : : char *network_namespace_path;
209 : : int use_cgns;
210 : : char **sysctl;
211 : : #if HAVE_SECCOMP
212 : : scmp_filter_ctx seccomp;
213 : : #endif
214 : : } Settings;
215 : :
216 : : Settings *settings_new(void);
217 : : int settings_load(FILE *f, const char *path, Settings **ret);
218 : : Settings* settings_free(Settings *s);
219 : :
220 : : bool settings_network_veth(Settings *s);
221 : : bool settings_private_network(Settings *s);
222 : : int settings_allocate_properties(Settings *s);
223 : :
224 [ # # ]: 0 : DEFINE_TRIVIAL_CLEANUP_FUNC(Settings*, settings_free);
225 : :
226 : : const struct ConfigPerfItem* nspawn_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
227 : :
228 : : CONFIG_PARSER_PROTOTYPE(config_parse_capability);
229 : : CONFIG_PARSER_PROTOTYPE(config_parse_id128);
230 : : CONFIG_PARSER_PROTOTYPE(config_parse_expose_port);
231 : : CONFIG_PARSER_PROTOTYPE(config_parse_volatile_mode);
232 : : CONFIG_PARSER_PROTOTYPE(config_parse_pivot_root);
233 : : CONFIG_PARSER_PROTOTYPE(config_parse_bind);
234 : : CONFIG_PARSER_PROTOTYPE(config_parse_tmpfs);
235 : : CONFIG_PARSER_PROTOTYPE(config_parse_overlay);
236 : : CONFIG_PARSER_PROTOTYPE(config_parse_inaccessible);
237 : : CONFIG_PARSER_PROTOTYPE(config_parse_veth_extra);
238 : : CONFIG_PARSER_PROTOTYPE(config_parse_network_zone);
239 : : CONFIG_PARSER_PROTOTYPE(config_parse_boot);
240 : : CONFIG_PARSER_PROTOTYPE(config_parse_pid2);
241 : : CONFIG_PARSER_PROTOTYPE(config_parse_private_users);
242 : : CONFIG_PARSER_PROTOTYPE(config_parse_syscall_filter);
243 : : CONFIG_PARSER_PROTOTYPE(config_parse_hostname);
244 : : CONFIG_PARSER_PROTOTYPE(config_parse_oom_score_adjust);
245 : : CONFIG_PARSER_PROTOTYPE(config_parse_cpu_affinity);
246 : : CONFIG_PARSER_PROTOTYPE(config_parse_resolv_conf);
247 : : CONFIG_PARSER_PROTOTYPE(config_parse_link_journal);
248 : : CONFIG_PARSER_PROTOTYPE(config_parse_timezone);
249 : :
250 : : const char *resolv_conf_mode_to_string(ResolvConfMode a) _const_;
251 : : ResolvConfMode resolv_conf_mode_from_string(const char *s) _pure_;
252 : :
253 : : const char *timezone_mode_to_string(TimezoneMode a) _const_;
254 : : TimezoneMode timezone_mode_from_string(const char *s) _pure_;
255 : :
256 : : int parse_link_journal(const char *s, LinkJournal *ret_mode, bool *ret_try);
257 : :
258 : : void device_node_array_free(DeviceNode *node, size_t n);
|