Allow the AMI Hangup command to accept a Cause header.
authorMark Michelson <mmichelson@digium.com>
Wed, 1 Apr 2009 00:39:01 +0000 (00:39 +0000)
committerMark Michelson <mmichelson@digium.com>
Wed, 1 Apr 2009 00:39:01 +0000 (00:39 +0000)
(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
main/manager.c

diff --git a/CHANGES b/CHANGES
index 91877d3..88ae3f5 100644 (file)
--- 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  -------------
 ------------------------------------------------------------------------------
index b5cc844..57f081a 100644 (file)
@@ -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");