From d66b2f2b2423bfbd3de4d69895024dac7eefb306 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 10 Dec 2019 17:33:17 +0100 Subject: [PATCH] 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. --- rtc_linux.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rtc_linux.c b/rtc_linux.c index f5bc9bd..fad95b5 100644 --- a/rtc_linux.c +++ b/rtc_linux.c @@ -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);