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 Goes through categories 00194 * 00195 * \param config Which config structure you wish to "browse" 00196 * \param prev A pointer to a previous category. 00197 * 00198 * \details 00199 * This function is kind of non-intuitive in it's use. 00200 * To begin, one passes NULL as the second argument. 00201 * It will return a pointer to the string of the first category in the file. 00202 * From here on after, one must then pass the previous usage's return value 00203 * as the second pointer, and it will return a pointer to the category name 00204 * afterwards. 00205 * 00206 * \retval a category on success 00207 * \retval NULL on failure/no-more-categories 00208 */ 00209 char *ast_category_browse(struct ast_config *config, const char *prev); 00210 00211 /*! 00212 * \brief Goes through variables 00213 * 00214 * \details 00215 * Somewhat similar in intent as the ast_category_browse. 00216 * List variables of config file category 00217 * 00218 * \retval ast_variable list on success 00219 * \retval NULL on failure 00220 */ 00221 struct ast_variable *ast_variable_browse(const struct ast_config *config, const char *category); 00222 00223 /*! 00224 * \brief given a pointer to a category, return the root variable. 00225 * 00226 * \details 00227 * This is equivalent to ast_variable_browse(), but more efficient if we 00228 * already have the struct ast_category * (e.g. from ast_category_get()) 00229 */ 00230 struct ast_variable *ast_category_first(struct ast_category *cat); 00231 00232 /*! 00233 * \brief Gets a variable 00234 * 00235 * \param config which (opened) config to use 00236 * \param category category under which the variable lies 00237 * \param variable which variable you wish to get the data for 00238 * 00239 * \details 00240 * Goes through a given config file in the given category and searches for the given variable 00241 * 00242 * \retval The variable value on success 00243 * \retval NULL if unable to find it. 00244 */ 00245 const char *ast_variable_retrieve(const struct ast_config *config, const char *category, const char *variable); 00246 00247 /*! 00248 * \brief Retrieve a category if it exists 00249 * 00250 * \param config which config to use 00251 * \param category_name name of the category you're looking for 00252 * 00253 * \details 00254 * This will search through the categories within a given config file for a match. 00255 * 00256 * \retval pointer to category if found 00257 * \retval NULL if not. 00258 */ 00259 struct ast_category *ast_category_get(const struct ast_config *config, const char *category_name); 00260 00261 /*! 00262 * \brief Check for category duplicates 00263 * 00264 * \param config which config to use 00265 * \param category_name name of the category you're looking for 00266 * 00267 * \details 00268 * This will search through the categories within a given config file for a match. 00269 * 00270 * \return non-zero if found 00271 */ 00272 int ast_category_exist(const struct ast_config *config, const char *category_name); 00273 00274 /*! 00275 * \brief Retrieve realtime configuration 00276 * 00277 * \param family which family/config to lookup 00278 * 00279 * \details 00280 * This will use builtin configuration backends to look up a particular 00281 * entity in realtime and return a variable list of its parameters. 00282 * 00283 * \note 00284 * Unlike the variables in ast_config, the resulting list of variables 00285 * MUST be freed with ast_variables_destroy() as there is no container. 00286 * 00287 * \note 00288 * The difference between these two calls is that ast_load_realtime excludes 00289 * fields whose values are NULL, while ast_load_realtime_all loads all columns. 00290 * 00291 * \note 00292 * You should use the constant SENTINEL to terminate arguments, in 00293 * order to preserve cross-platform compatibility. 00294 */ 00295 struct ast_variable *ast_load_realtime(const char *family, ...) attribute_sentinel; 00296 struct ast_variable *ast_load_realtime_all(const char *family, ...) attribute_sentinel; 00297 00298 /*! 00299 * \brief Release any resources cached for a realtime family 00300 * \since 1.6.1 00301 * 00302 * \param family which family/config to destroy 00303 * 00304 * \details 00305 * Various backends may cache attributes about a realtime data storage 00306 * facility; on reload, a front end resource may request to purge that cache. 00307 * 00308 * \retval 0 If any cache was purged 00309 * \retval -1 If no cache was found 00310 */ 00311 int ast_unload_realtime(const char *family); 00312 00313 /*! 00314 * \brief Inform realtime what fields that may be stored 00315 * \since 1.6.1 00316 * 00317 * \param family which family/config is referenced 00318 * 00319 * \details 00320 * This will inform builtin configuration backends that particular fields 00321 * may be updated during the use of that configuration section. This is 00322 * mainly to be used during startup routines, to ensure that various fields 00323 * exist in the backend. The backends may take various actions, such as 00324 * creating new fields in the data store or warning the administrator that 00325 * new fields may need to be created, in order to ensure proper function. 00326 * 00327 * The arguments are specified in groups of 3: column name, column type, 00328 * and column size. The column types are specified as integer constants, 00329 * defined by the enum require_type. Note that the size is specified as 00330 * the number of equivalent character fields that a field may take up, even 00331 * if a field is otherwise specified as an integer type. This is due to 00332 * the fact that some fields have historically been specified as character 00333 * types, even if they contained integer values. 00334 * 00335 * A family should always specify its fields to the minimum necessary 00336 * requirements to fulfill all possible values (within reason; for example, 00337 * a timeout value may reasonably be specified as an INTEGER2, with size 5. 00338 * Even though values above 32767 seconds are possible, they are unlikely 00339 * to be useful, and we should not complain about that size). 00340 * 00341 * \retval 0 Required fields met specified standards 00342 * \retval -1 One or more fields was missing or insufficient 00343 * 00344 * \note You should use the constant SENTINEL to terminate arguments, in 00345 * order to preserve cross-platform compatibility. 00346 */ 00347 int ast_realtime_require_field(const char *family, ...) attribute_sentinel; 00348 00349 /*! 00350 * \brief Retrieve realtime configuration 00351 * 00352 * \param family which family/config to lookup 00353 * 00354 * \details 00355 * This will use builtin configuration backends to look up a particular 00356 * entity in realtime and return a variable list of its parameters. Unlike 00357 * the ast_load_realtime, this function can return more than one entry and 00358 * is thus stored inside a traditional ast_config structure rather than 00359 * just returning a linked list of variables. 00360 * 00361 * \note You should use the constant SENTINEL to terminate arguments, in 00362 * order to preserve cross-platform compatibility. 00363 */ 00364 struct ast_config *ast_load_realtime_multientry(const char *family, ...) attribute_sentinel; 00365 00366 /*! 00367 * \brief Update realtime configuration 00368 * 00369 * \param family which family/config to be updated 00370 * \param keyfield which field to use as the key 00371 * \param lookup which value to look for in the key field to match the entry. 00372 * 00373 * \details 00374 * This function is used to update a parameter in realtime configuration space. 00375 * 00376 * \return Number of rows affected, or -1 on error. 00377 * 00378 * \note You should use the constant SENTINEL to terminate arguments, in 00379 * order to preserve cross-platform compatibility. 00380 */ 00381 int ast_update_realtime(const char *family, const char *keyfield, const char *lookup, ...) attribute_sentinel; 00382 00383 /*! 00384 * \brief Update realtime configuration 00385 * 00386 * \param family which family/config to be updated 00387 * 00388 * \details 00389 * This function is used to update a parameter in realtime configuration space. 00390 * It includes the ability to lookup a row based upon multiple key criteria. 00391 * As a result, this function includes two sentinel values, one to terminate 00392 * lookup values and the other to terminate the listing of fields to update. 00393 * 00394 * \return Number of rows affected, or -1 on error. 00395 * 00396 * \note You should use the constant SENTINEL to terminate arguments, in 00397 * order to preserve cross-platform compatibility. 00398 */ 00399 int ast_update2_realtime(const char *family, ...) attribute_sentinel; 00400 00401 /*! 00402 * \brief Create realtime configuration 00403 * 00404 * \param family which family/config to be created 00405 * 00406 * \details 00407 * This function is used to create a parameter in realtime configuration space. 00408 * 00409 * \return Number of rows affected, or -1 on error. 00410 * 00411 * \note 00412 * On the MySQL engine only, for reasons of backwards compatibility, the return 00413 * value is the insert ID. This value is nonportable and may be changed in a 00414 * future version to match the other engines. 00415 * 00416 * \note You should use the constant SENTINEL to terminate arguments, in 00417 * order to preserve cross-platform compatibility. 00418 */ 00419 int ast_store_realtime(const char *family, ...) attribute_sentinel; 00420 00421 /*! 00422 * \brief Destroy realtime configuration 00423 * 00424 * \param family which family/config to be destroyed 00425 * \param keyfield which field to use as the key 00426 * \param lookup which value to look for in the key field to match the entry. 00427 * 00428 * \details 00429 * This function is used to destroy an entry in realtime configuration space. 00430 * Additional params are used as keys. 00431 * 00432 * \return Number of rows affected, or -1 on error. 00433 * 00434 * \note You should use the constant SENTINEL to terminate arguments, in 00435 * order to preserve cross-platform compatibility. 00436 */ 00437 int ast_destroy_realtime(const char *family, const char *keyfield, const char *lookup, ...) attribute_sentinel; 00438 00439 /*! 00440 * \brief Check if realtime engine is configured for family 00441 * \param family which family/config to be checked 00442 * \return 1 if family is configured in realtime and engine exists 00443 */ 00444 int ast_check_realtime(const char *family); 00445 00446 /*! \brief Check if there's any realtime engines loaded */ 00447 int ast_realtime_enabled(void); 00448 00449 /*! 00450 * \brief Free variable list 00451 * \param var the linked list of variables to free 00452 * 00453 * \details 00454 * This function frees a list of variables. 00455 */ 00456 void ast_variables_destroy(struct ast_variable *var); 00457 00458 /*! 00459 * \brief Register config engine 00460 * \retval 1 Always 00461 */ 00462 int ast_config_engine_register(struct ast_config_engine *newconfig); 00463 00464 /*! 00465 * \brief Deregister config engine 00466 * \retval 0 Always 00467 */ 00468 int ast_config_engine_deregister(struct ast_config_engine *del); 00469 00470 /*! 00471 * \brief Exposed initialization method for core process 00472 * 00473 * \details 00474 * This method is intended for use only with the core initialization and is 00475 * not designed to be called from any user applications. 00476 */ 00477 int register_config_cli(void); 00478 00479 /*! 00480 * \brief Exposed re-initialization method for core process 00481 * 00482 * \details 00483 * This method is intended for use only with the core re-initialization and is 00484 * not designed to be called from any user applications. 00485 */ 00486 int read_config_maps(void); 00487 00488 /*! \brief Create a new base configuration structure */ 00489 struct ast_config *ast_config_new(void); 00490 00491 /*! 00492 * \brief Retrieve the current category name being built. 00493 * 00494 * \details 00495 * API for backend configuration engines while building a configuration set. 00496 */ 00497 struct ast_category *ast_config_get_current_category(const struct ast_config *cfg); 00498 00499 /*! 00500 * \brief Set the category within the configuration as being current. 00501 * 00502 * \details 00503 * API for backend configuration engines while building a configuration set. 00504 */ 00505 void ast_config_set_current_category(struct ast_config *cfg, const struct ast_category *cat); 00506 00507 /*! 00508 * \brief Retrieve a configuration variable within the configuration set. 00509 * 00510 * \details 00511 * Retrieves the named variable \p var within category \p cat of configuration 00512 * set \p cfg. If not found, attempts to retrieve the named variable \p var 00513 * from within category \em general. 00514 * 00515 * \return Value of \p var, or NULL if not found. 00516 */ 00517 const char *ast_config_option(struct ast_config *cfg, const char *cat, const char *var); 00518 00519 /*! \brief Create a category structure */ 00520 struct ast_category *ast_category_new(const char *name, const char *in_file, int lineno); 00521 void ast_category_append(struct ast_config *config, struct ast_category *cat); 00522 00523 /*! 00524 * \brief Inserts new category 00525 * 00526 * \param config which config to use 00527 * \param cat newly created category to insert 00528 * \param match which category to insert above 00529 * 00530 * \details 00531 * This function is used to insert a new category above another category 00532 * matching the match parameter. 00533 */ 00534 void ast_category_insert(struct ast_config *config, struct ast_category *cat, const char *match); 00535 int ast_category_delete(struct ast_config *cfg, const char *category); 00536 00537 /*! 00538 * \brief Removes and destroys all variables within a category 00539 * \retval 0 if the category was found and emptied 00540 * \retval -1 if the category was not found 00541 */ 00542 int ast_category_empty(struct ast_config *cfg, const char *category); 00543 void ast_category_destroy(struct ast_category *cat); 00544 struct ast_variable *ast_category_detach_variables(struct ast_category *cat); 00545 void ast_category_rename(struct ast_category *cat, const char *name); 00546 00547 #ifdef MALLOC_DEBUG 00548 struct ast_variable *_ast_variable_new(const char *name, const char *value, const char *filename, const char *file, const char *function, int lineno); 00549 #define ast_variable_new(a, b, c) _ast_variable_new(a, b, c, __FILE__, __PRETTY_FUNCTION__, __LINE__) 00550 #else 00551 struct ast_variable *ast_variable_new(const char *name, const char *value, const char *filename); 00552 #endif 00553 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); 00554 struct ast_config_include *ast_include_find(struct ast_config *conf, const char *included_file); 00555 void ast_include_rename(struct ast_config *conf, const char *from_file, const char *to_file); 00556 void ast_variable_append(struct ast_category *category, struct ast_variable *variable); 00557 void ast_variable_insert(struct ast_category *category, struct ast_variable *variable, const char *line); 00558 int ast_variable_delete(struct ast_category *category, const char *variable, const char *match, const char *line); 00559 00560 /*! 00561 * \brief Update variable value within a config 00562 * 00563 * \param category Category element within the config 00564 * \param variable Name of the variable to change 00565 * \param value New value of the variable 00566 * \param match If set, previous value of the variable (if NULL or zero-length, no matching will be done) 00567 * \param object Boolean of whether to make the new variable an object 00568 * 00569 * \return 0 on success or -1 on failure. 00570 */ 00571 int ast_variable_update(struct ast_category *category, const char *variable, 00572 const char *value, const char *match, unsigned int object); 00573 00574 int ast_config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator); 00575 int config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator) __attribute__((deprecated)); 00576 00577 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); 00578 00579 /*! 00580 * \brief Support code to parse config file arguments 00581 * 00582 * \details 00583 * The function ast_parse_arg() provides a generic interface to parse 00584 * strings (e.g. numbers, network addresses and so on) in a flexible 00585 * way, e.g. by doing proper error and bound checks, provide default 00586 * values, and so on. 00587 * The function (described later) takes a string as an argument, 00588 * a set of flags to specify the result format and checks to perform, 00589 * a pointer to the result, and optionally some additional arguments. 00590 * 00591 * \return It returns 0 on success, != 0 otherwise. 00592 */ 00593 enum ast_parse_flags { 00594 /* low 4 bits of flags are used for the operand type */ 00595 PARSE_TYPE = 0x000f, 00596 /* numeric types, with optional default value and bound checks. 00597 * Additional arguments are passed by value. 00598 */ 00599 PARSE_INT32 = 0x0001, 00600 PARSE_UINT32 = 0x0002, 00601 PARSE_DOUBLE = 0x0003, 00602 #if 0 /* not supported yet */ 00603 PARSE_INT16 = 0x0004, 00604 PARSE_UINT16 = 0x0005, 00605 #endif 00606 00607 /* Returns a struct ast_sockaddr, with optional default value 00608 * (passed by reference) and port handling (accept, ignore, 00609 * require, forbid). The format is 'ipaddress[:port]'. IPv6 address 00610 * literals need square brackets around them if a port is specified. 00611 */ 00612 PARSE_ADDR = 0x000e, 00613 00614 /* Returns a struct sockaddr_in, with optional default value 00615 * (passed by reference) and port handling (accept, ignore, 00616 * require, forbid). The format is 'host.name[:port]' 00617 */ 00618 PARSE_INADDR = 0x000f, 00619 00620 /* Other data types can be added as needed */ 00621 00622 /* If PARSE_DEFAULT is set, next argument is a default value 00623 * which is returned in case of error. The argument is passed 00624 * by value in case of numeric types, by reference in other cases. 00625 */ 00626 PARSE_DEFAULT = 0x0010, /* assign default on error */ 00627 00628 /* Request a range check, applicable to numbers. Two additional 00629 * arguments are passed by value, specifying the low-high end of 00630 * the range (inclusive). An error is returned if the value 00631 * is outside or inside the range, respectively. 00632 */ 00633 PARSE_IN_RANGE = 0x0020, /* accept values inside a range */ 00634 PARSE_OUT_RANGE = 0x0040, /* accept values outside a range */ 00635 00636 /* Port handling, for ast_sockaddr. accept/ignore/require/forbid 00637 * port number after the hostname or address. 00638 */ 00639 PARSE_PORT_MASK = 0x0300, /* 0x000: accept port if present */ 00640 PARSE_PORT_IGNORE = 0x0100, /* 0x100: ignore port if present */ 00641 PARSE_PORT_REQUIRE = 0x0200, /* 0x200: require port number */ 00642 PARSE_PORT_FORBID = 0x0300, /* 0x100: forbid port number */ 00643 }; 00644 00645 /*! 00646 * \brief The argument parsing routine. 00647 * 00648 * \param arg the string to parse. It is not modified. 00649 * \param flags combination of ast_parse_flags to specify the 00650 * return type and additional checks. 00651 * \param result pointer to the result. NULL is valid here, and can 00652 * be used to perform only the validity checks. 00653 * \param ... extra arguments are required according to flags. 00654 * 00655 * \retval 0 in case of success, != 0 otherwise. 00656 * \retval result returns the parsed value in case of success, 00657 * the default value in case of error, or it is left unchanged 00658 * in case of error and no default specified. Note that in certain 00659 * cases (e.g. sockaddr_in, with multi-field return values) some 00660 * of the fields in result may be changed even if an error occurs. 00661 * 00662 * \details 00663 * Examples of use: 00664 * ast_parse_arg("223", PARSE_INT32|PARSE_IN_RANGE, 00665 * &a, -1000, 1000); 00666 * returns 0, a = 223 00667 * ast_parse_arg("22345", PARSE_INT32|PARSE_IN_RANGE|PARSE_DEFAULT, 00668 * &a, 9999, 10, 100); 00669 * returns 1, a = 9999 00670 * ast_parse_arg("22345ssf", PARSE_UINT32|PARSE_IN_RANGE, &b, 10, 100); 00671 * returns 1, b unchanged 00672 * ast_parse_arg("www.foo.biz:44", PARSE_INADDR, &sa); 00673 * returns 0, sa contains address and port 00674 * ast_parse_arg("www.foo.biz", PARSE_INADDR|PARSE_PORT_REQUIRE, &sa); 00675 * returns 1 because port is missing, sa contains address 00676 */ 00677 int ast_parse_arg(const char *arg, enum ast_parse_flags flags, 00678 void *result, ...); 00679 00680 /* 00681 * Parsing config file options in C is slightly annoying because we cannot use 00682 * string in a switch() statement, yet we need a similar behaviour, with many 00683 * branches and a break on a matching one. 00684 * The following somehow simplifies the job: we create a block using 00685 * the CV_START and CV_END macros, and then within the block we can run 00686 * actions such as "if (condition) { body; break; }" 00687 * Additional macros are present to run simple functions (e.g. ast_copy_string) 00688 * or to pass arguments to ast_parse_arg() 00689 * 00690 * As an example: 00691 00692 CV_START(v->name, v->value); // start the block 00693 CV_STR("foo", x_foo); // static string 00694 CV_DSTR("bar", y_bar); // malloc'ed string 00695 CV_F("bar", ...); // call a generic function 00696 CV_END; // end the block 00697 */ 00698 00699 /*! \brief the macro to open a block for variable parsing */ 00700 #define CV_START(__in_var, __in_val) \ 00701 do { \ 00702 const char *__var = __in_var; \ 00703 const char *__val = __in_val; 00704 00705 /*! \brief close a variable parsing block */ 00706 #define CV_END } while (0) 00707 00708 /*! \brief call a generic function if the name matches. */ 00709 #define CV_F(__pattern, __body) if (!strcasecmp((__var), __pattern)) { __body; break; } 00710 00711 /*! 00712 * \brief helper macros to assign the value to a BOOL, UINT, static string and 00713 * dynamic string 00714 */ 00715 #define CV_BOOL(__x, __dst) CV_F(__x, (__dst) = ast_true(__val) ) 00716 #define CV_UINT(__x, __dst) CV_F(__x, (__dst) = strtoul(__val, NULL, 0) ) 00717 #define CV_STR(__x, __dst) CV_F(__x, ast_copy_string(__dst, __val, sizeof(__dst))) 00718 #define CV_DSTR(__x, __dst) CV_F(__x, ast_free(__dst); __dst = ast_strdup(__val)) 00719 #define CV_STRFIELD(__x, __obj, __field) CV_F(__x, ast_string_field_set(__obj, __field, __val)) 00720 00721 /*! \brief Check if require type is an integer type */ 00722 AST_INLINE_API( 00723 int ast_rq_is_int(require_type type), 00724 { 00725 switch (type) { 00726 case RQ_INTEGER1: 00727 case RQ_UINTEGER1: 00728 case RQ_INTEGER2: 00729 case RQ_UINTEGER2: 00730 case RQ_INTEGER3: 00731 case RQ_UINTEGER3: 00732 case RQ_INTEGER4: 00733 case RQ_UINTEGER4: 00734 case RQ_INTEGER8: 00735 case RQ_UINTEGER8: 00736 return 1; 00737 default: 00738 return 0; 00739 } 00740 } 00741 ) 00742 00743 /*! 00744 * \brief Remove standard encoding from realtime values, which ensures 00745 * that a semicolon embedded within a single value is not treated upon 00746 * retrieval as multiple values. 00747 * \param chunk Data to be decoded 00748 * \return The decoded data, in the original buffer 00749 * \since 1.8 00750 * \warn This function modifies the original buffer 00751 */ 00752 char *ast_realtime_decode_chunk(char *chunk); 00753 00754 /*! 00755 * \brief Encodes a chunk of data for realtime 00756 * \param dest Destination buffer 00757 * \param maxlen Length passed through to ast_str_* functions 00758 * \param chunk Source data to be encoded 00759 * \return Buffer within dest 00760 * \since 1.8 00761 */ 00762 char *ast_realtime_encode_chunk(struct ast_str **dest, ssize_t maxlen, const char *chunk); 00763 00764 #if defined(__cplusplus) || defined(c_plusplus) 00765 } 00766 #endif 00767 00768 #endif /* _ASTERISK_CONFIG_H */