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