summaryrefslogtreecommitdiff
path: root/src/sleep
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-04-06 18:58:55 +0200
committerSven Eden <yamakuzure@gmx.net>2018-08-24 16:47:08 +0200
commit9d1ff89d622fd4d8b3be210996cfa73943d81e03 (patch)
tree102f525976d4d49adff59adba7ca7c0d9e825a14 /src/sleep
parent5642683e0db55c457dcd03df1290334a238194e2 (diff)
tree-wide: drop license boilerplate
Files which are installed as-is (any .service and other unit files, .conf files, .policy files, etc), are left as is. My assumption is that SPDX identifiers are not yet that well known, so it's better to retain the extended header to avoid any doubt. I also kept any copyright lines. We can probably remove them, but it'd nice to obtain explicit acks from all involved authors before doing that.
Diffstat (limited to 'src/sleep')
-rw-r--r--src/sleep/sleep.c94
1 files changed, 8 insertions, 86 deletions
diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c
index 9b5aa6264..fe193a284 100644
--- a/src/sleep/sleep.c
+++ b/src/sleep/sleep.c
@@ -4,26 +4,11 @@
Copyright 2012 Lennart Poettering
Copyright 2013 Zbigniew Jędrzejewski-Szmek
- Copyright 2010-2017 Canonical
Copyright 2018 Dell Inc.
-
- systemd is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- systemd is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
//#include <errno.h>
//#include <getopt.h>
-//#include <linux/fiemap.h>
//#include <stdio.h>
#include "sd-messages.h"
@@ -45,67 +30,6 @@
static char* arg_verb = NULL;
-static int write_hibernate_location_info(void) {
- _cleanup_free_ char *device = NULL, *type = NULL;
- _cleanup_free_ struct fiemap *fiemap = NULL;
- char offset_str[DECIMAL_STR_MAX(uint64_t)];
- char device_str[DECIMAL_STR_MAX(uint64_t)];
- _cleanup_close_ int fd = -1;
- struct stat stb;
- uint64_t offset;
- int r;
-
- r = find_hibernate_location(&device, &type, NULL, NULL);
- if (r < 0)
- return log_debug_errno(r, "Unable to find hibernation location: %m");
-
- /* if it's a swap partition, we just write the disk to /sys/power/resume */
- if (streq(type, "partition"))
- return write_string_file("/sys/power/resume", device, 0);
- else if (!streq(type, "file"))
- return log_debug_errno(EINVAL, "Invalid hibernate type %s: %m",
- type);
-
- /* Only available in 4.17+ */
- if (access("/sys/power/resume_offset", F_OK) < 0) {
- if (errno == ENOENT)
- return 0;
- return log_debug_errno(errno, "/sys/power/resume_offset unavailable: %m");
- }
-
- r = access("/sys/power/resume_offset", W_OK);
- if (r < 0)
- return log_debug_errno(errno, "/sys/power/resume_offset not writeable: %m");
-
- fd = open(device, O_RDONLY | O_CLOEXEC | O_NONBLOCK);
- if (fd < 0)
- return log_debug_errno(errno, "Unable to open '%s': %m", device);
- r = fstat(fd, &stb);
- if (r < 0)
- return log_debug_errno(errno, "Unable to stat %s: %m", device);
- r = read_fiemap(fd, &fiemap);
- if (r < 0)
- return log_debug_errno(r, "Unable to read extent map for '%s': %m",
- device);
- if (fiemap->fm_mapped_extents == 0) {
- log_debug("No extents found in '%s'", device);
- return -EINVAL;
- }
- offset = fiemap->fm_extents[0].fe_physical / page_size();
- xsprintf(offset_str, "%" PRIu64, offset);
- r = write_string_file("/sys/power/resume_offset", offset_str, 0);
- if (r < 0)
- return log_debug_errno(r, "Failed to write offset '%s': %m",
- offset_str);
-
- xsprintf(device_str, "%lx", (unsigned long)stb.st_dev);
- r = write_string_file("/sys/power/resume", device_str, 0);
- if (r < 0)
- return log_debug_errno(r, "Failed to write device '%s': %m",
- device_str);
- return 0;
-}
-
static int write_mode(char **modes) {
int r = 0;
char **mode;
@@ -123,6 +47,9 @@ static int write_mode(char **modes) {
r = k;
}
+ if (r < 0)
+ log_error_errno(r, "Failed to write mode to /sys/power/disk: %m");
+
return r;
}
@@ -144,7 +71,7 @@ static int write_state(FILE **f, char **states) {
fclose(*f);
*f = fopen("/sys/power/state", "we");
if (!*f)
- return -errno;
+ return log_error_errno(errno, "Failed to open /sys/power/state: %m");
}
return r;
@@ -173,14 +100,9 @@ static int execute(char **modes, char **states) {
return log_error_errno(errno, "Failed to open /sys/power/state: %m");
/* Configure the hibernation mode */
- if (!strv_isempty(modes)) {
- r = write_hibernate_location_info();
- if (r < 0)
- return log_error_errno(r, "Failed to write hibernation disk offset: %m");
- r = write_mode(modes);
- if (r < 0)
- return log_error_errno(r, "Failed to write mode to /sys/power/disk: %m");;
- }
+ r = write_mode(modes);
+ if (r < 0)
+ return r;
execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, arguments);
@@ -192,7 +114,7 @@ static int execute(char **modes, char **states) {
r = write_state(&f, states);
if (r < 0)
- return log_error_errno(r, "Failed to write /sys/power/state: %m");
+ return r;
log_struct(LOG_INFO,
"MESSAGE_ID=" SD_MESSAGE_SLEEP_STOP_STR,