diff options
Diffstat (limited to 'src/zmq2edi/zmq2edi.cpp')
-rw-r--r-- | src/zmq2edi/zmq2edi.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/zmq2edi/zmq2edi.cpp b/src/zmq2edi/zmq2edi.cpp index dacb573..e69a6c2 100644 --- a/src/zmq2edi/zmq2edi.cpp +++ b/src/zmq2edi/zmq2edi.cpp @@ -59,6 +59,8 @@ static void usage() cerr << " <source> is a ZMQ URL that points to a ODR-DabMux ZMQ output." << endl; cerr << " -w <delay> Keep every ETI frame until TIST is <delay> milliseconds after current system time." << endl; cerr << " Negative delay values are also allowed." << endl; + cerr << " -C <path to script> Before starting, run the given script, and only start if it returns 0." << endl; + cerr << " This is useful for checking that NTP is properly synchronised" << endl; cerr << " -x Drop frames where for which the wait time would be negative, i.e. frames that arrived too late." << endl; cerr << " -p <destination port> Set the destination port." << endl; cerr << " -P Disable PFT and send AFPackets." << endl; @@ -234,13 +236,17 @@ int start(int argc, char **argv) int delay_ms = 500; bool drop_late_packets = false; uint32_t backoff_after_reset_ms = DEFAULT_BACKOFF; + std::string startupcheck; int ch = 0; while (ch != -1) { - ch = getopt(argc, argv, "d:p:s:S:t:Pf:i:Dva:b:w:xh"); + ch = getopt(argc, argv, "C:d:p:s:S:t:Pf:i:Dva:b:w:xh"); switch (ch) { case -1: break; + case 'C': + startupcheck = optarg; + break; case 'd': case 's': case 'S': @@ -298,6 +304,25 @@ int start(int argc, char **argv) } } + if (not startupcheck.empty()) { + etiLog.level(info) << "Running startup check '" << startupcheck << "'"; + int wstatus = system(startupcheck.c_str()); + + if (WIFEXITED(wstatus)) { + if (WEXITSTATUS(wstatus) == 0) { + etiLog.level(info) << "Startup check ok"; + } + else { + etiLog.level(error) << "Startup check failed, returned " << WEXITSTATUS(wstatus); + return 1; + } + } + else { + etiLog.level(error) << "Startup check failed, child didn't terminate normally"; + return 1; + } + } + add_edi_destination(); if (optind >= argc) { @@ -424,8 +449,13 @@ int main(int argc, char **argv) #endif " starting up"; + int ret = 1; + try { - return start(argc, argv); + ret = start(argc, argv); + + // To make sure things get printed to stderr + std::this_thread::sleep_for(std::chrono::milliseconds(300)); } catch (const std::runtime_error &e) { etiLog.level(error) << "Runtime error: " << e.what(); @@ -434,5 +464,5 @@ int main(int argc, char **argv) etiLog.level(error) << "Logic error! " << e.what(); } - return 1; + return ret; } |