#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_info * | ast_module_info = &__mod_info |
static struct ast_custom_function | config_function |
Tilghman Lesher <func_config__200803@the-tilghman.com>
Definition in file func_config.c.
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 }
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().