commit cd4e1305f19728ef010c20a18cd3f92cccae49d4 Author: Harald Hoyer Date: Thu Apr 18 17:23:01 2013 +0200 Support "freeze" diff --git a/src/login/logind-action.c b/src/login/logind-action.c index 4091e41..c61314a 100644 --- a/src/login/logind-action.c +++ b/src/login/logind-action.c @@ -41,6 +41,7 @@ int manager_handle_action( [HANDLE_HALT] = "Halting...", [HANDLE_KEXEC] = "Rebooting via kexec...", [HANDLE_SUSPEND] = "Suspending...", + [HANDLE_FREEZE] = "Freezing...", [HANDLE_HIBERNATE] = "Hibernating...", [HANDLE_HYBRID_SLEEP] = "Hibernating and suspending..." }; @@ -51,6 +52,7 @@ int manager_handle_action( [HANDLE_HALT] = SPECIAL_HALT_TARGET, [HANDLE_KEXEC] = SPECIAL_KEXEC_TARGET, [HANDLE_SUSPEND] = SPECIAL_SUSPEND_TARGET, + [HANDLE_FREEZE] = SPECIAL_SUSPEND_TARGET, [HANDLE_HIBERNATE] = SPECIAL_HIBERNATE_TARGET, [HANDLE_HYBRID_SLEEP] = SPECIAL_HYBRID_SLEEP_TARGET }; @@ -77,6 +79,8 @@ int manager_handle_action( supported = can_sleep("mem") > 0; else if (handle == HANDLE_HIBERNATE) supported = can_sleep("disk") > 0; + else if (handle == HANDLE_FREEZE) + supported = can_sleep("freeze") > 0; else if (handle == HANDLE_HYBRID_SLEEP) supported = can_sleep("disk") > 0 && can_sleep_disk("suspend") > 0; else if (handle == HANDLE_KEXEC) @@ -141,6 +145,7 @@ static const char* const handle_action_table[_HANDLE_ACTION_MAX] = { [HANDLE_HALT] = "halt", [HANDLE_KEXEC] = "kexec", [HANDLE_SUSPEND] = "suspend", + [HANDLE_FREEZE] = "freeze", [HANDLE_HIBERNATE] = "hibernate", [HANDLE_HYBRID_SLEEP] = "hybrid-sleep", [HANDLE_LOCK] = "lock" diff --git a/src/login/logind-action.h b/src/login/logind-action.h index df080d9..010ea4e 100644 --- a/src/login/logind-action.h +++ b/src/login/logind-action.h @@ -32,6 +32,7 @@ typedef enum HandleAction { HANDLE_HIBERNATE, HANDLE_HYBRID_SLEEP, HANDLE_LOCK, + HANDLE_FREEZE, _HANDLE_ACTION_MAX, _HANDLE_ACTION_INVALID = -1 } HandleAction; diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 4176902..d34f763 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -145,6 +145,9 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -160,6 +163,9 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -2189,6 +2195,18 @@ static DBusHandlerResult manager_message_handler( &error, &reply); if (r < 0) return bus_send_error_reply(connection, message, &error, r); + } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "Freeze")) { + r = bus_manager_do_shutdown_or_sleep( + m, connection, message, + SPECIAL_SUSPEND_TARGET, + INHIBIT_SLEEP, + "org.freedesktop.login1.suspend", + "org.freedesktop.login1.suspend-multiple-sessions", + "org.freedesktop.login1.suspend-ignore-inhibit", + "freeze", NULL, + &error, &reply); + if (r < 0) + return bus_send_error_reply(connection, message, &error, r); } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "Hibernate")) { r = bus_manager_do_shutdown_or_sleep( m, connection, message, @@ -2251,6 +2269,18 @@ static DBusHandlerResult manager_message_handler( if (r < 0) return bus_send_error_reply(connection, message, &error, r); + } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "CanFreeze")) { + r = bus_manager_can_shutdown_or_sleep( + m, connection, message, + INHIBIT_SLEEP, + "org.freedesktop.login1.suspend", + "org.freedesktop.login1.suspend-multiple-sessions", + "org.freedesktop.login1.suspend-ignore-inhibit", + "mem", NULL, + &error, &reply); + if (r < 0) + return bus_send_error_reply(connection, message, &error, r); + } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "CanHibernate")) { r = bus_manager_can_shutdown_or_sleep( m, connection, message, diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c index f5e78c1..398f694 100644 --- a/src/sleep/sleep.c +++ b/src/sleep/sleep.c @@ -47,6 +47,8 @@ int main(int argc, char *argv[]) { if (streq(argv[1], "suspend")) verb = "mem"; + else if (streq(argv[1], "freeze")) + verb = "freeze"; else if (streq(argv[1], "hibernate") || streq(argv[1], "hybrid-sleep")) verb = "disk"; else { @@ -84,6 +86,12 @@ int main(int argc, char *argv[]) { "MESSAGE=Suspending system...", "SLEEP=suspend", NULL); + else if (streq(argv[1], "freeze")) + log_struct(LOG_INFO, + MESSAGE_ID(SD_MESSAGE_SLEEP_START), + "MESSAGE=Freezing system...", + "SLEEP=freeze", + NULL); else if (streq(argv[1], "hibernate")) log_struct(LOG_INFO, MESSAGE_ID(SD_MESSAGE_SLEEP_START), @@ -109,6 +117,12 @@ int main(int argc, char *argv[]) { "MESSAGE=System resumed.", "SLEEP=suspend", NULL); + else if (streq(argv[1], "freeze")) + log_struct(LOG_INFO, + MESSAGE_ID(SD_MESSAGE_SLEEP_STOP), + "MESSAGE=System thawed.", + "SLEEP=freeze", + NULL); else log_struct(LOG_INFO, MESSAGE_ID(SD_MESSAGE_SLEEP_STOP), diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index c2b1749..60618d0 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -103,6 +103,7 @@ static enum action { ACTION_KEXEC, ACTION_EXIT, ACTION_SUSPEND, + ACTION_FREEZE, ACTION_HIBERNATE, ACTION_HYBRID_SLEEP, ACTION_RUNLEVEL2, @@ -1872,6 +1873,7 @@ static const struct { [ACTION_DEFAULT] = { SPECIAL_DEFAULT_TARGET, "default", "isolate" }, [ACTION_EXIT] = { SPECIAL_EXIT_TARGET, "exit", "replace-irreversibly" }, [ACTION_SUSPEND] = { SPECIAL_SUSPEND_TARGET, "suspend", "replace-irreversibly" }, + [ACTION_FREEZE] = { SPECIAL_SUSPEND_TARGET, "freeze", "replace-irreversibly" }, [ACTION_HIBERNATE] = { SPECIAL_HIBERNATE_TARGET, "hibernate", "replace-irreversibly" }, [ACTION_HYBRID_SLEEP] = { SPECIAL_HYBRID_SLEEP_TARGET, "hybrid-sleep", "replace-irreversibly" }, }; @@ -2005,6 +2007,10 @@ static int reboot_with_logind(DBusConnection *bus, enum action a) { method = "Suspend"; break; + case ACTION_FREEZE: + method = "Freeze"; + break; + case ACTION_HIBERNATE: method = "Hibernate"; break; @@ -2198,6 +2204,7 @@ static int start_special(DBusConnection *bus, char **args) { (a == ACTION_POWEROFF || a == ACTION_REBOOT || a == ACTION_SUSPEND || + a == ACTION_FREEZE || a == ACTION_HIBERNATE || a == ACTION_HYBRID_SLEEP)) { r = reboot_with_logind(bus, a); @@ -4584,6 +4591,7 @@ static int systemctl_help(void) { " exit Request user instance exit\n" " switch-root [ROOT] [INIT] Change to a different root file system\n" " suspend Suspend the system\n" + " freeze Freeze the system\n" " hibernate Hibernate the system\n" " hybrid-sleep Hibernate and suspend the system\n", program_invocation_short_name); @@ -5577,6 +5585,7 @@ static int systemctl_main(DBusConnection *bus, int argc, char *argv[], DBusError { "reboot", EQUAL, 1, start_special }, { "kexec", EQUAL, 1, start_special }, { "suspend", EQUAL, 1, start_special }, + { "freeze", EQUAL, 1, start_special }, { "hibernate", EQUAL, 1, start_special }, { "hybrid-sleep", EQUAL, 1, start_special }, { "default", EQUAL, 1, start_special }, diff --git a/src/test/test-sleep.c b/src/test/test-sleep.c index 5a98ecd..34faea9 100644 --- a/src/test/test-sleep.c +++ b/src/test/test-sleep.c @@ -29,6 +29,7 @@ int main(int argc, char* argv[]) { log_info("Can Suspend: %s", yes_no(can_sleep("mem") > 0)); + log_info("Can Freeze: %s", yes_no(can_sleep("freeze") > 0)); log_info("Can Hibernate: %s", yes_no(can_sleep("disk") > 0)); log_info("Can Hibernate+Suspend (Hybrid-Sleep): %s", yes_no(can_sleep_disk("suspend") > 0)); log_info("Can Hibernate+Reboot: %s", yes_no(can_sleep_disk("reboot") > 0));