Mon Jun 27 16:51:14 2011

Asterisk developer's documentation


func_config.c File Reference

A function to retrieve variables from an Asterisk configuration file. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"

Go to the source code of this file.

Data Structures

struct  config_item
struct  configs

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int config_function_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int load_module (void)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Asterisk configuration file variable access" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_custom_function config_function


Detailed Description

A function to retrieve variables from an Asterisk configuration file.

Author:
Russell Bryant <russell@digium.com>

Tilghman Lesher <func_config__200803@the-tilghman.com>

Definition in file func_config.c.


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 203 of file func_config.c.

static void __unreg_module ( void   )  [static]

Definition at line 203 of file func_config.c.

static int config_function_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 64 of file func_config.c.

References args, AST_APP_ARG, ast_clear_flag, ast_config_destroy(), ast_config_load, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_free, ast_log(), ast_malloc, AST_RWLIST_INSERT_TAIL, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, AST_STANDARD_APP_ARGS, ast_strdupa, ast_strlen_zero(), ast_variable_retrieve(), config_item::cfg, CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, config_item::entry, config_item::filename, LOG_ERROR, and parse().

00066 {
00067    struct ast_config *cfg;
00068    struct ast_flags cfg_flags = { CONFIG_FLAG_FILEUNCHANGED };
00069    const char *val;
00070    char *parse;
00071    struct config_item *cur;
00072    AST_DECLARE_APP_ARGS(args,
00073       AST_APP_ARG(filename);
00074       AST_APP_ARG(category);
00075       AST_APP_ARG(variable);
00076       AST_APP_ARG(index);
00077    );
00078 
00079    if (ast_strlen_zero(data)) {
00080       ast_log(LOG_ERROR, "AST_CONFIG() requires an argument\n");
00081       return -1;
00082    }
00083 
00084    parse = ast_strdupa(data);
00085    AST_STANDARD_APP_ARGS(args, parse);
00086 
00087    if (ast_strlen_zero(args.filename)) {
00088       ast_log(LOG_ERROR, "AST_CONFIG() requires a filename\n");
00089       return -1;
00090    }
00091 
00092    if (ast_strlen_zero(args.category)) {
00093       ast_log(LOG_ERROR, "AST_CONFIG() requires a category\n");
00094       return -1;
00095    }
00096    
00097    if (ast_strlen_zero(args.variable)) {
00098       ast_log(LOG_ERROR, "AST_CONFIG() requires a variable\n");
00099       return -1;
00100    }
00101 
00102    if (!(cfg = ast_config_load(args.filename, cfg_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
00103       return -1;
00104    }
00105 
00106    if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
00107       /* Retrieve cfg from list */
00108       AST_RWLIST_RDLOCK(&configs);
00109       AST_RWLIST_TRAVERSE(&configs, cur, entry) {
00110          if (!strcmp(cur->filename, args.filename)) {
00111             break;
00112          }
00113       }
00114 
00115       if (!cur) {
00116          /* At worst, we might leak an entry while upgrading locks */
00117          AST_RWLIST_UNLOCK(&configs);
00118          AST_RWLIST_WRLOCK(&configs);
00119          if (!(cur = ast_malloc(sizeof(*cur) + strlen(args.filename) + 1))) {
00120             AST_RWLIST_UNLOCK(&configs);
00121             return -1;
00122          }
00123 
00124          strcpy(cur->filename, args.filename);
00125 
00126          ast_clear_flag(&cfg_flags, CONFIG_FLAG_FILEUNCHANGED);
00127          if (!(cfg = ast_config_load(args.filename, cfg_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
00128             ast_free(cur);
00129             AST_RWLIST_UNLOCK(&configs);
00130             return -1;
00131          }
00132 
00133          cur->cfg = cfg;
00134          AST_RWLIST_INSERT_TAIL(&configs, cur, entry);
00135       }
00136 
00137       cfg = cur->cfg;
00138    } else {
00139       /* Replace cfg in list */
00140       AST_RWLIST_WRLOCK(&configs);
00141       AST_RWLIST_TRAVERSE(&configs, cur, entry) {
00142          if (!strcmp(cur->filename, args.filename)) {
00143             break;
00144          }
00145       }
00146 
00147       if (!cur) {
00148          if (!(cur = ast_malloc(sizeof(*cur) + strlen(args.filename) + 1))) {
00149             AST_RWLIST_UNLOCK(&configs);
00150             return -1;
00151          }
00152 
00153          strcpy(cur->filename, args.filename);
00154          cur->cfg = cfg;
00155 
00156          AST_RWLIST_INSERT_TAIL(&configs, cur, entry);
00157       } else {
00158          ast_config_destroy(cur->cfg);
00159          cur->cfg = cfg;
00160       }
00161    }
00162 
00163    if (!(val = ast_variable_retrieve(cfg, args.category, args.variable))) {
00164       ast_log(LOG_ERROR, "'%s' not found in [%s] of '%s'\n", args.variable, 
00165          args.category, args.filename);
00166       AST_RWLIST_UNLOCK(&configs);
00167       return -1;
00168    }
00169 
00170    ast_copy_string(buf, val, len);
00171 
00172    /* Unlock down here, so there's no chance the struct goes away while we're using it. */
00173    AST_RWLIST_UNLOCK(&configs);
00174 
00175    return 0;
00176 }

static int load_module ( void   )  [static]

Definition at line 198 of file func_config.c.

References ast_custom_function_register, and config_function.

00199 {
00200    return ast_custom_function_register(&config_function);
00201 }

static int unload_module ( void   )  [static]

Definition at line 183 of file func_config.c.

References ast_config_destroy(), ast_custom_function_unregister(), ast_free, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, config_item::cfg, config_function, and config_item::entry.

00184 {
00185    struct config_item *current;
00186    int res = ast_custom_function_unregister(&config_function);
00187 
00188    AST_RWLIST_WRLOCK(&configs);
00189    while ((current = AST_RWLIST_REMOVE_HEAD(&configs, entry))) {
00190       ast_config_destroy(current->cfg);
00191       ast_free(current);
00192    }
00193    AST_RWLIST_UNLOCK(&configs);
00194 
00195    return res;
00196 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Asterisk configuration file variable access" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 203 of file func_config.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 203 of file func_config.c.

struct ast_custom_function config_function [static]

Initial value:

 {
   .name = "AST_CONFIG",
   .read = config_function_read,
}

Definition at line 178 of file func_config.c.

Referenced by load_module(), and unload_module().


Generated on Mon Jun 27 16:51:14 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7