]> err.no Git - util-linux/commitdiff
rtcwake: prefer RTC_WKALM_SET over RTC_ALM_SET
authorGabriel Burt <gburt@novell.com>
Tue, 5 Aug 2008 05:18:52 +0000 (00:18 -0500)
committerKarel Zak <kzak@redhat.com>
Mon, 11 Aug 2008 10:01:40 +0000 (12:01 +0200)
rtcwake: Prefer RTC_WKALM_SET over RTC_ALM_SET, fixing bug with not
waking up with new RTCs.  Also, return error if unable to set the alarm.

Signed-off-by: Gabriel Burt <gburt@novell.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
sys-utils/rtcwake.c

index d1e78f60f740c9855983b8b10169a0938aa4340c..57043983d788c4524966f4f9e4fc673ecd7697c7 100644 (file)
@@ -211,25 +211,24 @@ static int setup_alarm(int fd, time_t *wakeup)
        wake.time.tm_yday = -1;
        wake.time.tm_isdst = -1;
 
-       /* many rtc alarms only support up to 24 hours from 'now',
-        * so use the "more than 24 hours" request only if we must
-        */
-       if ((rtc_time + (24 * 60 * 60)) > *wakeup) {
-               if (ioctl(fd, RTC_ALM_SET, &wake.time) < 0) {
-                       perror(_("set rtc alarm"));
-                       return 0;
-               }
-               if (ioctl(fd, RTC_AIE_ON, 0) < 0) {
-                       perror(_("enable rtc alarm"));
-                       return 0;
-               }
-       } else {
-               /* avoid an extra AIE_ON call */
-               wake.enabled = 1;
-
-               if (ioctl(fd, RTC_WKALM_SET, &wake) < 0) {
+       wake.enabled = 1;
+       /* First try the preferred RTC_WKALM_SET */
+       if (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 */
+               if ((rtc_time + (24 * 60 * 60)) > *wakeup) {
+                       if (ioctl(fd, RTC_ALM_SET, &wake.time) < 0) {
+                               perror(_("set rtc alarm"));
+                               return -1;
+                       }
+                       if (ioctl(fd, RTC_AIE_ON, 0) < 0) {
+                               perror(_("enable rtc alarm"));
+                               return -1;
+                       }
+               } else {
                        perror(_("set rtc wake alarm"));
-                       return 0;
+                       return -1;
                }
        }