示例#1
0
int cli_execute(int arg_count, char *arg_values[])
{
	struct cli_node *node;
	struct cli_node *nodes[CLI_MAX_KEYWORDS];
	int num_nodes = CLI_MAX_KEYWORDS;
	int result = 0;
	int argc = arg_count;
	char *argv[CLI_MAX_ARGC];
	int arg;

	if (argc > 0) {
		if (argc == 1) {
			argc = cli_rl_buffer_to_argv(arg_values[0], arg_values[0] + strlen(arg_values[0]), &argv[0], CLI_MAX_ARGC);
		} else {
			for (arg = 0; arg < argc; arg++) {
				argv[arg] = arg_values[arg];
			}
			argv[argc] = NULL;
		}
		node = cli_find_command(argc, &argv[0], &nodes[0], &num_nodes);
		if (node != NULL) {
			int arg_num = 0;
			switch (node->type) {
			case CLI_NODE_TYPE_COMMAND:
				result = (*node->action)(node, 0, NULL, &arg_num);
				if (result < 0) {
					printf("Error at or near '%s'\n", argv[node->level + arg_num]);
				}
				break;
			case CLI_NODE_TYPE_KEYWORD:
				printf("Ambiguous command\n");
				break;
			case CLI_NODE_TYPE_ARG:
				result = (*node->parent->action)(node->parent, argc - node->parent->level - 1, &argv[node->parent->level + 1], &arg_num);
				if (result < 0) {
					printf("Error at or near '%s'\n", argv[node->parent->level + arg_num]);
				}
				break;
			case CLI_NODE_TYPE_END:
				break;
			}
		} else {
			printf("Error at or near '%s'\n", argv[num_nodes]);
		}
	} else if (argc < 0) {
		printf("Incomplete command\n");
	}

	return result;
}
示例#2
0
int main(int argc, char *argv[])
{
	int result;
	struct cli_node *node;
	struct cli_node *matches[30];
	int num_matches = 30;
	int match;

	cli_init("test");
	result = cli_add_commands(&cmds[0]);
	cli_dump_commands();
	printf("dump: result = %d\n", result);
	if (argc > 1) {
		node = cli_find_command(argc - 1, &argv[1], &matches[0], &num_matches);
		if (node != NULL) {
			for (match = 0; match < num_matches; match++) {
				node = matches[match];
				printf("node[%d] = %p (%s:%s)\n", match, node, 
				       node->type == CLI_NODE_TYPE_KEYWORD ? "KEYWORD" : "COMMAND",
				       node->keyword);
			}
		} else {
			printf("find: invalid command sequence\n");
		}
	} else {
		char *argv[10];

		banner("test");
		argv[0] = "test";
		argv[1] = NULL;
		node = cli_find_command(1, &argv[0], &matches[0], &num_matches);
		if (node != NULL) {
			dump_buddies(node, 0);
			dump_kids(node);
		} else {
			printf("UNMATCHED\n");
		}

		banner("tunnel");
		argv[0] = "tunnel";
		argv[1] = NULL;
		node = cli_find_command(1, &argv[0], &matches[0], &num_matches);
		if (node != NULL) {
			dump_buddies(node, 0);
			dump_kids(node);
		} else {
			printf("UNMATCHED\n");
		}

		banner("system");
		argv[0] = "system";
		argv[1] = NULL;
		node = cli_find_command(1, &argv[0], &matches[0], &num_matches);
		if (node != NULL) {
			dump_buddies(node, 0);
			dump_kids(node);
		} else {
			printf("UNMATCHED\n");
		}

		banner("system modify");
		argv[0] = "system";
		argv[1] = "modify";
		argv[2] = NULL;
		node = cli_find_command(2, &argv[0], &matches[0], &num_matches);
		if (node != NULL) {
			dump_buddies(node, 0);
			dump_kids(node);
		} else {
			printf("UNMATCHED\n");
		}

		banner("test one");
		argv[0] = "test";
		argv[1] = "one";
		argv[2] = NULL;
		node = cli_find_command(2, &argv[0], &matches[0], &num_matches);	
		if (node != NULL) {
			printf("matches node '%s', level %d\n", node->keyword, node->level);
		} else {
			printf("UNMATCHED\n");
		}

		banner("test one two run");
		argv[0] = "test";
		argv[1] = "one";
		argv[2] = "two";
		argv[3] = "run";
		argv[4] = NULL;
		node = cli_find_command(4, &argv[0], &matches[0], &num_matches);	
		printf("test one two run");
		if (node != NULL) {
			printf("matches node '%s', level %d\n", node->keyword, node->level);
		} else {
			printf("UNMATCHED\n");
		}

		banner("tunnel profile create");
		argv[0] = "tunnel";
		argv[1] = "profile";
		argv[2] = "create";
		argv[3] = NULL;
		node = cli_find_command(3, &argv[0], &matches[0], &num_matches);	
		printf("tunnel profile create ");
		if (node != NULL) {
			printf("matches node '%s', level %d\n", node->keyword, node->level);
		} else {
			printf("UNMATCHED\n");
		}

		banner("system modify trace_flags=1 more_flags=2 debug");
		argv[0] = "system";
		argv[1] = "modify";
		argv[2] = "trace_flags";
		argv[3] = "1";
		argv[4] = "more_flags";
		argv[5] = "2";
		argv[6] = "debug";
		argv[7] = NULL;
		node = cli_find_command(7, &argv[0], &matches[0], &num_matches);
		if (node != NULL) {
			printf("matches node '%s', level %d\n", node->keyword, node->level);
		} else {
			printf("UNMATCHED\n");
		}

		// exit(0);
		cli_run();
	}

	return 0;
}