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