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).
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);
}