コード例 #1
0
ファイル: cmd.c プロジェクト: andy-padavan/rt-n56u
/*
  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;
}
コード例 #2
0
ファイル: get_cmd.c プロジェクト: houzhenggang/ralink_sdk
/*
	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;
}