1 /* SPDX-License-Identifier: LGPL-2.1+ */
14 #include "capability-util.h"
15 #include "conf-parser.h"
16 #include "cpu-set-util.h"
18 #include "missing_resource.h"
19 #include "nspawn-expose-ports.h"
20 #include "nspawn-mount.h"
21 #include "time-util.h"
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 */
28 _START_MODE_INVALID
= -1
31 typedef enum UserNamespaceMode
{
35 _USER_NAMESPACE_MODE_MAX
,
36 _USER_NAMESPACE_MODE_INVALID
= -1,
39 typedef enum ResolvConfMode
{
41 RESOLV_CONF_COPY_HOST
,
42 RESOLV_CONF_COPY_STATIC
,
43 RESOLV_CONF_BIND_HOST
,
44 RESOLV_CONF_BIND_STATIC
,
47 _RESOLV_CONF_MODE_MAX
,
48 _RESOLV_CONF_MODE_INVALID
= -1
51 typedef enum LinkJournal
{
57 _LINK_JOURNAL_INVALID
= -1
60 typedef enum TimezoneMode
{
68 _TIMEZONE_MODE_INVALID
= -1
71 typedef enum ConsoleMode
{
77 _CONSOLE_MODE_INVALID
= -1,
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
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)
122 assert_cc(sizeof(SettingsMask
) == 8);
123 assert_cc(sizeof(SETTING_RLIMIT_FIRST
) == 8);
124 assert_cc(sizeof(SETTING_RLIMIT_LAST
) == 8);
126 typedef struct DeviceNode
{
135 typedef struct OciHook
{
142 typedef struct Settings
{
144 StartMode start_mode
;
150 uint64_t drop_capability
;
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
;
160 char **syscall_whitelist
;
161 char **syscall_blacklist
;
162 struct rlimit
*rlimit
[_RLIMIT_MAX
];
164 int no_new_privileges
;
165 int oom_score_adjust
;
166 bool oom_score_adjust_set
;
168 ResolvConfMode resolv_conf
;
169 LinkJournal link_journal
;
170 bool link_journal_try
;
171 TimezoneMode timezone
;
175 VolatileMode volatile_mode
;
176 CustomMount
*custom_mounts
;
177 size_t n_custom_mounts
;
183 char *network_bridge
;
185 char **network_interfaces
;
186 char **network_macvlan
;
187 char **network_ipvlan
;
188 char **network_veth_extra
;
189 ExposePort
*expose_ports
;
191 /* Additional fields, that are specific to OCI runtime case */
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
;
197 sd_bus_message
*properties
;
198 CapabilityQuintet full_capabilities
;
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
;
212 scmp_filter_ctx seccomp
;
216 Settings
*settings_new(void);
217 int settings_load(FILE *f
, const char *path
, Settings
**ret
);
218 Settings
* settings_free(Settings
*s
);
220 bool settings_network_veth(Settings
*s
);
221 bool settings_private_network(Settings
*s
);
222 int settings_allocate_properties(Settings
*s
);
224 DEFINE_TRIVIAL_CLEANUP_FUNC(Settings
*, settings_free
);
226 const struct ConfigPerfItem
* nspawn_gperf_lookup(const char *key
, GPERF_LEN_TYPE length
);
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
);
250 const char *resolv_conf_mode_to_string(ResolvConfMode a
) _const_
;
251 ResolvConfMode
resolv_conf_mode_from_string(const char *s
) _pure_
;
253 const char *timezone_mode_to_string(TimezoneMode a
) _const_
;
254 TimezoneMode
timezone_mode_from_string(const char *s
) _pure_
;
256 int parse_link_journal(const char *s
, LinkJournal
*ret_mode
, bool *ret_try
);
258 void device_node_array_free(DeviceNode
*node
, size_t n
);