00001 /* 00002 * Asterisk -- An open source telephony toolkit. 00003 * 00004 * Copyright (C) 1999 - 2005, Digium, Inc. 00005 * 00006 * Mark Spencer <markster@digium.com> 00007 * 00008 * See http://www.asterisk.org for more information about 00009 * the Asterisk project. Please do not directly contact 00010 * any of the maintainers of this project for assistance; 00011 * the project provides a web site, mailing lists and IRC 00012 * channels for your use. 00013 * 00014 * This program is free software, distributed under the terms of 00015 * the GNU General Public License Version 2. See the LICENSE file 00016 * at the top of the source tree. 00017 */ 00018 00019 /*! \file 00020 * \brief Configuration File Parser 00021 */ 00022 00023 #ifndef _ASTERISK_CONFIG_H 00024 #define _ASTERISK_CONFIG_H 00025 00026 #if defined(__cplusplus) || defined(c_plusplus) 00027 extern "C" { 00028 #endif 00029 00030 #include "asterisk/utils.h" 00031 #include "asterisk/inline_api.h" 00032 00033 struct ast_config; 00034 00035 struct ast_category; 00036 00037 /*! Options for ast_config_load() 00038 */ 00039 enum { 00040 /*! Load the configuration, including comments */ 00041 CONFIG_FLAG_WITHCOMMENTS = (1 << 0), 00042 /*! On a reload, give us a -1 if the file hasn't changed. */ 00043 CONFIG_FLAG_FILEUNCHANGED = (1 << 1), 00044 /*! Don't attempt to cache mtime on this config file. */ 00045 CONFIG_FLAG_NOCACHE = (1 << 2), 00046 /*! Don't attempt to load from realtime (typically called from a realtime driver dependency) */ 00047 CONFIG_FLAG_NOREALTIME = (1 << 3), 00048 }; 00049 00050 #define CONFIG_STATUS_FILEMISSING (void *)0 00051 #define CONFIG_STATUS_FILEUNCHANGED (void *)-1 00052 #define CONFIG_STATUS_FILEINVALID (void *)-2 00053 00054 /*! 00055 * \brief Types used in ast_realtime_require_field 00056 */ 00057 typedef enum { 00058 RQ_INTEGER1, 00059 RQ_UINTEGER1, 00060 RQ_INTEGER2, 00061 RQ_UINTEGER2, 00062 RQ_INTEGER3, 00063 RQ_UINTEGER3, 00064 RQ_INTEGER4, 00065 RQ_UINTEGER4, 00066 RQ_INTEGER8, 00067 RQ_UINTEGER8, 00068 RQ_CHAR, 00069 RQ_FLOAT, 00070 RQ_DATE, 00071 RQ_DATETIME, 00072 } require_type; 00073 00074 /*! \brief Structure for variables, used for configurations and for channel variables */ 00075 struct ast_variable { 00076 /*! Variable name. Stored in stuff[] at struct end. */ 00077 const char *name; 00078 /*! Variable value. Stored in stuff[] at struct end. */ 00079 const char *value; 00080 00081 /*! Next node in the list. */ 00082 struct ast_variable *next; 00083 00084 /*! Filename where variable found. Stored in stuff[] at struct end. */ 00085 const char *file; 00086 00087 int lineno; 00088 int object; /*!< 0 for variable, 1 for object */ 00089 int blanklines; /*!< Number of blanklines following entry */ 00090 struct ast_comment *precomments; 00091 struct ast_comment *sameline; 00092 struct ast_comment *trailing; /*!< the last object in the list will get assigned any trailing comments when EOF is hit */ 00093 /*! 00094 * \brief Contents of file, name, and value in that order stuffed here. 00095 * \note File must be stuffed before name because of ast_include_rename(). 00096 */ 00097 char stuff[0]; 00098 }; 00099 00100 typedef struct ast_config *config_load_func(const char *database, const char *table, const char *configfile, struct ast_config *config, struct ast_flags flags, const char *suggested_include_file, const char *who_asked); 00101 typedef struct ast_variable *realtime_var_get(const char *database, const char *table, va_list ap); 00102 typedef struct ast_config *realtime_multi_get(const char *database, const char *table, va_list ap); 00103 typedef int realtime_update(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap); 00104 typedef int realtime_update2(const char *database, const char *table, va_list ap); 00105 typedef int realtime_store(const char *database, const char *table, va_list ap); 00106 typedef int realtime_destroy(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap); 00107 00108 /*! 00109 * \brief Function pointer called to ensure database schema is properly configured for realtime use 00110 * \since 1.6.1 00111 */ 00112 typedef int realtime_require(const char *database, const char *table, va_list ap); 00113 00114 /*! 00115 * \brief Function pointer called to clear the database cache and free resources used for such 00116 * \since 1.6.1 00117 */ 00118 typedef int realtime_unload(const char *database, const char *table); 00119 00120 /*! \brief Configuration engine structure, used to define realtime drivers */ 00121 struct ast_config_engine { 00122 char *name; 00123 config_load_func *load_func; 00124 realtime_var_get *realtime_func; 00125 realtime_multi_get *realtime_multi_func; 00126 realtime_update *update_func; 00127 realtime_update2 *update2_func; 00128 realtime_store *store_func; 00129 realtime_destroy *destroy_func; 00130 realtime_require *require_func; 00131 realtime_unload *unload_func; 00132 struct ast_config_engine *next; 00133 }; 00134 00135 /*! 00136 * \brief Load a config file 00137 * 00138 * \param filename path of file to open. If no preceding '/' character, 00139 * path is considered relative to AST_CONFIG_DIR 00140 * \param who_asked The module which is making this request. 00141 * \param flags Optional flags: 00142 * CONFIG_FLAG_WITHCOMMENTS - load the file with comments intact; 00143 * CONFIG_FLAG_FILEUNCHANGED - check the file mtime and return CONFIG_STATUS_FILEUNCHANGED if the mtime is the same; or 00144 * CONFIG_FLAG_NOCACHE - don't cache file mtime (main purpose of this option is to save memory on temporary files). 00145 * 00146 * \details 00147 * Create a config structure from a given configuration file. 00148 * 00149 * \return an ast_config data structure on success 00150 * \retval NULL on error 00151 */ 00152 struct ast_config *ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags); 00153 00154 /*! 00155 * \brief Load a config file 00156 * 00157 * \param filename path of file to open. If no preceding '/' character, 00158 * path is considered relative to AST_CONFIG_DIR 00159 * \param flags Optional flags: 00160 * CONFIG_FLAG_WITHCOMMENTS - load the file with comments intact; 00161 * CONFIG_FLAG_FILEUNCHANGED - check the file mtime and return CONFIG_STATUS_FILEUNCHANGED if the mtime is the same; or 00162 * CONFIG_FLAG_NOCACHE - don't cache file mtime (main purpose of this option is to save memory on temporary files). 00163 * 00164 * \details 00165 * Create a config structure from a given configuration file. 00166 * 00167 * \return an ast_config data structure on success 00168 * \retval NULL on error 00169 */ 00170 #define ast_config_load(filename, flags) ast_config_load2(filename, AST_MODULE, flags) 00171 00172 /*! 00173 * \brief Destroys a config 00174 * 00175 * \param config pointer to config data structure 00176 * 00177 * \details 00178 * Free memory associated with a given config 00179 */ 00180 void ast_config_destroy(struct ast_config *config); 00181 00182 /*! 00183 * \brief returns the root ast_variable of a config 00184 * 00185 * \param config pointer to an ast_config data structure 00186 * \param cat name of the category for which you want the root 00187 * 00188 * \return the category specified 00189 */ 00190 struct ast_variable *ast_category_root(struct ast_config *config, char *cat); 00191 00192 /*! 00193 * \brief Sorts categories in a config in the order of a numerical value contained within them. 00194 * 00195 * \param config The config structure you wish to sort 00196 * \param variable Which numerical value you wish to sort by 00197 * \param descending If true, we sort highest to lowest instead of lowest to highest 00198 * 00199 * \details 00200 * This function will assume a value of 0 for any non-numerical strings and NULL fields. 00201 */ 00202 void ast_config_sort_categories(struct ast_config *config, int descending, 00203 int (*comparator)(struct ast_category *p, struct ast_category *q)); 00204 00205 /*! 00206 * \brief Goes through categories 00207 * 00208 * \param config Which config structure you wish to "browse" 00209 * \param prev A pointer to a previous category. 00210 * 00211 * \details 00212 * This function is kind of non-intuitive in it's use. 00213 * To begin, one passes NULL as the second argument. 00214 * It will return a pointer to the string of the first category in the file. 00215 * From here on after, one must then pass the previous usage's return value 00216 * as the second pointer, and it will return a pointer to the category name 00217 * afterwards. 00218 * 00219 * \retval a category on success 00220 * \retval NULL on failure/no-more-categories 00221 */ 00222 char *ast_category_browse(struct ast_config *config, const char *prev); 00223 00224 /*! 00225 * \brief Goes through variables 00226 * 00227 * \details 00228 * Somewhat similar in intent as the ast_category_browse. 00229 * List variables of config file category 00230 * 00231 * \retval ast_variable list on success 00232 * \retval NULL on failure 00233 */ 00234 struct ast_variable *ast_variable_browse(const struct ast_config *config, const char *category); 00235 00236 /*! 00237 * \brief given a pointer to a category, return the root variable. 00238 * 00239 * \details 00240 * This is equivalent to ast_variable_browse(), but more efficient if we 00241 * already have the struct ast_category * (e.g. from ast_category_get()) 00242 */ 00243 struct ast_variable *ast_category_first(struct ast_category *cat); 00244 00245 /*! 00246 * \brief Gets a variable 00247 * 00248 * \param config which (opened) config to use 00249 * \param category category under which the variable lies 00250 * \param variable which variable you wish to get the data for 00251 * 00252 * \details 00253 * Goes through a given config file in the given category and searches for the given variable 00254 * 00255 * \retval The variable value on success 00256 * \retval NULL if unable to find it. 00257 */ 00258 const char *ast_variable_retrieve(const struct ast_config *config, const char *category, const char *variable); 00259 00260 /*! 00261 * \brief Retrieve a category if it exists 00262 * 00263 * \param config which config to use 00264 * \param category_name name of the category you're looking for 00265 * 00266 * \details 00267 * This will search through the categories within a given config file for a match. 00268 * 00269 * \retval pointer to category if found 00270 * \retval NULL if not. 00271 */ 00272 struct ast_category *ast_category_get(const struct ast_config *config, const char *category_name); 00273 00274 /*! 00275 * \brief Check for category duplicates 00276 * 00277 * \param config which config to use 00278 * \param category_name name of the category you're looking for 00279 * 00280 * \details 00281 * This will search through the categories within a given config file for a match. 00282 * 00283 * \return non-zero if found 00284 */ 00285 int ast_category_exist(const struct ast_config *config, const char *category_name); 00286 00287 /*! 00288 * \brief Retrieve realtime configuration 00289 * 00290 * \param family which family/config to lookup 00291 * 00292 * \details 00293 * This will use builtin configuration backends to look up a particular 00294 * entity in realtime and return a variable list of its parameters. 00295 * 00296 * \note 00297 * Unlike the variables in ast_config, the resulting list of variables 00298 * MUST be freed with ast_variables_destroy() as there is no container. 00299 * 00300 * \note 00301 * The difference between these two calls is that ast_load_realtime excludes 00302 * fields whose values are NULL, while ast_load_realtime_all loads all columns. 00303 * 00304 * \note 00305 * You should use the constant SENTINEL to terminate arguments, in 00306 * order to preserve cross-platform compatibility. 00307 */ 00308 struct ast_variable *ast_load_realtime(const char *family, ...) attribute_sentinel; 00309 struct ast_variable *ast_load_realtime_all(const char *family, ...) attribute_sentinel; 00310 00311 /*! 00312 * \brief Release any resources cached for a realtime family 00313 * \since 1.6.1 00314 * 00315 * \param family which family/config to destroy 00316 * 00317 * \details 00318 * Various backends may cache attributes about a realtime data storage 00319 * facility; on reload, a front end resource may request to purge that cache. 00320 * 00321 * \retval 0 If any cache was purged 00322 * \retval -1 If no cache was found 00323 */ 00324 int ast_unload_realtime(const char *family); 00325 00326 /*! 00327 * \brief Inform realtime what fields that may be stored 00328 * \since 1.6.1 00329 * 00330 * \param family which family/config is referenced 00331 * 00332 * \details 00333 * This will inform builtin configuration backends that particular fields 00334 * may be updated during the use of that configuration section. This is 00335 * mainly to be used during startup routines, to ensure that various fields 00336 * exist in the backend. The backends may take various actions, such as 00337 * creating new fields in the data store or warning the administrator that 00338 * new fields may need to be created, in order to ensure proper function. 00339 * 00340 * The arguments are specified in groups of 3: column name, column type, 00341 * and column size. The column types are specified as integer constants, 00342 * defined by the enum require_type. Note that the size is specified as 00343 * the number of equivalent character fields that a field may take up, even 00344 * if a field is otherwise specified as an integer type. This is due to 00345 * the fact that some fields have historically been specified as character 00346 * types, even if they contained integer values. 00347 * 00348 * A family should always specify its fields to the minimum necessary 00349 * requirements to fulfill all possible values (within reason; for example, 00350 * a timeout value may reasonably be specified as an INTEGER2, with size 5. 00351 * Even though values above 32767 seconds are possible, they are unlikely 00352 * to be useful, and we should not complain about that size). 00353 * 00354 * \retval 0 Required fields met specified standards 00355 * \retval -1 One or more fields was missing or insufficient 00356 * 00357 * \note You should use the constant SENTINEL to terminate arguments, in 00358 * order to preserve cross-platform compatibility. 00359 */ 00360 int ast_realtime_require_field(const char *family, ...) attribute_sentinel; 00361 00362 /*! 00363 * \brief Retrieve realtime configuration 00364 * 00365 * \param family which family/config to lookup 00366 * 00367 * \details 00368 * This will use builtin configuration backends to look up a particular 00369 * entity in realtime and return a variable list of its parameters. Unlike 00370 * the ast_load_realtime, this function can return more than one entry and 00371 * is thus stored inside a traditional ast_config structure rather than 00372 * just returning a linked list of variables. 00373 * 00374 * \return An ast_config with one or more results 00375 * \retval NULL Error or no results returned 00376 * 00377 * \note You should use the constant SENTINEL to terminate arguments, in 00378 * order to preserve cross-platform compatibility. 00379 */ 00380 struct ast_config *ast_load_realtime_multientry(const char *family, ...) attribute_sentinel; 00381 00382 /*! 00383 * \brief Update realtime configuration 00384 * 00385 * \param family which family/config to be updated 00386 * \param keyfield which field to use as the key 00387 * \param lookup which value to look for in the key field to match the entry. 00388 * 00389 * \details 00390 * This function is used to update a parameter in realtime configuration space. 00391 * 00392 * \return Number of rows affected, or -1 on error. 00393 * 00394 * \note You should use the constant SENTINEL to terminate arguments, in 00395 * order to preserve cross-platform compatibility. 00396 */ 00397 int ast_update_realtime(const char *family, const char *keyfield, const char *lookup, ...) attribute_sentinel; 00398 00399 /*! 00400 * \brief Update realtime configuration 00401 * 00402 * \param family which family/config to be updated 00403 * 00404 * \details 00405 * This function is used to update a parameter in realtime configuration space. 00406 * It includes the ability to lookup a row based upon multiple key criteria. 00407 * As a result, this function includes two sentinel values, one to terminate 00408 * lookup values and the other to terminate the listing of fields to update. 00409 * 00410 * \return Number of rows affected, or -1 on error. 00411 * 00412 * \note You should use the constant SENTINEL to terminate arguments, in 00413 * order to preserve cross-platform compatibility. 00414 */ 00415 int ast_update2_realtime(const char *family, ...) attribute_sentinel; 00416 00417 /*! 00418 * \brief Create realtime configuration 00419 * 00420 * \param family which family/config to be created 00421 * 00422 * \details 00423 * This function is used to create a parameter in realtime configuration space. 00424 * 00425 * \return Number of rows affected, or -1 on error. 00426 * 00427 * \note 00428 * On the MySQL engine only, for reasons of backwards compatibility, the return 00429 * value is the insert ID. This value is nonportable and may be changed in a 00430 * future version to match the other engines. 00431 * 00432 * \note You should use the constant SENTINEL to terminate arguments, in 00433 * order to preserve cross-platform compatibility. 00434 */ 00435 int ast_store_realtime(const char *family, ...) attribute_sentinel; 00436 00437 /*! 00438 * \brief Destroy realtime configuration 00439 * 00440 * \param family which family/config to be destroyed 00441 * \param keyfield which field to use as the key 00442 * \param lookup which value to look for in the key field to match the entry. 00443 * 00444 * \details 00445 * This function is used to destroy an entry in realtime configuration space. 00446 * Additional params are used as keys. 00447 * 00448 * \return Number of rows affected, or -1 on error. 00449 * 00450 * \note You should use the constant SENTINEL to terminate arguments, in 00451 * order to preserve cross-platform compatibility. 00452 */ 00453 int ast_destroy_realtime(const char *family, const char *keyfield, const char *lookup, ...) attribute_sentinel; 00454 00455 /*! 00456 * \brief Check if realtime engine is configured for family 00457 * \param family which family/config to be checked 00458 * \return 1 if family is configured in realtime and engine exists 00459 */ 00460 int ast_check_realtime(const char *family); 00461 00462 /*! \brief Check if there's any realtime engines loaded */ 00463 int ast_realtime_enabled(void); 00464 00465 /*! 00466 * \brief Duplicate variable list 00467 * \param var the linked list of variables to clone 00468 * \return A duplicated list which you'll need to free with 00469 * ast_variables_destroy or NULL when out of memory. 00470 * 00471 * \note Do not depend on this to copy more than just name, value and filename 00472 * (the arguments to ast_variables_new). 00473 */ 00474 struct ast_variable *ast_variables_dup(struct ast_variable *var); 00475 00476 /*! 00477 * \brief Free variable list 00478 * \param var the linked list of variables to free 00479 * 00480 * \details 00481 * This function frees a list of variables. 00482 */ 00483 void ast_variables_destroy(struct ast_variable *var); 00484 00485 /*! 00486 * \brief Register config engine 00487 * \retval 1 Always 00488 */ 00489 int ast_config_engine_register(struct ast_config_engine *newconfig); 00490 00491 /*! 00492 * \brief Deregister config engine 00493 * \retval 0 Always 00494 */ 00495 int ast_config_engine_deregister(struct ast_config_engine *del); 00496 00497 /*! 00498 * \brief Determine if a mapping exists for a given family 00499 * 00500 * \param family which family you are looking to see if a mapping exists for 00501 * \retval 1 if it is mapped 00502 * \retval 0 if it is not 00503 */ 00504 int ast_realtime_is_mapping_defined(const char *family); 00505 00506 /*! 00507 * \brief Exposed initialization method for core process 00508 * 00509 * \details 00510 * This method is intended for use only with the core initialization and is 00511 * not designed to be called from any user applications. 00512 */ 00513 int register_config_cli(void); 00514 00515 /*! 00516 * \brief Exposed re-initialization method for core process 00517 * 00518 * \details 00519 * This method is intended for use only with the core re-initialization and is 00520 * not designed to be called from any user applications. 00521 */ 00522 int read_config_maps(void); 00523 00524 /*! \brief Create a new base configuration structure */ 00525 struct ast_config *ast_config_new(void); 00526 00527 /*! 00528 * \brief Retrieve the current category name being built. 00529 * 00530 * \details 00531 * API for backend configuration engines while building a configuration set. 00532 */ 00533 struct ast_category *ast_config_get_current_category(const struct ast_config *cfg); 00534 00535 /*! 00536 * \brief Set the category within the configuration as being current. 00537 * 00538 * \details 00539 * API for backend configuration engines while building a configuration set. 00540 */ 00541 void ast_config_set_current_category(struct ast_config *cfg, const struct ast_category *cat); 00542 00543 /*! 00544 * \brief Retrieve a configuration variable within the configuration set. 00545 * 00546 * \details 00547 * Retrieves the named variable \p var within category \p cat of configuration 00548 * set \p cfg. If not found, attempts to retrieve the named variable \p var 00549 * from within category \em general. 00550 * 00551 * \return Value of \p var, or NULL if not found. 00552 */ 00553 const char *ast_config_option(struct ast_config *cfg, const char *cat, const char *var); 00554 00555 /*! \brief Create a category structure */ 00556 struct ast_category *ast_category_new(const char *name, const char *in_file, int lineno); 00557 void ast_category_append(struct ast_config *config, struct ast_category *cat); 00558 00559 /*! 00560 * \brief Inserts new category 00561 * 00562 * \param config which config to use 00563 * \param cat newly created category to insert 00564 * \param match which category to insert above 00565 * 00566 * \details 00567 * This function is used to insert a new category above another category 00568 * matching the match parameter. 00569 */ 00570 void ast_category_insert(struct ast_config *config, struct ast_category *cat, const char *match); 00571 int ast_category_delete(struct ast_config *cfg, const char *category); 00572 00573 /*! 00574 * \brief Removes and destroys all variables within a category 00575 * \retval 0 if the category was found and emptied 00576 * \retval -1 if the category was not found 00577 */ 00578 int ast_category_empty(struct ast_config *cfg, const char *category); 00579 void ast_category_destroy(struct ast_category *cat); 00580 struct ast_variable *ast_category_detach_variables(struct ast_category *cat); 00581 void ast_category_rename(struct ast_category *cat, const char *name); 00582 00583 #ifdef MALLOC_DEBUG 00584 struct ast_variable *_ast_variable_new(const char *name, const char *value, const char *filename, const char *file, const char *function, int lineno); 00585 #define ast_variable_new(a, b, c) _ast_variable_new(a, b, c, __FILE__, __PRETTY_FUNCTION__, __LINE__) 00586 #else 00587 struct ast_variable *ast_variable_new(const char *name, const char *value, const char *filename); 00588 #endif 00589 struct ast_config_include *ast_include_new(struct ast_config *conf, const char *from_file, const char *included_file, int is_exec, const char *exec_file, int from_lineno, char *real_included_file_name, int real_included_file_name_size); 00590 struct ast_config_include *ast_include_find(struct ast_config *conf, const char *included_file); 00591 void ast_include_rename(struct ast_config *conf, const char *from_file, const char *to_file); 00592 void ast_variable_append(struct ast_category *category, struct ast_variable *variable); 00593 void ast_variable_insert(struct ast_category *category, struct ast_variable *variable, const char *line); 00594 int ast_variable_delete(struct ast_category *category, const char *variable, const char *match, const char *line); 00595 00596 /*! 00597 * \brief Update variable value within a config 00598 * 00599 * \param category Category element within the config 00600 * \param variable Name of the variable to change 00601 * \param value New value of the variable 00602 * \param match If set, previous value of the variable (if NULL or zero-length, no matching will be done) 00603 * \param object Boolean of whether to make the new variable an object 00604 * 00605 * \return 0 on success or -1 on failure. 00606 */ 00607 int ast_variable_update(struct ast_category *category, const char *variable, 00608 const char *value, const char *match, unsigned int object); 00609 00610 int ast_config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator); 00611 int config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator) __attribute__((deprecated)); 00612 00613 struct ast_config *ast_config_internal_load(const char *configfile, struct ast_config *cfg, struct ast_flags flags, const char *suggested_incl_file, const char *who_asked); 00614 /*! 00615 * \brief 00616 * Copies the contents of one ast_config into another 00617 * 00618 * \note 00619 * This creates a config on the heap. The caller of this must 00620 * be prepared to free the memory returned. 00621 * 00622 * \param orig the config to copy 00623 * \return The new config on success, NULL on failure. 00624 */ 00625 struct ast_config *ast_config_copy(const struct ast_config *orig); 00626 00627 /*! 00628 * \brief 00629 * Flags that affect the behaviour of config hooks. 00630 */ 00631 enum config_hook_flags { 00632 butt, 00633 }; 00634 00635 /* 00636 * \brief Callback when configuration is updated 00637 * 00638 * \param cfg A copy of the configuration that is being changed. 00639 * This MUST be freed by the callback before returning. 00640 */ 00641 typedef int (*config_hook_cb)(struct ast_config *cfg); 00642 00643 /*! 00644 * \brief 00645 * Register a config hook for a particular file and module 00646 * 00647 * \param name The name of the hook you are registering. 00648 * \param filename The file whose config you wish to hook into. 00649 * \param module The module that is reloading the config. This 00650 * can be useful if multiple modules may possibly 00651 * reload the same file, but you are only interested 00652 * when a specific module reloads the file 00653 * \param flags Flags that affect the way hooks work. 00654 * \param hook The callback to be called when config is loaded. 00655 * return 0 Success 00656 * return -1 Unsuccess, also known as UTTER AND COMPLETE FAILURE 00657 */ 00658 int ast_config_hook_register(const char *name, 00659 const char *filename, 00660 const char *module, 00661 enum config_hook_flags flags, 00662 config_hook_cb hook); 00663 00664 /*! 00665 * \brief 00666 * Unregister a config hook 00667 * 00668 * \param name The name of the hook to unregister 00669 */ 00670 void ast_config_hook_unregister(const char *name); 00671 00672 /*! 00673 * \brief Support code to parse config file arguments 00674 * 00675 * \details 00676 * The function ast_parse_arg() provides a generic interface to parse 00677 * strings (e.g. numbers, network addresses and so on) in a flexible 00678 * way, e.g. by doing proper error and bound checks, provide default 00679 * values, and so on. 00680 * The function (described later) takes a string as an argument, 00681 * a set of flags to specify the result format and checks to perform, 00682 * a pointer to the result, and optionally some additional arguments. 00683 * 00684 * \return It returns 0 on success, != 0 otherwise. 00685 */ 00686 enum ast_parse_flags { 00687 /* low 4 bits of flags are used for the operand type */ 00688 PARSE_TYPE = 0x000f, 00689 /* numeric types, with optional default value and bound checks. 00690 * Additional arguments are passed by value. 00691 */ 00692 PARSE_INT32 = 0x0001, 00693 PARSE_UINT32 = 0x0002, 00694 PARSE_DOUBLE = 0x0003, 00695 #if 0 /* not supported yet */ 00696 PARSE_INT16 = 0x0004, 00697 PARSE_UINT16 = 0x0005, 00698 #endif 00699 00700 /* Returns a struct ast_sockaddr, with optional default value 00701 * (passed by reference) and port handling (accept, ignore, 00702 * require, forbid). The format is 'ipaddress[:port]'. IPv6 address 00703 * literals need square brackets around them if a port is specified. 00704 */ 00705 PARSE_ADDR = 0x000e, 00706 00707 /* Returns a struct sockaddr_in, with optional default value 00708 * (passed by reference) and port handling (accept, ignore, 00709 * require, forbid). The format is 'host.name[:port]' 00710 */ 00711 PARSE_INADDR = 0x000f, 00712 00713 /* Other data types can be added as needed */ 00714 00715 /* If PARSE_DEFAULT is set, next argument is a default value 00716 * which is returned in case of error. The argument is passed 00717 * by value in case of numeric types, by reference in other cases. 00718 */ 00719 PARSE_DEFAULT = 0x0010, /* assign default on error */ 00720 00721 /* Request a range check, applicable to numbers. Two additional 00722 * arguments are passed by value, specifying the low-high end of 00723 * the range (inclusive). An error is returned if the value 00724 * is outside or inside the range, respectively. 00725 */ 00726 PARSE_IN_RANGE = 0x0020, /* accept values inside a range */ 00727 PARSE_OUT_RANGE = 0x0040, /* accept values outside a range */ 00728 PARSE_RANGE_DEFAULTS = 0x0080, /* default to range min/max on range error */ 00729 00730 /* Port handling, for ast_sockaddr. accept/ignore/require/forbid 00731 * port number after the hostname or address. 00732 */ 00733 PARSE_PORT_MASK = 0x0300, /* 0x000: accept port if present */ 00734 PARSE_PORT_IGNORE = 0x0100, /* 0x100: ignore port if present */ 00735 PARSE_PORT_REQUIRE = 0x0200, /* 0x200: require port number */ 00736 PARSE_PORT_FORBID = 0x0300, /* 0x100: forbid port number */ 00737 }; 00738 00739 /*! 00740 * \brief The argument parsing routine. 00741 * 00742 * \param arg the string to parse. It is not modified. 00743 * \param flags combination of ast_parse_flags to specify the 00744 * return type and additional checks. 00745 * \param result pointer to the result. NULL is valid here, and can 00746 * be used to perform only the validity checks. 00747 * \param ... extra arguments are required according to flags. 00748 * 00749 * \retval 0 in case of success, != 0 otherwise. 00750 * \retval result returns the parsed value in case of success, 00751 * the default value in case of error, or it is left unchanged 00752 * in case of error and no default specified. Note that in certain 00753 * cases (e.g. sockaddr_in, with multi-field return values) some 00754 * of the fields in result may be changed even if an error occurs. 00755 * 00756 * \details 00757 * Examples of use: 00758 * ast_parse_arg("223", PARSE_INT32|PARSE_IN_RANGE, &a, -1000, 1000); 00759 * returns 0, a = 223 00760 * ast_parse_arg("22345", PARSE_INT32|PARSE_IN_RANGE|PARSE_DEFAULT, &a, 9999, 10, 100); 00761 * returns 1, a = 9999 00762 * ast_parse_arg("22345ssf", PARSE_UINT32|PARSE_IN_RANGE, &b, 10, 100); 00763 * returns 1, b unchanged 00764 * ast_parse_arg("12", PARSE_UINT32|PARSE_IN_RANGE|PARSE_RANGE_DEFAULTS, &a, 1, 10); 00765 * returns 1, a = 10 00766 * ast_parse_arg("www.foo.biz:44", PARSE_INADDR, &sa); 00767 * returns 0, sa contains address and port 00768 * ast_parse_arg("www.foo.biz", PARSE_INADDR|PARSE_PORT_REQUIRE, &sa); 00769 * returns 1 because port is missing, sa contains address 00770 */ 00771 int ast_parse_arg(const char *arg, enum ast_parse_flags flags, 00772 void *result, ...); 00773 00774 /* 00775 * Parsing config file options in C is slightly annoying because we cannot use 00776 * string in a switch() statement, yet we need a similar behaviour, with many 00777 * branches and a break on a matching one. 00778 * The following somehow simplifies the job: we create a block using 00779 * the CV_START and CV_END macros, and then within the block we can run 00780 * actions such as "if (condition) { body; break; }" 00781 * Additional macros are present to run simple functions (e.g. ast_copy_string) 00782 * or to pass arguments to ast_parse_arg() 00783 * 00784 * As an example: 00785 00786 CV_START(v->name, v->value); // start the block 00787 CV_STR("foo", x_foo); // static string 00788 CV_DSTR("bar", y_bar); // malloc'ed string 00789 CV_F("bar", ...); // call a generic function 00790 CV_END; // end the block 00791 */ 00792 00793 /*! \brief the macro to open a block for variable parsing */ 00794 #define CV_START(__in_var, __in_val) \ 00795 do { \ 00796 const char *__var = __in_var; \ 00797 const char *__val = __in_val; 00798 00799 /*! \brief close a variable parsing block */ 00800 #define CV_END } while (0) 00801 00802 /*! \brief call a generic function if the name matches. */ 00803 #define CV_F(__pattern, __body) if (!strcasecmp((__var), __pattern)) { __body; break; } 00804 00805 /*! 00806 * \brief helper macros to assign the value to a BOOL, UINT, static string and 00807 * dynamic string 00808 */ 00809 #define CV_BOOL(__x, __dst) CV_F(__x, (__dst) = ast_true(__val) ) 00810 #define CV_UINT(__x, __dst) CV_F(__x, (__dst) = strtoul(__val, NULL, 0) ) 00811 #define CV_STR(__x, __dst) CV_F(__x, ast_copy_string(__dst, __val, sizeof(__dst))) 00812 #define CV_DSTR(__x, __dst) CV_F(__x, ast_free(__dst); __dst = ast_strdup(__val)) 00813 #define CV_STRFIELD(__x, __obj, __field) CV_F(__x, ast_string_field_set(__obj, __field, __val)) 00814 00815 /*! \brief Check if require type is an integer type */ 00816 AST_INLINE_API( 00817 int ast_rq_is_int(require_type type), 00818 { 00819 switch (type) { 00820 case RQ_INTEGER1: 00821 case RQ_UINTEGER1: 00822 case RQ_INTEGER2: 00823 case RQ_UINTEGER2: 00824 case RQ_INTEGER3: 00825 case RQ_UINTEGER3: 00826 case RQ_INTEGER4: 00827 case RQ_UINTEGER4: 00828 case RQ_INTEGER8: 00829 case RQ_UINTEGER8: 00830 return 1; 00831 default: 00832 return 0; 00833 } 00834 } 00835 ) 00836 00837 /*! 00838 * \brief Remove standard encoding from realtime values, which ensures 00839 * that a semicolon embedded within a single value is not treated upon 00840 * retrieval as multiple values. 00841 * \param chunk Data to be decoded 00842 * \return The decoded data, in the original buffer 00843 * \since 1.8 00844 * \warn This function modifies the original buffer 00845 */ 00846 char *ast_realtime_decode_chunk(char *chunk); 00847 00848 /*! 00849 * \brief Encodes a chunk of data for realtime 00850 * \param dest Destination buffer 00851 * \param maxlen Length passed through to ast_str_* functions 00852 * \param chunk Source data to be encoded 00853 * \return Buffer within dest 00854 * \since 1.8 00855 */ 00856 char *ast_realtime_encode_chunk(struct ast_str **dest, ssize_t maxlen, const char *chunk); 00857 00858 #if defined(__cplusplus) || defined(c_plusplus) 00859 } 00860 #endif 00861 00862 #endif /* _ASTERISK_CONFIG_H */