diff options
author | Mark Michelson <mmichelson@digium.com> | 2009-04-01 00:39:01 +0000 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2009-04-01 00:39:01 +0000 |
commit | 378c2e9d2acfb2cd255d51657bef3494980f9aa3 (patch) | |
tree | 68ae85522af6823df5a81344e11f0e26eb530ee0 | |
parent | d6b3031fe7f2174fb4d4d69e8c386b916bf1f85c (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-- | CHANGES | 5 | ||||
-rw-r--r-- | main/manager.c | 21 |
2 files changed, 25 insertions, 1 deletions
@@ -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"); |