summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2009-04-01 00:39:01 +0000
committerMark Michelson <mmichelson@digium.com>2009-04-01 00:39:01 +0000
commit378c2e9d2acfb2cd255d51657bef3494980f9aa3 (patch)
tree68ae85522af6823df5a81344e11f0e26eb530ee0
parentd6b3031fe7f2174fb4d4d69e8c386b916bf1f85c (diff)
Allow the AMI Hangup command to accept a Cause header.
(closes issue #14695) Reported by: mneuhauser Patches: cause-for-hangup-manager-action.patch uploaded by mneuhauser (license 425) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@185704 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--CHANGES5
-rw-r--r--main/manager.c21
2 files changed, 25 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 91877d3d0..88ae3f515 100644
--- a/CHANGES
+++ b/CHANGES
@@ -27,6 +27,11 @@ Functions
---------
* The CHANNEL() function now supports the "name" option.
+Asterisk Manager Interface
+--------------------------
+ * The Hangup action now accepts a Cause header which may be used to
+ set the channel's hangup cause.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 1.6.1 to Asterisk 1.6.2 -------------
------------------------------------------------------------------------------
diff --git a/main/manager.c b/main/manager.c
index b5cc844bd..57f081ab0 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1759,21 +1759,40 @@ static int action_challenge(struct mansession *s, const struct message *m)
static char mandescr_hangup[] =
"Description: Hangup a channel\n"
"Variables: \n"
-" Channel: The channel name to be hungup\n";
+" Channel: The channel name to be hungup\n"
+" Cause: numeric hangup cause\n";
static int action_hangup(struct mansession *s, const struct message *m)
{
struct ast_channel *c = NULL;
+ int causecode = 0; /* all values <= 0 mean 'do not set hangupcause in channel' */
const char *name = astman_get_header(m, "Channel");
+ const char *cause = astman_get_header(m, "Cause");
if (ast_strlen_zero(name)) {
astman_send_error(s, m, "No channel specified");
return 0;
}
+ if (!ast_strlen_zero(cause)) {
+ char *endptr;
+ causecode = strtol(cause, &endptr, 10);
+ if (causecode < 0 || causecode > 127 || *endptr != '\0') {
+ ast_log(LOG_NOTICE, "Invalid 'Cause: %s' in manager action Hangup\n", cause);
+ /* keep going, better to hangup without cause than to not hang up at all */
+ causecode = 0; /* do not set channel's hangupcause */
+ }
+ }
c = ast_get_channel_by_name_locked(name);
if (!c) {
astman_send_error(s, m, "No such channel");
return 0;
}
+ if (causecode > 0) {
+ if (option_debug >= 1) {
+ ast_log(LOG_DEBUG, "Setting hangupcause of channel %s to %d (is %d now)\n",
+ c->name, causecode, c->hangupcause);
+ }
+ c->hangupcause = causecode;
+ }
ast_softhangup(c, AST_SOFTHANGUP_EXPLICIT);
ast_channel_unlock(c);
astman_send_ack(s, m, "Channel Hungup");