diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-04-11 02:04:46 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-04-11 02:04:46 +0200 |
commit | 04ebb5956719e3e301e1c08443c496ad97399544 (patch) | |
tree | ef0bf3f6a37d48e688c2aff6cd3c77c9c7a7dfad /src/systemd/sd-shutdown.h | |
parent | 7e59bfcb18bcfdb82fa1f197c935bb15a22aa582 (diff) |
shutdownd: rework interface, allow subscribing to scheduled shutdowns
This extends the shutdownd interface to expose schedule shutdown
information in /run/systemd/shutdown/schedule.
This also cleans up the shutdownd protocol and documents it in a header
file sd-shutdown.h.
This is supposed to be used by client code that wants to control and
monitor scheduled shutdown.
Diffstat (limited to 'src/systemd/sd-shutdown.h')
-rw-r--r-- | src/systemd/sd-shutdown.h | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/systemd/sd-shutdown.h b/src/systemd/sd-shutdown.h new file mode 100644 index 000000000..29fcf3417 --- /dev/null +++ b/src/systemd/sd-shutdown.h @@ -0,0 +1,108 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#ifndef foosdshutdownhfoo +#define foosdshutdownhfoo + +/*** + This file is part of systemd. + + Copyright 2010 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +/* Interface for scheduling and cancelling timed shutdowns. */ + +#include <inttypes.h> + +typedef enum sd_shutdown_mode { + SD_SHUTDOWN_NONE = 0, + SD_SHUTDOWN_REBOOT = 'r', + SD_SHUTDOWN_POWEROFF = 'P', + SD_SHUTDOWN_HALT = 'H', + SD_SHUTDOWN_KEXEC = 'K' +} sd_shutdown_mode_t; + +/* Calculate the size of the message as "offsetof(struct + * sd_shutdown_command, wall_message) + + * strlen(command.wall_message)" */ +__attribute__((packed)) struct sd_shutdown_command { + /* Microseconds after the epoch 1970 UTC */ + uint64_t usec; + + /* H, P, r, i.e. the switches usually passed to + * /usr/bin/shutdown to select whether to halt, power-off or + * reboot the machine */ + sd_shutdown_mode_t mode:8; + + /* If non-zero, don't actually shut down, just pretend */ + unsigned dry_run:1; + + /* If non-zero, send our wall message */ + unsigned warn_wall:1; + + /* The wall message to send around. Leave empty for the + * default wall message */ + char wall_message[]; +}; + +/* The scheme is very simple: + * + * To schedule a shutdown, simply fill in and send a single + * AF_UNIX/SOCK_DGRAM datagram with the structure above suffixed with + * the wall message to the socket /run/systemd/shutdownd (leave an + * empty wall message for the default shutdown message). To calculate + * the size of the message use "offsetof(struct sd_shutdown_command, + * wall_message) + strlen(command.wall_message)". + * + * To cancel a shutdown, do the same, but send an fully zeroed out + * structure. + * + * To be notified about scheduled shutdowns, create an inotify watch + * on /run/shutdown/. Whenever a file called "scheduled" appears a + * shutdown is scheduled. If it is removed it is canceled. It is + * replaced the scheduled shutdown has been changed. The file contains + * a simple environment-like block, that contains information about + * the scheduled shutdown: + * + * USEC= + * encodes the time for the shutdown in usecs since the epoch UTC, + * formatted as numeric string. + * + * WARN_WALL= + * is 1 if a wall message shall be sent + * + * DRY_RUN= + * is 1 if a dry run shutdown is scheduled + * + * MODE= + * is the shutdown mode, one of "poweroff", "reboot", "halt", "kexec" + * + * WALL_MESSAGE= + * is the wall message to use, with all special characters escape in C style. + * + * Note that some fields might be missing if they do not apply. + * + * Note that the file is first written to a temporary file and then + * renamed, in order to provide atomic properties for readers: if the + * file exists under the name "scheduled" it is guaranteed to be fully + * written. A reader should ignore all files in that directory by any + * other name. + * + * Scheduled shutdowns are only accepted from privileged processes, + * but the directory may be watched and the file in it read by + * anybody. + */ + +#endif |