Global variable dialplan functions. More...
#include "asterisk.h"#include <sys/stat.h>#include "asterisk/module.h"#include "asterisk/pbx.h"#include "asterisk/channel.h"#include "asterisk/app.h"#include "asterisk/manager.h"
Go to the source code of this file.
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static int | global_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static int | global_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
| static int | load_module (void) |
| static int | shared_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static void | shared_variable_free (void *data) |
| static int | shared_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Variable dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ast_custom_function | global_function |
| static struct ast_custom_function | shared_function |
| static struct ast_datastore_info | shared_variable_info |
Global variable dialplan functions.
Definition in file func_global.c.
| static void __reg_module | ( | void | ) | [static] |
Definition at line 273 of file func_global.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 273 of file func_global.c.
| static int global_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 103 of file func_global.c.
References ast_copy_string(), pbx_builtin_getvar_helper(), and var.
{
const char *var = pbx_builtin_getvar_helper(NULL, data);
*buf = '\0';
if (var)
ast_copy_string(buf, var, len);
return 0;
}
| static int global_write | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
Definition at line 115 of file func_global.c.
References pbx_builtin_setvar_helper().
{
pbx_builtin_setvar_helper(NULL, data, value);
return 0;
}
| static int load_module | ( | void | ) | [static] |
Definition at line 263 of file func_global.c.
References ast_custom_function_register.
{
int res = 0;
res |= ast_custom_function_register(&global_function);
res |= ast_custom_function_register(&shared_function);
return res;
}
| static int shared_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 128 of file func_global.c.
References AST_APP_ARG, ast_channel_datastore_find(), ast_channel_lock, ast_channel_unlock, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_get_channel_by_name_locked(), ast_get_channel_by_name_prefix_locked(), AST_LIST_TRAVERSE, ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_var_name(), ast_var_value(), ast_datastore::data, ast_var_t::entries, LOG_ERROR, LOG_WARNING, prefix, and var.
{
struct ast_datastore *varstore;
struct varshead *varshead;
struct ast_var_t *var;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(var);
AST_APP_ARG(chan);
);
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "SHARED() requires an argument: SHARED(<var>[,<chan>])\n");
return -1;
}
AST_STANDARD_APP_ARGS(args, data);
if (!ast_strlen_zero(args.chan)) {
char *prefix = alloca(strlen(args.chan) + 2);
sprintf(prefix, "%s-", args.chan);
if (!(chan = ast_get_channel_by_name_locked(args.chan)) && !(chan = ast_get_channel_by_name_prefix_locked(prefix, strlen(prefix)))) {
ast_log(LOG_ERROR, "Channel '%s' not found! Variable '%s' will be blank.\n", args.chan, args.var);
return -1;
}
} else
ast_channel_lock(chan);
if (!(varstore = ast_channel_datastore_find(chan, &shared_variable_info, NULL))) {
ast_channel_unlock(chan);
return -1;
}
varshead = varstore->data;
*buf = '\0';
/* Protected by the channel lock */
AST_LIST_TRAVERSE(varshead, var, entries) {
if (!strcmp(args.var, ast_var_name(var))) {
ast_copy_string(buf, ast_var_value(var), len);
break;
}
}
ast_channel_unlock(chan);
return 0;
}
| static void shared_variable_free | ( | void * | data | ) | [static] |
Definition at line 92 of file func_global.c.
References ast_free, AST_LIST_REMOVE_HEAD, ast_var_delete(), ast_var_t::entries, and var.
{
struct varshead *varshead = data;
struct ast_var_t *var;
while ((var = AST_LIST_REMOVE_HEAD(varshead, entries))) {
ast_var_delete(var);
}
ast_free(varshead);
}
| static int shared_write | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
Definition at line 176 of file func_global.c.
References AST_APP_ARG, ast_calloc, ast_channel_datastore_add(), ast_channel_datastore_find(), ast_channel_lock, ast_channel_unlock, ast_datastore_alloc(), ast_datastore_free(), AST_DECLARE_APP_ARGS, ast_get_channel_by_name_locked(), ast_get_channel_by_name_prefix_locked(), AST_LIST_INSERT_HEAD, AST_LIST_REMOVE, AST_LIST_TRAVERSE, ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_var_assign(), ast_var_delete(), ast_var_name(), ast_datastore::data, ast_var_t::entries, EVENT_FLAG_DIALPLAN, LOG_ERROR, LOG_WARNING, manager_event, ast_channel::name, prefix, S_OR, ast_channel::uniqueid, and var.
{
struct ast_datastore *varstore;
struct varshead *varshead;
struct ast_var_t *var;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(var);
AST_APP_ARG(chan);
);
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "SHARED() requires an argument: SHARED(<var>[,<chan>])\n");
return -1;
}
AST_STANDARD_APP_ARGS(args, data);
if (!ast_strlen_zero(args.chan)) {
char *prefix = alloca(strlen(args.chan) + 2);
sprintf(prefix, "%s-", args.chan);
if (!(chan = ast_get_channel_by_name_locked(args.chan)) && !(chan = ast_get_channel_by_name_prefix_locked(prefix, strlen(prefix)))) {
ast_log(LOG_ERROR, "Channel '%s' not found! Variable '%s' not set to '%s'.\n", args.chan, args.var, value);
return -1;
}
} else
ast_channel_lock(chan);
if (!(varstore = ast_channel_datastore_find(chan, &shared_variable_info, NULL))) {
if (!(varstore = ast_datastore_alloc(&shared_variable_info, NULL))) {
ast_log(LOG_ERROR, "Unable to allocate new datastore. Shared variable not set.\n");
ast_channel_unlock(chan);
return -1;
}
if (!(varshead = ast_calloc(1, sizeof(*varshead)))) {
ast_log(LOG_ERROR, "Unable to allocate variable structure. Shared variable not set.\n");
ast_datastore_free(varstore);
ast_channel_unlock(chan);
return -1;
}
varstore->data = varshead;
ast_channel_datastore_add(chan, varstore);
}
varshead = varstore->data;
/* Protected by the channel lock */
AST_LIST_TRAVERSE(varshead, var, entries) {
/* If there's a previous value, remove it */
if (!strcmp(args.var, ast_var_name(var))) {
AST_LIST_REMOVE(varshead, var, entries);
ast_var_delete(var);
break;
}
}
var = ast_var_assign(args.var, S_OR(value, ""));
AST_LIST_INSERT_HEAD(varshead, var, entries);
manager_event(EVENT_FLAG_DIALPLAN, "VarSet",
"Channel: %s\r\n"
"Variable: SHARED(%s)\r\n"
"Value: %s\r\n"
"Uniqueid: %s\r\n",
chan ? chan->name : "none", args.var, value,
chan ? chan->uniqueid : "none");
ast_channel_unlock(chan);
return 0;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 253 of file func_global.c.
References ast_custom_function_unregister().
{
int res = 0;
res |= ast_custom_function_unregister(&global_function);
res |= ast_custom_function_unregister(&shared_function);
return res;
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Variable dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 273 of file func_global.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 273 of file func_global.c.
struct ast_custom_function global_function [static] |
{
.name = "GLOBAL",
.read = global_read,
.write = global_write,
}
Definition at line 122 of file func_global.c.
struct ast_custom_function shared_function [static] |
{
.name = "SHARED",
.read = shared_read,
.write = shared_write,
}
Definition at line 247 of file func_global.c.
struct ast_datastore_info shared_variable_info [static] |
{
.type = "SHARED_VARIABLES",
.destroy = shared_variable_free,
}
Definition at line 87 of file func_global.c.