diff options
Diffstat (limited to 'sys-utils/rtcwake.c')
-rw-r--r-- | sys-utils/rtcwake.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/sys-utils/rtcwake.c b/sys-utils/rtcwake.c index d75a69f3c..1efc72098 100644 --- a/sys-utils/rtcwake.c +++ b/sys-utils/rtcwake.c @@ -36,6 +36,7 @@ #include <linux/rtc.h> #include "nls.h" +#include "pathnames.h" #include "usleep.h" /* constants from legacy PC/AT hardware */ @@ -296,6 +297,7 @@ int main(int argc, char **argv) unsigned seconds = 0; char *suspend = DEFAULT_MODE; + int rc = EXIT_SUCCESS; int t; int fd; time_t alarm = 0; @@ -335,6 +337,7 @@ int main(int argc, char **argv) || strcmp(optarg, "disk") == 0 || strcmp(optarg, "on") == 0 || strcmp(optarg, "no") == 0 + || strcmp(optarg, "off") == 0 ) { suspend = strdup(optarg); break; @@ -429,7 +432,11 @@ int main(int argc, char **argv) } /* this RTC must exist and (if we'll sleep) be wakeup-enabled */ +#ifdef O_CLOEXEC + fd = open(devname, O_RDONLY | O_CLOEXEC); +#else fd = open(devname, O_RDONLY); +#endif if (fd < 0) { perror(devname); exit(EXIT_FAILURE); @@ -451,6 +458,7 @@ int main(int argc, char **argv) alarm += sys_time - rtc_time; } else alarm = rtc_time + seconds + 1; + if (setup_alarm(fd, &alarm) < 0) exit(EXIT_FAILURE); @@ -465,6 +473,20 @@ int main(int argc, char **argv) else if (strcmp(suspend, "on") != 0) { sync(); suspend_system(suspend); + } else if (strcmp(suspend, "off") == 0) { + char *arg[4]; + int i = 0; + + arg[i++] = _PATH_SHUTDOWN; + arg[i++] = "-P"; + arg[i++] = "now"; + arg[i] = NULL; + + execv(arg[0], arg); + + fprintf(stderr, _("%s: unable to execute %s: %s\n"), + progname, _PATH_SHUTDOWN, strerror(errno)); + rc = EXIT_FAILURE; } else { unsigned long data; @@ -484,5 +506,5 @@ int main(int argc, char **argv) close(fd); - exit(EXIT_SUCCESS); + return rc; } |