rtc: handle RTCs that don't support interrupts

Some RTCs supported by the Linux kernel don't support the RTC_UIE_ON/OFF
ioctls, which causes chronyd started with the -s option to get stuck in
the initial RTC mode.

After opening the RTC device in the initialization, return error if
the ioctls are not supported to prevent the upper layer from calling the
time_init() function and expecting it to finish.
This commit is contained in:
Miroslav Lichvar 2019-12-10 17:33:17 +01:00
parent a57e1eb542
commit d66b2f2b24

View file

@ -484,17 +484,19 @@ write_coefs_to_file(int valid,time_t ref_time,double offset,double rate)
/* ================================================== */
static void
static int
switch_interrupts(int on_off)
{
if (ioctl(fd, on_off ? RTC_UIE_ON : RTC_UIE_OFF, 0) < 0) {
LOG(LOGS_ERR, "Could not %s RTC interrupt : %s",
on_off ? "enable" : "disable", strerror(errno));
return;
return 0;
}
if (on_off)
skip_interrupts = 1;
return 1;
}
/* ================================================== */
@ -513,6 +515,12 @@ RTC_Linux_Initialise(void)
return 0;
}
/* Make sure the RTC supports interrupts */
if (!switch_interrupts(0)) {
close(fd);
return 0;
}
/* Close on exec */
UTI_FdSetCloexec(fd);