From f313f602ba1d6ee765c364e8aafc554838fade95 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 20 Mar 2025 13:33:04 +0100 Subject: [PATCH 01/30] multireceiverapp: changed from pointer to destruct properly (or could have used reset() before exit but kept this for consistency with slsReceiver and slsFrameSynchronizer, added --version/ -v for slsMultiReciever and slsFramesynchronizer (in 10, could be done properly, got rid of unnecessary break after an exit in multireceiverapp, removed outdated f: command line option in slsReceiver used previously for config files, updated version print out to print binary in slsReceiver version command --- .../src/FrameSynchronizerApp.cpp | 15 ++++- slsReceiverSoftware/src/MultiReceiverApp.cpp | 61 +++++++++++-------- slsReceiverSoftware/src/Receiver.cpp | 4 +- 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp index 790a30b7b..b4e08b32e 100644 --- a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp +++ b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp @@ -10,6 +10,7 @@ #include "sls/container_utils.h" #include "sls/logger.h" #include "sls/sls_detector_defs.h" +#include "sls/versionAPI.h" #include //SIGINT #include @@ -92,7 +93,9 @@ void cleanup() { std::string getHelpMessage() { std::ostringstream os; os << "\nUsage:\n" - "./slsFrameSynchronizer [start tcp port] [num recevers] [print " + << "./slsFrameSynchronizer --version or -v\n" + << "\t - Gets the slsFrameSynchronizer version\n\n" + << "./slsFrameSynchronizer [start tcp port] [num recevers] [print " "callback headers (optional)]\n" << "\t - tcp port has to be non-zero and 16 bit\n" << "\t - print callback headers option is 0 (disabled) by default\n"; @@ -505,6 +508,16 @@ void GetDataCallback(slsDetectorDefs::sls_receiver_header &header, */ int main(int argc, char *argv[]) { + // version + if (argc == 2) { + std::string sargv1 = std::string(argv[1]); + if (sargv1 == "--version" || sargv1 == "-v") { + std::cout << "slsFrameSynchronizer Version: " << APIRECEIVER + << std::endl; + exit(EXIT_SUCCESS); + } + } + /** - set default values */ int numReceivers = 1; uint16_t startTCPPort = DEFAULT_TCP_RX_PORTNO; diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 061c9a441..8d2e1c2fc 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -7,6 +7,7 @@ #include "sls/container_utils.h" #include "sls/logger.h" #include "sls/sls_detector_defs.h" +#include "sls/versionAPI.h" #include //SIGINT #include @@ -159,6 +160,15 @@ void GetData(slsDetectorDefs::sls_receiver_header &header, */ int main(int argc, char *argv[]) { + // version + if (argc == 2) { + std::string sargv1 = std::string(argv[1]); + if (sargv1 == "--version" || sargv1 == "-v") { + std::cout << "SLS Receiver Version: " << APIRECEIVER << std::endl; + exit(EXIT_SUCCESS); + } + } + /** - set default values */ int numReceivers = 1; uint16_t startTCPPort = DEFAULT_TCP_RX_PORTNO; @@ -241,40 +251,43 @@ int main(int argc, char *argv[]) { else if (pid == 0) { cprintf(BLUE, "Child process %d [ Tid: %ld ]\n", i, (long)gettid()); - std::unique_ptr receiver = nullptr; try { - receiver = sls::make_unique(startTCPPort + i); + uint16_t port = startTCPPort + i; + sls::Receiver receiver(port); + + /** - register callbacks. remember to set file write enable + * to 0 (using the client) if we should not write files and you + * will write data using the callbacks */ + if (withCallback) { + + /** - Call back for start acquisition */ + cprintf(BLUE, "Registering StartAcq()\n"); + receiver.registerCallBackStartAcquisition(StartAcq, + nullptr); + + /** - Call back for acquisition finished */ + cprintf(BLUE, "Registering AcquisitionFinished()\n"); + receiver.registerCallBackAcquisitionFinished( + AcquisitionFinished, nullptr); + + /* - Call back for raw data */ + cprintf(BLUE, "Registering GetData() \n"); + receiver.registerCallBackRawDataReady(GetData, nullptr); + } + + /** - as long as no Ctrl+C */ + sem_wait(&semaphore); + sem_destroy(&semaphore); + } catch (...) { LOG(sls::logINFOBLUE) << "Exiting Child Process [ Tid: " << gettid() << " ]"; throw; } - /** - register callbacks. remember to set file write enable to 0 - * (using the client) if we should not write files and you will - * write data using the callbacks */ - if (withCallback) { - /** - Call back for start acquisition */ - cprintf(BLUE, "Registering StartAcq()\n"); - receiver->registerCallBackStartAcquisition(StartAcq, nullptr); - - /** - Call back for acquisition finished */ - cprintf(BLUE, "Registering AcquisitionFinished()\n"); - receiver->registerCallBackAcquisitionFinished( - AcquisitionFinished, nullptr); - - /* - Call back for raw data */ - cprintf(BLUE, "Registering GetData() \n"); - receiver->registerCallBackRawDataReady(GetData, nullptr); - } - - /** - as long as no Ctrl+C */ - sem_wait(&semaphore); - sem_destroy(&semaphore); cprintf(BLUE, "Exiting Child Process [ Tid: %ld ]\n", (long)gettid()); exit(EXIT_SUCCESS); - break; } } diff --git a/slsReceiverSoftware/src/Receiver.cpp b/slsReceiverSoftware/src/Receiver.cpp index d2d5593d5..41a729be8 100644 --- a/slsReceiverSoftware/src/Receiver.cpp +++ b/slsReceiverSoftware/src/Receiver.cpp @@ -62,7 +62,7 @@ Receiver::Receiver(int argc, char *argv[]) : tcpipInterface(nullptr) { "\t started with privileges. \n\n"; while (c != -1) { - c = getopt_long(argc, argv, "hvf:t:u:", long_options, &option_index); + c = getopt_long(argc, argv, "hvt:u:", long_options, &option_index); // Detect the end of the options. if (c == -1) @@ -87,7 +87,7 @@ Receiver::Receiver(int argc, char *argv[]) : tcpipInterface(nullptr) { break; case 'v': - std::cout << "SLS Receiver Version: " << APIRECEIVER << std::endl; + std::cout << "slsReceiver Version: " << APIRECEIVER << std::endl; LOG(logINFOBLUE) << "Exiting [ Tid: " << gettid() << " ]"; exit(EXIT_SUCCESS); From 89726ab3ff53e1e4b06fb03105e6251a7c153abb Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 20 Mar 2025 13:38:17 +0100 Subject: [PATCH 02/30] missed to commit --- slsReceiverSoftware/src/MultiReceiverApp.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 8d2e1c2fc..791666398 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -40,7 +40,9 @@ void sigInterruptHandler(int p) { sem_post(&semaphore); } */ std::string getHelpMessage() { std::ostringstream os; - os << "\nUsage:\n" + os << "\nUsage:\n\n" + << "./slsMultiReceiver --version or -v\n" + << "\t - Gets the slsMultiReceiver version\n\n" << "./slsMultiReceiver [start tcp port] [num recevers] [call back " "option (optional)]\n" << "\t - tcp port has to be non-zero and 16 bit\n" @@ -164,7 +166,8 @@ int main(int argc, char *argv[]) { if (argc == 2) { std::string sargv1 = std::string(argv[1]); if (sargv1 == "--version" || sargv1 == "-v") { - std::cout << "SLS Receiver Version: " << APIRECEIVER << std::endl; + std::cout << "slsMultiReceiver Version: " << APIRECEIVER + << std::endl; exit(EXIT_SUCCESS); } } From 78442168120fdb8ba502d238eb6dc635400233ea Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 21 Mar 2025 00:27:40 +0100 Subject: [PATCH 03/30] proper clean up and versioning of command line arguments for receiver and multi receiver --- slsReceiverSoftware/include/sls/Receiver.h | 18 +- slsReceiverSoftware/src/MultiReceiverApp.cpp | 258 +++++++++++++------ slsReceiverSoftware/src/Receiver.cpp | 103 +------- slsReceiverSoftware/src/ReceiverApp.cpp | 84 +++++- 4 files changed, 261 insertions(+), 202 deletions(-) diff --git a/slsReceiverSoftware/include/sls/Receiver.h b/slsReceiverSoftware/include/sls/Receiver.h index eb7c4b214..0a3a83482 100644 --- a/slsReceiverSoftware/include/sls/Receiver.h +++ b/slsReceiverSoftware/include/sls/Receiver.h @@ -13,22 +13,12 @@ class Receiver : private virtual slsDetectorDefs { public: /** * Constructor - * Starts up a Receiver server. Reads configuration file, options, and - * assembles a Receiver using TCP and UDP detector interfaces + * Starts up a Receiver server. + * Assembles a Receiver using TCP and UDP detector interfaces * throws an exception in case of failure - * @param argc from command line - * @param argv from command line + * @param port TCP/IP port number */ - Receiver(int argc, char *argv[]); - - /** - * Constructor - * Starts up a Receiver server. Reads configuration file, options, and - * assembles a Receiver using TCP and UDP detector interfaces - * throws an exception in case of failure - * @param tcpip_port_no TCP/IP port number - */ - Receiver(uint16_t tcpip_port_no = 1954); + Receiver(uint16_t port = 1954); ~Receiver(); diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 791666398..0c09e828a 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -7,10 +7,12 @@ #include "sls/container_utils.h" #include "sls/logger.h" #include "sls/sls_detector_defs.h" +#include "sls/sls_detector_exceptions.h" #include "sls/versionAPI.h" #include //SIGINT #include +#include #include #include #include //wait @@ -29,28 +31,6 @@ sem_t semaphore; -/** - * Control+C Interrupt Handler - * to let all the processes know to exit properly - */ -void sigInterruptHandler(int p) { sem_post(&semaphore); } - -/** - * prints usage of this example program - */ -std::string getHelpMessage() { - std::ostringstream os; - os << "\nUsage:\n\n" - << "./slsMultiReceiver --version or -v\n" - << "\t - Gets the slsMultiReceiver version\n\n" - << "./slsMultiReceiver [start tcp port] [num recevers] [call back " - "option (optional)]\n" - << "\t - tcp port has to be non-zero and 16 bit\n" - << "\t - call back option is 0 (disabled) by default, 1 prints frame " - "header for debugging\n"; - return os.str(); -} - /** * Start Acquisition Call back (slsMultiReceiver writes data if file write * enabled) if registerCallBackRawDataReady or @@ -153,6 +133,60 @@ void GetData(slsDetectorDefs::sls_receiver_header &header, imageSize = 26000; } +/** + * Control+C Interrupt Handler + * to let all the processes know to exit properly + */ +void sigInterruptHandler(int p) { sem_post(&semaphore); } + +void GetDeprecatedCommandLineOptions(int argc, char *argv[], + uint16_t &startPort, + uint16_t &numReceivers, + bool &callbackEnabled) { + std::string deprecatedMessage = + "Detected deprecated Options. Please update.\n"; + if (argc > 1) { + try { + if (argc == 3 || argc == 4) { + startPort = sls::StringTo(argv[1]); + numReceivers = sls::StringTo(argv[2]); + if (numReceivers > 1024) { + LOG(sls::logWARNING) << deprecatedMessage; + LOG(sls::logERROR) + << "Did you mix up the order of the arguments?"; + exit(EXIT_FAILURE); + } + if (numReceivers == 0) { + LOG(sls::logWARNING) << deprecatedMessage; + LOG(sls::logERROR) << "Invalid number of receivers."; + exit(EXIT_FAILURE); + } + if (argc == 4) { + callbackEnabled = sls::StringTo(argv[3]); + } + } else + throw std::runtime_error("Invalid number of arguments"); + } catch (const std::exception &e) { + LOG(sls::logWARNING) << deprecatedMessage; + LOG(sls::logERROR) << e.what(); + exit(EXIT_FAILURE); + } + } +} + +std::string getHelpMessage() { + std::string name = "slsMultiReceiver"; + return "\nUsage: " + name + " Options:\n" + + "\t-v, --version : Version of " + name + ".\n" + + "\t-n, --num-receivers : Number of receivers.\n" + + "\t-p, --port : TCP port to communicate with client for " + "configuration. Non-zero and 16 bit.\n" + + "\t-c, --callback : Enable dummy callbacks. Disabled (0) by " + "default. Prints frame header for debugging.\n" + + "\t-u, --uid : Set effective user id if receiver started " + "with privileges. \n\n"; +} + /** * Example of main program using the Receiver class * @@ -161,60 +195,109 @@ void GetData(slsDetectorDefs::sls_receiver_header &header, * - Default Start TCP port is 1954 */ int main(int argc, char *argv[]) { + uint16_t startPort = DEFAULT_TCP_RX_PORTNO; + uint16_t numReceivers = 1; + bool callbackEnabled = false; + uid_t userid = -1; - // version - if (argc == 2) { - std::string sargv1 = std::string(argv[1]); - if (sargv1 == "--version" || sargv1 == "-v") { - std::cout << "slsMultiReceiver Version: " << APIRECEIVER - << std::endl; + std::string help_message = getHelpMessage(); + + static struct option long_options[] = { + {"help", no_argument, nullptr, 'h'}, + {"version", no_argument, nullptr, 'v'}, + {"num-receivers", required_argument, nullptr, 'n'}, + {"rx_tcpport", required_argument, nullptr, 't'}, + {"port", required_argument, nullptr, 'p'}, + {"callback", required_argument, nullptr, 'c'}, + {"uid", required_argument, nullptr, 'u'}, + {nullptr, 0, nullptr, 0}}; + + int option_index = 0; + int opt = 0; + while (-1 != (opt = getopt_long(argc, argv, "hvn:t:p:u:c:", long_options, + &option_index))) { + + switch (opt) { + + case 'n': + try { + numReceivers = sls::StringTo(optarg); + if (numReceivers == 0 || numReceivers > 100) { + throw std::runtime_error("Invalid argument."); + } + } catch (...) { + throw sls::RuntimeError("Invalid number of receivers." + + help_message); + } + break; + + case 't': + LOG(sls::logWARNING) + << "Deprecated option. Please use 'p' or '--port'."; + case 'p': + try { + startPort = sls::StringTo(optarg); + } catch (...) { + throw sls::RuntimeError("Could not scan port number." + + help_message); + } + break; + + case 'c': + try { + callbackEnabled = sls::StringTo(optarg); + } catch (...) { + throw sls::RuntimeError("Invalid callback enable." + + help_message); + } + break; + + case 'u': + try { + userid = sls::StringTo(optarg); + } catch (...) { + throw sls::RuntimeError("Invalid uid." + help_message); + } + break; + + case 'h': + std::cout << help_message << std::endl; exit(EXIT_SUCCESS); + default: + // maintain backward compatibility of [startport] [num-receivers] + // [callback] + GetDeprecatedCommandLineOptions(argc, argv, startPort, numReceivers, + callbackEnabled); + throw sls::RuntimeError(help_message); } } - /** - set default values */ - int numReceivers = 1; - uint16_t startTCPPort = DEFAULT_TCP_RX_PORTNO; - int withCallback = 0; - sem_init(&semaphore, 1, 0); + LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << ']'; + LOG(sls::logINFO) << "Number of Receivers: " << numReceivers; + LOG(sls::logINFO) << "Start TCP Port: " << startPort; + LOG(sls::logINFO) << "Callback Enable: " << callbackEnabled; - /** - get number of receivers and start tcp port from command line - * arguments */ - if (argc > 1) { - try { - if (argc == 3 || argc == 4) { - startTCPPort = sls::StringTo(argv[1]); - if (startTCPPort == 0) { - throw std::runtime_error("Invalid start tcp port"); - } - numReceivers = std::stoi(argv[2]); - if (numReceivers > 1024) { - cprintf(RED, - "Did you mix up the order of the arguments?\n%s\n", - getHelpMessage().c_str()); - return EXIT_FAILURE; - } - if (numReceivers == 0) { - cprintf(RED, "Invalid number of receivers.\n%s\n", - getHelpMessage().c_str()); - return EXIT_FAILURE; - } - if (argc == 4) { - withCallback = std::stoi(argv[3]); - } - } else - throw std::runtime_error("Invalid number of arguments"); - } catch (const std::exception &e) { - cprintf(RED, "Error: %s\n%s\n", e.what(), getHelpMessage().c_str()); - return EXIT_FAILURE; + // set effective id if provided + if (userid != static_cast(-1)) { + if (geteuid() == userid) { + LOG(sls::logINFO) + << "Process already has the same Effective UID " << userid; + } else { + if (seteuid(userid) != 0) { + std::ostringstream oss; + oss << "Could not set Effective UID to " << userid; + throw sls::RuntimeError(oss.str()); + } + if (geteuid() != userid) { + std::ostringstream oss; + oss << "Could not set Effective UID to " << userid << ". Got " + << geteuid(); + throw sls::RuntimeError(oss.str()); + } + LOG(sls::logINFO) << "Process Effective UID changed to " << userid; } } - cprintf(BLUE, "Parent Process Created [ Tid: %ld ]\n", (long)gettid()); - cprintf(RESET, "Number of Receivers: %d\n", numReceivers); - cprintf(RESET, "Start TCP Port: %hu\n", startTCPPort); - cprintf(RESET, "Callback Enable: %d\n", withCallback); - /** - Catch signal SIGINT to close files and call destructors properly */ struct sigaction sa; sa.sa_flags = 0; // no flags @@ -222,7 +305,7 @@ int main(int argc, char *argv[]) { sigemptyset(&sa.sa_mask); // dont block additional signals during invocation // of handler if (sigaction(SIGINT, &sa, nullptr) == -1) { - cprintf(RED, "Could not set handler function for SIGINT\n"); + LOG(sls::logERROR) << "Could not set handler function for SIGINT"; } /** - Ignore SIG_PIPE, prevents global signal handler, handle locally, @@ -234,10 +317,11 @@ int main(int argc, char *argv[]) { sigemptyset(&asa.sa_mask); // dont block additional signals during // invocation of handler if (sigaction(SIGPIPE, &asa, nullptr) == -1) { - cprintf(RED, "Could not set handler function for SIGPIPE\n"); + LOG(sls::logERROR) << "Could not set handler function for SIGPIPE"; } /** - loop over number of receivers */ + sem_init(&semaphore, 1, 0); for (int i = 0; i < numReceivers; ++i) { /** - fork process to create child process */ @@ -246,35 +330,38 @@ int main(int argc, char *argv[]) { /** - if fork failed, raise SIGINT and properly destroy all child * processes */ if (pid < 0) { - cprintf(RED, "fork() failed. Killing all the receiver objects\n"); + LOG(sls::logERROR) + << "fork() failed. Killing all the receiver objects"; raise(SIGINT); } /** - if child process */ else if (pid == 0) { - cprintf(BLUE, "Child process %d [ Tid: %ld ]\n", i, (long)gettid()); + LOG(sls::logINFOBLUE) + << "Child process " << i << " [ Tid: " << gettid() << ']'; try { - uint16_t port = startTCPPort + i; + uint16_t port = startPort + i; sls::Receiver receiver(port); /** - register callbacks. remember to set file write enable * to 0 (using the client) if we should not write files and you * will write data using the callbacks */ - if (withCallback) { + if (callbackEnabled) { /** - Call back for start acquisition */ - cprintf(BLUE, "Registering StartAcq()\n"); + LOG(sls::logINFOBLUE) << "Registering StartAcq()"; receiver.registerCallBackStartAcquisition(StartAcq, nullptr); /** - Call back for acquisition finished */ - cprintf(BLUE, "Registering AcquisitionFinished()\n"); + LOG(sls::logINFOBLUE) + << "Registering AcquisitionFinished()"; receiver.registerCallBackAcquisitionFinished( AcquisitionFinished, nullptr); /* - Call back for raw data */ - cprintf(BLUE, "Registering GetData() \n"); + LOG(sls::logINFOBLUE) << "Registering GetData()"; receiver.registerCallBackRawDataReady(GetData, nullptr); } @@ -288,8 +375,8 @@ int main(int argc, char *argv[]) { throw; } - cprintf(BLUE, "Exiting Child Process [ Tid: %ld ]\n", - (long)gettid()); + LOG(sls::logINFOBLUE) + << "Exiting Child Process [ Tid: " << gettid() << ']'; exit(EXIT_SUCCESS); } } @@ -301,12 +388,12 @@ int main(int argc, char *argv[]) { sigemptyset(&sa.sa_mask); // dont block additional signals during invocation // of handler if (sigaction(SIGINT, &sa, nullptr) == -1) { - cprintf(RED, "Could not set handler function for SIGINT\n"); + LOG(sls::logERROR) << "Could not set handler function for SIGINT"; } /** - Print Ready and Instructions how to exit */ std::cout << "Ready ... \n"; - cprintf(RESET, "\n[ Press \'Ctrl+c\' to exit ]\n"); + LOG(sls::logINFO) << "\n[ Press \'Ctrl+c\' to exit ]"; /** - Parent process waits for all child processes to exit */ for (;;) { @@ -315,18 +402,19 @@ int main(int argc, char *argv[]) { // no child closed if (childPid == -1) { if (errno == ECHILD) { - cprintf(GREEN, "All Child Processes have been closed\n"); + LOG(sls::logINFOGREEN) + << "All Child Processes have been closed"; break; } else { - cprintf(RED, "Unexpected error from waitpid(): (%s)\n", - strerror(errno)); + LOG(sls::logERROR) + << "Unexpected error from waitpid(): " << strerror(errno); break; } } // child closed - cprintf(BLUE, "Exiting Child Process [ Tid: %ld ]\n", - (long int)childPid); + LOG(sls::logINFOBLUE) + << "Exiting Child Process [ Tid: " << childPid << ']'; } std::cout << "Goodbye!\n"; diff --git a/slsReceiverSoftware/src/Receiver.cpp b/slsReceiverSoftware/src/Receiver.cpp index 41a729be8..d81ecb33a 100644 --- a/slsReceiverSoftware/src/Receiver.cpp +++ b/slsReceiverSoftware/src/Receiver.cpp @@ -27,106 +27,9 @@ namespace sls { Receiver::~Receiver() = default; -Receiver::Receiver(int argc, char *argv[]) : tcpipInterface(nullptr) { - - // options - uint16_t tcpip_port_no = 1954; - uid_t userid = -1; - - // parse command line for config - static struct option long_options[] = { - // These options set a flag. - //{"verbose", no_argument, &verbose_flag, 1}, - // These options don’t set a flag. We distinguish them by their indices. - {"rx_tcpport", required_argument, nullptr, - 't'}, // TODO change or backward compatible to "port, p"? - {"uid", required_argument, nullptr, 'u'}, - {"version", no_argument, nullptr, 'v'}, - {"help", no_argument, nullptr, 'h'}, - {nullptr, 0, nullptr, 0}}; - - // initialize global optind variable (required when instantiating multiple - // receivers in the same process) - optind = 1; - // getopt_long stores the option index here. - int option_index = 0; - int c = 0; - - std::string help_message = - "\nUsage: " + std::string(argv[0]) + " [arguments]\n" + - "Possible arguments are:\n" + - "\t-t, --rx_tcpport : TCP Communication Port with " - "client. Non-zero and 16 bit.\n" + - "\t-u, --uid : Set effective user id if receiver " - "\n" + - "\t started with privileges. \n\n"; - - while (c != -1) { - c = getopt_long(argc, argv, "hvt:u:", long_options, &option_index); - - // Detect the end of the options. - if (c == -1) - break; - - switch (c) { - - case 't': - try { - tcpip_port_no = sls::StringTo(optarg); - validatePortNumber(tcpip_port_no); - } catch (...) { - throw RuntimeError("Could not scan TCP port number." + - help_message); - } - break; - - case 'u': - if (sscanf(optarg, "%u", &userid) != 1) { - throw RuntimeError("Could not scan uid" + help_message); - } - break; - - case 'v': - std::cout << "slsReceiver Version: " << APIRECEIVER << std::endl; - LOG(logINFOBLUE) << "Exiting [ Tid: " << gettid() << " ]"; - exit(EXIT_SUCCESS); - - case 'h': - std::cout << help_message << std::endl; - exit(EXIT_SUCCESS); - default: - throw RuntimeError(help_message); - } - } - - // set effective id if provided - if (userid != static_cast(-1)) { - if (geteuid() == userid) { - LOG(logINFO) << "Process already has the same Effective UID " - << userid; - } else { - if (seteuid(userid) != 0) { - std::ostringstream oss; - oss << "Could not set Effective UID to " << userid; - throw RuntimeError(oss.str()); - } - if (geteuid() != userid) { - std::ostringstream oss; - oss << "Could not set Effective UID to " << userid << ". Got " - << geteuid(); - throw RuntimeError(oss.str()); - } - LOG(logINFO) << "Process Effective UID changed to " << userid; - } - } - - // might throw an exception - tcpipInterface = make_unique(tcpip_port_no); -} - -Receiver::Receiver(uint16_t tcpip_port_no) { - // might throw an exception - tcpipInterface = make_unique(tcpip_port_no); +Receiver::Receiver(uint16_t port) { + validatePortNumber(port); + tcpipInterface = make_unique(port); } std::string Receiver::getReceiverVersion() { diff --git a/slsReceiverSoftware/src/ReceiverApp.cpp b/slsReceiverSoftware/src/ReceiverApp.cpp index 767339869..c4b679ce7 100644 --- a/slsReceiverSoftware/src/ReceiverApp.cpp +++ b/slsReceiverSoftware/src/ReceiverApp.cpp @@ -2,11 +2,13 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package /* slsReceiver */ #include "sls/Receiver.h" +#include "sls/ToString.h" #include "sls/container_utils.h" #include "sls/logger.h" #include "sls/sls_detector_defs.h" #include //SIGINT +#include #include #include @@ -22,9 +24,84 @@ void sigInterruptHandler(int p) { sem_post(&semaphore); } int main(int argc, char *argv[]) { - sem_init(&semaphore, 1, 0); + uint16_t port = DEFAULT_TCP_RX_PORTNO; + uid_t userid = -1; - LOG(sls::logINFOBLUE) << "Created [ Tid: " << gettid() << " ]"; + std::string help_message = + "\nUsage: " + std::string(argv[0]) + " Options:\n" + + "\t-v, --version : Version of " + std::string(argv[0]) + ".\n" + + "\t-p, --port : TCP port to communicate with client for " + "configuration. Non-zero and 16 bit.\n" + + "\t-u, --uid : Set effective user id if receiver started " + "with privileges. \n\n"; + + static struct option long_options[] = { + {"help", no_argument, nullptr, 'h'}, + {"version", no_argument, nullptr, 'v'}, + {"rx_tcpport", required_argument, nullptr, 't'}, + {"port", required_argument, nullptr, 'p'}, + {"uid", required_argument, nullptr, 'u'}, + {nullptr, 0, nullptr, 0}}; + + int option_index = 0; + int opt = 0; + while (-1 != (opt = getopt_long(argc, argv, "hvt:p:u:", long_options, + &option_index))) { + + switch (opt) { + + case 't': + LOG(sls::logWARNING) + << "Deprecated option. Please use 'p' or '--port'."; + //[[fallthrough]]; TODO: for when we update to c++17 + case 'p': + try { + port = sls::StringTo(optarg); + } catch (...) { + throw sls::RuntimeError("Could not scan port number." + + help_message); + } + break; + + case 'u': + try { + userid = sls::StringTo(optarg); + } catch (...) { + throw sls::RuntimeError("Invalid uid." + help_message); + } + break; + + case 'h': + std::cout << help_message << std::endl; + exit(EXIT_SUCCESS); + default: + throw sls::RuntimeError(help_message); + } + } + + LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << " ]"; + LOG(sls::logINFO) << "Port: " << port; + + // set effective id if provided + if (userid != static_cast(-1)) { + if (geteuid() == userid) { + LOG(sls::logINFO) + << "Process already has the same Effective UID " << userid; + } else { + if (seteuid(userid) != 0) { + std::ostringstream oss; + oss << "Could not set Effective UID to " << userid; + throw sls::RuntimeError(oss.str()); + } + if (geteuid() != userid) { + std::ostringstream oss; + oss << "Could not set Effective UID to " << userid << ". Got " + << geteuid(); + throw sls::RuntimeError(oss.str()); + } + LOG(sls::logINFO) << "Process Effective UID changed to " << userid; + } + } // Catch signal SIGINT to close files and call destructors properly struct sigaction sa; @@ -47,8 +124,9 @@ int main(int argc, char *argv[]) { LOG(sls::logERROR) << "Could not set handler function for SIGPIPE"; } + sem_init(&semaphore, 1, 0); try { - sls::Receiver r(argc, argv); + sls::Receiver r(port); LOG(sls::logINFO) << "[ Press \'Ctrl+c\' to exit ]"; sem_wait(&semaphore); sem_destroy(&semaphore); From c1406efec622b52df82c3f9c644edba26e3e705d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 21 Mar 2025 00:43:14 +0100 Subject: [PATCH 04/30] updated for framesynchronizer and added versions too --- .../src/FrameSynchronizerApp.cpp | 148 ++++++++++++------ slsReceiverSoftware/src/MultiReceiverApp.cpp | 22 +-- slsReceiverSoftware/src/ReceiverApp.cpp | 9 +- 3 files changed, 116 insertions(+), 63 deletions(-) diff --git a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp index b4e08b32e..dc5d43b10 100644 --- a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp +++ b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp @@ -15,6 +15,7 @@ #include //SIGINT #include #include +#include #include #include #include @@ -507,61 +508,108 @@ void GetDataCallback(slsDetectorDefs::sls_receiver_header &header, * - Default Start TCP port is 1954 */ int main(int argc, char *argv[]) { - - // version - if (argc == 2) { - std::string sargv1 = std::string(argv[1]); - if (sargv1 == "--version" || sargv1 == "-v") { - std::cout << "slsFrameSynchronizer Version: " << APIRECEIVER - << std::endl; - exit(EXIT_SUCCESS); - } - } - - /** - set default values */ - int numReceivers = 1; - uint16_t startTCPPort = DEFAULT_TCP_RX_PORTNO; + uint16_t startPort = DEFAULT_TCP_RX_PORTNO; + uint16_t numReceivers = 1; bool printHeaders = false; + uid_t userid = -1; - /** - get number of receivers and start tcp port from command line - * arguments */ - if (argc > 1) { - try { - if (argc == 3 || argc == 4) { - startTCPPort = sls::StringTo(argv[1]); - if (startTCPPort == 0) { - throw std::runtime_error("Invalid start tcp port"); + std::string help_message = + "\nUsage: " + std::string(argv[0]) + " Options:\n" + + "\t-v, --version : Version of " + std::string(argv[0]) + ".\n" + + "\t-n, --num-receivers : Number of receivers.\n" + + "\t-p, --port : TCP port to communicate with client for " + "configuration. Non-zero and 16 bit.\n" + + "\t-c, --print-headers : Print callback headers for debugging. " + "Disabled by default.\n" + + "\t-u, --uid : Set effective user id if receiver started " + "with privileges. \n\n"; + + static struct option long_options[] = { + {"version", no_argument, nullptr, 'v'}, + {"num-receivers", required_argument, nullptr, 'n'}, + {"port", required_argument, nullptr, 'p'}, + {"print-headers", no_argument, nullptr, 'c'}, + {"uid", required_argument, nullptr, 'u'}, + {"help", no_argument, nullptr, 'h'}, + {nullptr, 0, nullptr, 0}}; + + int option_index = 0; + int opt = 0; + while (-1 != (opt = getopt_long(argc, argv, "vn:p:cu:h", long_options, + &option_index))) { + + switch (opt) { + + case 'v': + std::cout << argv[0] << " Version: " << APIRECEIVER << std::endl; + exit(EXIT_SUCCESS); + + case 'n': + try { + numReceivers = sls::StringTo(optarg); + if (numReceivers == 0 || numReceivers > 100) { + throw std::runtime_error("Invalid argument."); } - numReceivers = std::stoi(argv[2]); - if (numReceivers > 1024) { - cprintf(RED, - "Did you mix up the order of the arguments?\n%s\n", - getHelpMessage().c_str()); - return EXIT_FAILURE; - } - if (numReceivers == 0) { - cprintf(RED, "Invalid number of receivers.\n%s\n", - getHelpMessage().c_str()); - return EXIT_FAILURE; - } - if (argc == 4) { - printHeaders = sls::StringTo(argv[3]); - if (printHeaders) { - printHeadersLevel = sls::logINFOBLUE; - } - } - } else - throw std::runtime_error("Invalid number of arguments"); - } catch (const std::exception &e) { - cprintf(RED, "Error: %s\n%s\n", e.what(), getHelpMessage().c_str()); - return EXIT_FAILURE; + } catch (...) { + throw sls::RuntimeError("Invalid number of receivers." + + help_message); + } + break; + + case 'p': + try { + startPort = sls::StringTo(optarg); + } catch (...) { + throw sls::RuntimeError("Could not scan port number." + + help_message); + } + break; + + case 'c': + printHeaders = true; + break; + + case 'u': + try { + userid = sls::StringTo(optarg); + } catch (...) { + throw sls::RuntimeError("Invalid uid." + help_message); + } + break; + + case 'h': + std::cout << help_message << std::endl; + exit(EXIT_SUCCESS); + default: + throw sls::RuntimeError(help_message); } } - cprintf(RESET, "Number of Receivers: %d\n", numReceivers); - cprintf(RESET, "Start TCP Port: %hu\n", startTCPPort); - cprintf(RESET, "Print Callback Headers: %s\n\n", - (printHeaders ? "Enabled" : "Disabled")); + LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << ']'; + LOG(sls::logINFO) << "Number of Receivers: " << numReceivers; + LOG(sls::logINFO) << "Start TCP Port: " << startPort; + LOG(sls::logINFO) << "Print Callback Headers: " << printHeaders; + + // set effective id if provided + if (userid != static_cast(-1)) { + if (geteuid() == userid) { + LOG(sls::logINFO) + << "Process already has the same Effective UID " << userid; + } else { + if (seteuid(userid) != 0) { + std::ostringstream oss; + oss << "Could not set Effective UID to " << userid; + throw sls::RuntimeError(oss.str()); + } + if (geteuid() != userid) { + std::ostringstream oss; + oss << "Could not set Effective UID to " << userid << ". Got " + << geteuid(); + throw sls::RuntimeError(oss.str()); + } + LOG(sls::logINFO) << "Process Effective UID changed to " << userid; + } + } /** - Catch signal SIGINT to close files and call destructors properly */ struct sigaction sa; @@ -598,7 +646,7 @@ int main(int argc, char *argv[]) { sem_init(semaphore, 1, 0); semaphores.push_back(semaphore); - uint16_t port = startTCPPort + i; + uint16_t port = startPort + i; threads.emplace_back([i, semaphore, port, user_data]() { sls::Receiver receiver(port); receiver.registerCallBackStartAcquisition(StartAcquisitionCallback, diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 0c09e828a..73ba6dd62 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -181,8 +181,8 @@ std::string getHelpMessage() { "\t-n, --num-receivers : Number of receivers.\n" + "\t-p, --port : TCP port to communicate with client for " "configuration. Non-zero and 16 bit.\n" + - "\t-c, --callback : Enable dummy callbacks. Disabled (0) by " - "default. Prints frame header for debugging.\n" + + "\t-c, --callback : Enable dummy callbacks for debugging. " + "Disabled by default. \n" + "\t-u, --uid : Set effective user id if receiver started " "with privileges. \n\n"; } @@ -203,22 +203,26 @@ int main(int argc, char *argv[]) { std::string help_message = getHelpMessage(); static struct option long_options[] = { - {"help", no_argument, nullptr, 'h'}, {"version", no_argument, nullptr, 'v'}, {"num-receivers", required_argument, nullptr, 'n'}, {"rx_tcpport", required_argument, nullptr, 't'}, {"port", required_argument, nullptr, 'p'}, - {"callback", required_argument, nullptr, 'c'}, + {"callback", no_argument, nullptr, 'c'}, {"uid", required_argument, nullptr, 'u'}, + {"help", no_argument, nullptr, 'h'}, {nullptr, 0, nullptr, 0}}; int option_index = 0; int opt = 0; - while (-1 != (opt = getopt_long(argc, argv, "hvn:t:p:u:c:", long_options, + while (-1 != (opt = getopt_long(argc, argv, "vn:t:p:cu:h", long_options, &option_index))) { switch (opt) { + case 'v': + std::cout << argv[0] << " Version: " << APIRECEIVER << std::endl; + exit(EXIT_SUCCESS); + case 'n': try { numReceivers = sls::StringTo(optarg); @@ -234,6 +238,7 @@ int main(int argc, char *argv[]) { case 't': LOG(sls::logWARNING) << "Deprecated option. Please use 'p' or '--port'."; + //[[fallthrough]]; TODO: for when we update to c++17 case 'p': try { startPort = sls::StringTo(optarg); @@ -244,12 +249,7 @@ int main(int argc, char *argv[]) { break; case 'c': - try { - callbackEnabled = sls::StringTo(optarg); - } catch (...) { - throw sls::RuntimeError("Invalid callback enable." + - help_message); - } + callbackEnabled = true; break; case 'u': diff --git a/slsReceiverSoftware/src/ReceiverApp.cpp b/slsReceiverSoftware/src/ReceiverApp.cpp index c4b679ce7..f89bcf78b 100644 --- a/slsReceiverSoftware/src/ReceiverApp.cpp +++ b/slsReceiverSoftware/src/ReceiverApp.cpp @@ -6,6 +6,7 @@ #include "sls/container_utils.h" #include "sls/logger.h" #include "sls/sls_detector_defs.h" +#include "sls/versionAPI.h" #include //SIGINT #include @@ -36,20 +37,24 @@ int main(int argc, char *argv[]) { "with privileges. \n\n"; static struct option long_options[] = { - {"help", no_argument, nullptr, 'h'}, {"version", no_argument, nullptr, 'v'}, {"rx_tcpport", required_argument, nullptr, 't'}, {"port", required_argument, nullptr, 'p'}, {"uid", required_argument, nullptr, 'u'}, + {"help", no_argument, nullptr, 'h'}, {nullptr, 0, nullptr, 0}}; int option_index = 0; int opt = 0; - while (-1 != (opt = getopt_long(argc, argv, "hvt:p:u:", long_options, + while (-1 != (opt = getopt_long(argc, argv, "vt:p:u:h", long_options, &option_index))) { switch (opt) { + case 'v': + std::cout << argv[0] << " Version: " << APIRECEIVER << std::endl; + exit(EXIT_SUCCESS); + case 't': LOG(sls::logWARNING) << "Deprecated option. Please use 'p' or '--port'."; From 8ec0d37cc673b83e04af201b25b8cca95ea98398 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 21 Mar 2025 00:46:59 +0100 Subject: [PATCH 05/30] missed minor --- slsReceiverSoftware/src/FrameSynchronizerApp.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp index dc5d43b10..d4020a05d 100644 --- a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp +++ b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp @@ -88,21 +88,6 @@ void cleanup() { } } -/** - * prints usage of this example program - */ -std::string getHelpMessage() { - std::ostringstream os; - os << "\nUsage:\n" - << "./slsFrameSynchronizer --version or -v\n" - << "\t - Gets the slsFrameSynchronizer version\n\n" - << "./slsFrameSynchronizer [start tcp port] [num recevers] [print " - "callback headers (optional)]\n" - << "\t - tcp port has to be non-zero and 16 bit\n" - << "\t - print callback headers option is 0 (disabled) by default\n"; - return os.str(); -} - void zmq_free(void *data, void *hint) { delete[] static_cast(data); } void print_frames(const PortFrameMap &frame_port_map) { From ec3cfc1138037aa9d1d6af8e9370b0acd60c619d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 21 Mar 2025 10:24:24 +0100 Subject: [PATCH 06/30] some checks for old command line style --- slsReceiverSoftware/src/FrameSynchronizerApp.cpp | 9 ++++++++- slsReceiverSoftware/src/MultiReceiverApp.cpp | 14 +++++++++----- slsReceiverSoftware/src/ReceiverApp.cpp | 9 ++++++++- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp index d4020a05d..9950cbdd3 100644 --- a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp +++ b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp @@ -565,10 +565,17 @@ int main(int argc, char *argv[]) { case 'h': std::cout << help_message << std::endl; exit(EXIT_SUCCESS); + default: - throw sls::RuntimeError(help_message); + LOG(sls::logERROR) << help_message; + exit(EXIT_FAILURE); } } + // remaining arguments + if (optind < argc) { + LOG(sls::logERROR) << "Invalid arguments\n" << help_message; + exit(EXIT_FAILURE); + } LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << ']'; LOG(sls::logINFO) << "Number of Receivers: " << numReceivers; diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 73ba6dd62..954f1235e 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -263,14 +263,18 @@ int main(int argc, char *argv[]) { case 'h': std::cout << help_message << std::endl; exit(EXIT_SUCCESS); + default: - // maintain backward compatibility of [startport] [num-receivers] - // [callback] - GetDeprecatedCommandLineOptions(argc, argv, startPort, numReceivers, - callbackEnabled); - throw sls::RuntimeError(help_message); + LOG(sls::logERROR) << help_message; + exit(EXIT_FAILURE); } } + // if remaining arguments, maintain backward compatibility of [startport] + // [num-receivers] [callback] + if (optind < argc) { + GetDeprecatedCommandLineOptions(argc, argv, startPort, numReceivers, + callbackEnabled); + } LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << ']'; LOG(sls::logINFO) << "Number of Receivers: " << numReceivers; diff --git a/slsReceiverSoftware/src/ReceiverApp.cpp b/slsReceiverSoftware/src/ReceiverApp.cpp index f89bcf78b..bc3b99ef3 100644 --- a/slsReceiverSoftware/src/ReceiverApp.cpp +++ b/slsReceiverSoftware/src/ReceiverApp.cpp @@ -79,10 +79,17 @@ int main(int argc, char *argv[]) { case 'h': std::cout << help_message << std::endl; exit(EXIT_SUCCESS); + default: - throw sls::RuntimeError(help_message); + LOG(sls::logERROR) << help_message; + exit(EXIT_FAILURE); } } + // remaining arguments + if (optind < argc) { + LOG(sls::logERROR) << "Invalid arguments\n" << help_message; + exit(EXIT_FAILURE); + } LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << " ]"; LOG(sls::logINFO) << "Port: " << port; From 9d0ae229816582e93a941e52ecebb3086ec74d09 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 27 Mar 2025 16:25:35 +0100 Subject: [PATCH 07/30] removed exit() in most places.. should just return EXIT_SUCCESS or failure instead of exiting, which was why the unique pointer needed a release (in this case, we removed pointer for consistency) --- .../slsDetectorServer/src/slsDetectorServer.c | 22 +++++++------- slsDetectorSoftware/src/CmdApp.cpp | 4 +-- .../src/FrameSynchronizerApp.cpp | 8 ++--- slsReceiverSoftware/src/MultiReceiverApp.cpp | 30 ++++++++++--------- slsReceiverSoftware/src/ReceiverApp.cpp | 10 +++---- 5 files changed, 38 insertions(+), 36 deletions(-) diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c index d6c39d082..df17a5518 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c @@ -152,12 +152,12 @@ int main(int argc, char *argv[]) { strcpy(version, APIXILINXCTB); #endif LOG(logINFO, ("SLS Detector Server Version: %s\n", version)); - exit(EXIT_SUCCESS); + return EXIT_SUCCESS; case 'p': if (sscanf(optarg, "%d", &portno) != 1) { LOG(logERROR, ("Cannot scan port argument\n%s", helpMessage)); - exit(EXIT_FAILURE); + return EXIT_FAILURE; } LOG(logINFO, ("Detected port: %d\n", portno)); break; @@ -188,7 +188,7 @@ int main(int argc, char *argv[]) { ignoreConfigFileFlag = 1; #else LOG(logERROR, ("No server config files for this detector\n")); - exit(EXIT_FAILURE); + return EXIT_FAILURE; #endif break; @@ -196,11 +196,11 @@ int main(int argc, char *argv[]) { #if !defined(VIRTUAL) && !defined(EIGERD) LOG(logERROR, ("Cannot set master via the detector server for this " "detector\n")); - exit(EXIT_FAILURE); + return EXIT_FAILURE; #elif defined(GOTTHARD2D) || defined(EIGERD) || defined(MYTHEN3D) if (sscanf(optarg, "%d", &masterCommandLine) != 1) { LOG(logERROR, ("Cannot scan master argument\n%s", helpMessage)); - exit(EXIT_FAILURE); + return EXIT_FAILURE; } if (masterCommandLine == 1) { LOG(logINFO, ("Detector Master mode\n")); @@ -209,7 +209,7 @@ int main(int argc, char *argv[]) { } #else LOG(logERROR, ("No master implemented for this detector server\n")); - exit(EXIT_FAILURE); + return EXIT_FAILURE; #endif break; @@ -217,7 +217,7 @@ int main(int argc, char *argv[]) { #ifdef EIGERD if (sscanf(optarg, "%d", &topCommandLine) != 1) { LOG(logERROR, ("Cannot scan top argument\n%s", helpMessage)); - exit(EXIT_FAILURE); + return EXIT_FAILURE; } if (topCommandLine == 1) { LOG(logINFO, ("Detector Top mode\n")); @@ -226,16 +226,16 @@ int main(int argc, char *argv[]) { } #else LOG(logERROR, ("No top implemented for this detector server\n")); - exit(EXIT_FAILURE); + return EXIT_FAILURE; #endif break; case 'h': printf("%s", helpMessage); - exit(EXIT_SUCCESS); + return EXIT_SUCCESS; default: printf("\n%s", helpMessage); - exit(EXIT_FAILURE); + return EXIT_FAILURE; } } @@ -376,5 +376,5 @@ int main(int argc, char *argv[]) { #endif } LOG(logINFO, ("Goodbye!\n")); - return 0; + return EXIT_SUCCESS; } diff --git a/slsDetectorSoftware/src/CmdApp.cpp b/slsDetectorSoftware/src/CmdApp.cpp index facb584a8..946b4f9c2 100644 --- a/slsDetectorSoftware/src/CmdApp.cpp +++ b/slsDetectorSoftware/src/CmdApp.cpp @@ -84,7 +84,7 @@ int main(int argc, char *argv[]) { c.call(parser.command(), parser.arguments(), parser.detector_id(), action, std::cout, parser.receiver_id()); } catch (sls::RuntimeError &e) { - exit(EXIT_FAILURE); + return EXIT_FAILURE; } - exit(EXIT_SUCCESS); + return EXIT_SUCCESS; } \ No newline at end of file diff --git a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp index 9950cbdd3..95adb4b54 100644 --- a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp +++ b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp @@ -527,7 +527,7 @@ int main(int argc, char *argv[]) { case 'v': std::cout << argv[0] << " Version: " << APIRECEIVER << std::endl; - exit(EXIT_SUCCESS); + return (EXIT_SUCCESS); case 'n': try { @@ -564,17 +564,17 @@ int main(int argc, char *argv[]) { case 'h': std::cout << help_message << std::endl; - exit(EXIT_SUCCESS); + return (EXIT_SUCCESS); default: LOG(sls::logERROR) << help_message; - exit(EXIT_FAILURE); + return (EXIT_FAILURE); } } // remaining arguments if (optind < argc) { LOG(sls::logERROR) << "Invalid arguments\n" << help_message; - exit(EXIT_FAILURE); + return (EXIT_FAILURE); } LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << ']'; diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 954f1235e..c354059d1 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -139,10 +139,9 @@ void GetData(slsDetectorDefs::sls_receiver_header &header, */ void sigInterruptHandler(int p) { sem_post(&semaphore); } -void GetDeprecatedCommandLineOptions(int argc, char *argv[], - uint16_t &startPort, - uint16_t &numReceivers, - bool &callbackEnabled) { +int GetDeprecatedCommandLineOptions(int argc, char *argv[], uint16_t &startPort, + uint16_t &numReceivers, + bool &callbackEnabled) { std::string deprecatedMessage = "Detected deprecated Options. Please update.\n"; if (argc > 1) { @@ -154,12 +153,12 @@ void GetDeprecatedCommandLineOptions(int argc, char *argv[], LOG(sls::logWARNING) << deprecatedMessage; LOG(sls::logERROR) << "Did you mix up the order of the arguments?"; - exit(EXIT_FAILURE); + return slsDetectorDefs::FAIL; } if (numReceivers == 0) { LOG(sls::logWARNING) << deprecatedMessage; LOG(sls::logERROR) << "Invalid number of receivers."; - exit(EXIT_FAILURE); + return slsDetectorDefs::FAIL; } if (argc == 4) { callbackEnabled = sls::StringTo(argv[3]); @@ -169,9 +168,10 @@ void GetDeprecatedCommandLineOptions(int argc, char *argv[], } catch (const std::exception &e) { LOG(sls::logWARNING) << deprecatedMessage; LOG(sls::logERROR) << e.what(); - exit(EXIT_FAILURE); + return slsDetectorDefs::FAIL; } } + return slsDetectorDefs::OK; } std::string getHelpMessage() { @@ -221,7 +221,7 @@ int main(int argc, char *argv[]) { case 'v': std::cout << argv[0] << " Version: " << APIRECEIVER << std::endl; - exit(EXIT_SUCCESS); + return EXIT_SUCCESS; case 'n': try { @@ -262,18 +262,20 @@ int main(int argc, char *argv[]) { case 'h': std::cout << help_message << std::endl; - exit(EXIT_SUCCESS); + return EXIT_SUCCESS; default: LOG(sls::logERROR) << help_message; - exit(EXIT_FAILURE); + return EXIT_FAILURE; } } // if remaining arguments, maintain backward compatibility of [startport] // [num-receivers] [callback] if (optind < argc) { - GetDeprecatedCommandLineOptions(argc, argv, startPort, numReceivers, - callbackEnabled); + if (slsDetectorDefs::FAIL == + GetDeprecatedCommandLineOptions(argc, argv, startPort, numReceivers, + callbackEnabled)) + return EXIT_FAILURE; } LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << ']'; @@ -381,7 +383,7 @@ int main(int argc, char *argv[]) { LOG(sls::logINFOBLUE) << "Exiting Child Process [ Tid: " << gettid() << ']'; - exit(EXIT_SUCCESS); + return EXIT_SUCCESS; } } @@ -422,5 +424,5 @@ int main(int argc, char *argv[]) { } std::cout << "Goodbye!\n"; - return 0; + return EXIT_SUCCESS; } diff --git a/slsReceiverSoftware/src/ReceiverApp.cpp b/slsReceiverSoftware/src/ReceiverApp.cpp index bc3b99ef3..e33b2e96f 100644 --- a/slsReceiverSoftware/src/ReceiverApp.cpp +++ b/slsReceiverSoftware/src/ReceiverApp.cpp @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) { case 'v': std::cout << argv[0] << " Version: " << APIRECEIVER << std::endl; - exit(EXIT_SUCCESS); + return (EXIT_SUCCESS); case 't': LOG(sls::logWARNING) @@ -78,17 +78,17 @@ int main(int argc, char *argv[]) { case 'h': std::cout << help_message << std::endl; - exit(EXIT_SUCCESS); + return (EXIT_SUCCESS); default: LOG(sls::logERROR) << help_message; - exit(EXIT_FAILURE); + return (EXIT_FAILURE); } } // remaining arguments if (optind < argc) { LOG(sls::logERROR) << "Invalid arguments\n" << help_message; - exit(EXIT_FAILURE); + return (EXIT_FAILURE); } LOG(sls::logINFOBLUE) << "Current Process [ Tid: " << gettid() << " ]"; @@ -147,5 +147,5 @@ int main(int argc, char *argv[]) { } LOG(sls::logINFOBLUE) << "Exiting [ Tid: " << gettid() << " ]"; LOG(sls::logINFO) << "Exiting Receiver"; - return 0; + return EXIT_SUCCESS; } From ae19c1b102c439bc903dcfeddf87bdeaa4de31cb Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 10 Apr 2025 13:11:16 +0200 Subject: [PATCH 08/30] commenting out the example in receiver data call back changing size as it affects users using debugging mode to print out headers --- slsReceiverSoftware/src/MultiReceiverApp.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index c354059d1..5b80ca5b0 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -129,8 +129,9 @@ void GetData(slsDetectorDefs::sls_receiver_header &header, // header->packetsMask.to_string().c_str(), ((uint8_t)(*((uint8_t *)(dataPointer)))), imageSize); - // if data is modified, eg ROI and size is reduced - imageSize = 26000; + // if data is modified, can affect size + // only reduction in size allowed, not increase + // imageSize = 26000; } /** From 396ef0a2989181a09e3782c68334b21199656c9f Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 3 Jul 2025 12:01:51 +0200 Subject: [PATCH 09/30] specified number of receiver error message --- slsReceiverSoftware/src/FrameSynchronizerApp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp index ce41a9849..12b41ef7e 100644 --- a/slsReceiverSoftware/src/FrameSynchronizerApp.cpp +++ b/slsReceiverSoftware/src/FrameSynchronizerApp.cpp @@ -552,8 +552,8 @@ int main(int argc, char *argv[]) { throw std::runtime_error("Invalid argument."); } } catch (...) { - throw sls::RuntimeError("Invalid number of receivers." + - help_message); + throw sls::RuntimeError( + "Invalid number of receivers. Max: 100." + help_message); } break; From 1caf88858b6f71ca610c4505aa99379a8b486e07 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 3 Jul 2025 12:09:39 +0200 Subject: [PATCH 10/30] minor comment --- slsReceiverSoftware/src/MultiReceiverApp.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 5b80ca5b0..79a1f48c1 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -150,10 +150,11 @@ int GetDeprecatedCommandLineOptions(int argc, char *argv[], uint16_t &startPort, if (argc == 3 || argc == 4) { startPort = sls::StringTo(argv[1]); numReceivers = sls::StringTo(argv[2]); - if (numReceivers > 1024) { + if (numReceivers > 100) { LOG(sls::logWARNING) << deprecatedMessage; LOG(sls::logERROR) - << "Did you mix up the order of the arguments?"; + << "Did you mix up the order of the arguments? Max " + "number of recievers: 100"; return slsDetectorDefs::FAIL; } if (numReceivers == 0) { From e0810d973d7bcfebda88c4813e0283e3555bf4ef Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 4 Jul 2025 17:26:41 +0200 Subject: [PATCH 11/30] refactored to take out repetitive code, need to adjust for slsMulti and slsFrameSync --- slsReceiverSoftware/CMakeLists.txt | 1 + .../src/CommandLineOptions.cpp | 192 ++++++++++++++++++ slsReceiverSoftware/src/CommandLineOptions.h | 42 ++++ slsReceiverSoftware/src/MultiReceiverApp.cpp | 2 +- slsReceiverSoftware/src/Receiver.cpp | 1 + slsReceiverSoftware/src/ReceiverApp.cpp | 93 +-------- 6 files changed, 244 insertions(+), 87 deletions(-) create mode 100644 slsReceiverSoftware/src/CommandLineOptions.cpp create mode 100644 slsReceiverSoftware/src/CommandLineOptions.h diff --git a/slsReceiverSoftware/CMakeLists.txt b/slsReceiverSoftware/CMakeLists.txt index 543ff7467..50fd483ef 100755 --- a/slsReceiverSoftware/CMakeLists.txt +++ b/slsReceiverSoftware/CMakeLists.txt @@ -13,6 +13,7 @@ set(SOURCES src/Arping.cpp src/MasterAttributes.cpp src/MasterFileUtility.cpp + src/CommandLineOptions.cpp ) set(PUBLICHEADERS diff --git a/slsReceiverSoftware/src/CommandLineOptions.cpp b/slsReceiverSoftware/src/CommandLineOptions.cpp new file mode 100644 index 000000000..70606c73a --- /dev/null +++ b/slsReceiverSoftware/src/CommandLineOptions.cpp @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package + +#include "CommandLineOptions.h" +#include "sls/sls_detector_defs.h" +#include "sls/versionAPI.h" +#include "sls/ToString.h" +#include "sls/logger.h" + +ParsedOptions parseCommandLine(AppType app, int argc, char* argv[]) { + CommonOptions base; + base.port = DEFAULT_TCP_RX_PORTNO; + MultiReceiverOptions multi; + FrameSyncOptions frame; + + int opt; + int option_index = 0; + + static struct option common_opts[] = { + {"version", no_argument, nullptr, 'v'}, + {"port", required_argument, nullptr, 'p'}, + {"uid", required_argument, nullptr, 'u'}, + {"help", no_argument, nullptr, 'h'}, + {nullptr, 0, nullptr, 0} + }; + + static struct option single_opts[] = { + {"rx_tcpport", required_argument, nullptr, 't'}, + {nullptr, 0, nullptr, 0} + }; + + static struct option multi_opts[] = { + {"callback", no_argument, nullptr, 'c'}, + {"num-receivers", required_argument, nullptr, 'n'}, + {nullptr, 0, nullptr, 0} + }; + + static struct option frame_sync_opts[] = { + {"print-headers", no_argument, nullptr, 'c'}, + {"num-receivers", required_argument, nullptr, 'n'}, + {nullptr, 0, nullptr, 0} + }; + + std::vector