static void parse_broadcast(char *);
static void parse_clientloglimit(char *);
static void parse_confdir(char *);
+static void parse_driftfile(char *);
static void parse_fallbackdrift(char *);
static void parse_hwtimestamp(char *);
static void parse_include(char *);
static int ntp_port = NTP_PORT;
static char *keys_file = NULL;
static char *drift_file = NULL;
+static int drift_file_interval = 3600;
static char *rtc_file = NULL;
static double max_update_skew = 1000.0;
static double correction_time_ratio = 3.0;
} else if (!strcasecmp(command, "deny")) {
parse_allow_deny(p, ntp_restrictions, 0);
} else if (!strcasecmp(command, "driftfile")) {
- parse_string(p, &drift_file);
+ parse_driftfile(p);
} else if (!strcasecmp(command, "dscp")) {
parse_int(p, &ntp_dscp);
} else if (!strcasecmp(command, "dumpdir")) {
/* ================================================== */
+static void
+parse_driftfile(char *line)
+{
+ char *path, *opt, *val;
+
+ path = line;
+ opt = CPS_SplitWord(path);
+ val = CPS_SplitWord(opt);
+
+ if (*path == '\0' ||
+ (*opt != '\0' && (strcasecmp(opt, "interval") != 0 ||
+ sscanf(val, "%d", &drift_file_interval) != 1 ||
+ *CPS_SplitWord(val) != '\0'))) {
+ command_parse_error();
+ return;
+ }
+
+ Free(drift_file);
+ drift_file = Strdup(path);
+}
+
+/* ================================================== */
+
static void
parse_include(char *line)
{
/* ================================================== */
char *
-CNF_GetDriftFile(void)
+CNF_GetDriftFile(int *interval)
{
+ *interval = drift_file_interval;
return drift_file;
}
extern int CNF_GetAcquisitionPort(void);
extern int CNF_GetNTPPort(void);
-extern char *CNF_GetDriftFile(void);
+extern char *CNF_GetDriftFile(int *interval);
extern char *CNF_GetLogDir(void);
extern char *CNF_GetDumpDir(void);
extern int CNF_GetLogBanner(void);
directive. The current remaining correction is shown in the
<<chronyc.adoc#tracking,*tracking*>> report as the *System time* value.
-[[driftfile]]*driftfile* _file_::
+[[driftfile]]*driftfile* _file_ [*interval* _interval_]::
One of the main activities of the *chronyd* program is to work out the rate at
which the system clock gains or loses time relative to real time.
+
microseconds). The second is an estimate of the error bound around the first
value in which the true rate actually lies.
+
+The *interval* option specifies the minimum interval between updates of the
+file in seconds. The file is written only on an update of the local clock.
+The default interval is 3600 seconds.
++
An example of the driftfile directive is:
+
----
/* The update interval of the reference in the local reference mode */
#define LOCAL_REF_UPDATE_INTERVAL 64.0
-/* Interval between updates of the drift file */
-#define MAX_DRIFTFILE_AGE 3600.0
-
static int are_we_synchronised;
static int enable_local_stratum;
static int local_stratum;
/* Filename of the drift file. */
static char *drift_file=NULL;
static double drift_file_age;
+static int drift_file_interval;
static void update_drift_file(double, double);
local_activate_ok = 0;
/* Now see if we can get the drift file opened */
- drift_file = CNF_GetDriftFile();
+ drift_file = CNF_GetDriftFile(&drift_file_interval);
if (drift_file) {
in = UTI_OpenFile(NULL, drift_file, NULL, 'r', 0);
if (in) {
if (drift_file) {
/* Update drift file at most once per hour */
drift_file_age += update_interval;
- if (drift_file_age >= MAX_DRIFTFILE_AGE) {
+ if (drift_file_age >= drift_file_interval) {
update_drift_file(local_abs_frequency, our_skew);
drift_file_age = 0.0;
}
{
struct stat buf;
char *drift_file;
+ int interval;
- drift_file = CNF_GetDriftFile();
+ drift_file = CNF_GetDriftFile(&interval);
if (!drift_file)
return 0;