]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/main.c
Make taint message structured and add catalog entry
[thirdparty/systemd.git] / src / core / main.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
a7334b09
LP
2/***
3 This file is part of systemd.
4
5 Copyright 2010 Lennart Poettering
6
7 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
10 (at your option) any later version.
11
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 15 Lesser General Public License for more details.
a7334b09 16
5430f7f2 17 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
19***/
20
60918275 21#include <errno.h>
3dfc9763 22#include <fcntl.h>
f170852a 23#include <getopt.h>
97c4f35c 24#include <signal.h>
3dfc9763
LP
25#include <stdio.h>
26#include <string.h>
664f88a7 27#include <sys/mount.h>
3dfc9763 28#include <sys/prctl.h>
b9e74c39 29#include <sys/reboot.h>
3dfc9763
LP
30#include <sys/stat.h>
31#include <unistd.h>
349cc4a5 32#if HAVE_SECCOMP
b64a3d86
LP
33#include <seccomp.h>
34#endif
349cc4a5 35#if HAVE_VALGRIND_VALGRIND_H
3dfc9763
LP
36#include <valgrind/valgrind.h>
37#endif
54b434b1 38
718db961 39#include "sd-bus.h"
cf0fbc49 40#include "sd-daemon.h"
b2e7486c 41#include "sd-messages.h"
3dfc9763 42
b5efdb8a 43#include "alloc-util.h"
d9d93745 44#include "architecture.h"
3dfc9763
LP
45#include "build.h"
46#include "bus-error.h"
47#include "bus-util.h"
430f0182 48#include "capability-util.h"
24efb112 49#include "clock-util.h"
3dfc9763 50#include "conf-parser.h"
618234a5 51#include "cpu-set-util.h"
3dfc9763
LP
52#include "dbus-manager.h"
53#include "def.h"
eee8b7ab 54#include "emergency-action.h"
3dfc9763 55#include "env-util.h"
3ffd4af2 56#include "fd-util.h"
3dfc9763 57#include "fdset.h"
718db961 58#include "fileio.h"
f97b34a6 59#include "format-util.h"
f4f15635 60#include "fs-util.h"
3dfc9763
LP
61#include "hostname-setup.h"
62#include "ima-setup.h"
63#include "killall.h"
64#include "kmod-setup.h"
d7b8eec7 65#include "load-fragment.h"
3dfc9763 66#include "log.h"
b6e66135 67#include "loopback-setup.h"
b6e66135 68#include "machine-id-setup.h"
3dfc9763
LP
69#include "manager.h"
70#include "missing.h"
71#include "mount-setup.h"
72#include "pager.h"
6bedfcbb 73#include "parse-util.h"
7d5ceb64 74#include "path-util.h"
4e731273 75#include "proc-cmdline.h"
3dfc9763 76#include "process-util.h"
8869a0b4 77#include "raw-clone.h"
78f22b97 78#include "rlimit-util.h"
349cc4a5 79#if HAVE_SECCOMP
83f12b27
FS
80#include "seccomp-util.h"
81#endif
b6e66135 82#include "selinux-setup.h"
3dfc9763
LP
83#include "selinux-util.h"
84#include "signal-util.h"
ffbd2c4d 85#include "smack-setup.h"
3dfc9763 86#include "special.h"
8fcde012 87#include "stat-util.h"
15a5e950 88#include "stdio-util.h"
3dfc9763
LP
89#include "strv.h"
90#include "switch-root.h"
91#include "terminal-util.h"
8612da97 92#include "umask-util.h"
b1d4f8e1 93#include "user-util.h"
3dfc9763
LP
94#include "virt.h"
95#include "watchdog.h"
b6e66135 96
f170852a
LP
97static enum {
98 ACTION_RUN,
e965d56d 99 ACTION_HELP,
9ba0bc4e 100 ACTION_VERSION,
e537352b 101 ACTION_TEST,
494294d6 102 ACTION_DUMP_CONFIGURATION_ITEMS
fa0f4d8a 103} arg_action = ACTION_RUN;
fa0f4d8a 104static char *arg_default_unit = NULL;
463d0d15 105static bool arg_system = false;
fa0f4d8a 106static bool arg_dump_core = true;
fa0f4d8a 107static int arg_crash_chvt = -1;
b9e74c39
LP
108static bool arg_crash_shell = false;
109static bool arg_crash_reboot = false;
7d5ceb64 110static char *arg_confirm_spawn = NULL;
b6e2f329 111static ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
bf4df7c3 112static bool arg_switched_root = false;
ea4b98e6 113static bool arg_no_pager = false;
0c85a4f3 114static char ***arg_join_controllers = NULL;
706343f4 115static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
0a494f1f 116static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
1f19a534
OS
117static usec_t arg_default_restart_usec = DEFAULT_RESTART_USEC;
118static usec_t arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
119static usec_t arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
3f41e1e5
LN
120static usec_t arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
121static unsigned arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
e96d6be7
LP
122static usec_t arg_runtime_watchdog = 0;
123static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
8a2c1fbf 124static char *arg_watchdog_device = NULL;
97d0e5f8 125static char **arg_default_environment = NULL;
517d56b1 126static struct rlimit *arg_default_rlimit[_RLIMIT_MAX] = {};
a103496c 127static uint64_t arg_capability_bounding_set = CAP_ALL;
3a43da28 128static nsec_t arg_timer_slack_nsec = NSEC_INFINITY;
bd8f585b 129static usec_t arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
d3b1c508
LP
130static Set* arg_syscall_archs = NULL;
131static FILE* arg_serialization = NULL;
085afe36 132static bool arg_default_cpu_accounting = false;
13c31542 133static bool arg_default_io_accounting = false;
377bfd2d 134static bool arg_default_ip_accounting = false;
085afe36
LP
135static bool arg_default_blockio_accounting = false;
136static bool arg_default_memory_accounting = false;
9ded9cd1 137static bool arg_default_tasks_accounting = true;
79baeeb9 138static uint64_t arg_default_tasks_max = UINT64_MAX;
ee48dbd5 139static sd_id128_t arg_machine_id = {};
ae8c7939 140static EmergencyAction arg_cad_burst_action = EMERGENCY_ACTION_REBOOT_FORCE;
4fc935ca 141
b9e74c39
LP
142noreturn static void freeze_or_reboot(void) {
143
144 if (arg_crash_reboot) {
145 log_notice("Rebooting in 10s...");
146 (void) sleep(10);
147
148 log_notice("Rebooting now...");
149 (void) reboot(RB_AUTOBOOT);
150 log_emergency_errno(errno, "Failed to reboot: %m");
151 }
152
153 log_emergency("Freezing execution.");
154 freeze();
155}
156
919ce0b7 157noreturn static void crash(int sig) {
7d06dad9
MS
158 struct sigaction sa;
159 pid_t pid;
97c4f35c 160
df0ff127 161 if (getpid_cached() != 1)
abb26902 162 /* Pass this on immediately, if this is not PID 1 */
92ca4cac 163 (void) raise(sig);
abb26902 164 else if (!arg_dump_core)
4104970e 165 log_emergency("Caught <%s>, not dumping core.", signal_to_string(sig));
97c4f35c 166 else {
7d06dad9 167 sa = (struct sigaction) {
189d5bac 168 .sa_handler = nop_signal_handler,
b92bea5d
ZJS
169 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
170 };
97c4f35c 171
6f5e3f35 172 /* We want to wait for the core process, hence let's enable SIGCHLD */
92ca4cac 173 (void) sigaction(SIGCHLD, &sa, NULL);
6f5e3f35 174
8869a0b4 175 pid = raw_clone(SIGCHLD);
e62d8c39 176 if (pid < 0)
56f64d95 177 log_emergency_errno(errno, "Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig));
97c4f35c 178 else if (pid == 0) {
97c4f35c 179 /* Enable default signal handler for core dump */
15a90032 180
92ca4cac
LP
181 sa = (struct sigaction) {
182 .sa_handler = SIG_DFL,
183 };
184 (void) sigaction(sig, &sa, NULL);
97c4f35c 185
15a90032
LP
186 /* Don't limit the coredump size */
187 (void) setrlimit(RLIMIT_CORE, &RLIMIT_MAKE_CONST(RLIM_INFINITY));
97c4f35c
LP
188
189 /* Just to be sure... */
e62d9b81 190 (void) chdir("/");
97c4f35c
LP
191
192 /* Raise the signal again */
ee05e779 193 pid = raw_getpid();
92ca4cac 194 (void) kill(pid, sig); /* raise() would kill the parent */
97c4f35c
LP
195
196 assert_not_reached("We shouldn't be here...");
92ca4cac 197 _exit(EXIT_FAILURE);
4fc935ca 198 } else {
8e12a6ae
LP
199 siginfo_t status;
200 int r;
4fc935ca
LP
201
202 /* Order things nicely. */
e62d8c39
ZJS
203 r = wait_for_terminate(pid, &status);
204 if (r < 0)
da927ba9 205 log_emergency_errno(r, "Caught <%s>, waitpid() failed: %m", signal_to_string(sig));
8e12a6ae 206 else if (status.si_code != CLD_DUMPED)
ee05e779
ZJS
207 log_emergency("Caught <%s>, core dump failed (child "PID_FMT", code=%s, status=%i/%s).",
208 signal_to_string(sig),
209 pid, sigchld_code_to_string(status.si_code),
210 status.si_status,
211 strna(status.si_code == CLD_EXITED
38107f5a 212 ? exit_status_to_string(status.si_status, EXIT_STATUS_MINIMAL)
ee05e779 213 : signal_to_string(status.si_status)));
4fc935ca 214 else
4104970e 215 log_emergency("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid);
97c4f35c
LP
216 }
217 }
218
b9e74c39 219 if (arg_crash_chvt >= 0)
92ca4cac 220 (void) chvt(arg_crash_chvt);
601f6a1e 221
7d06dad9
MS
222 sa = (struct sigaction) {
223 .sa_handler = SIG_IGN,
224 .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
225 };
226
227 /* Let the kernel reap children for us */
228 (void) sigaction(SIGCHLD, &sa, NULL);
8c43883a 229
7d06dad9 230 if (arg_crash_shell) {
b9e74c39 231 log_notice("Executing crash shell in 10s...");
92ca4cac 232 (void) sleep(10);
4fc935ca 233
8869a0b4 234 pid = raw_clone(SIGCHLD);
cd3bd60a 235 if (pid < 0)
56f64d95 236 log_emergency_errno(errno, "Failed to fork off crash shell: %m");
6f5e3f35 237 else if (pid == 0) {
b9e74c39 238 (void) setsid();
92ca4cac
LP
239 (void) make_console_stdio();
240 (void) execle("/bin/sh", "/bin/sh", NULL, environ);
6f5e3f35 241
ee05e779 242 log_emergency_errno(errno, "execle() failed: %m");
92ca4cac 243 _exit(EXIT_FAILURE);
b9e74c39
LP
244 } else {
245 log_info("Spawned crash shell as PID "PID_FMT".", pid);
4cf0b03b 246 (void) wait_for_terminate(pid, NULL);
b9e74c39 247 }
4fc935ca
LP
248 }
249
b9e74c39 250 freeze_or_reboot();
97c4f35c
LP
251}
252
253static void install_crash_handler(void) {
297d563d 254 static const struct sigaction sa = {
b92bea5d 255 .sa_handler = crash,
297d563d 256 .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */
b92bea5d 257 };
297d563d 258 int r;
97c4f35c 259
297d563d
LP
260 /* We ignore the return value here, since, we don't mind if we
261 * cannot set up a crash handler */
262 r = sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
263 if (r < 0)
264 log_debug_errno(r, "I had trouble setting up the crash handler, ignoring: %m");
97c4f35c 265}
f170852a 266
56d96fc0
LP
267static int console_setup(void) {
268 _cleanup_close_ int tty_fd = -1;
269 int r;
80876c20 270
512947d4 271 tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
23bbb0de
MS
272 if (tty_fd < 0)
273 return log_error_errno(tty_fd, "Failed to open /dev/console: %m");
80876c20 274
56d96fc0
LP
275 /* We don't want to force text mode. plymouth may be showing
276 * pictures already from initrd. */
512947d4 277 r = reset_terminal_fd(tty_fd, false);
23bbb0de
MS
278 if (r < 0)
279 return log_error_errno(r, "Failed to reset /dev/console: %m");
843d2643 280
56d96fc0 281 return 0;
80876c20
LP
282}
283
b9e74c39
LP
284static int parse_crash_chvt(const char *value) {
285 int b;
286
287 if (safe_atoi(value, &arg_crash_chvt) >= 0)
288 return 0;
289
290 b = parse_boolean(value);
291 if (b < 0)
292 return b;
293
294 if (b > 0)
295 arg_crash_chvt = 0; /* switch to where kmsg goes */
296 else
297 arg_crash_chvt = -1; /* turn off switching */
298
299 return 0;
300}
301
7d5ceb64
FB
302static int parse_confirm_spawn(const char *value, char **console) {
303 char *s;
304 int r;
305
306 r = value ? parse_boolean(value) : 1;
307 if (r == 0) {
308 *console = NULL;
309 return 0;
310 }
311
312 if (r > 0) /* on with default tty */
313 s = strdup("/dev/console");
314 else if (is_path(value)) /* on with fully qualified path */
315 s = strdup(value);
316 else /* on with only a tty file name, not a fully qualified path */
317 s = strjoin("/dev/", value);
318 if (!s)
319 return -ENOMEM;
320 *console = s;
321 return 0;
322}
323
ee48dbd5 324static int set_machine_id(const char *m) {
e042eab7 325 sd_id128_t t;
8b26cdbd 326 assert(m);
ee48dbd5 327
e042eab7 328 if (sd_id128_from_string(m, &t) < 0)
ee48dbd5
NC
329 return -EINVAL;
330
e042eab7 331 if (sd_id128_is_null(t))
ee48dbd5
NC
332 return -EINVAL;
333
e042eab7 334 arg_machine_id = t;
ee48dbd5
NC
335 return 0;
336}
337
96287a49 338static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
f170852a 339
059cb385 340 int r;
f170852a 341
059cb385 342 assert(key);
5192bd19 343
1d84ad94 344 if (STR_IN_SET(key, "systemd.unit", "rd.systemd.unit")) {
bf4df7c3 345
1d84ad94
LP
346 if (proc_cmdline_value_missing(key, value))
347 return 0;
bf4df7c3 348
1d84ad94
LP
349 if (!unit_name_is_valid(value, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
350 log_warning("Unit name specified on %s= is not valid, ignoring: %s", key, value);
351 else if (in_initrd() == !!startswith(key, "rd.")) {
352 if (free_and_strdup(&arg_default_unit, value) < 0)
353 return log_oom();
354 }
f170852a 355
1d84ad94 356 } else if (proc_cmdline_key_streq(key, "systemd.dump_core")) {
4fc935ca 357
1d84ad94 358 r = value ? parse_boolean(value) : true;
fb472900 359 if (r < 0)
059cb385 360 log_warning("Failed to parse dump core switch %s. Ignoring.", value);
4fc935ca 361 else
fa0f4d8a 362 arg_dump_core = r;
4fc935ca 363
1d84ad94 364 } else if (proc_cmdline_key_streq(key, "systemd.crash_chvt")) {
b9e74c39 365
1d84ad94
LP
366 if (!value)
367 arg_crash_chvt = 0; /* turn on */
368 else if (parse_crash_chvt(value) < 0)
b9e74c39
LP
369 log_warning("Failed to parse crash chvt switch %s. Ignoring.", value);
370
1d84ad94 371 } else if (proc_cmdline_key_streq(key, "systemd.crash_shell")) {
4fc935ca 372
1d84ad94 373 r = value ? parse_boolean(value) : true;
fb472900 374 if (r < 0)
059cb385 375 log_warning("Failed to parse crash shell switch %s. Ignoring.", value);
4fc935ca 376 else
fa0f4d8a 377 arg_crash_shell = r;
5e7ee61c 378
1d84ad94 379 } else if (proc_cmdline_key_streq(key, "systemd.crash_reboot")) {
5e7ee61c 380
1d84ad94 381 r = value ? parse_boolean(value) : true;
b9e74c39
LP
382 if (r < 0)
383 log_warning("Failed to parse crash reboot switch %s. Ignoring.", value);
5e7ee61c 384 else
b9e74c39 385 arg_crash_reboot = r;
5e7ee61c 386
1d84ad94
LP
387 } else if (proc_cmdline_key_streq(key, "systemd.confirm_spawn")) {
388 char *s;
7d5ceb64 389
1d84ad94 390 r = parse_confirm_spawn(value, &s);
059cb385 391 if (r < 0)
7d5ceb64 392 log_warning_errno(r, "Failed to parse confirm_spawn switch %s. Ignoring.", value);
1d84ad94
LP
393 else {
394 free(arg_confirm_spawn);
395 arg_confirm_spawn = s;
396 }
601f6a1e 397
1d84ad94 398 } else if (proc_cmdline_key_streq(key, "systemd.show_status")) {
9e58ff9c 399
1d84ad94
LP
400 if (value) {
401 r = parse_show_status(value, &arg_show_status);
402 if (r < 0)
403 log_warning("Failed to parse show status switch %s. Ignoring.", value);
404 } else
405 arg_show_status = SHOW_STATUS_YES;
059cb385 406
1d84ad94
LP
407 } else if (proc_cmdline_key_streq(key, "systemd.default_standard_output")) {
408
409 if (proc_cmdline_value_missing(key, value))
410 return 0;
0a494f1f 411
059cb385 412 r = exec_output_from_string(value);
fb472900 413 if (r < 0)
059cb385 414 log_warning("Failed to parse default standard output switch %s. Ignoring.", value);
0a494f1f
LP
415 else
416 arg_default_std_output = r;
0a494f1f 417
1d84ad94
LP
418 } else if (proc_cmdline_key_streq(key, "systemd.default_standard_error")) {
419
420 if (proc_cmdline_value_missing(key, value))
421 return 0;
059cb385
LP
422
423 r = exec_output_from_string(value);
fb472900 424 if (r < 0)
059cb385 425 log_warning("Failed to parse default standard error switch %s. Ignoring.", value);
0a494f1f
LP
426 else
427 arg_default_std_error = r;
9e7c5357 428
1d84ad94
LP
429 } else if (streq(key, "systemd.setenv")) {
430
431 if (proc_cmdline_value_missing(key, value))
432 return 0;
059cb385
LP
433
434 if (env_assignment_is_valid(value)) {
e21fea24
KS
435 char **env;
436
059cb385 437 env = strv_env_set(arg_default_environment, value);
1d84ad94
LP
438 if (!env)
439 return log_oom();
440
441 arg_default_environment = env;
e21fea24 442 } else
059cb385 443 log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
9e58ff9c 444
1d84ad94
LP
445 } else if (proc_cmdline_key_streq(key, "systemd.machine_id")) {
446
447 if (proc_cmdline_value_missing(key, value))
448 return 0;
449
450 r = set_machine_id(value);
451 if (r < 0)
452 log_warning("MachineID '%s' is not valid. Ignoring.", value);
ee48dbd5 453
1d84ad94
LP
454 } else if (proc_cmdline_key_streq(key, "systemd.default_timeout_start_sec")) {
455
456 if (proc_cmdline_value_missing(key, value))
457 return 0;
458
459 r = parse_sec(value, &arg_default_timeout_start_usec);
460 if (r < 0)
461 log_warning_errno(r, "Failed to parse default start timeout: %s, ignoring.", value);
462
463 if (arg_default_timeout_start_usec <= 0)
464 arg_default_timeout_start_usec = USEC_INFINITY;
ee48dbd5 465
8a2c1fbf
EJ
466 } else if (proc_cmdline_key_streq(key, "systemd.watchdog_device")) {
467
468 if (proc_cmdline_value_missing(key, value))
469 return 0;
470
471 parse_path_argument_and_warn(value, false, &arg_watchdog_device);
472
059cb385 473 } else if (streq(key, "quiet") && !value) {
d7b15e0a 474
b6e2f329 475 if (arg_show_status == _SHOW_STATUS_UNSET)
d450b6f2 476 arg_show_status = SHOW_STATUS_AUTO;
059cb385
LP
477
478 } else if (streq(key, "debug") && !value) {
d7b15e0a 479
1de1c9c3
LP
480 /* Note that log_parse_environment() handles 'debug'
481 * too, and sets the log level to LOG_DEBUG. */
d7b15e0a 482
75f86906 483 if (detect_container() > 0)
b2103dcc 484 log_set_target(LOG_TARGET_CONSOLE);
059cb385 485
dcd61450 486 } else if (!value) {
e2c9a131 487 const char *target;
f170852a
LP
488
489 /* SysV compatibility */
e2c9a131
EV
490 target = runlevel_to_target(key);
491 if (target)
492 return free_and_strdup(&arg_default_unit, target);
f170852a
LP
493 }
494
495 return 0;
496}
497
e8e581bf
ZJS
498#define DEFINE_SETTER(name, func, descr) \
499 static int name(const char *unit, \
500 const char *filename, \
501 unsigned line, \
502 const char *section, \
71a61510 503 unsigned section_line, \
e8e581bf
ZJS
504 const char *lvalue, \
505 int ltype, \
506 const char *rvalue, \
507 void *data, \
508 void *userdata) { \
509 \
510 int r; \
511 \
512 assert(filename); \
513 assert(lvalue); \
514 assert(rvalue); \
515 \
516 r = func(rvalue); \
517 if (r < 0) \
d1cefe0a
LP
518 log_syntax(unit, LOG_ERR, filename, line, r, \
519 "Invalid " descr "'%s': %m", \
520 rvalue); \
e8e581bf
ZJS
521 \
522 return 0; \
523 }
487393e9 524
e8e581bf
ZJS
525DEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level")
526DEFINE_SETTER(config_parse_target, log_set_target_from_string, "target")
527DEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" )
528DEFINE_SETTER(config_parse_location, log_show_location_from_string, "location")
487393e9 529
4d7213b2
LP
530static int config_parse_cpu_affinity2(
531 const char *unit,
532 const char *filename,
533 unsigned line,
534 const char *section,
535 unsigned section_line,
536 const char *lvalue,
537 int ltype,
538 const char *rvalue,
539 void *data,
540 void *userdata) {
487393e9 541
4b40bc38 542 _cleanup_cpu_free_ cpu_set_t *c = NULL;
f5c72b73 543 int ncpus;
487393e9 544
765d143b 545 ncpus = parse_cpu_set_and_warn(rvalue, &c, unit, filename, line, lvalue);
f5c72b73
FB
546 if (ncpus < 0)
547 return ncpus;
487393e9 548
f5c72b73 549 if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
25f027c5 550 log_warning_errno(errno, "Failed to set CPU affinity: %m");
487393e9 551
487393e9
LP
552 return 0;
553}
554
4d7213b2
LP
555static int config_parse_show_status(
556 const char* unit,
557 const char *filename,
558 unsigned line,
559 const char *section,
560 unsigned section_line,
561 const char *lvalue,
562 int ltype,
563 const char *rvalue,
564 void *data,
565 void *userdata) {
566
567 int k;
568 ShowStatus *b = data;
569
570 assert(filename);
571 assert(lvalue);
572 assert(rvalue);
573 assert(data);
574
575 k = parse_show_status(rvalue, b);
576 if (k < 0) {
12ca818f 577 log_syntax(unit, LOG_ERR, filename, line, k, "Failed to parse show status setting, ignoring: %s", rvalue);
4d7213b2
LP
578 return 0;
579 }
580
581 return 0;
582}
583
5db98187
LP
584static int config_parse_output_restricted(
585 const char* unit,
586 const char *filename,
587 unsigned line,
588 const char *section,
589 unsigned section_line,
590 const char *lvalue,
591 int ltype,
592 const char *rvalue,
593 void *data,
594 void *userdata) {
595
596 ExecOutput t, *eo = data;
597
598 assert(filename);
599 assert(lvalue);
600 assert(rvalue);
601 assert(data);
602
603 t = exec_output_from_string(rvalue);
604 if (t < 0) {
605 log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse output type, ignoring: %s", rvalue);
606 return 0;
607 }
608
609 if (IN_SET(t, EXEC_OUTPUT_SOCKET, EXEC_OUTPUT_NAMED_FD, EXEC_OUTPUT_FILE)) {
610 log_syntax(unit, LOG_ERR, filename, line, 0, "Standard output types socket, fd:, file: are not supported as defaults, ignoring: %s", rvalue);
611 return 0;
612 }
613
614 *eo = t;
615 return 0;
616}
617
b9e74c39
LP
618static int config_parse_crash_chvt(
619 const char* unit,
620 const char *filename,
621 unsigned line,
622 const char *section,
623 unsigned section_line,
624 const char *lvalue,
625 int ltype,
626 const char *rvalue,
627 void *data,
628 void *userdata) {
629
630 int r;
631
632 assert(filename);
633 assert(lvalue);
634 assert(rvalue);
b9e74c39
LP
635
636 r = parse_crash_chvt(rvalue);
637 if (r < 0) {
638 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse CrashChangeVT= setting, ignoring: %s", rvalue);
639 return 0;
640 }
641
642 return 0;
643}
644
e8e581bf
ZJS
645static int config_parse_join_controllers(const char *unit,
646 const char *filename,
647 unsigned line,
648 const char *section,
71a61510 649 unsigned section_line,
e8e581bf
ZJS
650 const char *lvalue,
651 int ltype,
652 const char *rvalue,
653 void *data,
654 void *userdata) {
0c85a4f3 655
3875c85b 656 const char *whole_rvalue = rvalue;
0c85a4f3 657 unsigned n = 0;
0c85a4f3
LP
658
659 assert(filename);
660 assert(lvalue);
661 assert(rvalue);
662
fe382237 663 arg_join_controllers = strv_free_free(arg_join_controllers);
0c85a4f3 664
d4ebeb4f
FB
665 for (;;) {
666 _cleanup_free_ char *word = NULL;
667 char **l;
668 int r;
0c85a4f3 669
9a82ab95 670 r = extract_first_word(&rvalue, &word, NULL, EXTRACT_QUOTES);
3875c85b
FB
671 if (r < 0) {
672 log_syntax(unit, LOG_ERR, filename, line, r, "Invalid value for %s: %s", lvalue, whole_rvalue);
d4ebeb4f 673 return r;
3875c85b 674 }
d4ebeb4f
FB
675 if (r == 0)
676 break;
0c85a4f3 677
d4ebeb4f 678 l = strv_split(word, ",");
1592ec21 679 if (!l)
aa8aeac0 680 return log_oom();
0c85a4f3
LP
681 strv_uniq(l);
682
683 if (strv_length(l) <= 1) {
684 strv_free(l);
685 continue;
686 }
687
688 if (!arg_join_controllers) {
689 arg_join_controllers = new(char**, 2);
690 if (!arg_join_controllers) {
691 strv_free(l);
14212119 692 return log_oom();
0c85a4f3
LP
693 }
694
695 arg_join_controllers[0] = l;
696 arg_join_controllers[1] = NULL;
697
698 n = 1;
699 } else {
700 char ***a;
701 char ***t;
702
703 t = new0(char**, n+2);
704 if (!t) {
705 strv_free(l);
14212119 706 return log_oom();
0c85a4f3
LP
707 }
708
709 n = 0;
710
711 for (a = arg_join_controllers; *a; a++) {
712
713 if (strv_overlap(*a, l)) {
e287086b 714 if (strv_extend_strv(&l, *a, false) < 0) {
0c85a4f3
LP
715 strv_free(l);
716 strv_free_free(t);
14212119 717 return log_oom();
0c85a4f3
LP
718 }
719
0c85a4f3
LP
720 } else {
721 char **c;
722
723 c = strv_copy(*a);
724 if (!c) {
725 strv_free(l);
726 strv_free_free(t);
14212119 727 return log_oom();
0c85a4f3
LP
728 }
729
730 t[n++] = c;
731 }
732 }
733
734 t[n++] = strv_uniq(l);
735
736 strv_free_free(arg_join_controllers);
737 arg_join_controllers = t;
738 }
739 }
d4ebeb4f 740 if (!isempty(rvalue))
12ca818f 741 log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
0c85a4f3
LP
742
743 return 0;
744}
745
487393e9
LP
746static int parse_config_file(void) {
747
f975e971 748 const ConfigTableItem items[] = {
d3b1c508
LP
749 { "Manager", "LogLevel", config_parse_level2, 0, NULL },
750 { "Manager", "LogTarget", config_parse_target, 0, NULL },
751 { "Manager", "LogColor", config_parse_color, 0, NULL },
752 { "Manager", "LogLocation", config_parse_location, 0, NULL },
753 { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
b9e74c39
LP
754 { "Manager", "CrashChVT", /* legacy */ config_parse_crash_chvt, 0, NULL },
755 { "Manager", "CrashChangeVT", config_parse_crash_chvt, 0, NULL },
d3b1c508 756 { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
b9e74c39 757 { "Manager", "CrashReboot", config_parse_bool, 0, &arg_crash_reboot },
d3b1c508 758 { "Manager", "ShowStatus", config_parse_show_status, 0, &arg_show_status },
d3b1c508
LP
759 { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
760 { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
761 { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
762 { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
8a2c1fbf 763 { "Manager", "WatchdogDevice", config_parse_path, 0, &arg_watchdog_device },
a103496c 764 { "Manager", "CapabilityBoundingSet", config_parse_capability_set, 0, &arg_capability_bounding_set },
349cc4a5 765#if HAVE_SECCOMP
d3b1c508 766 { "Manager", "SystemCallArchitectures", config_parse_syscall_archs, 0, &arg_syscall_archs },
89fffa27 767#endif
d3b1c508 768 { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
bd8f585b 769 { "Manager", "DefaultTimerAccuracySec", config_parse_sec, 0, &arg_default_timer_accuracy_usec },
5db98187
LP
770 { "Manager", "DefaultStandardOutput", config_parse_output_restricted,0, &arg_default_std_output },
771 { "Manager", "DefaultStandardError", config_parse_output_restricted,0, &arg_default_std_error },
d3b1c508
LP
772 { "Manager", "DefaultTimeoutStartSec", config_parse_sec, 0, &arg_default_timeout_start_usec },
773 { "Manager", "DefaultTimeoutStopSec", config_parse_sec, 0, &arg_default_timeout_stop_usec },
774 { "Manager", "DefaultRestartSec", config_parse_sec, 0, &arg_default_restart_usec },
f0367da7
LP
775 { "Manager", "DefaultStartLimitInterval", config_parse_sec, 0, &arg_default_start_limit_interval }, /* obsolete alias */
776 { "Manager", "DefaultStartLimitIntervalSec",config_parse_sec, 0, &arg_default_start_limit_interval },
d3b1c508
LP
777 { "Manager", "DefaultStartLimitBurst", config_parse_unsigned, 0, &arg_default_start_limit_burst },
778 { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment },
d0a7c5f6
LP
779 { "Manager", "DefaultLimitCPU", config_parse_limit, RLIMIT_CPU, arg_default_rlimit },
780 { "Manager", "DefaultLimitFSIZE", config_parse_limit, RLIMIT_FSIZE, arg_default_rlimit },
781 { "Manager", "DefaultLimitDATA", config_parse_limit, RLIMIT_DATA, arg_default_rlimit },
782 { "Manager", "DefaultLimitSTACK", config_parse_limit, RLIMIT_STACK, arg_default_rlimit },
783 { "Manager", "DefaultLimitCORE", config_parse_limit, RLIMIT_CORE, arg_default_rlimit },
784 { "Manager", "DefaultLimitRSS", config_parse_limit, RLIMIT_RSS, arg_default_rlimit },
785 { "Manager", "DefaultLimitNOFILE", config_parse_limit, RLIMIT_NOFILE, arg_default_rlimit },
786 { "Manager", "DefaultLimitAS", config_parse_limit, RLIMIT_AS, arg_default_rlimit },
787 { "Manager", "DefaultLimitNPROC", config_parse_limit, RLIMIT_NPROC, arg_default_rlimit },
788 { "Manager", "DefaultLimitMEMLOCK", config_parse_limit, RLIMIT_MEMLOCK, arg_default_rlimit },
789 { "Manager", "DefaultLimitLOCKS", config_parse_limit, RLIMIT_LOCKS, arg_default_rlimit },
790 { "Manager", "DefaultLimitSIGPENDING", config_parse_limit, RLIMIT_SIGPENDING, arg_default_rlimit },
791 { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit, RLIMIT_MSGQUEUE, arg_default_rlimit },
792 { "Manager", "DefaultLimitNICE", config_parse_limit, RLIMIT_NICE, arg_default_rlimit },
793 { "Manager", "DefaultLimitRTPRIO", config_parse_limit, RLIMIT_RTPRIO, arg_default_rlimit },
794 { "Manager", "DefaultLimitRTTIME", config_parse_limit, RLIMIT_RTTIME, arg_default_rlimit },
085afe36 795 { "Manager", "DefaultCPUAccounting", config_parse_bool, 0, &arg_default_cpu_accounting },
13c31542 796 { "Manager", "DefaultIOAccounting", config_parse_bool, 0, &arg_default_io_accounting },
377bfd2d 797 { "Manager", "DefaultIPAccounting", config_parse_bool, 0, &arg_default_ip_accounting },
085afe36
LP
798 { "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting },
799 { "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting },
03a7b521 800 { "Manager", "DefaultTasksAccounting", config_parse_bool, 0, &arg_default_tasks_accounting },
0af20ea2 801 { "Manager", "DefaultTasksMax", config_parse_tasks_max, 0, &arg_default_tasks_max },
ae8c7939 802 { "Manager", "CtrlAltDelBurstAction", config_parse_emergency_action, 0, &arg_cad_burst_action },
d3b1c508 803 {}
487393e9
LP
804 };
805
1b907b5c 806 const char *fn, *conf_dirs_nulstr;
487393e9 807
463d0d15 808 fn = arg_system ?
75eb6154
LP
809 PKGSYSCONFDIR "/system.conf" :
810 PKGSYSCONFDIR "/user.conf";
811
463d0d15 812 conf_dirs_nulstr = arg_system ?
75eb6154
LP
813 CONF_PATHS_NULSTR("systemd/system.conf.d") :
814 CONF_PATHS_NULSTR("systemd/user.conf.d");
815
bcde742e 816 (void) config_parse_many_nulstr(fn, conf_dirs_nulstr, "Manager\0", config_item_table_lookup, items, CONFIG_PARSE_WARN, NULL);
36c16a7c
LP
817
818 /* Traditionally "0" was used to turn off the default unit timeouts. Fix this up so that we used USEC_INFINITY
819 * like everywhere else. */
820 if (arg_default_timeout_start_usec <= 0)
821 arg_default_timeout_start_usec = USEC_INFINITY;
822 if (arg_default_timeout_stop_usec <= 0)
823 arg_default_timeout_stop_usec = USEC_INFINITY;
487393e9 824
487393e9
LP
825 return 0;
826}
827
85cb4151 828static void set_manager_defaults(Manager *m) {
06af2a04
TB
829
830 assert(m);
831
832 m->default_timer_accuracy_usec = arg_default_timer_accuracy_usec;
833 m->default_std_output = arg_default_std_output;
834 m->default_std_error = arg_default_std_error;
835 m->default_timeout_start_usec = arg_default_timeout_start_usec;
836 m->default_timeout_stop_usec = arg_default_timeout_stop_usec;
837 m->default_restart_usec = arg_default_restart_usec;
838 m->default_start_limit_interval = arg_default_start_limit_interval;
839 m->default_start_limit_burst = arg_default_start_limit_burst;
840 m->default_cpu_accounting = arg_default_cpu_accounting;
13c31542 841 m->default_io_accounting = arg_default_io_accounting;
377bfd2d 842 m->default_ip_accounting = arg_default_ip_accounting;
06af2a04
TB
843 m->default_blockio_accounting = arg_default_blockio_accounting;
844 m->default_memory_accounting = arg_default_memory_accounting;
03a7b521 845 m->default_tasks_accounting = arg_default_tasks_accounting;
0af20ea2 846 m->default_tasks_max = arg_default_tasks_max;
06af2a04
TB
847
848 manager_set_default_rlimits(m, arg_default_rlimit);
849 manager_environment_add(m, NULL, arg_default_environment);
850}
851
7b46fc6a
LP
852static void set_manager_settings(Manager *m) {
853
854 assert(m);
855
856 m->confirm_spawn = arg_confirm_spawn;
857 m->runtime_watchdog = arg_runtime_watchdog;
858 m->shutdown_watchdog = arg_shutdown_watchdog;
859 m->cad_burst_action = arg_cad_burst_action;
860
861 manager_set_show_status(m, arg_show_status);
862}
863
f170852a
LP
864static int parse_argv(int argc, char *argv[]) {
865
866 enum {
867 ARG_LOG_LEVEL = 0x100,
868 ARG_LOG_TARGET,
bbe63281
LP
869 ARG_LOG_COLOR,
870 ARG_LOG_LOCATION,
2f198e2f 871 ARG_UNIT,
edb9aaa8 872 ARG_SYSTEM,
af2d49f7 873 ARG_USER,
e537352b 874 ARG_TEST,
b87c2aa6 875 ARG_NO_PAGER,
9ba0bc4e 876 ARG_VERSION,
80876c20 877 ARG_DUMP_CONFIGURATION_ITEMS,
9e58ff9c 878 ARG_DUMP_CORE,
b9e74c39 879 ARG_CRASH_CHVT,
9e58ff9c 880 ARG_CRASH_SHELL,
b9e74c39 881 ARG_CRASH_REBOOT,
a16e1123 882 ARG_CONFIRM_SPAWN,
9e58ff9c 883 ARG_SHOW_STATUS,
4288f619 884 ARG_DESERIALIZE,
2660882b 885 ARG_SWITCHED_ROOT,
0a494f1f 886 ARG_DEFAULT_STD_OUTPUT,
ee48dbd5
NC
887 ARG_DEFAULT_STD_ERROR,
888 ARG_MACHINE_ID
f170852a
LP
889 };
890
891 static const struct option options[] = {
a16e1123
LP
892 { "log-level", required_argument, NULL, ARG_LOG_LEVEL },
893 { "log-target", required_argument, NULL, ARG_LOG_TARGET },
bbe63281
LP
894 { "log-color", optional_argument, NULL, ARG_LOG_COLOR },
895 { "log-location", optional_argument, NULL, ARG_LOG_LOCATION },
2f198e2f 896 { "unit", required_argument, NULL, ARG_UNIT },
edb9aaa8 897 { "system", no_argument, NULL, ARG_SYSTEM },
af2d49f7 898 { "user", no_argument, NULL, ARG_USER },
a16e1123 899 { "test", no_argument, NULL, ARG_TEST },
b87c2aa6 900 { "no-pager", no_argument, NULL, ARG_NO_PAGER },
a16e1123 901 { "help", no_argument, NULL, 'h' },
9ba0bc4e 902 { "version", no_argument, NULL, ARG_VERSION },
a16e1123 903 { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS },
a5d87bf0 904 { "dump-core", optional_argument, NULL, ARG_DUMP_CORE },
b9e74c39 905 { "crash-chvt", required_argument, NULL, ARG_CRASH_CHVT },
a5d87bf0 906 { "crash-shell", optional_argument, NULL, ARG_CRASH_SHELL },
b9e74c39 907 { "crash-reboot", optional_argument, NULL, ARG_CRASH_REBOOT },
a5d87bf0 908 { "confirm-spawn", optional_argument, NULL, ARG_CONFIRM_SPAWN },
6e98720f 909 { "show-status", optional_argument, NULL, ARG_SHOW_STATUS },
a16e1123 910 { "deserialize", required_argument, NULL, ARG_DESERIALIZE },
2660882b 911 { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
0a494f1f
LP
912 { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
913 { "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
ee48dbd5 914 { "machine-id", required_argument, NULL, ARG_MACHINE_ID },
fb472900 915 {}
f170852a
LP
916 };
917
918 int c, r;
919
920 assert(argc >= 1);
921 assert(argv);
922
df0ff127 923 if (getpid_cached() == 1)
b770165a
LP
924 opterr = 0;
925
099663ff 926 while ((c = getopt_long(argc, argv, "hDbsz:", options, NULL)) >= 0)
f170852a
LP
927
928 switch (c) {
929
930 case ARG_LOG_LEVEL:
fb472900
ZJS
931 r = log_set_max_level_from_string(optarg);
932 if (r < 0) {
f170852a
LP
933 log_error("Failed to parse log level %s.", optarg);
934 return r;
935 }
936
937 break;
938
939 case ARG_LOG_TARGET:
fb472900
ZJS
940 r = log_set_target_from_string(optarg);
941 if (r < 0) {
f170852a
LP
942 log_error("Failed to parse log target %s.", optarg);
943 return r;
944 }
945
946 break;
947
bbe63281
LP
948 case ARG_LOG_COLOR:
949
d0b170c8 950 if (optarg) {
fb472900
ZJS
951 r = log_show_color_from_string(optarg);
952 if (r < 0) {
d0b170c8
LP
953 log_error("Failed to parse log color setting %s.", optarg);
954 return r;
955 }
956 } else
957 log_show_color(true);
bbe63281
LP
958
959 break;
960
961 case ARG_LOG_LOCATION:
d0b170c8 962 if (optarg) {
fb472900
ZJS
963 r = log_show_location_from_string(optarg);
964 if (r < 0) {
d0b170c8
LP
965 log_error("Failed to parse log location setting %s.", optarg);
966 return r;
967 }
968 } else
969 log_show_location(true);
bbe63281
LP
970
971 break;
972
0a494f1f 973 case ARG_DEFAULT_STD_OUTPUT:
fb472900
ZJS
974 r = exec_output_from_string(optarg);
975 if (r < 0) {
0a494f1f
LP
976 log_error("Failed to parse default standard output setting %s.", optarg);
977 return r;
978 } else
979 arg_default_std_output = r;
980 break;
981
982 case ARG_DEFAULT_STD_ERROR:
fb472900
ZJS
983 r = exec_output_from_string(optarg);
984 if (r < 0) {
0a494f1f
LP
985 log_error("Failed to parse default standard error output setting %s.", optarg);
986 return r;
987 } else
988 arg_default_std_error = r;
989 break;
990
2f198e2f 991 case ARG_UNIT:
e6e242ad 992 r = free_and_strdup(&arg_default_unit, optarg);
23bbb0de
MS
993 if (r < 0)
994 return log_error_errno(r, "Failed to set default unit %s: %m", optarg);
f170852a
LP
995
996 break;
997
edb9aaa8 998 case ARG_SYSTEM:
463d0d15 999 arg_system = true;
edb9aaa8 1000 break;
a5dab5ce 1001
af2d49f7 1002 case ARG_USER:
463d0d15 1003 arg_system = false;
a5dab5ce 1004 break;
a5dab5ce 1005
e965d56d 1006 case ARG_TEST:
fa0f4d8a 1007 arg_action = ACTION_TEST;
b87c2aa6
ZJS
1008 break;
1009
1010 case ARG_NO_PAGER:
1011 arg_no_pager = true;
e965d56d
LP
1012 break;
1013
9ba0bc4e
ZJS
1014 case ARG_VERSION:
1015 arg_action = ACTION_VERSION;
1016 break;
1017
e537352b 1018 case ARG_DUMP_CONFIGURATION_ITEMS:
fa0f4d8a 1019 arg_action = ACTION_DUMP_CONFIGURATION_ITEMS;
e537352b
LP
1020 break;
1021
9e58ff9c 1022 case ARG_DUMP_CORE:
b9e74c39
LP
1023 if (!optarg)
1024 arg_dump_core = true;
1025 else {
1026 r = parse_boolean(optarg);
1027 if (r < 0)
1028 return log_error_errno(r, "Failed to parse dump core boolean: %s", optarg);
1029 arg_dump_core = r;
a5d87bf0 1030 }
b9e74c39
LP
1031 break;
1032
1033 case ARG_CRASH_CHVT:
1034 r = parse_crash_chvt(optarg);
1035 if (r < 0)
1036 return log_error_errno(r, "Failed to parse crash virtual terminal index: %s", optarg);
9e58ff9c
LP
1037 break;
1038
1039 case ARG_CRASH_SHELL:
b9e74c39
LP
1040 if (!optarg)
1041 arg_crash_shell = true;
1042 else {
1043 r = parse_boolean(optarg);
1044 if (r < 0)
1045 return log_error_errno(r, "Failed to parse crash shell boolean: %s", optarg);
1046 arg_crash_shell = r;
1047 }
1048 break;
1049
1050 case ARG_CRASH_REBOOT:
1051 if (!optarg)
1052 arg_crash_reboot = true;
1053 else {
1054 r = parse_boolean(optarg);
1055 if (r < 0)
1056 return log_error_errno(r, "Failed to parse crash shell boolean: %s", optarg);
1057 arg_crash_reboot = r;
a5d87bf0 1058 }
9e58ff9c
LP
1059 break;
1060
80876c20 1061 case ARG_CONFIRM_SPAWN:
7d5ceb64
FB
1062 arg_confirm_spawn = mfree(arg_confirm_spawn);
1063
1064 r = parse_confirm_spawn(optarg, &arg_confirm_spawn);
1065 if (r < 0)
1066 return log_error_errno(r, "Failed to parse confirm spawn option: %m");
80876c20
LP
1067 break;
1068
9e58ff9c 1069 case ARG_SHOW_STATUS:
d450b6f2
ZJS
1070 if (optarg) {
1071 r = parse_show_status(optarg, &arg_show_status);
1072 if (r < 0) {
1073 log_error("Failed to parse show status boolean %s.", optarg);
1074 return r;
1075 }
1076 } else
1077 arg_show_status = SHOW_STATUS_YES;
6e98720f 1078 break;
a5d87bf0 1079
a16e1123
LP
1080 case ARG_DESERIALIZE: {
1081 int fd;
1082 FILE *f;
1083
01e10de3
LP
1084 r = safe_atoi(optarg, &fd);
1085 if (r < 0 || fd < 0) {
a16e1123 1086 log_error("Failed to parse deserialize option %s.", optarg);
b9e74c39 1087 return -EINVAL;
a16e1123
LP
1088 }
1089
b9e74c39 1090 (void) fd_cloexec(fd, true);
01e10de3
LP
1091
1092 f = fdopen(fd, "r");
4a62c710
MS
1093 if (!f)
1094 return log_error_errno(errno, "Failed to open serialization fd: %m");
a16e1123 1095
74ca738f 1096 safe_fclose(arg_serialization);
d3b1c508 1097 arg_serialization = f;
a16e1123
LP
1098
1099 break;
1100 }
1101
2660882b 1102 case ARG_SWITCHED_ROOT:
bf4df7c3 1103 arg_switched_root = true;
d03bc1b8
HH
1104 break;
1105
ee48dbd5
NC
1106 case ARG_MACHINE_ID:
1107 r = set_machine_id(optarg);
54500613
LP
1108 if (r < 0)
1109 return log_error_errno(r, "MachineID '%s' is not valid.", optarg);
ee48dbd5
NC
1110 break;
1111
f170852a 1112 case 'h':
fa0f4d8a 1113 arg_action = ACTION_HELP;
f170852a
LP
1114 break;
1115
1d2e23ab
LP
1116 case 'D':
1117 log_set_max_level(LOG_DEBUG);
1118 break;
1119
099663ff
LP
1120 case 'b':
1121 case 's':
1122 case 'z':
1123 /* Just to eat away the sysvinit kernel
1124 * cmdline args without getopt() error
1125 * messages that we'll parse in
1126 * parse_proc_cmdline_word() or ignore. */
f170852a 1127
099663ff 1128 case '?':
df0ff127 1129 if (getpid_cached() != 1)
099663ff 1130 return -EINVAL;
601185b4
ZJS
1131 else
1132 return 0;
099663ff 1133
601185b4
ZJS
1134 default:
1135 assert_not_reached("Unhandled option code.");
f170852a
LP
1136 }
1137
df0ff127 1138 if (optind < argc && getpid_cached() != 1) {
d821e6d6
LP
1139 /* Hmm, when we aren't run as init system
1140 * let's complain about excess arguments */
1141
1142 log_error("Excess arguments.");
1143 return -EINVAL;
1144 }
1145
f170852a
LP
1146 return 0;
1147}
1148
1149static int help(void) {
1150
2e33c433 1151 printf("%s [OPTIONS...]\n\n"
af2d49f7 1152 "Starts up and maintains the system or user services.\n\n"
e537352b 1153 " -h --help Show this help\n"
cb4069d9 1154 " --version Show version\n"
e537352b 1155 " --test Determine startup sequence, dump it and exit\n"
b87c2aa6 1156 " --no-pager Do not pipe output into a pager\n"
80876c20 1157 " --dump-configuration-items Dump understood unit configuration items\n"
9e58ff9c 1158 " --unit=UNIT Set default unit\n"
edb9aaa8 1159 " --system Run a system instance, even if PID != 1\n"
af2d49f7 1160 " --user Run a user instance\n"
b9e74c39
LP
1161 " --dump-core[=BOOL] Dump core on crash\n"
1162 " --crash-vt=NR Change to specified VT on crash\n"
1163 " --crash-reboot[=BOOL] Reboot on crash\n"
1164 " --crash-shell[=BOOL] Run shell on crash\n"
1165 " --confirm-spawn[=BOOL] Ask for confirmation when spawning processes\n"
1166 " --show-status[=BOOL] Show status updates on the console during bootup\n"
c1dc6153 1167 " --log-target=TARGET Set log target (console, journal, kmsg, journal-or-kmsg, null)\n"
9e58ff9c 1168 " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
b9e74c39
LP
1169 " --log-color[=BOOL] Highlight important log messages\n"
1170 " --log-location[=BOOL] Include code location in log messages\n"
0a494f1f
LP
1171 " --default-standard-output= Set default standard output for services\n"
1172 " --default-standard-error= Set default standard error output for services\n",
5b6319dc 1173 program_invocation_short_name);
f170852a
LP
1174
1175 return 0;
1176}
1177
b3680f49 1178static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching_root) {
48b90859
LP
1179 _cleanup_fdset_free_ FDSet *fds = NULL;
1180 _cleanup_fclose_ FILE *f = NULL;
a16e1123
LP
1181 int r;
1182
1183 assert(m);
1184 assert(_f);
1185 assert(_fds);
1186
6b78f9b4 1187 r = manager_open_serialization(m, &f);
48b90859
LP
1188 if (r < 0)
1189 return log_error_errno(r, "Failed to create serialization file: %m");
a16e1123 1190
71445ae7 1191 /* Make sure nothing is really destructed when we shut down */
313cefa1 1192 m->n_reloading++;
718db961 1193 bus_manager_send_reloading(m, true);
71445ae7 1194
6b78f9b4 1195 fds = fdset_new();
48b90859
LP
1196 if (!fds)
1197 return log_oom();
a16e1123 1198
b3680f49 1199 r = manager_serialize(m, f, fds, switching_root);
48b90859
LP
1200 if (r < 0)
1201 return log_error_errno(r, "Failed to serialize state: %m");
a16e1123 1202
48b90859
LP
1203 if (fseeko(f, 0, SEEK_SET) == (off_t) -1)
1204 return log_error_errno(errno, "Failed to rewind serialization fd: %m");
a16e1123 1205
6b78f9b4 1206 r = fd_cloexec(fileno(f), false);
48b90859
LP
1207 if (r < 0)
1208 return log_error_errno(r, "Failed to disable O_CLOEXEC for serialization: %m");
a16e1123 1209
6b78f9b4 1210 r = fdset_cloexec(fds, false);
48b90859
LP
1211 if (r < 0)
1212 return log_error_errno(r, "Failed to disable O_CLOEXEC for serialization fds: %m");
a16e1123
LP
1213
1214 *_f = f;
1215 *_fds = fds;
1216
48b90859
LP
1217 f = NULL;
1218 fds = NULL;
a16e1123 1219
48b90859 1220 return 0;
a16e1123
LP
1221}
1222
4096d6f5
LP
1223static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
1224 struct rlimit nl;
1225 int r;
6385cb31
CB
1226 int min_max;
1227 _cleanup_free_ char *nr_open = NULL;
4096d6f5
LP
1228
1229 assert(saved_rlimit);
1230
1231 /* Save the original RLIMIT_NOFILE so that we can reset it
1232 * later when transitioning from the initrd to the main
1233 * systemd or suchlike. */
4a62c710 1234 if (getrlimit(RLIMIT_NOFILE, saved_rlimit) < 0)
3ce40911 1235 return log_warning_errno(errno, "Reading RLIMIT_NOFILE failed, ignoring: %m");
4096d6f5
LP
1236
1237 /* Make sure forked processes get the default kernel setting */
1238 if (!arg_default_rlimit[RLIMIT_NOFILE]) {
1239 struct rlimit *rl;
1240
1241 rl = newdup(struct rlimit, saved_rlimit, 1);
1242 if (!rl)
1243 return log_oom();
1244
1245 arg_default_rlimit[RLIMIT_NOFILE] = rl;
1246 }
1247
6385cb31
CB
1248 /* Get current RLIMIT_NOFILE maximum compiled into the kernel. */
1249 r = read_one_line_file("/proc/sys/fs/nr_open", &nr_open);
d387cfdd 1250 if (r >= 0)
6385cb31
CB
1251 r = safe_atoi(nr_open, &min_max);
1252 /* If we fail, fallback to the hard-coded kernel limit of 1024 * 1024. */
1253 if (r < 0)
1254 min_max = 1024 * 1024;
1255
4096d6f5 1256 /* Bump up the resource limit for ourselves substantially */
6385cb31 1257 nl.rlim_cur = nl.rlim_max = min_max;
4096d6f5 1258 r = setrlimit_closest(RLIMIT_NOFILE, &nl);
23bbb0de 1259 if (r < 0)
3ce40911 1260 return log_warning_errno(r, "Setting RLIMIT_NOFILE failed, ignoring: %m");
4096d6f5
LP
1261
1262 return 0;
1263}
1264
fb3ae275
LP
1265static int bump_rlimit_memlock(struct rlimit *saved_rlimit) {
1266 int r;
1267
1268 assert(saved_rlimit);
1269 assert(getuid() == 0);
1270
1271 /* BPF_MAP_TYPE_LPM_TRIE bpf maps are charged against RLIMIT_MEMLOCK, even though we have CAP_IPC_LOCK which
1272 * should normally disable such checks. We need them to implement IPAccessAllow= and IPAccessDeny=, hence let's
1273 * bump the value high enough for the root user. */
1274
1275 if (getrlimit(RLIMIT_MEMLOCK, saved_rlimit) < 0)
1276 return log_warning_errno(errno, "Reading RLIMIT_MEMLOCK failed, ignoring: %m");
1277
1278 r = setrlimit_closest(RLIMIT_MEMLOCK, &RLIMIT_MAKE_CONST(1024ULL*1024ULL*16ULL));
1279 if (r < 0)
1280 return log_warning_errno(r, "Setting RLIMIT_MEMLOCK failed, ignoring: %m");
1281
1282 return 0;
1283}
1284
80758717 1285static void test_usr(void) {
80758717 1286
ed1c99fc 1287 /* Check that /usr is not a separate fs */
80758717 1288
871c44a7
LP
1289 if (dir_is_empty("/usr") <= 0)
1290 return;
1291
8b173b5e 1292 log_warning("/usr appears to be on its own filesystem and is not already mounted. This is not a supported setup. "
871c44a7
LP
1293 "Some things will probably break (sometimes even silently) in mysterious ways. "
1294 "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
1295}
1296
a07fdfa3
LP
1297static int initialize_join_controllers(void) {
1298 /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
1299 * + "net_prio". We'd like to add "cpuset" to the mix, but
f131770b 1300 * "cpuset" doesn't really work for groups with no initialized
a07fdfa3
LP
1301 * attributes. */
1302
1303 arg_join_controllers = new(char**, 3);
1304 if (!arg_join_controllers)
1305 return -ENOMEM;
1306
1307 arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
fe382237
LP
1308 if (!arg_join_controllers[0])
1309 goto oom;
a6b26d90 1310
fe382237
LP
1311 arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL);
1312 if (!arg_join_controllers[1])
1313 goto oom;
a07fdfa3 1314
fe382237 1315 arg_join_controllers[2] = NULL;
a07fdfa3 1316 return 0;
fe382237
LP
1317
1318oom:
1319 arg_join_controllers = strv_free_free(arg_join_controllers);
1320 return -ENOMEM;
a07fdfa3
LP
1321}
1322
d3b1c508 1323static int enforce_syscall_archs(Set *archs) {
349cc4a5 1324#if HAVE_SECCOMP
d3b1c508
LP
1325 int r;
1326
83f12b27
FS
1327 if (!is_seccomp_available())
1328 return 0;
1329
469830d1 1330 r = seccomp_restrict_archs(arg_syscall_archs);
d3b1c508 1331 if (r < 0)
469830d1 1332 return log_error_errno(r, "Failed to enforce system call architecture restrication: %m");
d3b1c508 1333#endif
469830d1 1334 return 0;
d3b1c508
LP
1335}
1336
b6e2f329
LP
1337static int status_welcome(void) {
1338 _cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL;
1339 int r;
1340
1341 r = parse_env_file("/etc/os-release", NEWLINE,
1342 "PRETTY_NAME", &pretty_name,
1343 "ANSI_COLOR", &ansi_color,
1344 NULL);
ece174c5 1345 if (r == -ENOENT)
5ae4d543
LP
1346 r = parse_env_file("/usr/lib/os-release", NEWLINE,
1347 "PRETTY_NAME", &pretty_name,
1348 "ANSI_COLOR", &ansi_color,
1349 NULL);
b6e2f329
LP
1350
1351 if (r < 0 && r != -ENOENT)
da927ba9 1352 log_warning_errno(r, "Failed to read os-release file: %m");
b6e2f329 1353
dc9b5816
ZJS
1354 if (log_get_show_color())
1355 return status_printf(NULL, false, false,
1356 "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
1357 isempty(ansi_color) ? "1" : ansi_color,
1358 isempty(pretty_name) ? "Linux" : pretty_name);
1359 else
1360 return status_printf(NULL, false, false,
1361 "\nWelcome to %s!\n",
1362 isempty(pretty_name) ? "Linux" : pretty_name);
b6e2f329
LP
1363}
1364
fdd25311
LP
1365static int write_container_id(void) {
1366 const char *c;
19854865 1367 int r;
fdd25311
LP
1368
1369 c = getenv("container");
1370 if (isempty(c))
1371 return 0;
1372
8612da97
LP
1373 RUN_WITH_UMASK(0022)
1374 r = write_string_file("/run/systemd/container", c, WRITE_STRING_FILE_CREATE);
19854865 1375 if (r < 0)
f1f849b0 1376 return log_warning_errno(r, "Failed to write /run/systemd/container, ignoring: %m");
19854865
LP
1377
1378 return 1;
1379}
1380
1381static int bump_unix_max_dgram_qlen(void) {
1382 _cleanup_free_ char *qlen = NULL;
1383 unsigned long v;
1384 int r;
1385
1386 /* Let's bump the net.unix.max_dgram_qlen sysctl. The kernel
1387 * default of 16 is simply too low. We set the value really
1388 * really early during boot, so that it is actually applied to
1389 * all our sockets, including the $NOTIFY_SOCKET one. */
1390
1391 r = read_one_line_file("/proc/sys/net/unix/max_dgram_qlen", &qlen);
1392 if (r < 0)
1393 return log_warning_errno(r, "Failed to read AF_UNIX datagram queue length, ignoring: %m");
1394
1395 r = safe_atolu(qlen, &v);
1396 if (r < 0)
1397 return log_warning_errno(r, "Failed to parse AF_UNIX datagram queue length, ignoring: %m");
1398
1399 if (v >= DEFAULT_UNIX_MAX_DGRAM_QLEN)
1400 return 0;
1401
1402 qlen = mfree(qlen);
1403 if (asprintf(&qlen, "%lu\n", DEFAULT_UNIX_MAX_DGRAM_QLEN) < 0)
1404 return log_oom();
1405
1406 r = write_string_file("/proc/sys/net/unix/max_dgram_qlen", qlen, 0);
1407 if (r < 0)
1408 return log_full_errno(IN_SET(r, -EROFS, -EPERM, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
1409 "Failed to bump AF_UNIX datagram queue length, ignoring: %m");
1410
1411 return 1;
fdd25311
LP
1412}
1413
32391275
FB
1414static int fixup_environment(void) {
1415 _cleanup_free_ char *term = NULL;
1416 int r;
1417
84af7821
LP
1418 /* We expect the environment to be set correctly
1419 * if run inside a container. */
1420 if (detect_container() > 0)
1421 return 0;
1422
32391275
FB
1423 /* When started as PID1, the kernel uses /dev/console
1424 * for our stdios and uses TERM=linux whatever the
1425 * backend device used by the console. We try to make
1426 * a better guess here since some consoles might not
1427 * have support for color mode for example.
1428 *
1429 * However if TERM was configured through the kernel
1430 * command line then leave it alone. */
1431
1d84ad94 1432 r = proc_cmdline_get_key("TERM", 0, &term);
32391275
FB
1433 if (r < 0)
1434 return r;
32391275 1435 if (r == 0) {
6af760f3 1436 term = strdup(default_term_for_tty("/dev/console"));
32391275 1437 if (!term)
84af7821 1438 return -ENOMEM;
32391275
FB
1439 }
1440
1441 if (setenv("TERM", term, 1) < 0)
1442 return -errno;
1443
1444 return 0;
1445}
1446
6808a0bc
LP
1447static void redirect_telinit(int argc, char *argv[]) {
1448
1449 /* This is compatibility support for SysV, where calling init as a user is identical to telinit. */
1450
1451#if HAVE_SYSV_COMPAT
1452 if (getpid_cached() == 1)
1453 return;
1454
1455 if (!strstr(program_invocation_short_name, "init"))
1456 return;
1457
1458 execv(SYSTEMCTL_BINARY_PATH, argv);
1459 log_error_errno(errno, "Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
1460 exit(1);
1461#endif
1462}
1463
4a36297c
LP
1464static int become_shutdown(
1465 const char *shutdown_verb,
7eb35049 1466 int retval) {
4a36297c
LP
1467
1468 char log_level[DECIMAL_STR_MAX(int) + 1],
1469 exit_code[DECIMAL_STR_MAX(uint8_t) + 1];
1470
1471 const char* command_line[11] = {
1472 SYSTEMD_SHUTDOWN_BINARY_PATH,
1473 shutdown_verb,
1474 "--log-level", log_level,
1475 "--log-target",
1476 };
1477
1478 _cleanup_strv_free_ char **env_block = NULL;
1479 size_t pos = 5;
1480 int r;
1481
7eb35049 1482 assert(shutdown_verb);
234519ae 1483 assert(!command_line[pos]);
4a36297c
LP
1484 env_block = strv_copy(environ);
1485
1486 xsprintf(log_level, "%d", log_get_max_level());
1487
1488 switch (log_get_target()) {
1489
1490 case LOG_TARGET_KMSG:
1491 case LOG_TARGET_JOURNAL_OR_KMSG:
1492 case LOG_TARGET_SYSLOG_OR_KMSG:
1493 command_line[pos++] = "kmsg";
1494 break;
1495
1496 case LOG_TARGET_NULL:
1497 command_line[pos++] = "null";
1498 break;
1499
1500 case LOG_TARGET_CONSOLE:
1501 default:
1502 command_line[pos++] = "console";
1503 break;
1504 };
1505
1506 if (log_get_show_color())
1507 command_line[pos++] = "--log-color";
1508
1509 if (log_get_show_location())
1510 command_line[pos++] = "--log-location";
1511
1512 if (streq(shutdown_verb, "exit")) {
1513 command_line[pos++] = "--exit-code";
1514 command_line[pos++] = exit_code;
1515 xsprintf(exit_code, "%d", retval);
1516 }
1517
1518 assert(pos < ELEMENTSOF(command_line));
1519
7eb35049
LP
1520 if (streq(shutdown_verb, "reboot") &&
1521 arg_shutdown_watchdog > 0 &&
1522 arg_shutdown_watchdog != USEC_INFINITY) {
1523
4a36297c
LP
1524 char *e;
1525
1526 /* If we reboot let's set the shutdown
1527 * watchdog and tell the shutdown binary to
1528 * repeatedly ping it */
1529 r = watchdog_set_timeout(&arg_shutdown_watchdog);
1530 watchdog_close(r < 0);
1531
1532 /* Tell the binary how often to ping, ignore failure */
1533 if (asprintf(&e, "WATCHDOG_USEC="USEC_FMT, arg_shutdown_watchdog) > 0)
8a2c1fbf
EJ
1534 (void) strv_consume(&env_block, e);
1535
1536 if (arg_watchdog_device &&
1537 asprintf(&e, "WATCHDOG_DEVICE=%s", arg_watchdog_device) > 0)
1538 (void) strv_consume(&env_block, e);
4a36297c
LP
1539 } else
1540 watchdog_close(true);
1541
1542 /* Avoid the creation of new processes forked by the
1543 * kernel; at this point, we will not listen to the
1544 * signals anyway */
1545 if (detect_container() <= 0)
1546 (void) cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER);
1547
1548 execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
1549 return -errno;
1550}
1551
e839bafd
LP
1552static void initialize_clock(void) {
1553 int r;
1554
1555 if (clock_is_localtime(NULL) > 0) {
1556 int min;
1557
1558 /*
1559 * The very first call of settimeofday() also does a time warp in the kernel.
1560 *
1561 * In the rtc-in-local time mode, we set the kernel's timezone, and rely on external tools to take care
1562 * of maintaining the RTC and do all adjustments. This matches the behavior of Windows, which leaves
1563 * the RTC alone if the registry tells that the RTC runs in UTC.
1564 */
1565 r = clock_set_timezone(&min);
1566 if (r < 0)
1567 log_error_errno(r, "Failed to apply local time delta, ignoring: %m");
1568 else
1569 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
1570
1571 } else if (!in_initrd()) {
1572 /*
1573 * Do a dummy very first call to seal the kernel's time warp magic.
1574 *
1575 * Do not call this from inside the initrd. The initrd might not carry /etc/adjtime with LOCAL, but the
1576 * real system could be set up that way. In such case, we need to delay the time-warp or the sealing
1577 * until we reach the real system.
1578 *
1579 * Do no set the kernel's timezone. The concept of local time cannot be supported reliably, the time
1580 * will jump or be incorrect at every daylight saving time change. All kernel local time concepts will
1581 * be treated as UTC that way.
1582 */
1583 (void) clock_reset_timewarp();
1584 }
1585
1586 r = clock_apply_epoch();
1587 if (r < 0)
1588 log_error_errno(r, "Current system time is before build time, but cannot correct: %m");
1589 else if (r > 0)
1590 log_info("System time before build time, advancing clock.");
1591}
1592
1e41242e
LP
1593static void initialize_coredump(bool skip_setup) {
1594
1595 if (getpid_cached() != 1)
1596 return;
1597
1598 /* Don't limit the core dump size, so that coredump handlers such as systemd-coredump (which honour the limit)
1599 * will process core dumps for system services by default. */
1600 if (setrlimit(RLIMIT_CORE, &RLIMIT_MAKE_CONST(RLIM_INFINITY)) < 0)
1601 log_warning_errno(errno, "Failed to set RLIMIT_CORE: %m");
1602
1603 /* But at the same time, turn off the core_pattern logic by default, so that no coredumps are stored
1604 * until the systemd-coredump tool is enabled via sysctl. */
1605 if (!skip_setup)
1606 (void) write_string_file("/proc/sys/kernel/core_pattern", "|/bin/false", 0);
1607}
1608
3c7878f9
LP
1609static void do_reexecute(
1610 int argc,
1611 char *argv[],
1612 const struct rlimit *saved_rlimit_nofile,
1613 const struct rlimit *saved_rlimit_memlock,
1614 FDSet *fds,
1615 const char *switch_root_dir,
1616 const char *switch_root_init,
1617 const char **ret_error_message) {
1618
1619 unsigned i, j, args_size;
1620 const char **args;
1621 int r;
1622
1623 assert(saved_rlimit_nofile);
1624 assert(saved_rlimit_memlock);
1625 assert(ret_error_message);
1626
1627 /* Close and disarm the watchdog, so that the new instance can reinitialize it, but doesn't get rebooted while
1628 * we do that */
1629 watchdog_close(true);
1630
1631 /* Reset the RLIMIT_NOFILE to the kernel default, so that the new systemd can pass the kernel default to its
1632 * child processes */
1633
1634 if (saved_rlimit_nofile->rlim_cur > 0)
1635 (void) setrlimit(RLIMIT_NOFILE, saved_rlimit_nofile);
1636 if (saved_rlimit_memlock->rlim_cur != (rlim_t) -1)
1637 (void) setrlimit(RLIMIT_MEMLOCK, saved_rlimit_memlock);
1638
1639 if (switch_root_dir) {
1640 /* Kill all remaining processes from the initrd, but don't wait for them, so that we can handle the
1641 * SIGCHLD for them after deserializing. */
1642 broadcast_signal(SIGTERM, false, true);
1643
1644 /* And switch root with MS_MOVE, because we remove the old directory afterwards and detach it. */
1645 r = switch_root(switch_root_dir, "/mnt", true, MS_MOVE);
1646 if (r < 0)
1647 log_error_errno(r, "Failed to switch root, trying to continue: %m");
1648 }
1649
1650 args_size = MAX(6, argc+1);
1651 args = newa(const char*, args_size);
1652
1653 if (!switch_root_init) {
1654 char sfd[DECIMAL_STR_MAX(int) + 1];
1655
1656 /* First try to spawn ourselves with the right path, and with full serialization. We do this only if
1657 * the user didn't specify an explicit init to spawn. */
1658
1659 assert(arg_serialization);
1660 assert(fds);
1661
1662 xsprintf(sfd, "%i", fileno(arg_serialization));
1663
1664 i = 0;
1665 args[i++] = SYSTEMD_BINARY_PATH;
1666 if (switch_root_dir)
1667 args[i++] = "--switched-root";
1668 args[i++] = arg_system ? "--system" : "--user";
1669 args[i++] = "--deserialize";
1670 args[i++] = sfd;
1671 args[i++] = NULL;
1672
1673 assert(i <= args_size);
1674
1675 /*
1676 * We want valgrind to print its memory usage summary before reexecution. Valgrind won't do this is on
1677 * its own on exec(), but it will do it on exit(). Hence, to ensure we get a summary here, fork() off
1678 * a child, let it exit() cleanly, so that it prints the summary, and wait() for it in the parent,
1679 * before proceeding into the exec().
1680 */
1681 valgrind_summary_hack();
1682
1683 (void) execv(args[0], (char* const*) args);
1684 log_debug_errno(errno, "Failed to execute our own binary, trying fallback: %m");
1685 }
1686
1687 /* Try the fallback, if there is any, without any serialization. We pass the original argv[] and envp[]. (Well,
1688 * modulo the ordering changes due to getopt() in argv[], and some cleanups in envp[], but let's hope that
1689 * doesn't matter.) */
1690
1691 arg_serialization = safe_fclose(arg_serialization);
1692 fds = fdset_free(fds);
1693
1694 /* Reopen the console */
1695 (void) make_console_stdio();
1696
1697 for (j = 1, i = 1; j < (unsigned) argc; j++)
1698 args[i++] = argv[j];
1699 args[i++] = NULL;
1700 assert(i <= args_size);
1701
1702 /* Reenable any blocked signals, especially important if we switch from initial ramdisk to init=... */
1703 (void) reset_all_signal_handlers();
1704 (void) reset_signal_mask();
1705
1706 if (switch_root_init) {
1707 args[0] = switch_root_init;
1708 (void) execv(args[0], (char* const*) args);
1709 log_warning_errno(errno, "Failed to execute configured init, trying fallback: %m");
1710 }
1711
1712 args[0] = "/sbin/init";
1713 (void) execv(args[0], (char* const*) args);
1714 r = -errno;
1715
1716 manager_status_printf(NULL, STATUS_TYPE_EMERGENCY,
1717 ANSI_HIGHLIGHT_RED " !! " ANSI_NORMAL,
1718 "Failed to execute /sbin/init");
1719
1720 if (r == -ENOENT) {
1721 log_warning("No /sbin/init, trying fallback");
1722
1723 args[0] = "/bin/sh";
1724 args[1] = NULL;
1725 (void) execv(args[0], (char* const*) args);
1726 log_error_errno(errno, "Failed to execute /bin/sh, giving up: %m");
1727 } else
1728 log_warning_errno(r, "Failed to execute /sbin/init, giving up: %m");
1729
1730 *ret_error_message = "Failed to execute fallback shell";
1731}
1732
7eb35049
LP
1733static int invoke_main_loop(
1734 Manager *m,
1735 bool *ret_reexecute,
1736 int *ret_retval, /* Return parameters relevant for shutting down */
1737 const char **ret_shutdown_verb, /* … */
1738 FDSet **ret_fds, /* Return parameters for reexecuting */
1739 char **ret_switch_root_dir, /* … */
1740 char **ret_switch_root_init, /* … */
1741 const char **ret_error_message) {
1742
1743 int r;
1744
1745 assert(m);
1746 assert(ret_reexecute);
1747 assert(ret_retval);
1748 assert(ret_shutdown_verb);
1749 assert(ret_fds);
1750 assert(ret_switch_root_dir);
1751 assert(ret_switch_root_init);
1752 assert(ret_error_message);
1753
1754 for (;;) {
1755 r = manager_loop(m);
1756 if (r < 0) {
1757 *ret_error_message = "Failed to run main loop";
1758 return log_emergency_errno(r, "Failed to run main loop: %m");
1759 }
1760
1761 switch (m->exit_code) {
1762
1763 case MANAGER_RELOAD:
1764 log_info("Reloading.");
1765
1766 r = parse_config_file();
1767 if (r < 0)
1768 log_warning_errno(r, "Failed to parse config file, ignoring: %m");
1769
1770 set_manager_defaults(m);
1771
1772 r = manager_reload(m);
1773 if (r < 0)
1774 log_warning_errno(r, "Failed to reload, ignoring: %m");
1775
1776 break;
1777
1778 case MANAGER_REEXECUTE:
1779
1780 r = prepare_reexecute(m, &arg_serialization, ret_fds, false);
1781 if (r < 0) {
1782 *ret_error_message = "Failed to prepare for reexecution";
1783 return r;
1784 }
1785
1786 log_notice("Reexecuting.");
1787
1788 *ret_reexecute = true;
1789 *ret_retval = EXIT_SUCCESS;
1790 *ret_shutdown_verb = NULL;
1791 *ret_switch_root_dir = *ret_switch_root_init = NULL;
1792
1793 return 0;
1794
1795 case MANAGER_SWITCH_ROOT:
1796 if (!m->switch_root_init) {
1797 r = prepare_reexecute(m, &arg_serialization, ret_fds, true);
1798 if (r < 0) {
1799 *ret_error_message = "Failed to prepare for reexecution";
1800 return r;
1801 }
1802 } else
1803 *ret_fds = NULL;
1804
1805 log_notice("Switching root.");
1806
1807 *ret_reexecute = true;
1808 *ret_retval = EXIT_SUCCESS;
1809 *ret_shutdown_verb = NULL;
1810
1811 /* Steal the switch root parameters */
1812 *ret_switch_root_dir = m->switch_root;
1813 *ret_switch_root_init = m->switch_root_init;
1814 m->switch_root = m->switch_root_init = NULL;
1815
1816 return 0;
1817
1818 case MANAGER_EXIT:
1819
1820 if (MANAGER_IS_USER(m)) {
1821 log_debug("Exit.");
1822
1823 *ret_reexecute = false;
1824 *ret_retval = m->return_value;
1825 *ret_shutdown_verb = NULL;
1826 *ret_fds = NULL;
1827 *ret_switch_root_dir = *ret_switch_root_init = NULL;
1828
1829 return 0;
1830 }
1831
1832 _fallthrough_;
1833 case MANAGER_REBOOT:
1834 case MANAGER_POWEROFF:
1835 case MANAGER_HALT:
1836 case MANAGER_KEXEC: {
1837 static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
1838 [MANAGER_EXIT] = "exit",
1839 [MANAGER_REBOOT] = "reboot",
1840 [MANAGER_POWEROFF] = "poweroff",
1841 [MANAGER_HALT] = "halt",
1842 [MANAGER_KEXEC] = "kexec"
1843 };
1844
1845 log_notice("Shutting down.");
1846
1847 *ret_reexecute = false;
1848 *ret_retval = m->return_value;
1849 assert_se(*ret_shutdown_verb = table[m->exit_code]);
1850 *ret_fds = NULL;
1851 *ret_switch_root_dir = *ret_switch_root_init = NULL;
1852
1853 return 0;
1854 }
1855
1856 default:
1857 assert_not_reached("Unknown exit code.");
1858 }
1859 }
1860}
1861
31aef7ff
LP
1862static void log_execution_mode(bool *ret_first_boot) {
1863 assert(ret_first_boot);
1864
1865 if (arg_system) {
1866 int v;
1867
1868 log_info(PACKAGE_STRING " running in %ssystem mode. (" SYSTEMD_FEATURES ")",
1869 arg_action == ACTION_TEST ? "test " : "" );
1870
1871 v = detect_virtualization();
1872 if (v > 0)
1873 log_info("Detected virtualization %s.", virtualization_to_string(v));
1874
1875 log_info("Detected architecture %s.", architecture_to_string(uname_architecture()));
1876
1877 if (in_initrd()) {
1878 *ret_first_boot = false;
1879 log_info("Running in initial RAM disk.");
1880 } else {
1881 /* Let's check whether we are in first boot, i.e. whether /etc is still unpopulated. We use
1882 * /etc/machine-id as flag file, for this: if it exists we assume /etc is populated, if it
1883 * doesn't it's unpopulated. This allows container managers and installers to provision a
1884 * couple of files already. If the container manager wants to provision the machine ID itself
1885 * it should pass $container_uuid to PID 1. */
1886
1887 *ret_first_boot = access("/etc/machine-id", F_OK) < 0;
1888 if (*ret_first_boot)
1889 log_info("Running with unpopulated /etc.");
1890 }
1891 } else {
1892 _cleanup_free_ char *t;
1893
1894 t = uid_to_name(getuid());
1895 log_debug(PACKAGE_STRING " running in %suser mode for user " UID_FMT "/%s. (" SYSTEMD_FEATURES ")",
1896 arg_action == ACTION_TEST ? " test" : "", getuid(), strna(t));
1897
1898 *ret_first_boot = false;
1899 }
1900}
1901
5afbaa36
LP
1902static int initialize_runtime(
1903 bool skip_setup,
1904 struct rlimit *saved_rlimit_nofile,
1905 struct rlimit *saved_rlimit_memlock,
1906 const char **ret_error_message) {
1907
1908 int r;
1909
1910 assert(ret_error_message);
1911
1912 /* Sets up various runtime parameters. Many of these initializations are conditionalized:
1913 *
1914 * - Some only apply to --system instances
1915 * - Some only apply to --user instances
1916 * - Some only apply when we first start up, but not when we reexecute
1917 */
1918
1919 if (arg_system && !skip_setup) {
1920 if (arg_show_status > 0)
1921 status_welcome();
1922
1923 hostname_setup();
1924 machine_id_setup(NULL, arg_machine_id, NULL);
1925 loopback_setup();
1926 bump_unix_max_dgram_qlen();
5afbaa36 1927 test_usr();
6c78f016 1928 write_container_id();
5afbaa36
LP
1929 }
1930
8a2c1fbf
EJ
1931 if (arg_system && arg_watchdog_device) {
1932 r = watchdog_set_device(arg_watchdog_device);
1933 if (r < 0)
1934 log_warning_errno(r, "Failed to set watchdog device to %s, ignoring: %m",
1935 arg_watchdog_device);
1936 }
1937
5afbaa36
LP
1938 if (arg_system && arg_runtime_watchdog > 0 && arg_runtime_watchdog != USEC_INFINITY)
1939 watchdog_set_timeout(&arg_runtime_watchdog);
1940
1941 if (arg_timer_slack_nsec != NSEC_INFINITY)
1942 if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
1943 log_error_errno(errno, "Failed to adjust timer slack: %m");
1944
1945 if (arg_system && !cap_test_all(arg_capability_bounding_set)) {
1946 r = capability_bounding_set_drop_usermode(arg_capability_bounding_set);
1947 if (r < 0) {
1948 *ret_error_message = "Failed to drop capability bounding set of usermode helpers";
1949 return log_emergency_errno(r, "Failed to drop capability bounding set of usermode helpers: %m");
1950 }
1951
1952 r = capability_bounding_set_drop(arg_capability_bounding_set, true);
1953 if (r < 0) {
1954 *ret_error_message = "Failed to drop capability bounding set";
1955 return log_emergency_errno(r, "Failed to drop capability bounding set: %m");
1956 }
1957 }
1958
1959 if (arg_syscall_archs) {
1960 r = enforce_syscall_archs(arg_syscall_archs);
1961 if (r < 0) {
1962 *ret_error_message = "Failed to set syscall architectures";
1963 return r;
1964 }
1965 }
1966
1967 if (!arg_system)
1968 /* Become reaper of our children */
1969 if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0)
1970 log_warning_errno(errno, "Failed to make us a subreaper: %m");
1971
1972 if (arg_system) {
1973 /* Bump up RLIMIT_NOFILE for systemd itself */
1974 (void) bump_rlimit_nofile(saved_rlimit_nofile);
1975 (void) bump_rlimit_memlock(saved_rlimit_memlock);
1976 }
1977
1978 return 0;
1979}
1980
6acca5fc
LP
1981static int do_queue_default_job(
1982 Manager *m,
1983 const char **ret_error_message) {
1984
1985 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
1986 Job *default_unit_job;
1987 Unit *target = NULL;
1988 int r;
1989
1990 log_debug("Activating default unit: %s", arg_default_unit);
1991
1992 r = manager_load_unit(m, arg_default_unit, NULL, &error, &target);
1993 if (r < 0)
1994 log_error("Failed to load default target: %s", bus_error_message(&error, r));
1995 else if (IN_SET(target->load_state, UNIT_ERROR, UNIT_NOT_FOUND))
1996 log_error_errno(target->load_error, "Failed to load default target: %m");
1997 else if (target->load_state == UNIT_MASKED)
1998 log_error("Default target masked.");
1999
2000 if (!target || target->load_state != UNIT_LOADED) {
2001 log_info("Trying to load rescue target...");
2002
2003 r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target);
2004 if (r < 0) {
2005 *ret_error_message = "Failed to load rescue target";
2006 return log_emergency_errno(r, "Failed to load rescue target: %s", bus_error_message(&error, r));
2007 } else if (IN_SET(target->load_state, UNIT_ERROR, UNIT_NOT_FOUND)) {
2008 *ret_error_message = "Failed to load rescue target";
2009 return log_emergency_errno(target->load_error, "Failed to load rescue target: %m");
2010 } else if (target->load_state == UNIT_MASKED) {
2011 *ret_error_message = "Rescue target masked";
2012 log_emergency("Rescue target masked.");
2013 return -ERFKILL;
2014 }
2015 }
2016
2017 assert(target->load_state == UNIT_LOADED);
2018
2019 r = manager_add_job(m, JOB_START, target, JOB_ISOLATE, &error, &default_unit_job);
2020 if (r == -EPERM) {
2021 log_debug_errno(r, "Default target could not be isolated, starting instead: %s", bus_error_message(&error, r));
2022
2023 sd_bus_error_free(&error);
2024
2025 r = manager_add_job(m, JOB_START, target, JOB_REPLACE, &error, &default_unit_job);
2026 if (r < 0) {
2027 *ret_error_message = "Failed to start default target";
2028 return log_emergency_errno(r, "Failed to start default target: %s", bus_error_message(&error, r));
2029 }
2030
2031 } else if (r < 0) {
2032 *ret_error_message = "Failed to isolate default target";
2033 return log_emergency_errno(r, "Failed to isolate default target: %s", bus_error_message(&error, r));
2034 }
2035
2036 m->default_unit_job_id = default_unit_job->id;
2037
2038 return 0;
2039}
2040
970777b5
LP
2041static void free_arguments(void) {
2042 size_t j;
2043
2044 /* Frees all arg_* variables, with the exception of arg_serialization */
2045
2046 for (j = 0; j < ELEMENTSOF(arg_default_rlimit); j++)
2047 arg_default_rlimit[j] = mfree(arg_default_rlimit[j]);
2048
2049 arg_default_unit = mfree(arg_default_unit);
2050 arg_confirm_spawn = mfree(arg_confirm_spawn);
2051 arg_join_controllers = strv_free_free(arg_join_controllers);
2052 arg_default_environment = strv_free(arg_default_environment);
2053 arg_syscall_archs = set_free(arg_syscall_archs);
2054}
2055
60918275
LP
2056int main(int argc, char *argv[]) {
2057 Manager *m = NULL;
22f4096c 2058 int r, retval = EXIT_FAILURE;
9d76d730
LP
2059 usec_t before_startup, after_startup;
2060 char timespan[FORMAT_TIMESPAN_MAX];
a16e1123
LP
2061 FDSet *fds = NULL;
2062 bool reexecute = false;
b9080b03 2063 const char *shutdown_verb = NULL;
86caf095
LP
2064 dual_timestamp initrd_timestamp = DUAL_TIMESTAMP_NULL;
2065 dual_timestamp userspace_timestamp = DUAL_TIMESTAMP_NULL;
2066 dual_timestamp kernel_timestamp = DUAL_TIMESTAMP_NULL;
2067 dual_timestamp security_start_timestamp = DUAL_TIMESTAMP_NULL;
2068 dual_timestamp security_finish_timestamp = DUAL_TIMESTAMP_NULL;
5d6b1584 2069 static char systemd[] = "systemd";
2660882b 2070 bool skip_setup = false;
0b3325e7 2071 bool loaded_policy = false;
bf4df7c3 2072 bool queue_default_job = false;
fd130612 2073 bool first_boot = false;
41669317 2074 char *switch_root_dir = NULL, *switch_root_init = NULL;
fb3ae275 2075 struct rlimit saved_rlimit_nofile = RLIMIT_MAKE_CONST(0), saved_rlimit_memlock = RLIMIT_MAKE_CONST((rlim_t) -1);
cb6531be 2076 const char *error_message = NULL;
27b14a22 2077
6808a0bc 2078 redirect_telinit(argc, argv);
2cb1a60d 2079
c3a170f3
HH
2080 dual_timestamp_from_monotonic(&kernel_timestamp, 0);
2081 dual_timestamp_get(&userspace_timestamp);
2082
0b3325e7
LP
2083 /* Determine if this is a reexecution or normal bootup. We do
2084 * the full command line parsing much later, so let's just
2085 * have a quick peek here. */
db813c2a
LP
2086 if (strv_find(argv+1, "--deserialize"))
2087 skip_setup = true;
0b3325e7 2088
2660882b
LP
2089 /* If we have switched root, do all the special setup
2090 * things */
db813c2a
LP
2091 if (strv_find(argv+1, "--switched-root"))
2092 skip_setup = false;
d03bc1b8 2093
f3b6a3ed
LP
2094 /* If we get started via the /sbin/init symlink then we are
2095 called 'init'. After a subsequent reexecution we are then
2096 called 'systemd'. That is confusing, hence let's call us
2097 systemd right-away. */
f3b6a3ed 2098 program_invocation_short_name = systemd;
eee8b7ab 2099 (void) prctl(PR_SET_NAME, systemd);
5d6b1584 2100
9a0e6896
LP
2101 saved_argv = argv;
2102 saved_argc = argc;
f3b6a3ed 2103
c1dc6153 2104 log_set_upgrade_syslog_to_journal(true);
bbe63281 2105
df0ff127 2106 if (getpid_cached() == 1) {
48a601fe 2107 /* Disable the umask logic */
90dc8c2e
MG
2108 umask(0);
2109
48a601fe
LP
2110 /* Always reopen /dev/console when running as PID 1 or one of its pre-execve() children. This is
2111 * important so that we never end up logging to any foreign stderr, for example if we have to log in a
2112 * child process right before execve()'ing the actual binary, at a point in time where socket
2113 * activation stderr/stdout area already set up. */
2114 log_set_always_reopen_console(true);
2115 }
2116
df0ff127 2117 if (getpid_cached() == 1 && detect_container() <= 0) {
4f8d551f 2118
a866073d 2119 /* Running outside of a container as PID 1 */
463d0d15 2120 arg_system = true;
a866073d
LP
2121 log_set_target(LOG_TARGET_KMSG);
2122 log_open();
2123
21bf2ab0 2124 if (in_initrd())
c3a170f3 2125 initrd_timestamp = userspace_timestamp;
c3ba6250 2126
2660882b 2127 if (!skip_setup) {
d723cd65
AK
2128 r = mount_setup_early();
2129 if (r < 0) {
eee8b7ab 2130 error_message = "Failed to mount early API filesystems";
d723cd65
AK
2131 goto finish;
2132 }
eee8b7ab 2133
c2e0d600 2134 dual_timestamp_get(&security_start_timestamp);
cb6531be
ZJS
2135 if (mac_selinux_setup(&loaded_policy) < 0) {
2136 error_message = "Failed to load SELinux policy";
0b3325e7 2137 goto finish;
cb6531be
ZJS
2138 } else if (mac_smack_setup(&loaded_policy) < 0) {
2139 error_message = "Failed to load SMACK policy";
ffbd2c4d 2140 goto finish;
96694e99
IP
2141 } else if (ima_setup() < 0) {
2142 error_message = "Failed to load IMA policy";
2143 goto finish;
cb6531be 2144 }
c2e0d600 2145 dual_timestamp_get(&security_finish_timestamp);
81611586 2146 }
0b3325e7 2147
c3dacc8b 2148 if (mac_selinux_init() < 0) {
cb6531be 2149 error_message = "Failed to initialize SELinux policy";
0ff4cdd9 2150 goto finish;
cb6531be 2151 }
7948c4df 2152
e839bafd
LP
2153 if (!skip_setup)
2154 initialize_clock();
a866073d
LP
2155
2156 /* Set the default for later on, but don't actually
2157 * open the logs like this for now. Note that if we
2158 * are transitioning from the initrd there might still
2159 * be journal fd open, and we shouldn't attempt
2160 * opening that before we parsed /proc/cmdline which
2161 * might redirect output elsewhere. */
2162 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
2163
df0ff127 2164 } else if (getpid_cached() == 1) {
a866073d 2165 /* Running inside a container, as PID 1 */
463d0d15 2166 arg_system = true;
a866073d 2167 log_set_target(LOG_TARGET_CONSOLE);
99f09825 2168 log_close_console(); /* force reopen of /dev/console */
a866073d
LP
2169 log_open();
2170
eee8b7ab 2171 /* For later on, see above... */
a866073d
LP
2172 log_set_target(LOG_TARGET_JOURNAL);
2173
c3a170f3
HH
2174 /* clear the kernel timestamp,
2175 * because we are in a container */
0f5f63c3 2176 kernel_timestamp = DUAL_TIMESTAMP_NULL;
c3a170f3 2177 } else {
a866073d 2178 /* Running as user instance */
463d0d15 2179 arg_system = false;
eeecf6e6 2180 log_set_target(LOG_TARGET_AUTO);
871e5809 2181 log_open();
c3a170f3
HH
2182
2183 /* clear the kernel timestamp,
2184 * because we are not PID 1 */
6513d561 2185 kernel_timestamp = DUAL_TIMESTAMP_NULL;
bbe63281 2186 }
a5dab5ce 2187
1e41242e 2188 initialize_coredump(skip_setup);
15a90032 2189
6edefe0b 2190 if (arg_system) {
84af7821
LP
2191 if (fixup_environment() < 0) {
2192 error_message = "Failed to fix up PID1 environment";
2193 goto finish;
2194 }
32391275 2195
3a18b604
FB
2196 /* Try to figure out if we can use colors with the console. No
2197 * need to do that for user instances since they never log
2198 * into the console. */
2199 log_show_color(colors_enabled());
c76cf844
AK
2200 r = make_null_stdio();
2201 if (r < 0)
2202 log_warning_errno(r, "Failed to redirect standard streams to /dev/null: %m");
3a18b604
FB
2203 }
2204
a07fdfa3 2205 r = initialize_join_controllers();
cb6531be 2206 if (r < 0) {
ff9b60f3 2207 error_message = "Failed to initialize cgroup controllers";
0c85a4f3 2208 goto finish;
cb6531be 2209 }
0c85a4f3 2210
f170852a
LP
2211 /* Mount /proc, /sys and friends, so that /proc/cmdline and
2212 * /proc/$PID/fd is available. */
df0ff127 2213 if (getpid_cached() == 1) {
f84f9974 2214
a132bef0 2215 /* Load the kernel modules early. */
2e75e2a8
DM
2216 if (!skip_setup)
2217 kmod_setup();
2e75e2a8 2218
0c85a4f3 2219 r = mount_setup(loaded_policy);
cb6531be
ZJS
2220 if (r < 0) {
2221 error_message = "Failed to mount API filesystems";
8efe3c01 2222 goto finish;
cb6531be 2223 }
0c85a4f3 2224 }
4ade7963
LP
2225
2226 /* Reset all signal handlers. */
ce30c8dc
LP
2227 (void) reset_all_signal_handlers();
2228 (void) ignore_signals(SIGNALS_IGNORE, -1);
078e4539 2229
f5058264 2230 arg_default_tasks_max = system_tasks_max_scale(DEFAULT_TASKS_MAX_PERCENTAGE, 100U);
79baeeb9 2231
cb6531be
ZJS
2232 if (parse_config_file() < 0) {
2233 error_message = "Failed to parse config file";
487393e9 2234 goto finish;
cb6531be 2235 }
487393e9 2236
463d0d15 2237 if (arg_system) {
1d84ad94 2238 r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
b5884878 2239 if (r < 0)
da927ba9 2240 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
b5884878 2241 }
f170852a 2242
1de1c9c3
LP
2243 /* Note that this also parses bits from the kernel command
2244 * line, including "debug". */
f170852a
LP
2245 log_parse_environment();
2246
cb6531be
ZJS
2247 if (parse_argv(argc, argv) < 0) {
2248 error_message = "Failed to parse commandline arguments";
f170852a 2249 goto finish;
cb6531be 2250 }
f170852a 2251
10c961b9
AK
2252 /* Initialize default unit */
2253 if (!arg_default_unit) {
f6dd106c
AK
2254 arg_default_unit = strdup(SPECIAL_DEFAULT_TARGET);
2255 if (!arg_default_unit) {
2256 r = log_oom();
10c961b9
AK
2257 error_message = "Failed to set default unit";
2258 goto finish;
2259 }
2260 }
2261
6bae23a0
TB
2262 if (arg_action == ACTION_TEST &&
2263 geteuid() == 0) {
b5c6cf87
LP
2264 log_error("Don't run test mode as root.");
2265 goto finish;
2266 }
2267
463d0d15 2268 if (!arg_system &&
6bae23a0
TB
2269 arg_action == ACTION_RUN &&
2270 sd_booted() <= 0) {
2271 log_error("Trying to run as user instance, but the system has not been booted with systemd.");
2272 goto finish;
2273 }
2274
463d0d15 2275 if (arg_system &&
fe783b03
LP
2276 arg_action == ACTION_RUN &&
2277 running_in_chroot() > 0) {
2278 log_error("Cannot be run in a chroot() environment.");
2279 goto finish;
2280 }
2281
4c701096 2282 if (IN_SET(arg_action, ACTION_TEST, ACTION_HELP)) {
ea4b98e6 2283 pager_open(arg_no_pager, false);
74e7579c
AK
2284 skip_setup = true;
2285 }
b87c2aa6 2286
fa0f4d8a 2287 if (arg_action == ACTION_HELP) {
f170852a
LP
2288 retval = help();
2289 goto finish;
9ba0bc4e
ZJS
2290 } else if (arg_action == ACTION_VERSION) {
2291 retval = version();
2292 goto finish;
fa0f4d8a 2293 } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
13811bf9 2294 pager_open(arg_no_pager, false);
e537352b 2295 unit_dump_config_items(stdout);
22f4096c 2296 retval = EXIT_SUCCESS;
e537352b 2297 goto finish;
f170852a
LP
2298 }
2299
463d0d15 2300 if (!arg_system &&
8be28fb1
KS
2301 !getenv("XDG_RUNTIME_DIR")) {
2302 log_error("Trying to run as user instance, but $XDG_RUNTIME_DIR is not set.");
2303 goto finish;
2304 }
2305
4c701096 2306 assert_se(IN_SET(arg_action, ACTION_RUN, ACTION_TEST));
f170852a 2307
871e5809
LP
2308 /* Close logging fds, in order not to confuse fdset below */
2309 log_close();
2310
a16e1123 2311 /* Remember open file descriptors for later deserialization */
dea374e8
LP
2312 if (arg_action == ACTION_RUN) {
2313 r = fdset_new_fill(&fds);
2314 if (r < 0) {
2315 log_emergency_errno(r, "Failed to allocate fd set: %m");
2316 error_message = "Failed to allocate fd set";
2317 goto finish;
2318 } else
2319 fdset_cloexec(fds, true);
a16e1123 2320
dea374e8
LP
2321 if (arg_serialization)
2322 assert_se(fdset_remove(fds, fileno(arg_serialization)) >= 0);
a16e1123 2323
dea374e8
LP
2324 if (arg_system)
2325 /* Become a session leader if we aren't one yet. */
2326 setsid();
2327 }
4ade7963 2328
befb5b6a 2329 /* Move out of the way, so that we won't block unmounts */
d250afe7 2330 assert_se(chdir("/") == 0);
befb5b6a 2331
2146621b
LP
2332 /* Reset the console, but only if this is really init and we
2333 * are freshly booted */
463d0d15 2334 if (arg_system && arg_action == ACTION_RUN) {
56d96fc0
LP
2335
2336 /* If we are init, we connect stdin/stdout/stderr to
2337 * /dev/null and make sure we don't have a controlling
2338 * tty. */
2339 release_terminal();
2340
df0ff127 2341 if (getpid_cached() == 1 && !skip_setup)
56d96fc0
LP
2342 console_setup();
2343 }
4ade7963 2344
18149b9f 2345 /* Open the logging devices, if possible and necessary */
843d2643 2346 log_open();
4ade7963 2347
b6e2f329
LP
2348 if (arg_show_status == _SHOW_STATUS_UNSET)
2349 arg_show_status = SHOW_STATUS_YES;
2350
5373d602
LP
2351 /* Make sure we leave a core dump without panicing the
2352 * kernel. */
df0ff127 2353 if (getpid_cached() == 1) {
4fc935ca 2354 install_crash_handler();
97c4f35c 2355
0c85a4f3
LP
2356 r = mount_cgroup_controllers(arg_join_controllers);
2357 if (r < 0)
2358 goto finish;
2359 }
2360
31aef7ff 2361 log_execution_mode(&first_boot);
a5dab5ce 2362
dea374e8 2363 if (arg_action == ACTION_RUN) {
5afbaa36
LP
2364 r = initialize_runtime(skip_setup,
2365 &saved_rlimit_nofile,
2366 &saved_rlimit_memlock,
2367 &error_message);
2368 if (r < 0)
2369 goto finish;
dea374e8 2370 }
4096d6f5 2371
e0a3da1f
ZJS
2372 r = manager_new(arg_system ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2373 arg_action == ACTION_TEST ? MANAGER_TEST_FULL : 0,
2374 &m);
e96d6be7 2375 if (r < 0) {
da927ba9 2376 log_emergency_errno(r, "Failed to allocate manager object: %m");
cb6531be 2377 error_message = "Failed to allocate manager object";
60918275
LP
2378 goto finish;
2379 }
2380
9f9f0342
LP
2381 m->timestamps[MANAGER_TIMESTAMP_KERNEL] = kernel_timestamp;
2382 m->timestamps[MANAGER_TIMESTAMP_INITRD] = initrd_timestamp;
2383 m->timestamps[MANAGER_TIMESTAMP_USERSPACE] = userspace_timestamp;
2384 m->timestamps[MANAGER_TIMESTAMP_SECURITY_START] = security_start_timestamp;
2385 m->timestamps[MANAGER_TIMESTAMP_SECURITY_FINISH] = security_finish_timestamp;
9e58ff9c 2386
85cb4151 2387 set_manager_defaults(m);
7b46fc6a 2388 set_manager_settings(m);
fd130612 2389 manager_set_first_boot(m, first_boot);
27d340c7 2390
bf4df7c3 2391 /* Remember whether we should queue the default job */
d3b1c508 2392 queue_default_job = !arg_serialization || arg_switched_root;
bf4df7c3 2393
9d76d730
LP
2394 before_startup = now(CLOCK_MONOTONIC);
2395
d3b1c508 2396 r = manager_startup(m, arg_serialization, fds);
58f88d92 2397 if (r < 0) {
da927ba9 2398 log_error_errno(r, "Failed to fully start up daemon: %m");
cefb3eda 2399 error_message = "Failed to start up manager";
58f88d92
ZJS
2400 goto finish;
2401 }
a16e1123 2402
6acca5fc 2403 /* This will close all file descriptors that were opened, but not claimed by any unit. */
2feceb5e 2404 fds = fdset_free(fds);
74ca738f 2405 arg_serialization = safe_fclose(arg_serialization);
bf4df7c3
LP
2406
2407 if (queue_default_job) {
6acca5fc 2408 r = do_queue_default_job(m, &error_message);
718db961 2409 if (r < 0)
37d88da7 2410 goto finish;
6acca5fc 2411 }
ab17a050 2412
6acca5fc 2413 after_startup = now(CLOCK_MONOTONIC);
60918275 2414
6acca5fc
LP
2415 log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG,
2416 "Loaded units and determined initial transaction in %s.",
2417 format_timespan(timespan, sizeof(timespan), after_startup - before_startup, 100 * USEC_PER_MSEC));
07672f49 2418
af6b0ecc
LP
2419 if (arg_system) {
2420 _cleanup_free_ char *taint;
2421
2422 taint = manager_taint_string(m);
2423 if (!isempty(taint))
b2e7486c
ZJS
2424 log_struct(LOG_NOTICE,
2425 LOG_MESSAGE("System is tainted: %s", taint),
2426 "TAINT=%s", taint,
2427 "MESSAGE_ID=" SD_MESSAGE_TAINTED_STR,
2428 NULL);
af6b0ecc
LP
2429 }
2430
6acca5fc
LP
2431 if (arg_action == ACTION_TEST) {
2432 printf("-> By units:\n");
2433 manager_dump_units(m, stdout, "\t");
2434
2435 printf("-> By jobs:\n");
2436 manager_dump_jobs(m, stdout, "\t");
2437 retval = EXIT_SUCCESS;
2438 goto finish;
e965d56d 2439 }
d46de8a1 2440
7eb35049
LP
2441 r = invoke_main_loop(m,
2442 &reexecute,
2443 &retval,
2444 &shutdown_verb,
2445 &fds,
2446 &switch_root_dir,
2447 &switch_root_init,
2448 &error_message);
f170852a 2449
60918275 2450finish:
b87c2aa6
ZJS
2451 pager_close();
2452
97792515 2453 if (m)
81f5fc2d 2454 arg_shutdown_watchdog = m->shutdown_watchdog;
fe382237 2455
06d8d842 2456 m = manager_free(m);
60918275 2457
970777b5 2458 free_arguments();
cc56fafe 2459 mac_selinux_finish();
b2bb3dbe 2460
3c7878f9
LP
2461 if (reexecute)
2462 do_reexecute(argc, argv,
2463 &saved_rlimit_nofile,
2464 &saved_rlimit_memlock,
2465 fds,
2466 switch_root_dir,
2467 switch_root_init,
2468 &error_message); /* This only returns if reexecution failed */
a16e1123 2469
74ca738f 2470 arg_serialization = safe_fclose(arg_serialization);
2feceb5e 2471 fds = fdset_free(fds);
a16e1123 2472
349cc4a5 2473#if HAVE_VALGRIND_VALGRIND_H
54b434b1
LP
2474 /* If we are PID 1 and running under valgrind, then let's exit
2475 * here explicitly. valgrind will only generate nice output on
2476 * exit(), not on exec(), hence let's do the former not the
2477 * latter here. */
8a2c1fbf
EJ
2478 if (getpid_cached() == 1 && RUNNING_ON_VALGRIND) {
2479 /* Cleanup watchdog_device strings for valgrind. We need them
2480 * in become_shutdown() so normally we cannot free them yet. */
2481 watchdog_free_device();
2482 arg_watchdog_device = mfree(arg_watchdog_device);
54b434b1 2483 return 0;
8a2c1fbf 2484 }
54b434b1
LP
2485#endif
2486
b9080b03 2487 if (shutdown_verb) {
7eb35049 2488 r = become_shutdown(shutdown_verb, retval);
ad929bcc 2489
4a36297c 2490 log_error_errno(r, "Failed to execute shutdown binary, %s: %m", getpid_cached() == 1 ? "freezing" : "quitting");
9b9881d7 2491 error_message = "Failed to execute shutdown binary";
b9080b03
FF
2492 }
2493
8a2c1fbf
EJ
2494 watchdog_free_device();
2495 arg_watchdog_device = mfree(arg_watchdog_device);
2496
df0ff127 2497 if (getpid_cached() == 1) {
cb6531be
ZJS
2498 if (error_message)
2499 manager_status_printf(NULL, STATUS_TYPE_EMERGENCY,
1fc464f6 2500 ANSI_HIGHLIGHT_RED "!!!!!!" ANSI_NORMAL,
cb6531be 2501 "%s, freezing.", error_message);
b9e74c39 2502 freeze_or_reboot();
cb6531be 2503 }
c3b3c274 2504
60918275
LP
2505 return retval;
2506}