--- ../clean/asterisk-1.6.2.17-rc2/apps/app_queue.c 2010-12-16 22:49:33.000000000 +0200 +++ apps/app_queue.c 2011-02-17 12:58:43.000000000 +0200 @@ -675,6 +675,7 @@ unsigned int dead:1; /*!< Used to detect members deleted in realtime */ unsigned int delme:1; /*!< Flag to delete entry on reload */ char rt_uniqueid[80]; /*!< Unique id of realtime member entry */ + unsigned int ignorebusy:1; /*!< Flag to ignore member if the status is not available */ }; enum empty_conditions { @@ -1590,7 +1600,7 @@ * Search for member in queue, if found update penalty/paused state, * if no member exists create one flag it as a RT member and add to queue member list. */ -static void rt_handle_member_record(struct call_queue *q, char *interface, const char *rt_uniqueid, const char *membername, const char *penalty_str, const char *paused_str, const char* state_interface) +static void rt_handle_member_record(struct call_queue *q, char *interface, const char *rt_uniqueid, const char *membername, const char *penalty_str, const char *paused_str, const char* state_interface, const char *ignorebusy) { struct member *m; struct ao2_iterator mem_iter; @@ -1606,7 +1616,7 @@ if (penalty_str) { penalty = atoi(penalty_str); if (penalty < 0) - penalty = 0; + return; } if (paused_str) { @@ -1627,6 +1637,7 @@ ast_copy_string(m->state_interface, state_interface, sizeof(m->state_interface)); } m->penalty = penalty; + m->ignorebusy = ast_true(ignorebusy); found = 1; ao2_ref(m, -1); break; @@ -1640,6 +1651,7 @@ if ((m = create_queue_member(interface, membername, penalty, paused, state_interface))) { m->dead = 0; m->realtime = 1; + m->ignorebusy = ast_true(ignorebusy); ast_copy_string(m->rt_uniqueid, rt_uniqueid, sizeof(m->rt_uniqueid)); ast_queue_log(q->name, "REALTIME", m->interface, "ADDMEMBER", "%s", ""); ao2_link(q->members, m); @@ -1815,7 +1827,8 @@ S_OR(ast_variable_retrieve(member_config, interface, "membername"),interface), ast_variable_retrieve(member_config, interface, "penalty"), ast_variable_retrieve(member_config, interface, "paused"), - S_OR(ast_variable_retrieve(member_config, interface, "state_interface"),interface)); + S_OR(ast_variable_retrieve(member_config, interface, "state_interface"),interface), + ast_variable_retrieve(member_config, interface, "ignorebusy")); } /* Delete all realtime members that have been deleted in DB. */ @@ -1941,7 +1954,8 @@ S_OR(ast_variable_retrieve(member_config, interface, "membername"), interface), ast_variable_retrieve(member_config, interface, "penalty"), ast_variable_retrieve(member_config, interface, "paused"), - S_OR(ast_variable_retrieve(member_config, interface, "state_interface"), interface)); + S_OR(ast_variable_retrieve(member_config, interface, "state_interface"), interface), + ast_variable_retrieve(member_config, interface, "ignorebusy")); } /* Delete all realtime members that have been deleted in DB. */ @@ -2346,7 +2360,7 @@ while ((mem = ao2_iterator_next(&mem_iter))) { switch (mem->status) { case AST_DEVICE_INUSE: - if (!q->ringinuse) + if ((!q->ringinuse) || (!mem->ignorebusy)) break; /* else fall through */ case AST_DEVICE_NOT_INUSE: @@ -2495,7 +2509,7 @@ return 0; } - if (!qe->parent->ringinuse && (tmp->member->status != AST_DEVICE_NOT_INUSE) && (tmp->member->status != AST_DEVICE_UNKNOWN)) { + if ((!qe->parent->ringinuse || !tmp->member->ignorebusy) && (tmp->member->status != AST_DEVICE_NOT_INUSE) && (tmp->member->status != AST_DEVICE_UNKNOWN)) { ast_debug(1, "%s in use, can't receive call\n", tmp->interface); if (qe->chan->cdr) ast_cdr_busy(qe->chan->cdr);