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