static struct ast_channel *my_ast_get_channel_by_name_locked(char *channame) { struct ast_channel *chan; chan = ast_channel_walk_locked(NULL); while(chan) { if (!strncasecmp(chan->name, channame, strlen(channame))) return chan; ast_mutex_unlock(&chan->lock); chan = ast_channel_walk_locked(chan); } return NULL; } void icd_jabber_transfer (int argc, char *argv[]) { icd_caller *bridger; icd_caller *bridgee; icd_fieldset_iterator *iter; char *curr_key; icd_agent *agent; struct ast_channel *newchan; struct ast_channel *oldchan; struct ast_channel *xferchan; if (argc == 3) { ast_log(LOG_WARNING, "\ttransfering:\n"); iter = icd_fieldset__get_key_iterator(agents); while (icd_fieldset_iterator__has_more(iter)) { curr_key = icd_fieldset_iterator__next(iter); agent = icd_fieldset__get_value(agents, curr_key); if (strcmp(icd_caller__get_param((icd_caller *)agent, "agent_id"), argv[1]) == 0) { ast_log(LOG_WARNING, "from: [%s]\n", icd_caller__get_name((icd_caller *) agent)); bridger = agent; } if (strcmp(icd_caller__get_param((icd_caller *)agent, "agent_id"), argv[2]) == 0) { ast_log(LOG_WARNING, "to: [%s]\n", icd_caller__get_name((icd_caller *) agent)); bridgee = agent; } } oldchan = icd_caller__get_channel(bridger); newchan = icd_caller__get_channel(bridgee); ast_log(LOG_WARNING, "newchan: [%s]\n", newchan->name); ast_log(LOG_WARNING, "oldchan: [%s]\n", oldchan->name); xferchan = my_ast_get_channel_by_name_locked(oldchan->name); if(!xferchan) { ast_log(LOG_WARNING, "No Such Channel: %s\n", oldchan->name); return -1; } ast_mutex_unlock(&xferchan->lock); if(xferchan->_bridge) { xferchan = xferchan->_bridge; ast_mutex_lock(&xferchan->lock); } else return -1; ast_verbose("Transferring_to context do_agenta, extension %s, priority %d\n", argv[2], 1); xferchan->pbx = 0; ast_async_goto(xferchan, "", argv[2], 1); if(xferchan) ast_mutex_unlock(&xferchan->lock); return 0; } }