app_queue: Fix CLI "queue remove member" queue_log entry.
authorRichard Mudgett <rmudgett@digium.com>
Tue, 22 Oct 2013 19:04:53 +0000 (19:04 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 22 Oct 2013 19:04:53 +0000 (19:04 +0000)
The queue_log entry resulting from CLI "queue remove member" when
log_membername_as_agent is enabled is wrong.  It always uses the interface
name instead of the member name in the queue_log entry.

* Get the queue member before removing it from the queue so the member
name is available for the queue_log entry.

(closes issue ASTERISK-21826)
Reported by: Oscar Esteve
Patches:
      fix_membername.diff (license #6505) patch uploaded by Oscar Esteve
         (modified to fix potential ref leak)
........

Merged revisions 401433 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 401434 from http://svn.asterisk.org/svn/asterisk/branches/12

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

apps/app_queue.c

index d91a020..522c602 100644 (file)
@@ -9727,6 +9727,7 @@ static char *handle_queue_remove_member(struct ast_cli_entry *e, int cmd, struct
 {
        const char *queuename, *interface;
        struct member *mem = NULL;
+       char *res = CLI_FAILURE;
 
        switch (cmd) {
        case CLI_INIT:
@@ -9748,36 +9749,39 @@ static char *handle_queue_remove_member(struct ast_cli_entry *e, int cmd, struct
        queuename = a->argv[5];
        interface = a->argv[3];
 
+       if (log_membername_as_agent) {
+               mem = find_member_by_queuename_and_interface(queuename, interface);
+       }
+
        switch (remove_from_queue(queuename, interface)) {
        case RES_OKAY:
-               if (log_membername_as_agent) {
-                       mem = find_member_by_queuename_and_interface(queuename, interface);
-               }
                if (!mem || ast_strlen_zero(mem->membername)) {
                        ast_queue_log(queuename, "CLI", interface, "REMOVEMEMBER", "%s", "");
                } else {
                        ast_queue_log(queuename, "CLI", mem->membername, "REMOVEMEMBER", "%s", "");
                }
-               if (mem) {
-                       ao2_ref(mem, -1);
-               }
                ast_cli(a->fd, "Removed interface %s from queue '%s'\n", interface, queuename);
-               return CLI_SUCCESS;
+               res = CLI_SUCCESS;
+               break;
        case RES_EXISTS:
                ast_cli(a->fd, "Unable to remove interface '%s' from queue '%s': Not there\n", interface, queuename);
-               return CLI_FAILURE;
+               break;
        case RES_NOSUCHQUEUE:
                ast_cli(a->fd, "Unable to remove interface from queue '%s': No such queue\n", queuename);
-               return CLI_FAILURE;
+               break;
        case RES_OUTOFMEMORY:
                ast_cli(a->fd, "Out of memory\n");
-               return CLI_FAILURE;
+               break;
        case RES_NOT_DYNAMIC:
                ast_cli(a->fd, "Unable to remove interface '%s' from queue '%s': Member is not dynamic\n", interface, queuename);
-               return CLI_FAILURE;
-       default:
-               return CLI_FAILURE;
+               break;
        }
+
+       if (mem) {
+               ao2_ref(mem, -1);
+       }
+
+       return res;
 }
 
 static char *complete_queue_pause_member(const char *line, const char *word, int pos, int state)