diff options
author | mvanbaak <mvanbaak@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-09-06 12:03:11 +0000 |
---|---|---|
committer | mvanbaak <mvanbaak@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-09-06 12:03:11 +0000 |
commit | 02e84822e5e5e46e792b433d8f600e3ba95762cf (patch) | |
tree | ca4cc6ba18e876ee69cbdfd12b5c25bba6d9702b | |
parent | 3ddf849214c18117c10802b85d85211f19bd42f1 (diff) |
Some fixes to autocompletion in some commands.
Changes applied by this patch:
- Fix autocompletion in 'sip prune realtime', sip peers where never auto completed. Now we complete this command with:
'sip prune realtime peer' -> all | like | sip peers
Also I have modified the syntax in the usage, was wrong...
- Pass ast_cli_args->argv and ast_cli_args->argc while running autocompletion on CLI commands (CLI_GENERATE).
With this we avoid comparisons on ast_cli_args->line like this:
strcasestr(a->line, " description")
strcasestr(a->line, "descriptions ")
strcasestr(a->line, "realtime peer"), and so on..
Making the code more confusing (check the spaces in description!).
The only thing we must be sure is to first check a->pos or a->argc.
- Fix 'iax2 prune realtime' autocompletion, now we autocomplete this command with 'all' & 'iax2 peers', check a look that iax2 peers where all the peers, now only the ones in the cache..
(closes issue #13133)
Reported by: eliel
Patches:
clichanges.patch uploaded by eliel (license 64)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@141464 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channels/chan_iax2.c | 27 | ||||
-rw-r--r-- | channels/chan_sip.c | 24 | ||||
-rw-r--r-- | main/cli.c | 4 |
3 files changed, 35 insertions, 20 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index ce1fac982..31d9ccf2e 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -731,7 +731,7 @@ static void reg_source_db(struct iax2_peer *p); static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin); static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt); -static char *complete_iax2_peers(const char *line, const char *word, int pos, int state); +static char *complete_iax2_peers(const char *line, const char *word, int pos, int state, int flags); static char *complete_iax2_unregister(const char *line, const char *word, int pos, int state); enum iax2_thread_iostate { @@ -2461,6 +2461,8 @@ static int attempt_transmit(const void *data) static char *handle_cli_iax2_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { struct iax2_peer *peer; + static char *choices[] = { "all", NULL }; + char *cmplt; switch (cmd) { case CLI_INIT: @@ -2470,18 +2472,22 @@ static char *handle_cli_iax2_prune_realtime(struct ast_cli_entry *e, int cmd, st " Prunes object(s) from the cache\n"; return NULL; case CLI_GENERATE: - if (a->pos == 3) - return complete_iax2_peers(a->line, a->word, a->pos, a->n); + if (a->pos == 3) { + cmplt = ast_cli_complete(a->word, choices, a->n); + if (!cmplt) + cmplt = complete_iax2_peers(a->line, a->word, a->pos, a->n - sizeof(choices), IAX_RTCACHEFRIENDS); + return cmplt; + } return NULL; } if (a->argc != 4) - return CLI_SHOWUSAGE; + return CLI_SHOWUSAGE; if (!strcmp(a->argv[3], "all")) { reload_config(); ast_cli(a->fd, "Cache flushed successfully.\n"); } else if ((peer = find_peer(a->argv[3], 0))) { - if(ast_test_flag(peer, IAX_RTCACHEFRIENDS)) { + if (ast_test_flag(peer, IAX_RTCACHEFRIENDS)) { ast_set_flag(peer, IAX_RTAUTOCLEAR); expire_registry(peer_ref(peer)); ast_cli(a->fd, "Peer %s was removed from the cache.\n", a->argv[3]); @@ -2627,7 +2633,7 @@ static char *handle_cli_iax2_show_peer(struct ast_cli_entry *e, int cmd, struct return NULL; case CLI_GENERATE: if (a->pos == 3) - return complete_iax2_peers(a->line, a->word, a->pos, a->n); + return complete_iax2_peers(a->line, a->word, a->pos, a->n, 0); return NULL; } @@ -2683,7 +2689,7 @@ static char *handle_cli_iax2_show_peer(struct ast_cli_entry *e, int cmd, struct return CLI_SUCCESS; } -static char *complete_iax2_peers(const char *line, const char *word, int pos, int state) +static char *complete_iax2_peers(const char *line, const char *word, int pos, int state, int flags) { int which = 0; struct iax2_peer *peer; @@ -2693,7 +2699,8 @@ static char *complete_iax2_peers(const char *line, const char *word, int pos, in i = ao2_iterator_init(peers, 0); while ((peer = ao2_iterator_next(&i))) { - if (!strncasecmp(peer->name, word, wordlen) && ++which > state) { + if (!strncasecmp(peer->name, word, wordlen) && ++which > state + && (!flags || ast_test_flag(peer, flags))) { res = ast_strdup(peer->name); peer_unref(peer); break; @@ -5642,8 +5649,8 @@ static char *handle_cli_iax2_set_debug(struct ast_cli_entry *e, int cmd, struct " Enables/Disables dumping of IAX packets for debugging purposes.\n"; return NULL; case CLI_GENERATE: - if (a->pos == 4) - return complete_iax2_peers(a->line, a->word, a->pos, a->n); + if (a->pos == 4 && !strcasecmp(a->argv[3], "peer")) + return complete_iax2_peers(a->line, a->word, a->pos, a->n, 0); return NULL; } diff --git a/channels/chan_sip.c b/channels/chan_sip.c index c1e21d4e3..4f122e351 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -12740,19 +12740,25 @@ static char *sip_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli char *name = NULL; regex_t regexbuf; struct ao2_iterator i; + static char *choices[] = { "all", "like", NULL }; + char *cmplt; if (cmd == CLI_INIT) { - e->command = "sip prune realtime [peer|all] [all|like]"; + e->command = "sip prune realtime [peer|all]"; e->usage = - "Usage: sip prune realtime [peer] [<name>|all|like <pattern>]\n" + "Usage: sip prune realtime [peer [<name>|all|like <pattern>]|all]\n" " Prunes object(s) from the cache.\n" " Optional regular expression pattern is used to filter the objects.\n"; return NULL; } else if (cmd == CLI_GENERATE) { - if (a->pos == 4) { - if (strcasestr(a->line, "realtime peer")) - return complete_sip_peer(a->word, a->n, SIP_PAGE2_RTCACHEFRIENDS); - } + if (a->pos == 4 && !strcasecmp(a->argv[3], "peer")) { + cmplt = ast_cli_complete(a->word, choices, a->n); + if (!cmplt) + cmplt = complete_sip_peer(a->word, a->n - sizeof(choices), SIP_PAGE2_RTCACHEFRIENDS); + return cmplt; + } + if (a->pos == 5 && !strcasecmp(a->argv[4], "like")) + return complete_sip_peer(a->word, a->n, SIP_PAGE2_RTCACHEFRIENDS); return NULL; } switch (a->argc) { @@ -12778,9 +12784,9 @@ static char *sip_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli multi = TRUE; } else return CLI_SHOWUSAGE; - if (!strcasecmp(a->argv[4], "like")) + if (!strcasecmp(name, "like")) return CLI_SHOWUSAGE; - if (!multi && !strcasecmp(a->argv[4], "all")) { + if (!multi && !strcasecmp(name, "all")) { multi = TRUE; name = NULL; } @@ -14384,7 +14390,7 @@ static char *sip_do_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args " IP address or registered peer.\n"; return NULL; } else if (cmd == CLI_GENERATE) { - if (a->pos == 4 && strcasestr(a->line, " peer")) /* XXX should check on argv too */ + if (a->pos == 4 && !strcasecmp(a->argv[3], "peer")) return complete_sip_peer(a->word, a->n, 0); return NULL; } diff --git a/main/cli.c b/main/cli.c index 8459ea35d..f07d8b015 100644 --- a/main/cli.c +++ b/main/cli.c @@ -1835,7 +1835,9 @@ static char *__ast_cli_generator(const char *text, const char *word, int state, struct ast_cli_args a = { .line = matchstr, .word = word, .pos = argindex, - .n = state - matchnum }; + .n = state - matchnum, + .argv = argv, + .argc = x}; ret = e->handler(e, CLI_GENERATE, &a); } if (ret) |