]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Help prevent ringing queue members from being rung when ringinuse set to no.
authorMark Michelson <mmichelson@digium.com>
Thu, 30 Aug 2012 18:28:32 +0000 (18:28 +0000)
committerMark Michelson <mmichelson@digium.com>
Thu, 30 Aug 2012 18:28:32 +0000 (18:28 +0000)
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)

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

apps/app_queue.c

index c2c9626ff3c14168b7beec1298bb0010c5a63526..5b0da5cbf4b7e1bd1dad0b8cd5a7f06d1d12b46c 100644 (file)
@@ -3145,10 +3145,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)++;