main.c revision 81f5fc2d43800c23a4440ed94cfe38d579e896fe
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen/***
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen This file is part of systemd.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen Copyright 2010 Lennart Poettering
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen systemd is free software; you can redistribute it and/or modify it
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen under the terms of the GNU Lesser General Public License as published by
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen the Free Software Foundation; either version 2.1 of the License, or
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen (at your option) any later version.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen systemd is distributed in the hope that it will be useful, but
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen WITHOUT ANY WARRANTY; without even the implied warranty of
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen Lesser General Public License for more details.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen You should have received a copy of the GNU Lesser General Public License
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen***/
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen#include <stdio.h>
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen#include <errno.h>
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering#include <string.h>
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include <unistd.h>
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include <sys/types.h>
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include <sys/stat.h>
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen#include <getopt.h>
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include <signal.h>
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen#include <sys/wait.h>
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen#include <fcntl.h>
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen#include <sys/prctl.h>
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen#include <sys/mount.h>
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering#ifdef HAVE_VALGRIND_VALGRIND_H
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering#include <valgrind/valgrind.h>
a5a807e63a50314e190e9166d8a453cd8dd258e3Zbigniew Jędrzejewski-Szmek#endif
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering#ifdef HAVE_SECCOMP
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering#include <seccomp.h>
39d8db043b599a7382f94bfc904d5e108af438bdLennart Poettering#endif
39d8db043b599a7382f94bfc904d5e108af438bdLennart Poettering
39d8db043b599a7382f94bfc904d5e108af438bdLennart Poettering#include "sd-daemon.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "sd-messages.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "sd-bus.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "log.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "fdset.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "special.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "conf-parser.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "missing.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "label.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "pager.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "build.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "strv.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "def.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "virt.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "architecture.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "watchdog.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "path-util.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "switch-root.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "capability.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "killall.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "env-util.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "clock-util.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "fileio.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "bus-error.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "bus-util.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "selinux-util.h"
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering#include "manager.h"
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering#include "dbus-manager.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "load-fragment.h"
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "mount-setup.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "loopback-setup.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "hostname-setup.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "machine-id-setup.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "selinux-setup.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "ima-setup.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "smack-setup.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "kmod-setup.h"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
21d73c87b09ec2b8642424bc714ce9af3da4fc40Lennart Poetteringstatic enum {
21d73c87b09ec2b8642424bc714ce9af3da4fc40Lennart Poettering ACTION_RUN,
21d73c87b09ec2b8642424bc714ce9af3da4fc40Lennart Poettering ACTION_HELP,
21d73c87b09ec2b8642424bc714ce9af3da4fc40Lennart Poettering ACTION_VERSION,
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering ACTION_TEST,
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering ACTION_DUMP_CONFIGURATION_ITEMS,
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering ACTION_DONE
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering} arg_action = ACTION_RUN;
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poetteringstatic char *arg_default_unit = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic SystemdRunningAs arg_running_as = _SYSTEMD_RUNNING_AS_INVALID;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_dump_core = true;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_crash_shell = false;
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poetteringstatic int arg_crash_chvt = -1;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_confirm_spawn = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_switched_root = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int arg_no_pager = -1;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic char ***arg_join_controllers = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_default_restart_usec = DEFAULT_RESTART_USEC;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidtstatic usec_t arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic unsigned arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_runtime_watchdog = 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic char **arg_default_environment = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic struct rlimit *arg_default_rlimit[_RLIMIT_MAX] = {};
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic uint64_t arg_capability_bounding_set_drop = 0;
0dd25fb9f005d8ab7ac4bc10a609d00569f8c56aLennart Poetteringstatic nsec_t arg_timer_slack_nsec = NSEC_INFINITY;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic Set* arg_syscall_archs = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic FILE* arg_serialization = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_default_cpu_accounting = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_default_blockio_accounting = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_default_memory_accounting = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void nop_handler(int sig) {}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void pager_open_if_enabled(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (arg_no_pager <= 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering pager_open(false);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringnoreturn static void crash(int sig) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (getpid() != 1)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Pass this on immediately, if this is not PID 1 */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering raise(sig);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else if (!arg_dump_core)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency("Caught <%s>, not dumping core.", signal_to_string(sig));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering struct sigaction sa = {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_handler = nop_handler,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_flags = SA_NOCLDSTOP|SA_RESTART,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering };
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering pid_t pid;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* We want to wait for the core process, hence let's enable SIGCHLD */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering sigaction(SIGCHLD, &sa, NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering pid = raw_clone(SIGCHLD, NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (pid < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(errno, "Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else if (pid == 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering struct rlimit rl = {};
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Enable default signal handler for core dump */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering zero(sa);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering sa.sa_handler = SIG_DFL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering sigaction(sig, &sa, NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Don't limit the core dump size */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering rl.rlim_cur = RLIM_INFINITY;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering rl.rlim_max = RLIM_INFINITY;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering setrlimit(RLIMIT_CORE, &rl);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Just to be sure... */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering chdir("/");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Raise the signal again */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering pid = raw_getpid();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering kill(pid, sig); /* raise() would kill the parent */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert_not_reached("We shouldn't be here...");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering _exit(1);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering siginfo_t status;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int r;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Order things nicely. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = wait_for_terminate(pid, &status);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(r, "Caught <%s>, waitpid() failed: %m", signal_to_string(sig));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else if (status.si_code != CLD_DUMPED)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency("Caught <%s>, core dump failed (child "PID_FMT", code=%s, status=%i/%s).",
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering signal_to_string(sig),
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering pid, sigchld_code_to_string(status.si_code),
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering status.si_status,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering strna(status.si_code == CLD_EXITED
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering ? exit_status_to_string(status.si_status, EXIT_STATUS_FULL)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering : signal_to_string(status.si_status)));
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt else
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (arg_crash_chvt)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering chvt(arg_crash_chvt);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (arg_crash_shell) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering struct sigaction sa = {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_handler = SIG_IGN,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering };
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering pid_t pid;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_info("Executing crash shell in 10s...");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering sleep(10);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Let the kernel reap children for us */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering pid = raw_clone(SIGCHLD, NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (pid < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(errno, "Failed to fork off crash shell: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else if (pid == 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering make_console_stdio();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering execle("/bin/sh", "/bin/sh", NULL, environ);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(errno, "execle() failed: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering _exit(1);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_info("Successfully spawned crash shell as PID "PID_FMT".", pid);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency("Freezing execution.");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering freeze();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void install_crash_handler(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering static const struct sigaction sa = {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_handler = crash,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering };
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int r;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* We ignore the return value here, since, we don't mind if we
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * cannot set up a crash handler */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_debug_errno(r, "I had trouble setting up the crash handler, ignoring: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int console_setup(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering _cleanup_close_ int tty_fd = -1;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int r;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (tty_fd < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(tty_fd, "Failed to open /dev/console: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* We don't want to force text mode. plymouth may be showing
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * pictures already from initrd. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = reset_terminal_fd(tty_fd, false);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(r, "Failed to reset /dev/console: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int set_default_unit(const char *u) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering char *c;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(u);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering c = strdup(u);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!c)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return -ENOMEM;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering free(arg_default_unit);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_default_unit = c;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int parse_proc_cmdline_item(const char *key, const char *value) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering static const char * const rlmap[] = {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "emergency", SPECIAL_EMERGENCY_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "-b", SPECIAL_EMERGENCY_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "rescue", SPECIAL_RESCUE_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "single", SPECIAL_RESCUE_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "-s", SPECIAL_RESCUE_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "s", SPECIAL_RESCUE_TARGET,
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt "S", SPECIAL_RESCUE_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "1", SPECIAL_RESCUE_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "2", SPECIAL_RUNLEVEL2_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "3", SPECIAL_RUNLEVEL3_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "4", SPECIAL_RUNLEVEL4_TARGET,
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt "5", SPECIAL_RUNLEVEL5_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering };
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int r;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(key);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (streq(key, "systemd.unit") && value) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!in_initrd())
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return set_default_unit(value);
0014a4ad505d119c7ac4346d9d774c3f17f663a5Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (streq(key, "rd.systemd.unit") && value) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (in_initrd())
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return set_default_unit(value);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (streq(key, "systemd.dump_core") && value) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = parse_boolean(value);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse dump core switch %s. Ignoring.", value);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_dump_core = r;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (streq(key, "systemd.crash_shell") && value) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = parse_boolean(value);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse crash shell switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering else
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering arg_crash_shell = r;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.crash_chvt") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (safe_atoi(value, &r) < 0)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse crash chvt switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering else
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering arg_crash_chvt = r;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.confirm_spawn") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering r = parse_boolean(value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (r < 0)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse confirm spawn switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering else
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering arg_confirm_spawn = r;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.show_status") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering r = parse_show_status(value, &arg_show_status);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (r < 0)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse show status switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.default_standard_output") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering r = exec_output_from_string(value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (r < 0)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse default standard output switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering else
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering arg_default_std_output = r;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.default_standard_error") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering r = exec_output_from_string(value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (r < 0)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse default standard error switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering else
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering arg_default_std_error = r;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.setenv") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (env_assignment_is_valid(value)) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering char **env;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering env = strv_env_set(arg_default_environment, value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (env)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering arg_default_environment = env;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering else
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning_errno(ENOMEM, "Setting environment variable '%s' failed, ignoring: %m", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "quiet") && !value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_set_max_level(LOG_NOTICE);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (arg_show_status == _SHOW_STATUS_UNSET)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering arg_show_status = SHOW_STATUS_AUTO;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "debug") && !value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering /* Note that log_parse_environment() handles 'debug'
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering * too, and sets the log level to LOG_DEBUG. */
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (detect_container(NULL) > 0)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_set_target(LOG_TARGET_CONSOLE);
8d3d7072e609ef0e0fb37e1d19a29307d58146c3Michal Schmidt
8d3d7072e609ef0e0fb37e1d19a29307d58146c3Michal Schmidt } else if (!in_initrd() && !value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering unsigned i;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering /* SysV compatibility */
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (streq(key, rlmap[i]))
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering return set_default_unit(rlmap[i+1]);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering }
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering return 0;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering}
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering#define DEFINE_SETTER(name, func, descr) \
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering static int name(const char *unit, \
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering const char *filename, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering unsigned line, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering const char *section, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering unsigned section_line, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering const char *lvalue, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering int ltype, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering const char *rvalue, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering void *data, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering void *userdata) { \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering int r; \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering assert(filename); \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering assert(lvalue); \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering assert(rvalue); \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering r = func(rvalue); \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering if (r < 0) \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, -r, \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering "Invalid " descr "'%s': %s", \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering rvalue, strerror(-r)); \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering return 0; \
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering }
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart PoetteringDEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level")
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart PoetteringDEFINE_SETTER(config_parse_target, log_set_target_from_string, "target")
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart PoetteringDEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" )
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart PoetteringDEFINE_SETTER(config_parse_location, log_show_location_from_string, "location")
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poetteringstatic int config_parse_cpu_affinity2(
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering const char *unit,
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering const char *filename,
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering unsigned line,
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering const char *section,
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering unsigned section_line,
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering const char *lvalue,
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering int ltype,
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering const char *rvalue,
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering void *data,
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering void *userdata) {
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering const char *word, *state;
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering size_t l;
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering cpu_set_t *c = NULL;
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering unsigned ncpus = 0;
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering assert(filename);
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering assert(lvalue);
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering assert(rvalue);
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering FOREACH_WORD_QUOTED(word, l, rvalue, state) {
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering char *t;
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering int r;
c4147df156835513c43260a14fc9f7af177f737fLennart Poettering unsigned cpu;
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering if (!(t = strndup(word, l)))
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering return log_oom();
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering r = safe_atou(t, &cpu);
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering free(t);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!c)
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if (!(c = cpu_set_malloc(&ncpus)))
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen return log_oom();
c92e531c82a9815ec349aa1bf31236b86b2d5311Lennart Poettering
c92e531c82a9815ec349aa1bf31236b86b2d5311Lennart Poettering if (r < 0 || cpu >= ncpus) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_syntax(unit, LOG_ERR, filename, line, -r,
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "Failed to parse CPU affinity '%s'", rvalue);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen CPU_FREE(c);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen return -EBADMSG;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering CPU_SET_S(cpu, CPU_ALLOC_SIZE(ncpus), c);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (!isempty(state))
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, EINVAL,
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering "Trailing garbage, ignoring.");
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering if (c) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_unit_warning(unit, "Failed to set CPU affinity: %m");
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen CPU_FREE(c);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen }
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen return 0;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen}
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersenstatic int config_parse_show_status(
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen const char* unit,
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen const char *filename,
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering unsigned line,
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering const char *section,
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering unsigned section_line,
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering const char *lvalue,
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering int ltype,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *rvalue,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering void *data,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering void *userdata) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int k;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering ShowStatus *b = data;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(filename);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(lvalue);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(rvalue);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(data);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering k = parse_show_status(rvalue, b);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (k < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, -k,
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "Failed to parse show status setting, ignoring: %s", rvalue);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen return 0;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen }
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen return 0;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen}
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poetteringstatic void strv_free_free(char ***l) {
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering char ***i;
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering if (!l)
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering return;
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering for (i = l; *i; i++)
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering strv_free(*i);
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering free(l);
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void free_join_controllers(void) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen strv_free_free(arg_join_controllers);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen arg_join_controllers = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int config_parse_join_controllers(const char *unit,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *filename,
f0e1546763304aedc90e91d70dab9eeb7c966cf8Lennart Poettering unsigned line,
f0e1546763304aedc90e91d70dab9eeb7c966cf8Lennart Poettering const char *section,
f0e1546763304aedc90e91d70dab9eeb7c966cf8Lennart Poettering unsigned section_line,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *lvalue,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int ltype,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *rvalue,
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering void *data,
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering void *userdata) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
f0e1546763304aedc90e91d70dab9eeb7c966cf8Lennart Poettering unsigned n = 0;
f0e1546763304aedc90e91d70dab9eeb7c966cf8Lennart Poettering const char *word, *state;
f0e1546763304aedc90e91d70dab9eeb7c966cf8Lennart Poettering size_t length;
096b6773886bd7a0c8c97aa684b0b67dfae58355Lennart Poettering
096b6773886bd7a0c8c97aa684b0b67dfae58355Lennart Poettering assert(filename);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen assert(lvalue);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(rvalue);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering free_join_controllers();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering FOREACH_WORD_QUOTED(word, length, rvalue, state) {
edc501d4674dadc304d45a7e1c5b69e207eb8cd4Lennart Poettering char *s, **l;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering s = strndup(word, length);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!s)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_oom();
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering l = strv_split(s, ",");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering free(s);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering strv_uniq(l);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (strv_length(l) <= 1) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering strv_free(l);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering continue;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering }
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!arg_join_controllers) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_join_controllers = new(char**, 2);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if (!arg_join_controllers) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen strv_free(l);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering return log_oom();
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering }
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering arg_join_controllers[0] = l;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering arg_join_controllers[1] = NULL;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering n = 1;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering } else {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering char ***a;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering char ***t;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering t = new0(char**, n+2);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering if (!t) {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering strv_free(l);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering return log_oom();
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering }
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering n = 0;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering for (a = arg_join_controllers; *a; a++) {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering if (strv_overlap(*a, l)) {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering if (strv_extend_strv(&l, *a) < 0) {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering strv_free(l);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering strv_free_free(t);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering return log_oom();
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering }
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering } else {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering char **c;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering c = strv_copy(*a);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering if (!c) {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering strv_free(l);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering strv_free_free(t);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering return log_oom();
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering }
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering t[n++] = c;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering }
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering }
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering t[n++] = strv_uniq(l);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering strv_free_free(arg_join_controllers);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering arg_join_controllers = t;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering }
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering }
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering if (!isempty(state))
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, EINVAL,
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering "Trailing garbage, ignoring.");
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering return 0;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering}
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poetteringstatic int parse_config_file(void) {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering const ConfigTableItem items[] = {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "LogLevel", config_parse_level2, 0, NULL },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "LogTarget", config_parse_target, 0, NULL },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "LogColor", config_parse_color, 0, NULL },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "LogLocation", config_parse_location, 0, NULL },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "ShowStatus", config_parse_show_status, 0, &arg_show_status },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "CrashChVT", config_parse_int, 0, &arg_crash_chvt },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering#ifdef HAVE_SECCOMP
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "SystemCallArchitectures", config_parse_syscall_archs, 0, &arg_syscall_archs },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering#endif
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultTimerAccuracySec", config_parse_sec, 0, &arg_default_timer_accuracy_usec },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultTimeoutStartSec", config_parse_sec, 0, &arg_default_timeout_start_usec },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultTimeoutStopSec", config_parse_sec, 0, &arg_default_timeout_stop_usec },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultRestartSec", config_parse_sec, 0, &arg_default_restart_usec },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultStartLimitInterval", config_parse_sec, 0, &arg_default_start_limit_interval },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultStartLimitBurst", config_parse_unsigned, 0, &arg_default_start_limit_burst },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitSTACK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_STACK] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitCORE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CORE] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitRSS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RSS] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitNOFILE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NOFILE] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitAS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_AS] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitNPROC", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NPROC] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitMEMLOCK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MEMLOCK] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitLOCKS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_LOCKS] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitSIGPENDING", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MSGQUEUE] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultLimitRTTIME", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME] },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultCPUAccounting", config_parse_bool, 0, &arg_default_cpu_accounting },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering { "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting },
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering {}
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen };
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *fn, *conf_dirs_nulstr;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering fn = arg_running_as == SYSTEMD_SYSTEM ? PKGSYSCONFDIR "/system.conf" : PKGSYSCONFDIR "/user.conf";
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen conf_dirs_nulstr = arg_running_as == SYSTEMD_SYSTEM ? CONF_DIRS_NULSTR("systemd/system.conf") : CONF_DIRS_NULSTR("systemd/user.conf");
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen config_parse_many(fn, conf_dirs_nulstr, "Manager\0",
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen config_item_table_lookup, items, false, NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering return 0;
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt}
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersenstatic int parse_argv(int argc, char *argv[]) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen enum {
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering ARG_LOG_LEVEL = 0x100,
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen ARG_LOG_TARGET,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering ARG_LOG_COLOR,
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen ARG_LOG_LOCATION,
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen ARG_UNIT,
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen ARG_SYSTEM,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_USER,
a9feff3d774eaa1cc1b59189e8f344c01e69f888Tom Gundersen ARG_TEST,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_NO_PAGER,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_VERSION,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_DUMP_CONFIGURATION_ITEMS,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_DUMP_CORE,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_CRASH_SHELL,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_CONFIRM_SPAWN,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_SHOW_STATUS,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_DESERIALIZE,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_SWITCHED_ROOT,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_DEFAULT_STD_OUTPUT,
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen ARG_DEFAULT_STD_ERROR
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen };
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen static const struct option options[] = {
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "log-level", required_argument, NULL, ARG_LOG_LEVEL },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "log-target", required_argument, NULL, ARG_LOG_TARGET },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "log-color", optional_argument, NULL, ARG_LOG_COLOR },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "log-location", optional_argument, NULL, ARG_LOG_LOCATION },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "unit", required_argument, NULL, ARG_UNIT },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "system", no_argument, NULL, ARG_SYSTEM },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "user", no_argument, NULL, ARG_USER },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "test", no_argument, NULL, ARG_TEST },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "no-pager", no_argument, NULL, ARG_NO_PAGER },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "help", no_argument, NULL, 'h' },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "version", no_argument, NULL, ARG_VERSION },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "dump-core", optional_argument, NULL, ARG_DUMP_CORE },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "crash-shell", optional_argument, NULL, ARG_CRASH_SHELL },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "confirm-spawn", optional_argument, NULL, ARG_CONFIRM_SPAWN },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "show-status", optional_argument, NULL, ARG_SHOW_STATUS },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "deserialize", required_argument, NULL, ARG_DESERIALIZE },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek {}
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek };
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek int c, r;
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek assert(argc >= 1);
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek assert(argv);
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek if (getpid() == 1)
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek opterr = 0;
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek while ((c = getopt_long(argc, argv, "hDbsz:", options, NULL)) >= 0)
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek switch (c) {
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek case ARG_LOG_LEVEL:
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek r = log_set_max_level_from_string(optarg);
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek if (r < 0) {
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek log_error("Failed to parse log level %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return r;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering }
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen break;
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case ARG_LOG_TARGET:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = log_set_target_from_string(optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse log target %s.", optarg);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen return r;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen }
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering break;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering case ARG_LOG_COLOR:
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidt if (optarg) {
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering r = log_show_color_from_string(optarg);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering if (r < 0) {
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering log_error("Failed to parse log color setting %s.", optarg);
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidt return r;
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen }
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen } else
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen log_show_color(true);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering break;
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering case ARG_LOG_LOCATION:
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering if (optarg) {
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering r = log_show_location_from_string(optarg);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering if (r < 0) {
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering log_error("Failed to parse log location setting %s.", optarg);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering return r;
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen }
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen } else
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen log_show_location(true);
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering break;
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering case ARG_DEFAULT_STD_OUTPUT:
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering r = exec_output_from_string(optarg);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering if (r < 0) {
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering log_error("Failed to parse default standard output setting %s.", optarg);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering return r;
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering } else
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen arg_default_std_output = r;
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen break;
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen case ARG_DEFAULT_STD_ERROR:
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen r = exec_output_from_string(optarg);
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen if (r < 0) {
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen log_error("Failed to parse default standard error output setting %s.", optarg);
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen return r;
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen } else
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen arg_default_std_error = r;
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen break;
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering case ARG_UNIT:
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering r = set_default_unit(optarg);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering if (r < 0)
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering return log_error_errno(r, "Failed to set default unit %s: %m", optarg);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering break;
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering case ARG_SYSTEM:
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering arg_running_as = SYSTEMD_SYSTEM;
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering break;
a5a807e63a50314e190e9166d8a453cd8dd258e3Zbigniew Jędrzejewski-Szmek
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen case ARG_USER:
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen arg_running_as = SYSTEMD_USER;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen break;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen case ARG_TEST:
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek arg_action = ACTION_TEST;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (arg_no_pager < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_no_pager = true;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering break;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case ARG_NO_PAGER:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_no_pager = true;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering break;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case ARG_VERSION:
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen arg_action = ACTION_VERSION;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering break;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case ARG_DUMP_CONFIGURATION_ITEMS:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_action = ACTION_DUMP_CONFIGURATION_ITEMS;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering break;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering case ARG_DUMP_CORE:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = optarg ? parse_boolean(optarg) : 1;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error("Failed to parse dump core boolean %s.", optarg);
40a1eebde6be7ac3f1885147fc24e06ad1da260cDavid Herrmann return r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering arg_dump_core = r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering break;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case ARG_CRASH_SHELL:
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = optarg ? parse_boolean(optarg) : 1;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error("Failed to parse crash shell boolean %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return r;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_crash_shell = r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering break;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case ARG_CONFIRM_SPAWN:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = optarg ? parse_boolean(optarg) : 1;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse confirm spawn boolean %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return r;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_confirm_spawn = r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering break;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case ARG_SHOW_STATUS:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (optarg) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = parse_show_status(optarg, &arg_show_status);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse show status boolean %s.", optarg);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_show_status = SHOW_STATUS_YES;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering break;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case ARG_DESERIALIZE: {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int fd;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering FILE *f;
ad867662936a4c7ab2c7116d804c272338801231Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = safe_atoi(optarg, &fd);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0 || fd < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse deserialize option %s.", optarg);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen return r < 0 ? r : -EINVAL;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering fd_cloexec(fd, true);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering f = fdopen(fd, "r");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (!f)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return log_error_errno(errno, "Failed to open serialization fd: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if (arg_serialization)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering fclose(arg_serialization);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering arg_serialization = f;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering break;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering case ARG_SWITCHED_ROOT:
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering arg_switched_root = true;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering break;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case 'h':
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering arg_action = ACTION_HELP;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (arg_no_pager < 0)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering arg_no_pager = true;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering break;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering case 'D':
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_set_max_level(LOG_DEBUG);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering break;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering case 'b':
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering case 's':
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering case 'z':
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering /* Just to eat away the sysvinit kernel
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * cmdline args without getopt() error
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * messages that we'll parse in
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * parse_proc_cmdline_word() or ignore. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering case '?':
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (getpid() != 1)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return -EINVAL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return 0;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering default:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert_not_reached("Unhandled option code.");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (optind < argc && getpid() != 1) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Hmm, when we aren't run as init system
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen * let's complain about excess arguments */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_error("Excess arguments.");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering return -EINVAL;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poetteringstatic int help(void) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering printf("%s [OPTIONS...]\n\n"
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering "Starts up and maintains the system or user services.\n\n"
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering " -h --help Show this help\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --test Determine startup sequence, dump it and exit\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --no-pager Do not pipe output into a pager\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --dump-configuration-items Dump understood unit configuration items\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --unit=UNIT Set default unit\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --system Run a system instance, even if PID != 1\n"
a5f035960006556beab51c42e6948985635e261aLennart Poettering " --user Run a user instance\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --dump-core[=0|1] Dump core on crash\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --crash-shell[=0|1] Run shell on crash\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --confirm-spawn[=0|1] Ask for confirmation when spawning processes\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --show-status[=0|1] Show status updates on the console during bootup\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --log-target=TARGET Set log target (console, journal, kmsg, journal-or-kmsg, null)\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering " --log-color[=0|1] Highlight important log messages\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --log-location[=0|1] Include code location in log messages\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --default-standard-output= Set default standard output for services\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --default-standard-error= Set default standard error output for services\n",
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering program_invocation_short_name);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return 0;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic int version(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering puts(PACKAGE_STRING);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering puts(SYSTEMD_FEATURES);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching_root) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering FILE *f = NULL;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering FDSet *fds = NULL;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering int r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(m);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering assert(_f);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering assert(_fds);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = manager_open_serialization(m, &f);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0) {
ad867662936a4c7ab2c7116d804c272338801231Lennart Poettering log_error_errno(r, "Failed to create serialization file: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering goto fail;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Make sure nothing is really destructed when we shut down */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering m->n_reloading ++;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering bus_manager_send_reloading(m, true);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen fds = fdset_new();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!fds) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = -ENOMEM;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_error_errno(r, "Failed to allocate fd set: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering goto fail;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen r = manager_serialize(m, f, fds, switching_root);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error_errno(r, "Failed to serialize state: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto fail;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (fseeko(f, 0, SEEK_SET) < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error_errno(errno, "Failed to rewind serialization fd: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering goto fail;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = fd_cloexec(fileno(f), false);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error_errno(r, "Failed to disable O_CLOEXEC for serialization: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto fail;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen r = fdset_cloexec(fds, false);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error_errno(r, "Failed to disable O_CLOEXEC for serialization fds: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering goto fail;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen *_f = f;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering *_fds = fds;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringfail:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering fdset_free(fds);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (f)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering fclose(f);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering}
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poetteringstatic int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen struct rlimit nl;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering int r;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert(saved_rlimit);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Save the original RLIMIT_NOFILE so that we can reset it
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * later when transitioning from the initrd to the main
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * systemd or suchlike. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (getrlimit(RLIMIT_NOFILE, saved_rlimit) < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(errno, "Reading RLIMIT_NOFILE failed: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Make sure forked processes get the default kernel setting */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!arg_default_rlimit[RLIMIT_NOFILE]) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering struct rlimit *rl;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering rl = newdup(struct rlimit, saved_rlimit, 1);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!rl)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_oom();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_default_rlimit[RLIMIT_NOFILE] = rl;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Bump up the resource limit for ourselves substantially */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering nl.rlim_cur = nl.rlim_max = 64*1024;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = setrlimit_closest(RLIMIT_NOFILE, &nl);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(r, "Setting RLIMIT_NOFILE failed: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void test_mtab(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering static const char ok[] =
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering "/proc/self/mounts\0"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "/proc/mounts\0"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "../proc/self/mounts\0"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "../proc/mounts\0";
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering _cleanup_free_ char *p = NULL;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering int r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Check that /etc/mtab is a symlink to the right place or
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * non-existing. But certainly not a file, or a symlink to
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * some weird place... */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = readlink_malloc("/etc/mtab", &p);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r == -ENOENT)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r >= 0 && nulstr_contains(ok, p))
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("/etc/mtab is not a symlink or not pointing to /proc/self/mounts. "
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "This is not supported anymore. "
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering "Please make sure to replace this file by a symlink to avoid incorrect or misleading mount(8) output.");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering}
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void test_usr(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Check that /usr is not a separate fs */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if (dir_is_empty("/usr") <= 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("/usr appears to be on its own filesystem and is not already mounted. This is not a supported setup. "
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "Some things will probably break (sometimes even silently) in mysterious ways. "
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int initialize_join_controllers(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * + "net_prio". We'd like to add "cpuset" to the mix, but
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * "cpuset" doesn't really work for groups with no initialized
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * attributes. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_join_controllers = new(char**, 3);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!arg_join_controllers)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return -ENOMEM;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_join_controllers[2] = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (!arg_join_controllers[0] || !arg_join_controllers[1]) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering free_join_controllers();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return -ENOMEM;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return 0;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering}
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int enforce_syscall_archs(Set *archs) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#ifdef HAVE_SECCOMP
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering scmp_filter_ctx *seccomp;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Iterator i;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering void *id;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering int r;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering seccomp = seccomp_init(SCMP_ACT_ALLOW);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!seccomp)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_oom();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering SET_FOREACH(id, arg_syscall_archs, i) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = seccomp_arch_add(seccomp, PTR_TO_UINT32(id) - 1);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r == -EEXIST)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering continue;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error_errno(r, "Failed to add architecture to seccomp: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering goto finish;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error_errno(r, "Failed to unset NO_NEW_PRIVS: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering goto finish;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = seccomp_load(seccomp);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error_errno(r, "Failed to add install architecture seccomp: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringfinish:
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering seccomp_release(seccomp);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return r;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#else
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#endif
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int status_welcome(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering _cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int r;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = parse_env_file("/etc/os-release", NEWLINE,
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering "PRETTY_NAME", &pretty_name,
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering "ANSI_COLOR", &ansi_color,
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering NULL);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r == -ENOENT) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = parse_env_file("/usr/lib/os-release", NEWLINE,
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering "PRETTY_NAME", &pretty_name,
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering "ANSI_COLOR", &ansi_color,
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering NULL);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0 && r != -ENOENT)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_warning_errno(r, "Failed to read os-release file: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return status_printf(NULL, false, false,
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering isempty(ansi_color) ? "1" : ansi_color,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering isempty(pretty_name) ? "Linux" : pretty_name);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int write_container_id(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *c;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering c = getenv("container");
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering if (isempty(c))
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return 0;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering return write_string_file("/run/systemd/container", c);
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering}
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
2c27fbca2d88214bd305272308a370a962818f1eLennart Poetteringint main(int argc, char *argv[]) {
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering Manager *m = NULL;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering int r, retval = EXIT_FAILURE;
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering usec_t before_startup, after_startup;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering char timespan[FORMAT_TIMESPAN_MAX];
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering FDSet *fds = NULL;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering bool reexecute = false;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering const char *shutdown_verb = NULL;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering dual_timestamp initrd_timestamp = { 0ULL, 0ULL };
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering dual_timestamp userspace_timestamp = { 0ULL, 0ULL };
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering dual_timestamp kernel_timestamp = { 0ULL, 0ULL };
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering dual_timestamp security_start_timestamp = { 0ULL, 0ULL };
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering dual_timestamp security_finish_timestamp = { 0ULL, 0ULL };
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering static char systemd[] = "systemd";
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering bool skip_setup = false;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering unsigned j;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering bool loaded_policy = false;
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering bool arm_reboot_watchdog = false;
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering bool queue_default_job = false;
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering bool empty_etc = false;
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering char *switch_root_dir = NULL, *switch_root_init = NULL;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering static struct rlimit saved_rlimit_nofile = { 0, 0 };
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *error_message = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#ifdef HAVE_SYSV_COMPAT
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* This is compatibility support for SysV, where
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * calling init as a user is identical to telinit. */
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering errno = -ENOENT;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering execv(SYSTEMCTL_BINARY_PATH, argv);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error_errno(errno, "Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering return 1;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering }
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering#endif
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering dual_timestamp_from_monotonic(&kernel_timestamp, 0);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering dual_timestamp_get(&userspace_timestamp);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering /* Determine if this is a reexecution or normal bootup. We do
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering * the full command line parsing much later, so let's just
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering * have a quick peek here. */
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering if (strv_find(argv+1, "--deserialize"))
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering skip_setup = true;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering /* If we have switched root, do all the special setup
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering * things */
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering if (strv_find(argv+1, "--switched-root"))
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering skip_setup = false;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering /* If we get started via the /sbin/init symlink then we are
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering called 'init'. After a subsequent reexecution we are then
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering called 'systemd'. That is confusing, hence let's call us
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd right-away. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering program_invocation_short_name = systemd;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering prctl(PR_SET_NAME, systemd);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering saved_argv = argv;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering saved_argc = argc;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_show_color(isatty(STDERR_FILENO) > 0);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_set_upgrade_syslog_to_journal(true);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering /* Disable the umask logic */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (getpid() == 1)
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering umask(0);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (getpid() == 1 && detect_container(NULL) <= 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering /* Running outside of a container as PID 1 */
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering arg_running_as = SYSTEMD_SYSTEM;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering make_null_stdio();
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_set_target(LOG_TARGET_KMSG);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_open();
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if (in_initrd())
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering initrd_timestamp = userspace_timestamp;
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering if (!skip_setup) {
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering mount_setup_early();
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering dual_timestamp_get(&security_start_timestamp);
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering if (mac_selinux_setup(&loaded_policy) < 0) {
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering error_message = "Failed to load SELinux policy";
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering goto finish;
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering } else if (ima_setup() < 0) {
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering error_message = "Failed to load IMA policy";
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering goto finish;
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering } else if (mac_smack_setup(&loaded_policy) < 0) {
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering error_message = "Failed to load SMACK policy";
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering goto finish;
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering }
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering dual_timestamp_get(&security_finish_timestamp);
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering }
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering if (mac_selinux_init(NULL) < 0) {
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering error_message = "Failed to initialize SELinux policy";
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (!skip_setup) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (clock_is_localtime() > 0) {
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering int min;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /*
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * The very first call of settimeofday() also does a time warp in the kernel.
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering *
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * In the rtc-in-local time mode, we set the kernel's timezone, and rely on
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * external tools to take care of maintaining the RTC and do all adjustments.
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * This matches the behavior of Windows, which leaves the RTC alone if the
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * registry tells that the RTC runs in UTC.
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering */
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering r = clock_set_timezone(&min);
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering if (r < 0)
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering log_error_errno(r, "Failed to apply local time delta, ignoring: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering else
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
a2a416f768e2aa7db5b975cd50eb19237cac9cceLennart Poettering } else if (!in_initrd()) {
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering /*
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * Do a dummy very first call to seal the kernel's time warp magic.
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering *
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * Do not call this this from inside the initrd. The initrd might not
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * carry /etc/adjtime with LOCAL, but the real system could be set up
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * that way. In such case, we need to delay the time-warp or the sealing
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * until we reach the real system.
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering *
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * Do no set the kernel's timezone. The concept of local time cannot
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * be supported reliably, the time will jump or be incorrect at every daylight
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * saving time change. All kernel local time concepts will be treated
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * as UTC that way.
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering clock_reset_timewarp();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Set the default for later on, but don't actually
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * open the logs like this for now. Note that if we
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * are transitioning from the initrd there might still
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * be journal fd open, and we shouldn't attempt
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering * opening that before we parsed /proc/cmdline which
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * might redirect output elsewhere. */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering } else if (getpid() == 1) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Running inside a container, as PID 1 */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering arg_running_as = SYSTEMD_SYSTEM;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_set_target(LOG_TARGET_CONSOLE);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_close_console(); /* force reopen of /dev/console */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_open();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* For the later on, see above... */
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering log_set_target(LOG_TARGET_JOURNAL);
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* clear the kernel timestamp,
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * because we are in a container */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering kernel_timestamp.monotonic = 0ULL;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering kernel_timestamp.realtime = 0ULL;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering } else {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Running as user instance */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering arg_running_as = SYSTEMD_USER;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_set_target(LOG_TARGET_AUTO);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_open();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* clear the kernel timestamp,
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * because we are not PID 1 */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering kernel_timestamp.monotonic = 0ULL;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering kernel_timestamp.realtime = 0ULL;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Initialize default unit */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = set_default_unit(SPECIAL_DEFAULT_TARGET);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_emergency_errno(r, "Failed to set default unit %s: %m", SPECIAL_DEFAULT_TARGET);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering error_message = "Failed to set default unit";
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = initialize_join_controllers();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering error_message = "Failed to initalize cgroup controllers";
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Mount /proc, /sys and friends, so that /proc/cmdline and
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * /proc/$PID/fd is available. */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (getpid() == 1) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Load the kernel modules early, so that we kdbus.ko is loaded before kdbusfs shall be mounted */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (!skip_setup)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering kmod_setup();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = mount_setup(loaded_policy);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering error_message = "Failed to mount API filesystems";
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Reset all signal handlers. */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering assert_se(reset_all_signal_handlers() == 0);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering ignore_signals(SIGNALS_IGNORE, -1);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (parse_config_file() < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering error_message = "Failed to parse config file";
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_running_as == SYSTEMD_SYSTEM) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = parse_proc_cmdline(parse_proc_cmdline_item);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Note that this also parses bits from the kernel command
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * line, including "debug". */
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering log_parse_environment();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (parse_argv(argc, argv) < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering error_message = "Failed to parse commandline arguments";
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_action == ACTION_TEST &&
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering geteuid() == 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error("Don't run test mode as root.");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_running_as == SYSTEMD_USER &&
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering arg_action == ACTION_RUN &&
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering sd_booted() <= 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error("Trying to run as user instance, but the system has not been booted with systemd.");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering }
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_running_as == SYSTEMD_SYSTEM &&
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering arg_action == ACTION_RUN &&
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering running_in_chroot() > 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error("Cannot be run in a chroot() environment.");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_action == ACTION_TEST)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering skip_setup = true;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering pager_open_if_enabled();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_action == ACTION_HELP) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering retval = help();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering } else if (arg_action == ACTION_VERSION) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering retval = version();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering unit_dump_config_items(stdout);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering retval = EXIT_SUCCESS;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering } else if (arg_action == ACTION_DONE) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering retval = EXIT_SUCCESS;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_running_as == SYSTEMD_USER &&
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering !getenv("XDG_RUNTIME_DIR")) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error("Trying to run as user instance, but $XDG_RUNTIME_DIR is not set.");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering }
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering assert_se(arg_action == ACTION_RUN || arg_action == ACTION_TEST);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Close logging fds, in order not to confuse fdset below */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_close();
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Remember open file descriptors for later deserialization */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = fdset_new_fill(&fds);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (r < 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_emergency_errno(r, "Failed to allocate fd set: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering error_message = "Failed to allocate fd set";
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering goto finish;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering } else
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering fdset_cloexec(fds, true);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_serialization)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering assert_se(fdset_remove(fds, fileno(arg_serialization)) >= 0);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (arg_running_as == SYSTEMD_SYSTEM)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Become a session leader if we aren't one yet. */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering setsid();
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering /* Move out of the way, so that we won't block unmounts */
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering assert_se(chdir("/") == 0);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering /* Reset the console, but only if this is really init and we
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * are freshly booted */
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering if (arg_running_as == SYSTEMD_SYSTEM && arg_action == ACTION_RUN) {
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering /* If we are init, we connect stdin/stdout/stderr to
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * /dev/null and make sure we don't have a controlling
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering * tty. */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering release_terminal();
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering if (getpid() == 1 && !skip_setup)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering console_setup();
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering /* Open the logging devices, if possible and necessary */
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering log_open();
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering if (arg_show_status == _SHOW_STATUS_UNSET)
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering arg_show_status = SHOW_STATUS_YES;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering /* Make sure we leave a core dump without panicing the
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * kernel. */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (getpid() == 1) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering install_crash_handler();
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = mount_cgroup_controllers(arg_join_controllers);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r < 0)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering goto finish;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_running_as == SYSTEMD_SYSTEM) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering const char *virtualization = NULL;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_info(PACKAGE_STRING " running in %ssystem mode. (" SYSTEMD_FEATURES ")",
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering arg_action == ACTION_TEST ? "test " : "" );
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering detect_virtualization(&virtualization);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (virtualization)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_info("Detected virtualization '%s'.", virtualization);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering write_container_id();
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_info("Detected architecture '%s'.", architecture_to_string(uname_architecture()));
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (in_initrd())
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_info("Running in initial RAM disk.");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering /* Let's check whether /etc is already populated. We
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * don't actually really check for that, but use
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * /etc/machine-id as flag file. This allows container
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * managers and installers to provision a couple of
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * files already. If the container manager wants to
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * provision the machine ID itself it should pass
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * $container_uuid to PID 1. */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering empty_etc = access("/etc/machine-id", F_OK) < 0;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (empty_etc)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_info("Running with unpopulated /etc.");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering } else {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering _cleanup_free_ char *t;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering t = uid_to_name(getuid());
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_debug(PACKAGE_STRING " running in %suser mode for user "UID_FMT"/%s. (" SYSTEMD_FEATURES ")",
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering arg_action == ACTION_TEST ? " test" : "", getuid(), t);
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_running_as == SYSTEMD_SYSTEM && !skip_setup) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_show_status > 0 || plymouth_running())
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering status_welcome();
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering hostname_setup();
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering machine_id_setup(NULL);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering loopback_setup();
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering test_mtab();
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering test_usr();
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_running_as == SYSTEMD_SYSTEM && arg_runtime_watchdog > 0)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering watchdog_set_timeout(&arg_runtime_watchdog);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_timer_slack_nsec != NSEC_INFINITY)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_error_errno(errno, "Failed to adjust timer slack: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_capability_bounding_set_drop) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = capability_bounding_set_drop_usermode(arg_capability_bounding_set_drop);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r < 0) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_emergency_errno(r, "Failed to drop capability bounding set of usermode helpers: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering error_message = "Failed to drop capability bounding set of usermode helpers";
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering goto finish;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = capability_bounding_set_drop(arg_capability_bounding_set_drop, true);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r < 0) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_emergency_errno(r, "Failed to drop capability bounding set: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering error_message = "Failed to drop capability bounding set";
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering goto finish;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_syscall_archs) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = enforce_syscall_archs(arg_syscall_archs);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r < 0) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering error_message = "Failed to set syscall architectures";
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering goto finish;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_running_as == SYSTEMD_USER) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering /* Become reaper of our children */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_warning_errno(errno, "Failed to make us a subreaper: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (errno == EINVAL)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_info("Perhaps the kernel version is too old (< 3.4?)");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_running_as == SYSTEMD_SYSTEM) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering bump_rlimit_nofile(&saved_rlimit_nofile);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (empty_etc) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = unit_file_preset_all(UNIT_FILE_SYSTEM, false, NULL, UNIT_FILE_PRESET_FULL, false, NULL, 0);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r < 0)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_warning_errno(r, "Failed to populate /etc with preset unit settings, ignoring: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering else
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_info("Populated /etc with preset unit settings.");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = manager_new(arg_running_as, arg_action == ACTION_TEST, &m);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r < 0) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_emergency_errno(r, "Failed to allocate manager object: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering error_message = "Failed to allocate manager object";
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering goto finish;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
bf3f1271e2cc0c22b11c8a805a997578dabe9191Lennart Poettering m->confirm_spawn = arg_confirm_spawn;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_timer_accuracy_usec = arg_default_timer_accuracy_usec;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_std_output = arg_default_std_output;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_std_error = arg_default_std_error;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_restart_usec = arg_default_restart_usec;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_timeout_start_usec = arg_default_timeout_start_usec;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_timeout_stop_usec = arg_default_timeout_stop_usec;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_start_limit_interval = arg_default_start_limit_interval;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_start_limit_burst = arg_default_start_limit_burst;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_cpu_accounting = arg_default_cpu_accounting;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_blockio_accounting = arg_default_blockio_accounting;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->default_memory_accounting = arg_default_memory_accounting;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->runtime_watchdog = arg_runtime_watchdog;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->shutdown_watchdog = arg_shutdown_watchdog;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->userspace_timestamp = userspace_timestamp;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->kernel_timestamp = kernel_timestamp;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->initrd_timestamp = initrd_timestamp;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->security_start_timestamp = security_start_timestamp;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->security_finish_timestamp = security_finish_timestamp;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering manager_set_default_rlimits(m, arg_default_rlimit);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering manager_environment_add(m, NULL, arg_default_environment);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering manager_set_show_status(m, arg_show_status);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering manager_set_first_boot(m, empty_etc);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering /* Remember whether we should queue the default job */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering queue_default_job = !arg_serialization || arg_switched_root;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering before_startup = now(CLOCK_MONOTONIC);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = manager_startup(m, arg_serialization, fds);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r < 0)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_error_errno(r, "Failed to fully start up daemon: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering /* This will close all file descriptors that were opened, but
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering * not claimed by any unit. */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering fdset_free(fds);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering fds = NULL;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (arg_serialization) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering fclose(arg_serialization);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering arg_serialization = NULL;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (queue_default_job) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering Unit *target = NULL;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering Job *default_unit_job;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_debug("Activating default unit: %s", arg_default_unit);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = manager_load_unit(m, arg_default_unit, NULL, &error, &target);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r < 0)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_error("Failed to load default target: %s", bus_error_message(&error, r));
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering else if (target->load_state == UNIT_ERROR || target->load_state == UNIT_NOT_FOUND)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_error_errno(target->load_error, "Failed to load default target: %m");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering else if (target->load_state == UNIT_MASKED)
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_error("Default target masked.");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (!target || target->load_state != UNIT_LOADED) {
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_info("Trying to load rescue target...");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (r < 0) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_emergency("Failed to load rescue target: %s", bus_error_message(&error, r));
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering error_message = "Failed to load rescue target";
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering goto finish;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (target->load_state == UNIT_ERROR || target->load_state == UNIT_NOT_FOUND) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_emergency_errno(target->load_error, "Failed to load rescue target: %m");
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering error_message = "Failed to load rescue target";
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering goto finish;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (target->load_state == UNIT_MASKED) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_emergency("Rescue target masked.");
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering error_message = "Rescue target masked";
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering goto finish;
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering }
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering }
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering assert(target->load_state == UNIT_LOADED);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (arg_action == ACTION_TEST) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering printf("-> By units:\n");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering manager_dump_units(m, stdout, "\t");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering }
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = manager_add_job(m, JOB_START, target, JOB_ISOLATE, false, &error, &default_unit_job);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (r == -EPERM) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_debug("Default target could not be isolated, starting instead: %s", bus_error_message(&error, r));
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = manager_add_job(m, JOB_START, target, JOB_REPLACE, false, &error, &default_unit_job);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (r < 0) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_emergency("Failed to start default target: %s", bus_error_message(&error, r));
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering error_message = "Failed to start default target";
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering goto finish;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering }
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering } else if (r < 0) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_emergency("Failed to isolate default target: %s", bus_error_message(&error, r));
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering error_message = "Failed to isolate default target";
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering goto finish;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering }
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering m->default_unit_job_id = default_unit_job->id;
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering after_startup = now(CLOCK_MONOTONIC);
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG,
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering "Loaded units and determined initial transaction in %s.",
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering format_timespan(timespan, sizeof(timespan), after_startup - before_startup, 100 * USEC_PER_MSEC));
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering if (arg_action == ACTION_TEST) {
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering printf("-> By jobs:\n");
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering manager_dump_jobs(m, stdout, "\t");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering retval = EXIT_SUCCESS;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering goto finish;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering }
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering }
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering for (;;) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = manager_loop(m);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (r < 0) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_emergency_errno(r, "Failed to run main loop: %m");
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering error_message = "Failed to run main loop";
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering goto finish;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering }
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering switch (m->exit_code) {
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering case MANAGER_EXIT:
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering retval = EXIT_SUCCESS;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_debug("Exit.");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering goto finish;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering case MANAGER_RELOAD:
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_info("Reloading.");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = manager_reload(m);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (r < 0)
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_error_errno(r, "Failed to reload: %m");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering break;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering case MANAGER_REEXECUTE:
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (prepare_reexecute(m, &arg_serialization, &fds, false) < 0) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering error_message = "Failed to prepare for reexection";
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering goto finish;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering }
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering reexecute = true;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_notice("Reexecuting.");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering goto finish;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering case MANAGER_SWITCH_ROOT:
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering /* Steal the switch root parameters */
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering switch_root_dir = m->switch_root;
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering switch_root_init = m->switch_root_init;
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering m->switch_root = m->switch_root_init = NULL;
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering if (!switch_root_init)
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering if (prepare_reexecute(m, &arg_serialization, &fds, true) < 0) {
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering error_message = "Failed to prepare for reexection";
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering goto finish;
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering }
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering reexecute = true;
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering log_notice("Switching root.");
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering goto finish;
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering case MANAGER_REBOOT:
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering case MANAGER_POWEROFF:
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering case MANAGER_HALT:
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering case MANAGER_KEXEC: {
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering [MANAGER_REBOOT] = "reboot",
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering [MANAGER_POWEROFF] = "poweroff",
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering [MANAGER_HALT] = "halt",
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering [MANAGER_KEXEC] = "kexec"
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering };
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering assert_se(shutdown_verb = table[m->exit_code]);
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering arm_reboot_watchdog = m->exit_code == MANAGER_REBOOT;
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering log_notice("Shutting down.");
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering goto finish;
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering }
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering default:
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering assert_not_reached("Unknown exit code.");
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering }
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering }
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poetteringfinish:
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering pager_close();
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering if (m)
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering arg_shutdown_watchdog = m->shutdown_watchdog;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering m = manager_free(m);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering for (j = 0; j < ELEMENTSOF(arg_default_rlimit); j++) {
free(arg_default_rlimit[j]);
arg_default_rlimit[j] = NULL;
}
free(arg_default_unit);
arg_default_unit = NULL;
free_join_controllers();
strv_free(arg_default_environment);
arg_default_environment = NULL;
set_free(arg_syscall_archs);
arg_syscall_archs = NULL;
mac_selinux_finish();
if (reexecute) {
const char **args;
unsigned i, args_size;
/* Close and disarm the watchdog, so that the new
* instance can reinitialize it, but doesn't get
* rebooted while we do that */
watchdog_close(true);
/* Reset the RLIMIT_NOFILE to the kernel default, so
* that the new systemd can pass the kernel default to
* its child processes */
if (saved_rlimit_nofile.rlim_cur > 0)
setrlimit(RLIMIT_NOFILE, &saved_rlimit_nofile);
if (switch_root_dir) {
/* Kill all remaining processes from the
* initrd, but don't wait for them, so that we
* can handle the SIGCHLD for them after
* deserializing. */
broadcast_signal(SIGTERM, false, true);
/* And switch root with MS_MOVE, because we remove the old directory afterwards and detach it. */
r = switch_root(switch_root_dir, "/mnt", true, MS_MOVE);
if (r < 0)
log_error_errno(r, "Failed to switch root, trying to continue: %m");
}
args_size = MAX(6, argc+1);
args = newa(const char*, args_size);
if (!switch_root_init) {
char sfd[16];
/* First try to spawn ourselves with the right
* path, and with full serialization. We do
* this only if the user didn't specify an
* explicit init to spawn. */
assert(arg_serialization);
assert(fds);
snprintf(sfd, sizeof(sfd), "%i", fileno(arg_serialization));
char_array_0(sfd);
i = 0;
args[i++] = SYSTEMD_BINARY_PATH;
if (switch_root_dir)
args[i++] = "--switched-root";
args[i++] = arg_running_as == SYSTEMD_SYSTEM ? "--system" : "--user";
args[i++] = "--deserialize";
args[i++] = sfd;
args[i++] = NULL;
/* do not pass along the environment we inherit from the kernel or initrd */
if (switch_root_dir)
clearenv();
assert(i <= args_size);
execv(args[0], (char* const*) args);
}
/* Try the fallback, if there is any, without any
* serialization. We pass the original argv[] and
* envp[]. (Well, modulo the ordering changes due to
* getopt() in argv[], and some cleanups in envp[],
* but let's hope that doesn't matter.) */
if (arg_serialization) {
fclose(arg_serialization);
arg_serialization = NULL;
}
if (fds) {
fdset_free(fds);
fds = NULL;
}
/* Reopen the console */
make_console_stdio();
for (j = 1, i = 1; j < (unsigned) argc; j++)
args[i++] = argv[j];
args[i++] = NULL;
assert(i <= args_size);
/* Reenable any blocked signals, especially important
* if we switch from initial ramdisk to init=... */
reset_all_signal_handlers();
reset_signal_mask();
if (switch_root_init) {
args[0] = switch_root_init;
execv(args[0], (char* const*) args);
log_warning_errno(errno, "Failed to execute configured init, trying fallback: %m");
}
args[0] = "/sbin/init";
execv(args[0], (char* const*) args);
if (errno == ENOENT) {
log_warning("No /sbin/init, trying fallback");
args[0] = "/bin/sh";
args[1] = NULL;
execv(args[0], (char* const*) args);
log_error_errno(errno, "Failed to execute /bin/sh, giving up: %m");
} else
log_warning_errno(errno, "Failed to execute /sbin/init, giving up: %m");
}
if (arg_serialization) {
fclose(arg_serialization);
arg_serialization = NULL;
}
if (fds) {
fdset_free(fds);
fds = NULL;
}
#ifdef HAVE_VALGRIND_VALGRIND_H
/* If we are PID 1 and running under valgrind, then let's exit
* here explicitly. valgrind will only generate nice output on
* exit(), not on exec(), hence let's do the former not the
* latter here. */
if (getpid() == 1 && RUNNING_ON_VALGRIND)
return 0;
#endif
if (shutdown_verb) {
char log_level[DECIMAL_STR_MAX(int) + 1];
const char* command_line[9] = {
SYSTEMD_SHUTDOWN_BINARY_PATH,
shutdown_verb,
"--log-level", log_level,
"--log-target",
};
unsigned pos = 5;
_cleanup_strv_free_ char **env_block = NULL;
assert(command_line[pos] == NULL);
env_block = strv_copy(environ);
snprintf(log_level, sizeof(log_level), "%d", log_get_max_level());
switch (log_get_target()) {
case LOG_TARGET_KMSG:
case LOG_TARGET_JOURNAL_OR_KMSG:
case LOG_TARGET_SYSLOG_OR_KMSG:
command_line[pos++] = "kmsg";
break;
case LOG_TARGET_CONSOLE:
default:
command_line[pos++] = "console";
break;
};
if (log_get_show_color())
command_line[pos++] = "--log-color";
if (log_get_show_location())
command_line[pos++] = "--log-location";
assert(pos < ELEMENTSOF(command_line));
if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) {
char *e;
/* If we reboot let's set the shutdown
* watchdog and tell the shutdown binary to
* repeatedly ping it */
watchdog_set_timeout(&arg_shutdown_watchdog);
watchdog_close(false);
/* Tell the binary how often to ping, ignore failure */
if (asprintf(&e, "WATCHDOG_USEC="USEC_FMT, arg_shutdown_watchdog) > 0)
strv_push(&env_block, e);
} else
watchdog_close(true);
/* Avoid the creation of new processes forked by the
* kernel; at this point, we will not listen to the
* signals anyway */
if (detect_container(NULL) <= 0)
cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER);
execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
log_error_errno(errno, "Failed to execute shutdown binary, %s: %m",
getpid() == 1 ? "freezing" : "quitting");
}
if (getpid() == 1) {
if (error_message)
manager_status_printf(NULL, STATUS_TYPE_EMERGENCY,
ANSI_HIGHLIGHT_RED_ON "!!!!!!" ANSI_HIGHLIGHT_OFF,
"%s, freezing.", error_message);
freeze();
}
return retval;
}