}
static int parse_proc_cmdline(void) {
- char *line;
+ char *line, *w, *state;
int r;
- char *w;
size_t l;
- char *state;
if ((r = read_one_line_file("/proc/cmdline", &line)) < 0) {
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
int r, retval = EXIT_FAILURE;
FDSet *fds = NULL;
bool reexecute = false;
+ const char *shutdown_verb = NULL;
if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
/* This is compatbility support for SysV, where
dbus_error_free(&error);
} else if (target->meta.load_state == UNIT_ERROR)
log_error("Failed to load default target: %s", strerror(-target->meta.load_error));
- else if (target->meta.load_state == UNIT_BANNED)
- log_error("Default target banned.");
+ else if (target->meta.load_state == UNIT_MASKED)
+ log_error("Default target masked.");
if (!target || target->meta.load_state != UNIT_LOADED) {
log_info("Trying to load rescue target...");
} else if (target->meta.load_state == UNIT_ERROR) {
log_error("Failed to load rescue target: %s", strerror(-target->meta.load_error));
goto finish;
- } else if (target->meta.load_state == UNIT_BANNED) {
- log_error("Rescue target banned.");
+ } else if (target->meta.load_state == UNIT_MASKED) {
+ log_error("Rescue target masked.");
goto finish;
}
}
log_notice("Reexecuting.");
goto finish;
+ case MANAGER_REBOOT:
+ case MANAGER_POWEROFF:
+ case MANAGER_HALT:
+ case MANAGER_KEXEC: {
+ static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
+ [MANAGER_REBOOT] = "reboot",
+ [MANAGER_POWEROFF] = "poweroff",
+ [MANAGER_HALT] = "halt",
+ [MANAGER_KEXEC] = "kexec"
+ };
+
+ assert_se(shutdown_verb = table[m->exit_code]);
+
+ log_notice("Shutting down.");
+ goto finish;
+ }
+
default:
assert_not_reached("Unknown exit code.");
}
if (fds)
fdset_free(fds);
+ if (shutdown_verb) {
+ const char * command_line[] = {
+ SYSTEMD_SHUTDOWN_BINARY_PATH,
+ shutdown_verb,
+ NULL
+ };
+
+ execv(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line);
+ log_error("Failed to execute shutdown binary, freezing: %m");
+ }
+
if (getpid() == 1)
freeze();