Wed Aug 7 17:16:05 2019

Asterisk developer's documentation


func_global.c File Reference

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

Detailed Description

Global variable dialplan functions.

Author:
Tilghman Lesher <func_global__200605@the-tilghman.com>

Definition in file func_global.c.


Function Documentation

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 }


Variable Documentation

Initial value:
 {
   .name = "GLOBAL",
   .read = global_read,
   .write = global_write,
}

Definition at line 126 of file func_global.c.

Initial value:
 {
   .name = "SHARED",
   .read = shared_read,
   .write = shared_write,
}

Definition at line 282 of file func_global.c.

Initial value:
 {
   .type = "SHARED_VARIABLES",
   .destroy = shared_variable_free,
}

Definition at line 91 of file func_global.c.


Generated on 7 Aug 2019 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1