<command>halt</command>,
<command>poweroff</command>,
<command>reboot</command> or
- <command>kexec</command> execute
+ <command>kexec</command> execute the
selected operation without shutting
down all units. However, all processes
will be killed forcibly and all file
systems are unmounted or remounted
read-only. This is hence a drastic but
relatively safe option to request an
- immediate reboot.</para></listitem>
+ immediate reboot. If
+ <option>--force</option> is specified
+ twice for these operations, they will
+ be executed immediately without
+ terminating any processes or umounting
+ any file systems. Warning: specifying
+ <option>--force</option> twice with
+ any of these operations might result
+ in data loss.</para></listitem>
</varlistentry>
<varlistentry>
system. This is mostly equivalent to
<command>start halt.target</command>
but also prints a wall message to all
- users. If
- combined with <option>--force</option>
- shutdown of all running services is
- skipped, however all processes are killed
- and all file systems are unmounted or
+ users. If combined with
+ <option>--force</option> shutdown of
+ all running services is skipped,
+ however all processes are killed and
+ all file systems are unmounted or
mounted read-only, immediately
- followed by the
- system halt.</para></listitem>
+ followed by the system halt. If
+ <option>--force</option> is specified
+ twice the the operation is immediately
+ executed without terminating any
+ processes or unmounting any file
+ systems. This may result in data
+ loss.</para></listitem>
</varlistentry>
<varlistentry>
<term><command>poweroff</command></term>
power-off the system. This is mostly
equivalent to <command>start
poweroff.target</command> but also
- prints a wall message to all
- users. If
+ prints a wall message to all users. If
combined with <option>--force</option>
shutdown of all running services is
- skipped, however all processes are killed
- and all file systems are unmounted or
- mounted read-only, immediately
- followed by the
- powering off.</para></listitem>
+ skipped, however all processes are
+ killed and all file systems are
+ unmounted or mounted read-only,
+ immediately followed by the powering
+ off. If <option>--force</option> is
+ specified twice the the operation is
+ immediately executed without
+ terminating any processes or
+ unmounting any file systems. This may
+ result in data loss.</para></listitem>
</varlistentry>
<varlistentry>
<term><command>reboot</command></term>
- <listitem><para>Shut down and
- reboot the system. This is mostly
- equivalent to <command>start
+ <listitem><para>Shut down and reboot
+ the system. This is mostly equivalent
+ to <command>start
reboot.target</command> but also
- prints a wall message to all
- users. If
+ prints a wall message to all users. If
combined with <option>--force</option>
shutdown of all running services is
- skipped, however all processes are killed
- and all file systems are unmounted or
- mounted read-only, immediately
- followed by the
- reboot.</para></listitem>
+ skipped, however all processes are
+ killed and all file systems are
+ unmounted or mounted read-only,
+ immediately followed by the reboot. If
+ <option>--force</option> is specified
+ twice the the operation is immediately
+ executed without terminating any
+ processes or unmounting any file
+ systems. This may result in data
+ loss.</para></listitem>
</varlistentry>
<varlistentry>
<term><command>kexec</command></term>
static bool arg_dry = false;
static bool arg_quiet = false;
static bool arg_full = false;
-static bool arg_force = false;
+static int arg_force = 0;
static bool arg_ask_password = false;
static bool arg_failed = false;
static bool arg_runtime = false;
static bool private_bus = false;
static int daemon_reload(DBusConnection *bus, char **args);
+static void halt_now(int action);
static bool on_tty(void) {
static int t = -1;
assert(bus);
assert(args);
+ if (arg_force >= 2 && streq(args[0], "halt"))
+ halt_now(ACTION_HALT);
+
+ if (arg_force >= 2 && streq(args[0], "poweroff"))
+ halt_now(ACTION_POWEROFF);
+
+ if (arg_force >= 2 && streq(args[0], "reboot"))
+ halt_now(ACTION_POWEROFF);
+
if (arg_force &&
(streq(args[0], "halt") ||
streq(args[0], "poweroff") ||
break;
case 'f':
- arg_force = true;
+ arg_force ++;
break;
case ARG_NO_RELOAD:
return 0;
}
+static void halt_now(int action) {
+
+ /* Make sure C-A-D is handled by the kernel from this
+ * point on... */
+ reboot(RB_ENABLE_CAD);
+
+ switch (action) {
+
+ case ACTION_HALT:
+ log_info("Halting.");
+ reboot(RB_HALT_SYSTEM);
+ break;
+
+ case ACTION_POWEROFF:
+ log_info("Powering off.");
+ reboot(RB_POWER_OFF);
+ break;
+
+ case ACTION_REBOOT:
+ log_info("Rebooting.");
+ reboot(RB_AUTOBOOT);
+ break;
+
+ default:
+ assert_not_reached("Unknown halt action.");
+ }
+
+ assert_not_reached("Uh? This shouldn't happen.");
+}
+
static int halt_main(DBusConnection *bus) {
int r;
if (arg_dry)
return 0;
- /* Make sure C-A-D is handled by the kernel from this
- * point on... */
- reboot(RB_ENABLE_CAD);
-
- switch (arg_action) {
-
- case ACTION_HALT:
- log_info("Halting.");
- reboot(RB_HALT_SYSTEM);
- break;
-
- case ACTION_POWEROFF:
- log_info("Powering off.");
- reboot(RB_POWER_OFF);
- break;
-
- case ACTION_REBOOT:
- log_info("Rebooting.");
- reboot(RB_AUTOBOOT);
- break;
-
- default:
- assert_not_reached("Unknown halt action.");
- }
-
+ halt_now(arg_action);
/* We should never reach this. */
return -ENOSYS;
}