static NOINLINE void setup_alarm(int fd, time_t *wakeup, time_t rtc_time)
{
- struct tm *tm;
+ struct tm *ptm;
struct linux_rtc_wkalrm wake;
/* The wakeup time is in POSIX time (more or less UTC).
* Else mode is local so the time given to the RTC
* will instead use the local time zone.
*/
- tm = localtime(wakeup);
-
- wake.time.tm_sec = tm->tm_sec;
- wake.time.tm_min = tm->tm_min;
- wake.time.tm_hour = tm->tm_hour;
- wake.time.tm_mday = tm->tm_mday;
- wake.time.tm_mon = tm->tm_mon;
- wake.time.tm_year = tm->tm_year;
+ ptm = localtime(wakeup);
+
+ wake.time.tm_sec = ptm->tm_sec;
+ wake.time.tm_min = ptm->tm_min;
+ wake.time.tm_hour = ptm->tm_hour;
+ wake.time.tm_mday = ptm->tm_mday;
+ wake.time.tm_mon = ptm->tm_mon;
+ wake.time.tm_year = ptm->tm_year;
/* wday, yday, and isdst fields are unused by Linux */
wake.time.tm_wday = -1;
wake.time.tm_yday = -1;
seconds = xatoi(opt_seconds);
if (opt & RTCWAKE_OPT_TIME)
/* alarm time, time_t (absolute, seconds since 1/1 1970 UTC) */
- alarm_time = xatoi(opt_time);
+ alarm_time = xatol(opt_time);
if (!alarm_time && !seconds)
bb_error_msg_and_die("must provide wake time");
/* relative or absolute alarm time, normalized to time_t */
sys_time = time(NULL);
- if (sys_time == (time_t)-1)
- bb_perror_msg_and_die("read system time");
- rtc_time = rtc_read_time(fd, utc);
+ {
+ struct tm tm_time;
+ rtc_read_tm(&tm_time, fd);
+ rtc_time = rtc_tm2time(&tm_time, utc);
+ }
+
if (alarm_time) {
if (alarm_time < sys_time)
sync();
printf("wakeup from \"%s\" at %s", suspend, ctime(&alarm_time));
- fflush(stdout);
+ fflush_all();
usleep(10 * 1000);
if (strcmp(suspend, "on"))