]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/main.c
main: invoke pager_open() only at one place
[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;
4dc63c4b 1416 const char *t;
32391275
FB
1417 int r;
1418
84af7821
LP
1419 /* We expect the environment to be set correctly
1420 * if run inside a container. */
1421 if (detect_container() > 0)
1422 return 0;
1423
32391275
FB
1424 /* When started as PID1, the kernel uses /dev/console
1425 * for our stdios and uses TERM=linux whatever the
1426 * backend device used by the console. We try to make
1427 * a better guess here since some consoles might not
1428 * have support for color mode for example.
1429 *
1430 * However if TERM was configured through the kernel
1431 * command line then leave it alone. */
1432
1d84ad94 1433 r = proc_cmdline_get_key("TERM", 0, &term);
32391275
FB
1434 if (r < 0)
1435 return r;
32391275 1436
4dc63c4b
LP
1437 t = term ?: default_term_for_tty("/dev/console");
1438
1439 if (setenv("TERM", t, 1) < 0)
32391275
FB
1440 return -errno;
1441
1442 return 0;
1443}
1444
6808a0bc
LP
1445static void redirect_telinit(int argc, char *argv[]) {
1446
1447 /* This is compatibility support for SysV, where calling init as a user is identical to telinit. */
1448
1449#if HAVE_SYSV_COMPAT
1450 if (getpid_cached() == 1)
1451 return;
1452
1453 if (!strstr(program_invocation_short_name, "init"))
1454 return;
1455
1456 execv(SYSTEMCTL_BINARY_PATH, argv);
1457 log_error_errno(errno, "Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
1458 exit(1);
1459#endif
1460}
1461
4a36297c
LP
1462static int become_shutdown(
1463 const char *shutdown_verb,
7eb35049 1464 int retval) {
4a36297c
LP
1465
1466 char log_level[DECIMAL_STR_MAX(int) + 1],
1467 exit_code[DECIMAL_STR_MAX(uint8_t) + 1];
1468
1469 const char* command_line[11] = {
1470 SYSTEMD_SHUTDOWN_BINARY_PATH,
1471 shutdown_verb,
1472 "--log-level", log_level,
1473 "--log-target",
1474 };
1475
1476 _cleanup_strv_free_ char **env_block = NULL;
1477 size_t pos = 5;
1478 int r;
1479
7eb35049 1480 assert(shutdown_verb);
234519ae 1481 assert(!command_line[pos]);
4a36297c
LP
1482 env_block = strv_copy(environ);
1483
1484 xsprintf(log_level, "%d", log_get_max_level());
1485
1486 switch (log_get_target()) {
1487
1488 case LOG_TARGET_KMSG:
1489 case LOG_TARGET_JOURNAL_OR_KMSG:
1490 case LOG_TARGET_SYSLOG_OR_KMSG:
1491 command_line[pos++] = "kmsg";
1492 break;
1493
1494 case LOG_TARGET_NULL:
1495 command_line[pos++] = "null";
1496 break;
1497
1498 case LOG_TARGET_CONSOLE:
1499 default:
1500 command_line[pos++] = "console";
1501 break;
1502 };
1503
1504 if (log_get_show_color())
1505 command_line[pos++] = "--log-color";
1506
1507 if (log_get_show_location())
1508 command_line[pos++] = "--log-location";
1509
1510 if (streq(shutdown_verb, "exit")) {
1511 command_line[pos++] = "--exit-code";
1512 command_line[pos++] = exit_code;
1513 xsprintf(exit_code, "%d", retval);
1514 }
1515
1516 assert(pos < ELEMENTSOF(command_line));
1517
7eb35049
LP
1518 if (streq(shutdown_verb, "reboot") &&
1519 arg_shutdown_watchdog > 0 &&
1520 arg_shutdown_watchdog != USEC_INFINITY) {
1521
4a36297c
LP
1522 char *e;
1523
1524 /* If we reboot let's set the shutdown
1525 * watchdog and tell the shutdown binary to
1526 * repeatedly ping it */
1527 r = watchdog_set_timeout(&arg_shutdown_watchdog);
1528 watchdog_close(r < 0);
1529
1530 /* Tell the binary how often to ping, ignore failure */
1531 if (asprintf(&e, "WATCHDOG_USEC="USEC_FMT, arg_shutdown_watchdog) > 0)
8a2c1fbf
EJ
1532 (void) strv_consume(&env_block, e);
1533
1534 if (arg_watchdog_device &&
1535 asprintf(&e, "WATCHDOG_DEVICE=%s", arg_watchdog_device) > 0)
1536 (void) strv_consume(&env_block, e);
4a36297c
LP
1537 } else
1538 watchdog_close(true);
1539
1540 /* Avoid the creation of new processes forked by the
1541 * kernel; at this point, we will not listen to the
1542 * signals anyway */
1543 if (detect_container() <= 0)
1544 (void) cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER);
1545
1546 execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
1547 return -errno;
1548}
1549
e839bafd
LP
1550static void initialize_clock(void) {
1551 int r;
1552
1553 if (clock_is_localtime(NULL) > 0) {
1554 int min;
1555
1556 /*
1557 * The very first call of settimeofday() also does a time warp in the kernel.
1558 *
1559 * In the rtc-in-local time mode, we set the kernel's timezone, and rely on external tools to take care
1560 * of maintaining the RTC and do all adjustments. This matches the behavior of Windows, which leaves
1561 * the RTC alone if the registry tells that the RTC runs in UTC.
1562 */
1563 r = clock_set_timezone(&min);
1564 if (r < 0)
1565 log_error_errno(r, "Failed to apply local time delta, ignoring: %m");
1566 else
1567 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
1568
1569 } else if (!in_initrd()) {
1570 /*
1571 * Do a dummy very first call to seal the kernel's time warp magic.
1572 *
1573 * Do not call this from inside the initrd. The initrd might not carry /etc/adjtime with LOCAL, but the
1574 * real system could be set up that way. In such case, we need to delay the time-warp or the sealing
1575 * until we reach the real system.
1576 *
1577 * Do no set the kernel's timezone. The concept of local time cannot be supported reliably, the time
1578 * will jump or be incorrect at every daylight saving time change. All kernel local time concepts will
1579 * be treated as UTC that way.
1580 */
1581 (void) clock_reset_timewarp();
1582 }
1583
1584 r = clock_apply_epoch();
1585 if (r < 0)
1586 log_error_errno(r, "Current system time is before build time, but cannot correct: %m");
1587 else if (r > 0)
1588 log_info("System time before build time, advancing clock.");
1589}
1590
1e41242e
LP
1591static void initialize_coredump(bool skip_setup) {
1592
1593 if (getpid_cached() != 1)
1594 return;
1595
1596 /* Don't limit the core dump size, so that coredump handlers such as systemd-coredump (which honour the limit)
1597 * will process core dumps for system services by default. */
1598 if (setrlimit(RLIMIT_CORE, &RLIMIT_MAKE_CONST(RLIM_INFINITY)) < 0)
1599 log_warning_errno(errno, "Failed to set RLIMIT_CORE: %m");
1600
1601 /* But at the same time, turn off the core_pattern logic by default, so that no coredumps are stored
1602 * until the systemd-coredump tool is enabled via sysctl. */
1603 if (!skip_setup)
1604 (void) write_string_file("/proc/sys/kernel/core_pattern", "|/bin/false", 0);
1605}
1606
3c7878f9
LP
1607static void do_reexecute(
1608 int argc,
1609 char *argv[],
1610 const struct rlimit *saved_rlimit_nofile,
1611 const struct rlimit *saved_rlimit_memlock,
1612 FDSet *fds,
1613 const char *switch_root_dir,
1614 const char *switch_root_init,
1615 const char **ret_error_message) {
1616
1617 unsigned i, j, args_size;
1618 const char **args;
1619 int r;
1620
1621 assert(saved_rlimit_nofile);
1622 assert(saved_rlimit_memlock);
1623 assert(ret_error_message);
1624
1625 /* Close and disarm the watchdog, so that the new instance can reinitialize it, but doesn't get rebooted while
1626 * we do that */
1627 watchdog_close(true);
1628
1629 /* Reset the RLIMIT_NOFILE to the kernel default, so that the new systemd can pass the kernel default to its
1630 * child processes */
1631
1632 if (saved_rlimit_nofile->rlim_cur > 0)
1633 (void) setrlimit(RLIMIT_NOFILE, saved_rlimit_nofile);
1634 if (saved_rlimit_memlock->rlim_cur != (rlim_t) -1)
1635 (void) setrlimit(RLIMIT_MEMLOCK, saved_rlimit_memlock);
1636
1637 if (switch_root_dir) {
1638 /* Kill all remaining processes from the initrd, but don't wait for them, so that we can handle the
1639 * SIGCHLD for them after deserializing. */
1640 broadcast_signal(SIGTERM, false, true);
1641
1642 /* And switch root with MS_MOVE, because we remove the old directory afterwards and detach it. */
1643 r = switch_root(switch_root_dir, "/mnt", true, MS_MOVE);
1644 if (r < 0)
1645 log_error_errno(r, "Failed to switch root, trying to continue: %m");
1646 }
1647
1648 args_size = MAX(6, argc+1);
1649 args = newa(const char*, args_size);
1650
1651 if (!switch_root_init) {
1652 char sfd[DECIMAL_STR_MAX(int) + 1];
1653
1654 /* First try to spawn ourselves with the right path, and with full serialization. We do this only if
1655 * the user didn't specify an explicit init to spawn. */
1656
1657 assert(arg_serialization);
1658 assert(fds);
1659
1660 xsprintf(sfd, "%i", fileno(arg_serialization));
1661
1662 i = 0;
1663 args[i++] = SYSTEMD_BINARY_PATH;
1664 if (switch_root_dir)
1665 args[i++] = "--switched-root";
1666 args[i++] = arg_system ? "--system" : "--user";
1667 args[i++] = "--deserialize";
1668 args[i++] = sfd;
1669 args[i++] = NULL;
1670
1671 assert(i <= args_size);
1672
1673 /*
1674 * We want valgrind to print its memory usage summary before reexecution. Valgrind won't do this is on
1675 * its own on exec(), but it will do it on exit(). Hence, to ensure we get a summary here, fork() off
1676 * a child, let it exit() cleanly, so that it prints the summary, and wait() for it in the parent,
1677 * before proceeding into the exec().
1678 */
1679 valgrind_summary_hack();
1680
1681 (void) execv(args[0], (char* const*) args);
1682 log_debug_errno(errno, "Failed to execute our own binary, trying fallback: %m");
1683 }
1684
1685 /* Try the fallback, if there is any, without any serialization. We pass the original argv[] and envp[]. (Well,
1686 * modulo the ordering changes due to getopt() in argv[], and some cleanups in envp[], but let's hope that
1687 * doesn't matter.) */
1688
1689 arg_serialization = safe_fclose(arg_serialization);
1690 fds = fdset_free(fds);
1691
1692 /* Reopen the console */
1693 (void) make_console_stdio();
1694
1695 for (j = 1, i = 1; j < (unsigned) argc; j++)
1696 args[i++] = argv[j];
1697 args[i++] = NULL;
1698 assert(i <= args_size);
1699
1700 /* Reenable any blocked signals, especially important if we switch from initial ramdisk to init=... */
1701 (void) reset_all_signal_handlers();
1702 (void) reset_signal_mask();
1703
1704 if (switch_root_init) {
1705 args[0] = switch_root_init;
1706 (void) execv(args[0], (char* const*) args);
1707 log_warning_errno(errno, "Failed to execute configured init, trying fallback: %m");
1708 }
1709
1710 args[0] = "/sbin/init";
1711 (void) execv(args[0], (char* const*) args);
1712 r = -errno;
1713
1714 manager_status_printf(NULL, STATUS_TYPE_EMERGENCY,
1715 ANSI_HIGHLIGHT_RED " !! " ANSI_NORMAL,
1716 "Failed to execute /sbin/init");
1717
1718 if (r == -ENOENT) {
1719 log_warning("No /sbin/init, trying fallback");
1720
1721 args[0] = "/bin/sh";
1722 args[1] = NULL;
1723 (void) execv(args[0], (char* const*) args);
1724 log_error_errno(errno, "Failed to execute /bin/sh, giving up: %m");
1725 } else
1726 log_warning_errno(r, "Failed to execute /sbin/init, giving up: %m");
1727
1728 *ret_error_message = "Failed to execute fallback shell";
1729}
1730
7eb35049
LP
1731static int invoke_main_loop(
1732 Manager *m,
1733 bool *ret_reexecute,
1734 int *ret_retval, /* Return parameters relevant for shutting down */
1735 const char **ret_shutdown_verb, /* … */
1736 FDSet **ret_fds, /* Return parameters for reexecuting */
1737 char **ret_switch_root_dir, /* … */
1738 char **ret_switch_root_init, /* … */
1739 const char **ret_error_message) {
1740
1741 int r;
1742
1743 assert(m);
1744 assert(ret_reexecute);
1745 assert(ret_retval);
1746 assert(ret_shutdown_verb);
1747 assert(ret_fds);
1748 assert(ret_switch_root_dir);
1749 assert(ret_switch_root_init);
1750 assert(ret_error_message);
1751
1752 for (;;) {
1753 r = manager_loop(m);
1754 if (r < 0) {
1755 *ret_error_message = "Failed to run main loop";
1756 return log_emergency_errno(r, "Failed to run main loop: %m");
1757 }
1758
1759 switch (m->exit_code) {
1760
1761 case MANAGER_RELOAD:
1762 log_info("Reloading.");
1763
1764 r = parse_config_file();
1765 if (r < 0)
1766 log_warning_errno(r, "Failed to parse config file, ignoring: %m");
1767
1768 set_manager_defaults(m);
1769
1770 r = manager_reload(m);
1771 if (r < 0)
1772 log_warning_errno(r, "Failed to reload, ignoring: %m");
1773
1774 break;
1775
1776 case MANAGER_REEXECUTE:
1777
1778 r = prepare_reexecute(m, &arg_serialization, ret_fds, false);
1779 if (r < 0) {
1780 *ret_error_message = "Failed to prepare for reexecution";
1781 return r;
1782 }
1783
1784 log_notice("Reexecuting.");
1785
1786 *ret_reexecute = true;
1787 *ret_retval = EXIT_SUCCESS;
1788 *ret_shutdown_verb = NULL;
1789 *ret_switch_root_dir = *ret_switch_root_init = NULL;
1790
1791 return 0;
1792
1793 case MANAGER_SWITCH_ROOT:
1794 if (!m->switch_root_init) {
1795 r = prepare_reexecute(m, &arg_serialization, ret_fds, true);
1796 if (r < 0) {
1797 *ret_error_message = "Failed to prepare for reexecution";
1798 return r;
1799 }
1800 } else
1801 *ret_fds = NULL;
1802
1803 log_notice("Switching root.");
1804
1805 *ret_reexecute = true;
1806 *ret_retval = EXIT_SUCCESS;
1807 *ret_shutdown_verb = NULL;
1808
1809 /* Steal the switch root parameters */
1810 *ret_switch_root_dir = m->switch_root;
1811 *ret_switch_root_init = m->switch_root_init;
1812 m->switch_root = m->switch_root_init = NULL;
1813
1814 return 0;
1815
1816 case MANAGER_EXIT:
1817
1818 if (MANAGER_IS_USER(m)) {
1819 log_debug("Exit.");
1820
1821 *ret_reexecute = false;
1822 *ret_retval = m->return_value;
1823 *ret_shutdown_verb = NULL;
1824 *ret_fds = NULL;
1825 *ret_switch_root_dir = *ret_switch_root_init = NULL;
1826
1827 return 0;
1828 }
1829
1830 _fallthrough_;
1831 case MANAGER_REBOOT:
1832 case MANAGER_POWEROFF:
1833 case MANAGER_HALT:
1834 case MANAGER_KEXEC: {
1835 static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
1836 [MANAGER_EXIT] = "exit",
1837 [MANAGER_REBOOT] = "reboot",
1838 [MANAGER_POWEROFF] = "poweroff",
1839 [MANAGER_HALT] = "halt",
1840 [MANAGER_KEXEC] = "kexec"
1841 };
1842
1843 log_notice("Shutting down.");
1844
1845 *ret_reexecute = false;
1846 *ret_retval = m->return_value;
1847 assert_se(*ret_shutdown_verb = table[m->exit_code]);
1848 *ret_fds = NULL;
1849 *ret_switch_root_dir = *ret_switch_root_init = NULL;
1850
1851 return 0;
1852 }
1853
1854 default:
1855 assert_not_reached("Unknown exit code.");
1856 }
1857 }
1858}
1859
31aef7ff
LP
1860static void log_execution_mode(bool *ret_first_boot) {
1861 assert(ret_first_boot);
1862
1863 if (arg_system) {
1864 int v;
1865
1866 log_info(PACKAGE_STRING " running in %ssystem mode. (" SYSTEMD_FEATURES ")",
1867 arg_action == ACTION_TEST ? "test " : "" );
1868
1869 v = detect_virtualization();
1870 if (v > 0)
1871 log_info("Detected virtualization %s.", virtualization_to_string(v));
1872
1873 log_info("Detected architecture %s.", architecture_to_string(uname_architecture()));
1874
1875 if (in_initrd()) {
1876 *ret_first_boot = false;
1877 log_info("Running in initial RAM disk.");
1878 } else {
1879 /* Let's check whether we are in first boot, i.e. whether /etc is still unpopulated. We use
1880 * /etc/machine-id as flag file, for this: if it exists we assume /etc is populated, if it
1881 * doesn't it's unpopulated. This allows container managers and installers to provision a
1882 * couple of files already. If the container manager wants to provision the machine ID itself
1883 * it should pass $container_uuid to PID 1. */
1884
1885 *ret_first_boot = access("/etc/machine-id", F_OK) < 0;
1886 if (*ret_first_boot)
1887 log_info("Running with unpopulated /etc.");
1888 }
1889 } else {
1890 _cleanup_free_ char *t;
1891
1892 t = uid_to_name(getuid());
1893 log_debug(PACKAGE_STRING " running in %suser mode for user " UID_FMT "/%s. (" SYSTEMD_FEATURES ")",
1894 arg_action == ACTION_TEST ? " test" : "", getuid(), strna(t));
1895
1896 *ret_first_boot = false;
1897 }
1898}
1899
5afbaa36
LP
1900static int initialize_runtime(
1901 bool skip_setup,
1902 struct rlimit *saved_rlimit_nofile,
1903 struct rlimit *saved_rlimit_memlock,
1904 const char **ret_error_message) {
1905
1906 int r;
1907
1908 assert(ret_error_message);
1909
1910 /* Sets up various runtime parameters. Many of these initializations are conditionalized:
1911 *
1912 * - Some only apply to --system instances
1913 * - Some only apply to --user instances
1914 * - Some only apply when we first start up, but not when we reexecute
1915 */
1916
1917 if (arg_system && !skip_setup) {
1918 if (arg_show_status > 0)
1919 status_welcome();
1920
1921 hostname_setup();
1922 machine_id_setup(NULL, arg_machine_id, NULL);
1923 loopback_setup();
1924 bump_unix_max_dgram_qlen();
5afbaa36 1925 test_usr();
6c78f016 1926 write_container_id();
5afbaa36
LP
1927 }
1928
8a2c1fbf
EJ
1929 if (arg_system && arg_watchdog_device) {
1930 r = watchdog_set_device(arg_watchdog_device);
1931 if (r < 0)
1932 log_warning_errno(r, "Failed to set watchdog device to %s, ignoring: %m",
1933 arg_watchdog_device);
1934 }
1935
5afbaa36
LP
1936 if (arg_system && arg_runtime_watchdog > 0 && arg_runtime_watchdog != USEC_INFINITY)
1937 watchdog_set_timeout(&arg_runtime_watchdog);
1938
1939 if (arg_timer_slack_nsec != NSEC_INFINITY)
1940 if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
1941 log_error_errno(errno, "Failed to adjust timer slack: %m");
1942
1943 if (arg_system && !cap_test_all(arg_capability_bounding_set)) {
1944 r = capability_bounding_set_drop_usermode(arg_capability_bounding_set);
1945 if (r < 0) {
1946 *ret_error_message = "Failed to drop capability bounding set of usermode helpers";
1947 return log_emergency_errno(r, "Failed to drop capability bounding set of usermode helpers: %m");
1948 }
1949
1950 r = capability_bounding_set_drop(arg_capability_bounding_set, true);
1951 if (r < 0) {
1952 *ret_error_message = "Failed to drop capability bounding set";
1953 return log_emergency_errno(r, "Failed to drop capability bounding set: %m");
1954 }
1955 }
1956
1957 if (arg_syscall_archs) {
1958 r = enforce_syscall_archs(arg_syscall_archs);
1959 if (r < 0) {
1960 *ret_error_message = "Failed to set syscall architectures";
1961 return r;
1962 }
1963 }
1964
1965 if (!arg_system)
1966 /* Become reaper of our children */
1967 if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0)
1968 log_warning_errno(errno, "Failed to make us a subreaper: %m");
1969
1970 if (arg_system) {
1971 /* Bump up RLIMIT_NOFILE for systemd itself */
1972 (void) bump_rlimit_nofile(saved_rlimit_nofile);
1973 (void) bump_rlimit_memlock(saved_rlimit_memlock);
1974 }
1975
1976 return 0;
1977}
1978
6acca5fc
LP
1979static int do_queue_default_job(
1980 Manager *m,
1981 const char **ret_error_message) {
1982
1983 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
1984 Job *default_unit_job;
1985 Unit *target = NULL;
1986 int r;
1987
1988 log_debug("Activating default unit: %s", arg_default_unit);
1989
1990 r = manager_load_unit(m, arg_default_unit, NULL, &error, &target);
1991 if (r < 0)
1992 log_error("Failed to load default target: %s", bus_error_message(&error, r));
1993 else if (IN_SET(target->load_state, UNIT_ERROR, UNIT_NOT_FOUND))
1994 log_error_errno(target->load_error, "Failed to load default target: %m");
1995 else if (target->load_state == UNIT_MASKED)
1996 log_error("Default target masked.");
1997
1998 if (!target || target->load_state != UNIT_LOADED) {
1999 log_info("Trying to load rescue target...");
2000
2001 r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target);
2002 if (r < 0) {
2003 *ret_error_message = "Failed to load rescue target";
2004 return log_emergency_errno(r, "Failed to load rescue target: %s", bus_error_message(&error, r));
2005 } else if (IN_SET(target->load_state, UNIT_ERROR, UNIT_NOT_FOUND)) {
2006 *ret_error_message = "Failed to load rescue target";
2007 return log_emergency_errno(target->load_error, "Failed to load rescue target: %m");
2008 } else if (target->load_state == UNIT_MASKED) {
2009 *ret_error_message = "Rescue target masked";
2010 log_emergency("Rescue target masked.");
2011 return -ERFKILL;
2012 }
2013 }
2014
2015 assert(target->load_state == UNIT_LOADED);
2016
2017 r = manager_add_job(m, JOB_START, target, JOB_ISOLATE, &error, &default_unit_job);
2018 if (r == -EPERM) {
2019 log_debug_errno(r, "Default target could not be isolated, starting instead: %s", bus_error_message(&error, r));
2020
2021 sd_bus_error_free(&error);
2022
2023 r = manager_add_job(m, JOB_START, target, JOB_REPLACE, &error, &default_unit_job);
2024 if (r < 0) {
2025 *ret_error_message = "Failed to start default target";
2026 return log_emergency_errno(r, "Failed to start default target: %s", bus_error_message(&error, r));
2027 }
2028
2029 } else if (r < 0) {
2030 *ret_error_message = "Failed to isolate default target";
2031 return log_emergency_errno(r, "Failed to isolate default target: %s", bus_error_message(&error, r));
2032 }
2033
2034 m->default_unit_job_id = default_unit_job->id;
2035
2036 return 0;
2037}
2038
970777b5
LP
2039static void free_arguments(void) {
2040 size_t j;
2041
2042 /* Frees all arg_* variables, with the exception of arg_serialization */
2043
2044 for (j = 0; j < ELEMENTSOF(arg_default_rlimit); j++)
2045 arg_default_rlimit[j] = mfree(arg_default_rlimit[j]);
2046
2047 arg_default_unit = mfree(arg_default_unit);
2048 arg_confirm_spawn = mfree(arg_confirm_spawn);
2049 arg_join_controllers = strv_free_free(arg_join_controllers);
2050 arg_default_environment = strv_free(arg_default_environment);
2051 arg_syscall_archs = set_free(arg_syscall_archs);
2052}
2053
97d1fb94
LP
2054static int load_configuration(int argc, char **argv, const char **ret_error_message) {
2055 int r;
2056
2057 assert(ret_error_message);
2058
2059 arg_default_tasks_max = system_tasks_max_scale(DEFAULT_TASKS_MAX_PERCENTAGE, 100U);
2060
2061 r = parse_config_file();
2062 if (r < 0) {
2063 *ret_error_message = "Failed to parse config file";
2064 return r;
2065 }
2066
2067 if (arg_system) {
2068 r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
2069 if (r < 0)
2070 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
2071 }
2072
2073 /* Note that this also parses bits from the kernel command line, including "debug". */
2074 log_parse_environment();
2075
2076 r = parse_argv(argc, argv);
2077 if (r < 0) {
2078 *ret_error_message = "Failed to parse commandline arguments";
2079 return r;
2080 }
2081
2082 /* Initialize default unit */
2083 if (!arg_default_unit) {
2084 arg_default_unit = strdup(SPECIAL_DEFAULT_TARGET);
2085 if (!arg_default_unit) {
2086 *ret_error_message = "Failed to set default unit";
2087 return log_oom();
2088 }
2089 }
2090
2091 return 0;
2092}
2093
b0d7c989
LP
2094static int safety_checks(void) {
2095
2096 if (arg_action == ACTION_TEST &&
2097 geteuid() == 0) {
2098 log_error("Don't run test mode as root.");
2099 return -EPERM;
2100 }
2101
2102 if (!arg_system &&
2103 arg_action == ACTION_RUN &&
2104 sd_booted() <= 0) {
2105 log_error("Trying to run as user instance, but the system has not been booted with systemd.");
2106 return -EOPNOTSUPP;
2107 }
2108
2109 if (!arg_system &&
2110 arg_action == ACTION_RUN &&
2111 !getenv("XDG_RUNTIME_DIR")) {
2112 log_error("Trying to run as user instance, but $XDG_RUNTIME_DIR is not set.");
2113 return -EUNATCH;
2114 }
2115
2116 if (arg_system &&
2117 arg_action == ACTION_RUN &&
2118 running_in_chroot() > 0) {
2119 log_error("Cannot be run in a chroot() environment.");
2120 return -EOPNOTSUPP;
2121 }
2122
2123 return 0;
2124}
2125
60918275
LP
2126int main(int argc, char *argv[]) {
2127 Manager *m = NULL;
22f4096c 2128 int r, retval = EXIT_FAILURE;
9d76d730
LP
2129 usec_t before_startup, after_startup;
2130 char timespan[FORMAT_TIMESPAN_MAX];
a16e1123
LP
2131 FDSet *fds = NULL;
2132 bool reexecute = false;
b9080b03 2133 const char *shutdown_verb = NULL;
86caf095
LP
2134 dual_timestamp initrd_timestamp = DUAL_TIMESTAMP_NULL;
2135 dual_timestamp userspace_timestamp = DUAL_TIMESTAMP_NULL;
2136 dual_timestamp kernel_timestamp = DUAL_TIMESTAMP_NULL;
2137 dual_timestamp security_start_timestamp = DUAL_TIMESTAMP_NULL;
2138 dual_timestamp security_finish_timestamp = DUAL_TIMESTAMP_NULL;
5d6b1584 2139 static char systemd[] = "systemd";
2660882b 2140 bool skip_setup = false;
0b3325e7 2141 bool loaded_policy = false;
bf4df7c3 2142 bool queue_default_job = false;
fd130612 2143 bool first_boot = false;
41669317 2144 char *switch_root_dir = NULL, *switch_root_init = NULL;
fb3ae275 2145 struct rlimit saved_rlimit_nofile = RLIMIT_MAKE_CONST(0), saved_rlimit_memlock = RLIMIT_MAKE_CONST((rlim_t) -1);
cb6531be 2146 const char *error_message = NULL;
27b14a22 2147
6808a0bc 2148 redirect_telinit(argc, argv);
2cb1a60d 2149
c3a170f3
HH
2150 dual_timestamp_from_monotonic(&kernel_timestamp, 0);
2151 dual_timestamp_get(&userspace_timestamp);
2152
0b3325e7
LP
2153 /* Determine if this is a reexecution or normal bootup. We do
2154 * the full command line parsing much later, so let's just
2155 * have a quick peek here. */
db813c2a
LP
2156 if (strv_find(argv+1, "--deserialize"))
2157 skip_setup = true;
0b3325e7 2158
2660882b
LP
2159 /* If we have switched root, do all the special setup
2160 * things */
db813c2a
LP
2161 if (strv_find(argv+1, "--switched-root"))
2162 skip_setup = false;
d03bc1b8 2163
f3b6a3ed
LP
2164 /* If we get started via the /sbin/init symlink then we are
2165 called 'init'. After a subsequent reexecution we are then
2166 called 'systemd'. That is confusing, hence let's call us
2167 systemd right-away. */
f3b6a3ed 2168 program_invocation_short_name = systemd;
eee8b7ab 2169 (void) prctl(PR_SET_NAME, systemd);
5d6b1584 2170
9a0e6896
LP
2171 saved_argv = argv;
2172 saved_argc = argc;
f3b6a3ed 2173
c1dc6153 2174 log_set_upgrade_syslog_to_journal(true);
bbe63281 2175
df0ff127 2176 if (getpid_cached() == 1) {
48a601fe 2177 /* Disable the umask logic */
90dc8c2e
MG
2178 umask(0);
2179
48a601fe
LP
2180 /* Always reopen /dev/console when running as PID 1 or one of its pre-execve() children. This is
2181 * important so that we never end up logging to any foreign stderr, for example if we have to log in a
2182 * child process right before execve()'ing the actual binary, at a point in time where socket
2183 * activation stderr/stdout area already set up. */
2184 log_set_always_reopen_console(true);
2185 }
2186
df0ff127 2187 if (getpid_cached() == 1 && detect_container() <= 0) {
4f8d551f 2188
a866073d 2189 /* Running outside of a container as PID 1 */
463d0d15 2190 arg_system = true;
a866073d
LP
2191 log_set_target(LOG_TARGET_KMSG);
2192 log_open();
2193
21bf2ab0 2194 if (in_initrd())
c3a170f3 2195 initrd_timestamp = userspace_timestamp;
c3ba6250 2196
2660882b 2197 if (!skip_setup) {
d723cd65
AK
2198 r = mount_setup_early();
2199 if (r < 0) {
eee8b7ab 2200 error_message = "Failed to mount early API filesystems";
d723cd65
AK
2201 goto finish;
2202 }
eee8b7ab 2203
c2e0d600 2204 dual_timestamp_get(&security_start_timestamp);
cb6531be
ZJS
2205 if (mac_selinux_setup(&loaded_policy) < 0) {
2206 error_message = "Failed to load SELinux policy";
0b3325e7 2207 goto finish;
cb6531be
ZJS
2208 } else if (mac_smack_setup(&loaded_policy) < 0) {
2209 error_message = "Failed to load SMACK policy";
ffbd2c4d 2210 goto finish;
96694e99
IP
2211 } else if (ima_setup() < 0) {
2212 error_message = "Failed to load IMA policy";
2213 goto finish;
cb6531be 2214 }
c2e0d600 2215 dual_timestamp_get(&security_finish_timestamp);
81611586 2216 }
0b3325e7 2217
c3dacc8b 2218 if (mac_selinux_init() < 0) {
cb6531be 2219 error_message = "Failed to initialize SELinux policy";
0ff4cdd9 2220 goto finish;
cb6531be 2221 }
7948c4df 2222
e839bafd
LP
2223 if (!skip_setup)
2224 initialize_clock();
a866073d
LP
2225
2226 /* Set the default for later on, but don't actually
2227 * open the logs like this for now. Note that if we
2228 * are transitioning from the initrd there might still
2229 * be journal fd open, and we shouldn't attempt
2230 * opening that before we parsed /proc/cmdline which
2231 * might redirect output elsewhere. */
2232 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
2233
df0ff127 2234 } else if (getpid_cached() == 1) {
a866073d 2235 /* Running inside a container, as PID 1 */
463d0d15 2236 arg_system = true;
a866073d 2237 log_set_target(LOG_TARGET_CONSOLE);
99f09825 2238 log_close_console(); /* force reopen of /dev/console */
a866073d
LP
2239 log_open();
2240
eee8b7ab 2241 /* For later on, see above... */
a866073d
LP
2242 log_set_target(LOG_TARGET_JOURNAL);
2243
c3a170f3
HH
2244 /* clear the kernel timestamp,
2245 * because we are in a container */
0f5f63c3 2246 kernel_timestamp = DUAL_TIMESTAMP_NULL;
c3a170f3 2247 } else {
a866073d 2248 /* Running as user instance */
463d0d15 2249 arg_system = false;
eeecf6e6 2250 log_set_target(LOG_TARGET_AUTO);
871e5809 2251 log_open();
c3a170f3
HH
2252
2253 /* clear the kernel timestamp,
2254 * because we are not PID 1 */
6513d561 2255 kernel_timestamp = DUAL_TIMESTAMP_NULL;
bbe63281 2256 }
a5dab5ce 2257
1e41242e 2258 initialize_coredump(skip_setup);
15a90032 2259
6edefe0b 2260 if (arg_system) {
84af7821
LP
2261 if (fixup_environment() < 0) {
2262 error_message = "Failed to fix up PID1 environment";
2263 goto finish;
2264 }
32391275 2265
3a18b604
FB
2266 /* Try to figure out if we can use colors with the console. No
2267 * need to do that for user instances since they never log
2268 * into the console. */
2269 log_show_color(colors_enabled());
c76cf844
AK
2270 r = make_null_stdio();
2271 if (r < 0)
2272 log_warning_errno(r, "Failed to redirect standard streams to /dev/null: %m");
3a18b604
FB
2273 }
2274
a07fdfa3 2275 r = initialize_join_controllers();
cb6531be 2276 if (r < 0) {
ff9b60f3 2277 error_message = "Failed to initialize cgroup controllers";
0c85a4f3 2278 goto finish;
cb6531be 2279 }
0c85a4f3 2280
f170852a
LP
2281 /* Mount /proc, /sys and friends, so that /proc/cmdline and
2282 * /proc/$PID/fd is available. */
df0ff127 2283 if (getpid_cached() == 1) {
f84f9974 2284
a132bef0 2285 /* Load the kernel modules early. */
2e75e2a8
DM
2286 if (!skip_setup)
2287 kmod_setup();
2e75e2a8 2288
0c85a4f3 2289 r = mount_setup(loaded_policy);
cb6531be
ZJS
2290 if (r < 0) {
2291 error_message = "Failed to mount API filesystems";
8efe3c01 2292 goto finish;
cb6531be 2293 }
0c85a4f3 2294 }
4ade7963
LP
2295
2296 /* Reset all signal handlers. */
ce30c8dc
LP
2297 (void) reset_all_signal_handlers();
2298 (void) ignore_signals(SIGNALS_IGNORE, -1);
078e4539 2299
97d1fb94
LP
2300 r = load_configuration(argc, argv, &error_message);
2301 if (r < 0)
f170852a 2302 goto finish;
10c961b9 2303
b0d7c989
LP
2304 r = safety_checks();
2305 if (r < 0)
fe783b03 2306 goto finish;
fe783b03 2307
5625c18a 2308 if (IN_SET(arg_action, ACTION_TEST, ACTION_HELP, ACTION_DUMP_CONFIGURATION_ITEMS))
ea4b98e6 2309 pager_open(arg_no_pager, false);
b0d7c989
LP
2310
2311 if (arg_action != ACTION_RUN)
74e7579c 2312 skip_setup = true;
b87c2aa6 2313
fa0f4d8a 2314 if (arg_action == ACTION_HELP) {
f170852a
LP
2315 retval = help();
2316 goto finish;
9ba0bc4e
ZJS
2317 } else if (arg_action == ACTION_VERSION) {
2318 retval = version();
2319 goto finish;
fa0f4d8a 2320 } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
e537352b 2321 unit_dump_config_items(stdout);
22f4096c 2322 retval = EXIT_SUCCESS;
e537352b 2323 goto finish;
f170852a
LP
2324 }
2325
4c701096 2326 assert_se(IN_SET(arg_action, ACTION_RUN, ACTION_TEST));
f170852a 2327
871e5809
LP
2328 /* Close logging fds, in order not to confuse fdset below */
2329 log_close();
2330
a16e1123 2331 /* Remember open file descriptors for later deserialization */
dea374e8
LP
2332 if (arg_action == ACTION_RUN) {
2333 r = fdset_new_fill(&fds);
2334 if (r < 0) {
2335 log_emergency_errno(r, "Failed to allocate fd set: %m");
2336 error_message = "Failed to allocate fd set";
2337 goto finish;
2338 } else
2339 fdset_cloexec(fds, true);
a16e1123 2340
dea374e8
LP
2341 if (arg_serialization)
2342 assert_se(fdset_remove(fds, fileno(arg_serialization)) >= 0);
a16e1123 2343
dea374e8
LP
2344 if (arg_system)
2345 /* Become a session leader if we aren't one yet. */
2346 setsid();
2347 }
4ade7963 2348
befb5b6a 2349 /* Move out of the way, so that we won't block unmounts */
d250afe7 2350 assert_se(chdir("/") == 0);
befb5b6a 2351
2146621b
LP
2352 /* Reset the console, but only if this is really init and we
2353 * are freshly booted */
463d0d15 2354 if (arg_system && arg_action == ACTION_RUN) {
56d96fc0
LP
2355
2356 /* If we are init, we connect stdin/stdout/stderr to
2357 * /dev/null and make sure we don't have a controlling
2358 * tty. */
2359 release_terminal();
2360
df0ff127 2361 if (getpid_cached() == 1 && !skip_setup)
56d96fc0
LP
2362 console_setup();
2363 }
4ade7963 2364
18149b9f 2365 /* Open the logging devices, if possible and necessary */
843d2643 2366 log_open();
4ade7963 2367
b6e2f329
LP
2368 if (arg_show_status == _SHOW_STATUS_UNSET)
2369 arg_show_status = SHOW_STATUS_YES;
2370
5373d602
LP
2371 /* Make sure we leave a core dump without panicing the
2372 * kernel. */
df0ff127 2373 if (getpid_cached() == 1) {
4fc935ca 2374 install_crash_handler();
97c4f35c 2375
0c85a4f3
LP
2376 r = mount_cgroup_controllers(arg_join_controllers);
2377 if (r < 0)
2378 goto finish;
2379 }
2380
31aef7ff 2381 log_execution_mode(&first_boot);
a5dab5ce 2382
dea374e8 2383 if (arg_action == ACTION_RUN) {
5afbaa36
LP
2384 r = initialize_runtime(skip_setup,
2385 &saved_rlimit_nofile,
2386 &saved_rlimit_memlock,
2387 &error_message);
2388 if (r < 0)
2389 goto finish;
dea374e8 2390 }
4096d6f5 2391
e0a3da1f
ZJS
2392 r = manager_new(arg_system ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2393 arg_action == ACTION_TEST ? MANAGER_TEST_FULL : 0,
2394 &m);
e96d6be7 2395 if (r < 0) {
da927ba9 2396 log_emergency_errno(r, "Failed to allocate manager object: %m");
cb6531be 2397 error_message = "Failed to allocate manager object";
60918275
LP
2398 goto finish;
2399 }
2400
9f9f0342
LP
2401 m->timestamps[MANAGER_TIMESTAMP_KERNEL] = kernel_timestamp;
2402 m->timestamps[MANAGER_TIMESTAMP_INITRD] = initrd_timestamp;
2403 m->timestamps[MANAGER_TIMESTAMP_USERSPACE] = userspace_timestamp;
2404 m->timestamps[MANAGER_TIMESTAMP_SECURITY_START] = security_start_timestamp;
2405 m->timestamps[MANAGER_TIMESTAMP_SECURITY_FINISH] = security_finish_timestamp;
9e58ff9c 2406
85cb4151 2407 set_manager_defaults(m);
7b46fc6a 2408 set_manager_settings(m);
fd130612 2409 manager_set_first_boot(m, first_boot);
27d340c7 2410
bf4df7c3 2411 /* Remember whether we should queue the default job */
d3b1c508 2412 queue_default_job = !arg_serialization || arg_switched_root;
bf4df7c3 2413
9d76d730
LP
2414 before_startup = now(CLOCK_MONOTONIC);
2415
d3b1c508 2416 r = manager_startup(m, arg_serialization, fds);
58f88d92 2417 if (r < 0) {
da927ba9 2418 log_error_errno(r, "Failed to fully start up daemon: %m");
cefb3eda 2419 error_message = "Failed to start up manager";
58f88d92
ZJS
2420 goto finish;
2421 }
a16e1123 2422
6acca5fc 2423 /* This will close all file descriptors that were opened, but not claimed by any unit. */
2feceb5e 2424 fds = fdset_free(fds);
74ca738f 2425 arg_serialization = safe_fclose(arg_serialization);
bf4df7c3
LP
2426
2427 if (queue_default_job) {
6acca5fc 2428 r = do_queue_default_job(m, &error_message);
718db961 2429 if (r < 0)
37d88da7 2430 goto finish;
6acca5fc 2431 }
ab17a050 2432
6acca5fc 2433 after_startup = now(CLOCK_MONOTONIC);
60918275 2434
6acca5fc
LP
2435 log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG,
2436 "Loaded units and determined initial transaction in %s.",
2437 format_timespan(timespan, sizeof(timespan), after_startup - before_startup, 100 * USEC_PER_MSEC));
07672f49 2438
af6b0ecc
LP
2439 if (arg_system) {
2440 _cleanup_free_ char *taint;
2441
2442 taint = manager_taint_string(m);
2443 if (!isempty(taint))
b2e7486c
ZJS
2444 log_struct(LOG_NOTICE,
2445 LOG_MESSAGE("System is tainted: %s", taint),
2446 "TAINT=%s", taint,
2447 "MESSAGE_ID=" SD_MESSAGE_TAINTED_STR,
2448 NULL);
af6b0ecc
LP
2449 }
2450
6acca5fc
LP
2451 if (arg_action == ACTION_TEST) {
2452 printf("-> By units:\n");
2453 manager_dump_units(m, stdout, "\t");
2454
2455 printf("-> By jobs:\n");
2456 manager_dump_jobs(m, stdout, "\t");
2457 retval = EXIT_SUCCESS;
2458 goto finish;
e965d56d 2459 }
d46de8a1 2460
7eb35049
LP
2461 r = invoke_main_loop(m,
2462 &reexecute,
2463 &retval,
2464 &shutdown_verb,
2465 &fds,
2466 &switch_root_dir,
2467 &switch_root_init,
2468 &error_message);
f170852a 2469
60918275 2470finish:
b87c2aa6
ZJS
2471 pager_close();
2472
97792515 2473 if (m)
81f5fc2d 2474 arg_shutdown_watchdog = m->shutdown_watchdog;
fe382237 2475
06d8d842 2476 m = manager_free(m);
60918275 2477
970777b5 2478 free_arguments();
cc56fafe 2479 mac_selinux_finish();
b2bb3dbe 2480
3c7878f9
LP
2481 if (reexecute)
2482 do_reexecute(argc, argv,
2483 &saved_rlimit_nofile,
2484 &saved_rlimit_memlock,
2485 fds,
2486 switch_root_dir,
2487 switch_root_init,
2488 &error_message); /* This only returns if reexecution failed */
a16e1123 2489
74ca738f 2490 arg_serialization = safe_fclose(arg_serialization);
2feceb5e 2491 fds = fdset_free(fds);
a16e1123 2492
349cc4a5 2493#if HAVE_VALGRIND_VALGRIND_H
54b434b1
LP
2494 /* If we are PID 1 and running under valgrind, then let's exit
2495 * here explicitly. valgrind will only generate nice output on
2496 * exit(), not on exec(), hence let's do the former not the
2497 * latter here. */
8a2c1fbf
EJ
2498 if (getpid_cached() == 1 && RUNNING_ON_VALGRIND) {
2499 /* Cleanup watchdog_device strings for valgrind. We need them
2500 * in become_shutdown() so normally we cannot free them yet. */
2501 watchdog_free_device();
2502 arg_watchdog_device = mfree(arg_watchdog_device);
54b434b1 2503 return 0;
8a2c1fbf 2504 }
54b434b1
LP
2505#endif
2506
b9080b03 2507 if (shutdown_verb) {
7eb35049 2508 r = become_shutdown(shutdown_verb, retval);
ad929bcc 2509
4a36297c 2510 log_error_errno(r, "Failed to execute shutdown binary, %s: %m", getpid_cached() == 1 ? "freezing" : "quitting");
9b9881d7 2511 error_message = "Failed to execute shutdown binary";
b9080b03
FF
2512 }
2513
8a2c1fbf
EJ
2514 watchdog_free_device();
2515 arg_watchdog_device = mfree(arg_watchdog_device);
2516
df0ff127 2517 if (getpid_cached() == 1) {
cb6531be
ZJS
2518 if (error_message)
2519 manager_status_printf(NULL, STATUS_TYPE_EMERGENCY,
1fc464f6 2520 ANSI_HIGHLIGHT_RED "!!!!!!" ANSI_NORMAL,
cb6531be 2521 "%s, freezing.", error_message);
b9e74c39 2522 freeze_or_reboot();
cb6531be 2523 }
c3b3c274 2524
60918275
LP
2525 return retval;
2526}