]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/main.c
Merge pull request #2290 from vcaputo/normalize-log-source-priorities
[thirdparty/systemd.git] / src / core / main.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
60918275 22#include <errno.h>
3dfc9763 23#include <fcntl.h>
f170852a 24#include <getopt.h>
97c4f35c 25#include <signal.h>
3dfc9763
LP
26#include <stdio.h>
27#include <string.h>
664f88a7 28#include <sys/mount.h>
3dfc9763 29#include <sys/prctl.h>
b9e74c39 30#include <sys/reboot.h>
3dfc9763
LP
31#include <sys/stat.h>
32#include <unistd.h>
b64a3d86
LP
33#ifdef HAVE_SECCOMP
34#include <seccomp.h>
35#endif
3dfc9763
LP
36#ifdef HAVE_VALGRIND_VALGRIND_H
37#include <valgrind/valgrind.h>
38#endif
54b434b1 39
718db961 40#include "sd-bus.h"
cf0fbc49 41#include "sd-daemon.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"
54#include "env-util.h"
3ffd4af2 55#include "fd-util.h"
3dfc9763 56#include "fdset.h"
718db961 57#include "fileio.h"
24882e06 58#include "formats-util.h"
f4f15635 59#include "fs-util.h"
3dfc9763
LP
60#include "hostname-setup.h"
61#include "ima-setup.h"
62#include "killall.h"
63#include "kmod-setup.h"
d7b8eec7 64#include "load-fragment.h"
3dfc9763 65#include "log.h"
b6e66135 66#include "loopback-setup.h"
b6e66135 67#include "machine-id-setup.h"
3dfc9763
LP
68#include "manager.h"
69#include "missing.h"
70#include "mount-setup.h"
71#include "pager.h"
6bedfcbb 72#include "parse-util.h"
4e731273 73#include "proc-cmdline.h"
3dfc9763 74#include "process-util.h"
78f22b97 75#include "rlimit-util.h"
b6e66135 76#include "selinux-setup.h"
3dfc9763
LP
77#include "selinux-util.h"
78#include "signal-util.h"
ffbd2c4d 79#include "smack-setup.h"
3dfc9763 80#include "special.h"
8fcde012 81#include "stat-util.h"
15a5e950 82#include "stdio-util.h"
3dfc9763
LP
83#include "strv.h"
84#include "switch-root.h"
85#include "terminal-util.h"
b1d4f8e1 86#include "user-util.h"
3dfc9763
LP
87#include "virt.h"
88#include "watchdog.h"
b6e66135 89
f170852a
LP
90static enum {
91 ACTION_RUN,
e965d56d 92 ACTION_HELP,
9ba0bc4e 93 ACTION_VERSION,
e537352b 94 ACTION_TEST,
4288f619
LP
95 ACTION_DUMP_CONFIGURATION_ITEMS,
96 ACTION_DONE
fa0f4d8a 97} arg_action = ACTION_RUN;
fa0f4d8a 98static char *arg_default_unit = NULL;
b2c23da8 99static ManagerRunningAs arg_running_as = _MANAGER_RUNNING_AS_INVALID;
fa0f4d8a 100static bool arg_dump_core = true;
fa0f4d8a 101static int arg_crash_chvt = -1;
b9e74c39
LP
102static bool arg_crash_shell = false;
103static bool arg_crash_reboot = false;
fa0f4d8a 104static bool arg_confirm_spawn = false;
b6e2f329 105static ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
bf4df7c3 106static bool arg_switched_root = false;
b87c2aa6 107static int arg_no_pager = -1;
0c85a4f3 108static char ***arg_join_controllers = NULL;
706343f4 109static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
0a494f1f 110static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
1f19a534
OS
111static usec_t arg_default_restart_usec = DEFAULT_RESTART_USEC;
112static usec_t arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
113static usec_t arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
3f41e1e5
LN
114static usec_t arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
115static unsigned arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
e96d6be7
LP
116static usec_t arg_runtime_watchdog = 0;
117static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
97d0e5f8 118static char **arg_default_environment = NULL;
517d56b1 119static struct rlimit *arg_default_rlimit[_RLIMIT_MAX] = {};
ec8927ca 120static uint64_t arg_capability_bounding_set_drop = 0;
3a43da28 121static nsec_t arg_timer_slack_nsec = NSEC_INFINITY;
bd8f585b 122static usec_t arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
d3b1c508
LP
123static Set* arg_syscall_archs = NULL;
124static FILE* arg_serialization = NULL;
085afe36
LP
125static bool arg_default_cpu_accounting = false;
126static bool arg_default_blockio_accounting = false;
127static bool arg_default_memory_accounting = false;
9ded9cd1
LP
128static bool arg_default_tasks_accounting = true;
129static uint64_t arg_default_tasks_max = UINT64_C(512);
4fc935ca 130
b87c2aa6
ZJS
131static void pager_open_if_enabled(void) {
132
133 if (arg_no_pager <= 0)
134 return;
135
136 pager_open(false);
137}
138
b9e74c39
LP
139noreturn static void freeze_or_reboot(void) {
140
141 if (arg_crash_reboot) {
142 log_notice("Rebooting in 10s...");
143 (void) sleep(10);
144
145 log_notice("Rebooting now...");
146 (void) reboot(RB_AUTOBOOT);
147 log_emergency_errno(errno, "Failed to reboot: %m");
148 }
149
150 log_emergency("Freezing execution.");
151 freeze();
152}
153
919ce0b7 154noreturn static void crash(int sig) {
7d06dad9
MS
155 struct sigaction sa;
156 pid_t pid;
97c4f35c 157
abb26902
LP
158 if (getpid() != 1)
159 /* Pass this on immediately, if this is not PID 1 */
92ca4cac 160 (void) raise(sig);
abb26902 161 else if (!arg_dump_core)
4104970e 162 log_emergency("Caught <%s>, not dumping core.", signal_to_string(sig));
97c4f35c 163 else {
7d06dad9 164 sa = (struct sigaction) {
189d5bac 165 .sa_handler = nop_signal_handler,
b92bea5d
ZJS
166 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
167 };
97c4f35c 168
6f5e3f35 169 /* We want to wait for the core process, hence let's enable SIGCHLD */
92ca4cac 170 (void) sigaction(SIGCHLD, &sa, NULL);
6f5e3f35 171
ee05e779 172 pid = raw_clone(SIGCHLD, NULL);
e62d8c39 173 if (pid < 0)
56f64d95 174 log_emergency_errno(errno, "Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig));
97c4f35c 175 else if (pid == 0) {
92ca4cac
LP
176 struct rlimit rl = {
177 .rlim_cur = RLIM_INFINITY,
178 .rlim_max = RLIM_INFINITY,
179 };
97c4f35c
LP
180
181 /* Enable default signal handler for core dump */
92ca4cac
LP
182 sa = (struct sigaction) {
183 .sa_handler = SIG_DFL,
184 };
185 (void) sigaction(sig, &sa, NULL);
97c4f35c
LP
186
187 /* Don't limit the core dump size */
92ca4cac 188 (void) setrlimit(RLIMIT_CORE, &rl);
97c4f35c
LP
189
190 /* Just to be sure... */
e62d9b81 191 (void) chdir("/");
97c4f35c
LP
192
193 /* Raise the signal again */
ee05e779 194 pid = raw_getpid();
92ca4cac 195 (void) kill(pid, sig); /* raise() would kill the parent */
97c4f35c
LP
196
197 assert_not_reached("We shouldn't be here...");
92ca4cac 198 _exit(EXIT_FAILURE);
4fc935ca 199 } else {
8e12a6ae
LP
200 siginfo_t status;
201 int r;
4fc935ca
LP
202
203 /* Order things nicely. */
e62d8c39
ZJS
204 r = wait_for_terminate(pid, &status);
205 if (r < 0)
da927ba9 206 log_emergency_errno(r, "Caught <%s>, waitpid() failed: %m", signal_to_string(sig));
8e12a6ae 207 else if (status.si_code != CLD_DUMPED)
ee05e779
ZJS
208 log_emergency("Caught <%s>, core dump failed (child "PID_FMT", code=%s, status=%i/%s).",
209 signal_to_string(sig),
210 pid, sigchld_code_to_string(status.si_code),
211 status.si_status,
212 strna(status.si_code == CLD_EXITED
213 ? exit_status_to_string(status.si_status, EXIT_STATUS_FULL)
214 : signal_to_string(status.si_status)));
4fc935ca 215 else
4104970e 216 log_emergency("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid);
97c4f35c
LP
217 }
218 }
219
b9e74c39 220 if (arg_crash_chvt >= 0)
92ca4cac 221 (void) chvt(arg_crash_chvt);
601f6a1e 222
7d06dad9
MS
223 sa = (struct sigaction) {
224 .sa_handler = SIG_IGN,
225 .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
226 };
227
228 /* Let the kernel reap children for us */
229 (void) sigaction(SIGCHLD, &sa, NULL);
8c43883a 230
7d06dad9 231 if (arg_crash_shell) {
b9e74c39 232 log_notice("Executing crash shell in 10s...");
92ca4cac 233 (void) sleep(10);
4fc935ca 234
ee05e779 235 pid = raw_clone(SIGCHLD, NULL);
cd3bd60a 236 if (pid < 0)
56f64d95 237 log_emergency_errno(errno, "Failed to fork off crash shell: %m");
6f5e3f35 238 else if (pid == 0) {
b9e74c39 239 (void) setsid();
92ca4cac
LP
240 (void) make_console_stdio();
241 (void) execle("/bin/sh", "/bin/sh", NULL, environ);
6f5e3f35 242
ee05e779 243 log_emergency_errno(errno, "execle() failed: %m");
92ca4cac 244 _exit(EXIT_FAILURE);
b9e74c39
LP
245 } else {
246 log_info("Spawned crash shell as PID "PID_FMT".", pid);
4cf0b03b 247 (void) wait_for_terminate(pid, NULL);
b9e74c39 248 }
4fc935ca
LP
249 }
250
b9e74c39 251 freeze_or_reboot();
97c4f35c
LP
252}
253
254static void install_crash_handler(void) {
297d563d 255 static const struct sigaction sa = {
b92bea5d 256 .sa_handler = crash,
297d563d 257 .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */
b92bea5d 258 };
297d563d 259 int r;
97c4f35c 260
297d563d
LP
261 /* We ignore the return value here, since, we don't mind if we
262 * cannot set up a crash handler */
263 r = sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
264 if (r < 0)
265 log_debug_errno(r, "I had trouble setting up the crash handler, ignoring: %m");
97c4f35c 266}
f170852a 267
56d96fc0
LP
268static int console_setup(void) {
269 _cleanup_close_ int tty_fd = -1;
270 int r;
80876c20 271
512947d4 272 tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
23bbb0de
MS
273 if (tty_fd < 0)
274 return log_error_errno(tty_fd, "Failed to open /dev/console: %m");
80876c20 275
56d96fc0
LP
276 /* We don't want to force text mode. plymouth may be showing
277 * pictures already from initrd. */
512947d4 278 r = reset_terminal_fd(tty_fd, false);
23bbb0de
MS
279 if (r < 0)
280 return log_error_errno(r, "Failed to reset /dev/console: %m");
843d2643 281
56d96fc0 282 return 0;
80876c20
LP
283}
284
b9e74c39
LP
285static int parse_crash_chvt(const char *value) {
286 int b;
287
288 if (safe_atoi(value, &arg_crash_chvt) >= 0)
289 return 0;
290
291 b = parse_boolean(value);
292 if (b < 0)
293 return b;
294
295 if (b > 0)
296 arg_crash_chvt = 0; /* switch to where kmsg goes */
297 else
298 arg_crash_chvt = -1; /* turn off switching */
299
300 return 0;
301}
302
059cb385 303static int parse_proc_cmdline_item(const char *key, const char *value) {
f170852a 304
059cb385 305 int r;
f170852a 306
059cb385 307 assert(key);
5192bd19 308
059cb385 309 if (streq(key, "systemd.unit") && value) {
bf4df7c3
LP
310
311 if (!in_initrd())
e6e242ad 312 return free_and_strdup(&arg_default_unit, value);
bf4df7c3 313
059cb385 314 } else if (streq(key, "rd.systemd.unit") && value) {
bf4df7c3 315
ca05941b 316 if (in_initrd())
e6e242ad 317 return free_and_strdup(&arg_default_unit, value);
f170852a 318
059cb385 319 } else if (streq(key, "systemd.dump_core") && value) {
4fc935ca 320
059cb385 321 r = parse_boolean(value);
fb472900 322 if (r < 0)
059cb385 323 log_warning("Failed to parse dump core switch %s. Ignoring.", value);
4fc935ca 324 else
fa0f4d8a 325 arg_dump_core = r;
4fc935ca 326
b9e74c39
LP
327 } else if (streq(key, "systemd.crash_chvt") && value) {
328
329 if (parse_crash_chvt(value) < 0)
330 log_warning("Failed to parse crash chvt switch %s. Ignoring.", value);
331
059cb385 332 } else if (streq(key, "systemd.crash_shell") && value) {
4fc935ca 333
059cb385 334 r = parse_boolean(value);
fb472900 335 if (r < 0)
059cb385 336 log_warning("Failed to parse crash shell switch %s. Ignoring.", value);
4fc935ca 337 else
fa0f4d8a 338 arg_crash_shell = r;
5e7ee61c 339
b9e74c39 340 } else if (streq(key, "systemd.crash_reboot") && value) {
5e7ee61c 341
b9e74c39
LP
342 r = parse_boolean(value);
343 if (r < 0)
344 log_warning("Failed to parse crash reboot switch %s. Ignoring.", value);
5e7ee61c 345 else
b9e74c39 346 arg_crash_reboot = r;
5e7ee61c 347
059cb385 348 } else if (streq(key, "systemd.confirm_spawn") && value) {
601f6a1e 349
059cb385
LP
350 r = parse_boolean(value);
351 if (r < 0)
352 log_warning("Failed to parse confirm spawn switch %s. Ignoring.", value);
601f6a1e 353 else
059cb385 354 arg_confirm_spawn = r;
601f6a1e 355
059cb385 356 } else if (streq(key, "systemd.show_status") && value) {
9e58ff9c 357
059cb385 358 r = parse_show_status(value, &arg_show_status);
d450b6f2 359 if (r < 0)
059cb385
LP
360 log_warning("Failed to parse show status switch %s. Ignoring.", value);
361
362 } else if (streq(key, "systemd.default_standard_output") && value) {
0a494f1f 363
059cb385 364 r = exec_output_from_string(value);
fb472900 365 if (r < 0)
059cb385 366 log_warning("Failed to parse default standard output switch %s. Ignoring.", value);
0a494f1f
LP
367 else
368 arg_default_std_output = r;
0a494f1f 369
059cb385
LP
370 } else if (streq(key, "systemd.default_standard_error") && value) {
371
372 r = exec_output_from_string(value);
fb472900 373 if (r < 0)
059cb385 374 log_warning("Failed to parse default standard error switch %s. Ignoring.", value);
0a494f1f
LP
375 else
376 arg_default_std_error = r;
9e7c5357 377
059cb385
LP
378 } else if (streq(key, "systemd.setenv") && value) {
379
380 if (env_assignment_is_valid(value)) {
e21fea24
KS
381 char **env;
382
059cb385 383 env = strv_env_set(arg_default_environment, value);
e21fea24
KS
384 if (env)
385 arg_default_environment = env;
386 else
279d3c9c 387 log_warning_errno(ENOMEM, "Setting environment variable '%s' failed, ignoring: %m", value);
e21fea24 388 } else
059cb385 389 log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
9e58ff9c 390
059cb385 391 } else if (streq(key, "quiet") && !value) {
d7b15e0a 392
b6e2f329 393 if (arg_show_status == _SHOW_STATUS_UNSET)
d450b6f2 394 arg_show_status = SHOW_STATUS_AUTO;
059cb385
LP
395
396 } else if (streq(key, "debug") && !value) {
d7b15e0a 397
1de1c9c3
LP
398 /* Note that log_parse_environment() handles 'debug'
399 * too, and sets the log level to LOG_DEBUG. */
d7b15e0a 400
75f86906 401 if (detect_container() > 0)
b2103dcc 402 log_set_target(LOG_TARGET_CONSOLE);
059cb385
LP
403
404 } else if (!in_initrd() && !value) {
e2c9a131 405 const char *target;
f170852a
LP
406
407 /* SysV compatibility */
e2c9a131
EV
408 target = runlevel_to_target(key);
409 if (target)
410 return free_and_strdup(&arg_default_unit, target);
f170852a
LP
411 }
412
413 return 0;
414}
415
e8e581bf
ZJS
416#define DEFINE_SETTER(name, func, descr) \
417 static int name(const char *unit, \
418 const char *filename, \
419 unsigned line, \
420 const char *section, \
71a61510 421 unsigned section_line, \
e8e581bf
ZJS
422 const char *lvalue, \
423 int ltype, \
424 const char *rvalue, \
425 void *data, \
426 void *userdata) { \
427 \
428 int r; \
429 \
430 assert(filename); \
431 assert(lvalue); \
432 assert(rvalue); \
433 \
434 r = func(rvalue); \
435 if (r < 0) \
d1cefe0a
LP
436 log_syntax(unit, LOG_ERR, filename, line, r, \
437 "Invalid " descr "'%s': %m", \
438 rvalue); \
e8e581bf
ZJS
439 \
440 return 0; \
441 }
487393e9 442
e8e581bf
ZJS
443DEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level")
444DEFINE_SETTER(config_parse_target, log_set_target_from_string, "target")
445DEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" )
446DEFINE_SETTER(config_parse_location, log_show_location_from_string, "location")
487393e9 447
4d7213b2
LP
448static int config_parse_cpu_affinity2(
449 const char *unit,
450 const char *filename,
451 unsigned line,
452 const char *section,
453 unsigned section_line,
454 const char *lvalue,
455 int ltype,
456 const char *rvalue,
457 void *data,
458 void *userdata) {
487393e9 459
4b40bc38 460 _cleanup_cpu_free_ cpu_set_t *c = NULL;
f5c72b73 461 int ncpus;
487393e9 462
765d143b 463 ncpus = parse_cpu_set_and_warn(rvalue, &c, unit, filename, line, lvalue);
f5c72b73
FB
464 if (ncpus < 0)
465 return ncpus;
487393e9 466
f5c72b73
FB
467 if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
468 log_warning("Failed to set CPU affinity: %m");
487393e9 469
487393e9
LP
470 return 0;
471}
472
4d7213b2
LP
473static int config_parse_show_status(
474 const char* unit,
475 const char *filename,
476 unsigned line,
477 const char *section,
478 unsigned section_line,
479 const char *lvalue,
480 int ltype,
481 const char *rvalue,
482 void *data,
483 void *userdata) {
484
485 int k;
486 ShowStatus *b = data;
487
488 assert(filename);
489 assert(lvalue);
490 assert(rvalue);
491 assert(data);
492
493 k = parse_show_status(rvalue, b);
494 if (k < 0) {
12ca818f 495 log_syntax(unit, LOG_ERR, filename, line, k, "Failed to parse show status setting, ignoring: %s", rvalue);
4d7213b2
LP
496 return 0;
497 }
498
499 return 0;
500}
501
b9e74c39
LP
502static int config_parse_crash_chvt(
503 const char* unit,
504 const char *filename,
505 unsigned line,
506 const char *section,
507 unsigned section_line,
508 const char *lvalue,
509 int ltype,
510 const char *rvalue,
511 void *data,
512 void *userdata) {
513
514 int r;
515
516 assert(filename);
517 assert(lvalue);
518 assert(rvalue);
b9e74c39
LP
519
520 r = parse_crash_chvt(rvalue);
521 if (r < 0) {
522 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse CrashChangeVT= setting, ignoring: %s", rvalue);
523 return 0;
524 }
525
526 return 0;
527}
528
e8e581bf
ZJS
529static int config_parse_join_controllers(const char *unit,
530 const char *filename,
531 unsigned line,
532 const char *section,
71a61510 533 unsigned section_line,
e8e581bf
ZJS
534 const char *lvalue,
535 int ltype,
536 const char *rvalue,
537 void *data,
538 void *userdata) {
0c85a4f3 539
3875c85b 540 const char *whole_rvalue = rvalue;
0c85a4f3 541 unsigned n = 0;
0c85a4f3
LP
542
543 assert(filename);
544 assert(lvalue);
545 assert(rvalue);
546
fe382237 547 arg_join_controllers = strv_free_free(arg_join_controllers);
0c85a4f3 548
d4ebeb4f
FB
549 for (;;) {
550 _cleanup_free_ char *word = NULL;
551 char **l;
552 int r;
0c85a4f3 553
d4ebeb4f 554 r = extract_first_word(&rvalue, &word, WHITESPACE, EXTRACT_QUOTES);
3875c85b
FB
555 if (r < 0) {
556 log_syntax(unit, LOG_ERR, filename, line, r, "Invalid value for %s: %s", lvalue, whole_rvalue);
d4ebeb4f 557 return r;
3875c85b 558 }
d4ebeb4f
FB
559 if (r == 0)
560 break;
0c85a4f3 561
d4ebeb4f 562 l = strv_split(word, ",");
1592ec21 563 if (!l)
aa8aeac0 564 return log_oom();
0c85a4f3
LP
565 strv_uniq(l);
566
567 if (strv_length(l) <= 1) {
568 strv_free(l);
569 continue;
570 }
571
572 if (!arg_join_controllers) {
573 arg_join_controllers = new(char**, 2);
574 if (!arg_join_controllers) {
575 strv_free(l);
14212119 576 return log_oom();
0c85a4f3
LP
577 }
578
579 arg_join_controllers[0] = l;
580 arg_join_controllers[1] = NULL;
581
582 n = 1;
583 } else {
584 char ***a;
585 char ***t;
586
587 t = new0(char**, n+2);
588 if (!t) {
589 strv_free(l);
14212119 590 return log_oom();
0c85a4f3
LP
591 }
592
593 n = 0;
594
595 for (a = arg_join_controllers; *a; a++) {
596
597 if (strv_overlap(*a, l)) {
e287086b 598 if (strv_extend_strv(&l, *a, false) < 0) {
0c85a4f3
LP
599 strv_free(l);
600 strv_free_free(t);
14212119 601 return log_oom();
0c85a4f3
LP
602 }
603
0c85a4f3
LP
604 } else {
605 char **c;
606
607 c = strv_copy(*a);
608 if (!c) {
609 strv_free(l);
610 strv_free_free(t);
14212119 611 return log_oom();
0c85a4f3
LP
612 }
613
614 t[n++] = c;
615 }
616 }
617
618 t[n++] = strv_uniq(l);
619
620 strv_free_free(arg_join_controllers);
621 arg_join_controllers = t;
622 }
623 }
d4ebeb4f 624 if (!isempty(rvalue))
12ca818f 625 log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
0c85a4f3
LP
626
627 return 0;
628}
629
487393e9
LP
630static int parse_config_file(void) {
631
f975e971 632 const ConfigTableItem items[] = {
d3b1c508
LP
633 { "Manager", "LogLevel", config_parse_level2, 0, NULL },
634 { "Manager", "LogTarget", config_parse_target, 0, NULL },
635 { "Manager", "LogColor", config_parse_color, 0, NULL },
636 { "Manager", "LogLocation", config_parse_location, 0, NULL },
637 { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
b9e74c39
LP
638 { "Manager", "CrashChVT", /* legacy */ config_parse_crash_chvt, 0, NULL },
639 { "Manager", "CrashChangeVT", config_parse_crash_chvt, 0, NULL },
d3b1c508 640 { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
b9e74c39 641 { "Manager", "CrashReboot", config_parse_bool, 0, &arg_crash_reboot },
d3b1c508 642 { "Manager", "ShowStatus", config_parse_show_status, 0, &arg_show_status },
d3b1c508
LP
643 { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
644 { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
645 { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
646 { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
647 { "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
89fffa27 648#ifdef HAVE_SECCOMP
d3b1c508 649 { "Manager", "SystemCallArchitectures", config_parse_syscall_archs, 0, &arg_syscall_archs },
89fffa27 650#endif
d3b1c508 651 { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
bd8f585b 652 { "Manager", "DefaultTimerAccuracySec", config_parse_sec, 0, &arg_default_timer_accuracy_usec },
d3b1c508
LP
653 { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
654 { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
655 { "Manager", "DefaultTimeoutStartSec", config_parse_sec, 0, &arg_default_timeout_start_usec },
656 { "Manager", "DefaultTimeoutStopSec", config_parse_sec, 0, &arg_default_timeout_stop_usec },
657 { "Manager", "DefaultRestartSec", config_parse_sec, 0, &arg_default_restart_usec },
658 { "Manager", "DefaultStartLimitInterval", config_parse_sec, 0, &arg_default_start_limit_interval },
659 { "Manager", "DefaultStartLimitBurst", config_parse_unsigned, 0, &arg_default_start_limit_burst },
660 { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment },
ecee72e1 661 { "Manager", "DefaultLimitCPU", config_parse_sec_limit, 0, &arg_default_rlimit[RLIMIT_CPU] },
412ea7a9
KZ
662 { "Manager", "DefaultLimitFSIZE", config_parse_bytes_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE] },
663 { "Manager", "DefaultLimitDATA", config_parse_bytes_limit, 0, &arg_default_rlimit[RLIMIT_DATA] },
664 { "Manager", "DefaultLimitSTACK", config_parse_bytes_limit, 0, &arg_default_rlimit[RLIMIT_STACK] },
665 { "Manager", "DefaultLimitCORE", config_parse_bytes_limit, 0, &arg_default_rlimit[RLIMIT_CORE] },
666 { "Manager", "DefaultLimitRSS", config_parse_bytes_limit, 0, &arg_default_rlimit[RLIMIT_RSS] },
d3b1c508 667 { "Manager", "DefaultLimitNOFILE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NOFILE] },
412ea7a9 668 { "Manager", "DefaultLimitAS", config_parse_bytes_limit, 0, &arg_default_rlimit[RLIMIT_AS] },
d3b1c508 669 { "Manager", "DefaultLimitNPROC", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NPROC] },
412ea7a9 670 { "Manager", "DefaultLimitMEMLOCK", config_parse_bytes_limit, 0, &arg_default_rlimit[RLIMIT_MEMLOCK] },
d3b1c508
LP
671 { "Manager", "DefaultLimitLOCKS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_LOCKS] },
672 { "Manager", "DefaultLimitSIGPENDING", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING] },
412ea7a9 673 { "Manager", "DefaultLimitMSGQUEUE", config_parse_bytes_limit, 0, &arg_default_rlimit[RLIMIT_MSGQUEUE] },
d3b1c508
LP
674 { "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE] },
675 { "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO] },
ecee72e1 676 { "Manager", "DefaultLimitRTTIME", config_parse_usec_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME] },
085afe36
LP
677 { "Manager", "DefaultCPUAccounting", config_parse_bool, 0, &arg_default_cpu_accounting },
678 { "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting },
679 { "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting },
03a7b521 680 { "Manager", "DefaultTasksAccounting", config_parse_bool, 0, &arg_default_tasks_accounting },
0af20ea2 681 { "Manager", "DefaultTasksMax", config_parse_tasks_max, 0, &arg_default_tasks_max },
d3b1c508 682 {}
487393e9
LP
683 };
684
1b907b5c 685 const char *fn, *conf_dirs_nulstr;
487393e9 686
75eb6154
LP
687 fn = arg_running_as == MANAGER_SYSTEM ?
688 PKGSYSCONFDIR "/system.conf" :
689 PKGSYSCONFDIR "/user.conf";
690
691 conf_dirs_nulstr = arg_running_as == MANAGER_SYSTEM ?
692 CONF_PATHS_NULSTR("systemd/system.conf.d") :
693 CONF_PATHS_NULSTR("systemd/user.conf.d");
694
1b907b5c
JT
695 config_parse_many(fn, conf_dirs_nulstr, "Manager\0",
696 config_item_table_lookup, items, false, NULL);
487393e9 697
487393e9
LP
698 return 0;
699}
700
06af2a04
TB
701static void manager_set_defaults(Manager *m) {
702
703 assert(m);
704
705 m->default_timer_accuracy_usec = arg_default_timer_accuracy_usec;
706 m->default_std_output = arg_default_std_output;
707 m->default_std_error = arg_default_std_error;
708 m->default_timeout_start_usec = arg_default_timeout_start_usec;
709 m->default_timeout_stop_usec = arg_default_timeout_stop_usec;
710 m->default_restart_usec = arg_default_restart_usec;
711 m->default_start_limit_interval = arg_default_start_limit_interval;
712 m->default_start_limit_burst = arg_default_start_limit_burst;
713 m->default_cpu_accounting = arg_default_cpu_accounting;
714 m->default_blockio_accounting = arg_default_blockio_accounting;
715 m->default_memory_accounting = arg_default_memory_accounting;
03a7b521 716 m->default_tasks_accounting = arg_default_tasks_accounting;
0af20ea2 717 m->default_tasks_max = arg_default_tasks_max;
06af2a04
TB
718
719 manager_set_default_rlimits(m, arg_default_rlimit);
720 manager_environment_add(m, NULL, arg_default_environment);
721}
722
f170852a
LP
723static int parse_argv(int argc, char *argv[]) {
724
725 enum {
726 ARG_LOG_LEVEL = 0x100,
727 ARG_LOG_TARGET,
bbe63281
LP
728 ARG_LOG_COLOR,
729 ARG_LOG_LOCATION,
2f198e2f 730 ARG_UNIT,
edb9aaa8 731 ARG_SYSTEM,
af2d49f7 732 ARG_USER,
e537352b 733 ARG_TEST,
b87c2aa6 734 ARG_NO_PAGER,
9ba0bc4e 735 ARG_VERSION,
80876c20 736 ARG_DUMP_CONFIGURATION_ITEMS,
9e58ff9c 737 ARG_DUMP_CORE,
b9e74c39 738 ARG_CRASH_CHVT,
9e58ff9c 739 ARG_CRASH_SHELL,
b9e74c39 740 ARG_CRASH_REBOOT,
a16e1123 741 ARG_CONFIRM_SPAWN,
9e58ff9c 742 ARG_SHOW_STATUS,
4288f619 743 ARG_DESERIALIZE,
2660882b 744 ARG_SWITCHED_ROOT,
0a494f1f
LP
745 ARG_DEFAULT_STD_OUTPUT,
746 ARG_DEFAULT_STD_ERROR
f170852a
LP
747 };
748
749 static const struct option options[] = {
a16e1123
LP
750 { "log-level", required_argument, NULL, ARG_LOG_LEVEL },
751 { "log-target", required_argument, NULL, ARG_LOG_TARGET },
bbe63281
LP
752 { "log-color", optional_argument, NULL, ARG_LOG_COLOR },
753 { "log-location", optional_argument, NULL, ARG_LOG_LOCATION },
2f198e2f 754 { "unit", required_argument, NULL, ARG_UNIT },
edb9aaa8 755 { "system", no_argument, NULL, ARG_SYSTEM },
af2d49f7 756 { "user", no_argument, NULL, ARG_USER },
a16e1123 757 { "test", no_argument, NULL, ARG_TEST },
b87c2aa6 758 { "no-pager", no_argument, NULL, ARG_NO_PAGER },
a16e1123 759 { "help", no_argument, NULL, 'h' },
9ba0bc4e 760 { "version", no_argument, NULL, ARG_VERSION },
a16e1123 761 { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS },
a5d87bf0 762 { "dump-core", optional_argument, NULL, ARG_DUMP_CORE },
b9e74c39 763 { "crash-chvt", required_argument, NULL, ARG_CRASH_CHVT },
a5d87bf0 764 { "crash-shell", optional_argument, NULL, ARG_CRASH_SHELL },
b9e74c39 765 { "crash-reboot", optional_argument, NULL, ARG_CRASH_REBOOT },
a5d87bf0 766 { "confirm-spawn", optional_argument, NULL, ARG_CONFIRM_SPAWN },
6e98720f 767 { "show-status", optional_argument, NULL, ARG_SHOW_STATUS },
a16e1123 768 { "deserialize", required_argument, NULL, ARG_DESERIALIZE },
2660882b 769 { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
0a494f1f
LP
770 { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
771 { "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
fb472900 772 {}
f170852a
LP
773 };
774
775 int c, r;
776
777 assert(argc >= 1);
778 assert(argv);
779
b770165a
LP
780 if (getpid() == 1)
781 opterr = 0;
782
099663ff 783 while ((c = getopt_long(argc, argv, "hDbsz:", options, NULL)) >= 0)
f170852a
LP
784
785 switch (c) {
786
787 case ARG_LOG_LEVEL:
fb472900
ZJS
788 r = log_set_max_level_from_string(optarg);
789 if (r < 0) {
f170852a
LP
790 log_error("Failed to parse log level %s.", optarg);
791 return r;
792 }
793
794 break;
795
796 case ARG_LOG_TARGET:
fb472900
ZJS
797 r = log_set_target_from_string(optarg);
798 if (r < 0) {
f170852a
LP
799 log_error("Failed to parse log target %s.", optarg);
800 return r;
801 }
802
803 break;
804
bbe63281
LP
805 case ARG_LOG_COLOR:
806
d0b170c8 807 if (optarg) {
fb472900
ZJS
808 r = log_show_color_from_string(optarg);
809 if (r < 0) {
d0b170c8
LP
810 log_error("Failed to parse log color setting %s.", optarg);
811 return r;
812 }
813 } else
814 log_show_color(true);
bbe63281
LP
815
816 break;
817
818 case ARG_LOG_LOCATION:
d0b170c8 819 if (optarg) {
fb472900
ZJS
820 r = log_show_location_from_string(optarg);
821 if (r < 0) {
d0b170c8
LP
822 log_error("Failed to parse log location setting %s.", optarg);
823 return r;
824 }
825 } else
826 log_show_location(true);
bbe63281
LP
827
828 break;
829
0a494f1f 830 case ARG_DEFAULT_STD_OUTPUT:
fb472900
ZJS
831 r = exec_output_from_string(optarg);
832 if (r < 0) {
0a494f1f
LP
833 log_error("Failed to parse default standard output setting %s.", optarg);
834 return r;
835 } else
836 arg_default_std_output = r;
837 break;
838
839 case ARG_DEFAULT_STD_ERROR:
fb472900
ZJS
840 r = exec_output_from_string(optarg);
841 if (r < 0) {
0a494f1f
LP
842 log_error("Failed to parse default standard error output setting %s.", optarg);
843 return r;
844 } else
845 arg_default_std_error = r;
846 break;
847
2f198e2f 848 case ARG_UNIT:
f170852a 849
e6e242ad 850 r = free_and_strdup(&arg_default_unit, optarg);
23bbb0de
MS
851 if (r < 0)
852 return log_error_errno(r, "Failed to set default unit %s: %m", optarg);
f170852a
LP
853
854 break;
855
edb9aaa8 856 case ARG_SYSTEM:
b2c23da8 857 arg_running_as = MANAGER_SYSTEM;
edb9aaa8 858 break;
a5dab5ce 859
af2d49f7 860 case ARG_USER:
b2c23da8 861 arg_running_as = MANAGER_USER;
a5dab5ce 862 break;
a5dab5ce 863
e965d56d 864 case ARG_TEST:
fa0f4d8a 865 arg_action = ACTION_TEST;
b87c2aa6
ZJS
866 if (arg_no_pager < 0)
867 arg_no_pager = true;
868 break;
869
870 case ARG_NO_PAGER:
871 arg_no_pager = true;
e965d56d
LP
872 break;
873
9ba0bc4e
ZJS
874 case ARG_VERSION:
875 arg_action = ACTION_VERSION;
876 break;
877
e537352b 878 case ARG_DUMP_CONFIGURATION_ITEMS:
fa0f4d8a 879 arg_action = ACTION_DUMP_CONFIGURATION_ITEMS;
e537352b
LP
880 break;
881
9e58ff9c 882 case ARG_DUMP_CORE:
b9e74c39
LP
883 if (!optarg)
884 arg_dump_core = true;
885 else {
886 r = parse_boolean(optarg);
887 if (r < 0)
888 return log_error_errno(r, "Failed to parse dump core boolean: %s", optarg);
889 arg_dump_core = r;
a5d87bf0 890 }
b9e74c39
LP
891 break;
892
893 case ARG_CRASH_CHVT:
894 r = parse_crash_chvt(optarg);
895 if (r < 0)
896 return log_error_errno(r, "Failed to parse crash virtual terminal index: %s", optarg);
9e58ff9c
LP
897 break;
898
899 case ARG_CRASH_SHELL:
b9e74c39
LP
900 if (!optarg)
901 arg_crash_shell = true;
902 else {
903 r = parse_boolean(optarg);
904 if (r < 0)
905 return log_error_errno(r, "Failed to parse crash shell boolean: %s", optarg);
906 arg_crash_shell = r;
907 }
908 break;
909
910 case ARG_CRASH_REBOOT:
911 if (!optarg)
912 arg_crash_reboot = true;
913 else {
914 r = parse_boolean(optarg);
915 if (r < 0)
916 return log_error_errno(r, "Failed to parse crash shell boolean: %s", optarg);
917 arg_crash_reboot = r;
a5d87bf0 918 }
9e58ff9c
LP
919 break;
920
80876c20 921 case ARG_CONFIRM_SPAWN:
a5d87bf0
LP
922 r = optarg ? parse_boolean(optarg) : 1;
923 if (r < 0) {
924 log_error("Failed to parse confirm spawn boolean %s.", optarg);
925 return r;
926 }
927 arg_confirm_spawn = r;
80876c20
LP
928 break;
929
9e58ff9c 930 case ARG_SHOW_STATUS:
d450b6f2
ZJS
931 if (optarg) {
932 r = parse_show_status(optarg, &arg_show_status);
933 if (r < 0) {
934 log_error("Failed to parse show status boolean %s.", optarg);
935 return r;
936 }
937 } else
938 arg_show_status = SHOW_STATUS_YES;
6e98720f 939 break;
a5d87bf0 940
a16e1123
LP
941 case ARG_DESERIALIZE: {
942 int fd;
943 FILE *f;
944
01e10de3
LP
945 r = safe_atoi(optarg, &fd);
946 if (r < 0 || fd < 0) {
a16e1123 947 log_error("Failed to parse deserialize option %s.", optarg);
b9e74c39 948 return -EINVAL;
a16e1123
LP
949 }
950
b9e74c39 951 (void) fd_cloexec(fd, true);
01e10de3
LP
952
953 f = fdopen(fd, "r");
4a62c710
MS
954 if (!f)
955 return log_error_errno(errno, "Failed to open serialization fd: %m");
a16e1123 956
74ca738f 957 safe_fclose(arg_serialization);
d3b1c508 958 arg_serialization = f;
a16e1123
LP
959
960 break;
961 }
962
2660882b 963 case ARG_SWITCHED_ROOT:
bf4df7c3 964 arg_switched_root = true;
d03bc1b8
HH
965 break;
966
f170852a 967 case 'h':
fa0f4d8a 968 arg_action = ACTION_HELP;
b87c2aa6
ZJS
969 if (arg_no_pager < 0)
970 arg_no_pager = true;
f170852a
LP
971 break;
972
1d2e23ab
LP
973 case 'D':
974 log_set_max_level(LOG_DEBUG);
975 break;
976
099663ff
LP
977 case 'b':
978 case 's':
979 case 'z':
980 /* Just to eat away the sysvinit kernel
981 * cmdline args without getopt() error
982 * messages that we'll parse in
983 * parse_proc_cmdline_word() or ignore. */
f170852a 984
099663ff 985 case '?':
601185b4 986 if (getpid() != 1)
099663ff 987 return -EINVAL;
601185b4
ZJS
988 else
989 return 0;
099663ff 990
601185b4
ZJS
991 default:
992 assert_not_reached("Unhandled option code.");
f170852a
LP
993 }
994
d821e6d6
LP
995 if (optind < argc && getpid() != 1) {
996 /* Hmm, when we aren't run as init system
997 * let's complain about excess arguments */
998
999 log_error("Excess arguments.");
1000 return -EINVAL;
1001 }
1002
f170852a
LP
1003 return 0;
1004}
1005
1006static int help(void) {
1007
2e33c433 1008 printf("%s [OPTIONS...]\n\n"
af2d49f7 1009 "Starts up and maintains the system or user services.\n\n"
e537352b 1010 " -h --help Show this help\n"
e537352b 1011 " --test Determine startup sequence, dump it and exit\n"
b87c2aa6 1012 " --no-pager Do not pipe output into a pager\n"
80876c20 1013 " --dump-configuration-items Dump understood unit configuration items\n"
9e58ff9c 1014 " --unit=UNIT Set default unit\n"
edb9aaa8 1015 " --system Run a system instance, even if PID != 1\n"
af2d49f7 1016 " --user Run a user instance\n"
b9e74c39
LP
1017 " --dump-core[=BOOL] Dump core on crash\n"
1018 " --crash-vt=NR Change to specified VT on crash\n"
1019 " --crash-reboot[=BOOL] Reboot on crash\n"
1020 " --crash-shell[=BOOL] Run shell on crash\n"
1021 " --confirm-spawn[=BOOL] Ask for confirmation when spawning processes\n"
1022 " --show-status[=BOOL] Show status updates on the console during bootup\n"
c1dc6153 1023 " --log-target=TARGET Set log target (console, journal, kmsg, journal-or-kmsg, null)\n"
9e58ff9c 1024 " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
b9e74c39
LP
1025 " --log-color[=BOOL] Highlight important log messages\n"
1026 " --log-location[=BOOL] Include code location in log messages\n"
0a494f1f
LP
1027 " --default-standard-output= Set default standard output for services\n"
1028 " --default-standard-error= Set default standard error output for services\n",
5b6319dc 1029 program_invocation_short_name);
f170852a
LP
1030
1031 return 0;
1032}
1033
b3680f49 1034static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching_root) {
48b90859
LP
1035 _cleanup_fdset_free_ FDSet *fds = NULL;
1036 _cleanup_fclose_ FILE *f = NULL;
a16e1123
LP
1037 int r;
1038
1039 assert(m);
1040 assert(_f);
1041 assert(_fds);
1042
6b78f9b4 1043 r = manager_open_serialization(m, &f);
48b90859
LP
1044 if (r < 0)
1045 return log_error_errno(r, "Failed to create serialization file: %m");
a16e1123 1046
71445ae7
LP
1047 /* Make sure nothing is really destructed when we shut down */
1048 m->n_reloading ++;
718db961 1049 bus_manager_send_reloading(m, true);
71445ae7 1050
6b78f9b4 1051 fds = fdset_new();
48b90859
LP
1052 if (!fds)
1053 return log_oom();
a16e1123 1054
b3680f49 1055 r = manager_serialize(m, f, fds, switching_root);
48b90859
LP
1056 if (r < 0)
1057 return log_error_errno(r, "Failed to serialize state: %m");
a16e1123 1058
48b90859
LP
1059 if (fseeko(f, 0, SEEK_SET) == (off_t) -1)
1060 return log_error_errno(errno, "Failed to rewind serialization fd: %m");
a16e1123 1061
6b78f9b4 1062 r = fd_cloexec(fileno(f), false);
48b90859
LP
1063 if (r < 0)
1064 return log_error_errno(r, "Failed to disable O_CLOEXEC for serialization: %m");
a16e1123 1065
6b78f9b4 1066 r = fdset_cloexec(fds, false);
48b90859
LP
1067 if (r < 0)
1068 return log_error_errno(r, "Failed to disable O_CLOEXEC for serialization fds: %m");
a16e1123
LP
1069
1070 *_f = f;
1071 *_fds = fds;
1072
48b90859
LP
1073 f = NULL;
1074 fds = NULL;
a16e1123 1075
48b90859 1076 return 0;
a16e1123
LP
1077}
1078
4096d6f5
LP
1079static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
1080 struct rlimit nl;
1081 int r;
1082
1083 assert(saved_rlimit);
1084
1085 /* Save the original RLIMIT_NOFILE so that we can reset it
1086 * later when transitioning from the initrd to the main
1087 * systemd or suchlike. */
4a62c710
MS
1088 if (getrlimit(RLIMIT_NOFILE, saved_rlimit) < 0)
1089 return log_error_errno(errno, "Reading RLIMIT_NOFILE failed: %m");
4096d6f5
LP
1090
1091 /* Make sure forked processes get the default kernel setting */
1092 if (!arg_default_rlimit[RLIMIT_NOFILE]) {
1093 struct rlimit *rl;
1094
1095 rl = newdup(struct rlimit, saved_rlimit, 1);
1096 if (!rl)
1097 return log_oom();
1098
1099 arg_default_rlimit[RLIMIT_NOFILE] = rl;
1100 }
1101
1102 /* Bump up the resource limit for ourselves substantially */
1103 nl.rlim_cur = nl.rlim_max = 64*1024;
1104 r = setrlimit_closest(RLIMIT_NOFILE, &nl);
23bbb0de
MS
1105 if (r < 0)
1106 return log_error_errno(r, "Setting RLIMIT_NOFILE failed: %m");
4096d6f5
LP
1107
1108 return 0;
1109}
1110
80758717 1111static void test_usr(void) {
80758717 1112
ed1c99fc 1113 /* Check that /usr is not a separate fs */
80758717 1114
871c44a7
LP
1115 if (dir_is_empty("/usr") <= 0)
1116 return;
1117
8b173b5e 1118 log_warning("/usr appears to be on its own filesystem and is not already mounted. This is not a supported setup. "
871c44a7
LP
1119 "Some things will probably break (sometimes even silently) in mysterious ways. "
1120 "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
1121}
1122
a07fdfa3
LP
1123static int initialize_join_controllers(void) {
1124 /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
1125 * + "net_prio". We'd like to add "cpuset" to the mix, but
f131770b 1126 * "cpuset" doesn't really work for groups with no initialized
a07fdfa3
LP
1127 * attributes. */
1128
1129 arg_join_controllers = new(char**, 3);
1130 if (!arg_join_controllers)
1131 return -ENOMEM;
1132
1133 arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
fe382237
LP
1134 if (!arg_join_controllers[0])
1135 goto oom;
a6b26d90 1136
fe382237
LP
1137 arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL);
1138 if (!arg_join_controllers[1])
1139 goto oom;
a07fdfa3 1140
fe382237 1141 arg_join_controllers[2] = NULL;
a07fdfa3 1142 return 0;
fe382237
LP
1143
1144oom:
1145 arg_join_controllers = strv_free_free(arg_join_controllers);
1146 return -ENOMEM;
a07fdfa3
LP
1147}
1148
d3b1c508
LP
1149static int enforce_syscall_archs(Set *archs) {
1150#ifdef HAVE_SECCOMP
1151 scmp_filter_ctx *seccomp;
1152 Iterator i;
1153 void *id;
1154 int r;
1155
1156 seccomp = seccomp_init(SCMP_ACT_ALLOW);
1157 if (!seccomp)
1158 return log_oom();
1159
1160 SET_FOREACH(id, arg_syscall_archs, i) {
1161 r = seccomp_arch_add(seccomp, PTR_TO_UINT32(id) - 1);
1162 if (r == -EEXIST)
1163 continue;
1164 if (r < 0) {
da927ba9 1165 log_error_errno(r, "Failed to add architecture to seccomp: %m");
d3b1c508
LP
1166 goto finish;
1167 }
1168 }
1169
8a8bf3c0
LP
1170 r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
1171 if (r < 0) {
da927ba9 1172 log_error_errno(r, "Failed to unset NO_NEW_PRIVS: %m");
8a8bf3c0
LP
1173 goto finish;
1174 }
1175
d3b1c508
LP
1176 r = seccomp_load(seccomp);
1177 if (r < 0)
da927ba9 1178 log_error_errno(r, "Failed to add install architecture seccomp: %m");
d3b1c508
LP
1179
1180finish:
1181 seccomp_release(seccomp);
1182 return r;
1183#else
1184 return 0;
1185#endif
1186}
1187
b6e2f329
LP
1188static int status_welcome(void) {
1189 _cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL;
1190 int r;
1191
1192 r = parse_env_file("/etc/os-release", NEWLINE,
1193 "PRETTY_NAME", &pretty_name,
1194 "ANSI_COLOR", &ansi_color,
1195 NULL);
ece174c5 1196 if (r == -ENOENT)
5ae4d543
LP
1197 r = parse_env_file("/usr/lib/os-release", NEWLINE,
1198 "PRETTY_NAME", &pretty_name,
1199 "ANSI_COLOR", &ansi_color,
1200 NULL);
b6e2f329
LP
1201
1202 if (r < 0 && r != -ENOENT)
da927ba9 1203 log_warning_errno(r, "Failed to read os-release file: %m");
b6e2f329
LP
1204
1205 return status_printf(NULL, false, false,
1206 "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
1207 isempty(ansi_color) ? "1" : ansi_color,
1208 isempty(pretty_name) ? "Linux" : pretty_name);
1209}
1210
fdd25311
LP
1211static int write_container_id(void) {
1212 const char *c;
19854865 1213 int r;
fdd25311
LP
1214
1215 c = getenv("container");
1216 if (isempty(c))
1217 return 0;
1218
19854865
LP
1219 r = write_string_file("/run/systemd/container", c, WRITE_STRING_FILE_CREATE);
1220 if (r < 0)
f1f849b0 1221 return log_warning_errno(r, "Failed to write /run/systemd/container, ignoring: %m");
19854865
LP
1222
1223 return 1;
1224}
1225
1226static int bump_unix_max_dgram_qlen(void) {
1227 _cleanup_free_ char *qlen = NULL;
1228 unsigned long v;
1229 int r;
1230
1231 /* Let's bump the net.unix.max_dgram_qlen sysctl. The kernel
1232 * default of 16 is simply too low. We set the value really
1233 * really early during boot, so that it is actually applied to
1234 * all our sockets, including the $NOTIFY_SOCKET one. */
1235
1236 r = read_one_line_file("/proc/sys/net/unix/max_dgram_qlen", &qlen);
1237 if (r < 0)
1238 return log_warning_errno(r, "Failed to read AF_UNIX datagram queue length, ignoring: %m");
1239
1240 r = safe_atolu(qlen, &v);
1241 if (r < 0)
1242 return log_warning_errno(r, "Failed to parse AF_UNIX datagram queue length, ignoring: %m");
1243
1244 if (v >= DEFAULT_UNIX_MAX_DGRAM_QLEN)
1245 return 0;
1246
1247 qlen = mfree(qlen);
1248 if (asprintf(&qlen, "%lu\n", DEFAULT_UNIX_MAX_DGRAM_QLEN) < 0)
1249 return log_oom();
1250
1251 r = write_string_file("/proc/sys/net/unix/max_dgram_qlen", qlen, 0);
1252 if (r < 0)
1253 return log_full_errno(IN_SET(r, -EROFS, -EPERM, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
1254 "Failed to bump AF_UNIX datagram queue length, ignoring: %m");
1255
1256 return 1;
fdd25311
LP
1257}
1258
60918275
LP
1259int main(int argc, char *argv[]) {
1260 Manager *m = NULL;
22f4096c 1261 int r, retval = EXIT_FAILURE;
9d76d730
LP
1262 usec_t before_startup, after_startup;
1263 char timespan[FORMAT_TIMESPAN_MAX];
a16e1123
LP
1264 FDSet *fds = NULL;
1265 bool reexecute = false;
b9080b03 1266 const char *shutdown_verb = NULL;
86caf095
LP
1267 dual_timestamp initrd_timestamp = DUAL_TIMESTAMP_NULL;
1268 dual_timestamp userspace_timestamp = DUAL_TIMESTAMP_NULL;
1269 dual_timestamp kernel_timestamp = DUAL_TIMESTAMP_NULL;
1270 dual_timestamp security_start_timestamp = DUAL_TIMESTAMP_NULL;
1271 dual_timestamp security_finish_timestamp = DUAL_TIMESTAMP_NULL;
5d6b1584 1272 static char systemd[] = "systemd";
2660882b 1273 bool skip_setup = false;
d3b1c508 1274 unsigned j;
0b3325e7 1275 bool loaded_policy = false;
e96d6be7 1276 bool arm_reboot_watchdog = false;
bf4df7c3 1277 bool queue_default_job = false;
5f5c2f38 1278 bool empty_etc = false;
41669317 1279 char *switch_root_dir = NULL, *switch_root_init = NULL;
86caf095 1280 struct rlimit saved_rlimit_nofile = RLIMIT_MAKE_CONST(0);
cb6531be 1281 const char *error_message = NULL;
27b14a22 1282
058dc6f3 1283#ifdef HAVE_SYSV_COMPAT
2cb1a60d 1284 if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
35b8ca3a 1285 /* This is compatibility support for SysV, where
2cb1a60d
LP
1286 * calling init as a user is identical to telinit. */
1287
1288 errno = -ENOENT;
1289 execv(SYSTEMCTL_BINARY_PATH, argv);
56f64d95 1290 log_error_errno(errno, "Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
2cb1a60d
LP
1291 return 1;
1292 }
058dc6f3 1293#endif
2cb1a60d 1294
c3a170f3
HH
1295 dual_timestamp_from_monotonic(&kernel_timestamp, 0);
1296 dual_timestamp_get(&userspace_timestamp);
1297
0b3325e7
LP
1298 /* Determine if this is a reexecution or normal bootup. We do
1299 * the full command line parsing much later, so let's just
1300 * have a quick peek here. */
db813c2a
LP
1301 if (strv_find(argv+1, "--deserialize"))
1302 skip_setup = true;
0b3325e7 1303
2660882b
LP
1304 /* If we have switched root, do all the special setup
1305 * things */
db813c2a
LP
1306 if (strv_find(argv+1, "--switched-root"))
1307 skip_setup = false;
d03bc1b8 1308
f3b6a3ed
LP
1309 /* If we get started via the /sbin/init symlink then we are
1310 called 'init'. After a subsequent reexecution we are then
1311 called 'systemd'. That is confusing, hence let's call us
1312 systemd right-away. */
f3b6a3ed
LP
1313 program_invocation_short_name = systemd;
1314 prctl(PR_SET_NAME, systemd);
5d6b1584 1315
9a0e6896
LP
1316 saved_argv = argv;
1317 saved_argc = argc;
f3b6a3ed 1318
2cc59dbf 1319 log_show_color(isatty(STDERR_FILENO) > 0);
c1dc6153 1320 log_set_upgrade_syslog_to_journal(true);
bbe63281 1321
90dc8c2e
MG
1322 /* Disable the umask logic */
1323 if (getpid() == 1)
1324 umask(0);
1325
75f86906 1326 if (getpid() == 1 && detect_container() <= 0) {
4f8d551f 1327
a866073d 1328 /* Running outside of a container as PID 1 */
b2c23da8 1329 arg_running_as = MANAGER_SYSTEM;
a866073d
LP
1330 make_null_stdio();
1331 log_set_target(LOG_TARGET_KMSG);
1332 log_open();
1333
21bf2ab0 1334 if (in_initrd())
c3a170f3 1335 initrd_timestamp = userspace_timestamp;
c3ba6250 1336
2660882b 1337 if (!skip_setup) {
8f838d8a 1338 mount_setup_early();
c2e0d600 1339 dual_timestamp_get(&security_start_timestamp);
cb6531be
ZJS
1340 if (mac_selinux_setup(&loaded_policy) < 0) {
1341 error_message = "Failed to load SELinux policy";
0b3325e7 1342 goto finish;
cb6531be
ZJS
1343 } else if (ima_setup() < 0) {
1344 error_message = "Failed to load IMA policy";
81611586 1345 goto finish;
cb6531be
ZJS
1346 } else if (mac_smack_setup(&loaded_policy) < 0) {
1347 error_message = "Failed to load SMACK policy";
ffbd2c4d 1348 goto finish;
cb6531be 1349 }
c2e0d600 1350 dual_timestamp_get(&security_finish_timestamp);
81611586 1351 }
0b3325e7 1352
cb6531be
ZJS
1353 if (mac_selinux_init(NULL) < 0) {
1354 error_message = "Failed to initialize SELinux policy";
0ff4cdd9 1355 goto finish;
cb6531be 1356 }
7948c4df 1357
72edcff5 1358 if (!skip_setup) {
24efb112 1359 if (clock_is_localtime() > 0) {
0b3325e7 1360 int min;
7948c4df 1361
c264aeab
KS
1362 /*
1363 * The very first call of settimeofday() also does a time warp in the kernel.
1364 *
1365 * In the rtc-in-local time mode, we set the kernel's timezone, and rely on
1366 * external tools to take care of maintaining the RTC and do all adjustments.
1367 * This matches the behavior of Windows, which leaves the RTC alone if the
1368 * registry tells that the RTC runs in UTC.
1369 */
24efb112 1370 r = clock_set_timezone(&min);
0b3325e7 1371 if (r < 0)
da927ba9 1372 log_error_errno(r, "Failed to apply local time delta, ignoring: %m");
0b3325e7
LP
1373 else
1374 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
19e65613
KS
1375 } else if (!in_initrd()) {
1376 /*
c264aeab 1377 * Do a dummy very first call to seal the kernel's time warp magic.
19e65613
KS
1378 *
1379 * Do not call this this from inside the initrd. The initrd might not
1380 * carry /etc/adjtime with LOCAL, but the real system could be set up
1381 * that way. In such case, we need to delay the time-warp or the sealing
1382 * until we reach the real system.
c264aeab
KS
1383 *
1384 * Do no set the kernel's timezone. The concept of local time cannot
1385 * be supported reliably, the time will jump or be incorrect at every daylight
1386 * saving time change. All kernel local time concepts will be treated
1387 * as UTC that way.
19e65613 1388 */
c264aeab 1389 clock_reset_timewarp();
72edcff5
KS
1390 }
1391 }
a866073d
LP
1392
1393 /* Set the default for later on, but don't actually
1394 * open the logs like this for now. Note that if we
1395 * are transitioning from the initrd there might still
1396 * be journal fd open, and we shouldn't attempt
1397 * opening that before we parsed /proc/cmdline which
1398 * might redirect output elsewhere. */
1399 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1400
1401 } else if (getpid() == 1) {
a866073d 1402 /* Running inside a container, as PID 1 */
b2c23da8 1403 arg_running_as = MANAGER_SYSTEM;
a866073d 1404 log_set_target(LOG_TARGET_CONSOLE);
99f09825 1405 log_close_console(); /* force reopen of /dev/console */
a866073d
LP
1406 log_open();
1407
1408 /* For the later on, see above... */
1409 log_set_target(LOG_TARGET_JOURNAL);
1410
c3a170f3
HH
1411 /* clear the kernel timestamp,
1412 * because we are in a container */
1413 kernel_timestamp.monotonic = 0ULL;
1414 kernel_timestamp.realtime = 0ULL;
a866073d 1415
c3a170f3 1416 } else {
a866073d 1417 /* Running as user instance */
b2c23da8 1418 arg_running_as = MANAGER_USER;
eeecf6e6 1419 log_set_target(LOG_TARGET_AUTO);
871e5809 1420 log_open();
c3a170f3
HH
1421
1422 /* clear the kernel timestamp,
1423 * because we are not PID 1 */
6513d561 1424 kernel_timestamp = DUAL_TIMESTAMP_NULL;
bbe63281 1425 }
a5dab5ce 1426
0c85a4f3 1427 /* Initialize default unit */
e6e242ad 1428 r = free_and_strdup(&arg_default_unit, SPECIAL_DEFAULT_TARGET);
6afa301b 1429 if (r < 0) {
da927ba9 1430 log_emergency_errno(r, "Failed to set default unit %s: %m", SPECIAL_DEFAULT_TARGET);
cb6531be 1431 error_message = "Failed to set default unit";
f170852a 1432 goto finish;
14212119 1433 }
60918275 1434
a07fdfa3 1435 r = initialize_join_controllers();
cb6531be 1436 if (r < 0) {
ff9b60f3 1437 error_message = "Failed to initialize cgroup controllers";
0c85a4f3 1438 goto finish;
cb6531be 1439 }
0c85a4f3 1440
f170852a
LP
1441 /* Mount /proc, /sys and friends, so that /proc/cmdline and
1442 * /proc/$PID/fd is available. */
c1dae1b3 1443 if (getpid() == 1) {
f84f9974
LP
1444
1445 /* Load the kernel modules early, so that we kdbus.ko is loaded before kdbusfs shall be mounted */
2e75e2a8
DM
1446 if (!skip_setup)
1447 kmod_setup();
2e75e2a8 1448
0c85a4f3 1449 r = mount_setup(loaded_policy);
cb6531be
ZJS
1450 if (r < 0) {
1451 error_message = "Failed to mount API filesystems";
8efe3c01 1452 goto finish;
cb6531be 1453 }
0c85a4f3 1454 }
4ade7963
LP
1455
1456 /* Reset all signal handlers. */
ce30c8dc
LP
1457 (void) reset_all_signal_handlers();
1458 (void) ignore_signals(SIGNALS_IGNORE, -1);
078e4539 1459
cb6531be
ZJS
1460 if (parse_config_file() < 0) {
1461 error_message = "Failed to parse config file";
487393e9 1462 goto finish;
cb6531be 1463 }
487393e9 1464
b2c23da8 1465 if (arg_running_as == MANAGER_SYSTEM) {
b5884878
LP
1466 r = parse_proc_cmdline(parse_proc_cmdline_item);
1467 if (r < 0)
da927ba9 1468 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
b5884878 1469 }
f170852a 1470
1de1c9c3
LP
1471 /* Note that this also parses bits from the kernel command
1472 * line, including "debug". */
f170852a
LP
1473 log_parse_environment();
1474
cb6531be
ZJS
1475 if (parse_argv(argc, argv) < 0) {
1476 error_message = "Failed to parse commandline arguments";
f170852a 1477 goto finish;
cb6531be 1478 }
f170852a 1479
6bae23a0
TB
1480 if (arg_action == ACTION_TEST &&
1481 geteuid() == 0) {
b5c6cf87
LP
1482 log_error("Don't run test mode as root.");
1483 goto finish;
1484 }
1485
b2c23da8 1486 if (arg_running_as == MANAGER_USER &&
6bae23a0
TB
1487 arg_action == ACTION_RUN &&
1488 sd_booted() <= 0) {
1489 log_error("Trying to run as user instance, but the system has not been booted with systemd.");
1490 goto finish;
1491 }
1492
b2c23da8 1493 if (arg_running_as == MANAGER_SYSTEM &&
fe783b03
LP
1494 arg_action == ACTION_RUN &&
1495 running_in_chroot() > 0) {
1496 log_error("Cannot be run in a chroot() environment.");
1497 goto finish;
1498 }
1499
0d8c31ff
ZJS
1500 if (arg_action == ACTION_TEST)
1501 skip_setup = true;
1502
b87c2aa6
ZJS
1503 pager_open_if_enabled();
1504
fa0f4d8a 1505 if (arg_action == ACTION_HELP) {
f170852a
LP
1506 retval = help();
1507 goto finish;
9ba0bc4e
ZJS
1508 } else if (arg_action == ACTION_VERSION) {
1509 retval = version();
1510 goto finish;
fa0f4d8a 1511 } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
e537352b 1512 unit_dump_config_items(stdout);
22f4096c 1513 retval = EXIT_SUCCESS;
e537352b 1514 goto finish;
fa0f4d8a 1515 } else if (arg_action == ACTION_DONE) {
22f4096c 1516 retval = EXIT_SUCCESS;
4288f619 1517 goto finish;
f170852a
LP
1518 }
1519
b2c23da8 1520 if (arg_running_as == MANAGER_USER &&
8be28fb1
KS
1521 !getenv("XDG_RUNTIME_DIR")) {
1522 log_error("Trying to run as user instance, but $XDG_RUNTIME_DIR is not set.");
1523 goto finish;
1524 }
1525
fa0f4d8a 1526 assert_se(arg_action == ACTION_RUN || arg_action == ACTION_TEST);
f170852a 1527
871e5809
LP
1528 /* Close logging fds, in order not to confuse fdset below */
1529 log_close();
1530
a16e1123 1531 /* Remember open file descriptors for later deserialization */
01e10de3
LP
1532 r = fdset_new_fill(&fds);
1533 if (r < 0) {
da927ba9 1534 log_emergency_errno(r, "Failed to allocate fd set: %m");
cb6531be 1535 error_message = "Failed to allocate fd set";
01e10de3
LP
1536 goto finish;
1537 } else
1538 fdset_cloexec(fds, true);
a16e1123 1539
d3b1c508
LP
1540 if (arg_serialization)
1541 assert_se(fdset_remove(fds, fileno(arg_serialization)) >= 0);
a16e1123 1542
b2c23da8 1543 if (arg_running_as == MANAGER_SYSTEM)
80876c20
LP
1544 /* Become a session leader if we aren't one yet. */
1545 setsid();
4ade7963 1546
befb5b6a 1547 /* Move out of the way, so that we won't block unmounts */
d250afe7 1548 assert_se(chdir("/") == 0);
befb5b6a 1549
2146621b
LP
1550 /* Reset the console, but only if this is really init and we
1551 * are freshly booted */
b2c23da8 1552 if (arg_running_as == MANAGER_SYSTEM && arg_action == ACTION_RUN) {
56d96fc0
LP
1553
1554 /* If we are init, we connect stdin/stdout/stderr to
1555 * /dev/null and make sure we don't have a controlling
1556 * tty. */
1557 release_terminal();
1558
1559 if (getpid() == 1 && !skip_setup)
1560 console_setup();
1561 }
4ade7963 1562
18149b9f 1563 /* Open the logging devices, if possible and necessary */
843d2643 1564 log_open();
4ade7963 1565
b6e2f329
LP
1566 if (arg_show_status == _SHOW_STATUS_UNSET)
1567 arg_show_status = SHOW_STATUS_YES;
1568
5373d602
LP
1569 /* Make sure we leave a core dump without panicing the
1570 * kernel. */
ab422445 1571 if (getpid() == 1) {
4fc935ca 1572 install_crash_handler();
97c4f35c 1573
0c85a4f3
LP
1574 r = mount_cgroup_controllers(arg_join_controllers);
1575 if (r < 0)
1576 goto finish;
1577 }
1578
b2c23da8 1579 if (arg_running_as == MANAGER_SYSTEM) {
75f86906 1580 int v;
c20f5ac7 1581
0d8c31ff
ZJS
1582 log_info(PACKAGE_STRING " running in %ssystem mode. (" SYSTEMD_FEATURES ")",
1583 arg_action == ACTION_TEST ? "test " : "" );
c20f5ac7 1584
75f86906
LP
1585 v = detect_virtualization();
1586 if (v > 0)
1587 log_info("Detected virtualization %s.", virtualization_to_string(v));
c20f5ac7 1588
fdd25311
LP
1589 write_container_id();
1590
d3f86679 1591 log_info("Detected architecture %s.", architecture_to_string(uname_architecture()));
d9d93745 1592
26a1efdf
LP
1593 if (in_initrd())
1594 log_info("Running in initial RAM disk.");
1595
3408ba01
LP
1596 /* Let's check whether /etc is already populated. We
1597 * don't actually really check for that, but use
1598 * /etc/machine-id as flag file. This allows container
1599 * managers and installers to provision a couple of
1600 * files already. If the container manager wants to
1601 * provision the machine ID itself it should pass
ee33e53a 1602 * $container_uuid to PID 1. */
3408ba01 1603
baa1bdf7 1604 empty_etc = access("/etc/machine-id", F_OK) < 0;
5f5c2f38
LP
1605 if (empty_etc)
1606 log_info("Running with unpopulated /etc.");
d8160f21 1607 } else {
1f97091d
LP
1608 _cleanup_free_ char *t;
1609
1610 t = uid_to_name(getuid());
0d8c31ff
ZJS
1611 log_debug(PACKAGE_STRING " running in %suser mode for user "UID_FMT"/%s. (" SYSTEMD_FEATURES ")",
1612 arg_action == ACTION_TEST ? " test" : "", getuid(), t);
d8160f21 1613 }
a5dab5ce 1614
b2c23da8 1615 if (arg_running_as == MANAGER_SYSTEM && !skip_setup) {
031886ed 1616 if (arg_show_status > 0)
888c6216
LP
1617 status_welcome();
1618
888c6216 1619 hostname_setup();
489388fb 1620 machine_id_setup(NULL);
888c6216 1621 loopback_setup();
19854865 1622 bump_unix_max_dgram_qlen();
490aed58 1623
80758717 1624 test_usr();
af5bc85d 1625 }
302e8c4c 1626
b2c23da8 1627 if (arg_running_as == MANAGER_SYSTEM && arg_runtime_watchdog > 0)
e96d6be7
LP
1628 watchdog_set_timeout(&arg_runtime_watchdog);
1629
3a43da28 1630 if (arg_timer_slack_nsec != NSEC_INFINITY)
aa0f64ac 1631 if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
56f64d95 1632 log_error_errno(errno, "Failed to adjust timer slack: %m");
aa0f64ac 1633
ec8927ca 1634 if (arg_capability_bounding_set_drop) {
31c885e9 1635 r = capability_bounding_set_drop_usermode(arg_capability_bounding_set_drop);
ec8927ca 1636 if (r < 0) {
da927ba9 1637 log_emergency_errno(r, "Failed to drop capability bounding set of usermode helpers: %m");
cb6531be 1638 error_message = "Failed to drop capability bounding set of usermode helpers";
ec8927ca
LP
1639 goto finish;
1640 }
31c885e9 1641 r = capability_bounding_set_drop(arg_capability_bounding_set_drop, true);
939b8f14 1642 if (r < 0) {
da927ba9 1643 log_emergency_errno(r, "Failed to drop capability bounding set: %m");
cb6531be 1644 error_message = "Failed to drop capability bounding set";
939b8f14
LP
1645 goto finish;
1646 }
ec8927ca
LP
1647 }
1648
d3b1c508
LP
1649 if (arg_syscall_archs) {
1650 r = enforce_syscall_archs(arg_syscall_archs);
cb6531be
ZJS
1651 if (r < 0) {
1652 error_message = "Failed to set syscall architectures";
d3b1c508 1653 goto finish;
cb6531be 1654 }
d3b1c508
LP
1655 }
1656
61b9b203 1657 if (arg_running_as == MANAGER_USER)
d4447f4d 1658 /* Become reaper of our children */
61b9b203 1659 if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0)
56f64d95 1660 log_warning_errno(errno, "Failed to make us a subreaper: %m");
d4447f4d 1661
b2c23da8 1662 if (arg_running_as == MANAGER_SYSTEM) {
4096d6f5
LP
1663 bump_rlimit_nofile(&saved_rlimit_nofile);
1664
5f5c2f38 1665 if (empty_etc) {
304b3079 1666 r = unit_file_preset_all(UNIT_FILE_SYSTEM, false, NULL, UNIT_FILE_PRESET_ENABLE_ONLY, false, NULL, 0);
5f5c2f38 1667 if (r < 0)
287a0de4 1668 log_full_errno(r == -EEXIST ? LOG_NOTICE : LOG_WARNING, r, "Failed to populate /etc with preset unit settings, ignoring: %m");
5f5c2f38
LP
1669 else
1670 log_info("Populated /etc with preset unit settings.");
1671 }
1672 }
1673
0d8c31ff 1674 r = manager_new(arg_running_as, arg_action == ACTION_TEST, &m);
e96d6be7 1675 if (r < 0) {
da927ba9 1676 log_emergency_errno(r, "Failed to allocate manager object: %m");
cb6531be 1677 error_message = "Failed to allocate manager object";
60918275
LP
1678 goto finish;
1679 }
1680
9e58ff9c 1681 m->confirm_spawn = arg_confirm_spawn;
e96d6be7
LP
1682 m->runtime_watchdog = arg_runtime_watchdog;
1683 m->shutdown_watchdog = arg_shutdown_watchdog;
c3a170f3
HH
1684 m->userspace_timestamp = userspace_timestamp;
1685 m->kernel_timestamp = kernel_timestamp;
c3a170f3 1686 m->initrd_timestamp = initrd_timestamp;
c2e0d600
TA
1687 m->security_start_timestamp = security_start_timestamp;
1688 m->security_finish_timestamp = security_finish_timestamp;
9e58ff9c 1689
06af2a04 1690 manager_set_defaults(m);
27d340c7 1691 manager_set_show_status(m, arg_show_status);
e2680723 1692 manager_set_first_boot(m, empty_etc);
27d340c7 1693
bf4df7c3 1694 /* Remember whether we should queue the default job */
d3b1c508 1695 queue_default_job = !arg_serialization || arg_switched_root;
bf4df7c3 1696
9d76d730
LP
1697 before_startup = now(CLOCK_MONOTONIC);
1698
d3b1c508 1699 r = manager_startup(m, arg_serialization, fds);
e96d6be7 1700 if (r < 0)
da927ba9 1701 log_error_errno(r, "Failed to fully start up daemon: %m");
a16e1123 1702
bf4df7c3
LP
1703 /* This will close all file descriptors that were opened, but
1704 * not claimed by any unit. */
2feceb5e 1705 fds = fdset_free(fds);
f50e0a01 1706
74ca738f 1707 arg_serialization = safe_fclose(arg_serialization);
bf4df7c3
LP
1708
1709 if (queue_default_job) {
4afd3348 1710 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
1c27d3f3 1711 Unit *target = NULL;
bacbccb7 1712 Job *default_unit_job;
398ef8ba 1713
fa0f4d8a 1714 log_debug("Activating default unit: %s", arg_default_unit);
a16e1123 1715
e96d6be7 1716 r = manager_load_unit(m, arg_default_unit, NULL, &error, &target);
718db961
LP
1717 if (r < 0)
1718 log_error("Failed to load default target: %s", bus_error_message(&error, r));
1719 else if (target->load_state == UNIT_ERROR || target->load_state == UNIT_NOT_FOUND)
c33b3297 1720 log_error_errno(target->load_error, "Failed to load default target: %m");
ac155bb8 1721 else if (target->load_state == UNIT_MASKED)
6daf4f90 1722 log_error("Default target masked.");
27b14a22 1723
ac155bb8 1724 if (!target || target->load_state != UNIT_LOADED) {
a16e1123 1725 log_info("Trying to load rescue target...");
1c27d3f3 1726
e96d6be7
LP
1727 r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target);
1728 if (r < 0) {
4104970e 1729 log_emergency("Failed to load rescue target: %s", bus_error_message(&error, r));
cb6531be 1730 error_message = "Failed to load rescue target";
a16e1123 1731 goto finish;
11ddb6f4 1732 } else if (target->load_state == UNIT_ERROR || target->load_state == UNIT_NOT_FOUND) {
c33b3297 1733 log_emergency_errno(target->load_error, "Failed to load rescue target: %m");
cb6531be 1734 error_message = "Failed to load rescue target";
1c27d3f3 1735 goto finish;
ac155bb8 1736 } else if (target->load_state == UNIT_MASKED) {
4104970e 1737 log_emergency("Rescue target masked.");
cb6531be 1738 error_message = "Rescue target masked";
00dc5d76 1739 goto finish;
a16e1123
LP
1740 }
1741 }
37d88da7 1742
ac155bb8 1743 assert(target->load_state == UNIT_LOADED);
00dc5d76 1744
fa0f4d8a 1745 if (arg_action == ACTION_TEST) {
40d50879 1746 printf("-> By units:\n");
a16e1123
LP
1747 manager_dump_units(m, stdout, "\t");
1748 }
1749
4bd29fe5 1750 r = manager_add_job(m, JOB_START, target, JOB_ISOLATE, &error, &default_unit_job);
ab17a050 1751 if (r == -EPERM) {
718db961 1752 log_debug("Default target could not be isolated, starting instead: %s", bus_error_message(&error, r));
ab17a050 1753
5022ce71
LP
1754 sd_bus_error_free(&error);
1755
4bd29fe5 1756 r = manager_add_job(m, JOB_START, target, JOB_REPLACE, &error, &default_unit_job);
ab17a050 1757 if (r < 0) {
4104970e 1758 log_emergency("Failed to start default target: %s", bus_error_message(&error, r));
cb6531be 1759 error_message = "Failed to start default target";
ab17a050
LP
1760 goto finish;
1761 }
1762 } else if (r < 0) {
4104970e 1763 log_emergency("Failed to isolate default target: %s", bus_error_message(&error, r));
cb6531be 1764 error_message = "Failed to isolate default target";
37d88da7
LP
1765 goto finish;
1766 }
ab17a050 1767
bacbccb7 1768 m->default_unit_job_id = default_unit_job->id;
60918275 1769
07672f49
LP
1770 after_startup = now(CLOCK_MONOTONIC);
1771 log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG,
1772 "Loaded units and determined initial transaction in %s.",
fdb14b7e 1773 format_timespan(timespan, sizeof(timespan), after_startup - before_startup, 100 * USEC_PER_MSEC));
07672f49 1774
fa0f4d8a 1775 if (arg_action == ACTION_TEST) {
40d50879 1776 printf("-> By jobs:\n");
a16e1123 1777 manager_dump_jobs(m, stdout, "\t");
22f4096c 1778 retval = EXIT_SUCCESS;
a16e1123
LP
1779 goto finish;
1780 }
e965d56d 1781 }
d46de8a1 1782
a16e1123 1783 for (;;) {
e96d6be7
LP
1784 r = manager_loop(m);
1785 if (r < 0) {
da927ba9 1786 log_emergency_errno(r, "Failed to run main loop: %m");
cb6531be 1787 error_message = "Failed to run main loop";
a16e1123
LP
1788 goto finish;
1789 }
11dd41ce 1790
a16e1123 1791 switch (m->exit_code) {
e965d56d 1792
a16e1123 1793 case MANAGER_RELOAD:
e015090f 1794 log_info("Reloading.");
06af2a04
TB
1795
1796 r = parse_config_file();
1797 if (r < 0)
1798 log_error("Failed to parse config file.");
1799
1800 manager_set_defaults(m);
1801
e96d6be7
LP
1802 r = manager_reload(m);
1803 if (r < 0)
da927ba9 1804 log_error_errno(r, "Failed to reload: %m");
a16e1123 1805 break;
cea8e32e 1806
a16e1123 1807 case MANAGER_REEXECUTE:
664f88a7 1808
cb6531be 1809 if (prepare_reexecute(m, &arg_serialization, &fds, false) < 0) {
6b9af963 1810 error_message = "Failed to prepare for reexecution";
a16e1123 1811 goto finish;
cb6531be 1812 }
60918275 1813
a16e1123 1814 reexecute = true;
e015090f 1815 log_notice("Reexecuting.");
a16e1123
LP
1816 goto finish;
1817
664f88a7
LP
1818 case MANAGER_SWITCH_ROOT:
1819 /* Steal the switch root parameters */
41669317 1820 switch_root_dir = m->switch_root;
664f88a7
LP
1821 switch_root_init = m->switch_root_init;
1822 m->switch_root = m->switch_root_init = NULL;
1823
1824 if (!switch_root_init)
cb6531be 1825 if (prepare_reexecute(m, &arg_serialization, &fds, true) < 0) {
6b9af963 1826 error_message = "Failed to prepare for reexecution";
664f88a7 1827 goto finish;
cb6531be 1828 }
664f88a7
LP
1829
1830 reexecute = true;
1831 log_notice("Switching root.");
1832 goto finish;
1833
287419c1 1834 case MANAGER_EXIT:
97792515
LP
1835 retval = m->return_value;
1836
8ebfe0cb 1837 if (m->running_as == MANAGER_USER) {
8ebfe0cb
DH
1838 log_debug("Exit.");
1839 goto finish;
1840 }
1841
1842 /* fallthrough */
b9080b03
FF
1843 case MANAGER_REBOOT:
1844 case MANAGER_POWEROFF:
1845 case MANAGER_HALT:
1846 case MANAGER_KEXEC: {
1847 static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
287419c1 1848 [MANAGER_EXIT] = "exit",
b9080b03
FF
1849 [MANAGER_REBOOT] = "reboot",
1850 [MANAGER_POWEROFF] = "poweroff",
1851 [MANAGER_HALT] = "halt",
1852 [MANAGER_KEXEC] = "kexec"
1853 };
1854
1855 assert_se(shutdown_verb = table[m->exit_code]);
e96d6be7 1856 arm_reboot_watchdog = m->exit_code == MANAGER_REBOOT;
b9080b03
FF
1857
1858 log_notice("Shutting down.");
1859 goto finish;
1860 }
1861
a16e1123
LP
1862 default:
1863 assert_not_reached("Unknown exit code.");
1864 }
1865 }
f170852a 1866
60918275 1867finish:
b87c2aa6
ZJS
1868 pager_close();
1869
97792515 1870 if (m)
81f5fc2d 1871 arg_shutdown_watchdog = m->shutdown_watchdog;
fe382237 1872
06d8d842 1873 m = manager_free(m);
60918275 1874
1f6b4113 1875 for (j = 0; j < ELEMENTSOF(arg_default_rlimit); j++)
a1e58e8e 1876 arg_default_rlimit[j] = mfree(arg_default_rlimit[j]);
c93ff2e9 1877
97b11eed 1878 arg_default_unit = mfree(arg_default_unit);
fe382237 1879 arg_join_controllers = strv_free_free(arg_join_controllers);
97b11eed 1880 arg_default_environment = strv_free(arg_default_environment);
525d3cc7 1881 arg_syscall_archs = set_free(arg_syscall_archs);
d3b1c508 1882
cc56fafe 1883 mac_selinux_finish();
b2bb3dbe 1884
a16e1123 1885 if (reexecute) {
664f88a7 1886 const char **args;
e564a982 1887 unsigned i, args_size;
a16e1123 1888
664f88a7
LP
1889 /* Close and disarm the watchdog, so that the new
1890 * instance can reinitialize it, but doesn't get
1891 * rebooted while we do that */
1892 watchdog_close(true);
a16e1123 1893
4096d6f5
LP
1894 /* Reset the RLIMIT_NOFILE to the kernel default, so
1895 * that the new systemd can pass the kernel default to
1896 * its child processes */
1897 if (saved_rlimit_nofile.rlim_cur > 0)
92ca4cac 1898 (void) setrlimit(RLIMIT_NOFILE, &saved_rlimit_nofile);
4096d6f5 1899
41669317 1900 if (switch_root_dir) {
cee530bb
LP
1901 /* Kill all remaining processes from the
1902 * initrd, but don't wait for them, so that we
1903 * can handle the SIGCHLD for them after
1904 * deserializing. */
0bee65f0 1905 broadcast_signal(SIGTERM, false, true);
bd3fa1d2 1906
5a4bf02f
HH
1907 /* And switch root with MS_MOVE, because we remove the old directory afterwards and detach it. */
1908 r = switch_root(switch_root_dir, "/mnt", true, MS_MOVE);
41669317 1909 if (r < 0)
da927ba9 1910 log_error_errno(r, "Failed to switch root, trying to continue: %m");
41669317 1911 }
a16e1123 1912
d03bc1b8 1913 args_size = MAX(6, argc+1);
e564a982 1914 args = newa(const char*, args_size);
a16e1123 1915
664f88a7 1916 if (!switch_root_init) {
5ffa8c81 1917 char sfd[DECIMAL_STR_MAX(int) + 1];
a16e1123 1918
664f88a7
LP
1919 /* First try to spawn ourselves with the right
1920 * path, and with full serialization. We do
1921 * this only if the user didn't specify an
1922 * explicit init to spawn. */
edb9aaa8 1923
d3b1c508 1924 assert(arg_serialization);
664f88a7 1925 assert(fds);
edb9aaa8 1926
5ffa8c81 1927 xsprintf(sfd, "%i", fileno(arg_serialization));
edb9aaa8 1928
664f88a7
LP
1929 i = 0;
1930 args[i++] = SYSTEMD_BINARY_PATH;
41669317 1931 if (switch_root_dir)
2660882b 1932 args[i++] = "--switched-root";
b2c23da8 1933 args[i++] = arg_running_as == MANAGER_SYSTEM ? "--system" : "--user";
664f88a7
LP
1934 args[i++] = "--deserialize";
1935 args[i++] = sfd;
1936 args[i++] = NULL;
edb9aaa8 1937
ce8aba56
KS
1938 /* do not pass along the environment we inherit from the kernel or initrd */
1939 if (switch_root_dir)
92ca4cac 1940 (void) clearenv();
ce8aba56 1941
e564a982 1942 assert(i <= args_size);
92ca4cac 1943 (void) execv(args[0], (char* const*) args);
664f88a7 1944 }
6e98720f 1945
664f88a7
LP
1946 /* Try the fallback, if there is any, without any
1947 * serialization. We pass the original argv[] and
1948 * envp[]. (Well, modulo the ordering changes due to
1949 * getopt() in argv[], and some cleanups in envp[],
1950 * but let's hope that doesn't matter.) */
a16e1123 1951
74ca738f 1952 arg_serialization = safe_fclose(arg_serialization);
2feceb5e 1953 fds = fdset_free(fds);
a16e1123 1954
a504223d 1955 /* Reopen the console */
92ca4cac 1956 (void) make_console_stdio();
a504223d 1957
d3b1c508 1958 for (j = 1, i = 1; j < (unsigned) argc; j++)
664f88a7 1959 args[i++] = argv[j];
a16e1123 1960 args[i++] = NULL;
e564a982 1961 assert(i <= args_size);
b8f83232 1962
1b6d7fa7 1963 /* Reenable any blocked signals, especially important
5a85ca1c 1964 * if we switch from initial ramdisk to init=... */
ce30c8dc
LP
1965 (void) reset_all_signal_handlers();
1966 (void) reset_signal_mask();
5a85ca1c 1967
b8f83232
LP
1968 if (switch_root_init) {
1969 args[0] = switch_root_init;
92ca4cac 1970 (void) execv(args[0], (char* const*) args);
56f64d95 1971 log_warning_errno(errno, "Failed to execute configured init, trying fallback: %m");
b8f83232
LP
1972 }
1973
1974 args[0] = "/sbin/init";
92ca4cac 1975 (void) execv(args[0], (char* const*) args);
a16e1123 1976
745e2fb7
KS
1977 if (errno == ENOENT) {
1978 log_warning("No /sbin/init, trying fallback");
b8f83232 1979
745e2fb7
KS
1980 args[0] = "/bin/sh";
1981 args[1] = NULL;
92ca4cac 1982 (void) execv(args[0], (char* const*) args);
56f64d95 1983 log_error_errno(errno, "Failed to execute /bin/sh, giving up: %m");
745e2fb7 1984 } else
56f64d95 1985 log_warning_errno(errno, "Failed to execute /sbin/init, giving up: %m");
a16e1123
LP
1986 }
1987
74ca738f 1988 arg_serialization = safe_fclose(arg_serialization);
2feceb5e 1989 fds = fdset_free(fds);
a16e1123 1990
54b434b1
LP
1991#ifdef HAVE_VALGRIND_VALGRIND_H
1992 /* If we are PID 1 and running under valgrind, then let's exit
1993 * here explicitly. valgrind will only generate nice output on
1994 * exit(), not on exec(), hence let's do the former not the
1995 * latter here. */
1996 if (getpid() == 1 && RUNNING_ON_VALGRIND)
1997 return 0;
1998#endif
1999
b9080b03 2000 if (shutdown_verb) {
b1e90ec5 2001 char log_level[DECIMAL_STR_MAX(int) + 1];
287419c1
AC
2002 char exit_code[DECIMAL_STR_MAX(uint8_t) + 1];
2003 const char* command_line[11] = {
b9080b03
FF
2004 SYSTEMD_SHUTDOWN_BINARY_PATH,
2005 shutdown_verb,
b1e90ec5
ZJS
2006 "--log-level", log_level,
2007 "--log-target",
b9080b03 2008 };
b1e90ec5 2009 unsigned pos = 5;
e3e45d4f 2010 _cleanup_strv_free_ char **env_block = NULL;
15bd5aee
LP
2011
2012 assert(command_line[pos] == NULL);
e3e45d4f 2013 env_block = strv_copy(environ);
b9080b03 2014
5ffa8c81 2015 xsprintf(log_level, "%d", log_get_max_level());
b1e90ec5
ZJS
2016
2017 switch (log_get_target()) {
92ca4cac 2018
b1e90ec5
ZJS
2019 case LOG_TARGET_KMSG:
2020 case LOG_TARGET_JOURNAL_OR_KMSG:
2021 case LOG_TARGET_SYSLOG_OR_KMSG:
2022 command_line[pos++] = "kmsg";
2023 break;
2024
10f00ff1
ILG
2025 case LOG_TARGET_NULL:
2026 command_line[pos++] = "null";
2027 break;
2028
b1e90ec5
ZJS
2029 case LOG_TARGET_CONSOLE:
2030 default:
2031 command_line[pos++] = "console";
2032 break;
2033 };
2034
2035 if (log_get_show_color())
2036 command_line[pos++] = "--log-color";
2037
2038 if (log_get_show_location())
2039 command_line[pos++] = "--log-location";
2040
287419c1
AC
2041 if (streq(shutdown_verb, "exit")) {
2042 command_line[pos++] = "--exit-code";
2043 command_line[pos++] = exit_code;
97792515 2044 xsprintf(exit_code, "%d", retval);
287419c1
AC
2045 }
2046
26abdc73 2047 assert(pos < ELEMENTSOF(command_line));
b1e90ec5 2048
e96d6be7 2049 if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) {
e3e45d4f 2050 char *e;
d18f337c 2051
e96d6be7
LP
2052 /* If we reboot let's set the shutdown
2053 * watchdog and tell the shutdown binary to
2054 * repeatedly ping it */
c2cc6b9a
LP
2055 r = watchdog_set_timeout(&arg_shutdown_watchdog);
2056 watchdog_close(r < 0);
e96d6be7 2057
e3e45d4f
SP
2058 /* Tell the binary how often to ping, ignore failure */
2059 if (asprintf(&e, "WATCHDOG_USEC="USEC_FMT, arg_shutdown_watchdog) > 0)
92ca4cac 2060 (void) strv_push(&env_block, e);
e3e45d4f 2061 } else
e96d6be7
LP
2062 watchdog_close(true);
2063
66713f77
LP
2064 /* Avoid the creation of new processes forked by the
2065 * kernel; at this point, we will not listen to the
2066 * signals anyway */
75f86906 2067 if (detect_container() <= 0)
e155a0aa 2068 (void) cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER);
ad929bcc 2069
d18f337c 2070 execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
56f64d95 2071 log_error_errno(errno, "Failed to execute shutdown binary, %s: %m",
b1e90ec5 2072 getpid() == 1 ? "freezing" : "quitting");
b9080b03
FF
2073 }
2074
cb6531be
ZJS
2075 if (getpid() == 1) {
2076 if (error_message)
2077 manager_status_printf(NULL, STATUS_TYPE_EMERGENCY,
1fc464f6 2078 ANSI_HIGHLIGHT_RED "!!!!!!" ANSI_NORMAL,
cb6531be 2079 "%s, freezing.", error_message);
b9e74c39 2080 freeze_or_reboot();
cb6531be 2081 }
c3b3c274 2082
60918275
LP
2083 return retval;
2084}