mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-03 18:25:07 -05:00
rtc: factor out RTC_Linux_ReadTimeAfterInterrupt
We have code to read time after an RTC's UIE interrupt, which we currently use as part of maintaining the correction file. In a later commit, we will need the same functionality for using the RTC as reference clock, so export the function and give it a descriptive name appropriate for a globally visible function.
This commit is contained in:
committed by
Miroslav Lichvar
parent
8028984f34
commit
924199ef69
38
rtc_linux.c
38
rtc_linux.c
@@ -785,11 +785,31 @@ RTC_Linux_CheckInterrupt(int fd)
|
|||||||
return (data & RTC_UF) == RTC_UF;
|
return (data & RTC_UF) == RTC_UF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time_t
|
||||||
|
RTC_Linux_ReadTimeAfterInterrupt(int fd, int utc, struct timespec *sys_time_cooked)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
struct rtc_time rtc_raw;
|
||||||
|
|
||||||
|
/* Read RTC time, sandwiched between two polls of the system clock
|
||||||
|
so we can bound any error */
|
||||||
|
|
||||||
|
SCH_GetLastEventTime(sys_time_cooked, NULL, NULL);
|
||||||
|
|
||||||
|
status = ioctl(fd, RTC_RD_TIME, &rtc_raw);
|
||||||
|
if (status < 0) {
|
||||||
|
LOG(LOGS_ERR, "Could not read time from %s : %s", CNF_GetRtcDevice(), strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert RTC time into a struct timespec */
|
||||||
|
return t_from_rtc(&rtc_raw, utc);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
read_from_device(int fd_, int event, void *any)
|
read_from_device(int fd_, int event, void *any)
|
||||||
{
|
{
|
||||||
struct timespec sys_time;
|
struct timespec sys_time;
|
||||||
struct rtc_time rtc_raw;
|
|
||||||
int status, error = 0;
|
int status, error = 0;
|
||||||
time_t rtc_t;
|
time_t rtc_t;
|
||||||
|
|
||||||
@@ -801,22 +821,12 @@ read_from_device(int fd_, int event, void *any)
|
|||||||
fd = -1;
|
fd = -1;
|
||||||
return;
|
return;
|
||||||
} else if (status == 0) {
|
} else if (status == 0) {
|
||||||
|
/* Wait for the next interrupt, this one may be bogus */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_GetLastEventTime(&sys_time, NULL, NULL);
|
rtc_t = RTC_Linux_ReadTimeAfterInterrupt(fd, rtc_on_utc, &sys_time);
|
||||||
|
if (rtc_t == (time_t)-1) {
|
||||||
status = ioctl(fd, RTC_RD_TIME, &rtc_raw);
|
|
||||||
if (status < 0) {
|
|
||||||
LOG(LOGS_ERR, "Could not read time from %s : %s", CNF_GetRtcDevice(), strerror(errno));
|
|
||||||
error = 1;
|
|
||||||
goto turn_off_interrupt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert RTC time into a struct timespec */
|
|
||||||
rtc_t = t_from_rtc(&rtc_raw, rtc_on_utc);
|
|
||||||
|
|
||||||
if (rtc_t == (time_t)(-1)) {
|
|
||||||
error = 1;
|
error = 1;
|
||||||
goto turn_off_interrupt;
|
goto turn_off_interrupt;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,5 +44,7 @@ extern void RTC_Linux_CycleLogFile(void);
|
|||||||
|
|
||||||
extern int RTC_Linux_SwitchInterrupt(int fd, int on_off);
|
extern int RTC_Linux_SwitchInterrupt(int fd, int on_off);
|
||||||
extern int RTC_Linux_CheckInterrupt(int fd);
|
extern int RTC_Linux_CheckInterrupt(int fd);
|
||||||
|
extern time_t RTC_Linux_ReadTimeAfterInterrupt(int fd, int utc,
|
||||||
|
struct timespec *sys_time_cooked);
|
||||||
|
|
||||||
#endif /* _GOT_RTC_LINUX_H */
|
#endif /* _GOT_RTC_LINUX_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user