diff --git a/include/haproxy/cli-t.h b/include/haproxy/cli-t.h index 8f12fee42..290bda126 100644 --- a/include/haproxy/cli-t.h +++ b/include/haproxy/cli-t.h @@ -42,6 +42,8 @@ #define APPCTX_CLI_ST1_PAYLOAD (1 << 1) #define APPCTX_CLI_ST1_NOLF (1 << 2) +#define CLI_PREFIX_KW_NB 5 + /* CLI states */ enum { CLI_ST_INIT = 0, /* initial state, must leave to zero ! */ @@ -66,7 +68,7 @@ enum { struct cli_kw { - const char *str_kw[5]; /* keywords ended by NULL, limited to 5 + const char *str_kw[CLI_PREFIX_KW_NB]; /* keywords ended by NULL, limited to CLI_PREFIX_KW_NB separated keywords combination */ const char *usage; /* usage message */ int (*parse)(char **args, char *payload, struct appctx *appctx, void *private); diff --git a/include/haproxy/cli.h b/include/haproxy/cli.h index 3a4525ccf..0a4433b69 100644 --- a/include/haproxy/cli.h +++ b/include/haproxy/cli.h @@ -31,6 +31,7 @@ void cli_register_kw(struct cli_kw_list *kw_list); +struct cli_kw* cli_find_kw_exact(char **args); int cli_has_level(struct appctx *appctx, int level); diff --git a/src/cli.c b/src/cli.c index 135b6b216..ced882ace 100644 --- a/src/cli.c +++ b/src/cli.c @@ -182,6 +182,39 @@ struct cli_kw* cli_find_kw(char **args) return NULL; } +struct cli_kw* cli_find_kw_exact(char **args) +{ + struct cli_kw_list *kw_list; + int found = 0; + int i; + int j; + + if (LIST_ISEMPTY(&cli_keywords.list)) + return NULL; + + list_for_each_entry(kw_list, &cli_keywords.list, list) { + for (i = 0; kw_list->kw[i].str_kw[0]; i++) { + found = 1; + for (j = 0; j < CLI_PREFIX_KW_NB; j++) { + if (args[j] == NULL && kw_list->kw[i].str_kw[j] == NULL) { + break; + } + if (args[j] == NULL || kw_list->kw[i].str_kw[j] == NULL) { + found = 0; + break; + } + if (strcmp(args[j], kw_list->kw[i].str_kw[j]) != 0) { + found = 0; + break; + } + } + if (found) + return &kw_list->kw[i]; + } + } + return NULL; +} + void cli_register_kw(struct cli_kw_list *kw_list) { LIST_ADDQ(&cli_keywords.list, &kw_list->list);