diff options
author | Zach Smith <z@zxmth.us> | 2021-01-07 18:06:30 -0800 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-01-09 18:11:01 +0900 |
commit | ae463e4ef2c8c3ba18abc58315ac0daea8407c03 (patch) | |
tree | a0dc6282a23a02137772793f2e05afccfcb6a641 | |
parent | 83f0ff1eda6ea995cd078d54ae5601370dbbd9d2 (diff) | |
download | systemd-ae463e4ef2c8c3ba18abc58315ac0daea8407c03.tar.gz |
systemd-sleep: Set SYSTEMD_SLEEP_ACTION for systemd-sleep hooks.
When suspend-then-hibernate is called, hooks have no ability to determine which
stage of the request is being handled; they only see 'pre' and 'post' with the
verb 'suspend-then-hibernate'. This change introduces an environment variable
called SYSTEMD_SLEEP_ACTION that contains the name of the action that is
processing: 'suspend', 'hibernate', 'hybrid-sleep', or
'suspend-after-failed-hibernate'.
-rw-r--r-- | man/systemd-suspend.service.xml | 5 | ||||
-rw-r--r-- | src/sleep/sleep.c | 14 |
2 files changed, 13 insertions, 6 deletions
diff --git a/man/systemd-suspend.service.xml b/man/systemd-suspend.service.xml index e4a6de548f..c525a3bda2 100644 --- a/man/systemd-suspend.service.xml +++ b/man/systemd-suspend.service.xml @@ -56,7 +56,10 @@ <literal>pre</literal>, the second either <literal>suspend</literal>, <literal>hibernate</literal>, <literal>hybrid-sleep</literal>, or <literal>suspend-then-hibernate</literal> - depending on the chosen action. + depending on the chosen action. An environment variable called <literal>SYSTEMD_SLEEP_ACTION</literal> + will be set and contain the sleep action that is processing. This is primarily helpful for + <literal>suspend-then-hibernate</literal> where the value of the variable will be <literal>suspend</literal>, <literal>hibernate</literal>, + or <literal>suspend-after-failed-hibernate</literal> in cases where hibernation has failed. Immediately after leaving system suspend and/or hibernation the same executables are run, but the first argument is now <literal>post</literal>. All executables in this directory are diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c index 39ab554290..90bc90e982 100644 --- a/src/sleep/sleep.c +++ b/src/sleep/sleep.c @@ -169,7 +169,7 @@ static int lock_all_homes(void) { return log_debug("Successfully requested locking of all home directories."); } -static int execute(char **modes, char **states) { +static int execute(char **modes, char **states, const char *action) { char *arguments[] = { NULL, (char*) "pre", @@ -211,6 +211,10 @@ static int execute(char **modes, char **states) { return log_error_errno(r, "Failed to write mode to /sys/power/disk: %m");; } + r = setenv("SYSTEMD_SLEEP_ACTION", action, 1); + if (r != 0) + log_warning_errno(errno, "Error setting SYSTEMD_SLEEP_ACTION=%s: %m", action); + (void) execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, arguments, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS); (void) lock_all_homes(); @@ -258,7 +262,7 @@ static int execute_s2h(const SleepConfig *sleep_config) { if (r < 0) return log_error_errno(errno, "Error setting hibernate timer: %m"); - r = execute(sleep_config->suspend_modes, sleep_config->suspend_states); + r = execute(sleep_config->suspend_modes, sleep_config->suspend_states, "suspend"); if (r < 0) return r; @@ -274,11 +278,11 @@ static int execute_s2h(const SleepConfig *sleep_config) { log_debug("Attempting to hibernate after waking from %s timer", format_timespan(buf, sizeof(buf), sleep_config->hibernate_delay_sec, USEC_PER_SEC)); - r = execute(sleep_config->hibernate_modes, sleep_config->hibernate_states); + r = execute(sleep_config->hibernate_modes, sleep_config->hibernate_states, "hibernate"); if (r < 0) { log_notice_errno(r, "Couldn't hibernate, will try to suspend again: %m"); - r = execute(sleep_config->suspend_modes, sleep_config->suspend_states); + r = execute(sleep_config->suspend_modes, sleep_config->suspend_states, "suspend-after-failed-hibernate"); if (r < 0) return log_error_errno(r, "Could neither hibernate nor suspend, giving up: %m"); } @@ -387,7 +391,7 @@ static int run(int argc, char *argv[]) { if (streq(arg_verb, "suspend-then-hibernate")) return execute_s2h(sleep_config); else - return execute(modes, states); + return execute(modes, states, arg_verb); } DEFINE_MAIN_FUNCTION(run); |