From 0736c55a96c0b7854967a2b79f64848137649f0e Mon Sep 17 00:00:00 2001 From: Naveen Albert Date: Mon, 17 May 2021 10:19:30 -0400 Subject: [PATCH] func_export: Add EXPORT function Adds the EXPORT function, which allows write access to variables and functions on other channels. ASTERISK-29432 #close Change-Id: I7492645ae4307553d0f586d78e13a4f586231fdf --- doc/CHANGES-staging/func_export.txt | 5 ++ funcs/func_export.c | 107 ++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 doc/CHANGES-staging/func_export.txt create mode 100644 funcs/func_export.c diff --git a/doc/CHANGES-staging/func_export.txt b/doc/CHANGES-staging/func_export.txt new file mode 100644 index 0000000000..d9f95c0123 --- /dev/null +++ b/doc/CHANGES-staging/func_export.txt @@ -0,0 +1,5 @@ +Subject: New EXPORT function + +A new function, EXPORT, allows writing variables +and functions on other channels, the complement +of the IMPORT function. diff --git a/funcs/func_export.c b/funcs/func_export.c new file mode 100644 index 0000000000..e231b64107 --- /dev/null +++ b/funcs/func_export.c @@ -0,0 +1,107 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2021-2022, Naveen Albert + * + * See http://www.asterisk.org for more information about + * the Asterisk project. Please do not directly contact + * any of the maintainers of this project for assistance; + * the project provides a web site, mailing lists and IRC + * channels for your use. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +/*! \file + * + * \brief Set variables and functions on other channels + * + * \author Naveen Albert + * + * \ingroup functions + */ + +/*** MODULEINFO + extended + ***/ + +#include "asterisk.h" + +#include "asterisk/module.h" +#include "asterisk/channel.h" +#include "asterisk/pbx.h" +#include "asterisk/utils.h" +#include "asterisk/app.h" +#include "asterisk/stringfields.h" + +/*** DOCUMENTATION + + + Set variables or dialplan functions on any arbitrary channel that exists. + + + + The complete channel name: SIP/12-abcd1234. + + + Variable name + + + + Allows setting variables or functions on any existing channel if it exists. + + + IMPORT + MASTER_CHANNEL + SHARED + + + ***/ + +static int func_export_write(struct ast_channel *chan, const char *function, char *data, const char *value) +{ + struct ast_channel *ochan; + + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(channel); + AST_APP_ARG(var); + ); + AST_STANDARD_APP_ARGS(args, data); + + if (!args.channel) { + ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function); + return -1; + } + if (!args.var) { + ast_log(LOG_WARNING, "No variable name was provided to %s function.\n", function); + return -1; + } + ochan = ast_channel_get_by_name(args.channel); + if (!ochan) { + ast_log(LOG_WARNING, "Channel '%s' not found! '%s' not set.\n", args.channel, args.var); + return -1; + } + + pbx_builtin_setvar_helper(ochan, data, value); + ast_channel_unref(ochan); + return 0; +} + +static struct ast_custom_function export_function = { + .name = "EXPORT", + .write = func_export_write, +}; + +static int unload_module(void) +{ + return ast_custom_function_unregister(&export_function); +} + +static int load_module(void) +{ + return ast_custom_function_register(&export_function); +} + +AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Set variables and functions on other channels");