diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-04-01 00:39:01 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-04-01 00:39:01 +0000 |
commit | 0e97d64540b97a914a7dea45ce86b3d7cfd82c3d (patch) | |
tree | 68ae85522af6823df5a81344e11f0e26eb530ee0 /main | |
parent | 93ee72ca9275d5a1f391f018f7c7759a217b82b7 (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: http://svn.digium.com/svn/asterisk/trunk@185704 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r-- | main/manager.c | 21 |
1 files changed, 20 insertions, 1 deletions
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"); |