@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,
* 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 }}}
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
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");
/* ================================================== */
+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)
{
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;