/* Parses the incoming argv list. Arguments: argv, argc, cmd description Action: performs a match for every option string in the CMD description. checks the number of arguments left calls the user handler with the pointer to the correct arguments Implementation: - for each option in the table - find it in the argv list - check the required number of arguments - call the handler */ int get_cmd_parse_data(char **argv, int argc, cmd_desc_t *desc) { int rc = 0; cmd_data_t cmd; int current = 1; /* Skip daemon name */ if (argv == NULL || desc == NULL) return RC_INVALID_POINTER; do { rc = cmd_init(&cmd); if (rc != 0) break; rc = cmd_add_vals_from_argv(&cmd, argv, argc); if (rc != 0) break; while (current < cmd.argc) { cmd_desc_t *ptr = opt_search(desc, cmd.argv[current]); if (ptr == NULL) { rc = RC_CMD_PARSER_INVALID_OPTION; logit(LOG_WARNING, "Invalid option name at position %d: %s", current + 1, cmd.argv[current]); break; } // logit(LOG_NOTICE, "Found opt %d: %s", current, cmd.argv[current]); ++current; /*check arg nr required by the current option */ if (current + ptr->argno > cmd.argc) { rc = RC_CMD_PARSER_INVALID_OPTION_ARGUMENT; logit(LOG_WARNING, "Missing option value at position %d: %s", current + 1, ptr->option); break; } rc = ptr->handler.func(&cmd, current, ptr->handler.context); if (rc != 0) { logit(LOG_WARNING, "Error parsing option %s", cmd.argv[current - 1]); break; } current += ptr->argno; } } while (0); cmd_destruct(&cmd); return rc; }
/* Parses the incoming argv list. Arguments: argv, argc, cmd description Action: performs a match for every p_option string in the CMD description. checks the number of arguments left calls the user handler with the pointer to the correct arguments Implementation: - for each option in the table - find it in the argv list - check the required number of arguments - call the handler */ RC_TYPE get_cmd_parse_data(char **argv, int argc, CMD_DESCRIPTION_TYPE *p_cmd_descr) { RC_TYPE rc = RC_OK; CMD_DATA cmd; int curr_arg_nr = 1; /* without the prg name*/ if (argv == NULL || p_cmd_descr == NULL) { return RC_INVALID_POINTER; } do { rc = cmd_init(&cmd); if (rc != RC_OK) { break; } rc = cmd_add_vals_from_argv(&cmd, argv, argc); if (rc != RC_OK) { break; } while(curr_arg_nr < cmd.argc) { CMD_DESCRIPTION_TYPE *p_curr_opt = opt_search(p_cmd_descr, cmd.argv[curr_arg_nr]); if (p_curr_opt == NULL) { rc = RC_CMD_PARSER_INVALID_OPTION; DBG_PRINTF((LOG_WARNING,"W:" MODULE_TAG "Invalid option name at position %d ('%s')\n", curr_arg_nr + 1, cmd.argv[curr_arg_nr])); break; } ++curr_arg_nr; /*check arg nr required by the current option*/ if (curr_arg_nr + p_curr_opt->arg_nr > cmd.argc) { rc = RC_CMD_PARSER_INVALID_OPTION_ARGUMENT; DBG_PRINTF((LOG_WARNING,"W:" MODULE_TAG "Missing option value at position %d ('%s')\n", curr_arg_nr + 1, p_curr_opt->p_option)); break; } rc = p_curr_opt->p_handler.p_func(&cmd, curr_arg_nr, p_curr_opt->p_handler.p_context); if (rc != RC_OK) { DBG_PRINTF((LOG_WARNING,"W:" MODULE_TAG "Error parsing option %d ('%s')\n", curr_arg_nr, cmd.argv[curr_arg_nr-1])); break; } curr_arg_nr += p_curr_opt->arg_nr; } } while(0); cmd_destruct(&cmd); return rc; }