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 | |
AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Variable dialplan functions") | |
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_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.
AST_MODULE_INFO_STANDARD | ( | ASTERISK_GPL_KEY | , | |
"Variable dialplan functions" | ||||
) |
static int global_read | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 107 of file func_global.c.
References ast_copy_string(), pbx_builtin_getvar_helper(), and var.
00108 { 00109 const char *var = pbx_builtin_getvar_helper(NULL, data); 00110 00111 *buf = '\0'; 00112 00113 if (var) 00114 ast_copy_string(buf, var, len); 00115 00116 return 0; 00117 }
static int global_write | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
Definition at line 119 of file func_global.c.
References pbx_builtin_setvar_helper().
00120 { 00121 pbx_builtin_setvar_helper(NULL, data, value); 00122 00123 return 0; 00124 }
static int load_module | ( | void | ) | [static] |
Definition at line 298 of file func_global.c.
References ast_custom_function_register.
00299 { 00300 int res = 0; 00301 00302 res |= ast_custom_function_register(&global_function); 00303 res |= ast_custom_function_register(&shared_function); 00304 00305 return res; 00306 }
static int shared_read | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 132 of file func_global.c.
References args, ast_alloca, AST_APP_ARG, ast_channel_datastore_find(), ast_channel_get_by_name(), ast_channel_get_by_name_prefix(), ast_channel_lock, ast_channel_unlock, ast_channel_unref, ast_copy_string(), AST_DECLARE_APP_ARGS, AST_LIST_TRAVERSE, ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_var_name(), ast_var_value(), ast_datastore::data, LOG_ERROR, LOG_WARNING, prefix, and var.
00133 { 00134 struct ast_datastore *varstore; 00135 struct varshead *varshead; 00136 struct ast_var_t *var; 00137 AST_DECLARE_APP_ARGS(args, 00138 AST_APP_ARG(var); 00139 AST_APP_ARG(chan); 00140 ); 00141 struct ast_channel *c_ref = NULL; 00142 00143 if (ast_strlen_zero(data)) { 00144 ast_log(LOG_WARNING, "SHARED() requires an argument: SHARED(<var>[,<chan>])\n"); 00145 return -1; 00146 } 00147 00148 AST_STANDARD_APP_ARGS(args, data); 00149 00150 if (!ast_strlen_zero(args.chan)) { 00151 char *prefix = ast_alloca(strlen(args.chan) + 2); 00152 sprintf(prefix, "%s-", args.chan); 00153 if (!(c_ref = ast_channel_get_by_name(args.chan)) && !(c_ref = ast_channel_get_by_name_prefix(prefix, strlen(prefix)))) { 00154 ast_log(LOG_ERROR, "Channel '%s' not found! Variable '%s' will be blank.\n", args.chan, args.var); 00155 return -1; 00156 } 00157 chan = c_ref; 00158 } else if (!chan) { 00159 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd); 00160 return -1; 00161 } 00162 00163 ast_channel_lock(chan); 00164 00165 if (!(varstore = ast_channel_datastore_find(chan, &shared_variable_info, NULL))) { 00166 ast_channel_unlock(chan); 00167 if (c_ref) { 00168 c_ref = ast_channel_unref(c_ref); 00169 } 00170 return -1; 00171 } 00172 00173 varshead = varstore->data; 00174 *buf = '\0'; 00175 00176 /* Protected by the channel lock */ 00177 AST_LIST_TRAVERSE(varshead, var, entries) { 00178 if (!strcmp(args.var, ast_var_name(var))) { 00179 ast_copy_string(buf, ast_var_value(var), len); 00180 break; 00181 } 00182 } 00183 00184 ast_channel_unlock(chan); 00185 00186 if (c_ref) { 00187 c_ref = ast_channel_unref(c_ref); 00188 } 00189 00190 return 0; 00191 }
static void shared_variable_free | ( | void * | data | ) | [static] |
Definition at line 96 of file func_global.c.
References ast_free, AST_LIST_REMOVE_HEAD, ast_var_delete(), and var.
00097 { 00098 struct varshead *varshead = data; 00099 struct ast_var_t *var; 00100 00101 while ((var = AST_LIST_REMOVE_HEAD(varshead, entries))) { 00102 ast_var_delete(var); 00103 } 00104 ast_free(varshead); 00105 }
static int shared_write | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
Definition at line 193 of file func_global.c.
References args, ast_alloca, AST_APP_ARG, ast_calloc, ast_channel_datastore_add(), ast_channel_datastore_find(), ast_channel_get_by_name(), ast_channel_get_by_name_prefix(), ast_channel_lock, ast_channel_unlock, ast_channel_unref, ast_datastore_alloc, ast_datastore_free(), AST_DECLARE_APP_ARGS, AST_LIST_INSERT_HEAD, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_var_assign(), ast_var_delete(), ast_var_name(), ast_datastore::data, EVENT_FLAG_DIALPLAN, LOG_ERROR, LOG_WARNING, manager_event, prefix, S_OR, and var.
00194 { 00195 struct ast_datastore *varstore; 00196 struct varshead *varshead; 00197 struct ast_var_t *var; 00198 AST_DECLARE_APP_ARGS(args, 00199 AST_APP_ARG(var); 00200 AST_APP_ARG(chan); 00201 ); 00202 struct ast_channel *c_ref = NULL; 00203 00204 if (ast_strlen_zero(data)) { 00205 ast_log(LOG_WARNING, "SHARED() requires an argument: SHARED(<var>[,<chan>])\n"); 00206 return -1; 00207 } 00208 00209 AST_STANDARD_APP_ARGS(args, data); 00210 00211 if (!ast_strlen_zero(args.chan)) { 00212 char *prefix = ast_alloca(strlen(args.chan) + 2); 00213 sprintf(prefix, "%s-", args.chan); 00214 if (!(c_ref = ast_channel_get_by_name(args.chan)) && !(c_ref = ast_channel_get_by_name_prefix(prefix, strlen(prefix)))) { 00215 ast_log(LOG_ERROR, "Channel '%s' not found! Variable '%s' not set to '%s'.\n", args.chan, args.var, value); 00216 return -1; 00217 } 00218 chan = c_ref; 00219 } else if (!chan) { 00220 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd); 00221 return -1; 00222 } 00223 00224 ast_channel_lock(chan); 00225 00226 if (!(varstore = ast_channel_datastore_find(chan, &shared_variable_info, NULL))) { 00227 if (!(varstore = ast_datastore_alloc(&shared_variable_info, NULL))) { 00228 ast_log(LOG_ERROR, "Unable to allocate new datastore. Shared variable not set.\n"); 00229 ast_channel_unlock(chan); 00230 if (c_ref) { 00231 c_ref = ast_channel_unref(c_ref); 00232 } 00233 return -1; 00234 } 00235 00236 if (!(varshead = ast_calloc(1, sizeof(*varshead)))) { 00237 ast_log(LOG_ERROR, "Unable to allocate variable structure. Shared variable not set.\n"); 00238 ast_datastore_free(varstore); 00239 ast_channel_unlock(chan); 00240 if (c_ref) { 00241 c_ref = ast_channel_unref(c_ref); 00242 } 00243 return -1; 00244 } 00245 00246 varstore->data = varshead; 00247 ast_channel_datastore_add(chan, varstore); 00248 } 00249 varshead = varstore->data; 00250 00251 /* Protected by the channel lock */ 00252 AST_LIST_TRAVERSE_SAFE_BEGIN(varshead, var, entries) { 00253 /* If there's a previous value, remove it */ 00254 if (!strcmp(args.var, ast_var_name(var))) { 00255 AST_LIST_REMOVE_CURRENT(entries); 00256 ast_var_delete(var); 00257 break; 00258 } 00259 } 00260 AST_LIST_TRAVERSE_SAFE_END; 00261 00262 if ((var = ast_var_assign(args.var, S_OR(value, "")))) { 00263 AST_LIST_INSERT_HEAD(varshead, var, entries); 00264 manager_event(EVENT_FLAG_DIALPLAN, "VarSet", 00265 "Channel: %s\r\n" 00266 "Variable: SHARED(%s)\r\n" 00267 "Value: %s\r\n" 00268 "Uniqueid: %s\r\n", 00269 chan ? chan->name : "none", args.var, value, 00270 chan ? chan->uniqueid : "none"); 00271 } 00272 00273 ast_channel_unlock(chan); 00274 00275 if (c_ref) { 00276 c_ref = ast_channel_unref(c_ref); 00277 } 00278 00279 return 0; 00280 }
static int unload_module | ( | void | ) | [static] |
Definition at line 288 of file func_global.c.
References ast_custom_function_unregister().
00289 { 00290 int res = 0; 00291 00292 res |= ast_custom_function_unregister(&global_function); 00293 res |= ast_custom_function_unregister(&shared_function); 00294 00295 return res; 00296 }
struct ast_custom_function global_function [static] |
{ .name = "GLOBAL", .read = global_read, .write = global_write, }
Definition at line 126 of file func_global.c.
struct ast_custom_function shared_function [static] |
{ .name = "SHARED", .read = shared_read, .write = shared_write, }
Definition at line 282 of file func_global.c.
struct ast_datastore_info shared_variable_info [static] |
{ .type = "SHARED_VARIABLES", .destroy = shared_variable_free, }
Definition at line 91 of file func_global.c.