From 4ae7a4b1bad98840171ab374aede43b16c9ac89b Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Tue, 22 Oct 2013 19:04:53 +0000 Subject: app_queue: Fix CLI "queue remove member" queue_log entry. 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 | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'apps/app_queue.c') diff --git a/apps/app_queue.c b/apps/app_queue.c index d91a02013..522c602c1 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -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) -- cgit v1.2.3