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