diff options
-rw-r--r-- | accel-pppd/cli/cli.c | 41 | ||||
-rw-r--r-- | accel-pppd/cli/cli.h | 5 |
2 files changed, 42 insertions, 4 deletions
diff --git a/accel-pppd/cli/cli.c b/accel-pppd/cli/cli.c index 7ed2c44..e7e9e92 100644 --- a/accel-pppd/cli/cli.c +++ b/accel-pppd/cli/cli.c @@ -68,6 +68,16 @@ void __export cli_register_regexp_cmd(struct cli_regexp_cmd_t *cmd) int erroffset; const char *errptr; + if (cmd->exec == NULL) { + log_emerg("cli: impossible to register regexp command" + " without an execution callback function\n"); + _exit(EXIT_FAILURE); + } + if (cmd->pattern == NULL) { + log_emerg("cli: impossible to register regexp command" + " without pattern\n"); + _exit(EXIT_FAILURE); + } cmd->re = pcre_compile2(cmd->pattern, cmd->options, &err, &errptr, &erroffset, NULL); if (!cmd->re) { @@ -77,6 +87,23 @@ void __export cli_register_regexp_cmd(struct cli_regexp_cmd_t *cmd) cmd->pattern + erroffset); _exit(EXIT_FAILURE); } + + if (cmd->h_pattern) { + cmd->h_re = pcre_compile2(cmd->h_pattern, cmd->h_options, &err, + &errptr, &erroffset, NULL); + if (!cmd->h_re) { + log_emerg("cli: failed to compile help regexp \"%s\":" + " %s (error %i) at position %i (unprocessed" + " characters: \"%s\")\n", + cmd->h_pattern, errptr, err, erroffset, + cmd->h_pattern + erroffset); + _exit(EXIT_FAILURE); + } + } else { + cmd->h_re = NULL; + cmd->h_pattern = NULL; + } + list_add_tail(&cmd->entry, ®exp_cmd_list); } @@ -153,10 +180,18 @@ static int cli_process_help_cmd(struct cli_client_t *cln) if (!isblank(cmd[helpcmd_len]) && cmd[helpcmd_len] != '\0') return 0; + cmd = skip_space(cmd + helpcmd_len); + + list_for_each_entry(recmd, ®exp_cmd_list, entry) { + if (cmd[0] == '\0' + || pcre_exec(recmd->h_re, NULL, cmd, strlen(cmd), + 0, 0, NULL, 0) >= 0) { + if (recmd->help) + recmd->help(cmd, cln); + } + } + nb_items = split(cmd, items); - list_for_each_entry(recmd, ®exp_cmd_list, entry) - if (recmd->help) - recmd->help(items, nb_items, cln); list_for_each_entry(sicmd, &simple_cmd_list, entry) if (sicmd->help) sicmd->help(items, nb_items, cln); diff --git a/accel-pppd/cli/cli.h b/accel-pppd/cli/cli.h index 1fbb985..b02b2bb 100644 --- a/accel-pppd/cli/cli.h +++ b/accel-pppd/cli/cli.h @@ -26,7 +26,10 @@ struct cli_regexp_cmd_t const char *pattern; int options; int (*exec)(const char *cmd, void *client); - int (*help)(char * const *fields, int field_cnt, void *client); + pcre *h_re; + const char *h_pattern; + int h_options; + int (*help)(const char *cmd, void *client); }; struct ap_session; |