/**** POSIX *******************************************************************/ #include /**** RELABSD *****************************************************************/ #include #include #include #include #include /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ /******************************************************************************/ static int parse_axis ( const int argc, const char * const argv [const restrict static argc], struct relabsd_axis axes [const static RELABSD_AXIS_VALID_AXES_COUNT] ) { enum relabsd_axis_name axis_index; struct relabsd_axis *axis; if (argc < 7) { RELABSD_S_FATAL("7 parameters must be provided for axis definition."); return -1; } axis_index = relabsd_axis_parse_name(argv[0]); if (axis_index == RELABSD_UNKNOWN) { RELABSD_FATAL("Unknown axis \"%s\".", argv[0]); return -1; } axis = (axes + axis_index); if (relabsd_util_parse_int(argv[1], INT_MIN, INT_MAX, &(axis->min)) < 0) { RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); return -1; } if (relabsd_util_parse_int(argv[2], INT_MIN, INT_MAX, &(axis->max)) < 0) { RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); return -1; } if (relabsd_util_parse_int(argv[3], INT_MIN, INT_MAX, &(axis->fuzz)) < 0) { RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); return -1; } if (relabsd_util_parse_int(argv[4], INT_MIN, INT_MAX, &(axis->flat)) < 0) { RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); return -1; } if ( relabsd_util_parse_int(argv[5], INT_MIN, INT_MAX, &(axis->resolution)) < 0 ) { RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); return -1; } return 0; } /******************************************************************************/ /**** EXPORTED FUNCTIONS ******************************************************/ /******************************************************************************/ int relabsd_parameters_parse_execution_mode ( const int argc, const char * const argv [const restrict static argc], struct relabsd_parameters parameters [const restrict static 1] ) { RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing exec mode..."); if (argc < 3) { relabsd_parameters_print_usage(argv[0]); return -1; } relabsd_parameters_initialize_options(parameters); if ( RELABSD_STRING_EQUALS("-?", argv[1]) || RELABSD_STRING_EQUALS("--compatibility", argv[1]) ) { parameters->mode = RELABSD_PARAMETERS_COMPATIBILITY_TEST_MODE; parameters->physical_device_file_name = argv[2]; parameters->read_argc = 2; } else if ( RELABSD_STRING_EQUALS("-c", argv[1]) || RELABSD_STRING_EQUALS("--client", argv[1]) ) { parameters->mode = RELABSD_PARAMETERS_CLIENT_MODE; parameters->communication_node_name = argv[2]; parameters->physical_device_file_name = (const char *) NULL; parameters->read_argc = 2; } else if ( RELABSD_STRING_EQUALS("-s", argv[1]) || RELABSD_STRING_EQUALS("--server", argv[1]) ) { parameters->mode = RELABSD_PARAMETERS_SERVER_MODE; parameters->communication_node_name = argv[2]; parameters->physical_device_file_name = argv[3]; parameters->read_argc = 3; } else if ( RELABSD_STRING_EQUALS("-1", argv[1]) || RELABSD_STRING_EQUALS("--self", argv[1]) ) { parameters->mode = RELABSD_PARAMETERS_SERVER_MODE; parameters->communication_node_name = (char *) NULL; parameters->physical_device_file_name = argv[2]; parameters->read_argc = 2; } else if (argc == 3) { parameters->mode = RELABSD_PARAMETERS_SERVER_MODE; parameters->communication_node_name = (char *) NULL; parameters->physical_device_file_name = argv[1]; parameters->read_argc = 2; if (relabsd_parameters_parse_config_file(argv[2], parameters) < 0) { return -1; } } else if (argc == 4) { parameters->mode = RELABSD_PARAMETERS_SERVER_MODE; parameters->communication_node_name = (char *) NULL; parameters->physical_device_file_name = argv[1]; if (relabsd_parameters_parse_config_file(argv[2], parameters) < 0) { return -1; } parameters->device_name = argv[3]; parameters->read_argc = 3; } else { relabsd_parameters_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 * const argv [const restrict static argc], struct relabsd_parameters parameters [const restrict static 1] ) { int i; RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing options..."); /* * i = (parameters->read_argc + 1) because reading 2 params is actually * reaching the [2] element of the array, since the [0] element is the * executable name. */ for (i = (parameters->read_argc + 1); i < argc; ++i) { if ( RELABSD_STRING_EQUALS("-d", argv[i]) || RELABSD_STRING_EQUALS("--daemon", argv[i]) ) { parameters->run_as_daemon = 1; if (parameters->communication_node_name == ((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\"