From: Richard Mudgett Date: Fri, 17 Oct 2014 02:32:37 +0000 (+0000) Subject: AMI: Add missing VarSet events when a channel inherits variables. X-Git-Tag: 12.7.0-rc1~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de01a1b8ba2e06323edf41e339e79eaa2243c8ad;p=thirdparty%2Fasterisk.git AMI: Add missing VarSet events when a channel inherits variables. There should be AMI VarSet events when channel variables are inherited by an outgoing channel. Also local;2 should generate VarSet events when it gets all of its channel variables from channel local;1. ASTERISK-24415 #close Reported by: Richard Mudgett Patches: jira_asterisk_24415_v12.patch (license #5621) patch uploaded by Richard Mudgett Review: https://reviewboard.asterisk.org/r/4074/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@425782 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/channel.c b/main/channel.c index e55ec73500..fc8275eb2c 100644 --- a/main/channel.c +++ b/main/channel.c @@ -6299,41 +6299,42 @@ void ast_change_name(struct ast_channel *chan, const char *newname) void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child) { - struct ast_var_t *current, *newvar; + struct ast_var_t *current; + struct ast_var_t *newvar; const char *varname; + int vartype; AST_LIST_TRAVERSE(ast_channel_varshead((struct ast_channel *) parent), current, entries) { - int vartype = 0; - varname = ast_var_full_name(current); - if (!varname) + if (!varname) { continue; + } + vartype = 0; if (varname[0] == '_') { vartype = 1; - if (varname[1] == '_') + if (varname[1] == '_') { vartype = 2; + } } switch (vartype) { case 1: newvar = ast_var_assign(&varname[1], ast_var_value(current)); - if (newvar) { - AST_LIST_INSERT_TAIL(ast_channel_varshead(child), newvar, entries); - ast_debug(1, "Inheriting variable %s from %s to %s.\n", - ast_var_name(newvar), ast_channel_name(parent), ast_channel_name(child)); - } break; case 2: newvar = ast_var_assign(varname, ast_var_value(current)); - if (newvar) { - AST_LIST_INSERT_TAIL(ast_channel_varshead(child), newvar, entries); - ast_debug(1, "Inheriting variable %s from %s to %s.\n", - ast_var_name(newvar), ast_channel_name(parent), ast_channel_name(child)); - } break; default: - break; + continue; + } + if (newvar) { + ast_debug(1, "Inheriting variable %s from %s to %s.\n", + ast_var_full_name(newvar), ast_channel_name(parent), + ast_channel_name(child)); + AST_LIST_INSERT_TAIL(ast_channel_varshead(child), newvar, entries); + ast_channel_publish_varset(child, ast_var_full_name(newvar), + ast_var_value(newvar)); } } } diff --git a/main/core_unreal.c b/main/core_unreal.c index 814c7bf898..16188b043b 100644 --- a/main/core_unreal.c +++ b/main/core_unreal.c @@ -36,6 +36,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/causes.h" #include "asterisk/channel.h" +#include "asterisk/stasis_channels.h" #include "asterisk/pbx.h" #include "asterisk/musiconhold.h" #include "asterisk/astobj2.h" @@ -685,6 +686,8 @@ void ast_unreal_call_setup(struct ast_channel *semi1, struct ast_channel *semi2) clone_var = ast_var_assign(varptr->name, varptr->value); if (clone_var) { AST_LIST_INSERT_TAIL(ast_channel_varshead(semi2), clone_var, entries); + ast_channel_publish_varset(semi2, ast_var_full_name(clone_var), + ast_var_value(clone_var)); } } ast_channel_datastore_inherit(semi1, semi2);