summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
authorSven Eden <yamakuzure@gmx.net>2018-08-21 08:20:36 +0200
committerSven Eden <yamakuzure@gmx.net>2018-08-24 16:47:08 +0200
commitfe9f813b914df4d0451f8e7b12eca0408db625bf (patch)
tree63a2281034efe71508dd12cdcaa5f70d3731c23a /src/login
parentcf380e653e9ff12805ef32041118fe3c1b9fbd55 (diff)
Prep v239: Add support for the new 'suspend-then-hibernate' method.
Diffstat (limited to 'src/login')
-rw-r--r--src/login/elogind-dbus.c8
-rw-r--r--src/login/elogind.c18
-rw-r--r--src/login/logind-action.c2
-rw-r--r--src/login/logind-dbus.c6
-rw-r--r--src/login/logind-gperf.gperf1
-rw-r--r--src/login/logind.c2
-rw-r--r--src/login/logind.conf.in9
-rw-r--r--src/login/logind.h2
8 files changed, 35 insertions, 13 deletions
diff --git a/src/login/elogind-dbus.c b/src/login/elogind-dbus.c
index 39f5e8cf9..bed528145 100644
--- a/src/login/elogind-dbus.c
+++ b/src/login/elogind-dbus.c
@@ -107,11 +107,13 @@ static int shutdown_or_sleep(Manager *m, HandleAction action) {
case HANDLE_KEXEC:
return run_helper(KEXEC);
case HANDLE_SUSPEND:
- return do_sleep("suspend", m->suspend_mode, m->suspend_state, 0);
+ return do_sleep(m, "suspend");
case HANDLE_HIBERNATE:
- return do_sleep("hibernate", m->hibernate_mode, m->hibernate_state, 0);
+ return do_sleep(m, "hibernate");
case HANDLE_HYBRID_SLEEP:
- return do_sleep("hybrid-sleep", m->hybrid_sleep_mode, m->hybrid_sleep_state, 0);
+ return do_sleep(m, "hybrid-sleep");
+ case HANDLE_SUSPEND_THEN_HIBERNATE:
+ return do_sleep(m, "suspend-then-hibernate");
default:
return -EINVAL;
}
diff --git a/src/login/elogind.c b/src/login/elogind.c
index 90ae3d7f1..c884789f7 100644
--- a/src/login/elogind.c
+++ b/src/login/elogind.c
@@ -379,12 +379,13 @@ int elogind_manager_new(Manager* m) {
m->test_run_flags = 0;
/* Init sleep modes and states */
- m->suspend_mode = NULL;
- m->suspend_state = NULL;
- m->hibernate_mode = NULL;
- m->hibernate_state = NULL;
- m->hybrid_sleep_mode = NULL;
- m->hybrid_sleep_state = NULL;
+ m->suspend_mode = NULL;
+ m->suspend_state = NULL;
+ m->hibernate_mode = NULL;
+ m->hibernate_state = NULL;
+ m->hybrid_sleep_mode = NULL;
+ m->hybrid_sleep_state = NULL;
+ m->hibernate_delay_sec = 0;
/* If elogind should be its own controller, mount its cgroup */
if (streq(SYSTEMD_CGROUP_CONTROLLER, "_elogind")) {
@@ -419,6 +420,8 @@ void elogind_manager_reset_config(Manager* m) {
m->hybrid_sleep_mode = strv_new("suspend", "platform", "shutdown", NULL);
if (!m->hybrid_sleep_state)
m->hybrid_sleep_state = strv_new("disk", NULL);
+ if (!m->hibernate_delay_sec)
+ m->hibernate_delay_sec = 180 * USEC_PER_MINUTE;
#if ENABLE_DEBUG_ELOGIND
dbg_cnt = -1;
@@ -445,6 +448,9 @@ void elogind_manager_reset_config(Manager* m) {
while (m->hybrid_sleep_state[++dbg_cnt])
log_debug_elogind("hybrid_sleep_state[%d] = %s",
dbg_cnt, m->hybrid_sleep_state[dbg_cnt]);
+ log_debug_elogind("hibernate_delay_sec: %ul seconds (%ul minutes)",
+ m->hibernate_delay_sec / USEC_PER_SEC,
+ m->hibernate_delay_sec / USEC_PER_MINUTE);
#endif // ENABLE_DEBUG_ELOGIND
}
diff --git a/src/login/logind-action.c b/src/login/logind-action.c
index 0426acbfc..497164e41 100644
--- a/src/login/logind-action.c
+++ b/src/login/logind-action.c
@@ -118,6 +118,8 @@ int manager_handle_action(
supported = can_sleep(m, "hibernate") > 0;
else if (handle == HANDLE_HYBRID_SLEEP)
supported = can_sleep(m, "hybrid-sleep") > 0;
+ else if (handle == HANDLE_SUSPEND_THEN_HIBERNATE)
+ supported = can_sleep(m, "suspend-then-hibernate") > 0;
#endif // 0
else if (handle == HANDLE_KEXEC)
supported = access(KEXEC, X_OK) >= 0;
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 31acd57dc..2f7782a13 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -1979,6 +1979,9 @@ static int method_hybrid_sleep(sd_bus_message *message, void *userdata, sd_bus_e
m, message,
#if 0 /// elogind uses HandleAction instead of const char* unti names
SPECIAL_HYBRID_SLEEP_TARGET,
+#else
+ HANDLE_HYBRID_SLEEP,
+#endif // 0
INHIBIT_SLEEP,
"org.freedesktop.login1.hibernate",
"org.freedesktop.login1.hibernate-multiple-sessions",
@@ -1992,9 +1995,10 @@ static int method_suspend_then_hibernate(sd_bus_message *message, void *userdata
return method_do_shutdown_or_sleep(
m, message,
+#if 0 /// elogind uses HandleAction instead of const char* unti names
SPECIAL_SUSPEND_THEN_HIBERNATE_TARGET,
#else
- HANDLE_HYBRID_SLEEP,
+ HANDLE_SUSPEND_THEN_HIBERNATE,
#endif // 0
INHIBIT_SLEEP,
"org.freedesktop.login1.hibernate",
diff --git a/src/login/logind-gperf.gperf b/src/login/logind-gperf.gperf
index 80e9e8c20..c8523fbdf 100644
--- a/src/login/logind-gperf.gperf
+++ b/src/login/logind-gperf.gperf
@@ -24,6 +24,7 @@ Sleep.HibernateMode, config_parse_strv, 0, offsetof(Manag
Sleep.HibernateState, config_parse_strv, 0, offsetof(Manager, hibernate_state)
Sleep.HybridSleepMode, config_parse_strv, 0, offsetof(Manager, hybrid_sleep_mode)
Sleep.HybridSleepState, config_parse_strv, 0, offsetof(Manager, hybrid_sleep_state)
+Sleep.HibernateDelaySec, config_parse_sec, 0, offsetof(Manager, hibernate_delay_sec),
#endif // 1
#if 0 /// UNNEEDED by elogind
# Login.NAutoVTs, config_parse_n_autovts, 0, offsetof(Manager, n_autovts)
diff --git a/src/login/logind.c b/src/login/logind.c
index b60536700..4c4577965 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -1314,8 +1314,6 @@ int main(int argc, char *argv[]) {
if ( r < 0 && (-EEXIST != r) )
return log_error_errno(r, "Failed to create /run/systemd/machines : %m");
#endif // 0
- goto finish;
- }
(void) manager_parse_config_file(m);
diff --git a/src/login/logind.conf.in b/src/login/logind.conf.in
index 1794014cc..6da3f164d 100644
--- a/src/login/logind.conf.in
+++ b/src/login/logind.conf.in
@@ -35,3 +35,12 @@
#RemoveIPC=yes
#InhibitorsMax=8192
#SessionsMax=8192
+
+[Sleep]
+#SuspendState=mem standby freeze
+#SuspendMode=
+#HibernateState=disk
+#HibernateMode=platform shutdown
+#HybridSleepState=disk
+#HybridSleepMode=suspend platform shutdown
+#HibernateDelaySec=10800
diff --git a/src/login/logind.h b/src/login/logind.h
index 48fc61965..3f17d5d6d 100644
--- a/src/login/logind.h
+++ b/src/login/logind.h
@@ -116,7 +116,7 @@ struct Manager {
char **suspend_state, **suspend_mode;
char **hibernate_state, **hibernate_mode;
char **hybrid_sleep_state, **hybrid_sleep_mode;
-
+ usec_t hibernate_delay_sec;
#endif // 0
sd_event_source *inhibit_timeout_source;