summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2012-08-30 18:39:16 +0000
committerMark Michelson <mmichelson@digium.com>2012-08-30 18:39:16 +0000
commitc3b5ec70acf3e953f747473b033adfdbc6511f5c (patch)
tree21f85eddf4ecf93c0b5faaf22f0b4eab7f59b8e4
parentacbe1f90e704680c0ae56c0303123fde696adad3 (diff)
Help prevent ringing queue members from being rung when ringinuse set to no.
Queue member status would not always get updated properly when the member was called, thus resulting in the member getting multiple calls. With this change, we update the member's status at the time of calling, and we also check to make sure the member is still available to take the call before placing an outbound call. (closes issue ASTERISK-16115) reported by nik600 Patches: app_queue.c-svn-r370418.patch uploaded by Italo Rossi (license #6409) ........ Merged revisions 372048 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 372049 from http://svn.asterisk.org/svn/asterisk/branches/10 ........ Merged revisions 372050 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@372051 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--apps/app_queue.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index d96f287d2..1ca8dc5bd 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -3507,10 +3507,19 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
ast_channel_unlock(tmp->chan);
ast_channel_unlock(qe->chan);
- /* Place the call, but don't wait on the answer */
- if ((res = ast_call(tmp->chan, location, 0))) {
+ ao2_lock(tmp->member);
+ update_status(qe->parent, tmp->member, get_queue_member_status(tmp->member));
+ if (!qe->parent->ringinuse && (tmp->member->status != AST_DEVICE_NOT_INUSE) && (tmp->member->status != AST_DEVICE_UNKNOWN)) {
+ ast_verb(1, "Member %s is busy, cannot dial", tmp->member->interface);
+ res = -1;
+ }
+ else {
+ /* Place the call, but don't wait on the answer */
+ res = ast_call(tmp->chan, location, 0);
+ }
+ ao2_unlock(tmp->member);
+ if (res) {
/* Again, keep going even if there's an error */
- ast_debug(1, "ast call on peer returned %d\n", res);
ast_verb(3, "Couldn't call %s\n", tmp->interface);
do_hang(tmp);
(*busies)++;