]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/main.c
nspawn: allow passing socket activation fds through nspawn
[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
937 if ((r = safe_atoi(optarg, &fd)) < 0 || fd < 0) {
938 log_error("Failed to parse deserialize option %s.", optarg);
939 return r;
940 }
941
942 if (!(f = fdopen(fd, "r"))) {
943 log_error("Failed to open serialization fd: %m");
944 return r;
945 }
946
947 if (serialization)
948 fclose(serialization);
949
950 serialization = f;
951
952 break;
953 }
954
2660882b 955 case ARG_SWITCHED_ROOT:
bf4df7c3 956 arg_switched_root = true;
d03bc1b8
HH
957 break;
958
4288f619
LP
959 case ARG_INTROSPECT: {
960 const char * const * i = NULL;
961
962 for (i = bus_interface_table; *i; i += 2)
963 if (!optarg || streq(i[0], optarg)) {
964 fputs(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE
965 "<node>\n", stdout);
966 fputs(i[1], stdout);
967 fputs("</node>\n", stdout);
968
969 if (optarg)
970 break;
971 }
972
973 if (!i[0] && optarg)
974 log_error("Unknown interface %s.", optarg);
975
fa0f4d8a 976 arg_action = ACTION_DONE;
4288f619
LP
977 break;
978 }
979
f170852a 980 case 'h':
fa0f4d8a 981 arg_action = ACTION_HELP;
f170852a
LP
982 break;
983
1d2e23ab
LP
984 case 'D':
985 log_set_max_level(LOG_DEBUG);
986 break;
987
099663ff
LP
988 case 'b':
989 case 's':
990 case 'z':
991 /* Just to eat away the sysvinit kernel
992 * cmdline args without getopt() error
993 * messages that we'll parse in
994 * parse_proc_cmdline_word() or ignore. */
f170852a 995
099663ff 996 case '?':
f170852a 997 default:
099663ff
LP
998 if (getpid() != 1) {
999 log_error("Unknown option code %c", c);
1000 return -EINVAL;
1001 }
1002
1003 break;
f170852a
LP
1004 }
1005
d821e6d6
LP
1006 if (optind < argc && getpid() != 1) {
1007 /* Hmm, when we aren't run as init system
1008 * let's complain about excess arguments */
1009
1010 log_error("Excess arguments.");
1011 return -EINVAL;
1012 }
1013
1014 if (detect_container(NULL) > 0) {
1015 char **a;
1016
1017 /* All /proc/cmdline arguments the kernel didn't
1018 * understand it passed to us. We're not really
1019 * interested in that usually since /proc/cmdline is
1020 * more interesting and complete. With one exception:
1021 * if we are run in a container /proc/cmdline is not
1022 * relevant for the container, hence we rely on argv[]
1023 * instead. */
1024
1025 for (a = argv; a < argv + argc; a++)
14212119
SL
1026 if ((r = parse_proc_cmdline_word(*a)) < 0) {
1027 log_error("Failed on cmdline argument %s: %s", *a, strerror(-r));
d821e6d6 1028 return r;
14212119 1029 }
51f0e189
LP
1030 }
1031
f170852a
LP
1032 return 0;
1033}
1034
1035static int help(void) {
1036
2e33c433 1037 printf("%s [OPTIONS...]\n\n"
af2d49f7 1038 "Starts up and maintains the system or user services.\n\n"
e537352b 1039 " -h --help Show this help\n"
e537352b 1040 " --test Determine startup sequence, dump it and exit\n"
80876c20 1041 " --dump-configuration-items Dump understood unit configuration items\n"
bbe63281 1042 " --introspect[=INTERFACE] Extract D-Bus interface data\n"
9e58ff9c 1043 " --unit=UNIT Set default unit\n"
edb9aaa8 1044 " --system Run a system instance, even if PID != 1\n"
af2d49f7 1045 " --user Run a user instance\n"
a5d87bf0
LP
1046 " --dump-core[=0|1] Dump core on crash\n"
1047 " --crash-shell[=0|1] Run shell on crash\n"
1048 " --confirm-spawn[=0|1] Ask for confirmation when spawning processes\n"
6e98720f 1049 " --show-status[=0|1] Show status updates on the console during bootup\n"
4cfa2c99 1050 " --log-target=TARGET Set log target (console, journal, syslog, kmsg, journal-or-kmsg, syslog-or-kmsg, null)\n"
9e58ff9c 1051 " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
2218198b 1052 " --log-color[=0|1] Highlight important log messages\n"
0a494f1f
LP
1053 " --log-location[=0|1] Include code location in log messages\n"
1054 " --default-standard-output= Set default standard output for services\n"
1055 " --default-standard-error= Set default standard error output for services\n",
5b6319dc 1056 program_invocation_short_name);
f170852a
LP
1057
1058 return 0;
1059}
1060
9ba0bc4e
ZJS
1061static int version(void) {
1062 puts(PACKAGE_STRING);
1063 puts(DISTRIBUTION);
1064 puts(SYSTEMD_FEATURES);
1065
1066 return 0;
1067}
1068
6b78f9b4 1069static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool serialize_jobs) {
a16e1123
LP
1070 FILE *f = NULL;
1071 FDSet *fds = NULL;
1072 int r;
1073
1074 assert(m);
1075 assert(_f);
1076 assert(_fds);
1077
a7556052
LP
1078 /* Make sure nothing is really destructed when we shut down */
1079 m->n_reloading ++;
1080
6b78f9b4
LP
1081 r = manager_open_serialization(m, &f);
1082 if (r < 0) {
35b8ca3a 1083 log_error("Failed to create serialization file: %s", strerror(-r));
a16e1123
LP
1084 goto fail;
1085 }
1086
6b78f9b4
LP
1087 fds = fdset_new();
1088 if (!fds) {
a16e1123
LP
1089 r = -ENOMEM;
1090 log_error("Failed to allocate fd set: %s", strerror(-r));
1091 goto fail;
1092 }
1093
6b78f9b4
LP
1094 r = manager_serialize(m, f, fds, serialize_jobs);
1095 if (r < 0) {
a16e1123
LP
1096 log_error("Failed to serialize state: %s", strerror(-r));
1097 goto fail;
1098 }
1099
1100 if (fseeko(f, 0, SEEK_SET) < 0) {
1101 log_error("Failed to rewind serialization fd: %m");
1102 goto fail;
1103 }
1104
6b78f9b4
LP
1105 r = fd_cloexec(fileno(f), false);
1106 if (r < 0) {
a16e1123
LP
1107 log_error("Failed to disable O_CLOEXEC for serialization: %s", strerror(-r));
1108 goto fail;
1109 }
1110
6b78f9b4
LP
1111 r = fdset_cloexec(fds, false);
1112 if (r < 0) {
a16e1123
LP
1113 log_error("Failed to disable O_CLOEXEC for serialization fds: %s", strerror(-r));
1114 goto fail;
1115 }
1116
1117 *_f = f;
1118 *_fds = fds;
1119
1120 return 0;
1121
1122fail:
1123 fdset_free(fds);
1124
1125 if (f)
1126 fclose(f);
1127
1128 return r;
1129}
1130
4096d6f5
LP
1131static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
1132 struct rlimit nl;
1133 int r;
1134
1135 assert(saved_rlimit);
1136
1137 /* Save the original RLIMIT_NOFILE so that we can reset it
1138 * later when transitioning from the initrd to the main
1139 * systemd or suchlike. */
1140 if (getrlimit(RLIMIT_NOFILE, saved_rlimit) < 0) {
1141 log_error("Reading RLIMIT_NOFILE failed: %m");
1142 return -errno;
1143 }
1144
1145 /* Make sure forked processes get the default kernel setting */
1146 if (!arg_default_rlimit[RLIMIT_NOFILE]) {
1147 struct rlimit *rl;
1148
1149 rl = newdup(struct rlimit, saved_rlimit, 1);
1150 if (!rl)
1151 return log_oom();
1152
1153 arg_default_rlimit[RLIMIT_NOFILE] = rl;
1154 }
1155
1156 /* Bump up the resource limit for ourselves substantially */
1157 nl.rlim_cur = nl.rlim_max = 64*1024;
1158 r = setrlimit_closest(RLIMIT_NOFILE, &nl);
1159 if (r < 0) {
1160 log_error("Setting RLIMIT_NOFILE failed: %s", strerror(-r));
1161 return r;
1162 }
1163
1164 return 0;
1165}
1166
e9ddabc2
LP
1167static struct dual_timestamp* parse_initrd_timestamp(struct dual_timestamp *t) {
1168 const char *e;
1169 unsigned long long a, b;
1170
1171 assert(t);
1172
966a5d37
LP
1173 e = getenv("RD_TIMESTAMP");
1174 if (!e)
e9ddabc2
LP
1175 return NULL;
1176
1177 if (sscanf(e, "%llu %llu", &a, &b) != 2)
1178 return NULL;
1179
1180 t->realtime = (usec_t) a;
1181 t->monotonic = (usec_t) b;
1182
1183 return t;
1184}
1185
6ee5bbf8
LP
1186static void test_mtab(void) {
1187 char *p;
1188
80758717
LP
1189 /* Check that /etc/mtab is a symlink */
1190
6ee5bbf8
LP
1191 if (readlink_malloc("/etc/mtab", &p) >= 0) {
1192 bool b;
1193
ed86ebc4 1194 b = streq(p, "/proc/self/mounts") || streq(p, "/proc/mounts");
6ee5bbf8
LP
1195 free(p);
1196
1197 if (b)
1198 return;
1199 }
1200
80758717
LP
1201 log_warning("/etc/mtab is not a symlink or not pointing to /proc/self/mounts. "
1202 "This is not supported anymore. "
1203 "Please make sure to replace this file by a symlink to avoid incorrect or misleading mount(8) output.");
1204}
1205
1206static void test_usr(void) {
80758717 1207
ed1c99fc 1208 /* Check that /usr is not a separate fs */
80758717 1209
871c44a7
LP
1210 if (dir_is_empty("/usr") <= 0)
1211 return;
1212
2376ce13 1213 log_warning("/usr appears to be on its own filesytem and is not already mounted. This is not a supported setup. "
871c44a7
LP
1214 "Some things will probably break (sometimes even silently) in mysterious ways. "
1215 "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
1216}
1217
1218static void test_cgroups(void) {
1219
1220 if (access("/proc/cgroups", F_OK) >= 0)
1221 return;
1222
1223 log_warning("CONFIG_CGROUPS was not set when your kernel was compiled. "
1224 "Systems without control groups are not supported. "
1225 "We will now sleep for 10s, and then continue boot-up. "
1226 "Expect breakage and please do not file bugs. "
966a5d37
LP
1227 "Instead fix your kernel and enable CONFIG_CGROUPS. "
1228 "Consult http://0pointer.de/blog/projects/cgroups-vs-cgroups.html for more information.");
871c44a7
LP
1229
1230 sleep(10);
6ee5bbf8
LP
1231}
1232
a07fdfa3
LP
1233static int initialize_join_controllers(void) {
1234 /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
1235 * + "net_prio". We'd like to add "cpuset" to the mix, but
1236 * "cpuset" does't really work for groups with no initialized
1237 * attributes. */
1238
1239 arg_join_controllers = new(char**, 3);
1240 if (!arg_join_controllers)
1241 return -ENOMEM;
1242
1243 arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
1244 if (!arg_join_controllers[0])
1245 return -ENOMEM;
1246
1247 arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL);
1248 if (!arg_join_controllers[1])
1249 return -ENOMEM;
1250
1251 arg_join_controllers[2] = NULL;
1252 return 0;
1253}
1254
60918275
LP
1255int main(int argc, char *argv[]) {
1256 Manager *m = NULL;
22f4096c 1257 int r, retval = EXIT_FAILURE;
9d76d730
LP
1258 usec_t before_startup, after_startup;
1259 char timespan[FORMAT_TIMESPAN_MAX];
a16e1123
LP
1260 FDSet *fds = NULL;
1261 bool reexecute = false;
b9080b03 1262 const char *shutdown_verb = NULL;
e9ddabc2 1263 dual_timestamp initrd_timestamp = { 0ULL, 0ULL };
5d6b1584 1264 static char systemd[] = "systemd";
2660882b 1265 bool skip_setup = false;
0b3325e7
LP
1266 int j;
1267 bool loaded_policy = false;
e96d6be7 1268 bool arm_reboot_watchdog = false;
bf4df7c3 1269 bool queue_default_job = false;
41669317 1270 char *switch_root_dir = NULL, *switch_root_init = NULL;
4096d6f5 1271 static struct rlimit saved_rlimit_nofile = { 0, 0 };
27b14a22 1272
058dc6f3 1273#ifdef HAVE_SYSV_COMPAT
2cb1a60d 1274 if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
35b8ca3a 1275 /* This is compatibility support for SysV, where
2cb1a60d
LP
1276 * calling init as a user is identical to telinit. */
1277
1278 errno = -ENOENT;
1279 execv(SYSTEMCTL_BINARY_PATH, argv);
1280 log_error("Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
1281 return 1;
1282 }
058dc6f3 1283#endif
2cb1a60d 1284
0b3325e7
LP
1285 /* Determine if this is a reexecution or normal bootup. We do
1286 * the full command line parsing much later, so let's just
1287 * have a quick peek here. */
0b3325e7
LP
1288 for (j = 1; j < argc; j++)
1289 if (streq(argv[j], "--deserialize")) {
2660882b 1290 skip_setup = true;
7aaa27f2 1291 break;
0b3325e7
LP
1292 }
1293
2660882b
LP
1294 /* If we have switched root, do all the special setup
1295 * things */
d03bc1b8 1296 for (j = 1; j < argc; j++)
2660882b
LP
1297 if (streq(argv[j], "--switched-root")) {
1298 skip_setup = false;
d03bc1b8
HH
1299 break;
1300 }
1301
f3b6a3ed
LP
1302 /* If we get started via the /sbin/init symlink then we are
1303 called 'init'. After a subsequent reexecution we are then
1304 called 'systemd'. That is confusing, hence let's call us
1305 systemd right-away. */
f3b6a3ed
LP
1306 program_invocation_short_name = systemd;
1307 prctl(PR_SET_NAME, systemd);
5d6b1584 1308
9a0e6896
LP
1309 saved_argv = argv;
1310 saved_argc = argc;
f3b6a3ed 1311
2cc59dbf 1312 log_show_color(isatty(STDERR_FILENO) > 0);
bbe63281 1313
a866073d
LP
1314 if (getpid() == 1 && detect_container(NULL) <= 0) {
1315
1316 /* Running outside of a container as PID 1 */
67445f4e 1317 arg_running_as = SYSTEMD_SYSTEM;
a866073d
LP
1318 make_null_stdio();
1319 log_set_target(LOG_TARGET_KMSG);
1320 log_open();
1321
c3ba6250
HH
1322 if (in_initrd()) {
1323 char *rd_timestamp = NULL;
1324
1325 dual_timestamp_get(&initrd_timestamp);
1326 asprintf(&rd_timestamp, "%llu %llu",
1327 (unsigned long long) initrd_timestamp.realtime,
1328 (unsigned long long) initrd_timestamp.monotonic);
1329 if (rd_timestamp) {
1330 setenv("RD_TIMESTAMP", rd_timestamp, 1);
1331 free(rd_timestamp);
1332 }
1333 }
1334
2660882b 1335 if (!skip_setup) {
0b3325e7
LP
1336 if (selinux_setup(&loaded_policy) < 0)
1337 goto finish;
81611586
RS
1338 if (ima_setup() < 0)
1339 goto finish;
1340 }
0b3325e7 1341
e9a5ef7c 1342 if (label_init(NULL) < 0)
0ff4cdd9 1343 goto finish;
7948c4df 1344
72edcff5 1345 if (!skip_setup) {
0b3325e7
LP
1346 if (hwclock_is_localtime() > 0) {
1347 int min;
7948c4df 1348
72edcff5
KS
1349 /* The first-time call to settimeofday() does a time warp in the kernel */
1350 r = hwclock_set_timezone(&min);
0b3325e7
LP
1351 if (r < 0)
1352 log_error("Failed to apply local time delta, ignoring: %s", strerror(-r));
1353 else
1354 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
19e65613
KS
1355 } else if (!in_initrd()) {
1356 /*
1357 * Do dummy first-time call to seal the kernel's time warp magic
1358 *
1359 * Do not call this this from inside the initrd. The initrd might not
1360 * carry /etc/adjtime with LOCAL, but the real system could be set up
1361 * that way. In such case, we need to delay the time-warp or the sealing
1362 * until we reach the real system.
1363 */
72edcff5 1364 hwclock_reset_timezone();
871e5809 1365
72edcff5
KS
1366 /* Tell the kernel our time zone */
1367 r = hwclock_set_timezone(NULL);
1368 if (r < 0)
1369 log_error("Failed to set the kernel's time zone, ignoring: %s", strerror(-r));
1370 }
1371 }
a866073d
LP
1372
1373 /* Set the default for later on, but don't actually
1374 * open the logs like this for now. Note that if we
1375 * are transitioning from the initrd there might still
1376 * be journal fd open, and we shouldn't attempt
1377 * opening that before we parsed /proc/cmdline which
1378 * might redirect output elsewhere. */
1379 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1380
1381 } else if (getpid() == 1) {
1382
1383 /* Running inside a container, as PID 1 */
67445f4e 1384 arg_running_as = SYSTEMD_SYSTEM;
a866073d
LP
1385 log_set_target(LOG_TARGET_CONSOLE);
1386 log_open();
1387
1388 /* For the later on, see above... */
1389 log_set_target(LOG_TARGET_JOURNAL);
1390
bbe63281 1391 } else {
a866073d
LP
1392
1393 /* Running as user instance */
67445f4e 1394 arg_running_as = SYSTEMD_USER;
eeecf6e6 1395 log_set_target(LOG_TARGET_AUTO);
871e5809 1396 log_open();
bbe63281 1397 }
a5dab5ce 1398
0c85a4f3 1399 /* Initialize default unit */
6afa301b
LP
1400 r = set_default_unit(SPECIAL_DEFAULT_TARGET);
1401 if (r < 0) {
14212119 1402 log_error("Failed to set default unit %s: %s", SPECIAL_DEFAULT_TARGET, strerror(-r));
f170852a 1403 goto finish;
14212119 1404 }
60918275 1405
a07fdfa3
LP
1406 r = initialize_join_controllers();
1407 if (r < 0)
0c85a4f3
LP
1408 goto finish;
1409
f170852a
LP
1410 /* Mount /proc, /sys and friends, so that /proc/cmdline and
1411 * /proc/$PID/fd is available. */
0c85a4f3
LP
1412 if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS")) {
1413 r = mount_setup(loaded_policy);
1414 if (r < 0)
8efe3c01 1415 goto finish;
0c85a4f3 1416 }
4ade7963
LP
1417
1418 /* Reset all signal handlers. */
1419 assert_se(reset_all_signal_handlers() == 0);
1420
078e4539 1421 /* If we are init, we can block sigkill. Yay. */
9a34ec5f 1422 ignore_signals(SIGNALS_IGNORE, -1);
078e4539 1423
487393e9
LP
1424 if (parse_config_file() < 0)
1425 goto finish;
1426
67445f4e 1427 if (arg_running_as == SYSTEMD_SYSTEM)
a5dab5ce
LP
1428 if (parse_proc_cmdline() < 0)
1429 goto finish;
f170852a
LP
1430
1431 log_parse_environment();
1432
1433 if (parse_argv(argc, argv) < 0)
1434 goto finish;
1435
6bae23a0
TB
1436 if (arg_action == ACTION_TEST &&
1437 geteuid() == 0) {
b5c6cf87
LP
1438 log_error("Don't run test mode as root.");
1439 goto finish;
1440 }
1441
6bae23a0
TB
1442 if (arg_running_as == SYSTEMD_USER &&
1443 arg_action == ACTION_RUN &&
1444 sd_booted() <= 0) {
1445 log_error("Trying to run as user instance, but the system has not been booted with systemd.");
1446 goto finish;
1447 }
1448
67445f4e 1449 if (arg_running_as == SYSTEMD_SYSTEM &&
fe783b03
LP
1450 arg_action == ACTION_RUN &&
1451 running_in_chroot() > 0) {
1452 log_error("Cannot be run in a chroot() environment.");
1453 goto finish;
1454 }
1455
fa0f4d8a 1456 if (arg_action == ACTION_HELP) {
f170852a
LP
1457 retval = help();
1458 goto finish;
9ba0bc4e
ZJS
1459 } else if (arg_action == ACTION_VERSION) {
1460 retval = version();
1461 goto finish;
fa0f4d8a 1462 } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
e537352b 1463 unit_dump_config_items(stdout);
22f4096c 1464 retval = EXIT_SUCCESS;
e537352b 1465 goto finish;
fa0f4d8a 1466 } else if (arg_action == ACTION_DONE) {
22f4096c 1467 retval = EXIT_SUCCESS;
4288f619 1468 goto finish;
f170852a
LP
1469 }
1470
fa0f4d8a 1471 assert_se(arg_action == ACTION_RUN || arg_action == ACTION_TEST);
f170852a 1472
871e5809
LP
1473 /* Close logging fds, in order not to confuse fdset below */
1474 log_close();
1475
a16e1123
LP
1476 /* Remember open file descriptors for later deserialization */
1477 if (serialization) {
966a5d37
LP
1478 r = fdset_new_fill(&fds);
1479 if (r < 0) {
a16e1123
LP
1480 log_error("Failed to allocate fd set: %s", strerror(-r));
1481 goto finish;
1482 }
1483
1484 assert_se(fdset_remove(fds, fileno(serialization)) >= 0);
1485 } else
1486 close_all_fds(NULL, 0);
1487
09082a94 1488 /* Set up PATH unless it is already set */
e537352b 1489 setenv("PATH",
2c6db6fb 1490#ifdef HAVE_SPLIT_USR
e537352b 1491 "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
2c6db6fb
LP
1492#else
1493 "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin",
1494#endif
67445f4e 1495 arg_running_as == SYSTEMD_SYSTEM);
09082a94 1496
67445f4e 1497 if (arg_running_as == SYSTEMD_SYSTEM) {
71ecc858
LP
1498 /* Parse the data passed to us. We leave this
1499 * variables set, but the manager later on will not
1500 * pass them on to our children. */
2660882b 1501 if (!in_initrd())
c3ba6250 1502 parse_initrd_timestamp(&initrd_timestamp);
e9ddabc2
LP
1503
1504 /* Unset some environment variables passed in from the
1505 * kernel that don't really make sense for us. */
39439087
LP
1506 unsetenv("HOME");
1507 unsetenv("TERM");
b770165a 1508
9543ad16
LP
1509 /* When we are invoked by a shell, these might be set,
1510 * but make little sense to pass on */
1511 unsetenv("PWD");
1512 unsetenv("SHLVL");
1513 unsetenv("_");
1514
2660882b 1515 /* When we are invoked by a chroot-like tool such as
9f28b98e
LP
1516 * nspawn, these might be set, but make little sense
1517 * to pass on */
1518 unsetenv("USER");
1519 unsetenv("LOGNAME");
1520
b770165a
LP
1521 /* All other variables are left as is, so that clients
1522 * can still read them via /proc/1/environ */
39439087 1523 }
1104f3c1 1524
f170852a
LP
1525 /* Move out of the way, so that we won't block unmounts */
1526 assert_se(chdir("/") == 0);
1527
67445f4e 1528 if (arg_running_as == SYSTEMD_SYSTEM) {
80876c20
LP
1529 /* Become a session leader if we aren't one yet. */
1530 setsid();
4ade7963 1531
80876c20
LP
1532 /* Disable the umask logic */
1533 umask(0);
1534 }
1535
843d2643
LP
1536 /* Make sure D-Bus doesn't fiddle with the SIGPIPE handlers */
1537 dbus_connection_set_change_sigpipe(FALSE);
1538
2146621b
LP
1539 /* Reset the console, but only if this is really init and we
1540 * are freshly booted */
67445f4e 1541 if (arg_running_as == SYSTEMD_SYSTEM && arg_action == ACTION_RUN)
2660882b 1542 console_setup(getpid() == 1 && !skip_setup);
4ade7963 1543
18149b9f 1544 /* Open the logging devices, if possible and necessary */
843d2643 1545 log_open();
4ade7963 1546
5373d602
LP
1547 /* Make sure we leave a core dump without panicing the
1548 * kernel. */
4fc935ca
LP
1549 if (getpid() == 1)
1550 install_crash_handler();
97c4f35c 1551
0c85a4f3
LP
1552 if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS")) {
1553 r = mount_cgroup_controllers(arg_join_controllers);
1554 if (r < 0)
1555 goto finish;
1556 }
1557
67445f4e 1558 if (arg_running_as == SYSTEMD_SYSTEM) {
c20f5ac7
LP
1559 const char *virtualization = NULL;
1560
1561 log_info(PACKAGE_STRING " running in system mode. (" SYSTEMD_FEATURES "; " DISTRIBUTION ")");
1562
1563 detect_virtualization(&virtualization);
1564 if (virtualization)
1565 log_info("Detected virtualization '%s'.", virtualization);
1566
26a1efdf
LP
1567 if (in_initrd())
1568 log_info("Running in initial RAM disk.");
1569
c20f5ac7
LP
1570 } else
1571 log_debug(PACKAGE_STRING " running in user mode. (" SYSTEMD_FEATURES "; " DISTRIBUTION ")");
a5dab5ce 1572
67445f4e 1573 if (arg_running_as == SYSTEMD_SYSTEM && !skip_setup) {
72bca11b
LP
1574 locale_setup();
1575
6faa1114 1576 if (arg_show_status || plymouth_running())
888c6216
LP
1577 status_welcome();
1578
e3043162 1579#ifdef HAVE_KMOD
888c6216 1580 kmod_setup();
e3043162 1581#endif
888c6216 1582 hostname_setup();
d7ccca2e 1583 machine_id_setup();
888c6216 1584 loopback_setup();
490aed58 1585
6ee5bbf8 1586 test_mtab();
80758717 1587 test_usr();
871c44a7 1588 test_cgroups();
af5bc85d 1589 }
302e8c4c 1590
67445f4e 1591 if (arg_running_as == SYSTEMD_SYSTEM && arg_runtime_watchdog > 0)
e96d6be7
LP
1592 watchdog_set_timeout(&arg_runtime_watchdog);
1593
aa0f64ac
LP
1594 if (arg_timer_slack_nsec != (nsec_t) -1)
1595 if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
1596 log_error("Failed to adjust timer slack: %m");
1597
ec8927ca
LP
1598 if (arg_capability_bounding_set_drop) {
1599 r = capability_bounding_set_drop(arg_capability_bounding_set_drop, true);
1600 if (r < 0) {
1601 log_error("Failed to drop capability bounding set: %s", strerror(-r));
1602 goto finish;
1603 }
939b8f14
LP
1604 r = capability_bounding_set_drop_usermode(arg_capability_bounding_set_drop);
1605 if (r < 0) {
1606 log_error("Failed to drop capability bounding set of usermode helpers: %s", strerror(-r));
1607 goto finish;
1608 }
ec8927ca
LP
1609 }
1610
67445f4e 1611 if (arg_running_as == SYSTEMD_USER) {
d4447f4d 1612 /* Become reaper of our children */
8b8ffe68
LP
1613 if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0) {
1614 log_warning("Failed to make us a subreaper: %m");
1615 if (errno == EINVAL)
ddfa5101 1616 log_info("Perhaps the kernel version is too old (< 3.4?)");
8b8ffe68 1617 }
d4447f4d
AK
1618 }
1619
67445f4e 1620 if (arg_running_as == SYSTEMD_SYSTEM)
4096d6f5
LP
1621 bump_rlimit_nofile(&saved_rlimit_nofile);
1622
e96d6be7
LP
1623 r = manager_new(arg_running_as, &m);
1624 if (r < 0) {
8e274523 1625 log_error("Failed to allocate manager object: %s", strerror(-r));
60918275
LP
1626 goto finish;
1627 }
1628
9e58ff9c 1629 m->confirm_spawn = arg_confirm_spawn;
0a494f1f
LP
1630 m->default_std_output = arg_default_std_output;
1631 m->default_std_error = arg_default_std_error;
e96d6be7
LP
1632 m->runtime_watchdog = arg_runtime_watchdog;
1633 m->shutdown_watchdog = arg_shutdown_watchdog;
9e58ff9c 1634
c93ff2e9
FC
1635 manager_set_default_rlimits(m, arg_default_rlimit);
1636
e9ddabc2
LP
1637 if (dual_timestamp_is_set(&initrd_timestamp))
1638 m->initrd_timestamp = initrd_timestamp;
1639
06d4c99a
LP
1640 if (arg_default_controllers)
1641 manager_set_default_controllers(m, arg_default_controllers);
1642
27d340c7
LP
1643 manager_set_show_status(m, arg_show_status);
1644
bf4df7c3
LP
1645 /* Remember whether we should queue the default job */
1646 queue_default_job = !serialization || arg_switched_root;
1647
9d76d730
LP
1648 before_startup = now(CLOCK_MONOTONIC);
1649
e96d6be7
LP
1650 r = manager_startup(m, serialization, fds);
1651 if (r < 0)
6e2ef85b 1652 log_error("Failed to fully start up daemon: %s", strerror(-r));
a16e1123 1653
bf4df7c3
LP
1654 /* This will close all file descriptors that were opened, but
1655 * not claimed by any unit. */
a16e1123 1656 if (fds) {
a16e1123
LP
1657 fdset_free(fds);
1658 fds = NULL;
f50e0a01
LP
1659 }
1660
a16e1123
LP
1661 if (serialization) {
1662 fclose(serialization);
1663 serialization = NULL;
bf4df7c3
LP
1664 }
1665
1666 if (queue_default_job) {
398ef8ba 1667 DBusError error;
1c27d3f3 1668 Unit *target = NULL;
bacbccb7 1669 Job *default_unit_job;
398ef8ba
LP
1670
1671 dbus_error_init(&error);
1672
fa0f4d8a 1673 log_debug("Activating default unit: %s", arg_default_unit);
a16e1123 1674
e96d6be7
LP
1675 r = manager_load_unit(m, arg_default_unit, NULL, &error, &target);
1676 if (r < 0) {
398ef8ba
LP
1677 log_error("Failed to load default target: %s", bus_error(&error, r));
1678 dbus_error_free(&error);
ac155bb8
MS
1679 } else if (target->load_state == UNIT_ERROR)
1680 log_error("Failed to load default target: %s", strerror(-target->load_error));
1681 else if (target->load_state == UNIT_MASKED)
6daf4f90 1682 log_error("Default target masked.");
27b14a22 1683
ac155bb8 1684 if (!target || target->load_state != UNIT_LOADED) {
a16e1123 1685 log_info("Trying to load rescue target...");
1c27d3f3 1686
e96d6be7
LP
1687 r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target);
1688 if (r < 0) {
398ef8ba
LP
1689 log_error("Failed to load rescue target: %s", bus_error(&error, r));
1690 dbus_error_free(&error);
a16e1123 1691 goto finish;
ac155bb8
MS
1692 } else if (target->load_state == UNIT_ERROR) {
1693 log_error("Failed to load rescue target: %s", strerror(-target->load_error));
1c27d3f3 1694 goto finish;
ac155bb8 1695 } else if (target->load_state == UNIT_MASKED) {
6daf4f90 1696 log_error("Rescue target masked.");
00dc5d76 1697 goto finish;
a16e1123
LP
1698 }
1699 }
37d88da7 1700
ac155bb8 1701 assert(target->load_state == UNIT_LOADED);
00dc5d76 1702
fa0f4d8a 1703 if (arg_action == ACTION_TEST) {
40d50879 1704 printf("-> By units:\n");
a16e1123
LP
1705 manager_dump_units(m, stdout, "\t");
1706 }
1707
bacbccb7
MS
1708 r = manager_add_job(m, JOB_START, target, JOB_REPLACE, false, &error, &default_unit_job);
1709 if (r < 0) {
398ef8ba
LP
1710 log_error("Failed to start default target: %s", bus_error(&error, r));
1711 dbus_error_free(&error);
37d88da7
LP
1712 goto finish;
1713 }
bacbccb7 1714 m->default_unit_job_id = default_unit_job->id;
60918275 1715
07672f49
LP
1716 after_startup = now(CLOCK_MONOTONIC);
1717 log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG,
1718 "Loaded units and determined initial transaction in %s.",
1719 format_timespan(timespan, sizeof(timespan), after_startup - before_startup));
1720
fa0f4d8a 1721 if (arg_action == ACTION_TEST) {
40d50879 1722 printf("-> By jobs:\n");
a16e1123 1723 manager_dump_jobs(m, stdout, "\t");
22f4096c 1724 retval = EXIT_SUCCESS;
a16e1123
LP
1725 goto finish;
1726 }
e965d56d 1727 }
d46de8a1 1728
a16e1123 1729 for (;;) {
e96d6be7
LP
1730 r = manager_loop(m);
1731 if (r < 0) {
a16e1123
LP
1732 log_error("Failed to run mainloop: %s", strerror(-r));
1733 goto finish;
1734 }
11dd41ce 1735
a16e1123 1736 switch (m->exit_code) {
e965d56d 1737
a16e1123 1738 case MANAGER_EXIT:
22f4096c 1739 retval = EXIT_SUCCESS;
a16e1123
LP
1740 log_debug("Exit.");
1741 goto finish;
e965d56d 1742
a16e1123 1743 case MANAGER_RELOAD:
e015090f 1744 log_info("Reloading.");
e96d6be7
LP
1745 r = manager_reload(m);
1746 if (r < 0)
a16e1123
LP
1747 log_error("Failed to reload: %s", strerror(-r));
1748 break;
cea8e32e 1749
a16e1123 1750 case MANAGER_REEXECUTE:
664f88a7 1751
6b78f9b4 1752 if (prepare_reexecute(m, &serialization, &fds, true) < 0)
a16e1123 1753 goto finish;
60918275 1754
a16e1123 1755 reexecute = true;
e015090f 1756 log_notice("Reexecuting.");
a16e1123
LP
1757 goto finish;
1758
664f88a7
LP
1759 case MANAGER_SWITCH_ROOT:
1760 /* Steal the switch root parameters */
41669317 1761 switch_root_dir = m->switch_root;
664f88a7
LP
1762 switch_root_init = m->switch_root_init;
1763 m->switch_root = m->switch_root_init = NULL;
1764
1765 if (!switch_root_init)
6b78f9b4 1766 if (prepare_reexecute(m, &serialization, &fds, false) < 0)
664f88a7
LP
1767 goto finish;
1768
1769 reexecute = true;
1770 log_notice("Switching root.");
1771 goto finish;
1772
b9080b03
FF
1773 case MANAGER_REBOOT:
1774 case MANAGER_POWEROFF:
1775 case MANAGER_HALT:
1776 case MANAGER_KEXEC: {
1777 static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
1778 [MANAGER_REBOOT] = "reboot",
1779 [MANAGER_POWEROFF] = "poweroff",
1780 [MANAGER_HALT] = "halt",
1781 [MANAGER_KEXEC] = "kexec"
1782 };
1783
1784 assert_se(shutdown_verb = table[m->exit_code]);
e96d6be7 1785 arm_reboot_watchdog = m->exit_code == MANAGER_REBOOT;
b9080b03
FF
1786
1787 log_notice("Shutting down.");
1788 goto finish;
1789 }
1790
a16e1123
LP
1791 default:
1792 assert_not_reached("Unknown exit code.");
1793 }
1794 }
f170852a 1795
60918275
LP
1796finish:
1797 if (m)
1798 manager_free(m);
1799
c93ff2e9 1800 for (j = 0; j < RLIMIT_NLIMITS; j++)
4096d6f5 1801 free(arg_default_rlimit[j]);
c93ff2e9 1802
fa0f4d8a 1803 free(arg_default_unit);
06d4c99a 1804 strv_free(arg_default_controllers);
0c85a4f3 1805 free_join_controllers();
b9cd2ec1 1806
ea430986 1807 dbus_shutdown();
b2bb3dbe
LP
1808 label_finish();
1809
a16e1123 1810 if (reexecute) {
664f88a7 1811 const char **args;
e564a982 1812 unsigned i, args_size;
a16e1123 1813
664f88a7
LP
1814 /* Close and disarm the watchdog, so that the new
1815 * instance can reinitialize it, but doesn't get
1816 * rebooted while we do that */
1817 watchdog_close(true);
a16e1123 1818
4096d6f5
LP
1819 /* Reset the RLIMIT_NOFILE to the kernel default, so
1820 * that the new systemd can pass the kernel default to
1821 * its child processes */
1822 if (saved_rlimit_nofile.rlim_cur > 0)
1823 setrlimit(RLIMIT_NOFILE, &saved_rlimit_nofile);
1824
41669317 1825 if (switch_root_dir) {
cee530bb
LP
1826 /* Kill all remaining processes from the
1827 * initrd, but don't wait for them, so that we
1828 * can handle the SIGCHLD for them after
1829 * deserializing. */
1830 broadcast_signal(SIGTERM, false);
bd3fa1d2
LP
1831
1832 /* And switch root */
41669317
LP
1833 r = switch_root(switch_root_dir);
1834 if (r < 0)
1835 log_error("Failed to switch root, ignoring: %s", strerror(-r));
1836 }
a16e1123 1837
d03bc1b8 1838 args_size = MAX(6, argc+1);
e564a982 1839 args = newa(const char*, args_size);
a16e1123 1840
664f88a7
LP
1841 if (!switch_root_init) {
1842 char sfd[16];
a16e1123 1843
664f88a7
LP
1844 /* First try to spawn ourselves with the right
1845 * path, and with full serialization. We do
1846 * this only if the user didn't specify an
1847 * explicit init to spawn. */
edb9aaa8 1848
664f88a7
LP
1849 assert(serialization);
1850 assert(fds);
edb9aaa8 1851
664f88a7
LP
1852 snprintf(sfd, sizeof(sfd), "%i", fileno(serialization));
1853 char_array_0(sfd);
edb9aaa8 1854
664f88a7
LP
1855 i = 0;
1856 args[i++] = SYSTEMD_BINARY_PATH;
41669317 1857 if (switch_root_dir)
2660882b 1858 args[i++] = "--switched-root";
67445f4e 1859 args[i++] = arg_running_as == SYSTEMD_SYSTEM ? "--system" : "--user";
664f88a7
LP
1860 args[i++] = "--deserialize";
1861 args[i++] = sfd;
1862 args[i++] = NULL;
edb9aaa8 1863
e564a982 1864 assert(i <= args_size);
664f88a7
LP
1865 execv(args[0], (char* const*) args);
1866 }
6e98720f 1867
664f88a7
LP
1868 /* Try the fallback, if there is any, without any
1869 * serialization. We pass the original argv[] and
1870 * envp[]. (Well, modulo the ordering changes due to
1871 * getopt() in argv[], and some cleanups in envp[],
1872 * but let's hope that doesn't matter.) */
a16e1123 1873
b8f83232 1874 if (serialization) {
664f88a7 1875 fclose(serialization);
b8f83232
LP
1876 serialization = NULL;
1877 }
a16e1123 1878
b8f83232 1879 if (fds) {
664f88a7 1880 fdset_free(fds);
b8f83232
LP
1881 fds = NULL;
1882 }
a16e1123 1883
a504223d
HH
1884 /* Reopen the console */
1885 make_console_stdio();
1886
b8f83232 1887 for (j = 1, i = 1; j < argc; j++)
664f88a7 1888 args[i++] = argv[j];
a16e1123 1889 args[i++] = NULL;
e564a982 1890 assert(i <= args_size);
b8f83232
LP
1891
1892 if (switch_root_init) {
1893 args[0] = switch_root_init;
1894 execv(args[0], (char* const*) args);
1895 log_warning("Failed to execute configured init, trying fallback: %m");
1896 }
1897
1898 args[0] = "/sbin/init";
a16e1123
LP
1899 execv(args[0], (char* const*) args);
1900
745e2fb7
KS
1901 if (errno == ENOENT) {
1902 log_warning("No /sbin/init, trying fallback");
b8f83232 1903
745e2fb7
KS
1904 args[0] = "/bin/sh";
1905 args[1] = NULL;
1906 execv(args[0], (char* const*) args);
1907 log_error("Failed to execute /bin/sh, giving up: %m");
1908 } else
1909 log_warning("Failed to execute /sbin/init, giving up: %m");
a16e1123
LP
1910 }
1911
1912 if (serialization)
1913 fclose(serialization);
1914
1915 if (fds)
1916 fdset_free(fds);
1917
b9080b03
FF
1918 if (shutdown_verb) {
1919 const char * command_line[] = {
1920 SYSTEMD_SHUTDOWN_BINARY_PATH,
1921 shutdown_verb,
1922 NULL
1923 };
d18f337c 1924 char **env_block;
b9080b03 1925
e96d6be7 1926 if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) {
d18f337c
LP
1927 char e[32];
1928
e96d6be7
LP
1929 /* If we reboot let's set the shutdown
1930 * watchdog and tell the shutdown binary to
1931 * repeatedly ping it */
1932 watchdog_set_timeout(&arg_shutdown_watchdog);
1933 watchdog_close(false);
1934
1935 /* Tell the binary how often to ping */
1936 snprintf(e, sizeof(e), "WATCHDOG_USEC=%llu", (unsigned long long) arg_shutdown_watchdog);
1937 char_array_0(e);
d18f337c
LP
1938
1939 env_block = strv_append(environ, e);
1940 } else {
1941 env_block = strv_copy(environ);
e96d6be7 1942 watchdog_close(true);
d18f337c 1943 }
e96d6be7 1944
d18f337c
LP
1945 execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
1946 free(env_block);
b9080b03
FF
1947 log_error("Failed to execute shutdown binary, freezing: %m");
1948 }
1949
c3b3c274
LP
1950 if (getpid() == 1)
1951 freeze();
1952
60918275
LP
1953 return retval;
1954}