diff options
author | Sven Eden <yamakuzure@gmx.net> | 2017-02-02 09:10:41 +0100 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2017-03-14 10:23:13 +0100 |
commit | 5b3e932f4e40d2c5523757242e00e4f4e6ae89cd (patch) | |
tree | d05f7e31018dafe4e70bae4ae480d7c1683b9908 /src/login | |
parent | e19b8719a54c343372e16b462c27f1e84c987b85 (diff) |
Incorporate sleep.conf into logind.conf
* src/login/logind-action.c (shutdown_or_sleep, do_sleep): Take modes
from the manager instead of parsing them ourselves.
* src/login/logind-dbus.c (execute_shutdown_or_sleep): Adapt to
shutdown_or_sleep prototype change.
* src/login/logind-gperf.gperf: Add config items from sleep.conf.
* src/login/logind.c (manager_new): Wire up defaults for new config
items.
(manager_free): Free new config items.
(manager_parse_config_file): Arrange to parse a single
elogind/logind.conf file, not grovelling all over the filesystem.
Take the file from the ELOGIND_CONF_FILE environment variable if
present.
Diffstat (limited to 'src/login')
-rw-r--r-- | src/login/logind-action.c | 14 | ||||
-rw-r--r-- | src/login/logind-action.h | 2 | ||||
-rw-r--r-- | src/login/logind-dbus.c | 2 | ||||
-rw-r--r-- | src/login/logind-gperf.gperf | 6 | ||||
-rw-r--r-- | src/login/logind.c | 41 | ||||
-rw-r--r-- | src/login/logind.conf (renamed from src/login/elogind.conf) | 8 | ||||
-rw-r--r-- | src/login/logind.h | 4 |
7 files changed, 69 insertions, 8 deletions
diff --git a/src/login/logind-action.c b/src/login/logind-action.c index eba097c61..5406cd45b 100644 --- a/src/login/logind-action.c +++ b/src/login/logind-action.c @@ -240,8 +240,7 @@ static int write_state(FILE **f, char **states) { return r; } -static int do_sleep(const char *arg_verb) { - _cleanup_strv_free_ char **modes = NULL, **states = NULL; +static int do_sleep(const char *arg_verb, char **modes, char **states) { char *arguments[] = { NULL, (char*) "pre", @@ -288,7 +287,10 @@ static int do_sleep(const char *arg_verb) { return r; } -int shutdown_or_sleep(HandleAction action) { +int shutdown_or_sleep(Manager *m, HandleAction action) { + + assert(m); + switch (action) { case HANDLE_POWEROFF: return run_helper(HALT); @@ -299,11 +301,11 @@ int shutdown_or_sleep(HandleAction action) { case HANDLE_KEXEC: return run_helper(KEXEC); case HANDLE_SUSPEND: - return do_sleep("suspend"); + return do_sleep("suspend", m->suspend_mode, m->suspend_state); case HANDLE_HIBERNATE: - return do_sleep("hibernate"); + return do_sleep("hibernate", m->hibernate_mode, m->hibernate_state); case HANDLE_HYBRID_SLEEP: - return do_sleep("hybrid-sleep"); + return do_sleep("hybrid-sleep", m->hybrid_sleep_mode, m->hybrid_sleep_state); default: return -EINVAL; } diff --git a/src/login/logind-action.h b/src/login/logind-action.h index 5269237c6..99b06bff8 100644 --- a/src/login/logind-action.h +++ b/src/login/logind-action.h @@ -44,7 +44,7 @@ int manager_handle_action( bool ignore_inhibited, bool is_edge); -int shutdown_or_sleep(HandleAction action); +int shutdown_or_sleep(Manager *m, HandleAction action); const char* handle_action_to_string(HandleAction h) _const_; HandleAction handle_action_from_string(const char *s) _pure_; diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 5245c8898..b0c15e253 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -1466,7 +1466,7 @@ static int execute_shutdown_or_sleep( &reply, "ss", NULL, "replace-irreversibly"); #else - r = shutdown_or_sleep(action); + r = shutdown_or_sleep(m, action); #endif // 0 if (r < 0) return r; diff --git a/src/login/logind-gperf.gperf b/src/login/logind-gperf.gperf index d9fa06c1f..9705dd5b1 100644 --- a/src/login/logind-gperf.gperf +++ b/src/login/logind-gperf.gperf @@ -32,3 +32,9 @@ Login.IdleAction, config_parse_handle_action, 0, offsetof(Manag Login.IdleActionSec, config_parse_sec, 0, offsetof(Manager, idle_action_usec) Login.RuntimeDirectorySize, config_parse_tmpfs_size, 0, offsetof(Manager, runtime_dir_size) Login.RemoveIPC, config_parse_bool, 0, offsetof(Manager, remove_ipc) +Sleep.SuspendMode, config_parse_strv, 0, offsetof(Manager, suspend_mode) +Sleep.SuspendState, config_parse_strv, 0, offsetof(Manager, suspend_state) +Sleep.HibernateMode, config_parse_strv, 0, offsetof(Manager, hibernate_mode) +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) diff --git a/src/login/logind.c b/src/login/logind.c index 09007c255..d60241342 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -99,6 +99,23 @@ static Manager *manager_new(void) { if (r < 0) goto fail; + m->suspend_mode = NULL; + m->suspend_state = strv_new("mem", "standby", "freeze", NULL); + if (!m->suspend_state) + goto fail; + m->hibernate_mode = strv_new("platform", "shutdown", NULL); + if (!m->hibernate_mode) + goto fail; + m->hibernate_state = strv_new("disk", NULL); + if (!m->hibernate_state) + goto fail; + m->hybrid_sleep_mode = strv_new("suspend", "platform", "shutdown", NULL); + if (!m->hybrid_sleep_mode) + goto fail; + m->hybrid_sleep_state = strv_new("disk", NULL); + if (!m->hybrid_sleep_state) + goto fail; + m->udev = udev_new(); if (!m->udev) goto fail; @@ -197,6 +214,14 @@ static void manager_free(Manager *m) { free(m->scheduled_shutdown_type); free(m->scheduled_shutdown_tty); free(m->wall_message); + + strv_free(m->suspend_mode); + strv_free(m->suspend_state); + strv_free(m->hibernate_mode); + strv_free(m->hibernate_state); + strv_free(m->hybrid_sleep_mode); + strv_free(m->hybrid_sleep_state); + free(m); } @@ -1133,13 +1158,29 @@ static int manager_run(Manager *m) { } static int manager_parse_config_file(Manager *m) { + const char *unit = NULL, *logind_conf, *sections; + FILE *file = NULL; + bool relaxed = false, allow_include = false, warn = true; + assert(m); +/// elogind parses its own config file +#if 0 return config_parse_many("/etc/systemd/logind.conf", CONF_DIRS_NULSTR("systemd/logind.conf"), "Login\0", config_item_perf_lookup, logind_gperf_lookup, false, m); +#endif // 0 + + logind_conf = getenv("ELOGIND_CONF_FILE"); + if (!logind_conf) + logind_conf = PKGSYSCONFDIR "/logind.conf"; + sections = "Login\0Sleep\0"; + + return config_parse(unit, logind_conf, file, sections, + config_item_perf_lookup, logind_gperf_lookup, + relaxed, allow_include, warn, m); } int main(int argc, char *argv[]) { diff --git a/src/login/elogind.conf b/src/login/logind.conf index 85e297dd3..6103e070d 100644 --- a/src/login/elogind.conf +++ b/src/login/logind.conf @@ -30,3 +30,11 @@ #IdleActionSec=30min #RuntimeDirectorySize=10% #RemoveIPC=yes + +[Sleep] +#SuspendState=mem standby freeze +#SuspendMode= +#HibernateState=disk +#HibernateMode=platform shutdown +#HybridSleepState=disk +#HybridSleepMode=suspend platform shutdown diff --git a/src/login/logind.h b/src/login/logind.h index 67ebbd88c..0b6422fc1 100644 --- a/src/login/logind.h +++ b/src/login/logind.h @@ -152,6 +152,10 @@ struct Manager { bool remove_ipc; + char **suspend_state, **suspend_mode; + char **hibernate_state, **hibernate_mode; + char **hybrid_sleep_state, **hybrid_sleep_mode; + Hashmap *polkit_registry; usec_t holdoff_timeout_usec; |