summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Eden <yamakuzure@gmx.net>2017-02-02 09:10:41 +0100
committerSven Eden <yamakuzure@gmx.net>2017-03-14 10:23:13 +0100
commit5b3e932f4e40d2c5523757242e00e4f4e6ae89cd (patch)
treed05f7e31018dafe4e70bae4ae480d7c1683b9908
parente19b8719a54c343372e16b462c27f1e84c987b85 (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.
-rw-r--r--Makefile.am5
-rw-r--r--src/login/logind-action.c14
-rw-r--r--src/login/logind-action.h2
-rw-r--r--src/login/logind-dbus.c2
-rw-r--r--src/login/logind-gperf.gperf6
-rw-r--r--src/login/logind.c41
-rw-r--r--src/login/logind.conf (renamed from src/login/elogind.conf)8
-rw-r--r--src/login/logind.h4
8 files changed, 70 insertions, 12 deletions
diff --git a/Makefile.am b/Makefile.am
index 6e8805898..9800c47f1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -730,7 +730,7 @@ dist_dbuspolicy_DATA += \
src/login/org.freedesktop.login1.conf
dist_pkgsysconf_DATA += \
- src/login/elogind.conf
+ src/login/logind.conf
polkitpolicy_files += \
src/login/org.freedesktop.login1.policy
@@ -791,9 +791,6 @@ sysctl.d/%: sysctl.d/%.in
%.pc: %.pc.in
$(SED_PROCESS)
-%.conf: %.conf.in
- $(SED_PROCESS)
-
shell-completion/%: shell-completion/%.in
$(SED_PROCESS)
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;