From c68a92ba8017d7c136e614724c2e6baa1aa7f81c Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 18 Mar 2015 17:48:49 +0100 Subject: [PATCH] sys: avoid syslog message when leap bits are not changed After leap second the kernel removes STA_INS and STA_DEL bits from the adjtimex status automatically, don't report a change when clearing the bits. --- sys_linux.c | 9 +++++++++ wrap_adjtimex.c | 22 ++++++++++++++++++++++ wrap_adjtimex.h | 1 + 3 files changed, 32 insertions(+) diff --git a/sys_linux.c b/sys_linux.c index 29e8aa4..d57dde3 100644 --- a/sys_linux.c +++ b/sys_linux.c @@ -174,6 +174,15 @@ read_frequency(void) static void set_leap(int leap) { + int current_leap; + + if (TMX_GetLeap(¤t_leap) < 0) { + LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap"); + } + + if (current_leap == leap) + return; + if (TMX_SetLeap(leap) < 0) { LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap"); } diff --git a/wrap_adjtimex.c b/wrap_adjtimex.c index daac189..a6015b2 100644 --- a/wrap_adjtimex.c +++ b/wrap_adjtimex.c @@ -123,6 +123,28 @@ TMX_SetLeap(int leap) return adjtimex(&txc); } +int +TMX_GetLeap(int *leap) +{ + struct timex txc; + + txc.modes = 0; + if (adjtimex(&txc) < 0) + return -1; + + status &= ~(STA_INS | STA_DEL); + status |= txc.status & (STA_INS | STA_DEL); + + if (status & STA_INS) + *leap = 1; + else if (status & STA_DEL) + *leap = -1; + else + *leap = 0; + + return 0; +} + int TMX_SetSync(int sync, double est_error, double max_error) { struct timex txc; diff --git a/wrap_adjtimex.h b/wrap_adjtimex.h index d1bf940..23587a3 100644 --- a/wrap_adjtimex.h +++ b/wrap_adjtimex.h @@ -31,6 +31,7 @@ int TMX_ResetOffset(void); int TMX_SetFrequency(double *freq, long tick); int TMX_GetFrequency(double *freq, long *tick); int TMX_SetLeap(int leap); +int TMX_GetLeap(int *leap); int TMX_SetSync(int sync, double est_error, double max_error); int TMX_TestStepOffset(void); int TMX_ApplyStepOffset(double offset);