[git commit] rtcwake: fix incorrect (reversed) rtc/sys adjuestment; code shrink

Denys Vlasenko vda.linux at googlemail.com
Fri May 2 10:46:15 UTC 2014


commit: http://git.busybox.net/busybox/commit/?id=a4476eb6543505f8685b59b138cb868b32347d71
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
rtcwake_main                                         482     462     -20

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 util-linux/rtcwake.c |   55 +++++++++++++++++++++++++++++--------------------
 1 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/util-linux/rtcwake.c b/util-linux/rtcwake.c
index 735a298..33cdbfa 100644
--- a/util-linux/rtcwake.c
+++ b/util-linux/rtcwake.c
@@ -51,7 +51,6 @@
 
 #define SYS_RTC_PATH   "/sys/class/rtc/%s/device/power/wakeup"
 #define SYS_POWER_PATH "/sys/power/state"
-#define DEFAULT_MODE   "standby"
 
 static NOINLINE bool may_wakeup(const char *rtcname)
 {
@@ -122,17 +121,16 @@ static NOINLINE void setup_alarm(int fd, time_t *wakeup, time_t rtc_time)
 int rtcwake_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int rtcwake_main(int argc UNUSED_PARAM, char **argv)
 {
-	time_t rtc_time;
-
 	unsigned opt;
 	const char *rtcname = NULL;
-	const char *suspend;
+	const char *suspend = "standby";
 	const char *opt_seconds;
 	const char *opt_time;
 
+	time_t rtc_time;
 	time_t sys_time;
-	time_t alarm_time = 0;
-	unsigned seconds = 0;
+	time_t alarm_time = alarm_time;
+	unsigned seconds = seconds; /* for compiler */
 	int utc = -1;
 	int fd;
 
@@ -148,6 +146,8 @@ int rtcwake_main(int argc UNUSED_PARAM, char **argv)
 		;
 	applet_long_options = rtcwake_longopts;
 #endif
+	/* Must have -s or -t, exclusive */
+	opt_complementary = "s:t:s--t:t--s";
 	opt = getopt32(argv, "alud:m:s:t:", &rtcname, &suspend, &opt_seconds, &opt_time);
 
 	/* this is the default
@@ -156,17 +156,17 @@ int rtcwake_main(int argc UNUSED_PARAM, char **argv)
 	*/
 	if (opt & (RTCWAKE_OPT_UTC | RTCWAKE_OPT_LOCAL))
 		utc = opt & RTCWAKE_OPT_UTC;
-	if (!(opt & RTCWAKE_OPT_SUSPEND_MODE))
-		suspend = DEFAULT_MODE;
-	if (opt & RTCWAKE_OPT_SECONDS)
+	if (opt & RTCWAKE_OPT_SECONDS) {
 		/* alarm time, seconds-to-sleep (relative) */
-		seconds = xatoi(opt_seconds);
-	if (opt & RTCWAKE_OPT_TIME)
+		seconds = xatou(opt_seconds);
+	} else {
+		/* RTCWAKE_OPT_TIME */
 		/* alarm time, time_t (absolute, seconds since 1/1 1970 UTC) */
-		alarm_time = xatol(opt_time);
-
-	if (!alarm_time && !seconds)
-		bb_error_msg_and_die("must provide wake time");
+		if (sizeof(alarm_time) <= sizeof(long))
+			alarm_time = xatol(opt_time);
+		else
+			alarm_time = xatoll(opt_time);
+	}
 
 	if (utc == -1)
 		utc = rtc_adjtime_is_utc();
@@ -177,8 +177,9 @@ int rtcwake_main(int argc UNUSED_PARAM, char **argv)
 	/* this RTC must exist and (if we'll sleep) be wakeup-enabled */
 	fd = rtc_xopen(&rtcname, O_RDONLY);
 
-	if (strcmp(suspend, "on") && !may_wakeup(rtcname))
-		bb_error_msg_and_die("%s not enabled for wakeup events", rtcname);
+	if (strcmp(suspend, "on") != 0)
+		if (!may_wakeup(rtcname))
+			bb_error_msg_and_die("%s not enabled for wakeup events", rtcname);
 
 	/* relative or absolute alarm time, normalized to time_t */
 	sys_time = time(NULL);
@@ -188,21 +189,29 @@ int rtcwake_main(int argc UNUSED_PARAM, char **argv)
 		rtc_time = rtc_tm2time(&tm_time, utc);
 	}
 
-
-	if (alarm_time) {
-		if (alarm_time < sys_time)
+	if (opt & RTCWAKE_OPT_TIME) {
+		/* Correct for RTC<->system clock difference */
+		alarm_time += rtc_time - sys_time;
+		if (alarm_time < rtc_time)
+			/*
+			 * Compat message text.
+			 * I'd say "RTC time is already ahead of ..." instead.
+			 */
 			bb_error_msg_and_die("time doesn't go backward to %s", ctime(&alarm_time));
-		alarm_time += sys_time - rtc_time;
 	} else
 		alarm_time = rtc_time + seconds + 1;
-	setup_alarm(fd, &alarm_time, rtc_time);
 
+	setup_alarm(fd, &alarm_time, rtc_time);
 	sync();
+#if 0 /*debug*/
+	printf("sys_time: %s", ctime(&sys_time));
+	printf("rtc_time: %s", ctime(&rtc_time));
+#endif
 	printf("wakeup from \"%s\" at %s", suspend, ctime(&alarm_time));
 	fflush_all();
 	usleep(10 * 1000);
 
-	if (strcmp(suspend, "on"))
+	if (strcmp(suspend, "on") != 0)
 		xopen_xwrite_close(SYS_POWER_PATH, suspend);
 	else {
 		/* "fake" suspend ... we'll do the delay ourselves */


More information about the busybox-cvs mailing list