From c2f83bd8a4cdbe6a93b1663741c29e8d65187ed7 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 23 Jun 2015 14:48:31 +0200 Subject: [PATCH] sys: fix clock stepping by integer number of seconds on Linux The kernel requires in the ADJ_SETOFFSET | ADJ_NANO mode that the timex.time.tv_usec value is smaller than 10^9 nanosecond, which wasn't the case with a negative integer offset (e.g. inserted leap second). --- wrap_adjtimex.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/wrap_adjtimex.c b/wrap_adjtimex.c index ef7b066..50c4ab7 100644 --- a/wrap_adjtimex.c +++ b/wrap_adjtimex.c @@ -193,12 +193,12 @@ TMX_ApplyStepOffset(double offset) struct timex txc; txc.modes = ADJ_SETOFFSET | ADJ_NANO; - if (offset >= 0) { - txc.time.tv_sec = offset; - } else { - txc.time.tv_sec = offset - 1; - } + txc.time.tv_sec = offset; txc.time.tv_usec = 1.0e9 * (offset - txc.time.tv_sec); + if (txc.time.tv_usec < 0) { + txc.time.tv_sec--; + txc.time.tv_usec += 1000000000; + } return adjtimex(&txc); }