On Sat, Aug 23, 2014 at 2:47 PM, Ivan Shapovalov <intelfx...@gmail.com> wrote: > This can be used to initiate a resume from hibernation by path to a swap > device containing the hibernation image. > > The respective templated unit is also added. It is instantiated using > path to the desired resume device. > --- > Makefile-man.am | 9 +++++ > Makefile.am | 28 ++++++++++++-- > man/systemd-res...@.service.xml | 81 +++++++++++++++++++++++++++++++++++++++ > src/resume/Makefile | 1 + > src/resume/resume.c | 82 > ++++++++++++++++++++++++++++++++++++++++ > units/systemd-res...@.service.in | 23 +++++++++++ > 6 files changed, 220 insertions(+), 4 deletions(-) > create mode 100644 man/systemd-res...@.service.xml > create mode 120000 src/resume/Makefile > create mode 100644 src/resume/resume.c > create mode 100644 units/systemd-res...@.service.in > > diff --git a/Makefile-man.am b/Makefile-man.am > index 5c289dd..00daae2 100644 > --- a/Makefile-man.am > +++ b/Makefile-man.am > @@ -76,6 +76,8 @@ MANPAGES += \ > man/systemd-nspawn.1 \ > man/systemd-path.1 \ > man/systemd-remount-fs.service.8 \ > + man/systemd-resume-generator.8 \ > + man/systemd-resume@.service.8 \ > man/systemd-run.1 \ > man/systemd-shutdownd.service.8 \ > man/systemd-sleep.conf.5 \ > @@ -206,6 +208,7 @@ MANPAGES_ALIAS += \ > man/systemd-poweroff.service.8 \ > man/systemd-reboot.service.8 \ > man/systemd-remount-fs.8 \ > + man/systemd-resume.8 \ > man/systemd-shutdown.8 \ > man/systemd-shutdownd.8 \ > man/systemd-shutdownd.socket.8 \ > @@ -311,6 +314,7 @@ man/systemd-kexec.service.8: man/systemd-halt.service.8 > man/systemd-poweroff.service.8: man/systemd-halt.service.8 > man/systemd-reboot.service.8: man/systemd-halt.service.8 > man/systemd-remount-fs.8: man/systemd-remount-fs.service.8 > +man/systemd-resume.8: man/systemd-resume@.service.8 > man/systemd-shutdown.8: man/systemd-halt.service.8 > man/systemd-shutdownd.8: man/systemd-shutdownd.service.8 > man/systemd-shutdownd.socket.8: man/systemd-shutdownd.service.8 > @@ -592,6 +596,9 @@ man/systemd-reboot.service.html: > man/systemd-halt.service.html > man/systemd-remount-fs.html: man/systemd-remount-fs.service.html > $(html-alias) > > +man/systemd-resume.html: man/systemd-res...@.service.html > + $(html-alias) > + > man/systemd-shutdown.html: man/systemd-halt.service.html > $(html-alias) > > @@ -1626,6 +1633,8 @@ EXTRA_DIST += \ > man/systemd-readahead-replay.service.xml \ > man/systemd-remount-fs.service.xml \ > man/systemd-resolved.service.xml \ > + man/systemd-resume-generator.xml \ > + man/systemd-res...@.service.xml \ > man/systemd-rfk...@.service.xml \ > man/systemd-run.xml \ > man/systemd-shutdownd.service.xml \ > diff --git a/Makefile.am b/Makefile.am > index e238cde..820d082 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -371,13 +371,15 @@ rootlibexec_PROGRAMS = \ > systemd-sleep \ > systemd-bus-proxyd \ > systemd-socket-proxyd \ > - systemd-update-done > + systemd-update-done \ > + systemd-resume > > systemgenerator_PROGRAMS = \ > systemd-getty-generator \ > systemd-fstab-generator \ > systemd-system-update-generator \ > - systemd-debug-generator > + systemd-debug-generator \ > + systemd-resume-generator > > dist_bashcompletion_DATA = \ > shell-completion/bash/busctl \ > @@ -509,7 +511,8 @@ nodist_systemunit_DATA = \ > units/initrd-udevadm-cleanup-db.service \ > units/initrd-switch-root.service \ > units/systemd-nspawn@.service \ > - units/systemd-update-done.service > + units/systemd-update-done.service \ > + units/systemd-resume@.service > > dist_userunit_DATA = \ > units/user/basic.target \ > @@ -556,7 +559,8 @@ EXTRA_DIST += \ > units/initrd-udevadm-cleanup-db.service.in \ > units/initrd-switch-root.service.in \ > units/systemd-nsp...@.service.in \ > - units/systemd-update-done.service.in > + units/systemd-update-done.service.in \ > + units/systemd-res...@.service.in > > CLEANFILES += \ > units/console-shell.service.m4 \ > @@ -1930,6 +1934,14 @@ systemd_delta_LDADD = \ > libsystemd-shared.la > > # > ------------------------------------------------------------------------------ > +systemd_resume_SOURCES = \ > + src/resume/resume.c > + > +systemd_resume_LDADD = \ > + libsystemd-internal.la \ > + libsystemd-shared.la > + > +# > ------------------------------------------------------------------------------ > systemd_getty_generator_SOURCES = \ > src/getty-generator/getty-generator.c > > @@ -1962,6 +1974,14 @@ systemd_system_update_generator_LDADD = \ > libsystemd-label.la \ > libsystemd-shared.la > > +# > ------------------------------------------------------------------------------ > +systemd_resume_generator_SOURCES = \ > + src/resume-generator/resume-generator.c > + > +systemd_resume_generator_LDADD = \ > + libsystemd-label.la \ > + libsystemd-shared.la > + > if ENABLE_EFI > # > ------------------------------------------------------------------------------ > systemgenerator_PROGRAMS += \ > diff --git a/man/systemd-res...@.service.xml b/man/systemd-res...@.service.xml > new file mode 100644 > index 0000000..b7d28fb > --- /dev/null > +++ b/man/systemd-res...@.service.xml > @@ -0,0 +1,81 @@ > +<?xml version="1.0"?> > +<!--*-nxml-*--> > +<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" > "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> > +<!-- > + This file is part of systemd. > + > + Copyright 2014 Ivan Shapovalov > + > + 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/>. > +--> > +<refentry id="systemd-resume@.service"> > + > + <refentryinfo> > + <title>systemd-resume@.service</title> > + <productname>systemd</productname> > + > + <authorgroup> > + <author> > + <contrib>Developer</contrib> > + <firstname>Ivan</firstname> > + <surname>Shapovalov</surname> > + <email>intelfx...@gmail.com</email> > + </author> > + </authorgroup> > + </refentryinfo> > + > + <refmeta> > + <refentrytitle>systemd-resume@.service</refentrytitle> > + <manvolnum>8</manvolnum> > + </refmeta> > + > + <refnamediv> > + <refname>systemd-resume@.service</refname> > + <refname>systemd-resume</refname> > + <refpurpose>Resume from hibernation</refpurpose> > + </refnamediv> > + > + <refsynopsisdiv> > + <para><filename>systemd-resume@.service</filename></para> > + > <para><filename>/usr/lib/systemd/systemd-resume</filename></para> > + </refsynopsisdiv> > + > + <refsect1> > + <title>Description</title> > + > + <para><filename>systemd-resume@.service</filename> is a > + service that initiates hibernation resume from a device > + containing the resume image. It is instantiated for each > + device that is configured for resuming from.</para> > + > + <para><filename>systemd-resume</filename> only supports > + the in-kernel hibernation implementation, known as swsusp. > + Internally, it works by writing the major:minor of specified > + device node to <filename>/sys/power/resume</filename>.</para> > + > + <para>Failing to initiate a resume is not an error condition. > + It may mean that there was no resume image (e. g. if the > + system has been simply powered off and not hibernated). In > + such case, the boot is ordinarily continued.</para> > + </refsect1> > + > + <refsect1> > + <title>See Also</title> > + <para> > + > <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>, > + > <citerefentry><refentrytitle>systemd-resume-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry> > + </para> > + </refsect1> > + > +</refentry> > diff --git a/src/resume/Makefile b/src/resume/Makefile > new file mode 120000 > index 0000000..d0b0e8e > --- /dev/null > +++ b/src/resume/Makefile > @@ -0,0 +1 @@ > +../Makefile > \ No newline at end of file > diff --git a/src/resume/resume.c b/src/resume/resume.c > new file mode 100644 > index 0000000..9bda8ff > --- /dev/null > +++ b/src/resume/resume.c > @@ -0,0 +1,82 @@ > +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ > + > +/*** > + This file is part of systemd. > + > + Copyright 2014 Ivan Shapovalov > + > + 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 <stdio.h> > +#include <errno.h> > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <unistd.h> > + > +#include "log.h" > +#include "util.h" > +#include "fileio.h" > + > +int main(int argc, char *argv[]) { > + struct stat st; > + const char *device, *major_minor;
major_minor should not be const and you could use the cleanup attribute to free it automatically. The program will exit soon after but still. Something like: _cleanup_free_ char *major_minor = NULL; > + int r; > + > + if (argc != 2) { > + log_error("This program expects one argument."); > + return EXIT_FAILURE; > + } > + > + log_set_target(LOG_TARGET_AUTO); > + log_parse_environment(); > + log_open(); > + > + umask(0022); > + > + device = argv[1]; > + > + if (stat(device, &st) < 0) { > + log_error("Failed to stat '%s': %m", device); > + return EXIT_FAILURE; > + } > + > + if (!S_ISBLK(st.st_mode)) { > + log_error("Resume device '%s' is not a block device.", > device); > + return EXIT_FAILURE; > + } > + > + if (asprintf(&major_minor, "%d:%d", major(st.st_rdev), > minor(st.st_rdev)) < 0) { > + log_oom(); > + return EXIT_FAILURE; > + } > + > + r = write_string_file("/sys/power/resume", major_minor); > + if (r < 0) { > + log_error("Failed to write '%s' to /sys/power/resume: %s", > + major_minor, strerror(-r)); > + return EXIT_FAILURE; > + } > + > + /* > + * The write above shall not return. > + * > + * However, failed resume is a normal condition (may mean that there > is > + * no hibernation image). > + */ > + > + log_notice("Failed to resume from device '%s' (%d:%d).", > + device, major(st.st_rdev), minor(st.st_rdev)); > + return EXIT_SUCCESS; > +} > diff --git a/units/systemd-res...@.service.in > b/units/systemd-res...@.service.in > new file mode 100644 > index 0000000..f760f16 > --- /dev/null > +++ b/units/systemd-res...@.service.in > @@ -0,0 +1,23 @@ > +# This file is part of systemd. > +# > +# 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. > + > +[Unit] > +Description=Resume from hibernation using device %f > +Documentation=man:systemd-resume@.service(8) > +DefaultDependencies=no > +Conflicts=shutdown.target > +BindsTo=%i.device > +Wants=local-fs-pre.target > +After=%i.device systemd-udevd.service > +Before=local-fs-pre.target systemd-remount-fs.service > systemd-fsck-root.service usr.mount shutdown.target > +ConditionPathIsReadWrite=|!/ > +ConditionPathExists=|/etc/initrd-release > + > +[Service] > +Type=oneshot > +RemainAfterExit=yes > +ExecStart=@rootlibexecdir@/systemd-resume %f > -- > 2.1.0 > > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel