Configuration File Parser. More...
#include "asterisk/utils.h"#include "asterisk/inline_api.h"
Go to the source code of this file.
Data Structures | |
| struct | ast_config_engine |
| Configuration engine structure, used to define realtime drivers. More... | |
| struct | ast_variable |
| Structure for variables, used for configurations and for channel variables. More... | |
Defines | |
| #define | ast_config_load(filename, flags) ast_config_load2(filename, AST_MODULE, flags) |
| Load a config file. | |
| #define | CONFIG_STATUS_FILEINVALID (void *)-2 |
| #define | CONFIG_STATUS_FILEMISSING (void *)0 |
| #define | CONFIG_STATUS_FILEUNCHANGED (void *)-1 |
| #define | CV_BOOL(__x, __dst) CV_F(__x, (__dst) = ast_true(__val) ) |
| helper macros to assign the value to a BOOL, UINT, static string and dynamic string | |
| #define | CV_DSTR(__x, __dst) CV_F(__x, ast_free(__dst); __dst = ast_strdup(__val)) |
| #define | CV_END } while (0) |
| close a variable parsing block | |
| #define | CV_F(__pattern, __body) if (!strcasecmp((__var), __pattern)) { __body; break; } |
| call a generic function if the name matches. | |
| #define | CV_START(__in_var, __in_val) |
| the macro to open a block for variable parsing | |
| #define | CV_STR(__x, __dst) CV_F(__x, ast_copy_string(__dst, __val, sizeof(__dst))) |
| #define | CV_STRFIELD(__x, __obj, __field) CV_F(__x, ast_string_field_set(__obj, __field, __val)) |
| #define | CV_UINT(__x, __dst) CV_F(__x, (__dst) = strtoul(__val, NULL, 0) ) |
Typedefs | |
| 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) |
| typedef int | realtime_destroy (const char *database, const char *table, const char *keyfield, const char *entity, va_list ap) |
| typedef struct ast_config * | realtime_multi_get (const char *database, const char *table, va_list ap) |
| typedef int | realtime_require (const char *database, const char *table, va_list ap) |
| Function pointer called to ensure database schema is properly configured for realtime use. | |
| typedef int | realtime_store (const char *database, const char *table, va_list ap) |
| typedef int | realtime_unload (const char *database, const char *table) |
| Function pointer called to clear the database cache and free resources used for such. | |
| typedef int | realtime_update (const char *database, const char *table, const char *keyfield, const char *entity, va_list ap) |
| typedef int | realtime_update2 (const char *database, const char *table, va_list ap) |
| typedef struct ast_variable * | realtime_var_get (const char *database, const char *table, va_list ap) |
Enumerations | |
| enum | { CONFIG_FLAG_WITHCOMMENTS = (1 << 0), CONFIG_FLAG_FILEUNCHANGED = (1 << 1), CONFIG_FLAG_NOCACHE = (1 << 2), CONFIG_FLAG_NOREALTIME = (1 << 3) } |
| enum | ast_parse_flags { PARSE_TYPE = 0x000f, PARSE_INT32 = 0x0001, PARSE_UINT32 = 0x0002, PARSE_DOUBLE = 0x0003, PARSE_ADDR = 0x000e, PARSE_INADDR = 0x000f, PARSE_DEFAULT = 0x0010, PARSE_IN_RANGE = 0x0020, PARSE_OUT_RANGE = 0x0040, PARSE_PORT_MASK = 0x0300, PARSE_PORT_IGNORE = 0x0100, PARSE_PORT_REQUIRE = 0x0200, PARSE_PORT_FORBID = 0x0300 } |
Support code to parse config file arguments. More... | |
| enum | require_type { RQ_INTEGER1, RQ_UINTEGER1, RQ_INTEGER2, RQ_UINTEGER2, RQ_INTEGER3, RQ_UINTEGER3, RQ_INTEGER4, RQ_UINTEGER4, RQ_INTEGER8, RQ_UINTEGER8, RQ_CHAR, RQ_FLOAT, RQ_DATE, RQ_DATETIME } |
Types used in ast_realtime_require_field. More... | |
Functions | |
| void | ast_category_append (struct ast_config *config, struct ast_category *cat) |
| char * | ast_category_browse (struct ast_config *config, const char *prev) |
| Goes through categories. | |
| int | ast_category_delete (struct ast_config *cfg, const char *category) |
| void | ast_category_destroy (struct ast_category *cat) |
| struct ast_variable * | ast_category_detach_variables (struct ast_category *cat) |
| int | ast_category_empty (struct ast_config *cfg, const char *category) |
| Removes and destroys all variables within a category. | |
| int | ast_category_exist (const struct ast_config *config, const char *category_name) |
| Check for category duplicates. | |
| struct ast_variable * | ast_category_first (struct ast_category *cat) |
| given a pointer to a category, return the root variable. | |
| struct ast_category * | ast_category_get (const struct ast_config *config, const char *category_name) |
| Retrieve a category if it exists. | |
| void | ast_category_insert (struct ast_config *config, struct ast_category *cat, const char *match) |
| Inserts new category. | |
| struct ast_category * | ast_category_new (const char *name, const char *in_file, int lineno) |
| Create a category structure. | |
| void | ast_category_rename (struct ast_category *cat, const char *name) |
| struct ast_variable * | ast_category_root (struct ast_config *config, char *cat) |
| returns the root ast_variable of a config | |
| int | ast_check_realtime (const char *family) |
| Check if realtime engine is configured for family. | |
| void | ast_config_destroy (struct ast_config *config) |
| Destroys a config. | |
| int | ast_config_engine_deregister (struct ast_config_engine *del) |
| Deregister config engine. | |
| int | ast_config_engine_register (struct ast_config_engine *newconfig) |
| Register config engine. | |
| struct ast_category * | ast_config_get_current_category (const struct ast_config *cfg) |
| Retrieve the current category name being built. | |
| 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) |
| struct ast_config * | ast_config_load2 (const char *filename, const char *who_asked, struct ast_flags flags) |
| Load a config file. | |
| struct ast_config * | ast_config_new (void) |
| Create a new base configuration structure. | |
| const char * | ast_config_option (struct ast_config *cfg, const char *cat, const char *var) |
| Retrieve a configuration variable within the configuration set. | |
| void | ast_config_set_current_category (struct ast_config *cfg, const struct ast_category *cat) |
| Set the category within the configuration as being current. | |
| int | ast_config_text_file_save (const char *filename, const struct ast_config *cfg, const char *generator) |
| int | ast_destroy_realtime (const char *family, const char *keyfield, const char *lookup,...) attribute_sentinel |
| Destroy realtime configuration. | |
| struct ast_config_include * | ast_include_find (struct ast_config *conf, const char *included_file) |
| 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) |
| void | ast_include_rename (struct ast_config *conf, const char *from_file, const char *to_file) |
| AST_INLINE_API (int ast_rq_is_int(require_type type),{switch(type){case RQ_INTEGER1:case RQ_UINTEGER1:case RQ_INTEGER2:case RQ_UINTEGER2:case RQ_INTEGER3:case RQ_UINTEGER3:case RQ_INTEGER4:case RQ_UINTEGER4:case RQ_INTEGER8:case RQ_UINTEGER8:return 1;default:return 0;}}) char *ast_realtime_decode_chunk(char *chunk) | |
| Check if require type is an integer type. | |
| struct ast_variable * | ast_load_realtime (const char *family,...) attribute_sentinel |
| Retrieve realtime configuration. | |
| struct ast_variable * | ast_load_realtime_all (const char *family,...) attribute_sentinel |
| struct ast_config * | ast_load_realtime_multientry (const char *family,...) attribute_sentinel |
| Retrieve realtime configuration. | |
| int | ast_parse_arg (const char *arg, enum ast_parse_flags flags, void *result,...) |
| The argument parsing routine. | |
| int | ast_realtime_enabled (void) |
| Check if there's any realtime engines loaded. | |
| char * | ast_realtime_encode_chunk (struct ast_str **dest, ssize_t maxlen, const char *chunk) |
| Encodes a chunk of data for realtime. | |
| int | ast_realtime_require_field (const char *family,...) attribute_sentinel |
| Inform realtime what fields that may be stored. | |
| int | ast_store_realtime (const char *family,...) attribute_sentinel |
| Create realtime configuration. | |
| int | ast_unload_realtime (const char *family) |
| Release any resources cached for a realtime family. | |
| int | ast_update2_realtime (const char *family,...) attribute_sentinel |
| Update realtime configuration. | |
| int | ast_update_realtime (const char *family, const char *keyfield, const char *lookup,...) attribute_sentinel |
| Update realtime configuration. | |
| void | ast_variable_append (struct ast_category *category, struct ast_variable *variable) |
| struct ast_variable * | ast_variable_browse (const struct ast_config *config, const char *category) |
| Goes through variables. | |
| int | ast_variable_delete (struct ast_category *category, const char *variable, const char *match, const char *line) |
| void | ast_variable_insert (struct ast_category *category, struct ast_variable *variable, const char *line) |
| struct ast_variable * | ast_variable_new (const char *name, const char *value, const char *filename) |
| const char * | ast_variable_retrieve (const struct ast_config *config, const char *category, const char *variable) |
| Gets a variable. | |
| int | ast_variable_update (struct ast_category *category, const char *variable, const char *value, const char *match, unsigned int object) |
| Update variable value within a config. | |
| void | ast_variables_destroy (struct ast_variable *var) |
| Free variable list. | |
| struct ast_variable * | ast_variables_dup (struct ast_variable *var) |
| Duplicate variable list. | |
| int | config_text_file_save (const char *filename, const struct ast_config *cfg, const char *generator) |
| int | read_config_maps (void) |
| Exposed re-initialization method for core process. | |
| int | register_config_cli (void) |
| Exposed initialization method for core process. | |
Configuration File Parser.
Definition in file config.h.
| #define ast_config_load | ( | filename, | |||
| flags | ) | ast_config_load2(filename, AST_MODULE, flags) |
Load a config file.
| filename | path of file to open. If no preceding '/' character, path is considered relative to AST_CONFIG_DIR | |
| flags | Optional flags: CONFIG_FLAG_WITHCOMMENTS - load the file with comments intact; CONFIG_FLAG_FILEUNCHANGED - check the file mtime and return CONFIG_STATUS_FILEUNCHANGED if the mtime is the same; or CONFIG_FLAG_NOCACHE - don't cache file mtime (main purpose of this option is to save memory on temporary files). |
Create a config structure from a given configuration file.
| NULL | on error |
Definition at line 170 of file config.h.
Referenced by adsi_load(), advanced_options(), aji_load_config(), ast_plc_reload(), conf_exec(), config_function_read(), config_load(), config_module(), directory_exec(), festival_exec(), find_conf(), gtalk_load_config(), handle_cli_dialplan_save(), jingle_load_config(), load_config(), load_config_meetme(), load_module(), load_moh_classes(), load_odbc_config(), load_pktccops_config(), make_email_file(), odbc_load_module(), osp_load(), parse_config(), pbx_load_config(), pbx_load_users(), play_message(), prep_email_sub_vars(), read_agent_config(), read_password_from_file(), realtime_directory(), reload(), reload_config(), reload_followme(), reload_module(), reload_queue_rules(), reload_queues(), set_config(), setup_dahdi_int(), sla_load_config(), smdi_load(), tds_load_module(), vm_change_password(), and vm_forwardoptions().
| #define CONFIG_STATUS_FILEINVALID (void *)-2 |
Definition at line 52 of file config.h.
Referenced by __ast_http_load(), __ast_http_post_load(), __ast_udptl_reload(), __init_manager(), _dsp_init(), action_getconfig(), action_getconfigjson(), action_listcategories(), action_updateconfig(), adsi_load(), aji_load_config(), ast_config_internal_load(), ast_config_load2(), ast_plc_reload(), ast_readconfig(), conf_exec(), config_function_read(), config_load(), config_module(), config_text_file_load(), directory_exec(), do_reload(), festival_exec(), find_conf(), gtalk_load_config(), iax_provision_reload(), init_logger_chain(), initialize_cc_max_requests(), jingle_load_config(), load_config(), load_config_meetme(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), misdn_cfg_init(), odbc_load_module(), osp_load(), parse_config(), pbx_load_config(), private_enum_init(), read_agent_config(), read_config_maps(), realtime_directory(), reload(), reload_config(), reload_followme(), reload_module(), reload_queue_rules(), reload_queues(), rtp_reload(), run_startup_commands(), set_config(), setup_dahdi_int(), sla_load_config(), smdi_load(), tds_load_module(), and valid_config().
| #define CONFIG_STATUS_FILEMISSING (void *)0 |
Definition at line 50 of file config.h.
Referenced by __ast_http_load(), __ast_http_post_load(), __ast_udptl_reload(), _dsp_init(), action_getconfig(), adsi_load(), aji_load_config(), ast_plc_reload(), ast_readconfig(), do_reload(), load_config(), load_indications(), load_modules(), load_moh_classes(), load_odbc_config(), parse_config(), private_enum_init(), rtp_reload(), and run_startup_commands().
| #define CONFIG_STATUS_FILEUNCHANGED (void *)-1 |
Definition at line 51 of file config.h.
Referenced by __ast_http_load(), __ast_http_post_load(), __ast_udptl_reload(), __init_manager(), _dsp_init(), adsi_load(), aji_load_config(), ast_cli_perms_init(), ast_config_internal_load(), ast_config_load2(), ast_plc_reload(), ast_readconfig(), config_function_read(), config_module(), config_text_file_load(), do_reload(), iax_provision_reload(), load_config(), load_indications(), load_moh_classes(), misdn_cfg_init(), odbc_load_module(), osp_load(), parse_config(), private_enum_init(), read_agent_config(), reload(), reload_config(), reload_followme(), reload_queue_rules(), reload_queues(), rtp_reload(), run_startup_commands(), set_config(), setup_dahdi_int(), sla_load_config(), smdi_load(), and tds_load_module().
| #define CV_BOOL | ( | __x, | |||
| __dst | ) | CV_F(__x, (__dst) = ast_true(__val) ) |
helper macros to assign the value to a BOOL, UINT, static string and dynamic string
Definition at line 729 of file config.h.
Referenced by store_config_core().
| #define CV_DSTR | ( | __x, | |||
| __dst | ) | CV_F(__x, ast_free(__dst); __dst = ast_strdup(__val)) |
| #define CV_END } while (0) |
close a variable parsing block
Definition at line 720 of file config.h.
Referenced by store_config_core(), and store_config_tone_zone().
| #define CV_F | ( | __pattern, | |||
| __body | ) | if (!strcasecmp((__var), __pattern)) { __body; break; } |
call a generic function if the name matches.
Definition at line 723 of file config.h.
Referenced by store_config_core(), and store_config_tone_zone().
| #define CV_START | ( | __in_var, | |||
| __in_val | ) |
do { \ const char *__var = __in_var; \ const char *__val = __in_val;
the macro to open a block for variable parsing
Definition at line 714 of file config.h.
Referenced by store_config_core(), and store_config_tone_zone().
| #define CV_STR | ( | __x, | |||
| __dst | ) | CV_F(__x, ast_copy_string(__dst, __val, sizeof(__dst))) |
Definition at line 731 of file config.h.
Referenced by store_config_core(), and store_config_tone_zone().
| #define CV_STRFIELD | ( | __x, | |||
| __obj, | |||||
| __field | ) | CV_F(__x, ast_string_field_set(__obj, __field, __val)) |
Definition at line 733 of file config.h.
Referenced by store_config_core().
| #define CV_UINT | ( | __x, | |||
| __dst | ) | CV_F(__x, (__dst) = strtoul(__val, NULL, 0) ) |
Definition at line 730 of file config.h.
Referenced by store_config_core().
| 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) |
| typedef int realtime_destroy(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap) |
| typedef struct ast_config* realtime_multi_get(const char *database, const char *table, va_list ap) |
| typedef int realtime_require(const char *database, const char *table, va_list ap) |
| typedef int realtime_store(const char *database, const char *table, va_list ap) |
| typedef int realtime_unload(const char *database, const char *table) |
| typedef int realtime_update(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap) |
| typedef int realtime_update2(const char *database, const char *table, va_list ap) |
| typedef struct ast_variable* realtime_var_get(const char *database, const char *table, va_list ap) |
| anonymous enum |
Options for ast_config_load()
Definition at line 39 of file config.h.
00039 { 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 };
| enum ast_parse_flags |
Support code to parse config file arguments.
The function ast_parse_arg() provides a generic interface to parse strings (e.g. numbers, network addresses and so on) in a flexible way, e.g. by doing proper error and bound checks, provide default values, and so on. The function (described later) takes a string as an argument, a set of flags to specify the result format and checks to perform, a pointer to the result, and optionally some additional arguments.
| PARSE_TYPE | |
| PARSE_INT32 | |
| PARSE_UINT32 | |
| PARSE_DOUBLE | |
| PARSE_ADDR | |
| PARSE_INADDR | |
| PARSE_DEFAULT | |
| PARSE_IN_RANGE | |
| PARSE_OUT_RANGE | |
| PARSE_PORT_MASK | |
| PARSE_PORT_IGNORE | |
| PARSE_PORT_REQUIRE | |
| PARSE_PORT_FORBID |
Definition at line 607 of file config.h.
00607 { 00608 /* low 4 bits of flags are used for the operand type */ 00609 PARSE_TYPE = 0x000f, 00610 /* numeric types, with optional default value and bound checks. 00611 * Additional arguments are passed by value. 00612 */ 00613 PARSE_INT32 = 0x0001, 00614 PARSE_UINT32 = 0x0002, 00615 PARSE_DOUBLE = 0x0003, 00616 #if 0 /* not supported yet */ 00617 PARSE_INT16 = 0x0004, 00618 PARSE_UINT16 = 0x0005, 00619 #endif 00620 00621 /* Returns a struct ast_sockaddr, with optional default value 00622 * (passed by reference) and port handling (accept, ignore, 00623 * require, forbid). The format is 'ipaddress[:port]'. IPv6 address 00624 * literals need square brackets around them if a port is specified. 00625 */ 00626 PARSE_ADDR = 0x000e, 00627 00628 /* Returns a struct sockaddr_in, with optional default value 00629 * (passed by reference) and port handling (accept, ignore, 00630 * require, forbid). The format is 'host.name[:port]' 00631 */ 00632 PARSE_INADDR = 0x000f, 00633 00634 /* Other data types can be added as needed */ 00635 00636 /* If PARSE_DEFAULT is set, next argument is a default value 00637 * which is returned in case of error. The argument is passed 00638 * by value in case of numeric types, by reference in other cases. 00639 */ 00640 PARSE_DEFAULT = 0x0010, /* assign default on error */ 00641 00642 /* Request a range check, applicable to numbers. Two additional 00643 * arguments are passed by value, specifying the low-high end of 00644 * the range (inclusive). An error is returned if the value 00645 * is outside or inside the range, respectively. 00646 */ 00647 PARSE_IN_RANGE = 0x0020, /* accept values inside a range */ 00648 PARSE_OUT_RANGE = 0x0040, /* accept values outside a range */ 00649 00650 /* Port handling, for ast_sockaddr. accept/ignore/require/forbid 00651 * port number after the hostname or address. 00652 */ 00653 PARSE_PORT_MASK = 0x0300, /* 0x000: accept port if present */ 00654 PARSE_PORT_IGNORE = 0x0100, /* 0x100: ignore port if present */ 00655 PARSE_PORT_REQUIRE = 0x0200, /* 0x200: require port number */ 00656 PARSE_PORT_FORBID = 0x0300, /* 0x100: forbid port number */ 00657 };
| enum require_type |
Types used in ast_realtime_require_field.
| RQ_INTEGER1 | |
| RQ_UINTEGER1 | |
| RQ_INTEGER2 | |
| RQ_UINTEGER2 | |
| RQ_INTEGER3 | |
| RQ_UINTEGER3 | |
| RQ_INTEGER4 | |
| RQ_UINTEGER4 | |
| RQ_INTEGER8 | |
| RQ_UINTEGER8 | |
| RQ_CHAR | |
| RQ_FLOAT | |
| RQ_DATE | |
| RQ_DATETIME |
Definition at line 57 of file config.h.
00057 { 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;
| void ast_category_append | ( | struct ast_config * | config, | |
| struct ast_category * | cat | |||
| ) |
Definition at line 687 of file config.c.
References ast_config::current, ast_config::include_level, ast_category::include_level, ast_config::last, ast_category::next, and ast_config::root.
Referenced by add_cfg_entry(), add_rt_multi_cfg_entry(), config_curl(), config_ldap(), config_odbc(), config_pgsql(), handle_updates(), process_text_line(), realtime_directory(), realtime_multi_curl(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), and write_password_to_file().
00688 { 00689 if (config->last) 00690 config->last->next = category; 00691 else 00692 config->root = category; 00693 category->include_level = config->include_level; 00694 config->last = category; 00695 config->current = category; 00696 }
| char* ast_category_browse | ( | struct ast_config * | config, | |
| const char * | prev | |||
| ) |
Goes through categories.
| config | Which config structure you wish to "browse" | |
| prev | A pointer to a previous category. |
This function is kind of non-intuitive in it's use. To begin, one passes NULL as the second argument. It will return a pointer to the string of the first category in the file. From here on after, one must then pass the previous usage's return value as the second pointer, and it will return a pointer to the category name afterwards.
| a | category on success | |
| NULL | on failure/no-more-categories |
Definition at line 774 of file config.c.
References ast_config::last_browse, ast_category::name, ast_category::next, next_available_category(), and ast_config::root.
Referenced by __init_manager(), __queues_show(), action_getconfig(), action_getconfigjson(), action_listcategories(), actual_load_config(), aji_load_config(), ast_cli_perms_init(), AST_LIST_HEAD_NOLOCK(), complete_sipnotify(), conf_exec(), config_load(), find_queue_by_name_rt(), find_realtime(), get_insecure_variable_from_config(), get_insecure_variable_from_sipregs(), gtalk_load_config(), iax_provision_reload(), jingle_load_config(), load_config(), load_indications(), load_module(), load_moh_classes(), load_odbc_config(), load_pktccops_config(), load_tech_calendars(), misdn_cfg_init(), osp_load(), parse_config(), pbx_load_config(), pbx_load_users(), process_config(), queues_data_provider_get(), read_agent_config(), realtime_directory(), realtime_switch_common(), reload(), reload_config(), reload_followme(), reload_queue_rules(), reload_queues(), search_directory(), set_config(), setup_dahdi_int(), show_users_realtime(), sla_load_config(), update_realtime_members(), and vm_change_password().
00775 { 00776 struct ast_category *cat; 00777 00778 if (!prev) { 00779 /* First time browse. */ 00780 cat = config->root; 00781 } else if (config->last_browse && (config->last_browse->name == prev)) { 00782 /* Simple last browse found. */ 00783 cat = config->last_browse->next; 00784 } else { 00785 /* 00786 * Config changed since last browse. 00787 * 00788 * First try cheap last browse search. (Rebrowsing a different 00789 * previous category?) 00790 */ 00791 for (cat = config->root; cat; cat = cat->next) { 00792 if (cat->name == prev) { 00793 /* Found it. */ 00794 cat = cat->next; 00795 break; 00796 } 00797 } 00798 if (!cat) { 00799 /* 00800 * Have to do it the hard way. (Last category was deleted and 00801 * re-added?) 00802 */ 00803 for (cat = config->root; cat; cat = cat->next) { 00804 if (!strcasecmp(cat->name, prev)) { 00805 /* Found it. */ 00806 cat = cat->next; 00807 break; 00808 } 00809 } 00810 } 00811 } 00812 00813 if (cat) 00814 cat = next_available_category(cat); 00815 00816 config->last_browse = cat; 00817 return (cat) ? cat->name : NULL; 00818 }
| int ast_category_delete | ( | struct ast_config * | cfg, | |
| const char * | category | |||
| ) |
Definition at line 940 of file config.c.
References ast_category_destroy(), ast_config::last, ast_category::next, and ast_config::root.
Referenced by handle_updates().
00941 { 00942 struct ast_category *prev=NULL, *cat; 00943 00944 cat = cfg->root; 00945 while (cat) { 00946 if (cat->name == category) { 00947 if (prev) { 00948 prev->next = cat->next; 00949 if (cat == cfg->last) 00950 cfg->last = prev; 00951 } else { 00952 cfg->root = cat->next; 00953 if (cat == cfg->last) 00954 cfg->last = NULL; 00955 } 00956 ast_category_destroy(cat); 00957 return 0; 00958 } 00959 prev = cat; 00960 cat = cat->next; 00961 } 00962 00963 prev = NULL; 00964 cat = cfg->root; 00965 while (cat) { 00966 if (!strcasecmp(cat->name, category)) { 00967 if (prev) { 00968 prev->next = cat->next; 00969 if (cat == cfg->last) 00970 cfg->last = prev; 00971 } else { 00972 cfg->root = cat->next; 00973 if (cat == cfg->last) 00974 cfg->last = NULL; 00975 } 00976 ast_category_destroy(cat); 00977 return 0; 00978 } 00979 prev = cat; 00980 cat = cat->next; 00981 } 00982 return -1; 00983 }
| void ast_category_destroy | ( | struct ast_category * | cat | ) |
Definition at line 726 of file config.c.
References ast_comment_destroy(), ast_destroy_template_list(), ast_free, ast_variables_destroy(), ast_category::file, ast_category::last, ast_category::precomments, ast_category::root, ast_category::sameline, and ast_category::trailing.
Referenced by add_cfg_entry(), ast_category_delete(), ast_category_new(), ast_config_destroy(), process_text_line(), realtime_multi_odbc(), and write_password_to_file().
00727 { 00728 ast_variables_destroy(cat->root); 00729 cat->root = NULL; 00730 cat->last = NULL; 00731 ast_comment_destroy(&cat->precomments); 00732 ast_comment_destroy(&cat->sameline); 00733 ast_comment_destroy(&cat->trailing); 00734 ast_destroy_template_list(cat); 00735 ast_free(cat->file); 00736 ast_free(cat); 00737 }
| struct ast_variable* ast_category_detach_variables | ( | struct ast_category * | cat | ) | [read] |
Definition at line 820 of file config.c.
References ast_category::last, and ast_category::root.
Referenced by realtime_switch_common().
00821 { 00822 struct ast_variable *v; 00823 00824 v = cat->root; 00825 cat->root = NULL; 00826 cat->last = NULL; 00827 00828 return v; 00829 }
| int ast_category_empty | ( | struct ast_config * | cfg, | |
| const char * | category | |||
| ) |
Removes and destroys all variables within a category.
| 0 | if the category was found and emptied | |
| -1 | if the category was not found |
Definition at line 985 of file config.c.
References ast_variables_destroy(), ast_category::last, ast_category::name, ast_category::next, ast_category::root, and ast_config::root.
Referenced by handle_updates().
00986 { 00987 struct ast_category *cat; 00988 00989 for (cat = cfg->root; cat; cat = cat->next) { 00990 if (!strcasecmp(cat->name, category)) 00991 continue; 00992 ast_variables_destroy(cat->root); 00993 cat->root = NULL; 00994 cat->last = NULL; 00995 return 0; 00996 } 00997 00998 return -1; 00999 }
| int ast_category_exist | ( | const struct ast_config * | config, | |
| const char * | category_name | |||
| ) |
Check for category duplicates.
| config | which config to use | |
| category_name | name of the category you're looking for |
This will search through the categories within a given config file for a match.
Definition at line 682 of file config.c.
References ast_category_get().
00683 { 00684 return !!ast_category_get(config, category_name); 00685 }
| struct ast_variable* ast_category_first | ( | struct ast_category * | cat | ) | [read] |
given a pointer to a category, return the root variable.
This is equivalent to ast_variable_browse(), but more efficient if we already have the struct ast_category * (e.g. from ast_category_get())
return the first var of a category
Definition at line 760 of file config.c.
References ast_category::root.
Referenced by process_text_line().
00761 { 00762 return (cat) ? cat->root : NULL; 00763 }
| struct ast_category* ast_category_get | ( | const struct ast_config * | config, | |
| const char * | category_name | |||
| ) | [read] |
Retrieve a category if it exists.
| config | which config to use | |
| category_name | name of the category you're looking for |
This will search through the categories within a given config file for a match.
| pointer | to category if found | |
| NULL | if not. |
Definition at line 677 of file config.c.
References category_get().
Referenced by ast_category_exist(), ast_category_root(), ast_variable_browse(), handle_updates(), realtime_directory(), realtime_switch_common(), vm_change_password(), and vm_forwardoptions().
00678 { 00679 return category_get(config, category_name, 0); 00680 }
| void ast_category_insert | ( | struct ast_config * | config, | |
| struct ast_category * | cat, | |||
| const char * | match | |||
| ) |
Inserts new category.
| config | which config to use | |
| cat | newly created category to insert | |
| match | which category to insert above |
This function is used to insert a new category above another category matching the match parameter.
Definition at line 698 of file config.c.
References ast_category::name, ast_category::next, and ast_config::root.
Referenced by handle_updates().
00699 { 00700 struct ast_category *cur_category; 00701 00702 if (!cat || !match) 00703 return; 00704 if (!strcasecmp(config->root->name, match)) { 00705 cat->next = config->root; 00706 config->root = cat; 00707 return; 00708 } 00709 for (cur_category = config->root; cur_category; cur_category = cur_category->next) { 00710 if (!strcasecmp(cur_category->next->name, match)) { 00711 cat->next = cur_category->next; 00712 cur_category->next = cat; 00713 break; 00714 } 00715 } 00716 }
| struct ast_category* ast_category_new | ( | const char * | name, | |
| const char * | in_file, | |||
| int | lineno | |||
| ) | [read] |
Create a category structure.
Definition at line 641 of file config.c.
References ast_calloc, ast_category_destroy(), ast_copy_string(), ast_strdup, ast_category::file, ast_category::lineno, and ast_category::name.
Referenced by add_cfg_entry(), add_rt_multi_cfg_entry(), config_curl(), config_ldap(), config_odbc(), config_pgsql(), handle_updates(), process_text_line(), realtime_directory(), realtime_multi_curl(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), and write_password_to_file().
00642 { 00643 struct ast_category *category; 00644 00645 category = ast_calloc(1, sizeof(*category)); 00646 if (!category) { 00647 return NULL; 00648 } 00649 category->file = ast_strdup(in_file); 00650 if (!category->file) { 00651 ast_category_destroy(category); 00652 return NULL; 00653 } 00654 ast_copy_string(category->name, name, sizeof(category->name)); 00655 category->lineno = lineno; /* if you don't know the lineno, set it to 999999 or something real big */ 00656 return category; 00657 }
| void ast_category_rename | ( | struct ast_category * | cat, | |
| const char * | name | |||
| ) |
Definition at line 831 of file config.c.
References ast_copy_string(), and ast_category::name.
Referenced by handle_updates(), realtime_multi_curl(), realtime_multi_ldap(), realtime_multi_odbc(), and realtime_multi_pgsql().
00832 { 00833 ast_copy_string(cat->name, name, sizeof(cat->name)); 00834 }
| struct ast_variable* ast_category_root | ( | struct ast_config * | config, | |
| char * | cat | |||
| ) | [read] |
returns the root ast_variable of a config
| config | pointer to an ast_config data structure | |
| cat | name of the category for which you want the root |
Definition at line 765 of file config.c.
References ast_category_get(), and ast_category::root.
Referenced by get_insecure_variable_from_config(), and get_insecure_variable_from_sipregs().
00766 { 00767 struct ast_category *category = ast_category_get(config, cat); 00768 00769 if (category) 00770 return category->root; 00771 return NULL; 00772 }
| int ast_check_realtime | ( | const char * | family | ) |
Check if realtime engine is configured for family.
| family | which family/config to be checked |
Definition at line 2427 of file config.c.
References ast_realtime_enabled(), and find_engine().
Referenced by __queues_show(), _sip_show_peer(), _sip_show_peers(), ast_queue_log(), close_mailbox(), copy_plain_file(), destroy_association(), find_realtime_gw(), handle_response_peerpoke(), handle_voicemail_show_users(), leave_voicemail(), load_module(), load_moh_classes(), local_ast_moh_start(), logger_queue_rt_start(), realtime_peer(), realtime_update_peer(), rename_file(), sip_poke_noanswer(), sip_show_settings(), and vm_delete().
02428 { 02429 struct ast_config_engine *eng; 02430 if (!ast_realtime_enabled()) { 02431 return 0; /* There are no engines at all so fail early */ 02432 } 02433 02434 eng = find_engine(family, 1, NULL, 0, NULL, 0); 02435 if (eng) 02436 return 1; 02437 return 0; 02438 }
| void ast_config_destroy | ( | struct ast_config * | config | ) |
Destroys a config.
| config | pointer to config data structure |
Free memory associated with a given config
Definition at line 1001 of file config.c.
References ast_category_destroy(), ast_free, ast_includes_destroy(), ast_config::includes, ast_category::next, and ast_config::root.
Referenced by __ast_http_load(), __ast_http_post_load(), __ast_udptl_reload(), __init_manager(), __queues_show(), _dsp_init(), action_getconfig(), action_getconfigjson(), action_listcategories(), action_updateconfig(), adsi_load(), advanced_options(), aji_load_config(), ast_cli_perms_init(), ast_config_load2(), ast_load_realtime_multientry(), ast_plc_reload(), ast_readconfig(), conf_exec(), config_function_read(), config_load(), config_module(), directory_exec(), do_reload(), festival_exec(), find_conf(), find_realtime(), get_insecure_variable_from_sippeers(), get_insecure_variable_from_sipregs(), gtalk_load_config(), handle_cli_dialplan_save(), iax_provision_reload(), init_logger_chain(), initialize_cc_max_requests(), jingle_load_config(), load_config(), load_config_meetme(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_pktccops_config(), load_realtime_queue(), make_email_file(), misdn_cfg_init(), odbc_load_module(), osp_load(), parse_config(), pbx_load_config(), pbx_load_users(), play_message(), prep_email_sub_vars(), private_enum_init(), queues_data_provider_get(), read_agent_config(), read_config_maps(), read_password_from_file(), realtime_directory(), realtime_multi_handler(), realtime_multi_pgsql(), realtime_switch_common(), reload(), reload_config(), reload_followme(), reload_module(), reload_queue_rules(), reload_queues(), rtp_reload(), run_startup_commands(), set_config(), setup_dahdi_int(), show_users_realtime(), sla_load_config(), smdi_load(), tds_load_module(), unload_module(), update_realtime_members(), vm_change_password(), vm_forwardoptions(), and write_password_to_file().
01002 { 01003 struct ast_category *cat, *catn; 01004 01005 if (!cfg) 01006 return; 01007 01008 ast_includes_destroy(cfg->includes); 01009 01010 cat = cfg->root; 01011 while (cat) { 01012 catn = cat; 01013 cat = cat->next; 01014 ast_category_destroy(catn); 01015 } 01016 ast_free(cfg); 01017 }
| int ast_config_engine_deregister | ( | struct ast_config_engine * | del | ) |
Deregister config engine.
| 0 | Always |
Definition at line 2237 of file config.c.
References ast_mutex_lock, ast_mutex_unlock, config_lock, last, and ast_config_engine::next.
Referenced by unload_module().
02238 { 02239 struct ast_config_engine *ptr, *last=NULL; 02240 02241 ast_mutex_lock(&config_lock); 02242 02243 for (ptr = config_engine_list; ptr; ptr=ptr->next) { 02244 if (ptr == del) { 02245 if (last) 02246 last->next = ptr->next; 02247 else 02248 config_engine_list = ptr->next; 02249 break; 02250 } 02251 last = ptr; 02252 } 02253 02254 ast_mutex_unlock(&config_lock); 02255 02256 return 0; 02257 }
| int ast_config_engine_register | ( | struct ast_config_engine * | newconfig | ) |
Register config engine.
| 1 | Always |
Definition at line 2218 of file config.c.
References ast_log(), ast_mutex_lock, ast_mutex_unlock, config_lock, LOG_NOTICE, and ast_config_engine::next.
Referenced by load_module().
02219 { 02220 struct ast_config_engine *ptr; 02221 02222 ast_mutex_lock(&config_lock); 02223 02224 if (!config_engine_list) { 02225 config_engine_list = new; 02226 } else { 02227 for (ptr = config_engine_list; ptr->next; ptr=ptr->next); 02228 ptr->next = new; 02229 } 02230 02231 ast_mutex_unlock(&config_lock); 02232 ast_log(LOG_NOTICE,"Registered Config Engine %s\n", new->name); 02233 02234 return 1; 02235 }
| struct ast_category* ast_config_get_current_category | ( | const struct ast_config * | cfg | ) | [read] |
Retrieve the current category name being built.
API for backend configuration engines while building a configuration set.
Definition at line 1019 of file config.c.
References ast_config::current.
Referenced by config_curl(), config_odbc(), and config_text_file_load().
01020 { 01021 return cfg->current; 01022 }
| 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 | |||
| ) | [read] |
Definition at line 2299 of file config.c.
References ast_log(), ast_test_flag, CONFIG_FLAG_NOREALTIME, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, db, find_engine(), ast_config::include_level, ast_config_engine::load_func, LOG_WARNING, ast_config::max_include_level, and table.
Referenced by add_cfg_entry(), ast_config_load2(), config_curl(), config_ldap(), config_odbc(), config_pgsql(), process_text_line(), and read_config_maps().
02300 { 02301 char db[256]; 02302 char table[256]; 02303 struct ast_config_engine *loader = &text_file_engine; 02304 struct ast_config *result; 02305 02306 /* The config file itself bumps include_level by 1 */ 02307 if (cfg->max_include_level > 0 && cfg->include_level == cfg->max_include_level + 1) { 02308 ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level); 02309 return NULL; 02310 } 02311 02312 cfg->include_level++; 02313 02314 if (!ast_test_flag(&flags, CONFIG_FLAG_NOREALTIME) && config_engine_list) { 02315 struct ast_config_engine *eng; 02316 02317 eng = find_engine(filename, 1, db, sizeof(db), table, sizeof(table)); 02318 02319 02320 if (eng && eng->load_func) { 02321 loader = eng; 02322 } else { 02323 eng = find_engine("global", 1, db, sizeof(db), table, sizeof(table)); 02324 if (eng && eng->load_func) 02325 loader = eng; 02326 } 02327 } 02328 02329 result = loader->load_func(db, table, filename, cfg, flags, suggested_include_file, who_asked); 02330 02331 if (result && result != CONFIG_STATUS_FILEINVALID && result != CONFIG_STATUS_FILEUNCHANGED) 02332 result->include_level--; 02333 else if (result != CONFIG_STATUS_FILEINVALID) 02334 cfg->include_level--; 02335 02336 return result; 02337 }
| struct ast_config* ast_config_load2 | ( | const char * | filename, | |
| const char * | who_asked, | |||
| struct ast_flags | flags | |||
| ) | [read] |
Load a config file.
| filename | path of file to open. If no preceding '/' character, path is considered relative to AST_CONFIG_DIR | |
| who_asked | The module which is making this request. | |
| flags | Optional flags: CONFIG_FLAG_WITHCOMMENTS - load the file with comments intact; CONFIG_FLAG_FILEUNCHANGED - check the file mtime and return CONFIG_STATUS_FILEUNCHANGED if the mtime is the same; or CONFIG_FLAG_NOCACHE - don't cache file mtime (main purpose of this option is to save memory on temporary files). |
Create a config structure from a given configuration file.
| NULL | on error |
Definition at line 2339 of file config.c.
References ast_config_destroy(), ast_config_internal_load(), ast_config_new(), CONFIG_STATUS_FILEINVALID, and CONFIG_STATUS_FILEUNCHANGED.
Referenced by __ast_http_load(), __ast_http_post_load(), __ast_udptl_reload(), __init_manager(), _dsp_init(), action_getconfig(), action_getconfigjson(), action_listcategories(), action_updateconfig(), ast_cli_perms_init(), ast_readconfig(), do_reload(), iax_provision_reload(), init_logger_chain(), initialize_cc_max_requests(), load_config(), load_indications(), load_modules(), misdn_cfg_init(), private_enum_init(), rtp_reload(), run_startup_commands(), and set_config().
02340 { 02341 struct ast_config *cfg; 02342 struct ast_config *result; 02343 02344 cfg = ast_config_new(); 02345 if (!cfg) 02346 return NULL; 02347 02348 result = ast_config_internal_load(filename, cfg, flags, "", who_asked); 02349 if (!result || result == CONFIG_STATUS_FILEUNCHANGED || result == CONFIG_STATUS_FILEINVALID) 02350 ast_config_destroy(cfg); 02351 02352 return result; 02353 }
| struct ast_config* ast_config_new | ( | void | ) | [read] |
Create a new base configuration structure.
Definition at line 852 of file config.c.
References ast_calloc, config, MAX_INCLUDE_LEVEL, and ast_config::max_include_level.
Referenced by ast_config_load2(), load_realtime_queue(), read_config_maps(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), setup_dahdi_int(), and write_password_to_file().
00853 { 00854 struct ast_config *config; 00855 00856 if ((config = ast_calloc(1, sizeof(*config)))) 00857 config->max_include_level = MAX_INCLUDE_LEVEL; 00858 return config; 00859 }
| const char* ast_config_option | ( | struct ast_config * | cfg, | |
| const char * | cat, | |||
| const char * | var | |||
| ) |
Retrieve a configuration variable within the configuration set.
Retrieves the named variable var within category cat of configuration set cfg. If not found, attempts to retrieve the named variable var from within category general.
var, or NULL if not found. Definition at line 582 of file config.c.
References ast_variable_retrieve().
Referenced by actual_load_config(), AST_LIST_HEAD_NOLOCK(), and pbx_load_users().
00583 { 00584 const char *tmp; 00585 tmp = ast_variable_retrieve(cfg, cat, var); 00586 if (!tmp) { 00587 tmp = ast_variable_retrieve(cfg, "general", var); 00588 } 00589 return tmp; 00590 }
| void ast_config_set_current_category | ( | struct ast_config * | cfg, | |
| const struct ast_category * | cat | |||
| ) |
Set the category within the configuration as being current.
API for backend configuration engines while building a configuration set.
Definition at line 1024 of file config.c.
References ast_config::current.
01025 { 01026 /* cast below is just to silence compiler warning about dropping "const" */ 01027 cfg->current = (struct ast_category *) cat; 01028 }
| int ast_config_text_file_save | ( | const char * | filename, | |
| const struct ast_config * | cfg, | |||
| const char * | generator | |||
| ) |
Definition at line 1832 of file config.c.
References ao2_container_alloc, ao2_ref, ast_debug, AST_LIST_EMPTY, AST_LIST_LAST, AST_LIST_TRAVERSE, ast_verb, ast_variable::blanklines, ast_comment::cmt, errno, ast_config_include::exec, ast_config_include::exec_file, f, ast_variable::file, ast_category::file, gen_header(), hash_string(), hashtab_compare_strings(), ast_category::ignored, ast_config_include::include_location_file, ast_config_include::include_location_lineno, ast_config_include::included_file, ast_config::includes, insert_leading_blank_lines(), ast_category_template_instance::inst, ast_variable::lineno, ast_category::lineno, ast_variable::name, ast_category_template_instance::name, ast_category::name, ast_category::next, ast_variable::next, ast_comment::next, ast_config_include::next, ast_variable::object, option_debug, ast_config_include::output, ast_variable::precomments, ast_category::precomments, ast_category::root, ast_config::root, ast_variable::sameline, ast_category::sameline, set_fn(), ast_category::template_instances, ast_variable::trailing, ast_category::trailing, ast_variable::value, and var.
Referenced by action_updateconfig(), config_text_file_save(), vm_change_password(), vm_forwardoptions(), and write_password_to_file().
01833 { 01834 FILE *f; 01835 char fn[PATH_MAX]; 01836 struct ast_variable *var; 01837 struct ast_category *cat; 01838 struct ast_comment *cmt; 01839 struct ast_config_include *incl; 01840 int blanklines = 0; 01841 struct ao2_container *fileset; 01842 struct inclfile *fi; 01843 01844 fileset = ao2_container_alloc(1023, hash_string, hashtab_compare_strings); 01845 if (!fileset) { 01846 /* Container creation failed. */ 01847 return -1; 01848 } 01849 01850 /* reset all the output flags, in case this isn't our first time saving this data */ 01851 for (incl = cfg->includes; incl; incl = incl->next) { 01852 incl->output = 0; 01853 } 01854 01855 /* go thru all the inclusions and make sure all the files involved (configfile plus all its inclusions) 01856 are all truncated to zero bytes and have that nice header*/ 01857 for (incl = cfg->includes; incl; incl = incl->next) { 01858 if (!incl->exec) { /* leave the execs alone -- we'll write out the #exec directives, but won't zero out the include files or exec files*/ 01859 /* normally, fn is just set to incl->included_file, prepended with config dir if relative */ 01860 fi = set_fn(fn, sizeof(fn), incl->included_file, configfile, fileset); 01861 f = fopen(fn, "w"); 01862 if (f) { 01863 gen_header(f, configfile, fn, generator); 01864 fclose(f); /* this should zero out the file */ 01865 } else { 01866 ast_debug(1, "Unable to open for writing: %s\n", fn); 01867 ast_verb(2, "Unable to write %s (%s)", fn, strerror(errno)); 01868 } 01869 if (fi) { 01870 ao2_ref(fi, -1); 01871 } 01872 } 01873 } 01874 01875 /* just set fn to absolute ver of configfile */ 01876 fi = set_fn(fn, sizeof(fn), 0, configfile, fileset); 01877 if ( 01878 #ifdef __CYGWIN__ 01879 (f = fopen(fn, "w+")) 01880 #else 01881 (f = fopen(fn, "w")) 01882 #endif 01883 ) { 01884 ast_verb(2, "Saving '%s': ", fn); 01885 gen_header(f, configfile, fn, generator); 01886 cat = cfg->root; 01887 fclose(f); 01888 if (fi) { 01889 ao2_ref(fi, -1); 01890 } 01891 01892 /* from here out, we open each involved file and concat the stuff we need to add to the end and immediately close... */ 01893 /* since each var, cat, and associated comments can come from any file, we have to be 01894 mobile, and open each file, print, and close it on an entry-by-entry basis */ 01895 01896 while (cat) { 01897 fi = set_fn(fn, sizeof(fn), cat->file, configfile, fileset); 01898 f = fopen(fn, "a"); 01899 if (!f) { 01900 ast_debug(1, "Unable to open for writing: %s\n", fn); 01901 ast_verb(2, "Unable to write %s (%s)", fn, strerror(errno)); 01902 if (fi) { 01903 ao2_ref(fi, -1); 01904 } 01905 ao2_ref(fileset, -1); 01906 return -1; 01907 } 01908 01909 /* dump any includes that happen before this category header */ 01910 for (incl=cfg->includes; incl; incl = incl->next) { 01911 if (strcmp(incl->include_location_file, cat->file) == 0){ 01912 if (cat->lineno > incl->include_location_lineno && !incl->output) { 01913 if (incl->exec) 01914 fprintf(f,"#exec \"%s\"\n", incl->exec_file); 01915 else 01916 fprintf(f,"#include \"%s\"\n", incl->included_file); 01917 incl->output = 1; 01918 } 01919 } 01920 } 01921 01922 insert_leading_blank_lines(f, fi, cat->precomments, cat->lineno); 01923 /* Dump section with any appropriate comment */ 01924 for (cmt = cat->precomments; cmt; cmt=cmt->next) { 01925 char *cmtp = cmt->cmt; 01926 while (cmtp && *cmtp == ';' && *(cmtp+1) == '!') { 01927 char *cmtp2 = strchr(cmtp+1, '\n'); 01928 if (cmtp2) 01929 cmtp = cmtp2+1; 01930 else cmtp = 0; 01931 } 01932 if (cmtp) 01933 fprintf(f,"%s", cmtp); 01934 } 01935 fprintf(f, "[%s]", cat->name); 01936 if (cat->ignored || !AST_LIST_EMPTY(&cat->template_instances)) { 01937 fprintf(f, "("); 01938 if (cat->ignored) { 01939 fprintf(f, "!"); 01940 } 01941 if (cat->ignored && !AST_LIST_EMPTY(&cat->template_instances)) { 01942 fprintf(f, ","); 01943 } 01944 if (!AST_LIST_EMPTY(&cat->template_instances)) { 01945 struct ast_category_template_instance *x; 01946 AST_LIST_TRAVERSE(&cat->template_instances, x, next) { 01947 fprintf(f,"%s",x->name); 01948 if (x != AST_LIST_LAST(&cat->template_instances)) 01949 fprintf(f,","); 01950 } 01951 } 01952 fprintf(f, ")"); 01953 } 01954 for(cmt = cat->sameline; cmt; cmt=cmt->next) 01955 { 01956 fprintf(f,"%s", cmt->cmt); 01957 } 01958 if (!cat->sameline) 01959 fprintf(f,"\n"); 01960 for (cmt = cat->trailing; cmt; cmt=cmt->next) { 01961 if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') 01962 fprintf(f,"%s", cmt->cmt); 01963 } 01964 fclose(f); 01965 if (fi) { 01966 ao2_ref(fi, -1); 01967 } 01968 01969 var = cat->root; 01970 while (var) { 01971 struct ast_category_template_instance *x; 01972 int found = 0; 01973 AST_LIST_TRAVERSE(&cat->template_instances, x, next) { 01974 struct ast_variable *v; 01975 for (v = x->inst->root; v; v = v->next) { 01976 if (!strcasecmp(var->name, v->name) && !strcmp(var->value, v->value)) { 01977 found = 1; 01978 break; 01979 } 01980 } 01981 if (found) 01982 break; 01983 } 01984 if (found) { 01985 var = var->next; 01986 continue; 01987 } 01988 fi = set_fn(fn, sizeof(fn), var->file, configfile, fileset); 01989 f = fopen(fn, "a"); 01990 if (!f) { 01991 ast_debug(1, "Unable to open for writing: %s\n", fn); 01992 ast_verb(2, "Unable to write %s (%s)", fn, strerror(errno)); 01993 if (fi) { 01994 ao2_ref(fi, -1); 01995 } 01996 ao2_ref(fileset, -1); 01997 return -1; 01998 } 01999 02000 /* dump any includes that happen before this category header */ 02001 for (incl=cfg->includes; incl; incl = incl->next) { 02002 if (strcmp(incl->include_location_file, var->file) == 0){ 02003 if (var->lineno > incl->include_location_lineno && !incl->output) { 02004 if (incl->exec) 02005 fprintf(f,"#exec \"%s\"\n", incl->exec_file); 02006 else 02007 fprintf(f,"#include \"%s\"\n", incl->included_file); 02008 incl->output = 1; 02009 } 02010 } 02011 } 02012 02013 insert_leading_blank_lines(f, fi, var->precomments, var->lineno); 02014 for (cmt = var->precomments; cmt; cmt=cmt->next) { 02015 if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') 02016 fprintf(f,"%s", cmt->cmt); 02017 } 02018 if (var->sameline) 02019 fprintf(f, "%s %s %s %s", var->name, (var->object ? "=>" : "="), var->value, var->sameline->cmt); 02020 else 02021 fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="), var->value); 02022 for (cmt = var->trailing; cmt; cmt=cmt->next) { 02023 if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') 02024 fprintf(f,"%s", cmt->cmt); 02025 } 02026 if (var->blanklines) { 02027 blanklines = var->blanklines; 02028 while (blanklines--) 02029 fprintf(f, "\n"); 02030 } 02031 02032 fclose(f); 02033 if (fi) { 02034 ao2_ref(fi, -1); 02035 } 02036 02037 var = var->next; 02038 } 02039 cat = cat->next; 02040 } 02041 if (!option_debug) 02042 ast_verb(2, "Saved\n"); 02043 } else { 02044 ast_debug(1, "Unable to open for writing: %s\n", fn); 02045 ast_verb(2, "Unable to write (%s)", strerror(errno)); 02046 if (fi) { 02047 ao2_ref(fi, -1); 02048 } 02049 ao2_ref(fileset, -1); 02050 return -1; 02051 } 02052 02053 /* Now, for files with trailing #include/#exec statements, 02054 we have to make sure every entry is output */ 02055 for (incl=cfg->includes; incl; incl = incl->next) { 02056 if (!incl->output) { 02057 /* open the respective file */ 02058 fi = set_fn(fn, sizeof(fn), incl->include_location_file, configfile, fileset); 02059 f = fopen(fn, "a"); 02060 if (!f) { 02061 ast_debug(1, "Unable to open for writing: %s\n", fn); 02062 ast_verb(2, "Unable to write %s (%s)", fn, strerror(errno)); 02063 if (fi) { 02064 ao2_ref(fi, -1); 02065 } 02066 ao2_ref(fileset, -1); 02067 return -1; 02068 } 02069 02070 /* output the respective include */ 02071 if (incl->exec) 02072 fprintf(f,"#exec \"%s\"\n", incl->exec_file); 02073 else 02074 fprintf(f,"#include \"%s\"\n", incl->included_file); 02075 fclose(f); 02076 incl->output = 1; 02077 if (fi) { 02078 ao2_ref(fi, -1); 02079 } 02080 } 02081 } 02082 ao2_ref(fileset, -1); /* this should destroy the hash container */ 02083 02084 return 0; 02085 }
| int ast_destroy_realtime | ( | const char * | family, | |
| const char * | keyfield, | |||
| const char * | lookup, | |||
| ... | ||||
| ) |
Destroy realtime configuration.
| family | which family/config to be destroyed | |
| keyfield | which field to use as the key | |
| lookup | which value to look for in the key field to match the entry. |
This function is used to destroy an entry in realtime configuration space. Additional params are used as keys.
Definition at line 2590 of file config.c.
References db, ast_config_engine::destroy_func, find_engine(), and table.
Referenced by cli_realtime_destroy(), function_realtime_readdestroy(), leave_voicemail(), and vm_delete().
02591 { 02592 struct ast_config_engine *eng; 02593 int res = -1, i; 02594 char db[256]; 02595 char table[256]; 02596 va_list ap; 02597 02598 va_start(ap, lookup); 02599 for (i = 1; ; i++) { 02600 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02601 if (eng->destroy_func && !(res = eng->destroy_func(db, table, keyfield, lookup, ap))) { 02602 break; 02603 } 02604 } else { 02605 break; 02606 } 02607 } 02608 va_end(ap); 02609 02610 return res; 02611 }
| struct ast_config_include* ast_include_find | ( | struct ast_config * | conf, | |
| const char * | included_file | |||
| ) | [read] |
Definition at line 464 of file config.c.
References ast_config_include::included_file, ast_config::includes, and ast_config_include::next.
Referenced by ast_include_new().
00465 { 00466 struct ast_config_include *x; 00467 for (x=conf->includes;x;x=x->next) { 00468 if (strcmp(x->included_file,included_file) == 0) 00469 return x; 00470 } 00471 return 0; 00472 }
| 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 | |||
| ) | [read] |
Definition at line 324 of file config.c.
References ast_calloc, ast_include_find(), ast_includes_destroy(), ast_log(), ast_strdup, ast_strlen_zero(), ast_config::includes, and LOG_WARNING.
Referenced by process_text_line().
00325 { 00326 /* a file should be included ONCE. Otherwise, if one of the instances is changed, 00327 * then all be changed. -- how do we know to include it? -- Handling modified 00328 * instances is possible, I'd have 00329 * to create a new master for each instance. */ 00330 struct ast_config_include *inc; 00331 struct stat statbuf; 00332 00333 inc = ast_include_find(conf, included_file); 00334 if (inc) { 00335 do { 00336 inc->inclusion_count++; 00337 snprintf(real_included_file_name, real_included_file_name_size, "%s~~%d", included_file, inc->inclusion_count); 00338 } while (stat(real_included_file_name, &statbuf) == 0); 00339 ast_log(LOG_WARNING,"'%s', line %d: Same File included more than once! This data will be saved in %s if saved back to disk.\n", from_file, from_lineno, real_included_file_name); 00340 } else 00341 *real_included_file_name = 0; 00342 00343 inc = ast_calloc(1,sizeof(struct ast_config_include)); 00344 if (!inc) { 00345 return NULL; 00346 } 00347 inc->include_location_file = ast_strdup(from_file); 00348 inc->include_location_lineno = from_lineno; 00349 if (!ast_strlen_zero(real_included_file_name)) 00350 inc->included_file = ast_strdup(real_included_file_name); 00351 else 00352 inc->included_file = ast_strdup(included_file); 00353 00354 inc->exec = is_exec; 00355 if (is_exec) 00356 inc->exec_file = ast_strdup(exec_file); 00357 00358 if (!inc->include_location_file 00359 || !inc->included_file 00360 || (is_exec && !inc->exec_file)) { 00361 ast_includes_destroy(inc); 00362 return NULL; 00363 } 00364 00365 /* attach this new struct to the conf struct */ 00366 inc->next = conf->includes; 00367 conf->includes = inc; 00368 00369 return inc; 00370 }
| void ast_include_rename | ( | struct ast_config * | conf, | |
| const char * | from_file, | |||
| const char * | to_file | |||
| ) |
Definition at line 372 of file config.c.
References ast_free, ast_strdup, ast_variable_destroy(), ast_variable_move(), ast_variable_new(), ast_variable::file, ast_category::file, ast_config_include::include_location_file, ast_config::includes, ast_category::last, ast_variable::name, ast_variable::next, ast_category::next, ast_config_include::next, ast_category::root, ast_config::root, str, and ast_variable::value.
Referenced by action_updateconfig().
00373 { 00374 struct ast_config_include *incl; 00375 struct ast_category *cat; 00376 char *str; 00377 00378 int from_len = strlen(from_file); 00379 int to_len = strlen(to_file); 00380 00381 if (strcmp(from_file, to_file) == 0) /* no use wasting time if the name is the same */ 00382 return; 00383 00384 /* the manager code allows you to read in one config file, then 00385 * write it back out under a different name. But, the new arrangement 00386 * ties output lines to the file name. So, before you try to write 00387 * the config file to disk, better riffle thru the data and make sure 00388 * the file names are changed. 00389 */ 00390 /* file names are on categories, includes (of course), and on variables. So, 00391 * traverse all this and swap names */ 00392 00393 for (incl = conf->includes; incl; incl=incl->next) { 00394 if (strcmp(incl->include_location_file,from_file) == 0) { 00395 if (from_len >= to_len) 00396 strcpy(incl->include_location_file, to_file); 00397 else { 00398 /* Keep the old filename if the allocation fails. */ 00399 str = ast_strdup(to_file); 00400 if (str) { 00401 ast_free(incl->include_location_file); 00402 incl->include_location_file = str; 00403 } 00404 } 00405 } 00406 } 00407 for (cat = conf->root; cat; cat = cat->next) { 00408 struct ast_variable **prev; 00409 struct ast_variable *v; 00410 struct ast_variable *new_var; 00411 00412 if (strcmp(cat->file,from_file) == 0) { 00413 if (from_len >= to_len) 00414 strcpy(cat->file, to_file); 00415 else { 00416 /* Keep the old filename if the allocation fails. */ 00417 str = ast_strdup(to_file); 00418 if (str) { 00419 ast_free(cat->file); 00420 cat->file = str; 00421 } 00422 } 00423 } 00424 for (prev = &cat->root, v = cat->root; v; prev = &v->next, v = v->next) { 00425 if (strcmp(v->file, from_file)) { 00426 continue; 00427 } 00428 00429 /* 00430 * Calculate actual space available. The file string is 00431 * intentionally stuffed before the name string just so we can 00432 * do this. 00433 */ 00434 if (to_len < v->name - v->file) { 00435 /* The new name will fit in the available space. */ 00436 str = (char *) v->file;/* Stupid compiler complains about discarding qualifiers even though I used a cast. */ 00437 strcpy(str, to_file);/* SAFE */ 00438 continue; 00439 } 00440 00441 /* Keep the old filename if the allocation fails. */ 00442 new_var = ast_variable_new(v->name, v->value, to_file); 00443 if (!new_var) { 00444 continue; 00445 } 00446 00447 /* Move items from the old list node to the replacement node. */ 00448 ast_variable_move(new_var, v); 00449 00450 /* Replace the old node in the list with the new node. */ 00451 new_var->next = v->next; 00452 if (cat->last == v) { 00453 cat->last = new_var; 00454 } 00455 *prev = new_var; 00456 00457 ast_variable_destroy(v); 00458 00459 v = new_var; 00460 } 00461 } 00462 }
| AST_INLINE_API | ( | int | ast_rq_is_intrequire_type type | ) |
Check if require type is an integer type.
Remove standard encoding from realtime values, which ensures that a semicolon embedded within a single value is not treated upon retrieval as multiple values.
| chunk | Data to be decoded |
| struct ast_variable* ast_load_realtime | ( | const char * | family, | |
| ... | ||||
| ) | [read] |
Retrieve realtime configuration.
| family | which family/config to lookup |
This will use builtin configuration backends to look up a particular entity in realtime and return a variable list of its parameters.
Definition at line 2388 of file config.c.
References ast_load_realtime_helper(), ast_strlen_zero(), ast_variable_destroy(), ast_variable::next, and ast_variable::value.
Referenced by conf_run(), copy_plain_file(), find_conf_realtime(), find_realtime(), find_realtime_gw(), find_user_realtime(), leave_queue(), load_realtime_queue(), local_ast_moh_start(), queue_function_queuewaitingcount(), realtime_alias(), realtime_peer(), realtime_peer_by_addr(), realtime_peer_by_name(), realtime_peer_get_sippeer_helper(), realtime_switch_common(), realtime_user(), and rt_extend_conf().
02389 { 02390 struct ast_variable *res; 02391 struct ast_variable *cur; 02392 struct ast_variable **prev; 02393 va_list ap; 02394 02395 va_start(ap, family); 02396 res = ast_load_realtime_helper(family, ap); 02397 va_end(ap); 02398 02399 /* Filter the list. */ 02400 prev = &res; 02401 cur = res; 02402 while (cur) { 02403 if (ast_strlen_zero(cur->value)) { 02404 /* Eliminate empty entries */ 02405 struct ast_variable *next; 02406 02407 next = cur->next; 02408 *prev = next; 02409 ast_variable_destroy(cur); 02410 cur = next; 02411 } else { 02412 /* Make blank entries empty and keep them. */ 02413 if (cur->value[0] == ' ' && cur->value[1] == '\0') { 02414 char *vptr = (char *) cur->value; 02415 02416 vptr[0] = '\0'; 02417 } 02418 02419 prev = &cur->next; 02420 cur = cur->next; 02421 } 02422 } 02423 return res; 02424 }
| struct ast_variable* ast_load_realtime_all | ( | const char * | family, | |
| ... | ||||
| ) | [read] |
Definition at line 2376 of file config.c.
References ast_load_realtime_helper().
Referenced by cli_realtime_load(), function_realtime_read(), function_realtime_readdestroy(), and realtimefield_read().
02377 { 02378 struct ast_variable *res; 02379 va_list ap; 02380 02381 va_start(ap, family); 02382 res = ast_load_realtime_helper(family, ap); 02383 va_end(ap); 02384 02385 return res; 02386 }
| struct ast_config* ast_load_realtime_multientry | ( | const char * | family, | |
| ... | ||||
| ) | [read] |
Retrieve realtime configuration.
| family | which family/config to lookup |
This will use builtin configuration backends to look up a particular entity in realtime and return a variable list of its parameters. Unlike the ast_load_realtime, this function can return more than one entry and is thus stored inside a traditional ast_config structure rather than just returning a linked list of variables.
| NULL | Error or no results returned |
Definition at line 2490 of file config.c.
References ast_config_destroy(), db, find_engine(), ast_config_engine::realtime_multi_func, ast_config::root, and table.
Referenced by __queues_show(), conf_exec(), find_realtime(), get_insecure_variable_from_sippeers(), get_insecure_variable_from_sipregs(), load_realtime_queue(), queues_data_provider_get(), realtime_directory(), realtime_switch_common(), show_users_realtime(), and update_realtime_members().
02491 { 02492 struct ast_config_engine *eng; 02493 char db[256]; 02494 char table[256]; 02495 struct ast_config *res = NULL; 02496 va_list ap; 02497 int i; 02498 02499 va_start(ap, family); 02500 for (i = 1; ; i++) { 02501 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02502 if (eng->realtime_multi_func && (res = eng->realtime_multi_func(db, table, ap))) { 02503 /* If we were returned an empty cfg, destroy it and return NULL */ 02504 if (!res->root) { 02505 ast_config_destroy(res); 02506 res = NULL; 02507 } 02508 break; 02509 } 02510 } else { 02511 break; 02512 } 02513 } 02514 va_end(ap); 02515 02516 return res; 02517 }
| int ast_parse_arg | ( | const char * | arg, | |
| enum ast_parse_flags | flags, | |||
| void * | p_result, | |||
| ... | ||||
| ) |
The argument parsing routine.
| arg | the string to parse. It is not modified. | |
| flags | combination of ast_parse_flags to specify the return type and additional checks. | |
| result | pointer to the result. NULL is valid here, and can be used to perform only the validity checks. | |
| ... | extra arguments are required according to flags. |
| 0 | in case of success, != 0 otherwise. | |
| result | returns the parsed value in case of success, the default value in case of error, or it is left unchanged in case of error and no default specified. Note that in certain cases (e.g. sockaddr_in, with multi-field return values) some of the fields in result may be changed even if an error occurs. |
Examples of use: ast_parse_arg("223", PARSE_INT32|PARSE_IN_RANGE, &a, -1000, 1000); returns 0, a = 223 ast_parse_arg("22345", PARSE_INT32|PARSE_IN_RANGE|PARSE_DEFAULT, &a, 9999, 10, 100); returns 1, a = 9999 ast_parse_arg("22345ssf", PARSE_UINT32|PARSE_IN_RANGE, &b, 10, 100); returns 1, b unchanged ast_parse_arg("www.foo.biz:44", PARSE_INADDR, &sa); returns 0, sa contains address and port ast_parse_arg("www.foo.biz", PARSE_INADDR|PARSE_PORT_REQUIRE, &sa); returns 1 because port is missing, sa contains address
Definition at line 2645 of file config.c.
References ast_debug, ast_gethostbyname(), ast_inet_ntoa(), ast_skip_blanks(), ast_sockaddr_parse(), ast_sockaddr_stringify(), ast_strdupa, ast_strlen_zero(), errno, hp, INT32_MAX, INT32_MIN, PARSE_ADDR, PARSE_DEFAULT, PARSE_DOUBLE, PARSE_IN_RANGE, PARSE_INADDR, PARSE_INT32, PARSE_OUT_RANGE, PARSE_PORT_FORBID, PARSE_PORT_IGNORE, PARSE_PORT_MASK, PARSE_PORT_REQUIRE, PARSE_TYPE, PARSE_UINT32, and UINT32_MAX.
Referenced by __ast_http_load(), ast_tls_read_conf(), check_via_response(), gtalk_load_config(), and reload_config().
02647 { 02648 va_list ap; 02649 int error = 0; 02650 02651 va_start(ap, p_result); 02652 switch (flags & PARSE_TYPE) { 02653 case PARSE_INT32: 02654 { 02655 long int x = 0; 02656 int32_t *result = p_result; 02657 int32_t def = result ? *result : 0, high = INT32_MAX, low = INT32_MIN; 02658 char *endptr = NULL; 02659 02660 /* optional arguments: default value and/or (low, high) */ 02661 if (flags & PARSE_DEFAULT) { 02662 def = va_arg(ap, int32_t); 02663 } 02664 if (flags & (PARSE_IN_RANGE | PARSE_OUT_RANGE)) { 02665 low = va_arg(ap, int32_t); 02666 high = va_arg(ap, int32_t); 02667 } 02668 if (ast_strlen_zero(arg)) { 02669 error = 1; 02670 goto int32_done; 02671 } 02672 errno = 0; 02673 x = strtol(arg, &endptr, 0); 02674 if (*endptr || errno || x < INT32_MIN || x > INT32_MAX) { 02675 /* Parse error, or type out of int32_t bounds */ 02676 error = 1; 02677 goto int32_done; 02678 } 02679 error = (x < low) || (x > high); 02680 if (flags & PARSE_OUT_RANGE) { 02681 error = !error; 02682 } 02683 int32_done: 02684 if (result) { 02685 *result = error ? def : x; 02686 } 02687 02688 ast_debug(3, "extract int from [%s] in [%d, %d] gives [%ld](%d)\n", 02689 arg, low, high, result ? *result : x, error); 02690 break; 02691 } 02692 02693 case PARSE_UINT32: 02694 { 02695 unsigned long int x = 0; 02696 uint32_t *result = p_result; 02697 uint32_t def = result ? *result : 0, low = 0, high = UINT32_MAX; 02698 char *endptr = NULL; 02699 02700 /* optional argument: first default value, then range */ 02701 if (flags & PARSE_DEFAULT) { 02702 def = va_arg(ap, uint32_t); 02703 } 02704 if (flags & (PARSE_IN_RANGE|PARSE_OUT_RANGE)) { 02705 /* range requested, update bounds */ 02706 low = va_arg(ap, uint32_t); 02707 high = va_arg(ap, uint32_t); 02708 } 02709 02710 if (ast_strlen_zero(arg)) { 02711 error = 1; 02712 goto uint32_done; 02713 } 02714 /* strtoul will happilly and silently negate negative numbers */ 02715 arg = ast_skip_blanks(arg); 02716 if (*arg == '-') { 02717 error = 1; 02718 goto uint32_done; 02719 } 02720 errno = 0; 02721 x = strtoul(arg, &endptr, 0); 02722 if (*endptr || errno || x > UINT32_MAX) { 02723 error = 1; 02724 goto uint32_done; 02725 } 02726 error = (x < low) || (x > high); 02727 if (flags & PARSE_OUT_RANGE) { 02728 error = !error; 02729 } 02730 uint32_done: 02731 if (result) { 02732 *result = error ? def : x; 02733 } 02734 ast_debug(3, "extract uint from [%s] in [%u, %u] gives [%lu](%d)\n", 02735 arg, low, high, result ? *result : x, error); 02736 break; 02737 } 02738 02739 case PARSE_DOUBLE: 02740 { 02741 double *result = p_result; 02742 double x = 0, def = result ? *result : 0, low = -HUGE_VAL, high = HUGE_VAL; 02743 char *endptr = NULL; 02744 02745 /* optional argument: first default value, then range */ 02746 if (flags & PARSE_DEFAULT) { 02747 def = va_arg(ap, double); 02748 } 02749 if (flags & (PARSE_IN_RANGE | PARSE_OUT_RANGE)) { 02750 /* range requested, update bounds */ 02751 low = va_arg(ap, double); 02752 high = va_arg(ap, double); 02753 } 02754 if (ast_strlen_zero(arg)) { 02755 error = 1; 02756 goto double_done; 02757 } 02758 errno = 0; 02759 x = strtod(arg, &endptr); 02760 if (*endptr || errno == ERANGE) { 02761 error = 1; 02762 goto double_done; 02763 } 02764 error = (x < low) || (x > high); 02765 if (flags & PARSE_OUT_RANGE) { 02766 error = !error; 02767 } 02768 double_done: 02769 if (result) { 02770 *result = error ? def : x; 02771 } 02772 ast_debug(3, "extract double from [%s] in [%f, %f] gives [%f](%d)\n", 02773 arg, low, high, result ? *result : x, error); 02774 break; 02775 } 02776 case PARSE_ADDR: 02777 { 02778 struct ast_sockaddr *addr = (struct ast_sockaddr *)p_result; 02779 02780 if (!ast_sockaddr_parse(addr, arg, flags & PARSE_PORT_MASK)) { 02781 error = 1; 02782 } 02783 02784 ast_debug(3, "extract addr from %s gives %s(%d)\n", 02785 arg, ast_sockaddr_stringify(addr), error); 02786 02787 break; 02788 } 02789 case PARSE_INADDR: /* TODO Remove this (use PARSE_ADDR instead). */ 02790 { 02791 char *port, *buf; 02792 struct sockaddr_in _sa_buf; /* buffer for the result */ 02793 struct sockaddr_in *sa = p_result ? 02794 (struct sockaddr_in *)p_result : &_sa_buf; 02795 /* default is either the supplied value or the result itself */ 02796 struct sockaddr_in *def = (flags & PARSE_DEFAULT) ? 02797 va_arg(ap, struct sockaddr_in *) : sa; 02798 struct hostent *hp; 02799 struct ast_hostent ahp; 02800 02801 memset(&_sa_buf, '\0', sizeof(_sa_buf)); /* clear buffer */ 02802 /* duplicate the string to strip away the :port */ 02803 port = ast_strdupa(arg); 02804 buf = strsep(&port, ":"); 02805 sa->sin_family = AF_INET; /* assign family */ 02806 /* 02807 * honor the ports flag setting, assign default value 02808 * in case of errors or field unset. 02809 */ 02810 flags &= PARSE_PORT_MASK; /* the only flags left to process */ 02811 if (port) { 02812 if (flags == PARSE_PORT_FORBID) { 02813 error = 1; /* port was forbidden */ 02814 sa->sin_port = def->sin_port; 02815 } else if (flags == PARSE_PORT_IGNORE) 02816 sa->sin_port = def->sin_port; 02817 else /* accept or require */ 02818 sa->sin_port = htons(strtol(port, NULL, 0)); 02819 } else { 02820 sa->sin_port = def->sin_port; 02821 if (flags == PARSE_PORT_REQUIRE) 02822 error = 1; 02823 } 02824 /* Now deal with host part, even if we have errors before. */ 02825 hp = ast_gethostbyname(buf, &ahp); 02826 if (hp) /* resolved successfully */ 02827 memcpy(&sa->sin_addr, hp->h_addr, sizeof(sa->sin_addr)); 02828 else { 02829 error = 1; 02830 sa->sin_addr = def->sin_addr; 02831 } 02832 ast_debug(3, 02833 "extract inaddr from [%s] gives [%s:%d](%d)\n", 02834 arg, ast_inet_ntoa(sa->sin_addr), 02835 ntohs(sa->sin_port), error); 02836 break; 02837 } 02838 } 02839 va_end(ap); 02840 return error; 02841 }
| int ast_realtime_enabled | ( | void | ) |
Check if there's any realtime engines loaded.
Definition at line 2441 of file config.c.
References config_maps.
Referenced by action_coresettings(), ast_check_realtime(), and handle_show_settings().
02442 { 02443 return config_maps ? 1 : 0; 02444 }
| char* ast_realtime_encode_chunk | ( | struct ast_str ** | dest, | |
| ssize_t | maxlen, | |||
| const char * | chunk | |||
| ) |
Encodes a chunk of data for realtime.
| dest | Destination buffer | |
| maxlen | Length passed through to ast_str_* functions | |
| chunk | Source data to be encoded |
Definition at line 2625 of file config.c.
References ast_str_append(), ast_str_buffer(), ast_str_reset(), and ast_str_set().
02626 { 02627 if (!strchr(chunk, ';') && !strchr(chunk, '^')) { 02628 ast_str_set(dest, maxlen, "%s", chunk); 02629 } else { 02630 ast_str_reset(*dest); 02631 for (; *chunk; chunk++) { 02632 if (strchr(";^", *chunk)) { 02633 ast_str_append(dest, maxlen, "^%02hhX", *chunk); 02634 } else { 02635 ast_str_append(dest, maxlen, "%c", *chunk); 02636 } 02637 } 02638 } 02639 return ast_str_buffer(*dest); 02640 }
| int ast_realtime_require_field | ( | const char * | family, | |
| ... | ||||
| ) |
Inform realtime what fields that may be stored.
| family | which family/config is referenced |
This will inform builtin configuration backends that particular fields may be updated during the use of that configuration section. This is mainly to be used during startup routines, to ensure that various fields exist in the backend. The backends may take various actions, such as creating new fields in the data store or warning the administrator that new fields may need to be created, in order to ensure proper function.
The arguments are specified in groups of 3: column name, column type, and column size. The column types are specified as integer constants, defined by the enum require_type. Note that the size is specified as the number of equivalent character fields that a field may take up, even if a field is otherwise specified as an integer type. This is due to the fact that some fields have historically been specified as character types, even if they contained integer values.
A family should always specify its fields to the minimum necessary requirements to fulfill all possible values (within reason; for example, a timeout value may reasonably be specified as an INTEGER2, with size 5. Even though values above 32767 seconds are possible, they are unlikely to be useful, and we should not complain about that size).
| 0 | Required fields met specified standards | |
| -1 | One or more fields was missing or insufficient |
Definition at line 2446 of file config.c.
References db, find_engine(), ast_config_engine::require_func, and table.
Referenced by ast_queue_log(), change_password_realtime(), conf_run(), load_module(), and logger_queue_rt_start().
02447 { 02448 struct ast_config_engine *eng; 02449 char db[256]; 02450 char table[256]; 02451 va_list ap; 02452 int res = -1, i; 02453 02454 va_start(ap, family); 02455 for (i = 1; ; i++) { 02456 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02457 /* If the require succeeds, it returns 0. */ 02458 if (eng->require_func && !(res = eng->require_func(db, table, ap))) { 02459 break; 02460 } 02461 } else { 02462 break; 02463 } 02464 } 02465 va_end(ap); 02466 02467 return res; 02468 }
| int ast_store_realtime | ( | const char * | family, | |
| ... | ||||
| ) |
Create realtime configuration.
| family | which family/config to be created |
This function is used to create a parameter in realtime configuration space.
Definition at line 2566 of file config.c.
References db, find_engine(), ast_config_engine::store_func, and table.
Referenced by ast_queue_log(), cli_realtime_store(), copy_plain_file(), function_realtime_store(), and leave_voicemail().
02567 { 02568 struct ast_config_engine *eng; 02569 int res = -1, i; 02570 char db[256]; 02571 char table[256]; 02572 va_list ap; 02573 02574 va_start(ap, family); 02575 for (i = 1; ; i++) { 02576 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02577 /* If the store succeeds, it returns 0. */ 02578 if (eng->store_func && !(res = eng->store_func(db, table, ap))) { 02579 break; 02580 } 02581 } else { 02582 break; 02583 } 02584 } 02585 va_end(ap); 02586 02587 return res; 02588 }
| int ast_unload_realtime | ( | const char * | family | ) |
Release any resources cached for a realtime family.
| family | which family/config to destroy |
Various backends may cache attributes about a realtime data storage facility; on reload, a front end resource may request to purge that cache.
| 0 | If any cache was purged | |
| -1 | If no cache was found |
Definition at line 2470 of file config.c.
References db, find_engine(), table, and ast_config_engine::unload_func.
Referenced by __unload_module(), load_config(), logger_queue_init(), reload(), reload_config(), reload_logger(), and unload_module().
02471 { 02472 struct ast_config_engine *eng; 02473 char db[256]; 02474 char table[256]; 02475 int res = -1, i; 02476 02477 for (i = 1; ; i++) { 02478 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02479 if (eng->unload_func) { 02480 /* Do this for ALL engines */ 02481 res = eng->unload_func(db, table); 02482 } 02483 } else { 02484 break; 02485 } 02486 } 02487 return res; 02488 }
| int ast_update2_realtime | ( | const char * | family, | |
| ... | ||||
| ) |
Update realtime configuration.
| family | which family/config to be updated |
This function is used to update a parameter in realtime configuration space. It includes the ability to lookup a row based upon multiple key criteria. As a result, this function includes two sentinel values, one to terminate lookup values and the other to terminate the listing of fields to update.
Definition at line 2543 of file config.c.
References db, find_engine(), table, and ast_config_engine::update2_func.
Referenced by change_password_realtime(), and cli_realtime_update2().
02544 { 02545 struct ast_config_engine *eng; 02546 int res = -1, i; 02547 char db[256]; 02548 char table[256]; 02549 va_list ap; 02550 02551 va_start(ap, family); 02552 for (i = 1; ; i++) { 02553 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02554 if (eng->update2_func && !(res = eng->update2_func(db, table, ap))) { 02555 break; 02556 } 02557 } else { 02558 break; 02559 } 02560 } 02561 va_end(ap); 02562 02563 return res; 02564 }
| int ast_update_realtime | ( | const char * | family, | |
| const char * | keyfield, | |||
| const char * | lookup, | |||
| ... | ||||
| ) |
Update realtime configuration.
| family | which family/config to be updated | |
| keyfield | which field to use as the key | |
| lookup | which value to look for in the key field to match the entry. |
This function is used to update a parameter in realtime configuration space.
Definition at line 2519 of file config.c.
References db, find_engine(), table, and ast_config_engine::update_func.
Referenced by cli_realtime_update(), conf_run(), destroy_association(), function_realtime_write(), handle_response_peerpoke(), leave_voicemail(), realtime_update_peer(), rename_file(), rt_extend_conf(), sip_poke_noanswer(), and update_realtime_member_field().
02520 { 02521 struct ast_config_engine *eng; 02522 int res = -1, i; 02523 char db[256]; 02524 char table[256]; 02525 va_list ap; 02526 02527 va_start(ap, lookup); 02528 for (i = 1; ; i++) { 02529 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02530 /* If the update succeeds, it returns 0. */ 02531 if (eng->update_func && !(res = eng->update_func(db, table, keyfield, lookup, ap))) { 02532 break; 02533 } 02534 } else { 02535 break; 02536 } 02537 } 02538 va_end(ap); 02539 02540 return res; 02541 }
| void ast_variable_append | ( | struct ast_category * | category, | |
| struct ast_variable * | variable | |||
| ) |
Definition at line 475 of file config.c.
References ast_category::last, ast_variable::next, and ast_category::root.
Referenced by add_cfg_entry(), add_rt_multi_cfg_entry(), config_curl(), config_ldap(), config_odbc(), config_pgsql(), handle_updates(), inherit_category(), move_variables(), process_text_line(), realtime_directory(), realtime_multi_curl(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), vm_change_password(), and write_password_to_file().
| struct ast_variable* ast_variable_browse | ( | const struct ast_config * | config, | |
| const char * | category | |||
| ) | [read] |
Goes through variables.
Somewhat similar in intent as the ast_category_browse. List variables of config file category
| ast_variable | list on success | |
| NULL | on failure |
Definition at line 565 of file config.c.
References ast_category_get(), ast_config::last_browse, ast_category::name, and ast_category::root.
Referenced by __ast_http_load(), __ast_http_post_load(), __init_manager(), _dsp_init(), action_getconfig(), action_getconfigjson(), actual_load_config(), adsi_load(), aji_load_config(), ast_cli_perms_init(), AST_LIST_HEAD_NOLOCK(), ast_plc_reload(), ast_readconfig(), ast_variable_retrieve(), build_calendar(), build_device(), build_event_channel(), caldav_load_calendar(), conf_exec(), config_load(), config_module(), do_say(), ewscal_load_calendar(), exchangecal_load_calendar(), find_conf(), gtalk_load_config(), handle_cli_dialplan_save(), iax_template_parse(), ical_load_calendar(), init_logger_chain(), jingle_load_config(), load_config(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_pktccops_config(), misdn_cfg_init(), odbc_load_module(), osp_create_provider(), parse_config(), parse_tone_zone(), pbx_load_config(), process_config(), read_agent_config(), read_config_maps(), reload(), reload_config(), reload_followme(), reload_module(), reload_queue_rules(), reload_single_queue(), run_startup_commands(), set_config(), setup_dahdi_int(), show_users_realtime(), sip_cli_notify(), sla_build_station(), sla_build_trunk(), smdi_load(), store_config(), and tds_load_module().
00566 { 00567 struct ast_category *cat = NULL; 00568 00569 if (!category) { 00570 return NULL; 00571 } 00572 00573 if (config->last_browse && (config->last_browse->name == category)) { 00574 cat = config->last_browse; 00575 } else { 00576 cat = ast_category_get(config, category); 00577 } 00578 00579 return (cat) ? cat->root : NULL; 00580 }
| int ast_variable_delete | ( | struct ast_category * | category, | |
| const char * | variable, | |||
| const char * | match, | |||
| const char * | line | |||
| ) |
Definition at line 861 of file config.c.
References ast_strlen_zero(), ast_variable_destroy(), ast_category::last, ast_variable::name, ast_variable::next, ast_category::root, and ast_variable::value.
Referenced by handle_updates().
00862 { 00863 struct ast_variable *cur, *prev=NULL, *curn; 00864 int res = -1; 00865 int num_item = 0; 00866 int req_item; 00867 00868 req_item = -1; 00869 if (!ast_strlen_zero(line)) { 00870 /* Requesting to delete by item number. */ 00871 if (sscanf(line, "%30d", &req_item) != 1 00872 || req_item < 0) { 00873 /* Invalid item number to delete. */ 00874 return -1; 00875 } 00876 } 00877 00878 prev = NULL; 00879 cur = category->root; 00880 while (cur) { 00881 curn = cur->next; 00882 /* Delete by item number or by variable name with optional value. */ 00883 if ((0 <= req_item && num_item == req_item) 00884 || (req_item < 0 && !strcasecmp(cur->name, variable) 00885 && (ast_strlen_zero(match) || !strcasecmp(cur->value, match)))) { 00886 if (prev) { 00887 prev->next = cur->next; 00888 if (cur == category->last) 00889 category->last = prev; 00890 } else { 00891 category->root = cur->next; 00892 if (cur == category->last) 00893 category->last = NULL; 00894 } 00895 ast_variable_destroy(cur); 00896 res = 0; 00897 } else 00898 prev = cur; 00899 00900 cur = curn; 00901 ++num_item; 00902 } 00903 return res; 00904 }
| void ast_variable_insert | ( | struct ast_category * | category, | |
| struct ast_variable * | variable, | |||
| const char * | line | |||
| ) |
Definition at line 488 of file config.c.
References ast_variable::next, and ast_category::root.
Referenced by handle_updates().
00489 { 00490 struct ast_variable *cur = category->root; 00491 int lineno; 00492 int insertline; 00493 00494 if (!variable || sscanf(line, "%30d", &insertline) != 1) { 00495 return; 00496 } 00497 if (!insertline) { 00498 variable->next = category->root; 00499 category->root = variable; 00500 } else { 00501 for (lineno = 1; lineno < insertline; lineno++) { 00502 cur = cur->next; 00503 if (!cur->next) { 00504 break; 00505 } 00506 } 00507 variable->next = cur->next; 00508 cur->next = variable; 00509 } 00510 }
| struct ast_variable* ast_variable_new | ( | const char * | name, | |
| const char * | value, | |||
| const char * | filename | |||
| ) | [read] |
Definition at line 270 of file config.c.
References __ast_calloc(), ast_calloc, ast_variable::file, MIN_VARIABLE_FNAME_SPACE, ast_variable::name, ast_variable::stuff, and ast_variable::value.
Referenced by add_cfg_entry(), add_rt_cfg_entry(), add_rt_multi_cfg_entry(), add_var(), apply_outgoing(), ast_channeltype_list(), ast_http_get_post_vars(), ast_include_rename(), ast_variable_update(), ast_variables_dup(), build_user(), check_access(), config_curl(), config_ldap(), config_odbc(), config_pgsql(), copy_vars(), create_vmaccount(), dup_vars(), handle_updates(), handle_uri(), httpd_helper_thread(), iax_parse_ies(), ldap_table_config_add_attribute(), man_do_variable_value(), manager_sipnotify(), mkintf(), parkandannounce_exec(), parse_cookies(), process_dahdi(), process_text_line(), realtime_curl(), realtime_directory(), realtime_ldap_entry_to_var(), realtime_ldap_result_to_vars(), realtime_multi_curl(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_odbc(), realtime_pgsql(), sip_cli_notify(), variable_clone(), vm_change_password(), and write_password_to_file().
00272 { 00273 struct ast_variable *variable; 00274 int name_len = strlen(name) + 1; 00275 int val_len = strlen(value) + 1; 00276 int fn_len = strlen(filename) + 1; 00277 00278 /* Ensure a minimum length in case the filename is changed later. */ 00279 if (fn_len < MIN_VARIABLE_FNAME_SPACE) { 00280 fn_len = MIN_VARIABLE_FNAME_SPACE; 00281 } 00282 00283 if ( 00284 #ifdef MALLOC_DEBUG 00285 (variable = __ast_calloc(1, fn_len + name_len + val_len + sizeof(*variable), file, lineno, func)) 00286 #else 00287 (variable = ast_calloc(1, fn_len + name_len + val_len + sizeof(*variable))) 00288 #endif 00289 ) { 00290 char *dst = variable->stuff; /* writable space starts here */ 00291 00292 /* Put file first so ast_include_rename() can calculate space available. */ 00293 variable->file = strcpy(dst, filename); 00294 dst += fn_len; 00295 variable->name = strcpy(dst, name); 00296 dst += name_len; 00297 variable->value = strcpy(dst, value); 00298 } 00299 return variable; 00300 }
| const char* ast_variable_retrieve | ( | const struct ast_config * | config, | |
| const char * | category, | |||
| const char * | variable | |||
| ) |
Gets a variable.
| config | which (opened) config to use | |
| category | category under which the variable lies | |
| variable | which variable you wish to get the data for |
Goes through a given config file in the given category and searches for the given variable
| The | variable value on success | |
| NULL | if unable to find it. |
Definition at line 593 of file config.c.
References ast_variable_browse(), ast_variable::name, ast_category::next, ast_variable::next, ast_category::root, ast_config::root, and ast_variable::value.
Referenced by __ast_udptl_reload(), __init_manager(), actual_load_config(), advanced_options(), aji_load_config(), ast_config_option(), AST_LIST_HEAD_NOLOCK(), build_extension(), conf_exec(), config_function_read(), config_module(), directory_exec(), do_reload(), festival_exec(), find_queue_by_name_rt(), find_realtime(), get_insecure_variable_from_config(), get_insecure_variable_from_sipregs(), gtalk_load_config(), iax_template_parse(), init_acf_query(), init_logger_chain(), initialize_cc_max_requests(), jingle_load_config(), load_config(), load_config_meetme(), load_indications(), load_module(), load_modules(), load_tech_calendars(), make_email_file(), odbc_load_module(), osp_load(), parse_config(), pbx_load_config(), pbx_load_users(), play_message(), prep_email_sub_vars(), private_enum_init(), queue_set_global_params(), read_agent_config(), read_password_from_file(), realtime_directory(), reload_config(), reload_followme(), reload_single_queue(), rtp_reload(), search_directory(), set_config(), setup_dahdi_int(), sla_build_station(), sla_build_trunk(), sla_load_config(), tds_load_module(), update_realtime_members(), vm_change_password(), and vm_forwardoptions().
00594 { 00595 struct ast_variable *v; 00596 00597 if (category) { 00598 for (v = ast_variable_browse(config, category); v; v = v->next) { 00599 if (!strcasecmp(variable, v->name)) { 00600 return v->value; 00601 } 00602 } 00603 } else { 00604 struct ast_category *cat; 00605 00606 for (cat = config->root; cat; cat = cat->next) { 00607 for (v = cat->root; v; v = v->next) { 00608 if (!strcasecmp(variable, v->name)) { 00609 return v->value; 00610 } 00611 } 00612 } 00613 } 00614 00615 return NULL; 00616 }
| int ast_variable_update | ( | struct ast_category * | category, | |
| const char * | variable, | |||
| const char * | value, | |||
| const char * | match, | |||
| unsigned int | object | |||
| ) |
Update variable value within a config.
| category | Category element within the config | |
| variable | Name of the variable to change | |
| value | New value of the variable | |
| match | If set, previous value of the variable (if NULL or zero-length, no matching will be done) | |
| object | Boolean of whether to make the new variable an object |
Definition at line 906 of file config.c.
References ast_strlen_zero(), ast_variable_destroy(), ast_variable_move(), ast_variable_new(), ast_variable::file, ast_category::last, ast_variable::name, ast_variable::next, ast_category::root, and ast_variable::value.
Referenced by handle_updates(), process_text_line(), vm_change_password(), and vm_forwardoptions().
00908 { 00909 struct ast_variable *cur, *prev=NULL, *newer=NULL; 00910 00911 for (cur = category->root; cur; prev = cur, cur = cur->next) { 00912 if (strcasecmp(cur->name, variable) || 00913 (!ast_strlen_zero(match) && strcasecmp(cur->value, match))) 00914 continue; 00915 00916 if (!(newer = ast_variable_new(variable, value, cur->file))) 00917 return -1; 00918 00919 ast_variable_move(newer, cur); 00920 newer->object = newer->object || object; 00921 00922 /* Replace the old node in the list with the new node. */ 00923 newer->next = cur->next; 00924 if (prev) 00925 prev->next = newer; 00926 else 00927 category->root = newer; 00928 if (category->last == cur) 00929 category->last = newer; 00930 00931 ast_variable_destroy(cur); 00932 00933 return 0; 00934 } 00935 00936 /* Could not find variable to update */ 00937 return -1; 00938 }
| void ast_variables_destroy | ( | struct ast_variable * | var | ) |
Free variable list.
| var | the linked list of variables to free |
This function frees a list of variables.
Definition at line 554 of file config.c.
References ast_variable_destroy(), and ast_variable::next.
Referenced by __sip_destroy(), action_originate(), ast_category_destroy(), ast_category_empty(), ast_http_get_cookies(), ast_http_manid_from_vars(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_var_channel_types(), ast_var_channel_types_table(), ast_variables_dup(), auth_http_callback(), build_gateway(), build_peer(), build_user(), check_peer_ok(), cli_realtime_load(), conf_run(), copy_plain_file(), destroy_dahdi_pvt(), destroy_endpoint(), destroy_fast_originate_helper(), dup_vars(), find_conf_realtime(), find_realtime(), find_realtime_gw(), find_user_realtime(), free_entry(), free_outgoing(), free_user(), function_realtime_read(), function_realtime_readdestroy(), generic_http_callback(), get_insecure_variable_from_sipregs(), handle_uri(), http_post_callback(), httpd_helper_thread(), httpstatus_callback(), ldap_loadentry(), leave_queue(), load_realtime_queue(), local_ast_moh_start(), manager_sipnotify(), mkintf(), parkandannounce_exec(), process_dahdi(), pvt_destructor(), queue_function_queuewaitingcount(), realtime_alias(), realtime_canmatch(), realtime_common(), realtime_exec(), realtime_exists(), realtime_handler(), realtime_ldap_base_ap(), realtime_ldap_result_to_vars(), realtime_matchmore(), realtime_odbc(), realtime_peer(), realtime_peer_by_addr(), realtime_peer_by_name(), realtime_peer_get_sippeer_helper(), realtime_user(), realtimefield_read(), rt_extend_conf(), sip_destroy_peer(), socket_process(), table_configs_free(), and user_destructor().
00555 { 00556 struct ast_variable *vn; 00557 00558 while (v) { 00559 vn = v; 00560 v = v->next; 00561 ast_variable_destroy(vn); 00562 } 00563 }
| struct ast_variable* ast_variables_dup | ( | struct ast_variable * | var | ) | [read] |
Duplicate variable list.
| var | the linked list of variables to clone |
Definition at line 532 of file config.c.
References ast_variable_new(), ast_variables_destroy(), ast_variable::file, ast_variable::name, ast_variable::next, and ast_variable::value.
Referenced by get_insecure_variable_from_sippeers(), and get_insecure_variable_from_sipregs().
00533 { 00534 struct ast_variable *cloned; 00535 struct ast_variable *tmp; 00536 00537 if (!(cloned = ast_variable_new(var->name, var->value, var->file))) { 00538 return NULL; 00539 } 00540 00541 tmp = cloned; 00542 00543 while ((var = var->next)) { 00544 if (!(tmp->next = ast_variable_new(var->name, var->value, var->file))) { 00545 ast_variables_destroy(cloned); 00546 return NULL; 00547 } 00548 tmp = tmp->next; 00549 } 00550 00551 return cloned; 00552 }
| int config_text_file_save | ( | const char * | filename, | |
| const struct ast_config * | cfg, | |||
| const char * | generator | |||
| ) |
Definition at line 1827 of file config.c.
References ast_config_text_file_save().
01828 { 01829 return ast_config_text_file_save(configfile, cfg, generator); 01830 }
| int read_config_maps | ( | void | ) |
Exposed re-initialization method for core process.
This method is intended for use only with the core re-initialization and is not designed to be called from any user applications.
Definition at line 2137 of file config.c.
References append_mapping(), ast_config_destroy(), ast_config_internal_load(), ast_config_new(), ast_copy_string(), ast_log(), ast_variable_browse(), clear_config_maps(), config, CONFIG_FLAG_NOREALTIME, CONFIG_STATUS_FILEINVALID, LOG_ERROR, LOG_WARNING, ast_config::max_include_level, ast_variable::name, ast_variable::next, table, and ast_variable::value.
Referenced by main().
02138 { 02139 struct ast_config *config, *configtmp; 02140 struct ast_variable *v; 02141 char *driver, *table, *database, *textpri, *stringp, *tmp; 02142 struct ast_flags flags = { CONFIG_FLAG_NOREALTIME }; 02143 int pri; 02144 02145 clear_config_maps(); 02146 02147 configtmp = ast_config_new(); 02148 if (!configtmp) { 02149 ast_log(LOG_ERROR, "Unable to allocate memory for new config\n"); 02150 return -1; 02151 } 02152 configtmp->max_include_level = 1; 02153 config = ast_config_internal_load(extconfig_conf, configtmp, flags, "", "extconfig"); 02154 if (config == CONFIG_STATUS_FILEINVALID) { 02155 return -1; 02156 } else if (!config) { 02157 ast_config_destroy(configtmp); 02158 return 0; 02159 } 02160 02161 for (v = ast_variable_browse(config, "settings"); v; v = v->next) { 02162 char buf[512]; 02163 ast_copy_string(buf, v->value, sizeof(buf)); 02164 stringp = buf; 02165 driver = strsep(&stringp, ","); 02166 02167 if ((tmp = strchr(stringp, '\"'))) 02168 stringp = tmp; 02169 02170 /* check if the database text starts with a double quote */ 02171 if (*stringp == '"') { 02172 stringp++; 02173 database = strsep(&stringp, "\""); 02174 strsep(&stringp, ","); 02175 } else { 02176 /* apparently this text has no quotes */ 02177 database = strsep(&stringp, ","); 02178 } 02179 02180 table = strsep(&stringp, ","); 02181 textpri = strsep(&stringp, ","); 02182 if (!textpri || !(pri = atoi(textpri))) { 02183 pri = 1; 02184 } 02185 02186 if (!strcmp(v->name, extconfig_conf)) { 02187 ast_log(LOG_WARNING, "Cannot bind '%s'!\n", extconfig_conf); 02188 continue; 02189 } 02190 02191 if (!strcmp(v->name, "asterisk.conf")) { 02192 ast_log(LOG_WARNING, "Cannot bind 'asterisk.conf'!\n"); 02193 continue; 02194 } 02195 02196 if (!strcmp(v->name, "logger.conf")) { 02197 ast_log(LOG_WARNING, "Cannot bind 'logger.conf'!\n"); 02198 continue; 02199 } 02200 02201 if (!driver || !database) 02202 continue; 02203 if (!strcasecmp(v->name, "sipfriends")) { 02204 ast_log(LOG_WARNING, "The 'sipfriends' table is obsolete, update your config to use sippeers instead.\n"); 02205 append_mapping("sippeers", driver, database, table ? table : "sipfriends", pri); 02206 } else if (!strcasecmp(v->name, "iaxfriends")) { 02207 ast_log(LOG_WARNING, "The 'iaxfriends' table is obsolete, update your config to use iaxusers and iaxpeers, though they can point to the same table.\n"); 02208 append_mapping("iaxusers", driver, database, table ? table : "iaxfriends", pri); 02209 append_mapping("iaxpeers", driver, database, table ? table : "iaxfriends", pri); 02210 } else 02211 append_mapping(v->name, driver, database, table, pri); 02212 } 02213 02214 ast_config_destroy(config); 02215 return 0; 02216 }
| int register_config_cli | ( | void | ) |
Exposed initialization method for core process.
This method is intended for use only with the core initialization and is not designed to be called from any user applications.
Definition at line 2989 of file config.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_register_atexit(), and config_shutdown().
Referenced by main().
02990 { 02991 ast_cli_register_multiple(cli_config, ARRAY_LEN(cli_config)); 02992 ast_register_atexit(config_shutdown); 02993 return 0; 02994 }
1.6.1