--- ../clean/asterisk-1.6.2.16.1/apps/app_queue.c 2010-09-17 23:08:00.000000000 +0200 +++ ./app_queue.c 2011-02-10 18:59:00.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 +1591,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; @@ -1627,6 +1628,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 +1642,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 +1818,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 +1945,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 +2351,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: