]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/main.c
tests: more tests
[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
ea430986
LP
22#include <dbus/dbus.h>
23
60918275
LP
24#include <stdio.h>
25#include <errno.h>
26#include <string.h>
16354eff 27#include <unistd.h>
4ade7963
LP
28#include <sys/types.h>
29#include <sys/stat.h>
f170852a 30#include <getopt.h>
97c4f35c 31#include <signal.h>
4fc935ca 32#include <sys/wait.h>
80876c20 33#include <fcntl.h>
f3b6a3ed 34#include <sys/prctl.h>
664f88a7 35#include <sys/mount.h>
60918275
LP
36
37#include "manager.h"
16354eff 38#include "log.h"
302e8c4c 39#include "load-fragment.h"
a16e1123 40#include "fdset.h"
514f4ef5 41#include "special.h"
487393e9 42#include "conf-parser.h"
398ef8ba 43#include "bus-errors.h"
ad780f19 44#include "missing.h"
e51bc1a2 45#include "label.h"
302e27c8 46#include "build.h"
06d4c99a 47#include "strv.h"
f6a6225e 48#include "def.h"
b52aae1d 49#include "virt.h"
e96d6be7 50#include "watchdog.h"
664f88a7 51#include "path-util.h"
41669317 52#include "switch-root.h"
ec8927ca 53#include "capability.h"
bd3fa1d2 54#include "killall.h"
60918275 55
b6e66135
LP
56#include "mount-setup.h"
57#include "loopback-setup.h"
e3043162 58#ifdef HAVE_KMOD
b6e66135 59#include "kmod-setup.h"
e3043162 60#endif
b6e66135
LP
61#include "hostname-setup.h"
62#include "machine-id-setup.h"
63#include "locale-setup.h"
bbc98d32 64#include "hwclock.h"
b6e66135
LP
65#include "selinux-setup.h"
66#include "ima-setup.h"
6bae23a0 67#include "sd-daemon.h"
b6e66135 68
f170852a
LP
69static enum {
70 ACTION_RUN,
e965d56d 71 ACTION_HELP,
9ba0bc4e 72 ACTION_VERSION,
e537352b 73 ACTION_TEST,
4288f619
LP
74 ACTION_DUMP_CONFIGURATION_ITEMS,
75 ACTION_DONE
fa0f4d8a 76} arg_action = ACTION_RUN;
f170852a 77
fa0f4d8a 78static char *arg_default_unit = NULL;
67445f4e 79static SystemdRunningAs arg_running_as = _SYSTEMD_RUNNING_AS_INVALID;
fa0f4d8a
LP
80
81static bool arg_dump_core = true;
82static bool arg_crash_shell = false;
83static int arg_crash_chvt = -1;
84static bool arg_confirm_spawn = false;
9e58ff9c 85static bool arg_show_status = true;
bf4df7c3 86static bool arg_switched_root = false;
06d4c99a 87static char **arg_default_controllers = NULL;
0c85a4f3 88static char ***arg_join_controllers = NULL;
706343f4 89static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
0a494f1f 90static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
e96d6be7
LP
91static usec_t arg_runtime_watchdog = 0;
92static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
c93ff2e9 93static struct rlimit *arg_default_rlimit[RLIMIT_NLIMITS] = {};
ec8927ca 94static uint64_t arg_capability_bounding_set_drop = 0;
aa0f64ac 95static nsec_t arg_timer_slack_nsec = (nsec_t) -1;
4fc935ca 96
a16e1123 97static FILE* serialization = NULL;
80876c20 98
6f5e3f35
LP
99static void nop_handler(int sig) {
100}
101
93a46b0b 102_noreturn_ static void crash(int sig) {
97c4f35c 103
fa0f4d8a 104 if (!arg_dump_core)
582a507f 105 log_error("Caught <%s>, not dumping core.", signal_to_string(sig));
97c4f35c 106 else {
6f5e3f35 107 struct sigaction sa;
97c4f35c
LP
108 pid_t pid;
109
6f5e3f35
LP
110 /* We want to wait for the core process, hence let's enable SIGCHLD */
111 zero(sa);
112 sa.sa_handler = nop_handler;
113 sa.sa_flags = SA_NOCLDSTOP|SA_RESTART;
114 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
115
97c4f35c 116 if ((pid = fork()) < 0)
582a507f 117 log_error("Caught <%s>, cannot fork for core dump: %s", signal_to_string(sig), strerror(errno));
97c4f35c
LP
118
119 else if (pid == 0) {
97c4f35c
LP
120 struct rlimit rl;
121
122 /* Enable default signal handler for core dump */
123 zero(sa);
124 sa.sa_handler = SIG_DFL;
125 assert_se(sigaction(sig, &sa, NULL) == 0);
126
127 /* Don't limit the core dump size */
128 zero(rl);
129 rl.rlim_cur = RLIM_INFINITY;
130 rl.rlim_max = RLIM_INFINITY;
131 setrlimit(RLIMIT_CORE, &rl);
132
133 /* Just to be sure... */
134 assert_se(chdir("/") == 0);
135
136 /* Raise the signal again */
137 raise(sig);
138
139 assert_not_reached("We shouldn't be here...");
140 _exit(1);
4fc935ca
LP
141
142 } else {
8e12a6ae
LP
143 siginfo_t status;
144 int r;
4fc935ca
LP
145
146 /* Order things nicely. */
8e12a6ae
LP
147 if ((r = wait_for_terminate(pid, &status)) < 0)
148 log_error("Caught <%s>, waitpid() failed: %s", signal_to_string(sig), strerror(-r));
149 else if (status.si_code != CLD_DUMPED)
582a507f 150 log_error("Caught <%s>, core dump failed.", signal_to_string(sig));
4fc935ca 151 else
582a507f 152 log_error("Caught <%s>, dumped core as pid %lu.", signal_to_string(sig), (unsigned long) pid);
97c4f35c
LP
153 }
154 }
155
fa0f4d8a
LP
156 if (arg_crash_chvt)
157 chvt(arg_crash_chvt);
601f6a1e 158
fa0f4d8a 159 if (arg_crash_shell) {
6f5e3f35
LP
160 struct sigaction sa;
161 pid_t pid;
8c43883a 162
4fc935ca
LP
163 log_info("Executing crash shell in 10s...");
164 sleep(10);
165
6f5e3f35
LP
166 /* Let the kernel reap children for us */
167 zero(sa);
168 sa.sa_handler = SIG_IGN;
169 sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART;
170 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
8c43883a 171
cd3bd60a
LP
172 pid = fork();
173 if (pid < 0)
14212119 174 log_error("Failed to fork off crash shell: %m");
6f5e3f35 175 else if (pid == 0) {
cd3bd60a 176 make_console_stdio();
6f5e3f35
LP
177 execl("/bin/sh", "/bin/sh", NULL);
178
14212119 179 log_error("execl() failed: %m");
6f5e3f35
LP
180 _exit(1);
181 }
c99b188e 182
f8e08a77 183 log_info("Successfully spawned crash shell as pid %lu.", (unsigned long) pid);
4fc935ca
LP
184 }
185
186 log_info("Freezing execution.");
97c4f35c
LP
187 freeze();
188}
189
190static void install_crash_handler(void) {
191 struct sigaction sa;
192
193 zero(sa);
194
195 sa.sa_handler = crash;
196 sa.sa_flags = SA_NODEFER;
197
1b91d3e8 198 sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
97c4f35c 199}
f170852a 200
843d2643
LP
201static int console_setup(bool do_reset) {
202 int tty_fd, r;
80876c20 203
843d2643
LP
204 /* If we are init, we connect stdin/stdout/stderr to /dev/null
205 * and make sure we don't have a controlling tty. */
80876c20 206
843d2643
LP
207 release_terminal();
208
209 if (!do_reset)
210 return 0;
80876c20 211
512947d4
MS
212 tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
213 if (tty_fd < 0) {
843d2643
LP
214 log_error("Failed to open /dev/console: %s", strerror(-tty_fd));
215 return -tty_fd;
216 }
80876c20 217
512947d4
MS
218 /* We don't want to force text mode.
219 * plymouth may be showing pictures already from initrd. */
220 r = reset_terminal_fd(tty_fd, false);
221 if (r < 0)
843d2643
LP
222 log_error("Failed to reset /dev/console: %s", strerror(-r));
223
224 close_nointr_nofail(tty_fd);
80876c20
LP
225 return r;
226}
227
f170852a
LP
228static int set_default_unit(const char *u) {
229 char *c;
230
231 assert(u);
232
bf4df7c3
LP
233 c = strdup(u);
234 if (!c)
f170852a
LP
235 return -ENOMEM;
236
fa0f4d8a
LP
237 free(arg_default_unit);
238 arg_default_unit = c;
bf4df7c3 239
f170852a
LP
240 return 0;
241}
242
243static int parse_proc_cmdline_word(const char *word) {
244
245 static const char * const rlmap[] = {
ed370f5d 246 "emergency", SPECIAL_EMERGENCY_TARGET,
099663ff 247 "-b", SPECIAL_EMERGENCY_TARGET,
ed370f5d
LP
248 "single", SPECIAL_RESCUE_TARGET,
249 "-s", SPECIAL_RESCUE_TARGET,
250 "s", SPECIAL_RESCUE_TARGET,
251 "S", SPECIAL_RESCUE_TARGET,
252 "1", SPECIAL_RESCUE_TARGET,
253 "2", SPECIAL_RUNLEVEL2_TARGET,
254 "3", SPECIAL_RUNLEVEL3_TARGET,
255 "4", SPECIAL_RUNLEVEL4_TARGET,
256 "5", SPECIAL_RUNLEVEL5_TARGET,
f170852a
LP
257 };
258
5192bd19
LP
259 assert(word);
260
bf4df7c3
LP
261 if (startswith(word, "systemd.unit=")) {
262
263 if (!in_initrd())
264 return set_default_unit(word + 13);
265
266 } else if (startswith(word, "rd.systemd.unit=")) {
267
268 if (in_initrd())
269 return set_default_unit(word + 16);
f170852a 270
bf4df7c3 271 } else if (startswith(word, "systemd.log_target=")) {
f170852a
LP
272
273 if (log_set_target_from_string(word + 19) < 0)
274 log_warning("Failed to parse log target %s. Ignoring.", word + 19);
275
276 } else if (startswith(word, "systemd.log_level=")) {
277
278 if (log_set_max_level_from_string(word + 18) < 0)
279 log_warning("Failed to parse log level %s. Ignoring.", word + 18);
280
bbe63281
LP
281 } else if (startswith(word, "systemd.log_color=")) {
282
283 if (log_show_color_from_string(word + 18) < 0)
284 log_warning("Failed to parse log color setting %s. Ignoring.", word + 18);
285
286 } else if (startswith(word, "systemd.log_location=")) {
287
288 if (log_show_location_from_string(word + 21) < 0)
289 log_warning("Failed to parse log location setting %s. Ignoring.", word + 21);
290
4fc935ca
LP
291 } else if (startswith(word, "systemd.dump_core=")) {
292 int r;
293
294 if ((r = parse_boolean(word + 18)) < 0)
509b6efb 295 log_warning("Failed to parse dump core switch %s. Ignoring.", word + 18);
4fc935ca 296 else
fa0f4d8a 297 arg_dump_core = r;
4fc935ca
LP
298
299 } else if (startswith(word, "systemd.crash_shell=")) {
300 int r;
301
302 if ((r = parse_boolean(word + 20)) < 0)
509b6efb 303 log_warning("Failed to parse crash shell switch %s. Ignoring.", word + 20);
4fc935ca 304 else
fa0f4d8a 305 arg_crash_shell = r;
5e7ee61c
LP
306
307 } else if (startswith(word, "systemd.confirm_spawn=")) {
308 int r;
309
310 if ((r = parse_boolean(word + 22)) < 0)
509b6efb 311 log_warning("Failed to parse confirm spawn switch %s. Ignoring.", word + 22);
5e7ee61c 312 else
fa0f4d8a 313 arg_confirm_spawn = r;
5e7ee61c 314
601f6a1e
LP
315 } else if (startswith(word, "systemd.crash_chvt=")) {
316 int k;
317
318 if (safe_atoi(word + 19, &k) < 0)
509b6efb 319 log_warning("Failed to parse crash chvt switch %s. Ignoring.", word + 19);
601f6a1e 320 else
fa0f4d8a 321 arg_crash_chvt = k;
601f6a1e 322
9e58ff9c
LP
323 } else if (startswith(word, "systemd.show_status=")) {
324 int r;
325
326 if ((r = parse_boolean(word + 20)) < 0)
509b6efb 327 log_warning("Failed to parse show status switch %s. Ignoring.", word + 20);
6e98720f 328 else
9e58ff9c 329 arg_show_status = r;
0a494f1f
LP
330 } else if (startswith(word, "systemd.default_standard_output=")) {
331 int r;
332
333 if ((r = exec_output_from_string(word + 32)) < 0)
509b6efb 334 log_warning("Failed to parse default standard output switch %s. Ignoring.", word + 32);
0a494f1f
LP
335 else
336 arg_default_std_output = r;
337 } else if (startswith(word, "systemd.default_standard_error=")) {
338 int r;
339
340 if ((r = exec_output_from_string(word + 31)) < 0)
509b6efb 341 log_warning("Failed to parse default standard error switch %s. Ignoring.", word + 31);
0a494f1f
LP
342 else
343 arg_default_std_error = r;
9e7c5357
WD
344 } else if (startswith(word, "systemd.setenv=")) {
345 char *cenv, *eq;
346 int r;
347
348 cenv = strdup(word + 15);
349 if (!cenv)
350 return -ENOMEM;
351
352 eq = strchr(cenv, '=');
353 if (!eq) {
354 r = unsetenv(cenv);
355 if (r < 0)
14212119 356 log_warning("unsetenv failed %m. Ignoring.");
9e7c5357
WD
357 } else {
358 *eq = 0;
359 r = setenv(cenv, eq + 1, 1);
360 if (r < 0)
14212119 361 log_warning("setenv failed %m. Ignoring.");
9e7c5357
WD
362 }
363 free(cenv);
9e58ff9c 364
66a78c2b
LP
365 } else if (startswith(word, "systemd.") ||
366 (in_initrd() && startswith(word, "rd.systemd."))) {
4fc935ca
LP
367
368 log_warning("Unknown kernel switch %s. Ignoring.", word);
369
bbe63281
LP
370 log_info("Supported kernel switches:\n"
371 "systemd.unit=UNIT Default unit to start\n"
bf4df7c3 372 "rd.systemd.unit=UNIT Default unit to start when run in initrd\n"
bbe63281 373 "systemd.dump_core=0|1 Dump core on crash\n"
9e58ff9c 374 "systemd.crash_shell=0|1 Run shell on crash\n"
bbe63281 375 "systemd.crash_chvt=N Change to VT #N on crash\n"
9e58ff9c 376 "systemd.confirm_spawn=0|1 Confirm every process spawn\n"
6e98720f 377 "systemd.show_status=0|1 Show status updates on the console during bootup\n"
4cfa2c99 378 "systemd.log_target=console|kmsg|journal|journal-or-kmsg|syslog|syslog-or-kmsg|null\n"
6e98720f
LP
379 " Log target\n"
380 "systemd.log_level=LEVEL Log level\n"
381 "systemd.log_color=0|1 Highlight important log messages\n"
0a494f1f 382 "systemd.log_location=0|1 Include code location in log messages\n"
706343f4 383 "systemd.default_standard_output=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
0a494f1f 384 " Set default log output for services\n"
706343f4 385 "systemd.default_standard_error=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
c66e7bc7
LP
386 " Set default log error output for services\n"
387 "systemd.setenv=ASSIGNMENT Set an environment variable for all spawned processes\n");
4fc935ca 388
d081dffb 389 } else if (streq(word, "quiet"))
6e98720f 390 arg_show_status = false;
d081dffb 391 else if (!in_initrd()) {
f170852a
LP
392 unsigned i;
393
394 /* SysV compatibility */
f170852a
LP
395 for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
396 if (streq(word, rlmap[i]))
397 return set_default_unit(rlmap[i+1]);
398 }
399
400 return 0;
401}
402
f975e971 403static int config_parse_level2(
487393e9
LP
404 const char *filename,
405 unsigned line,
406 const char *section,
407 const char *lvalue,
3731f1ea 408 int ltype,
487393e9
LP
409 const char *rvalue,
410 void *data,
411 void *userdata) {
412
413 assert(filename);
414 assert(lvalue);
415 assert(rvalue);
416
417 log_set_max_level_from_string(rvalue);
418 return 0;
419}
420
421static int config_parse_target(
422 const char *filename,
423 unsigned line,
424 const char *section,
425 const char *lvalue,
3731f1ea 426 int ltype,
487393e9
LP
427 const char *rvalue,
428 void *data,
429 void *userdata) {
430
431 assert(filename);
432 assert(lvalue);
433 assert(rvalue);
434
435 log_set_target_from_string(rvalue);
436 return 0;
437}
438
439static int config_parse_color(
440 const char *filename,
441 unsigned line,
442 const char *section,
443 const char *lvalue,
3731f1ea 444 int ltype,
487393e9
LP
445 const char *rvalue,
446 void *data,
447 void *userdata) {
448
449 assert(filename);
450 assert(lvalue);
451 assert(rvalue);
452
453 log_show_color_from_string(rvalue);
454 return 0;
455}
456
457static int config_parse_location(
458 const char *filename,
459 unsigned line,
460 const char *section,
461 const char *lvalue,
3731f1ea 462 int ltype,
487393e9
LP
463 const char *rvalue,
464 void *data,
465 void *userdata) {
466
467 assert(filename);
468 assert(lvalue);
469 assert(rvalue);
470
471 log_show_location_from_string(rvalue);
472 return 0;
473}
474
f975e971 475static int config_parse_cpu_affinity2(
487393e9
LP
476 const char *filename,
477 unsigned line,
478 const char *section,
479 const char *lvalue,
3731f1ea 480 int ltype,
487393e9
LP
481 const char *rvalue,
482 void *data,
483 void *userdata) {
484
485 char *w;
486 size_t l;
487 char *state;
488 cpu_set_t *c = NULL;
489 unsigned ncpus = 0;
490
491 assert(filename);
492 assert(lvalue);
493 assert(rvalue);
494
f60f22df 495 FOREACH_WORD_QUOTED(w, l, rvalue, state) {
487393e9
LP
496 char *t;
497 int r;
498 unsigned cpu;
499
500 if (!(t = strndup(w, l)))
14212119 501 return log_oom();
487393e9
LP
502
503 r = safe_atou(t, &cpu);
504 free(t);
505
506 if (!c)
507 if (!(c = cpu_set_malloc(&ncpus)))
14212119 508 return log_oom();
487393e9
LP
509
510 if (r < 0 || cpu >= ncpus) {
511 log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue);
512 CPU_FREE(c);
513 return -EBADMSG;
514 }
515
516 CPU_SET_S(cpu, CPU_ALLOC_SIZE(ncpus), c);
517 }
518
519 if (c) {
520 if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
521 log_warning("Failed to set CPU affinity: %m");
522
523 CPU_FREE(c);
524 }
525
526 return 0;
527}
528
0c85a4f3
LP
529static void strv_free_free(char ***l) {
530 char ***i;
531
532 if (!l)
533 return;
534
535 for (i = l; *i; i++)
536 strv_free(*i);
537
538 free(l);
539}
540
541static void free_join_controllers(void) {
542 if (!arg_join_controllers)
543 return;
544
545 strv_free_free(arg_join_controllers);
546 arg_join_controllers = NULL;
547}
548
549static int config_parse_join_controllers(
550 const char *filename,
551 unsigned line,
552 const char *section,
553 const char *lvalue,
554 int ltype,
555 const char *rvalue,
556 void *data,
557 void *userdata) {
558
559 unsigned n = 0;
560 char *state, *w;
561 size_t length;
562
563 assert(filename);
564 assert(lvalue);
565 assert(rvalue);
566
567 free_join_controllers();
568
569 FOREACH_WORD_QUOTED(w, length, rvalue, state) {
570 char *s, **l;
571
572 s = strndup(w, length);
573 if (!s)
14212119 574 return log_oom();
0c85a4f3
LP
575
576 l = strv_split(s, ",");
577 free(s);
578
579 strv_uniq(l);
580
581 if (strv_length(l) <= 1) {
582 strv_free(l);
583 continue;
584 }
585
586 if (!arg_join_controllers) {
587 arg_join_controllers = new(char**, 2);
588 if (!arg_join_controllers) {
589 strv_free(l);
14212119 590 return log_oom();
0c85a4f3
LP
591 }
592
593 arg_join_controllers[0] = l;
594 arg_join_controllers[1] = NULL;
595
596 n = 1;
597 } else {
598 char ***a;
599 char ***t;
600
601 t = new0(char**, n+2);
602 if (!t) {
603 strv_free(l);
14212119 604 return log_oom();
0c85a4f3
LP
605 }
606
607 n = 0;
608
609 for (a = arg_join_controllers; *a; a++) {
610
611 if (strv_overlap(*a, l)) {
612 char **c;
613
614 c = strv_merge(*a, l);
615 if (!c) {
616 strv_free(l);
617 strv_free_free(t);
14212119 618 return log_oom();
0c85a4f3
LP
619 }
620
621 strv_free(l);
622 l = c;
623 } else {
624 char **c;
625
626 c = strv_copy(*a);
627 if (!c) {
628 strv_free(l);
629 strv_free_free(t);
14212119 630 return log_oom();
0c85a4f3
LP
631 }
632
633 t[n++] = c;
634 }
635 }
636
637 t[n++] = strv_uniq(l);
638
639 strv_free_free(arg_join_controllers);
640 arg_join_controllers = t;
641 }
642 }
643
644 return 0;
645}
646
487393e9
LP
647static int parse_config_file(void) {
648
f975e971
LP
649 const ConfigTableItem items[] = {
650 { "Manager", "LogLevel", config_parse_level2, 0, NULL },
651 { "Manager", "LogTarget", config_parse_target, 0, NULL },
652 { "Manager", "LogColor", config_parse_color, 0, NULL },
653 { "Manager", "LogLocation", config_parse_location, 0, NULL },
654 { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
655 { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
656 { "Manager", "ShowStatus", config_parse_bool, 0, &arg_show_status },
f975e971
LP
657 { "Manager", "CrashChVT", config_parse_int, 0, &arg_crash_chvt },
658 { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
f975e971
LP
659 { "Manager", "DefaultControllers", config_parse_strv, 0, &arg_default_controllers },
660 { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
661 { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
0c85a4f3 662 { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
e96d6be7
LP
663 { "Manager", "RuntimeWatchdogSec", config_parse_usec, 0, &arg_runtime_watchdog },
664 { "Manager", "ShutdownWatchdogSec", config_parse_usec, 0, &arg_shutdown_watchdog },
ec8927ca 665 { "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
aa0f64ac 666 { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
c93ff2e9
FC
667 { "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU]},
668 { "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE]},
669 { "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA]},
670 { "Manager", "DefaultLimitSTACK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_STACK]},
671 { "Manager", "DefaultLimitCORE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CORE]},
672 { "Manager", "DefaultLimitRSS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RSS]},
673 { "Manager", "DefaultLimitNOFILE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NOFILE]},
674 { "Manager", "DefaultLimitAS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_AS]},
675 { "Manager", "DefaultLimitNPROC", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NPROC]},
676 { "Manager", "DefaultLimitMEMLOCK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MEMLOCK]},
677 { "Manager", "DefaultLimitLOCKS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_LOCKS]},
678 { "Manager", "DefaultLimitSIGPENDING",config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING]},
679 { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MSGQUEUE]},
680 { "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE]},
681 { "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO]},
682 { "Manager", "DefaultLimitRTTIME", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME]},
f975e971 683 { NULL, NULL, NULL, 0, NULL }
487393e9
LP
684 };
685
686 FILE *f;
687 const char *fn;
688 int r;
689
67445f4e 690 fn = arg_running_as == SYSTEMD_SYSTEM ? SYSTEM_CONFIG_FILE : USER_CONFIG_FILE;
f975e971
LP
691 f = fopen(fn, "re");
692 if (!f) {
487393e9
LP
693 if (errno == ENOENT)
694 return 0;
695
696 log_warning("Failed to open configuration file '%s': %m", fn);
697 return 0;
698 }
699
f975e971
LP
700 r = config_parse(fn, f, "Manager\0", config_item_table_lookup, (void*) items, false, NULL);
701 if (r < 0)
487393e9
LP
702 log_warning("Failed to parse configuration file: %s", strerror(-r));
703
704 fclose(f);
705
706 return 0;
707}
708
f170852a 709static int parse_proc_cmdline(void) {
52661efd 710 char *line, *w, *state;
f170852a 711 int r;
f170852a 712 size_t l;
f170852a 713
b770165a
LP
714 /* Don't read /proc/cmdline if we are in a container, since
715 * that is only relevant for the host system */
716 if (detect_container(NULL) > 0)
717 return 0;
718
f170852a 719 if ((r = read_one_line_file("/proc/cmdline", &line)) < 0) {
e364ad06 720 log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
f170852a
LP
721 return 0;
722 }
723
724 FOREACH_WORD_QUOTED(w, l, line, state) {
725 char *word;
726
727 if (!(word = strndup(w, l))) {
728 r = -ENOMEM;
729 goto finish;
730 }
731
732 r = parse_proc_cmdline_word(word);
14212119
SL
733 if (r < 0) {
734 log_error("Failed on cmdline argument %s: %s", word, strerror(-r));
032f8164 735 free(word);
f170852a 736 goto finish;
14212119 737 }
032f8164
LN
738
739 free(word);
f170852a
LP
740 }
741
742 r = 0;
743
744finish:
745 free(line);
746 return r;
747}
748
749static int parse_argv(int argc, char *argv[]) {
750
751 enum {
752 ARG_LOG_LEVEL = 0x100,
753 ARG_LOG_TARGET,
bbe63281
LP
754 ARG_LOG_COLOR,
755 ARG_LOG_LOCATION,
2f198e2f 756 ARG_UNIT,
edb9aaa8 757 ARG_SYSTEM,
af2d49f7 758 ARG_USER,
e537352b 759 ARG_TEST,
9ba0bc4e 760 ARG_VERSION,
80876c20 761 ARG_DUMP_CONFIGURATION_ITEMS,
9e58ff9c
LP
762 ARG_DUMP_CORE,
763 ARG_CRASH_SHELL,
a16e1123 764 ARG_CONFIRM_SPAWN,
9e58ff9c 765 ARG_SHOW_STATUS,
4288f619 766 ARG_DESERIALIZE,
2660882b 767 ARG_SWITCHED_ROOT,
0a494f1f
LP
768 ARG_INTROSPECT,
769 ARG_DEFAULT_STD_OUTPUT,
770 ARG_DEFAULT_STD_ERROR
f170852a
LP
771 };
772
773 static const struct option options[] = {
a16e1123
LP
774 { "log-level", required_argument, NULL, ARG_LOG_LEVEL },
775 { "log-target", required_argument, NULL, ARG_LOG_TARGET },
bbe63281
LP
776 { "log-color", optional_argument, NULL, ARG_LOG_COLOR },
777 { "log-location", optional_argument, NULL, ARG_LOG_LOCATION },
2f198e2f 778 { "unit", required_argument, NULL, ARG_UNIT },
edb9aaa8 779 { "system", no_argument, NULL, ARG_SYSTEM },
af2d49f7 780 { "user", no_argument, NULL, ARG_USER },
a16e1123
LP
781 { "test", no_argument, NULL, ARG_TEST },
782 { "help", no_argument, NULL, 'h' },
9ba0bc4e 783 { "version", no_argument, NULL, ARG_VERSION },
a16e1123 784 { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS },
a5d87bf0
LP
785 { "dump-core", optional_argument, NULL, ARG_DUMP_CORE },
786 { "crash-shell", optional_argument, NULL, ARG_CRASH_SHELL },
787 { "confirm-spawn", optional_argument, NULL, ARG_CONFIRM_SPAWN },
6e98720f 788 { "show-status", optional_argument, NULL, ARG_SHOW_STATUS },
a16e1123 789 { "deserialize", required_argument, NULL, ARG_DESERIALIZE },
2660882b 790 { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
4288f619 791 { "introspect", optional_argument, NULL, ARG_INTROSPECT },
0a494f1f
LP
792 { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
793 { "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
a16e1123 794 { NULL, 0, NULL, 0 }
f170852a
LP
795 };
796
797 int c, r;
798
799 assert(argc >= 1);
800 assert(argv);
801
b770165a
LP
802 if (getpid() == 1)
803 opterr = 0;
804
099663ff 805 while ((c = getopt_long(argc, argv, "hDbsz:", options, NULL)) >= 0)
f170852a
LP
806
807 switch (c) {
808
809 case ARG_LOG_LEVEL:
810 if ((r = log_set_max_level_from_string(optarg)) < 0) {
811 log_error("Failed to parse log level %s.", optarg);
812 return r;
813 }
814
815 break;
816
817 case ARG_LOG_TARGET:
818
819 if ((r = log_set_target_from_string(optarg)) < 0) {
820 log_error("Failed to parse log target %s.", optarg);
821 return r;
822 }
823
824 break;
825
bbe63281
LP
826 case ARG_LOG_COLOR:
827
d0b170c8
LP
828 if (optarg) {
829 if ((r = log_show_color_from_string(optarg)) < 0) {
830 log_error("Failed to parse log color setting %s.", optarg);
831 return r;
832 }
833 } else
834 log_show_color(true);
bbe63281
LP
835
836 break;
837
838 case ARG_LOG_LOCATION:
839
d0b170c8
LP
840 if (optarg) {
841 if ((r = log_show_location_from_string(optarg)) < 0) {
842 log_error("Failed to parse log location setting %s.", optarg);
843 return r;
844 }
845 } else
846 log_show_location(true);
bbe63281
LP
847
848 break;
849
0a494f1f
LP
850 case ARG_DEFAULT_STD_OUTPUT:
851
852 if ((r = exec_output_from_string(optarg)) < 0) {
853 log_error("Failed to parse default standard output setting %s.", optarg);
854 return r;
855 } else
856 arg_default_std_output = r;
857 break;
858
859 case ARG_DEFAULT_STD_ERROR:
860
861 if ((r = exec_output_from_string(optarg)) < 0) {
862 log_error("Failed to parse default standard error output setting %s.", optarg);
863 return r;
864 } else
865 arg_default_std_error = r;
866 break;
867
2f198e2f 868 case ARG_UNIT:
f170852a
LP
869
870 if ((r = set_default_unit(optarg)) < 0) {
871 log_error("Failed to set default unit %s: %s", optarg, strerror(-r));
872 return r;
873 }
874
875 break;
876
edb9aaa8 877 case ARG_SYSTEM:
67445f4e 878 arg_running_as = SYSTEMD_SYSTEM;
edb9aaa8 879 break;
a5dab5ce 880
af2d49f7 881 case ARG_USER:
67445f4e 882 arg_running_as = SYSTEMD_USER;
a5dab5ce 883 break;
a5dab5ce 884
e965d56d 885 case ARG_TEST:
fa0f4d8a 886 arg_action = ACTION_TEST;
e965d56d
LP
887 break;
888
9ba0bc4e
ZJS
889 case ARG_VERSION:
890 arg_action = ACTION_VERSION;
891 break;
892
e537352b 893 case ARG_DUMP_CONFIGURATION_ITEMS:
fa0f4d8a 894 arg_action = ACTION_DUMP_CONFIGURATION_ITEMS;
e537352b
LP
895 break;
896
9e58ff9c 897 case ARG_DUMP_CORE:
a5d87bf0
LP
898 r = optarg ? parse_boolean(optarg) : 1;
899 if (r < 0) {
900 log_error("Failed to parse dump core boolean %s.", optarg);
901 return r;
902 }
903 arg_dump_core = r;
9e58ff9c
LP
904 break;
905
906 case ARG_CRASH_SHELL:
a5d87bf0
LP
907 r = optarg ? parse_boolean(optarg) : 1;
908 if (r < 0) {
909 log_error("Failed to parse crash shell boolean %s.", optarg);
910 return r;
911 }
912 arg_crash_shell = r;
9e58ff9c
LP
913 break;
914
80876c20 915 case ARG_CONFIRM_SPAWN:
a5d87bf0
LP
916 r = optarg ? parse_boolean(optarg) : 1;
917 if (r < 0) {
918 log_error("Failed to parse confirm spawn boolean %s.", optarg);
919 return r;
920 }
921 arg_confirm_spawn = r;
80876c20
LP
922 break;
923
9e58ff9c 924 case ARG_SHOW_STATUS:
a5d87bf0
LP
925 r = optarg ? parse_boolean(optarg) : 1;
926 if (r < 0) {
927 log_error("Failed to parse show status boolean %s.", optarg);
928 return r;
929 }
930 arg_show_status = r;
6e98720f 931 break;
a5d87bf0 932
a16e1123
LP
933 case ARG_DESERIALIZE: {
934 int fd;
935 FILE *f;
936
01e10de3
LP
937 r = safe_atoi(optarg, &fd);
938 if (r < 0 || fd < 0) {
a16e1123 939 log_error("Failed to parse deserialize option %s.", optarg);
01e10de3 940 return r < 0 ? r : -EINVAL;
a16e1123
LP
941 }
942
01e10de3
LP
943 fd_cloexec(fd, true);
944
945 f = fdopen(fd, "r");
946 if (!f) {
a16e1123 947 log_error("Failed to open serialization fd: %m");
01e10de3 948 return -errno;
a16e1123
LP
949 }
950
951 if (serialization)
952 fclose(serialization);
953
954 serialization = f;
955
956 break;
957 }
958
2660882b 959 case ARG_SWITCHED_ROOT:
bf4df7c3 960 arg_switched_root = true;
d03bc1b8
HH
961 break;
962
4288f619
LP
963 case ARG_INTROSPECT: {
964 const char * const * i = NULL;
965
966 for (i = bus_interface_table; *i; i += 2)
967 if (!optarg || streq(i[0], optarg)) {
968 fputs(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE
969 "<node>\n", stdout);
970 fputs(i[1], stdout);
971 fputs("</node>\n", stdout);
972
973 if (optarg)
974 break;
975 }
976
977 if (!i[0] && optarg)
978 log_error("Unknown interface %s.", optarg);
979
fa0f4d8a 980 arg_action = ACTION_DONE;
4288f619
LP
981 break;
982 }
983
f170852a 984 case 'h':
fa0f4d8a 985 arg_action = ACTION_HELP;
f170852a
LP
986 break;
987
1d2e23ab
LP
988 case 'D':
989 log_set_max_level(LOG_DEBUG);
990 break;
991
099663ff
LP
992 case 'b':
993 case 's':
994 case 'z':
995 /* Just to eat away the sysvinit kernel
996 * cmdline args without getopt() error
997 * messages that we'll parse in
998 * parse_proc_cmdline_word() or ignore. */
f170852a 999
099663ff 1000 case '?':
f170852a 1001 default:
099663ff
LP
1002 if (getpid() != 1) {
1003 log_error("Unknown option code %c", c);
1004 return -EINVAL;
1005 }
1006
1007 break;
f170852a
LP
1008 }
1009
d821e6d6
LP
1010 if (optind < argc && getpid() != 1) {
1011 /* Hmm, when we aren't run as init system
1012 * let's complain about excess arguments */
1013
1014 log_error("Excess arguments.");
1015 return -EINVAL;
1016 }
1017
1018 if (detect_container(NULL) > 0) {
1019 char **a;
1020
1021 /* All /proc/cmdline arguments the kernel didn't
1022 * understand it passed to us. We're not really
1023 * interested in that usually since /proc/cmdline is
1024 * more interesting and complete. With one exception:
1025 * if we are run in a container /proc/cmdline is not
1026 * relevant for the container, hence we rely on argv[]
1027 * instead. */
1028
1029 for (a = argv; a < argv + argc; a++)
14212119
SL
1030 if ((r = parse_proc_cmdline_word(*a)) < 0) {
1031 log_error("Failed on cmdline argument %s: %s", *a, strerror(-r));
d821e6d6 1032 return r;
14212119 1033 }
51f0e189
LP
1034 }
1035
f170852a
LP
1036 return 0;
1037}
1038
1039static int help(void) {
1040
2e33c433 1041 printf("%s [OPTIONS...]\n\n"
af2d49f7 1042 "Starts up and maintains the system or user services.\n\n"
e537352b 1043 " -h --help Show this help\n"
e537352b 1044 " --test Determine startup sequence, dump it and exit\n"
80876c20 1045 " --dump-configuration-items Dump understood unit configuration items\n"
bbe63281 1046 " --introspect[=INTERFACE] Extract D-Bus interface data\n"
9e58ff9c 1047 " --unit=UNIT Set default unit\n"
edb9aaa8 1048 " --system Run a system instance, even if PID != 1\n"
af2d49f7 1049 " --user Run a user instance\n"
a5d87bf0
LP
1050 " --dump-core[=0|1] Dump core on crash\n"
1051 " --crash-shell[=0|1] Run shell on crash\n"
1052 " --confirm-spawn[=0|1] Ask for confirmation when spawning processes\n"
6e98720f 1053 " --show-status[=0|1] Show status updates on the console during bootup\n"
4cfa2c99 1054 " --log-target=TARGET Set log target (console, journal, syslog, kmsg, journal-or-kmsg, syslog-or-kmsg, null)\n"
9e58ff9c 1055 " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
2218198b 1056 " --log-color[=0|1] Highlight important log messages\n"
0a494f1f
LP
1057 " --log-location[=0|1] Include code location in log messages\n"
1058 " --default-standard-output= Set default standard output for services\n"
1059 " --default-standard-error= Set default standard error output for services\n",
5b6319dc 1060 program_invocation_short_name);
f170852a
LP
1061
1062 return 0;
1063}
1064
9ba0bc4e
ZJS
1065static int version(void) {
1066 puts(PACKAGE_STRING);
9ba0bc4e
ZJS
1067 puts(SYSTEMD_FEATURES);
1068
1069 return 0;
1070}
1071
6b78f9b4 1072static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool serialize_jobs) {
a16e1123
LP
1073 FILE *f = NULL;
1074 FDSet *fds = NULL;
1075 int r;
1076
1077 assert(m);
1078 assert(_f);
1079 assert(_fds);
1080
a7556052
LP
1081 /* Make sure nothing is really destructed when we shut down */
1082 m->n_reloading ++;
1083
6b78f9b4
LP
1084 r = manager_open_serialization(m, &f);
1085 if (r < 0) {
35b8ca3a 1086 log_error("Failed to create serialization file: %s", strerror(-r));
a16e1123
LP
1087 goto fail;
1088 }
1089
6b78f9b4
LP
1090 fds = fdset_new();
1091 if (!fds) {
a16e1123
LP
1092 r = -ENOMEM;
1093 log_error("Failed to allocate fd set: %s", strerror(-r));
1094 goto fail;
1095 }
1096
6b78f9b4
LP
1097 r = manager_serialize(m, f, fds, serialize_jobs);
1098 if (r < 0) {
a16e1123
LP
1099 log_error("Failed to serialize state: %s", strerror(-r));
1100 goto fail;
1101 }
1102
1103 if (fseeko(f, 0, SEEK_SET) < 0) {
1104 log_error("Failed to rewind serialization fd: %m");
1105 goto fail;
1106 }
1107
6b78f9b4
LP
1108 r = fd_cloexec(fileno(f), false);
1109 if (r < 0) {
a16e1123
LP
1110 log_error("Failed to disable O_CLOEXEC for serialization: %s", strerror(-r));
1111 goto fail;
1112 }
1113
6b78f9b4
LP
1114 r = fdset_cloexec(fds, false);
1115 if (r < 0) {
a16e1123
LP
1116 log_error("Failed to disable O_CLOEXEC for serialization fds: %s", strerror(-r));
1117 goto fail;
1118 }
1119
1120 *_f = f;
1121 *_fds = fds;
1122
1123 return 0;
1124
1125fail:
1126 fdset_free(fds);
1127
1128 if (f)
1129 fclose(f);
1130
1131 return r;
1132}
1133
4096d6f5
LP
1134static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
1135 struct rlimit nl;
1136 int r;
1137
1138 assert(saved_rlimit);
1139
1140 /* Save the original RLIMIT_NOFILE so that we can reset it
1141 * later when transitioning from the initrd to the main
1142 * systemd or suchlike. */
1143 if (getrlimit(RLIMIT_NOFILE, saved_rlimit) < 0) {
1144 log_error("Reading RLIMIT_NOFILE failed: %m");
1145 return -errno;
1146 }
1147
1148 /* Make sure forked processes get the default kernel setting */
1149 if (!arg_default_rlimit[RLIMIT_NOFILE]) {
1150 struct rlimit *rl;
1151
1152 rl = newdup(struct rlimit, saved_rlimit, 1);
1153 if (!rl)
1154 return log_oom();
1155
1156 arg_default_rlimit[RLIMIT_NOFILE] = rl;
1157 }
1158
1159 /* Bump up the resource limit for ourselves substantially */
1160 nl.rlim_cur = nl.rlim_max = 64*1024;
1161 r = setrlimit_closest(RLIMIT_NOFILE, &nl);
1162 if (r < 0) {
1163 log_error("Setting RLIMIT_NOFILE failed: %s", strerror(-r));
1164 return r;
1165 }
1166
1167 return 0;
1168}
1169
e9ddabc2
LP
1170static struct dual_timestamp* parse_initrd_timestamp(struct dual_timestamp *t) {
1171 const char *e;
1172 unsigned long long a, b;
1173
1174 assert(t);
1175
966a5d37
LP
1176 e = getenv("RD_TIMESTAMP");
1177 if (!e)
e9ddabc2
LP
1178 return NULL;
1179
1180 if (sscanf(e, "%llu %llu", &a, &b) != 2)
1181 return NULL;
1182
1183 t->realtime = (usec_t) a;
1184 t->monotonic = (usec_t) b;
1185
1186 return t;
1187}
1188
6ee5bbf8
LP
1189static void test_mtab(void) {
1190 char *p;
1191
80758717
LP
1192 /* Check that /etc/mtab is a symlink */
1193
6ee5bbf8
LP
1194 if (readlink_malloc("/etc/mtab", &p) >= 0) {
1195 bool b;
1196
ed86ebc4 1197 b = streq(p, "/proc/self/mounts") || streq(p, "/proc/mounts");
6ee5bbf8
LP
1198 free(p);
1199
1200 if (b)
1201 return;
1202 }
1203
80758717
LP
1204 log_warning("/etc/mtab is not a symlink or not pointing to /proc/self/mounts. "
1205 "This is not supported anymore. "
1206 "Please make sure to replace this file by a symlink to avoid incorrect or misleading mount(8) output.");
1207}
1208
1209static void test_usr(void) {
80758717 1210
ed1c99fc 1211 /* Check that /usr is not a separate fs */
80758717 1212
871c44a7
LP
1213 if (dir_is_empty("/usr") <= 0)
1214 return;
1215
2376ce13 1216 log_warning("/usr appears to be on its own filesytem and is not already mounted. This is not a supported setup. "
871c44a7
LP
1217 "Some things will probably break (sometimes even silently) in mysterious ways. "
1218 "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
1219}
1220
1221static void test_cgroups(void) {
1222
1223 if (access("/proc/cgroups", F_OK) >= 0)
1224 return;
1225
1226 log_warning("CONFIG_CGROUPS was not set when your kernel was compiled. "
1227 "Systems without control groups are not supported. "
1228 "We will now sleep for 10s, and then continue boot-up. "
1229 "Expect breakage and please do not file bugs. "
966a5d37
LP
1230 "Instead fix your kernel and enable CONFIG_CGROUPS. "
1231 "Consult http://0pointer.de/blog/projects/cgroups-vs-cgroups.html for more information.");
871c44a7
LP
1232
1233 sleep(10);
6ee5bbf8
LP
1234}
1235
a07fdfa3
LP
1236static int initialize_join_controllers(void) {
1237 /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
1238 * + "net_prio". We'd like to add "cpuset" to the mix, but
1239 * "cpuset" does't really work for groups with no initialized
1240 * attributes. */
1241
1242 arg_join_controllers = new(char**, 3);
1243 if (!arg_join_controllers)
1244 return -ENOMEM;
1245
1246 arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
1247 if (!arg_join_controllers[0])
1248 return -ENOMEM;
1249
1250 arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL);
1251 if (!arg_join_controllers[1])
1252 return -ENOMEM;
1253
1254 arg_join_controllers[2] = NULL;
1255 return 0;
1256}
1257
60918275
LP
1258int main(int argc, char *argv[]) {
1259 Manager *m = NULL;
22f4096c 1260 int r, retval = EXIT_FAILURE;
9d76d730
LP
1261 usec_t before_startup, after_startup;
1262 char timespan[FORMAT_TIMESPAN_MAX];
a16e1123
LP
1263 FDSet *fds = NULL;
1264 bool reexecute = false;
b9080b03 1265 const char *shutdown_verb = NULL;
e9ddabc2 1266 dual_timestamp initrd_timestamp = { 0ULL, 0ULL };
5d6b1584 1267 static char systemd[] = "systemd";
2660882b 1268 bool skip_setup = false;
0b3325e7
LP
1269 int j;
1270 bool loaded_policy = false;
e96d6be7 1271 bool arm_reboot_watchdog = false;
bf4df7c3 1272 bool queue_default_job = false;
41669317 1273 char *switch_root_dir = NULL, *switch_root_init = NULL;
4096d6f5 1274 static struct rlimit saved_rlimit_nofile = { 0, 0 };
27b14a22 1275
058dc6f3 1276#ifdef HAVE_SYSV_COMPAT
2cb1a60d 1277 if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
35b8ca3a 1278 /* This is compatibility support for SysV, where
2cb1a60d
LP
1279 * calling init as a user is identical to telinit. */
1280
1281 errno = -ENOENT;
1282 execv(SYSTEMCTL_BINARY_PATH, argv);
1283 log_error("Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
1284 return 1;
1285 }
058dc6f3 1286#endif
2cb1a60d 1287
0b3325e7
LP
1288 /* Determine if this is a reexecution or normal bootup. We do
1289 * the full command line parsing much later, so let's just
1290 * have a quick peek here. */
0b3325e7
LP
1291 for (j = 1; j < argc; j++)
1292 if (streq(argv[j], "--deserialize")) {
2660882b 1293 skip_setup = true;
7aaa27f2 1294 break;
0b3325e7
LP
1295 }
1296
2660882b
LP
1297 /* If we have switched root, do all the special setup
1298 * things */
d03bc1b8 1299 for (j = 1; j < argc; j++)
2660882b
LP
1300 if (streq(argv[j], "--switched-root")) {
1301 skip_setup = false;
d03bc1b8
HH
1302 break;
1303 }
1304
f3b6a3ed
LP
1305 /* If we get started via the /sbin/init symlink then we are
1306 called 'init'. After a subsequent reexecution we are then
1307 called 'systemd'. That is confusing, hence let's call us
1308 systemd right-away. */
f3b6a3ed
LP
1309 program_invocation_short_name = systemd;
1310 prctl(PR_SET_NAME, systemd);
5d6b1584 1311
9a0e6896
LP
1312 saved_argv = argv;
1313 saved_argc = argc;
f3b6a3ed 1314
2cc59dbf 1315 log_show_color(isatty(STDERR_FILENO) > 0);
bbe63281 1316
a866073d
LP
1317 if (getpid() == 1 && detect_container(NULL) <= 0) {
1318
1319 /* Running outside of a container as PID 1 */
67445f4e 1320 arg_running_as = SYSTEMD_SYSTEM;
a866073d
LP
1321 make_null_stdio();
1322 log_set_target(LOG_TARGET_KMSG);
1323 log_open();
1324
c3ba6250
HH
1325 if (in_initrd()) {
1326 char *rd_timestamp = NULL;
1327
1328 dual_timestamp_get(&initrd_timestamp);
1329 asprintf(&rd_timestamp, "%llu %llu",
1330 (unsigned long long) initrd_timestamp.realtime,
1331 (unsigned long long) initrd_timestamp.monotonic);
1332 if (rd_timestamp) {
1333 setenv("RD_TIMESTAMP", rd_timestamp, 1);
1334 free(rd_timestamp);
1335 }
1336 }
1337
2660882b 1338 if (!skip_setup) {
0b3325e7
LP
1339 if (selinux_setup(&loaded_policy) < 0)
1340 goto finish;
81611586
RS
1341 if (ima_setup() < 0)
1342 goto finish;
1343 }
0b3325e7 1344
e9a5ef7c 1345 if (label_init(NULL) < 0)
0ff4cdd9 1346 goto finish;
7948c4df 1347
72edcff5 1348 if (!skip_setup) {
0b3325e7
LP
1349 if (hwclock_is_localtime() > 0) {
1350 int min;
7948c4df 1351
72edcff5
KS
1352 /* The first-time call to settimeofday() does a time warp in the kernel */
1353 r = hwclock_set_timezone(&min);
0b3325e7
LP
1354 if (r < 0)
1355 log_error("Failed to apply local time delta, ignoring: %s", strerror(-r));
1356 else
1357 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
19e65613
KS
1358 } else if (!in_initrd()) {
1359 /*
1360 * Do dummy first-time call to seal the kernel's time warp magic
1361 *
1362 * Do not call this this from inside the initrd. The initrd might not
1363 * carry /etc/adjtime with LOCAL, but the real system could be set up
1364 * that way. In such case, we need to delay the time-warp or the sealing
1365 * until we reach the real system.
1366 */
72edcff5 1367 hwclock_reset_timezone();
871e5809 1368
72edcff5
KS
1369 /* Tell the kernel our time zone */
1370 r = hwclock_set_timezone(NULL);
1371 if (r < 0)
1372 log_error("Failed to set the kernel's time zone, ignoring: %s", strerror(-r));
1373 }
1374 }
a866073d
LP
1375
1376 /* Set the default for later on, but don't actually
1377 * open the logs like this for now. Note that if we
1378 * are transitioning from the initrd there might still
1379 * be journal fd open, and we shouldn't attempt
1380 * opening that before we parsed /proc/cmdline which
1381 * might redirect output elsewhere. */
1382 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1383
1384 } else if (getpid() == 1) {
1385
1386 /* Running inside a container, as PID 1 */
67445f4e 1387 arg_running_as = SYSTEMD_SYSTEM;
a866073d
LP
1388 log_set_target(LOG_TARGET_CONSOLE);
1389 log_open();
1390
1391 /* For the later on, see above... */
1392 log_set_target(LOG_TARGET_JOURNAL);
1393
bbe63281 1394 } else {
a866073d
LP
1395
1396 /* Running as user instance */
67445f4e 1397 arg_running_as = SYSTEMD_USER;
eeecf6e6 1398 log_set_target(LOG_TARGET_AUTO);
871e5809 1399 log_open();
bbe63281 1400 }
a5dab5ce 1401
0c85a4f3 1402 /* Initialize default unit */
6afa301b
LP
1403 r = set_default_unit(SPECIAL_DEFAULT_TARGET);
1404 if (r < 0) {
14212119 1405 log_error("Failed to set default unit %s: %s", SPECIAL_DEFAULT_TARGET, strerror(-r));
f170852a 1406 goto finish;
14212119 1407 }
60918275 1408
a07fdfa3
LP
1409 r = initialize_join_controllers();
1410 if (r < 0)
0c85a4f3
LP
1411 goto finish;
1412
f170852a
LP
1413 /* Mount /proc, /sys and friends, so that /proc/cmdline and
1414 * /proc/$PID/fd is available. */
0c85a4f3
LP
1415 if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS")) {
1416 r = mount_setup(loaded_policy);
1417 if (r < 0)
8efe3c01 1418 goto finish;
0c85a4f3 1419 }
4ade7963
LP
1420
1421 /* Reset all signal handlers. */
1422 assert_se(reset_all_signal_handlers() == 0);
1423
078e4539 1424 /* If we are init, we can block sigkill. Yay. */
9a34ec5f 1425 ignore_signals(SIGNALS_IGNORE, -1);
078e4539 1426
487393e9
LP
1427 if (parse_config_file() < 0)
1428 goto finish;
1429
67445f4e 1430 if (arg_running_as == SYSTEMD_SYSTEM)
a5dab5ce
LP
1431 if (parse_proc_cmdline() < 0)
1432 goto finish;
f170852a
LP
1433
1434 log_parse_environment();
1435
1436 if (parse_argv(argc, argv) < 0)
1437 goto finish;
1438
6bae23a0
TB
1439 if (arg_action == ACTION_TEST &&
1440 geteuid() == 0) {
b5c6cf87
LP
1441 log_error("Don't run test mode as root.");
1442 goto finish;
1443 }
1444
6bae23a0
TB
1445 if (arg_running_as == SYSTEMD_USER &&
1446 arg_action == ACTION_RUN &&
1447 sd_booted() <= 0) {
1448 log_error("Trying to run as user instance, but the system has not been booted with systemd.");
1449 goto finish;
1450 }
1451
67445f4e 1452 if (arg_running_as == SYSTEMD_SYSTEM &&
fe783b03
LP
1453 arg_action == ACTION_RUN &&
1454 running_in_chroot() > 0) {
1455 log_error("Cannot be run in a chroot() environment.");
1456 goto finish;
1457 }
1458
fa0f4d8a 1459 if (arg_action == ACTION_HELP) {
f170852a
LP
1460 retval = help();
1461 goto finish;
9ba0bc4e
ZJS
1462 } else if (arg_action == ACTION_VERSION) {
1463 retval = version();
1464 goto finish;
fa0f4d8a 1465 } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
e537352b 1466 unit_dump_config_items(stdout);
22f4096c 1467 retval = EXIT_SUCCESS;
e537352b 1468 goto finish;
fa0f4d8a 1469 } else if (arg_action == ACTION_DONE) {
22f4096c 1470 retval = EXIT_SUCCESS;
4288f619 1471 goto finish;
f170852a
LP
1472 }
1473
fa0f4d8a 1474 assert_se(arg_action == ACTION_RUN || arg_action == ACTION_TEST);
f170852a 1475
871e5809
LP
1476 /* Close logging fds, in order not to confuse fdset below */
1477 log_close();
1478
a16e1123 1479 /* Remember open file descriptors for later deserialization */
01e10de3
LP
1480 r = fdset_new_fill(&fds);
1481 if (r < 0) {
1482 log_error("Failed to allocate fd set: %s", strerror(-r));
1483 goto finish;
1484 } else
1485 fdset_cloexec(fds, true);
a16e1123 1486
01e10de3 1487 if (serialization)
a16e1123 1488 assert_se(fdset_remove(fds, fileno(serialization)) >= 0);
a16e1123 1489
09082a94 1490 /* Set up PATH unless it is already set */
e537352b 1491 setenv("PATH",
2c6db6fb 1492#ifdef HAVE_SPLIT_USR
e537352b 1493 "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
2c6db6fb
LP
1494#else
1495 "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin",
1496#endif
67445f4e 1497 arg_running_as == SYSTEMD_SYSTEM);
09082a94 1498
67445f4e 1499 if (arg_running_as == SYSTEMD_SYSTEM) {
71ecc858
LP
1500 /* Parse the data passed to us. We leave this
1501 * variables set, but the manager later on will not
1502 * pass them on to our children. */
2660882b 1503 if (!in_initrd())
c3ba6250 1504 parse_initrd_timestamp(&initrd_timestamp);
e9ddabc2
LP
1505
1506 /* Unset some environment variables passed in from the
1507 * kernel that don't really make sense for us. */
39439087
LP
1508 unsetenv("HOME");
1509 unsetenv("TERM");
b770165a 1510
9543ad16
LP
1511 /* When we are invoked by a shell, these might be set,
1512 * but make little sense to pass on */
1513 unsetenv("PWD");
1514 unsetenv("SHLVL");
1515 unsetenv("_");
1516
2660882b 1517 /* When we are invoked by a chroot-like tool such as
9f28b98e
LP
1518 * nspawn, these might be set, but make little sense
1519 * to pass on */
1520 unsetenv("USER");
1521 unsetenv("LOGNAME");
1522
01e10de3
LP
1523 /* We suppress the socket activation env vars, as
1524 * we'll try to match *any* open fd to units if
1525 * possible. */
1526 unsetenv("LISTEN_FDS");
1527 unsetenv("LISTEN_PID");
1528
b770165a
LP
1529 /* All other variables are left as is, so that clients
1530 * can still read them via /proc/1/environ */
39439087 1531 }
1104f3c1 1532
f170852a
LP
1533 /* Move out of the way, so that we won't block unmounts */
1534 assert_se(chdir("/") == 0);
1535
67445f4e 1536 if (arg_running_as == SYSTEMD_SYSTEM) {
80876c20
LP
1537 /* Become a session leader if we aren't one yet. */
1538 setsid();
4ade7963 1539
80876c20
LP
1540 /* Disable the umask logic */
1541 umask(0);
1542 }
1543
843d2643
LP
1544 /* Make sure D-Bus doesn't fiddle with the SIGPIPE handlers */
1545 dbus_connection_set_change_sigpipe(FALSE);
1546
2146621b
LP
1547 /* Reset the console, but only if this is really init and we
1548 * are freshly booted */
67445f4e 1549 if (arg_running_as == SYSTEMD_SYSTEM && arg_action == ACTION_RUN)
2660882b 1550 console_setup(getpid() == 1 && !skip_setup);
4ade7963 1551
18149b9f 1552 /* Open the logging devices, if possible and necessary */
843d2643 1553 log_open();
4ade7963 1554
5373d602
LP
1555 /* Make sure we leave a core dump without panicing the
1556 * kernel. */
4fc935ca
LP
1557 if (getpid() == 1)
1558 install_crash_handler();
97c4f35c 1559
0c85a4f3
LP
1560 if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS")) {
1561 r = mount_cgroup_controllers(arg_join_controllers);
1562 if (r < 0)
1563 goto finish;
1564 }
1565
67445f4e 1566 if (arg_running_as == SYSTEMD_SYSTEM) {
c20f5ac7
LP
1567 const char *virtualization = NULL;
1568
bc270841 1569 log_info(PACKAGE_STRING " running in system mode. (" SYSTEMD_FEATURES ")");
c20f5ac7
LP
1570
1571 detect_virtualization(&virtualization);
1572 if (virtualization)
1573 log_info("Detected virtualization '%s'.", virtualization);
1574
26a1efdf
LP
1575 if (in_initrd())
1576 log_info("Running in initial RAM disk.");
1577
c20f5ac7 1578 } else
bc270841 1579 log_debug(PACKAGE_STRING " running in user mode. (" SYSTEMD_FEATURES ")");
a5dab5ce 1580
67445f4e 1581 if (arg_running_as == SYSTEMD_SYSTEM && !skip_setup) {
72bca11b
LP
1582 locale_setup();
1583
6faa1114 1584 if (arg_show_status || plymouth_running())
888c6216
LP
1585 status_welcome();
1586
e3043162 1587#ifdef HAVE_KMOD
888c6216 1588 kmod_setup();
e3043162 1589#endif
888c6216 1590 hostname_setup();
d7ccca2e 1591 machine_id_setup();
888c6216 1592 loopback_setup();
490aed58 1593
6ee5bbf8 1594 test_mtab();
80758717 1595 test_usr();
871c44a7 1596 test_cgroups();
af5bc85d 1597 }
302e8c4c 1598
67445f4e 1599 if (arg_running_as == SYSTEMD_SYSTEM && arg_runtime_watchdog > 0)
e96d6be7
LP
1600 watchdog_set_timeout(&arg_runtime_watchdog);
1601
aa0f64ac
LP
1602 if (arg_timer_slack_nsec != (nsec_t) -1)
1603 if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
1604 log_error("Failed to adjust timer slack: %m");
1605
ec8927ca
LP
1606 if (arg_capability_bounding_set_drop) {
1607 r = capability_bounding_set_drop(arg_capability_bounding_set_drop, true);
1608 if (r < 0) {
1609 log_error("Failed to drop capability bounding set: %s", strerror(-r));
1610 goto finish;
1611 }
939b8f14
LP
1612 r = capability_bounding_set_drop_usermode(arg_capability_bounding_set_drop);
1613 if (r < 0) {
1614 log_error("Failed to drop capability bounding set of usermode helpers: %s", strerror(-r));
1615 goto finish;
1616 }
ec8927ca
LP
1617 }
1618
67445f4e 1619 if (arg_running_as == SYSTEMD_USER) {
d4447f4d 1620 /* Become reaper of our children */
8b8ffe68
LP
1621 if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0) {
1622 log_warning("Failed to make us a subreaper: %m");
1623 if (errno == EINVAL)
ddfa5101 1624 log_info("Perhaps the kernel version is too old (< 3.4?)");
8b8ffe68 1625 }
d4447f4d
AK
1626 }
1627
67445f4e 1628 if (arg_running_as == SYSTEMD_SYSTEM)
4096d6f5
LP
1629 bump_rlimit_nofile(&saved_rlimit_nofile);
1630
e96d6be7
LP
1631 r = manager_new(arg_running_as, &m);
1632 if (r < 0) {
8e274523 1633 log_error("Failed to allocate manager object: %s", strerror(-r));
60918275
LP
1634 goto finish;
1635 }
1636
9e58ff9c 1637 m->confirm_spawn = arg_confirm_spawn;
0a494f1f
LP
1638 m->default_std_output = arg_default_std_output;
1639 m->default_std_error = arg_default_std_error;
e96d6be7
LP
1640 m->runtime_watchdog = arg_runtime_watchdog;
1641 m->shutdown_watchdog = arg_shutdown_watchdog;
9e58ff9c 1642
c93ff2e9
FC
1643 manager_set_default_rlimits(m, arg_default_rlimit);
1644
e9ddabc2
LP
1645 if (dual_timestamp_is_set(&initrd_timestamp))
1646 m->initrd_timestamp = initrd_timestamp;
1647
06d4c99a
LP
1648 if (arg_default_controllers)
1649 manager_set_default_controllers(m, arg_default_controllers);
1650
27d340c7
LP
1651 manager_set_show_status(m, arg_show_status);
1652
bf4df7c3
LP
1653 /* Remember whether we should queue the default job */
1654 queue_default_job = !serialization || arg_switched_root;
1655
9d76d730
LP
1656 before_startup = now(CLOCK_MONOTONIC);
1657
e96d6be7
LP
1658 r = manager_startup(m, serialization, fds);
1659 if (r < 0)
6e2ef85b 1660 log_error("Failed to fully start up daemon: %s", strerror(-r));
a16e1123 1661
bf4df7c3
LP
1662 /* This will close all file descriptors that were opened, but
1663 * not claimed by any unit. */
01e10de3 1664 fdset_free(fds);
f50e0a01 1665
a16e1123
LP
1666 if (serialization) {
1667 fclose(serialization);
1668 serialization = NULL;
bf4df7c3
LP
1669 }
1670
1671 if (queue_default_job) {
398ef8ba 1672 DBusError error;
1c27d3f3 1673 Unit *target = NULL;
bacbccb7 1674 Job *default_unit_job;
398ef8ba
LP
1675
1676 dbus_error_init(&error);
1677
fa0f4d8a 1678 log_debug("Activating default unit: %s", arg_default_unit);
a16e1123 1679
e96d6be7
LP
1680 r = manager_load_unit(m, arg_default_unit, NULL, &error, &target);
1681 if (r < 0) {
398ef8ba
LP
1682 log_error("Failed to load default target: %s", bus_error(&error, r));
1683 dbus_error_free(&error);
ac155bb8
MS
1684 } else if (target->load_state == UNIT_ERROR)
1685 log_error("Failed to load default target: %s", strerror(-target->load_error));
1686 else if (target->load_state == UNIT_MASKED)
6daf4f90 1687 log_error("Default target masked.");
27b14a22 1688
ac155bb8 1689 if (!target || target->load_state != UNIT_LOADED) {
a16e1123 1690 log_info("Trying to load rescue target...");
1c27d3f3 1691
e96d6be7
LP
1692 r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target);
1693 if (r < 0) {
398ef8ba
LP
1694 log_error("Failed to load rescue target: %s", bus_error(&error, r));
1695 dbus_error_free(&error);
a16e1123 1696 goto finish;
ac155bb8
MS
1697 } else if (target->load_state == UNIT_ERROR) {
1698 log_error("Failed to load rescue target: %s", strerror(-target->load_error));
1c27d3f3 1699 goto finish;
ac155bb8 1700 } else if (target->load_state == UNIT_MASKED) {
6daf4f90 1701 log_error("Rescue target masked.");
00dc5d76 1702 goto finish;
a16e1123
LP
1703 }
1704 }
37d88da7 1705
ac155bb8 1706 assert(target->load_state == UNIT_LOADED);
00dc5d76 1707
fa0f4d8a 1708 if (arg_action == ACTION_TEST) {
40d50879 1709 printf("-> By units:\n");
a16e1123
LP
1710 manager_dump_units(m, stdout, "\t");
1711 }
1712
bacbccb7
MS
1713 r = manager_add_job(m, JOB_START, target, JOB_REPLACE, false, &error, &default_unit_job);
1714 if (r < 0) {
398ef8ba
LP
1715 log_error("Failed to start default target: %s", bus_error(&error, r));
1716 dbus_error_free(&error);
37d88da7
LP
1717 goto finish;
1718 }
bacbccb7 1719 m->default_unit_job_id = default_unit_job->id;
60918275 1720
07672f49
LP
1721 after_startup = now(CLOCK_MONOTONIC);
1722 log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG,
1723 "Loaded units and determined initial transaction in %s.",
1724 format_timespan(timespan, sizeof(timespan), after_startup - before_startup));
1725
fa0f4d8a 1726 if (arg_action == ACTION_TEST) {
40d50879 1727 printf("-> By jobs:\n");
a16e1123 1728 manager_dump_jobs(m, stdout, "\t");
22f4096c 1729 retval = EXIT_SUCCESS;
a16e1123
LP
1730 goto finish;
1731 }
e965d56d 1732 }
d46de8a1 1733
a16e1123 1734 for (;;) {
e96d6be7
LP
1735 r = manager_loop(m);
1736 if (r < 0) {
a16e1123
LP
1737 log_error("Failed to run mainloop: %s", strerror(-r));
1738 goto finish;
1739 }
11dd41ce 1740
a16e1123 1741 switch (m->exit_code) {
e965d56d 1742
a16e1123 1743 case MANAGER_EXIT:
22f4096c 1744 retval = EXIT_SUCCESS;
a16e1123
LP
1745 log_debug("Exit.");
1746 goto finish;
e965d56d 1747
a16e1123 1748 case MANAGER_RELOAD:
e015090f 1749 log_info("Reloading.");
e96d6be7
LP
1750 r = manager_reload(m);
1751 if (r < 0)
a16e1123
LP
1752 log_error("Failed to reload: %s", strerror(-r));
1753 break;
cea8e32e 1754
a16e1123 1755 case MANAGER_REEXECUTE:
664f88a7 1756
6b78f9b4 1757 if (prepare_reexecute(m, &serialization, &fds, true) < 0)
a16e1123 1758 goto finish;
60918275 1759
a16e1123 1760 reexecute = true;
e015090f 1761 log_notice("Reexecuting.");
a16e1123
LP
1762 goto finish;
1763
664f88a7
LP
1764 case MANAGER_SWITCH_ROOT:
1765 /* Steal the switch root parameters */
41669317 1766 switch_root_dir = m->switch_root;
664f88a7
LP
1767 switch_root_init = m->switch_root_init;
1768 m->switch_root = m->switch_root_init = NULL;
1769
1770 if (!switch_root_init)
6b78f9b4 1771 if (prepare_reexecute(m, &serialization, &fds, false) < 0)
664f88a7
LP
1772 goto finish;
1773
1774 reexecute = true;
1775 log_notice("Switching root.");
1776 goto finish;
1777
b9080b03
FF
1778 case MANAGER_REBOOT:
1779 case MANAGER_POWEROFF:
1780 case MANAGER_HALT:
1781 case MANAGER_KEXEC: {
1782 static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
1783 [MANAGER_REBOOT] = "reboot",
1784 [MANAGER_POWEROFF] = "poweroff",
1785 [MANAGER_HALT] = "halt",
1786 [MANAGER_KEXEC] = "kexec"
1787 };
1788
1789 assert_se(shutdown_verb = table[m->exit_code]);
e96d6be7 1790 arm_reboot_watchdog = m->exit_code == MANAGER_REBOOT;
b9080b03
FF
1791
1792 log_notice("Shutting down.");
1793 goto finish;
1794 }
1795
a16e1123
LP
1796 default:
1797 assert_not_reached("Unknown exit code.");
1798 }
1799 }
f170852a 1800
60918275
LP
1801finish:
1802 if (m)
1803 manager_free(m);
1804
c93ff2e9 1805 for (j = 0; j < RLIMIT_NLIMITS; j++)
4096d6f5 1806 free(arg_default_rlimit[j]);
c93ff2e9 1807
fa0f4d8a 1808 free(arg_default_unit);
06d4c99a 1809 strv_free(arg_default_controllers);
0c85a4f3 1810 free_join_controllers();
b9cd2ec1 1811
ea430986 1812 dbus_shutdown();
b2bb3dbe
LP
1813 label_finish();
1814
a16e1123 1815 if (reexecute) {
664f88a7 1816 const char **args;
e564a982 1817 unsigned i, args_size;
a16e1123 1818
664f88a7
LP
1819 /* Close and disarm the watchdog, so that the new
1820 * instance can reinitialize it, but doesn't get
1821 * rebooted while we do that */
1822 watchdog_close(true);
a16e1123 1823
4096d6f5
LP
1824 /* Reset the RLIMIT_NOFILE to the kernel default, so
1825 * that the new systemd can pass the kernel default to
1826 * its child processes */
1827 if (saved_rlimit_nofile.rlim_cur > 0)
1828 setrlimit(RLIMIT_NOFILE, &saved_rlimit_nofile);
1829
41669317 1830 if (switch_root_dir) {
cee530bb
LP
1831 /* Kill all remaining processes from the
1832 * initrd, but don't wait for them, so that we
1833 * can handle the SIGCHLD for them after
1834 * deserializing. */
1835 broadcast_signal(SIGTERM, false);
bd3fa1d2
LP
1836
1837 /* And switch root */
41669317
LP
1838 r = switch_root(switch_root_dir);
1839 if (r < 0)
1840 log_error("Failed to switch root, ignoring: %s", strerror(-r));
1841 }
a16e1123 1842
d03bc1b8 1843 args_size = MAX(6, argc+1);
e564a982 1844 args = newa(const char*, args_size);
a16e1123 1845
664f88a7
LP
1846 if (!switch_root_init) {
1847 char sfd[16];
a16e1123 1848
664f88a7
LP
1849 /* First try to spawn ourselves with the right
1850 * path, and with full serialization. We do
1851 * this only if the user didn't specify an
1852 * explicit init to spawn. */
edb9aaa8 1853
664f88a7
LP
1854 assert(serialization);
1855 assert(fds);
edb9aaa8 1856
664f88a7
LP
1857 snprintf(sfd, sizeof(sfd), "%i", fileno(serialization));
1858 char_array_0(sfd);
edb9aaa8 1859
664f88a7
LP
1860 i = 0;
1861 args[i++] = SYSTEMD_BINARY_PATH;
41669317 1862 if (switch_root_dir)
2660882b 1863 args[i++] = "--switched-root";
67445f4e 1864 args[i++] = arg_running_as == SYSTEMD_SYSTEM ? "--system" : "--user";
664f88a7
LP
1865 args[i++] = "--deserialize";
1866 args[i++] = sfd;
1867 args[i++] = NULL;
edb9aaa8 1868
e564a982 1869 assert(i <= args_size);
664f88a7
LP
1870 execv(args[0], (char* const*) args);
1871 }
6e98720f 1872
664f88a7
LP
1873 /* Try the fallback, if there is any, without any
1874 * serialization. We pass the original argv[] and
1875 * envp[]. (Well, modulo the ordering changes due to
1876 * getopt() in argv[], and some cleanups in envp[],
1877 * but let's hope that doesn't matter.) */
a16e1123 1878
b8f83232 1879 if (serialization) {
664f88a7 1880 fclose(serialization);
b8f83232
LP
1881 serialization = NULL;
1882 }
a16e1123 1883
b8f83232 1884 if (fds) {
664f88a7 1885 fdset_free(fds);
b8f83232
LP
1886 fds = NULL;
1887 }
a16e1123 1888
a504223d
HH
1889 /* Reopen the console */
1890 make_console_stdio();
1891
b8f83232 1892 for (j = 1, i = 1; j < argc; j++)
664f88a7 1893 args[i++] = argv[j];
a16e1123 1894 args[i++] = NULL;
e564a982 1895 assert(i <= args_size);
b8f83232
LP
1896
1897 if (switch_root_init) {
1898 args[0] = switch_root_init;
1899 execv(args[0], (char* const*) args);
1900 log_warning("Failed to execute configured init, trying fallback: %m");
1901 }
1902
1903 args[0] = "/sbin/init";
a16e1123
LP
1904 execv(args[0], (char* const*) args);
1905
745e2fb7
KS
1906 if (errno == ENOENT) {
1907 log_warning("No /sbin/init, trying fallback");
b8f83232 1908
745e2fb7
KS
1909 args[0] = "/bin/sh";
1910 args[1] = NULL;
1911 execv(args[0], (char* const*) args);
1912 log_error("Failed to execute /bin/sh, giving up: %m");
1913 } else
1914 log_warning("Failed to execute /sbin/init, giving up: %m");
a16e1123
LP
1915 }
1916
1917 if (serialization)
1918 fclose(serialization);
1919
1920 if (fds)
1921 fdset_free(fds);
1922
b9080b03
FF
1923 if (shutdown_verb) {
1924 const char * command_line[] = {
1925 SYSTEMD_SHUTDOWN_BINARY_PATH,
1926 shutdown_verb,
1927 NULL
1928 };
d18f337c 1929 char **env_block;
b9080b03 1930
e96d6be7 1931 if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) {
d18f337c
LP
1932 char e[32];
1933
e96d6be7
LP
1934 /* If we reboot let's set the shutdown
1935 * watchdog and tell the shutdown binary to
1936 * repeatedly ping it */
1937 watchdog_set_timeout(&arg_shutdown_watchdog);
1938 watchdog_close(false);
1939
1940 /* Tell the binary how often to ping */
1941 snprintf(e, sizeof(e), "WATCHDOG_USEC=%llu", (unsigned long long) arg_shutdown_watchdog);
1942 char_array_0(e);
d18f337c
LP
1943
1944 env_block = strv_append(environ, e);
1945 } else {
1946 env_block = strv_copy(environ);
e96d6be7 1947 watchdog_close(true);
d18f337c 1948 }
e96d6be7 1949
d18f337c
LP
1950 execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
1951 free(env_block);
b9080b03
FF
1952 log_error("Failed to execute shutdown binary, freezing: %m");
1953 }
1954
c3b3c274
LP
1955 if (getpid() == 1)
1956 freeze();
1957
60918275
LP
1958 return retval;
1959}