sys_timex: fix update of TAI offset on non-Linux systems

The tai field in struct timex is a Linux-specific feature. It's possible
to read the current offset with ntp_gettime() (or ntp_gettimex() on
Linux), but apparently not all libc implementations support it.

Rework the code to save and adjust the last value instead of reading
the current value from the kernel.
This commit is contained in:
Miroslav Lichvar 2017-07-10 15:51:06 +02:00
parent 4fe0e6b7fd
commit 760285218f

View file

@ -63,6 +63,9 @@
/* Saved timex status */ /* Saved timex status */
static int sys_status; static int sys_status;
/* Saved TAI-UTC offset */
static int sys_tai_offset;
/* ================================================== */ /* ================================================== */
static double static double
@ -115,11 +118,18 @@ set_leap(int leap, int tai_offset)
txc.status = sys_status; txc.status = sys_status;
#ifdef MOD_TAI #ifdef MOD_TAI
if (tai_offset && tai_offset != txc.tai) { if (tai_offset) {
txc.modes |= MOD_TAI; txc.modes |= MOD_TAI;
txc.constant = tai_offset; txc.constant = tai_offset;
if (applied && !(sys_status & (STA_INS | STA_DEL)))
sys_tai_offset += prev_status & STA_INS ? 1 : -1;
if (sys_tai_offset != tai_offset) {
sys_tai_offset = tai_offset;
LOG(LOGS_INFO, "System clock TAI offset set to %d seconds", tai_offset); LOG(LOGS_INFO, "System clock TAI offset set to %d seconds", tai_offset);
} }
}
#endif #endif
SYS_Timex_Adjust(&txc, 0); SYS_Timex_Adjust(&txc, 0);
@ -177,6 +187,7 @@ initialise_timex(void)
struct timex txc; struct timex txc;
sys_status = STA_UNSYNC; sys_status = STA_UNSYNC;
sys_tai_offset = 0;
/* Reset PLL offset */ /* Reset PLL offset */
txc.modes = MOD_OFFSET | MOD_STATUS; txc.modes = MOD_OFFSET | MOD_STATUS;