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