static void
set_leap(int leap)
{
- int current_leap;
+ int current_leap, applied;
- if (TMX_GetLeap(¤t_leap) < 0) {
+ if (TMX_GetLeap(¤t_leap, &applied) < 0) {
LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap");
}
LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap");
}
- LOG(LOGS_INFO, LOGF_SysLinux, "System clock status set to %s leap second",
- leap ? (leap > 0 ? "insert" : "delete") : "not insert/delete");
+ LOG(LOGS_INFO, LOGF_SysLinux, "System clock status %s leap second",
+ leap ? (leap > 0 ? "set to insert" : "set to delete") :
+ (applied ? "reset after" : "set to not insert/delete"));
}
/* ================================================== */
}
int
-TMX_GetLeap(int *leap)
+TMX_GetLeap(int *leap, int *applied)
{
struct timex txc;
+ int state;
txc.modes = 0;
- if (adjtimex(&txc) < 0)
+ state = adjtimex(&txc);
+ if (state < 0)
return -1;
- status &= ~(STA_INS | STA_DEL);
- status |= txc.status & (STA_INS | STA_DEL);
-
- if (status & STA_INS)
+ if (txc.status & STA_INS)
*leap = 1;
- else if (status & STA_DEL)
+ else if (txc.status & STA_DEL)
*leap = -1;
else
*leap = 0;
+ *applied = state == TIME_WAIT;
+
return 0;
}
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_GetLeap(int *leap, int *applied);
int TMX_SetSync(int sync, double est_error, double max_error);
int TMX_TestStepOffset(void);
int TMX_ApplyStepOffset(double offset);