From afceccd015b585c1b1ae1cd27ca1b5f10d8b65a0 Mon Sep 17 00:00:00 2001
From: Russell Bryant <russell@russellbryant.com>
Date: Fri, 12 Dec 2008 20:12:23 +0000
Subject: [PATCH] Add a new CLI command, "channel redirect", which is similar
 in operation to AMI Redirect.

Review: http://reviewboard.digium.com/r/89/


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@163716 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 CHANGES                |  2 ++
 res/res_clioriginate.c | 48 +++++++++++++++++++++++++++++++++++++++---
 2 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/CHANGES b/CHANGES
index 9d0d3e6ff6..70d3063471 100644
--- a/CHANGES
+++ b/CHANGES
@@ -73,6 +73,8 @@ Applications
 
 Miscellaneous
 -------------
+ * The Asterisk CLI has a new command, "channel redirect", which is similar in
+   operation to the AMI Redirect action.
  * res_jabber: autoprune has been disabled by default, to avoid misconfiguration 
    that would end up being interpreted as a bug once Asterisk started removing 
    the contacts from a user list.
diff --git a/res/res_clioriginate.c b/res/res_clioriginate.c
index 1052888dca..3839ebaf6b 100644
--- a/res/res_clioriginate.c
+++ b/res/res_clioriginate.c
@@ -172,17 +172,59 @@ static char *handle_orig(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
 	return res;
 }
 
+static char *handle_redirect(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+	const char *name, *dest;
+	struct ast_channel *chan;
+	int res;
+
+	switch (cmd) {
+	case CLI_INIT:
+		e->command = "channel redirect";
+		e->usage = ""
+		"Usage: channel redirect <channel> <[[context,]exten,]priority>\n"
+		"    Redirect an active channel to a specified extension.\n";
+		return NULL;
+	case CLI_GENERATE:
+		return ast_complete_channels(a->line, a->word, a->pos, a->n, 2);
+	}
+
+	if (a->argc != e->args + 2) {
+		return CLI_SHOWUSAGE;
+	}
+
+	name = a->argv[2];
+	dest = a->argv[3];
+
+	chan = ast_get_channel_by_name_locked(name);
+	if (!chan) {
+		ast_cli(a->fd, "Channel '%s' not found\n", name);
+		return CLI_FAILURE;
+	}
+
+	res = ast_async_parseable_goto(chan, dest);
+
+	ast_channel_unlock(chan);
+
+	if (!res) {
+		ast_cli(a->fd, "Channel '%s' successfully redirected to %s\n", name, dest);
+	} else {
+		ast_cli(a->fd, "Channel '%s' failed to be redirected to %s\n", name, dest);
+	}
+
+	return res ? CLI_FAILURE : CLI_SUCCESS;
+}
+
 static struct ast_cli_entry cli_cliorig[] = {
 	AST_CLI_DEFINE(handle_orig, "Originate a call"),
+	AST_CLI_DEFINE(handle_redirect, "Redirect a call"),
 };
 
-/*! \brief Unload orginate module */
 static int unload_module(void)
 {
 	return ast_cli_unregister_multiple(cli_cliorig, ARRAY_LEN(cli_cliorig));
 }
 
-/*! \brief Load orginate module */
 static int load_module(void)
 {
 	int res;
@@ -190,4 +232,4 @@ static int load_module(void)
 	return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
 }
 
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Call origination from the CLI");
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Call origination and redirection from the CLI");
-- 
GitLab