summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--UPGRADE.txt11
-rw-r--r--include/asterisk/manager.h2
-rw-r--r--main/channel.c45
3 files changed, 38 insertions, 20 deletions
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 3c31f526b..2ba2ea9f2 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -27,6 +27,17 @@ AMI:
- The SIP SIPqualifypeer action now sends a response indicating it will qualify
a peer once a peer has been found to qualify. Once the qualify has been
completed it will now issue a SIPqualifypeerdone event.
+ - Version 1.4 - The details of what happens to a channel when a masquerade
+ happens (transfers, parking, etc) have changed.
+ - The Masquerade event now includes the Uniqueid's of the clone and original
+ channels.
+ - Channels no longer swap Uniqueid's as a result of the masquerade.
+ - Instead of a shell game of renames, there's now a single rename, appending
+ <ZOMBIE> to the name of the original channel.
+
+CEL:
+ - The Uniqueid field for a channel is now a stable identifier, and will not
+ change due to transfers, parking, etc.
Queues:
- Queue logging for PAUSEALL/UNPAUSEALL now only occurs if the interface this is
diff --git a/include/asterisk/manager.h b/include/asterisk/manager.h
index fd58b7ae7..2e58a119a 100644
--- a/include/asterisk/manager.h
+++ b/include/asterisk/manager.h
@@ -54,7 +54,7 @@
- \ref manager.c Main manager code file
*/
-#define AMI_VERSION "1.3"
+#define AMI_VERSION "1.4"
#define DEFAULT_MANAGER_PORT 5038 /* Default port for Asterisk management via TCP */
#define DEFAULT_MANAGER_TLS_PORT 5039 /* Default port for Asterisk management via TCP */
diff --git a/main/channel.c b/main/channel.c
index 0023946cf..048975d12 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -6865,10 +6865,8 @@ int ast_do_masquerade(struct ast_channel *original)
struct ast_format rformat;
struct ast_format wformat;
struct ast_format tmp_format;
- char newn[AST_CHANNEL_NAME];
- char orig[AST_CHANNEL_NAME];
- char masqn[AST_CHANNEL_NAME];
- char zombn[AST_CHANNEL_NAME];
+ char tmp_name[AST_CHANNEL_NAME];
+ const char *tmp_id;
char clone_sending_dtmf_digit;
struct timeval clone_sending_dtmf_tv;
@@ -6971,12 +6969,18 @@ int ast_do_masquerade(struct ast_channel *original)
<parameter name="Clone">
<para>The name of the channel whose information will be going into the Original channel.</para>
</parameter>
+ <parameter name="CloneUniqueid">
+ <para>The uniqueid of the channel whose information will be going into the Original channel.</para>
+ </parameter>
<parameter name="CloneState">
<para>The current state of the clone channel.</para>
</parameter>
<parameter name="Original">
<para>The name of the channel whose information will be replaced by the Clone channel's information.</para>
</parameter>
+ <parameter name="OriginalUniqueid">
+ <para>The uniqueid of the channel whose information will be replaced by the Clone channel's information.</para>
+ </parameter>
<parameter name="OriginalState">
<para>The current state of the original channel.</para>
</parameter>
@@ -6985,10 +6989,12 @@ int ast_do_masquerade(struct ast_channel *original)
***/
ast_manager_event_multichan(EVENT_FLAG_CALL, "Masquerade", 2, chans,
"Clone: %s\r\n"
+ "CloneUniqueid: %s\r\n"
"CloneState: %s\r\n"
"Original: %s\r\n"
+ "OriginalUniqueid: %s\r\n"
"OriginalState: %s\r\n",
- ast_channel_name(clonechan), ast_state2str(ast_channel_state(clonechan)), ast_channel_name(original), ast_state2str(ast_channel_state(original)));
+ ast_channel_name(clonechan), ast_channel_uniqueid(clonechan), ast_state2str(ast_channel_state(clonechan)), ast_channel_name(original), ast_channel_uniqueid(original), ast_state2str(ast_channel_state(original)));
/*
* Remember the original read/write formats. We turn off any
@@ -7003,18 +7009,23 @@ int ast_do_masquerade(struct ast_channel *original)
clone_sending_dtmf_digit = ast_channel_sending_dtmf_digit(clonechan);
clone_sending_dtmf_tv = ast_channel_sending_dtmf_tv(clonechan);
- /* Save the original name */
- ast_copy_string(orig, ast_channel_name(original), sizeof(orig));
- /* Save the new name */
- ast_copy_string(newn, ast_channel_name(clonechan), sizeof(newn));
- /* Create the masq name */
- snprintf(masqn, sizeof(masqn), "%s<MASQ>", newn);
+ /* Swap uniqueid's of the channels. This needs to happen before channel renames,
+ * so rename events get the proper id's.
+ */
+ tmp_id = ast_strdupa(ast_channel_uniqueid(clonechan));
+ ast_channel_uniqueid_set(clonechan, ast_channel_uniqueid(original));
+ ast_channel_uniqueid_set(original, tmp_id);
- /* Mangle the name of the clone channel */
- __ast_change_name_nolink(clonechan, masqn);
+ /* Swap channel names. This uses ast_channel_name_set directly, so we
+ * don't get any spurious rename events.
+ */
+ ast_copy_string(tmp_name, ast_channel_name(clonechan), sizeof(tmp_name));
+ ast_channel_name_set(clonechan, ast_channel_name(original));
+ ast_channel_name_set(original, tmp_name);
- /* Copy the name from the clone channel */
- __ast_change_name_nolink(original, newn);
+ /* Now zombify the clonechan. This gets a real rename event. */
+ snprintf(tmp_name, sizeof(tmp_name), "%s<ZOMBIE>", ast_channel_name(clonechan)); /* quick, hide the brains! */
+ __ast_change_name_nolink(clonechan, tmp_name);
/* share linked id's */
ast_channel_set_linkgroup(original, clonechan);
@@ -7081,10 +7092,6 @@ int ast_do_masquerade(struct ast_channel *original)
ast_channel_state_set(original, ast_channel_state(clonechan));
ast_channel_state_set(clonechan, origstate);
- /* Mangle the name of the clone channel */
- snprintf(zombn, sizeof(zombn), "%s<ZOMBIE>", orig); /* quick, hide the brains! */
- __ast_change_name_nolink(clonechan, zombn);
-
/* Update the type. */
t_pvt = ast_channel_monitor(original);
ast_channel_monitor_set(original, ast_channel_monitor(clonechan));