[patch linux-util-ng 2.13.0.1] misc rtcwake cleanups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Cleanups for rtcwake in util-linux-ng-2.13.0.1:

  - Minor doc updates:  highlight the framebuffer problem,
    give correct history of this code
  - Improve debug output
  - Fix some linelength bugs

Note that this code predated the sysfs "wakealarm" mechanism, and
works around several now-fixed bugs in the kernel RTC framework.

Nowadays it would make sense to make this program use only the sysfs
interface to the RTC, using "since_epoch" instead of RTC_RD_TIME and
"wakealarm" instead of the four other ioctls.  That could simplify
the mess involved in timezone handling.

Signed-off-by: David Brownell <dbrownell@xxxxxxxxxxxxxxxxxxxxx>
---
 sys-utils/rtcwake.8 |   11 ++++++++---
 sys-utils/rtcwake.c |   48 ++++++++++++++++++++++++++++--------------------
 2 files changed, 36 insertions(+), 23 deletions(-)

--- util-linux-ng-2.13.0.1.orig/sys-utils/rtcwake.8	2007-11-30 13:33:26.000000000 -0800
+++ util-linux-ng-2.13.0.1/sys-utils/rtcwake.8	2007-11-30 13:33:33.000000000 -0800
@@ -76,15 +76,20 @@ is the time in seconds since 1970-01-01,
 Use standby state \fImode\fP. Valid values are \fIstandby\fP,
 \fImem\fP, \fIdisk\fP and \fIon\fP (no suspend). The default is
 \fIstandby\fP.
+.SH NOTES
+Some PC systems can't currently exit sleep states such as \fImem\fP
+using only the kernel code accessed by this driver.
+They need help from userspace code to make the framebuffer work again.
 .SH HISTORY
-The program first appeared as kernel commit message for Linux 2.6 in the GIT
+The program was posted several times on LKML and other lists
+before appearing in kernel commit message for Linux 2.6 in the GIT
 commit 87ac84f42a7a580d0dd72ae31d6a5eb4bfe04c6d.
 .SH AVAILABILITY
 The rtcwake command is part of the util-linux-ng package and is available from
 ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/.
 .SH AUTHOR
-The program was written by David Brownell <david-b@xxxxxxxxxxx> and improved by
-Bernhard Walle <bwalle@xxxxxxx>.
+The program was written by David Brownell <dbrownell@xxxxxxxxxxxxxxxxxxxxx>
+and improved by Bernhard Walle <bwalle@xxxxxxx>.
 .SH COPYRIGHT
 This is free software.  You may redistribute copies of it  under  the  terms
 of  the  GNU General  Public  License <http://www.gnu.org/licenses/gpl.html>.
--- util-linux-ng-2.13.0.1.orig/sys-utils/rtcwake.c	2007-11-30 13:33:26.000000000 -0800
+++ util-linux-ng-2.13.0.1/sys-utils/rtcwake.c	2007-11-30 13:33:33.000000000 -0800
@@ -16,6 +16,7 @@
  * The best way to set the system's RTC is so that it holds the current
  * time in UTC.  Use the "-l" flag to tell this program that the system
  * RTC uses a local timezone instead (maybe you dual-boot MS-Windows).
+ * That flag should not be needed on systems with adjtime support.
  */
 
 #include <stdio.h>
@@ -163,14 +164,18 @@ static int get_basetimes(int fd)
 	}
 
 	if (verbose) {
-		if (clock_mode == CM_LOCAL) {
-			printf("\ttzone   = %ld\n", timezone);
-			printf("\ttzname  = %s\n", tzname[daylight]);
-			gmtime_r(&rtc_time, &tm);
-		}
-		printf("\tsystime = %ld, (UTC) %s\n",
+		/* Unless the system uses UTC, either delta or tzone
+		 * reflects a seconds offset from UTC.  The value can
+		 * help sort out problems like bugs in your C library.
+		 */
+		printf("\tdelta   = %ld\n", sys_time - rtc_time);
+		printf("\ttzone   = %ld\n", timezone);
+
+		printf("\ttzname  = %s\n", tzname[daylight]);
+		gmtime_r(&rtc_time, &tm);
+		printf("\tsystime = %ld, (UTC) %s",
 				(long) sys_time, asctime(gmtime(&sys_time)));
-		printf("\trtctime = %ld, (UTC) %s\n",
+		printf("\trtctime = %ld, (UTC) %s",
 				(long) rtc_time, asctime(&tm));
 	}
 
@@ -190,11 +195,14 @@ static int setup_alarm(int fd, time_t *w
 	wake.time.tm_mday = tm->tm_mday;
 	wake.time.tm_mon = tm->tm_mon;
 	wake.time.tm_year = tm->tm_year;
-	wake.time.tm_wday = tm->tm_wday;
-	wake.time.tm_yday = tm->tm_yday;
-	wake.time.tm_isdst = tm->tm_isdst;
+	/* wday, yday, and isdst fields are unused by Linux */
+	wake.time.tm_wday = -1;
+	wake.time.tm_yday = -1;
+	wake.time.tm_isdst = -1;
 
-	/* many rtc alarms only support up to 24 hours from 'now' ... */
+	/* 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"));
@@ -204,8 +212,6 @@ static int setup_alarm(int fd, time_t *w
 			perror(_("enable rtc alarm"));
 			return 0;
 		}
-
-		/* ... so use the "more than 24 hours" request only if we must */
 	} else {
 		/* avoid an extra AIE_ON call */
 		wake.enabled = 1;
@@ -321,8 +327,9 @@ int main(int argc, char **argv)
 				suspend = strdup(optarg);
 				break;
 			}
-			fprintf(stderr, _("%s: unrecognized suspend state '%s'\n"),
-					progname, optarg);
+			fprintf(stderr,
+				_("%s: unrecognized suspend state '%s'\n"),
+				progname, optarg);
 			usage(EXIT_FAILURE);
 
 			/* alarm time, seconds-to-sleep (relative) */
@@ -376,10 +383,10 @@ int main(int argc, char **argv)
 			printf(_("%s: assuming RTC uses UTC ...\n"), progname);
 			clock_mode = CM_UTC;
 		}
-		if (verbose)
-			printf(_("Using %s time\n"),
-					clock_mode == CM_UTC ? "UTC" : _("local"));
 	}
+	if (verbose)
+		printf(_("Using %s time\n"),
+			clock_mode == CM_UTC ? "UTC" : _("local"));
 
 	if (!alarm && !seconds) {
 		fprintf(stderr, _("%s: must provide wake time\n"), progname);
@@ -423,8 +430,9 @@ int main(int argc, char **argv)
 				alarm, sys_time, rtc_time, seconds);
 	if (alarm) {
 		if (alarm < sys_time) {
-			fprintf(stderr, _("%s: time doesn't go backward to %s\n"),
-					progname, ctime(&alarm));
+			fprintf(stderr,
+				_("%s: time doesn't go backward to %s\n"),
+				progname, ctime(&alarm));
 			exit(EXIT_FAILURE);
 		}
 		alarm += sys_time - rtc_time;
-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux