From: Miroslav Lichvar Date: Tue, 10 Dec 2019 16:33:17 +0000 (+0100) Subject: rtc: handle RTCs that don't support interrupts X-Git-Tag: 4.0-pre1~101 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d66b2f2b2423bfbd3de4d69895024dac7eefb306;p=thirdparty%2Fchrony.git 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. --- diff --git a/rtc_linux.c b/rtc_linux.c index f5bc9bdd..fad95b5f 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);