From 1eb8994c0052ac746f5084ff375fcd9896b93452 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 2 Feb 2023 16:38:11 +0100 Subject: [PATCH] client: add -e option to indicate end of response In a non-tty session with chronyc it is not possible to detect the end of the response without relying on timeouts, or separate responses to a repeated command if using the -c option. Add -e option to end each response with a line containing a single dot. --- client.c | 12 +++++++++++- doc/chronyc.adoc | 4 ++++ test/simulation/110-chronyc | 12 ++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/client.c b/client.c index ad731b0..414c761 100644 --- a/client.c +++ b/client.c @@ -71,6 +71,8 @@ static int source_names = 0; static int csv_mode = 0; +static int end_dot = 0; + /* ================================================== */ /* Log a message. This is a minimalistic replacement of the logging.c implementation to avoid linking with it and other modules. */ @@ -3303,6 +3305,10 @@ process_line(char *line) ret = request_reply(&tx_message, &rx_message, RPY_NULL, 1); } + if (end_dot) { + printf(".\n"); + } + fflush(stderr); if (fflush(stdout) != 0 || ferror(stdout) != 0) { @@ -3379,6 +3385,7 @@ print_help(const char *progname) " -n\t\tDon't resolve hostnames\n" " -N\t\tPrint original source names\n" " -c\t\tEnable CSV format\n" + " -e\t\tEnd responses with dot\n" #if DEBUG > 0 " -d\t\tEnable debug messages\n" #endif @@ -3423,7 +3430,7 @@ main(int argc, char **argv) optind = 1; /* Parse short command-line options */ - while ((opt = getopt(argc, argv, "+46acdf:h:mnNp:v")) != -1) { + while ((opt = getopt(argc, argv, "+46acdef:h:mnNp:v")) != -1) { switch (opt) { case '4': case '6': @@ -3441,6 +3448,9 @@ main(int argc, char **argv) log_min_severity = LOGS_DEBUG; #endif break; + case 'e': + end_dot = 1; + break; case 'h': hostnames = optarg; break; diff --git a/doc/chronyc.adoc b/doc/chronyc.adoc index ca261c7..07b4430 100644 --- a/doc/chronyc.adoc +++ b/doc/chronyc.adoc @@ -89,6 +89,10 @@ format. Reverse DNS lookups will be disabled, time will be printed as number of seconds since the epoch, and values in seconds will not be converted to other units. +*-e*:: +With this option each *chronyc* response will end with a line containing a +single dot. + *-d*:: This option enables printing of debugging messages if *chronyc* was compiled with debugging support. diff --git a/test/simulation/110-chronyc b/test/simulation/110-chronyc index 7ecfcb5..2529cec 100755 --- a/test/simulation/110-chronyc +++ b/test/simulation/110-chronyc @@ -91,6 +91,18 @@ check_chronyd_exit || test_fail check_chronyc_output "^C0A87B01,192\.168\.123\.1,2,12623049..\..........,-?0\.0000.....,-?0\.000......,0\.000......,(99|100)\....,-?[0-9]\....,[0-9]\....,0\.000......,0\.000......,[0-9]+\..,Normal$" \ || test_fail +chronyc_options="-c -e" +chronyc_conf="sources" + +run_test || test_fail +check_chronyd_exit || test_fail + +check_chronyc_output "^#,.,SHM0.* +\^,.,192\.168\.123\.1.* +\^,.,192\.168\.123\.2.* +\.$" \ + || test_fail + chronyc_options="" server_strata=0 chronyc_start=0.5