From d6a91057ae1b950a525ff44187199a04a37b8e30 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 23 Jun 2011 12:13:51 +0200 Subject: [PATCH] Add waitsync command --- chrony.texi | 27 +++++++++++++++++++++++++++ client.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/chrony.texi b/chrony.texi index c86ba31..f32e815 100644 --- a/chrony.texi +++ b/chrony.texi @@ -2898,6 +2898,7 @@ password: @item @code{sources} @item @code{sourcestats} @item @code{tracking} +@item @code{waitsync} @end itemize All other commands require a password to have been specified previously, @@ -2958,6 +2959,7 @@ interface. * timeout command:: Set initial response timeout * tracking command:: Display system clock performance * trimrtc command:: Correct the RTC time to the current system time +* waitsync command:: Wait until synchronised * writertc command:: Write the RTC parameters to file. @end menu @c }}} @@ -4188,6 +4190,31 @@ across machine reboots even if the @code{trimrtc} command is never used corrected, in a manner compatible with @code{chronyd} using it to maintain accurate time across machine reboots. @c }}} +@c {{{ waitsync +@node waitsync command +@subsubsection waitsync +The @code{waitsync} command waits for @code{chronyd} to synchronise. + +Up to three optional arguments can be specified, the first is the maximum +number of tries in 10 second intervals before giving up and returning a +non-zero error code. When 0 is specified, or there are no arguments, the +number of tries will not be limited. + +The second and third arguments are the maximum allowed remaining correction of +the system clock and the maximum allowed skew (in ppm) as reported by the +@code{tracking} command (@pxref{tracking command}) in the @code{System time} +and @code{Skew} fields. If not specified or zero, the value will not be +checked. + +An example is + +@example +waitsync 60 0.01 +@end example + +which will wait up to about 10 minutes for @code{chronyd} to synchronise to a +source and the remaining correction to be less than 10 milliseconds. +@c }}} @c {{{ writertc @node writertc command @subsubsection writertc diff --git a/client.c b/client.c index 6356684..99fea83 100644 --- a/client.c +++ b/client.c @@ -1234,6 +1234,7 @@ give_help(void) printf("sourcestats [-v] : Display estimation information about current sources\n"); printf("tracking : Display system time information\n"); printf("trimrtc : Correct RTC relative to system clock\n"); + printf("waitsync [max-tries [max-correction [max-skew]]] : Wait until synchronised\n"); printf("writertc : Save RTC parameters to file\n"); printf("\n"); printf("dns -n|+n : Disable/enable resolving IP addresses to hostnames\n"); @@ -2402,6 +2403,56 @@ process_cmd_reselect(CMD_Request *msg, char *line) /* ================================================== */ +static int +process_cmd_waitsync(char *line) +{ + CMD_Request request; + CMD_Reply reply; + uint32_t ref_id, a, b, c, d; + double correction, skew_ppm, max_correction, max_skew_ppm; + int ret = 0, max_tries, i; + + max_tries = 0; + max_correction = 0.0; + max_skew_ppm = 0.0; + + sscanf(line, "%d %lf %lf", &max_tries, &max_correction, &max_skew_ppm); + + request.command = htons(REQ_TRACKING); + + for (i = 1; ; i++) { + if (request_reply(&request, &reply, RPY_TRACKING, 0)) { + ref_id = ntohl(reply.data.tracking.ref_id); + a = (ref_id >> 24); + b = (ref_id >> 16) & 0xff; + c = (ref_id >> 8) & 0xff; + d = (ref_id) & 0xff; + + correction = UTI_FloatNetworkToHost(reply.data.tracking.current_correction); + correction = fabs(correction); + skew_ppm = UTI_FloatNetworkToHost(reply.data.tracking.skew_ppm); + + printf("try: %d, refid: %d.%d.%d.%d, correction: %.9f, skew: %.3f\n", + i, a, b, c, d, correction, skew_ppm); + + if (ref_id != 0 && ref_id != 0x7f7f0101L /* LOCAL refid */ && + (max_correction == 0.0 || correction <= max_correction) && + (max_skew_ppm == 0.0 || skew_ppm <= max_skew_ppm)) { + ret = 1; + } + } + + if (!ret && (!max_tries || i < max_tries)) { + sleep(10); + } else { + break; + } + } + return ret; +} + +/* ================================================== */ + static int process_cmd_dns(const char *line) { @@ -2579,6 +2630,9 @@ process_line(char *line, int *quit) do_normal_submit = process_cmd_reselectdist(&tx_message, p+12); } else if (!strncmp(p, "reselect", 8)) { process_cmd_reselect(&tx_message, p+8); + } else if (!strncmp(p, "waitsync", 8)) { + ret = process_cmd_waitsync(p+8); + do_normal_submit = 0; } else if (!strncmp(p, "dns ", 4)) { ret = process_cmd_dns(p+4); do_normal_submit = 0;