From 378c2e9d2acfb2cd255d51657bef3494980f9aa3 Mon Sep 17 00:00:00 2001 From: Mark Michelson <mmichelson@digium.com> Date: Wed, 1 Apr 2009 00:39:01 +0000 Subject: [PATCH] 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 --- CHANGES | 5 +++++ main/manager.c | 21 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 91877d3d03..88ae3f515b 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 b5cc844bdd..57f081ab0d 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"); -- GitLab