Add CLI tab completion to 'acl show'.
authorRussell Bryant <russell@russellbryant.com>
Thu, 6 Dec 2012 15:06:47 +0000 (15:06 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 6 Dec 2012 15:06:47 +0000 (15:06 +0000)
The 'acl show' CLI command allows you to show the details about a specific
named ACL in acl.conf.  This patch adds tab completion to the command.

Review: https://reviewboard.asterisk.org/r/2230/

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@377329 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/named_acl.c

index a70ca87..1127bca 100644 (file)
@@ -503,6 +503,13 @@ static void cli_display_named_acl_list(int fd)
 /* \brief ACL command show <name> */
 static char *handle_show_named_acl_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
+       RAII_VAR(struct named_acl_config *, cfg, ao2_global_obj_ref(globals), ao2_cleanup);
+       int length;
+       int which;
+       struct ao2_iterator i;
+       struct named_acl *named_acl;
+       char *match = NULL;
+
        switch (cmd) {
        case CLI_INIT:
                e->command = "acl show";
@@ -511,7 +518,23 @@ static char *handle_show_named_acl_cmd(struct ast_cli_entry *e, int cmd, struct
                        "   Shows a list of named ACLs or lists all entries in a given named ACL.\n";
                return NULL;
        case CLI_GENERATE:
-               return NULL;
+               if (!cfg) {
+                       return NULL;
+               }
+               length = strlen(a->word);
+               which = 0;
+               i = ao2_iterator_init(cfg->named_acl_list, 0);
+               while ((named_acl = ao2_iterator_next(&i))) {
+                       if (!strncasecmp(a->word, named_acl->name, length) && ++which > a->n) {
+                               match = ast_strdup(named_acl->name);
+                               ao2_ref(named_acl, -1);
+                               break;
+                       }
+                       ao2_ref(named_acl, -1);
+               }
+               ao2_iterator_destroy(&i);
+               return match;
+
        }
 
        if (a->argc == 2) {