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