diff options
author | Damien Wedhorn <voip@facts.com.au> | 2013-02-19 06:50:57 +0000 |
---|---|---|
committer | Damien Wedhorn <voip@facts.com.au> | 2013-02-19 06:50:57 +0000 |
commit | 96025d5dfce87cb13aee552d69b4bded822a389e (patch) | |
tree | d57c67b34d70430d736abf1f4f4a91ec2897490c /channels/chan_skinny.c | |
parent | 4c76dbc8b29089af496e8c6677dd53386b81fca7 (diff) |
Fixup skinny CLI completion.
Auto complete for skinny debug allows multiple options and negation, also add
debug all option. Usage example: 'skinny debug all -packets' (each can be
autocompleted including -packet).
Change show device to use device name. Remove the duplicate ast_strdup's from
place calling device complete return immediately from complete devicename and
complete linename so that multiple options are displayed on the CLI if more
than one option available.
Review: https://reviewboard.asterisk.org/r/2333/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@381717 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_skinny.c')
-rw-r--r-- | channels/chan_skinny.c | 62 |
1 files changed, 49 insertions, 13 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 2730c9d26..e42c7a7c0 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -3531,6 +3531,36 @@ static char *skinny_debugs(void) return dbgcli_buf; } +static char *complete_skinny_debug(const char *line, const char *word, int pos, int state) +{ + const char *debugOpts[]={ "all","audio","hint","lock","off","packet","show","sub","template","thread",NULL }; + char *wordptr = (char *)word; + char buf[32]; + char *bufptr = buf; + int buflen = sizeof(buf); + int wordlen; + int which = 0; + int i = 0; + + if (*word == '+' || *word == '-' || *word == '!') { + *bufptr = *word; + wordptr++; + bufptr++; + buflen--; + } + wordlen = strlen(wordptr); + + while (debugOpts[i]) { + if (!strncasecmp(wordptr, debugOpts[i], wordlen) && ++which > state) { + ast_copy_string(bufptr, debugOpts[i], buflen); + return ast_strdup(buf); + } + i++; + } + + return NULL; +} + static char *handle_skinny_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { int i; @@ -3541,13 +3571,14 @@ static char *handle_skinny_set_debug(struct ast_cli_entry *e, int cmd, struct as switch (cmd) { case CLI_INIT: - e->command = "skinny debug {audio|hint|lock|off|packet|show|sub|template|thread}"; + e->command = "skinny debug"; e->usage = "Usage: skinny debug {audio|hint|lock|off|packet|show|sub|template|thread}\n" " Enables/Disables various Skinny debugging messages\n"; return NULL; case CLI_GENERATE: - return NULL; + return complete_skinny_debug(a->line, a->word, a->pos, a->n); + } if (a->argc < 3) @@ -3558,7 +3589,7 @@ static char *handle_skinny_set_debug(struct ast_cli_entry *e, int cmd, struct as return CLI_SUCCESS; } - for(i = e->args-1; i < a->argc; i++) { + for(i = e->args; i < a->argc; i++) { result++; arg = a->argv[i]; @@ -3567,6 +3598,11 @@ static char *handle_skinny_set_debug(struct ast_cli_entry *e, int cmd, struct as continue; } + if (!strncasecmp(arg, "all", 3)) { + skinnydebug = DEBUG_GENERAL|DEBUG_SUB|DEBUG_PACKET|DEBUG_AUDIO|DEBUG_LOCK|DEBUG_TEMPLATE|DEBUG_THREAD|DEBUG_HINT; + continue; + } + if (!strncasecmp(arg, "-", 1) || !strncasecmp(arg, "!", 1)) { negate = 1; arg++; @@ -3638,32 +3674,31 @@ static char *handle_skinny_reload(struct ast_cli_entry *e, int cmd, struct ast_c static char *complete_skinny_devices(const char *word, int state) { struct skinny_device *d; - char *result = NULL; int wordlen = strlen(word), which = 0; AST_LIST_TRAVERSE(&devices, d, list) { - if (!strncasecmp(word, d->id, wordlen) && ++which > state) - result = ast_strdup(d->id); + if (!strncasecmp(word, d->name, wordlen) && ++which > state) { + return ast_strdup(d->name); + } } - return result; + return NULL; } static char *complete_skinny_show_device(const char *line, const char *word, int pos, int state) { - return (pos == 3 ? ast_strdup(complete_skinny_devices(word, state)) : NULL); + return (pos == 3 ? complete_skinny_devices(word, state) : NULL); } static char *complete_skinny_reset(const char *line, const char *word, int pos, int state) { - return (pos == 2 ? ast_strdup(complete_skinny_devices(word, state)) : NULL); + return (pos == 2 ? complete_skinny_devices(word, state) : NULL); } static char *complete_skinny_show_line(const char *line, const char *word, int pos, int state) { struct skinny_device *d; struct skinny_line *l; - char *result = NULL; int wordlen = strlen(word), which = 0; if (pos != 3) @@ -3671,12 +3706,13 @@ static char *complete_skinny_show_line(const char *line, const char *word, int p AST_LIST_TRAVERSE(&devices, d, list) { AST_LIST_TRAVERSE(&d->lines, l, list) { - if (!strncasecmp(word, l->name, wordlen) && ++which > state) - result = ast_strdup(l->name); + if (!strncasecmp(word, l->name, wordlen) && ++which > state) { + return ast_strdup(l->name); + } } } - return result; + return NULL; } static char *handle_skinny_reset(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |