/*--- action_redirect: The redirect manager command */ static int action_redirect(struct mansession *s, struct message *m) { char *name = astman_get_header(m, "Channel"); char *name2 = astman_get_header(m, "ExtraChannel"); char *exten = astman_get_header(m, "Exten"); char *context = astman_get_header(m, "Context"); char *priority = astman_get_header(m, "Priority"); struct opbx_channel *chan, *chan2 = NULL; int pi = 0; int res; if (!name || opbx_strlen_zero(name)) { astman_send_error(s, m, "Channel not specified"); return 0; } if (!opbx_strlen_zero(priority) && (sscanf(priority, "%d", &pi) != 1)) { astman_send_error(s, m, "Invalid priority\n"); return 0; } chan = opbx_get_channel_by_name_locked(name); if (!chan) { char buf[BUFSIZ]; snprintf(buf, sizeof(buf), "Channel does not exist: %s", name); astman_send_error(s, m, buf); return 0; } if (!opbx_strlen_zero(name2)) chan2 = opbx_get_channel_by_name_locked(name2); res = opbx_async_goto(chan, context, exten, pi); if (!res) { if (!opbx_strlen_zero(name2)) { if (chan2) res = opbx_async_goto(chan2, context, exten, pi); else res = -1; if (!res) astman_send_ack(s, m, "Dual Redirect successful"); else astman_send_error(s, m, "Secondary redirect failed"); } else astman_send_ack(s, m, "Redirect successful"); } else astman_send_error(s, m, "Redirect failed"); if (chan) opbx_mutex_unlock(&chan->lock); if (chan2) opbx_mutex_unlock(&chan2->lock); return 0; }