[asterisk-commits] mvanbaak: trunk r141464 - in /trunk: channels/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sat Sep 6 07:03:12 CDT 2008
Author: mvanbaak
Date: Sat Sep 6 07:03:11 2008
New Revision: 141464
URL: http://svn.digium.com/view/asterisk?view=rev&rev=141464
Log:
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)
Modified:
trunk/channels/chan_iax2.c
trunk/channels/chan_sip.c
trunk/main/cli.c
Modified: trunk/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_iax2.c?view=diff&rev=141464&r1=141463&r2=141464
==============================================================================
--- trunk/channels/chan_iax2.c (original)
+++ trunk/channels/chan_iax2.c Sat Sep 6 07:03:11 2008
@@ -731,7 +731,7 @@
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 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 @@
" 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 @@
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 @@
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 @@
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 @@
" 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;
}
Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_sip.c?view=diff&rev=141464&r1=141463&r2=141464
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Sat Sep 6 07:03:11 2008
@@ -12740,19 +12740,25 @@
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 @@
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 @@
" 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;
}
Modified: trunk/main/cli.c
URL: http://svn.digium.com/view/asterisk/trunk/main/cli.c?view=diff&rev=141464&r1=141463&r2=141464
==============================================================================
--- trunk/main/cli.c (original)
+++ trunk/main/cli.c Sat Sep 6 07:03:11 2008
@@ -1835,7 +1835,9 @@
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)
More information about the asterisk-commits
mailing list