diff --git a/rtc_linux.c b/rtc_linux.c index 361e456..8a55f8b 100644 --- a/rtc_linux.c +++ b/rtc_linux.c @@ -786,7 +786,9 @@ RTC_Linux_CheckInterrupt(int fd) } time_t -RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc, struct timespec *sys_time_cooked) +RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc, + struct timespec *sys_time_cooked, + struct timespec *sys_time_raw) { int status; struct rtc_time rtc_raw; @@ -794,7 +796,7 @@ RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc, struct timespec *sys_time_coo /* Read RTC time, sandwiched between two polls of the system clock so we can bound any error. */ - SCH_GetLastEventTime(sys_time_cooked, NULL, NULL); + SCH_GetLastEventTime(sys_time_cooked, NULL, sys_time_raw); status = ioctl(fd, RTC_RD_TIME, &rtc_raw); if (status < 0) { @@ -826,7 +828,7 @@ read_from_device(int fd_, int event, void *any) return; } - rtc_t = RTC_Linux_ReadTime_AfterInterrupt(fd, rtc_on_utc, &sys_time); + rtc_t = RTC_Linux_ReadTime_AfterInterrupt(fd, rtc_on_utc, &sys_time, NULL); if (rtc_t == (time_t)-1) { error = 1; goto turn_off_interrupt; @@ -931,7 +933,9 @@ RTC_Linux_WriteParameters(void) } time_t -RTC_Linux_ReadTime_Now(int fd, int utc, struct timespec *old_sys_time) +RTC_Linux_ReadTime_Now(int fd, int utc, + struct timespec *old_sys_cooked, + struct timespec *old_sys_raw) { struct rtc_time rtc_raw, rtc_raw_retry; int status; @@ -947,7 +951,10 @@ RTC_Linux_ReadTime_Now(int fd, int utc, struct timespec *old_sys_time) } while (status >= 0 && rtc_raw.tm_sec != rtc_raw_retry.tm_sec); /* Read system clock */ - LCL_ReadCookedTime(old_sys_time, NULL); + if (old_sys_raw) + LCL_ReadRawTime(old_sys_raw); + if (old_sys_cooked) + LCL_ReadCookedTime(old_sys_cooked, NULL); return status >= 0 ? t_from_rtc(&rtc_raw, utc) : -1; } @@ -977,7 +984,7 @@ RTC_Linux_TimePreInit(time_t driftfile_time) return 0; /* Can't open it, and won't be able to later */ } - rtc_t = RTC_Linux_ReadTime_Now(fd, rtc_on_utc, &old_sys_time); + rtc_t = RTC_Linux_ReadTime_Now(fd, rtc_on_utc, &old_sys_time, NULL); close(fd); diff --git a/rtc_linux.h b/rtc_linux.h index 6b565ad..d34f697 100644 --- a/rtc_linux.h +++ b/rtc_linux.h @@ -45,8 +45,10 @@ extern void RTC_Linux_CycleLogFile(void); extern int RTC_Linux_SwitchInterrupt(int fd, int on_off); extern int RTC_Linux_CheckInterrupt(int fd); extern time_t RTC_Linux_ReadTime_AfterInterrupt(int fd, int utc, - struct timespec *sys_time_cooked); + struct timespec *sys_time_cooked, + struct timespec *sys_time_raw); extern time_t RTC_Linux_ReadTime_Now(int fd, int utc, - struct timespec *sys_time_cooked); + struct timespec *sys_time_cooked, + struct timespec *sys_time_raw); #endif /* _GOT_RTC_LINUX_H */