diff options
author | Rob Landley <rob@landley.net> | 2020-04-16 02:57:07 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2020-04-16 02:57:07 -0500 |
commit | 7e97f0d01e08982bdaa42b3bcd9f4deb3c03a2c1 (patch) | |
tree | 36ef5e2fd2bf1bc55d0c0ccd83f38867a58a9fe1 /toys/pending | |
parent | 130d36604b3ff9fca70a72062bfd21438d3d4c5d (diff) | |
download | toybox-7e97f0d01e08982bdaa42b3bcd9f4deb3c03a2c1.tar.gz |
Promote rtcwake.
Diffstat (limited to 'toys/pending')
-rw-r--r-- | toys/pending/rtcwake.c | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/toys/pending/rtcwake.c b/toys/pending/rtcwake.c deleted file mode 100644 index 0b034594..00000000 --- a/toys/pending/rtcwake.c +++ /dev/null @@ -1,118 +0,0 @@ -/* rtcwake.c - enter sleep state until given time. - * - * Copyright 2020 The Android Open Source Project - -USE_RTCWAKE(NEWTOY(rtcwake, "(list-modes);(auto)a(device)d:(local)l(mode)m:(seconds)s#(time)t#(utc)u(verbose)v[!alu]", TOYFLAG_USR|TOYFLAG_BIN)) - -config RTCWAKE - bool "rtcwake" - default n - help - usage: rtcwake [-aluv] [-d FILE] [-m MODE] [-s SECS] [-t UNIX] - - Enter the given sleep state until the given time. - - -a RTC uses time specified in /etc/adjtime - -d FILE Device to use (default /dev/rtc) - -l RTC uses local time - -m Mode (--list-modes to see those supported by your kernel): - standby S1: default mem S3: suspend to RAM - disk S4: suspend to disk off S5: power off - disable Cancel current alarm freeze stop processes/processors - no just set wakeup time on just poll RTC for alarm - show just show current alarm - -s SECS Wake SECS seconds from now - -t UNIX Wake UNIX seconds from epoch - -u RTC uses UTC - -v Verbose -*/ - -#define FOR_rtcwake -#include "toys.h" -#include <linux/rtc.h> - -GLOBALS( - long t, s; - char *m, *d; -) - -void rtcwake_main(void) -{ - struct rtc_wkalrm *alarm = (void *)(toybuf+2048); - struct tm rtc_tm; - time_t now, rtc_now, then; - int fd, utc; - - if (FLAG(list_modes)) { - printf("off no on disable show %s", - xreadfile("/sys/power/state", toybuf, 2048)); - return; - } - - // util-linux defaults to "suspend", even though I don't have anything that - // supports that (testing everything from a ~2010 laptop to a 2019 desktop). - if (!TT.m) TT.m = "suspend"; - - if (FLAG(u)) utc = 1; - else if (FLAG(l)) utc = 0; - else utc = !!strstr(xreadfile("/etc/adjtime", toybuf, 2048), "UTC"); - if (FLAG(v)) xprintf("RTC time: %s\n", utc ? "UTC" : "local"); - - if (!TT.d) TT.d = "/dev/rtc0"; - if (FLAG(v)) xprintf("Device: %s\n", TT.d); - fd = xopen(TT.d, O_RDWR); - - now = time(0); - xioctl(fd, RTC_RD_TIME, &rtc_tm); - rtc_now = xmktime(&rtc_tm, utc); - if (FLAG(v)) { - xprintf("System time:\t%lld / %s", (long long)now, ctime(&now)); - xprintf("RTC time:\t%lld / %s", (long long)rtc_now, ctime(&rtc_now)); - } - - if (!strcmp(TT.m, "show")) { // Don't suspend, just show current alarm. - xioctl(fd, RTC_WKALM_RD, alarm); - if (!alarm->enabled) xputs("alarm: off"); - else { - if ((then = mktime((void *)&alarm->time)) < 0) perror_exit("mktime"); - xprintf("alarm: on %s", ctime(&then)); - } - return; - } else if (!strcmp(TT.m, "disable")) { // Cancel current alarm. - xioctl(fd, RTC_WKALM_RD, alarm); - alarm->enabled = 0; - xioctl(fd, RTC_WKALM_SET, alarm); - return; - } - - if (FLAG(s)) then = rtc_now + TT.s + 1; // strace shows util-linux adds 1. - else if (FLAG(t)) { - then = TT.t + (rtc_now - now); - if (then<=rtc_now) error_exit("rtc %lld >= %ld", (long long)rtc_now, TT.t); - } else help_exit("-m %s needs -s or -t", TT.m); - if (FLAG(v)) xprintf("Wake time:\t%lld / %s", (long long)then, ctime(&then)); - - if (!(utc ? gmtime_r : localtime_r)(&then, (void *)&alarm->time)) - error_exit("%s failed", utc ? "gmtime_r" : "localtime_r"); - - alarm->enabled = 1; - xioctl(fd, RTC_WKALM_SET, alarm); - sync(); - - xprintf("wakeup using \"%s\" from %s at %s", TT.m, TT.d, ctime(&then)); - msleep(10); - - if (!strcmp(TT.m, "no")); // Don't suspend, just set wakeup time. - else if (!strcmp(TT.m, "on")) { // Don't suspend, poll RTC for alarm. - unsigned long data = 0; - - if (FLAG(v)) xputs("Reading RTC..."); - while (!(data & RTC_AF)) { - if (read(fd, &data, sizeof(data)) != sizeof(data)) perror_exit("read"); - if (FLAG(v)) xprintf("... %s: %lx\n", TT.d, data); - } - } else if (!strcmp(TT.m, "off")) xexec((char *[]){"poweroff", 0}); - // Everything else lands here for one final step. The write will fail with - // EINVAL if the mode is not supported. - else xwrite(xopen("/sys/power/state", O_WRONLY), TT.m, strlen(TT.m)); -} |