summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-23 15:44:19 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-23 15:44:19 +0100
commit390576c3839ee7abb845e27b7267de45495e6b2f (patch)
treec481c37c868ccc65a3476f60b17369b21a90b79b /src/config/parameters.c
parent4355548f79375a62bb5e3bb5695190d48e4c0bc3 (diff)
Starting to turn relabsd into a proper daemon...
Diffstat (limited to 'src/config/parameters.c')
-rw-r--r--src/config/parameters.c287
1 files changed, 287 insertions, 0 deletions
diff --git a/src/config/parameters.c b/src/config/parameters.c
new file mode 100644
index 0000000..308e5db
--- /dev/null
+++ b/src/config/parameters.c
@@ -0,0 +1,287 @@
+/**** POSIX *******************************************************************/
+#include <limits.h>
+
+/**** RELABSD *****************************************************************/
+#include <relabsd/config.h>
+#include <relabsd/debug.h>
+
+#include <relabsd/device/axis.h>
+
+#include <relabsd/util/string.h>
+
+#include <relabsd/config/parameters.h>
+
+/******************************************************************************/
+/**** LOCAL FUNCTIONS *********************************************************/
+/******************************************************************************/
+static void print_usage (const char exec [const restrict static 1])
+{
+ printf
+ (
+ "USAGE: %s [<MODE>] [<OPTION>+]\n\n"
+
+ "<MODE>:\n"
+ "\t[-c | --client] <server_file>:\n"
+ "\t\tSends the commands to a given server instance.\n\n"
+
+ "\t[-s | --server] <server_file>:\n"
+ "\t\tCreates a named server instance.\n\n"
+
+ "\t[-1 | --self]:\n"
+ "\t\tCreates a unnamed server instance.\n\n"
+
+ "<OPTION>:\n"
+ "\t[-d | --daemon]:\n"
+ "\t\tRuns server instance in the background.\n\n"
+
+ "\t[-n | --name] <relabsd_device_name>:\n"
+ "\t\tNames the virtual device.\n\n"
+
+ "\t[-t | --timeout] <timeout_in_ms>:\n"
+ "\t\tSets a zeroing timeout (0 to disable).\n\n"
+
+ "\t[-a | --axis] <name> <min> <max> <fuzz> <flat> <resolution> "
+ "<options>:\n"
+ "\t\t(Re)defines an axis.\n\n"
+
+ "\t[-f | --config] <config_file>"
+ "<options>:\n"
+ "\t\t(Re)defines an axis.\n",
+ exec
+ );
+}
+
+static int parse_axis
+(
+ const int argc,
+ const char * argv [const restrict static argc],
+ struct relabsd_axis axes [const restrict static RELABSD_AXIS_AXES_COUNT]
+)
+{
+ enum relabsd_axis_name axis_name;
+ struct relabsd_axis *axis;
+
+ if (argc < 7)
+ {
+ RELABSD_S_FATAL("7 parameters must be provided for axis definition.");
+
+ return -1;
+ }
+
+ axis_index = relabsd_axis_from_name(argv[0]);
+
+ if (axis_index == RELABSD_UNKNOWN)
+ {
+ RELABSD_FATAL("Unknown axis \"%s\".", argv[0]);
+
+ return -1;
+ }
+
+ axis = (axes + axis_index);
+
+ axis->min = atoi(argv[1]);
+ axis->max = atoi(argv[2]);
+ axis->fuzz = atoi(argv[3]);
+ axis->flat = atoi(argv[4]);
+ axis->resolution = atoi(argv[5]);
+
+
+ return 0;
+}
+
+/******************************************************************************/
+/**** EXPORTED FUNCTIONS ******************************************************/
+/******************************************************************************/
+int relabsd_parameters_parse_execution_mode
+(
+ const int argc,
+ const char * argv [const restrict static argc],
+ struct relabsd_parameters params [const restrict static 1]
+)
+{
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing exec mode...");
+
+ if (argc < 3)
+ {
+ print_usage(argv[0]);
+
+ return -1;
+ }
+
+ if
+ (
+ RELABSD_STRING_EQUALS("-c", argv[1])
+ || RELABSD_STRING_EQUALS("--client", argv[1])
+ )
+ {
+ params->mode = RELABSD_PARAMETERS_CLIENT_MODE;
+ params->node = argv[2];
+ params->read_argc = 2;
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-s", argv[1])
+ || RELABSD_STRING_EQUALS("--server", argv[1])
+ )
+ {
+ params->mode = RELABSD_PARAMETERS_CLIENT_MODE;
+ params->node = argv[2];
+ params->read_argc = 2;
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-1", argv[1])
+ || RELABSD_STRING_EQUALS("--self", argv[1])
+ )
+ {
+ params->mode = RELABSD_PARAMETERS_SERVER_MODE;
+ params->node = (char *) NULL;
+ params->read_argc = 1;
+ }
+ else
+ {
+ print_usage(argv[0]);
+
+ return -1;
+ }
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsed exec mode.");
+
+ return 0;
+}
+
+int relabsd_parameters_parse_options
+(
+ const int argc,
+ const char * argv [const restrict static argc],
+ struct relabsd_parameters params [const restrict static 1]
+)
+{
+ int i;
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing options...");
+
+ set_default_options(params);
+
+ for (i = params->read_argc; i < argc; ++i)
+ {
+ if
+ (
+ RELABSD_STRING_EQUALS("-d", argv[i])
+ || RELABSD_STRING_EQUALS("--daemon", argv[i])
+ )
+ {
+ params->run_as_daemon = 1;
+
+ if (params->node == ((char *) NULL))
+ {
+ RELABSD_S_WARNING
+ (
+ "Running as a daemon without any communication file."
+ );
+ }
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-n", argv[i])
+ || RELABSD_STRING_EQUALS("--name", argv[i])
+ )
+ {
+ if (argc == i)
+ {
+ RELABSD_FATAL("Missing value for \"%s\" <OPTION>.", argv[i]);
+
+ return -1;
+ }
+
+ ++i;
+ params->name = argv[i];
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-t", argv[i])
+ || RELABSD_STRING_EQUALS("--timeout", argv[i])
+ )
+ {
+ if (argc == i)
+ {
+ RELABSD_FATAL("Missing value for \"%s\" <OPTION>.", argv[i]);
+ print_usage(argv[0]);
+
+ return -1;
+ }
+
+ ++i;
+
+ if
+ (
+ relabsd_util_parse_int(argv[i], 0, INT_MAX, &(params->timeout))
+ < 0
+ )
+ {
+ RELABSD_FATAL
+ (
+ "Invalid value for \"%s\" <OPTION> (valid range is [%d, %d]).",
+ argv[i - 1],
+ 0,
+ INT_MAX
+ );
+
+ print_usage(argv[0]);
+
+ return -1;
+ }
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-a", argv[i])
+ || RELABSD_STRING_EQUALS("--axis", argv[i])
+ )
+ {
+ if (argc == i)
+ {
+ RELABSD_FATAL("Missing values for \"%s\" <OPTION>.", argv[i]);
+ print_usage(argv[0]);
+
+ return -1;
+ }
+
+ ++i;
+
+ if (parse_axis((argc - i), (argv + i), params->axes) < 0)
+ {
+ print_usage(argv[0]);
+
+ return -1;
+ }
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-f", argv[i])
+ || RELABSD_STRING_EQUALS("--config", argv[i])
+ )
+ {
+ if (argc == i)
+ {
+ RELABSD_FATAL("Missing value for \"%s\" <OPTION>.", argv[i]);
+ print_usage(argv[0]);
+
+ return -1;
+ }
+
+ ++i;
+ params->config_file = argv[i];
+ }
+ else
+ {
+ RELABSD_FATAL("Unknown <OPTION> \"%s\".", argv[i]);
+ print_usage(argv[0]);
+
+ return -1;
+ }
+ }
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsed options.");
+
+ return 0;
+}