<p>N A has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/15908">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">func_channel: Added new OTHER_CHANNEL function<br><br>A new function allows read and write access to<br>any existing channel. This is broader than the<br>access permitted by MASTER_CHANNEL and different<br>from SHARED which accesses a separate variable<br>space.<br><br>ASTERISK-29432<br><br>Change-Id: I7492645ae4307553d0f586d78e13a4f586231fdf<br>---<br>A doc/CHANGES-staging/func_channel_ochan.txt<br>M funcs/func_channel.c<br>2 files changed, 86 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/08/15908/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/CHANGES-staging/func_channel_ochan.txt b/doc/CHANGES-staging/func_channel_ochan.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..00598f2</span><br><span>--- /dev/null</span><br><span>+++ b/doc/CHANGES-staging/func_channel_ochan.txt</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: New OTHER_CHANNEL function</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+A new function, OTHER_CHANNEL, allows</span><br><span style="color: hsl(120, 100%, 40%);">+read and write access to any channel.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/funcs/func_channel.c b/funcs/func_channel.c</span><br><span>index d143fdc..a8b8695 100644</span><br><span>--- a/funcs/func_channel.c</span><br><span>+++ b/funcs/func_channel.c</span><br><span>@@ -20,6 +20,7 @@</span><br><span>  *</span><br><span>  * \author Kevin P. Fleming <kpfleming@digium.com></span><br><span>  * \author Ben Winslow</span><br><span style="color: hsl(120, 100%, 40%);">+ * \author Naveen Albert <asterisk@phreaknet.org></span><br><span>  *</span><br><span>  * \ingroup functions</span><br><span>  */</span><br><span>@@ -74,6 +75,14 @@</span><br><span>                      the channel's linkedid.</para></span><br><span>             </description></span><br><span>         </function></span><br><span style="color: hsl(120, 100%, 40%);">+     <function name="OTHER_CHANNEL" language="en_US"></span><br><span style="color: hsl(120, 100%, 40%);">+            <synopsis></span><br><span style="color: hsl(120, 100%, 40%);">+                      Gets or sets variables on another channel</span><br><span style="color: hsl(120, 100%, 40%);">+             </synopsis></span><br><span style="color: hsl(120, 100%, 40%);">+             <description></span><br><span style="color: hsl(120, 100%, 40%);">+                   <para>Allows access to any existing channel if it exists.</para></span><br><span style="color: hsl(120, 100%, 40%);">+          </description></span><br><span style="color: hsl(120, 100%, 40%);">+  </function></span><br><span>    <function name="CHANNEL" language="en_US"></span><br><span>                 <synopsis></span><br><span>                     Gets/sets various pieces of information about the channel.</span><br><span>@@ -755,6 +764,76 @@</span><br><span>    .write = func_mchan_write,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int func_ochan_read(struct ast_channel *chan, const char *function,</span><br><span style="color: hsl(120, 100%, 40%);">+                           char *data, struct ast_str **buf, ssize_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ast_channel *ochan;</span><br><span style="color: hsl(120, 100%, 40%);">+    char *template = ast_alloca(4 + strlen(data));</span><br><span style="color: hsl(120, 100%, 40%);">+        </span><br><span style="color: hsl(120, 100%, 40%);">+      AST_DECLARE_APP_ARGS(args,</span><br><span style="color: hsl(120, 100%, 40%);">+                         AST_APP_ARG(var);</span><br><span style="color: hsl(120, 100%, 40%);">+                             AST_APP_ARG(channel);</span><br><span style="color: hsl(120, 100%, 40%);">+    );</span><br><span style="color: hsl(120, 100%, 40%);">+    AST_STANDARD_APP_ARGS(args, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!args.channel) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!(ochan = ast_channel_get_by_name(args.channel))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "Channel '%s' not found!  Variable '%s' will be blank.\n", args.channel, args.var);</span><br><span style="color: hsl(120, 100%, 40%);">+              return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!args.var) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_WARNING, "No variable name was provided to %s function.\n", function);</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   sprintf(template, "${%s}", data); /* SAFE */</span><br><span style="color: hsl(120, 100%, 40%);">+        ast_str_substitute_variables(buf, len, ochan, template);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (ochan) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_channel_unref(ochan);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int func_ochan_write(struct ast_channel *chan, const char *function,</span><br><span style="color: hsl(120, 100%, 40%);">+                         char *data, const char *value)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ast_channel *ochan;</span><br><span style="color: hsl(120, 100%, 40%);">+    </span><br><span style="color: hsl(120, 100%, 40%);">+      AST_DECLARE_APP_ARGS(args,</span><br><span style="color: hsl(120, 100%, 40%);">+                         AST_APP_ARG(var);</span><br><span style="color: hsl(120, 100%, 40%);">+                             AST_APP_ARG(channel);</span><br><span style="color: hsl(120, 100%, 40%);">+    );</span><br><span style="color: hsl(120, 100%, 40%);">+    AST_STANDARD_APP_ARGS(args, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!args.channel) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!(ochan = ast_channel_get_by_name(args.channel))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "Channel '%s' not found!  Variable '%s' will be blank.\n", args.channel, args.var);</span><br><span style="color: hsl(120, 100%, 40%);">+              return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!args.var) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_WARNING, "No variable name was provided to %s function.\n", function);</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   pbx_builtin_setvar_helper(ochan, data, value);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ochan) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_channel_unref(ochan);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct ast_custom_function ochan_function = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .name = "OTHER_CHANNEL",</span><br><span style="color: hsl(120, 100%, 40%);">+    .read2 = func_ochan_read,</span><br><span style="color: hsl(120, 100%, 40%);">+     .write = func_ochan_write,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int unload_module(void)</span><br><span> {</span><br><span>      int res = 0;</span><br><span>@@ -762,6 +841,7 @@</span><br><span>   res |= ast_custom_function_unregister(&channel_function);</span><br><span>        res |= ast_custom_function_unregister(&channels_function);</span><br><span>       res |= ast_custom_function_unregister(&mchan_function);</span><br><span style="color: hsl(120, 100%, 40%);">+   res |= ast_custom_function_unregister(&ochan_function);</span><br><span> </span><br><span>      return res;</span><br><span> }</span><br><span>@@ -773,6 +853,7 @@</span><br><span>       res |= ast_custom_function_register(&channel_function);</span><br><span>  res |= ast_custom_function_register(&channels_function);</span><br><span>         res |= ast_custom_function_register(&mchan_function);</span><br><span style="color: hsl(120, 100%, 40%);">+     res |= ast_custom_function_register(&ochan_function);</span><br><span> </span><br><span>        return res;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/15908">change 15908</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/15908"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 16 </div>
<div style="display:none"> Gerrit-Change-Id: I7492645ae4307553d0f586d78e13a4f586231fdf </div>
<div style="display:none"> Gerrit-Change-Number: 15908 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: N A <mail@interlinked.x10host.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>