From 569f3ca2785b0020349fb98b4f9ff050902e3df9 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 8 Apr 2010 09:20:21 +0200 Subject: [PATCH] rtcwake: add --dry-run option Signed-off-by: Karel Zak --- sys-utils/rtcwake.8 | 8 ++++++-- sys-utils/rtcwake.c | 48 +++++++++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/sys-utils/rtcwake.8 b/sys-utils/rtcwake.8 index 999b6786..16c05719 100644 --- a/sys-utils/rtcwake.8 +++ b/sys-utils/rtcwake.8 @@ -21,7 +21,7 @@ rtcwake - enter a system sleep state until specified wakeup time .SH SYNOPSIS .B rtcwake -.RB [ \-hvVlua ] +.RB [ \-hvVluan ] .RB [ \-d .IR device ] .RB [ \-m @@ -52,11 +52,15 @@ Display a short help message that shows how to use the program. \fB-V\fP | \fB--version\fP Displays version information and exists. .TP +\fB-n\fP | \fB--dry-run\fP +This option does everything but actually setup alarm, suspend system or wait +for the alarm. +.TP \fB-a\fP | \fB--auto\fP Reads the clock mode (whether the hardware clock is set to UTC or local time) from \fI/etc/adjtime\fP. That's the location where the .BR hwclock (8) -stores that information. +stores that information. This is the default. .TP \fB-l\fP | \fB--local\fP Assumes that the hardware clock is set to local time, regardless of the diff --git a/sys-utils/rtcwake.c b/sys-utils/rtcwake.c index 344fed76..83a5d10e 100644 --- a/sys-utils/rtcwake.c +++ b/sys-utils/rtcwake.c @@ -62,10 +62,12 @@ enum ClockMode { }; static unsigned verbose; +static unsigned dryrun; enum ClockMode clock_mode = CM_AUTO; static struct option long_options[] = { {"auto", no_argument, 0, 'a'}, + {"dry-run", no_argument, 0, 'n'}, {"local", no_argument, 0, 'l'}, {"utc", no_argument, 0, 'u'}, {"verbose", no_argument, 0, 'v'}, @@ -82,6 +84,7 @@ static void usage(int retval) { printf(_("usage: %s [options]\n" " -d | --device select rtc device (rtc0|rtc1|...)\n" + " -n | --dry-run does everything, but suspend\n" " -l | --local RTC uses local timezone\n" " -m | --mode standby|mem|... sleep mode\n" " -s | --seconds seconds to sleep\n" @@ -214,8 +217,9 @@ static int setup_alarm(int fd, time_t *wakeup) wake.time.tm_isdst = -1; wake.enabled = 1; + /* First try the preferred RTC_WKALM_SET */ - if (ioctl(fd, RTC_WKALM_SET, &wake) < 0) { + if (!dryrun && ioctl(fd, RTC_WKALM_SET, &wake) < 0) { wake.enabled = 0; /* Fall back on the non-preferred way of setting wakeups; only * works for alarms < 24 hours from now */ @@ -246,8 +250,10 @@ static void suspend_system(const char *suspend) return; } - fprintf(f, "%s\n", suspend); - fflush(f); + if (!dryrun) { + fprintf(f, "%s\n", suspend); + fflush(f); + } /* this executes after wake from suspend */ fclose(f); @@ -308,7 +314,7 @@ int main(int argc, char **argv) progname = basename(argv[0]); - while ((t = getopt_long(argc, argv, "ahd:lm:s:t:uVv", + while ((t = getopt_long(argc, argv, "ahd:lm:ns:t:uVv", long_options, NULL)) != EOF) { switch (t) { case 'a': @@ -347,6 +353,10 @@ int main(int argc, char **argv) progname, optarg); usage(EXIT_FAILURE); + case 'n': + dryrun = 1; + break; + /* alarm time, seconds-to-sleep (relative) */ case 's': t = atoi(optarg); @@ -486,11 +496,13 @@ int main(int argc, char **argv) arg[i++] = "now"; arg[i] = NULL; - execv(arg[0], arg); + if (!dryrun) { + execv(arg[0], arg); - fprintf(stderr, _("%s: unable to execute %s: %s\n"), + fprintf(stderr, _("%s: unable to execute %s: %s\n"), progname, _PATH_SHUTDOWN, strerror(errno)); - rc = EXIT_FAILURE; + rc = EXIT_FAILURE; + } } else if (strcmp(suspend, "on") == 0) { unsigned long data; @@ -498,15 +510,17 @@ int main(int argc, char **argv) if (verbose) printf(_("suspend mode: on; reading rtc\n")); - do { - t = read(fd, &data, sizeof data); - if (t < 0) { - perror(_("rtc read")); - break; - } - if (verbose) - printf("... %s: %03lx\n", devname, data); - } while (!(data & RTC_AF)); + if (!dryrun) { + do { + t = read(fd, &data, sizeof data); + if (t < 0) { + perror(_("rtc read")); + break; + } + if (verbose) + printf("... %s: %03lx\n", devname, data); + } while (!(data & RTC_AF)); + } } else { if (verbose) @@ -515,7 +529,7 @@ int main(int argc, char **argv) suspend_system(suspend); } - if (ioctl(fd, RTC_AIE_OFF, 0) < 0) + if (!dryrun && ioctl(fd, RTC_AIE_OFF, 0) < 0) perror(_("disable rtc alarm interrupt")); close(fd); -- 2.39.5