From: Frederic Crozat Date: Tue, 19 Feb 2013 11:20:31 +0100 Subject: Forward suspend / hibernate calls to pm-utils forward suspend/hibernation calls to pm-utils, if installed (bnc#790157) --- src/sleep/sleep.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) Index: systemd/src/sleep/sleep.c =================================================================== --- systemd.orig/src/sleep/sleep.c +++ systemd/src/sleep/sleep.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "sd-id128.h" #include "sd-messages.h" @@ -36,6 +37,8 @@ #include "def.h" static char* arg_verb = NULL; +static bool delegate_to_pmutils = false; +static const char *pmtools; static int write_mode(char **modes) { int r = 0; @@ -53,10 +56,6 @@ static int write_mode(char **modes) { if (r == 0) r = k; } - - if (r < 0) - log_error_errno(r, "Failed to write mode to /sys/power/disk: %m"); - return r; } @@ -97,6 +96,8 @@ static int execute(char **modes, char ** int r; _cleanup_fclose_ FILE *f = NULL; + if (!delegate_to_pmutils) { + /* This file is opened first, so that if we hit an error, * we can abort before modifying any state. */ f = fopen("/sys/power/state", "we"); @@ -107,6 +108,7 @@ static int execute(char **modes, char ** r = write_mode(modes); if (r < 0) return r; + } execute_directories(dirs, DEFAULT_TIMEOUT_USEC, arguments); @@ -115,8 +117,10 @@ static int execute(char **modes, char ** LOG_MESSAGE("Suspending system..."), "SLEEP=%s", arg_verb, NULL); - + if (!delegate_to_pmutils) r = write_state(&f, states); + else + r = -system(pmtools); if (r < 0) return r; @@ -156,6 +160,7 @@ static int parse_argv(int argc, char *ar }; int c; + struct stat buf; assert(argc >= 0); assert(argv); @@ -193,6 +198,18 @@ static int parse_argv(int argc, char *ar return -EINVAL; } + if (streq(arg_verb, "suspend")) { + pmtools = "/usr/sbin/pm-suspend"; + } + else if (streq(arg_verb, "hibernate") || streq(arg_verb, "hybrid-sleep")) { + if (streq(arg_verb, "hibernate")) + pmtools = "/usr/sbin/pm-hibernate"; + else + pmtools = "/usr/sbin/pm-suspend-hybrid"; + } + + delegate_to_pmutils = (stat(pmtools, &buf) >= 0 && S_ISREG(buf.st_mode) && (buf.st_mode & 0111)); + return 1 /* work to do */; }