#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) |
| 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. | |
| char * | ast_realtime_decode_chunk (char *chunk) |
| Remove standard encoding from realtime values, which ensures that a semicolon embedded within a single value is not treated upon retrieval as multiple values. | |
| 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_rq_is_int (require_type type) |
| Check if require type is an integer type. | |
| 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. | |
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). |
| 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_format_config(), load_module(), load_moh_classes(), load_odbc_config(), load_pktccops_config(), load_rpt_vars(), make_email_file(), node_lookup(), 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(), rpt_master(), set_config(), setup_dahdi_int(), sla_load_config(), smdi_load(), store_config(), 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(), advanced_options(), 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_devstate_map(), initialize_cc_max_requests(), jingle_load_config(), load_config(), load_config_meetme(), load_format_config(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_rpt_vars(), misdn_cfg_init(), node_lookup(), odbc_load_module(), osp_load(), parse_config(), pbx_load_config(), play_message(), private_enum_init(), read_agent_config(), read_config_maps(), realtime_directory(), reload(), reload_config(), reload_followme(), reload_module(), reload_queue_rules(), reload_queues(), rpt_master(), rtp_reload(), run_startup_commands(), set_config(), setup_dahdi_int(), sla_load_config(), smdi_load(), store_config(), tds_load_module(), vm_change_password(), and vm_forwardoptions().
| #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_format_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 | ) |
Value:
do { \ const char *__var = __in_var; \ const char *__val = __in_val;
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)) |
| #define CV_UINT | ( | __x, | |||
| __dst | ) | CV_F(__x, (__dst) = strtoul(__val, NULL, 0) ) |
| 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 679 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(), append_row_to_cfg(), 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(), static_realtime_cb(), and write_password_to_file().
00680 { 00681 if (config->last) 00682 config->last->next = category; 00683 else 00684 config->root = category; 00685 category->include_level = config->include_level; 00686 config->last = category; 00687 config->current = category; 00688 }
| 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. |
| a | category on success | |
| NULL | on failure/no-more-categories |
Definition at line 766 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(), 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_format_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(), register_realtime_peers_with_callbackextens(), reload(), reload_config(), reload_followme(), reload_queue_rules(), reload_queues(), rpt_master(), search_directory(), search_directory_sub(), set_config(), set_member_penalty(), setup_dahdi_int(), show_users_realtime(), sla_load_config(), update_realtime_members(), and vm_change_password().
00767 { 00768 struct ast_category *cat; 00769 00770 if (!prev) { 00771 /* First time browse. */ 00772 cat = config->root; 00773 } else if (config->last_browse && (config->last_browse->name == prev)) { 00774 /* Simple last browse found. */ 00775 cat = config->last_browse->next; 00776 } else { 00777 /* 00778 * Config changed since last browse. 00779 * 00780 * First try cheap last browse search. (Rebrowsing a different 00781 * previous category?) 00782 */ 00783 for (cat = config->root; cat; cat = cat->next) { 00784 if (cat->name == prev) { 00785 /* Found it. */ 00786 cat = cat->next; 00787 break; 00788 } 00789 } 00790 if (!cat) { 00791 /* 00792 * Have to do it the hard way. (Last category was deleted and 00793 * re-added?) 00794 */ 00795 for (cat = config->root; cat; cat = cat->next) { 00796 if (!strcasecmp(cat->name, prev)) { 00797 /* Found it. */ 00798 cat = cat->next; 00799 break; 00800 } 00801 } 00802 } 00803 } 00804 00805 if (cat) 00806 cat = next_available_category(cat); 00807 00808 config->last_browse = cat; 00809 return (cat) ? cat->name : NULL; 00810 }
| int ast_category_delete | ( | struct ast_config * | cfg, | |
| const char * | category | |||
| ) |
Definition at line 932 of file config.c.
References ast_category_destroy(), ast_config::last, ast_category::next, and ast_config::root.
Referenced by handle_updates().
00933 { 00934 struct ast_category *prev=NULL, *cat; 00935 00936 cat = cfg->root; 00937 while (cat) { 00938 if (cat->name == category) { 00939 if (prev) { 00940 prev->next = cat->next; 00941 if (cat == cfg->last) 00942 cfg->last = prev; 00943 } else { 00944 cfg->root = cat->next; 00945 if (cat == cfg->last) 00946 cfg->last = NULL; 00947 } 00948 ast_category_destroy(cat); 00949 return 0; 00950 } 00951 prev = cat; 00952 cat = cat->next; 00953 } 00954 00955 prev = NULL; 00956 cat = cfg->root; 00957 while (cat) { 00958 if (!strcasecmp(cat->name, category)) { 00959 if (prev) { 00960 prev->next = cat->next; 00961 if (cat == cfg->last) 00962 cfg->last = prev; 00963 } else { 00964 cfg->root = cat->next; 00965 if (cat == cfg->last) 00966 cfg->last = NULL; 00967 } 00968 ast_category_destroy(cat); 00969 return 0; 00970 } 00971 prev = cat; 00972 cat = cat->next; 00973 } 00974 return -1; 00975 }
| void ast_category_destroy | ( | struct ast_category * | cat | ) |
Definition at line 718 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 static_realtime_cb().
00719 { 00720 ast_variables_destroy(cat->root); 00721 cat->root = NULL; 00722 cat->last = NULL; 00723 ast_comment_destroy(&cat->precomments); 00724 ast_comment_destroy(&cat->sameline); 00725 ast_comment_destroy(&cat->trailing); 00726 ast_destroy_template_list(cat); 00727 ast_free(cat->file); 00728 ast_free(cat); 00729 }
| struct ast_variable* ast_category_detach_variables | ( | struct ast_category * | cat | ) | [read] |
Definition at line 812 of file config.c.
References ast_category::last, and ast_category::root.
Referenced by realtime_switch_common().
00813 { 00814 struct ast_variable *v; 00815 00816 v = cat->root; 00817 cat->root = NULL; 00818 cat->last = NULL; 00819 00820 return v; 00821 }
| 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 977 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().
00978 { 00979 struct ast_category *cat; 00980 00981 for (cat = cfg->root; cat; cat = cat->next) { 00982 if (!strcasecmp(cat->name, category)) 00983 continue; 00984 ast_variables_destroy(cat->root); 00985 cat->root = NULL; 00986 cat->last = NULL; 00987 return 0; 00988 } 00989 00990 return -1; 00991 }
| 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 |
Definition at line 674 of file config.c.
References ast_category_get().
00675 { 00676 return !!ast_category_get(config, category_name); 00677 }
| 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 752 of file config.c.
References ast_category::root.
Referenced by process_text_line().
00753 { 00754 return (cat) ? cat->root : NULL; 00755 }
| 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 |
| pointer | to category if found | |
| NULL | if not. |
Definition at line 669 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().
00670 { 00671 return category_get(config, category_name, 0); 00672 }
| 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 |
Definition at line 690 of file config.c.
References ast_category::name, ast_category::next, and ast_config::root.
Referenced by handle_updates().
00691 { 00692 struct ast_category *cur_category; 00693 00694 if (!cat || !match) 00695 return; 00696 if (!strcasecmp(config->root->name, match)) { 00697 cat->next = config->root; 00698 config->root = cat; 00699 return; 00700 } 00701 for (cur_category = config->root; cur_category; cur_category = cur_category->next) { 00702 if (!strcasecmp(cur_category->next->name, match)) { 00703 cat->next = cur_category->next; 00704 cur_category->next = cat; 00705 break; 00706 } 00707 } 00708 }
| struct ast_category* ast_category_new | ( | const char * | name, | |
| const char * | in_file, | |||
| int | lineno | |||
| ) | [read] |
Create a category structure.
Definition at line 633 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(), append_row_to_cfg(), 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(), static_realtime_cb(), and write_password_to_file().
00634 { 00635 struct ast_category *category; 00636 00637 category = ast_calloc(1, sizeof(*category)); 00638 if (!category) { 00639 return NULL; 00640 } 00641 category->file = ast_strdup(in_file); 00642 if (!category->file) { 00643 ast_category_destroy(category); 00644 return NULL; 00645 } 00646 ast_copy_string(category->name, name, sizeof(category->name)); 00647 category->lineno = lineno; /* if you don't know the lineno, set it to 999999 or something real big */ 00648 return category; 00649 }
| void ast_category_rename | ( | struct ast_category * | cat, | |
| const char * | name | |||
| ) |
Definition at line 823 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().
00824 { 00825 ast_copy_string(cat->name, name, sizeof(cat->name)); 00826 }
| 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 757 of file config.c.
References ast_category_get(), and ast_category::root.
Referenced by get_insecure_variable_from_config(), get_insecure_variable_from_sipregs(), and register_realtime_peers_with_callbackextens().
00758 { 00759 struct ast_category *category = ast_category_get(config, cat); 00760 00761 if (category) 00762 return category->root; 00763 return NULL; 00764 }
| 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 2401 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(), register_realtime_peers_with_callbackextens(), rename_file(), set_member_penalty(), sip_poke_noanswer(), sip_show_settings(), and vm_delete().
02402 { 02403 struct ast_config_engine *eng; 02404 if (!ast_realtime_enabled()) { 02405 return 0; /* There are no engines at all so fail early */ 02406 } 02407 02408 eng = find_engine(family, 1, NULL, 0, NULL, 0); 02409 if (eng) 02410 return 1; 02411 return 0; 02412 }
| void ast_config_destroy | ( | struct ast_config * | config | ) |
Destroys a config.
| config | pointer to config data structure |
Definition at line 993 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_load_queue_rt_friendly(), find_realtime(), get_insecure_variable_from_sippeers(), get_insecure_variable_from_sipregs(), handle_cli_dialplan_save(), iax_provision_reload(), init_logger_chain(), initialize_cc_devstate_map(), initialize_cc_max_requests(), load_config(), load_config_meetme(), load_format_config(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_pktccops_config(), load_rpt_vars(), make_email_file(), misdn_cfg_init(), node_lookup(), 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(), realtime_directory(), realtime_multi_handler(), realtime_multi_pgsql(), realtime_sqlite3_multi(), realtime_switch_common(), register_realtime_peers_with_callbackextens(), reload(), reload_config(), reload_followme(), reload_module(), reload_queue_rules(), reload_queues(), rpt_master(), rtp_reload(), run_startup_commands(), set_config(), setup_dahdi_int(), show_users_realtime(), sla_load_config(), smdi_load(), store_config(), tds_load_module(), unload_module(), update_realtime_members(), and vm_forwardoptions().
00994 { 00995 struct ast_category *cat, *catn; 00996 00997 if (!cfg) 00998 return; 00999 01000 ast_includes_destroy(cfg->includes); 01001 01002 cat = cfg->root; 01003 while (cat) { 01004 catn = cat; 01005 cat = cat->next; 01006 ast_category_destroy(catn); 01007 } 01008 ast_free(cfg); 01009 }
| int ast_config_engine_deregister | ( | struct ast_config_engine * | del | ) |
Deregister config engine.
| 0 | Always |
Definition at line 2211 of file config.c.
References ast_mutex_lock, ast_mutex_unlock, config_lock, last, and ast_config_engine::next.
Referenced by unload_module().
02212 { 02213 struct ast_config_engine *ptr, *last=NULL; 02214 02215 ast_mutex_lock(&config_lock); 02216 02217 for (ptr = config_engine_list; ptr; ptr=ptr->next) { 02218 if (ptr == del) { 02219 if (last) 02220 last->next = ptr->next; 02221 else 02222 config_engine_list = ptr->next; 02223 break; 02224 } 02225 last = ptr; 02226 } 02227 02228 ast_mutex_unlock(&config_lock); 02229 02230 return 0; 02231 }
| int ast_config_engine_register | ( | struct ast_config_engine * | newconfig | ) |
Register config engine.
| 1 | Always |
Definition at line 2192 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().
02193 { 02194 struct ast_config_engine *ptr; 02195 02196 ast_mutex_lock(&config_lock); 02197 02198 if (!config_engine_list) { 02199 config_engine_list = new; 02200 } else { 02201 for (ptr = config_engine_list; ptr->next; ptr=ptr->next); 02202 ptr->next = new; 02203 } 02204 02205 ast_mutex_unlock(&config_lock); 02206 ast_log(LOG_NOTICE,"Registered Config Engine %s\n", new->name); 02207 02208 return 1; 02209 }
| 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 1011 of file config.c.
References ast_config::current.
Referenced by config_curl(), config_odbc(), and config_text_file_load().
01012 { 01013 return cfg->current; 01014 }
| 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 2273 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(), read_config_maps(), and static_realtime_cb().
02274 { 02275 char db[256]; 02276 char table[256]; 02277 struct ast_config_engine *loader = &text_file_engine; 02278 struct ast_config *result; 02279 02280 /* The config file itself bumps include_level by 1 */ 02281 if (cfg->max_include_level > 0 && cfg->include_level == cfg->max_include_level + 1) { 02282 ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level); 02283 return NULL; 02284 } 02285 02286 cfg->include_level++; 02287 02288 if (!ast_test_flag(&flags, CONFIG_FLAG_NOREALTIME) && config_engine_list) { 02289 struct ast_config_engine *eng; 02290 02291 eng = find_engine(filename, 1, db, sizeof(db), table, sizeof(table)); 02292 02293 02294 if (eng && eng->load_func) { 02295 loader = eng; 02296 } else { 02297 eng = find_engine("global", 1, db, sizeof(db), table, sizeof(table)); 02298 if (eng && eng->load_func) 02299 loader = eng; 02300 } 02301 } 02302 02303 result = loader->load_func(db, table, filename, cfg, flags, suggested_include_file, who_asked); 02304 02305 if (result && result != CONFIG_STATUS_FILEINVALID && result != CONFIG_STATUS_FILEUNCHANGED) 02306 result->include_level--; 02307 else if (result != CONFIG_STATUS_FILEINVALID) 02308 cfg->include_level--; 02309 02310 return result; 02311 }
| 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). |
| NULL | on error |
Definition at line 2313 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_devstate_map(), initialize_cc_max_requests(), load_config(), load_indications(), load_modules(), misdn_cfg_init(), private_enum_init(), rtp_reload(), run_startup_commands(), and set_config().
02314 { 02315 struct ast_config *cfg; 02316 struct ast_config *result; 02317 02318 cfg = ast_config_new(); 02319 if (!cfg) 02320 return NULL; 02321 02322 result = ast_config_internal_load(filename, cfg, flags, "", who_asked); 02323 if (!result || result == CONFIG_STATUS_FILEUNCHANGED || result == CONFIG_STATUS_FILEINVALID) 02324 ast_config_destroy(cfg); 02325 02326 return result; 02327 }
| struct ast_config* ast_config_new | ( | void | ) | [read] |
Create a new base configuration structure.
Definition at line 844 of file config.c.
References ast_calloc, config, MAX_INCLUDE_LEVEL, and ast_config::max_include_level.
Referenced by ast_config_load2(), find_load_queue_rt_friendly(), read_config_maps(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_sqlite3_multi(), setup_dahdi_int(), and write_password_to_file().
00845 { 00846 struct ast_config *config; 00847 00848 if ((config = ast_calloc(1, sizeof(*config)))) 00849 config->max_include_level = MAX_INCLUDE_LEVEL; 00850 return config; 00851 }
| 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 574 of file config.c.
References ast_variable_retrieve().
Referenced by actual_load_config(), pbx_load_users(), and search_directory_sub().
00575 { 00576 const char *tmp; 00577 tmp = ast_variable_retrieve(cfg, cat, var); 00578 if (!tmp) { 00579 tmp = ast_variable_retrieve(cfg, "general", var); 00580 } 00581 return tmp; 00582 }
| 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 1016 of file config.c.
References ast_config::current.
01017 { 01018 /* cast below is just to silence compiler warning about dropping "const" */ 01019 cfg->current = (struct ast_category *) cat; 01020 }
| int ast_config_text_file_save | ( | const char * | filename, | |
| const struct ast_config * | cfg, | |||
| const char * | generator | |||
| ) |
Definition at line 1809 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().
01810 { 01811 FILE *f; 01812 char fn[PATH_MAX]; 01813 struct ast_variable *var; 01814 struct ast_category *cat; 01815 struct ast_comment *cmt; 01816 struct ast_config_include *incl; 01817 int blanklines = 0; 01818 struct ao2_container *fileset; 01819 struct inclfile *fi; 01820 01821 fileset = ao2_container_alloc(1023, hash_string, hashtab_compare_strings); 01822 if (!fileset) { 01823 /* Container creation failed. */ 01824 return -1; 01825 } 01826 01827 /* reset all the output flags, in case this isn't our first time saving this data */ 01828 for (incl = cfg->includes; incl; incl = incl->next) { 01829 incl->output = 0; 01830 } 01831 01832 /* go thru all the inclusions and make sure all the files involved (configfile plus all its inclusions) 01833 are all truncated to zero bytes and have that nice header*/ 01834 for (incl = cfg->includes; incl; incl = incl->next) { 01835 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*/ 01836 /* normally, fn is just set to incl->included_file, prepended with config dir if relative */ 01837 fi = set_fn(fn, sizeof(fn), incl->included_file, configfile, fileset); 01838 f = fopen(fn, "w"); 01839 if (f) { 01840 gen_header(f, configfile, fn, generator); 01841 fclose(f); /* this should zero out the file */ 01842 } else { 01843 ast_debug(1, "Unable to open for writing: %s\n", fn); 01844 ast_verb(2, "Unable to write %s (%s)\n", fn, strerror(errno)); 01845 } 01846 if (fi) { 01847 ao2_ref(fi, -1); 01848 } 01849 } 01850 } 01851 01852 /* just set fn to absolute ver of configfile */ 01853 fi = set_fn(fn, sizeof(fn), 0, configfile, fileset); 01854 if ( 01855 #ifdef __CYGWIN__ 01856 (f = fopen(fn, "w+")) 01857 #else 01858 (f = fopen(fn, "w")) 01859 #endif 01860 ) { 01861 ast_verb(2, "Saving '%s'\n", fn); 01862 gen_header(f, configfile, fn, generator); 01863 cat = cfg->root; 01864 fclose(f); 01865 if (fi) { 01866 ao2_ref(fi, -1); 01867 } 01868 01869 /* from here out, we open each involved file and concat the stuff we need to add to the end and immediately close... */ 01870 /* since each var, cat, and associated comments can come from any file, we have to be 01871 mobile, and open each file, print, and close it on an entry-by-entry basis */ 01872 01873 while (cat) { 01874 fi = set_fn(fn, sizeof(fn), cat->file, configfile, fileset); 01875 f = fopen(fn, "a"); 01876 if (!f) { 01877 ast_debug(1, "Unable to open for writing: %s\n", fn); 01878 ast_verb(2, "Unable to write %s (%s)\n", fn, strerror(errno)); 01879 if (fi) { 01880 ao2_ref(fi, -1); 01881 } 01882 ao2_ref(fileset, -1); 01883 return -1; 01884 } 01885 01886 /* dump any includes that happen before this category header */ 01887 for (incl=cfg->includes; incl; incl = incl->next) { 01888 if (strcmp(incl->include_location_file, cat->file) == 0){ 01889 if (cat->lineno > incl->include_location_lineno && !incl->output) { 01890 if (incl->exec) 01891 fprintf(f,"#exec \"%s\"\n", incl->exec_file); 01892 else 01893 fprintf(f,"#include \"%s\"\n", incl->included_file); 01894 incl->output = 1; 01895 } 01896 } 01897 } 01898 01899 insert_leading_blank_lines(f, fi, cat->precomments, cat->lineno); 01900 /* Dump section with any appropriate comment */ 01901 for (cmt = cat->precomments; cmt; cmt=cmt->next) { 01902 char *cmtp = cmt->cmt; 01903 while (*cmtp == ';' && *(cmtp+1) == '!') { 01904 char *cmtp2 = strchr(cmtp+1, '\n'); 01905 if (cmtp2) 01906 cmtp = cmtp2+1; 01907 else cmtp = 0; 01908 } 01909 if (cmtp) 01910 fprintf(f,"%s", cmtp); 01911 } 01912 fprintf(f, "[%s]", cat->name); 01913 if (cat->ignored || !AST_LIST_EMPTY(&cat->template_instances)) { 01914 fprintf(f, "("); 01915 if (cat->ignored) { 01916 fprintf(f, "!"); 01917 } 01918 if (cat->ignored && !AST_LIST_EMPTY(&cat->template_instances)) { 01919 fprintf(f, ","); 01920 } 01921 if (!AST_LIST_EMPTY(&cat->template_instances)) { 01922 struct ast_category_template_instance *x; 01923 AST_LIST_TRAVERSE(&cat->template_instances, x, next) { 01924 fprintf(f,"%s",x->name); 01925 if (x != AST_LIST_LAST(&cat->template_instances)) 01926 fprintf(f,","); 01927 } 01928 } 01929 fprintf(f, ")"); 01930 } 01931 for(cmt = cat->sameline; cmt; cmt=cmt->next) 01932 { 01933 fprintf(f,"%s", cmt->cmt); 01934 } 01935 if (!cat->sameline) 01936 fprintf(f,"\n"); 01937 for (cmt = cat->trailing; cmt; cmt=cmt->next) { 01938 if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') 01939 fprintf(f,"%s", cmt->cmt); 01940 } 01941 fclose(f); 01942 if (fi) { 01943 ao2_ref(fi, -1); 01944 } 01945 01946 var = cat->root; 01947 while (var) { 01948 struct ast_category_template_instance *x; 01949 int found = 0; 01950 AST_LIST_TRAVERSE(&cat->template_instances, x, next) { 01951 struct ast_variable *v; 01952 for (v = x->inst->root; v; v = v->next) { 01953 if (!strcasecmp(var->name, v->name) && !strcmp(var->value, v->value)) { 01954 found = 1; 01955 break; 01956 } 01957 } 01958 if (found) 01959 break; 01960 } 01961 if (found) { 01962 var = var->next; 01963 continue; 01964 } 01965 fi = set_fn(fn, sizeof(fn), var->file, configfile, fileset); 01966 f = fopen(fn, "a"); 01967 if (!f) { 01968 ast_debug(1, "Unable to open for writing: %s\n", fn); 01969 ast_verb(2, "Unable to write %s (%s)\n", fn, strerror(errno)); 01970 if (fi) { 01971 ao2_ref(fi, -1); 01972 } 01973 ao2_ref(fileset, -1); 01974 return -1; 01975 } 01976 01977 /* dump any includes that happen before this category header */ 01978 for (incl=cfg->includes; incl; incl = incl->next) { 01979 if (strcmp(incl->include_location_file, var->file) == 0){ 01980 if (var->lineno > incl->include_location_lineno && !incl->output) { 01981 if (incl->exec) 01982 fprintf(f,"#exec \"%s\"\n", incl->exec_file); 01983 else 01984 fprintf(f,"#include \"%s\"\n", incl->included_file); 01985 incl->output = 1; 01986 } 01987 } 01988 } 01989 01990 insert_leading_blank_lines(f, fi, var->precomments, var->lineno); 01991 for (cmt = var->precomments; cmt; cmt=cmt->next) { 01992 if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') 01993 fprintf(f,"%s", cmt->cmt); 01994 } 01995 if (var->sameline) 01996 fprintf(f, "%s %s %s %s", var->name, (var->object ? "=>" : "="), var->value, var->sameline->cmt); 01997 else 01998 fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="), var->value); 01999 for (cmt = var->trailing; cmt; cmt=cmt->next) { 02000 if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!') 02001 fprintf(f,"%s", cmt->cmt); 02002 } 02003 if (var->blanklines) { 02004 blanklines = var->blanklines; 02005 while (blanklines--) 02006 fprintf(f, "\n"); 02007 } 02008 02009 fclose(f); 02010 if (fi) { 02011 ao2_ref(fi, -1); 02012 } 02013 02014 var = var->next; 02015 } 02016 cat = cat->next; 02017 } 02018 if (!option_debug) { 02019 ast_verb(2, "Saving '%s': saved\n", fn); 02020 } 02021 } else { 02022 ast_debug(1, "Unable to open for writing: %s\n", fn); 02023 ast_verb(2, "Unable to write '%s' (%s)\n", fn, strerror(errno)); 02024 if (fi) { 02025 ao2_ref(fi, -1); 02026 } 02027 ao2_ref(fileset, -1); 02028 return -1; 02029 } 02030 02031 /* Now, for files with trailing #include/#exec statements, 02032 we have to make sure every entry is output */ 02033 for (incl=cfg->includes; incl; incl = incl->next) { 02034 if (!incl->output) { 02035 /* open the respective file */ 02036 fi = set_fn(fn, sizeof(fn), incl->include_location_file, configfile, fileset); 02037 f = fopen(fn, "a"); 02038 if (!f) { 02039 ast_debug(1, "Unable to open for writing: %s\n", fn); 02040 ast_verb(2, "Unable to write %s (%s)\n", fn, strerror(errno)); 02041 if (fi) { 02042 ao2_ref(fi, -1); 02043 } 02044 ao2_ref(fileset, -1); 02045 return -1; 02046 } 02047 02048 /* output the respective include */ 02049 if (incl->exec) 02050 fprintf(f,"#exec \"%s\"\n", incl->exec_file); 02051 else 02052 fprintf(f,"#include \"%s\"\n", incl->included_file); 02053 fclose(f); 02054 incl->output = 1; 02055 if (fi) { 02056 ao2_ref(fi, -1); 02057 } 02058 } 02059 } 02060 ao2_ref(fileset, -1); /* this should destroy the hash container */ 02061 02062 return 0; 02063 }
| 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. |
Definition at line 2564 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().
02565 { 02566 struct ast_config_engine *eng; 02567 int res = -1, i; 02568 char db[256]; 02569 char table[256]; 02570 va_list ap; 02571 02572 va_start(ap, lookup); 02573 for (i = 1; ; i++) { 02574 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02575 if (eng->destroy_func && !(res = eng->destroy_func(db, table, keyfield, lookup, ap))) { 02576 break; 02577 } 02578 } else { 02579 break; 02580 } 02581 } 02582 va_end(ap); 02583 02584 return res; 02585 }
| struct ast_config_include* ast_include_find | ( | struct ast_config * | conf, | |
| const char * | included_file | |||
| ) | [read] |
Definition at line 460 of file config.c.
References ast_config_include::included_file, ast_config::includes, and ast_config_include::next.
Referenced by ast_include_new().
00461 { 00462 struct ast_config_include *x; 00463 for (x=conf->includes;x;x=x->next) { 00464 if (strcmp(x->included_file,included_file) == 0) 00465 return x; 00466 } 00467 return 0; 00468 }
| 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 320 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().
00321 { 00322 /* a file should be included ONCE. Otherwise, if one of the instances is changed, 00323 * then all be changed. -- how do we know to include it? -- Handling modified 00324 * instances is possible, I'd have 00325 * to create a new master for each instance. */ 00326 struct ast_config_include *inc; 00327 struct stat statbuf; 00328 00329 inc = ast_include_find(conf, included_file); 00330 if (inc) { 00331 do { 00332 inc->inclusion_count++; 00333 snprintf(real_included_file_name, real_included_file_name_size, "%s~~%d", included_file, inc->inclusion_count); 00334 } while (stat(real_included_file_name, &statbuf) == 0); 00335 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); 00336 } else 00337 *real_included_file_name = 0; 00338 00339 inc = ast_calloc(1,sizeof(struct ast_config_include)); 00340 if (!inc) { 00341 return NULL; 00342 } 00343 inc->include_location_file = ast_strdup(from_file); 00344 inc->include_location_lineno = from_lineno; 00345 if (!ast_strlen_zero(real_included_file_name)) 00346 inc->included_file = ast_strdup(real_included_file_name); 00347 else 00348 inc->included_file = ast_strdup(included_file); 00349 00350 inc->exec = is_exec; 00351 if (is_exec) 00352 inc->exec_file = ast_strdup(exec_file); 00353 00354 if (!inc->include_location_file 00355 || !inc->included_file 00356 || (is_exec && !inc->exec_file)) { 00357 ast_includes_destroy(inc); 00358 return NULL; 00359 } 00360 00361 /* attach this new struct to the conf struct */ 00362 inc->next = conf->includes; 00363 conf->includes = inc; 00364 00365 return inc; 00366 }
| void ast_include_rename | ( | struct ast_config * | conf, | |
| const char * | from_file, | |||
| const char * | to_file | |||
| ) |
Definition at line 368 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().
00369 { 00370 struct ast_config_include *incl; 00371 struct ast_category *cat; 00372 char *str; 00373 00374 int from_len = strlen(from_file); 00375 int to_len = strlen(to_file); 00376 00377 if (strcmp(from_file, to_file) == 0) /* no use wasting time if the name is the same */ 00378 return; 00379 00380 /* the manager code allows you to read in one config file, then 00381 * write it back out under a different name. But, the new arrangement 00382 * ties output lines to the file name. So, before you try to write 00383 * the config file to disk, better riffle thru the data and make sure 00384 * the file names are changed. 00385 */ 00386 /* file names are on categories, includes (of course), and on variables. So, 00387 * traverse all this and swap names */ 00388 00389 for (incl = conf->includes; incl; incl=incl->next) { 00390 if (strcmp(incl->include_location_file,from_file) == 0) { 00391 if (from_len >= to_len) 00392 strcpy(incl->include_location_file, to_file); 00393 else { 00394 /* Keep the old filename if the allocation fails. */ 00395 str = ast_strdup(to_file); 00396 if (str) { 00397 ast_free(incl->include_location_file); 00398 incl->include_location_file = str; 00399 } 00400 } 00401 } 00402 } 00403 for (cat = conf->root; cat; cat = cat->next) { 00404 struct ast_variable **prev; 00405 struct ast_variable *v; 00406 struct ast_variable *new_var; 00407 00408 if (strcmp(cat->file,from_file) == 0) { 00409 if (from_len >= to_len) 00410 strcpy(cat->file, to_file); 00411 else { 00412 /* Keep the old filename if the allocation fails. */ 00413 str = ast_strdup(to_file); 00414 if (str) { 00415 ast_free(cat->file); 00416 cat->file = str; 00417 } 00418 } 00419 } 00420 for (prev = &cat->root, v = cat->root; v; prev = &v->next, v = v->next) { 00421 if (strcmp(v->file, from_file)) { 00422 continue; 00423 } 00424 00425 /* 00426 * Calculate actual space available. The file string is 00427 * intentionally stuffed before the name string just so we can 00428 * do this. 00429 */ 00430 if (to_len < v->name - v->file) { 00431 /* The new name will fit in the available space. */ 00432 str = (char *) v->file;/* Stupid compiler complains about discarding qualifiers even though I used a cast. */ 00433 strcpy(str, to_file);/* SAFE */ 00434 continue; 00435 } 00436 00437 /* Keep the old filename if the allocation fails. */ 00438 new_var = ast_variable_new(v->name, v->value, to_file); 00439 if (!new_var) { 00440 continue; 00441 } 00442 00443 /* Move items from the old list node to the replacement node. */ 00444 ast_variable_move(new_var, v); 00445 00446 /* Replace the old node in the list with the new node. */ 00447 new_var->next = v->next; 00448 if (cat->last == v) { 00449 cat->last = new_var; 00450 } 00451 *prev = new_var; 00452 00453 ast_variable_destroy(v); 00454 00455 v = new_var; 00456 } 00457 } 00458 }
| struct ast_variable* ast_load_realtime | ( | const char * | family, | |
| ... | ||||
| ) | [read] |
Retrieve realtime configuration.
| family | which family/config to lookup |
The difference between these two calls is that ast_load_realtime excludes fields whose values are NULL, while ast_load_realtime_all loads all columns.
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.
Definition at line 2362 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_load_queue_rt_friendly(), find_realtime(), find_realtime_gw(), find_user_realtime(), leave_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().
02363 { 02364 struct ast_variable *res; 02365 struct ast_variable *cur; 02366 struct ast_variable **prev; 02367 va_list ap; 02368 02369 va_start(ap, family); 02370 res = ast_load_realtime_helper(family, ap); 02371 va_end(ap); 02372 02373 /* Filter the list. */ 02374 prev = &res; 02375 cur = res; 02376 while (cur) { 02377 if (ast_strlen_zero(cur->value)) { 02378 /* Eliminate empty entries */ 02379 struct ast_variable *next; 02380 02381 next = cur->next; 02382 *prev = next; 02383 ast_variable_destroy(cur); 02384 cur = next; 02385 } else { 02386 /* Make blank entries empty and keep them. */ 02387 if (cur->value[0] == ' ' && cur->value[1] == '\0') { 02388 char *vptr = (char *) cur->value; 02389 02390 vptr[0] = '\0'; 02391 } 02392 02393 prev = &cur->next; 02394 cur = cur->next; 02395 } 02396 } 02397 return res; 02398 }
| struct ast_variable* ast_load_realtime_all | ( | const char * | family, | |
| ... | ||||
| ) | [read] |
Definition at line 2350 of file config.c.
References ast_load_realtime_helper().
Referenced by cli_realtime_load(), function_realtime_read(), function_realtime_readdestroy(), and realtimefield_read().
02351 { 02352 struct ast_variable *res; 02353 va_list ap; 02354 02355 va_start(ap, family); 02356 res = ast_load_realtime_helper(family, ap); 02357 va_end(ap); 02358 02359 return res; 02360 }
| struct ast_config* ast_load_realtime_multientry | ( | const char * | family, | |
| ... | ||||
| ) | [read] |
Retrieve realtime configuration.
| family | which family/config to lookup |
| NULL | Error or no results returned |
Definition at line 2464 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_load_queue_rt_friendly(), find_realtime(), get_insecure_variable_from_sippeers(), get_insecure_variable_from_sipregs(), queues_data_provider_get(), realtime_directory(), realtime_switch_common(), register_realtime_peers_with_callbackextens(), set_member_penalty(), show_users_realtime(), and update_realtime_members().
02465 { 02466 struct ast_config_engine *eng; 02467 char db[256]; 02468 char table[256]; 02469 struct ast_config *res = NULL; 02470 va_list ap; 02471 int i; 02472 02473 va_start(ap, family); 02474 for (i = 1; ; i++) { 02475 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02476 if (eng->realtime_multi_func && (res = eng->realtime_multi_func(db, table, ap))) { 02477 /* If we were returned an empty cfg, destroy it and return NULL */ 02478 if (!res->root) { 02479 ast_config_destroy(res); 02480 res = NULL; 02481 } 02482 break; 02483 } 02484 } else { 02485 break; 02486 } 02487 } 02488 va_end(ap); 02489 02490 return res; 02491 }
| 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. |
Definition at line 2619 of file config.c.
References ast_debug, ast_gethostbyname(), ast_inet_ntoa(), ast_sockaddr_parse(), ast_sockaddr_stringify(), ast_strdupa, hp, 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 strsep().
Referenced by __ast_http_load(), ast_tls_read_conf(), check_via_response(), gtalk_load_config(), and reload_config().
02621 { 02622 va_list ap; 02623 int error = 0; 02624 02625 va_start(ap, p_result); 02626 switch (flags & PARSE_TYPE) { 02627 case PARSE_INT32: 02628 { 02629 int32_t *result = p_result; 02630 int32_t x, def = result ? *result : 0, 02631 high = (int32_t)0x7fffffff, 02632 low = (int32_t)0x80000000; 02633 /* optional argument: first default value, then range */ 02634 if (flags & PARSE_DEFAULT) 02635 def = va_arg(ap, int32_t); 02636 if (flags & (PARSE_IN_RANGE|PARSE_OUT_RANGE)) { 02637 /* range requested, update bounds */ 02638 low = va_arg(ap, int32_t); 02639 high = va_arg(ap, int32_t); 02640 } 02641 x = strtol(arg, NULL, 0); 02642 error = (x < low) || (x > high); 02643 if (flags & PARSE_OUT_RANGE) 02644 error = !error; 02645 if (result) 02646 *result = error ? def : x; 02647 ast_debug(3, 02648 "extract int from [%s] in [%d, %d] gives [%d](%d)\n", 02649 arg, low, high, 02650 result ? *result : x, error); 02651 break; 02652 } 02653 02654 case PARSE_UINT32: 02655 { 02656 uint32_t *result = p_result; 02657 uint32_t x, def = result ? *result : 0, 02658 low = 0, high = (uint32_t)~0; 02659 /* optional argument: first default value, then range */ 02660 if (flags & PARSE_DEFAULT) 02661 def = va_arg(ap, uint32_t); 02662 if (flags & (PARSE_IN_RANGE|PARSE_OUT_RANGE)) { 02663 /* range requested, update bounds */ 02664 low = va_arg(ap, uint32_t); 02665 high = va_arg(ap, uint32_t); 02666 } 02667 x = strtoul(arg, NULL, 0); 02668 error = (x < low) || (x > high); 02669 if (flags & PARSE_OUT_RANGE) 02670 error = !error; 02671 if (result) 02672 *result = error ? def : x; 02673 ast_debug(3, 02674 "extract uint from [%s] in [%u, %u] gives [%u](%d)\n", 02675 arg, low, high, 02676 result ? *result : x, error); 02677 break; 02678 } 02679 02680 case PARSE_DOUBLE: 02681 { 02682 double *result = p_result; 02683 double x, def = result ? *result : 0, 02684 low = -HUGE_VAL, high = HUGE_VAL; 02685 02686 /* optional argument: first default value, then range */ 02687 if (flags & PARSE_DEFAULT) 02688 def = va_arg(ap, double); 02689 if (flags & (PARSE_IN_RANGE|PARSE_OUT_RANGE)) { 02690 /* range requested, update bounds */ 02691 low = va_arg(ap, double); 02692 high = va_arg(ap, double); 02693 } 02694 x = strtod(arg, NULL); 02695 error = (x < low) || (x > high); 02696 if (flags & PARSE_OUT_RANGE) 02697 error = !error; 02698 if (result) 02699 *result = error ? def : x; 02700 ast_debug(3, 02701 "extract double from [%s] in [%f, %f] gives [%f](%d)\n", 02702 arg, low, high, 02703 result ? *result : x, error); 02704 break; 02705 } 02706 case PARSE_ADDR: 02707 { 02708 struct ast_sockaddr *addr = (struct ast_sockaddr *)p_result; 02709 02710 if (!ast_sockaddr_parse(addr, arg, flags & PARSE_PORT_MASK)) { 02711 error = 1; 02712 } 02713 02714 ast_debug(3, "extract addr from %s gives %s(%d)\n", 02715 arg, ast_sockaddr_stringify(addr), error); 02716 02717 break; 02718 } 02719 case PARSE_INADDR: /* TODO Remove this (use PARSE_ADDR instead). */ 02720 { 02721 char *port, *buf; 02722 struct sockaddr_in _sa_buf; /* buffer for the result */ 02723 struct sockaddr_in *sa = p_result ? 02724 (struct sockaddr_in *)p_result : &_sa_buf; 02725 /* default is either the supplied value or the result itself */ 02726 struct sockaddr_in *def = (flags & PARSE_DEFAULT) ? 02727 va_arg(ap, struct sockaddr_in *) : sa; 02728 struct hostent *hp; 02729 struct ast_hostent ahp; 02730 02731 memset(&_sa_buf, '\0', sizeof(_sa_buf)); /* clear buffer */ 02732 /* duplicate the string to strip away the :port */ 02733 port = ast_strdupa(arg); 02734 buf = strsep(&port, ":"); 02735 sa->sin_family = AF_INET; /* assign family */ 02736 /* 02737 * honor the ports flag setting, assign default value 02738 * in case of errors or field unset. 02739 */ 02740 flags &= PARSE_PORT_MASK; /* the only flags left to process */ 02741 if (port) { 02742 if (flags == PARSE_PORT_FORBID) { 02743 error = 1; /* port was forbidden */ 02744 sa->sin_port = def->sin_port; 02745 } else if (flags == PARSE_PORT_IGNORE) 02746 sa->sin_port = def->sin_port; 02747 else /* accept or require */ 02748 sa->sin_port = htons(strtol(port, NULL, 0)); 02749 } else { 02750 sa->sin_port = def->sin_port; 02751 if (flags == PARSE_PORT_REQUIRE) 02752 error = 1; 02753 } 02754 /* Now deal with host part, even if we have errors before. */ 02755 hp = ast_gethostbyname(buf, &ahp); 02756 if (hp) /* resolved successfully */ 02757 memcpy(&sa->sin_addr, hp->h_addr, sizeof(sa->sin_addr)); 02758 else { 02759 error = 1; 02760 sa->sin_addr = def->sin_addr; 02761 } 02762 ast_debug(3, 02763 "extract inaddr from [%s] gives [%s:%d](%d)\n", 02764 arg, ast_inet_ntoa(sa->sin_addr), 02765 ntohs(sa->sin_port), error); 02766 break; 02767 } 02768 } 02769 va_end(ap); 02770 return error; 02771 }
| char* ast_realtime_decode_chunk | ( | char * | chunk | ) |
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 |
Definition at line 2587 of file config.c.
Referenced by realtime_multi_pgsql(), and realtime_pgsql().
02588 { 02589 char *orig = chunk; 02590 for (; *chunk; chunk++) { 02591 if (*chunk == '^' && strchr("0123456789ABCDEFabcdef", chunk[1]) && strchr("0123456789ABCDEFabcdef", chunk[2])) { 02592 sscanf(chunk + 1, "%02hhX", chunk); 02593 memmove(chunk + 1, chunk + 3, strlen(chunk + 3) + 1); 02594 } 02595 } 02596 return orig; 02597 }
| int ast_realtime_enabled | ( | void | ) |
Check if there's any realtime engines loaded.
Definition at line 2415 of file config.c.
References config_maps.
Referenced by action_coresettings(), ast_check_realtime(), and handle_show_settings().
02416 { 02417 return config_maps ? 1 : 0; 02418 }
| 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 2599 of file config.c.
References ast_str_append(), ast_str_buffer(), ast_str_reset(), and ast_str_set().
02600 { 02601 if (!strchr(chunk, ';') && !strchr(chunk, '^')) { 02602 ast_str_set(dest, maxlen, "%s", chunk); 02603 } else { 02604 ast_str_reset(*dest); 02605 for (; *chunk; chunk++) { 02606 if (strchr(";^", *chunk)) { 02607 ast_str_append(dest, maxlen, "^%02hhX", *chunk); 02608 } else { 02609 ast_str_append(dest, maxlen, "%c", *chunk); 02610 } 02611 } 02612 } 02613 return ast_str_buffer(*dest); 02614 }
| int ast_realtime_require_field | ( | const char * | family, | |
| ... | ||||
| ) |
Inform realtime what fields that may be stored.
| family | which family/config is referenced |
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 2420 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().
02421 { 02422 struct ast_config_engine *eng; 02423 char db[256]; 02424 char table[256]; 02425 va_list ap; 02426 int res = -1, i; 02427 02428 va_start(ap, family); 02429 for (i = 1; ; i++) { 02430 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02431 /* If the require succeeds, it returns 0. */ 02432 if (eng->require_func && !(res = eng->require_func(db, table, ap))) { 02433 break; 02434 } 02435 } else { 02436 break; 02437 } 02438 } 02439 va_end(ap); 02440 02441 return res; 02442 }
| int ast_rq_is_int | ( | require_type | type | ) | [inline] |
Check if require type is an integer type.
Definition at line 755 of file config.h.
Referenced by realtime_require_handler(), require_odbc(), and require_pgsql().
| int ast_store_realtime | ( | const char * | family, | |
| ... | ||||
| ) |
Create realtime configuration.
| family | which family/config to be created |
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.
Definition at line 2540 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().
02541 { 02542 struct ast_config_engine *eng; 02543 int res = -1, i; 02544 char db[256]; 02545 char table[256]; 02546 va_list ap; 02547 02548 va_start(ap, family); 02549 for (i = 1; ; i++) { 02550 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02551 /* If the store succeeds, it returns 0. */ 02552 if (eng->store_func && !(res = eng->store_func(db, table, ap))) { 02553 break; 02554 } 02555 } else { 02556 break; 02557 } 02558 } 02559 va_end(ap); 02560 02561 return res; 02562 }
| int ast_unload_realtime | ( | const char * | family | ) |
Release any resources cached for a realtime family.
| family | which family/config to destroy |
| 0 | If any cache was purged | |
| -1 | If no cache was found |
Definition at line 2444 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().
02445 { 02446 struct ast_config_engine *eng; 02447 char db[256]; 02448 char table[256]; 02449 int res = -1, i; 02450 02451 for (i = 1; ; i++) { 02452 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02453 if (eng->unload_func) { 02454 /* Do this for ALL engines */ 02455 res = eng->unload_func(db, table); 02456 } 02457 } else { 02458 break; 02459 } 02460 } 02461 return res; 02462 }
| int ast_update2_realtime | ( | const char * | family, | |
| ... | ||||
| ) |
Update realtime configuration.
| family | which family/config to be updated |
Definition at line 2517 of file config.c.
References db, find_engine(), table, and ast_config_engine::update2_func.
Referenced by change_password_realtime(), and cli_realtime_update2().
02518 { 02519 struct ast_config_engine *eng; 02520 int res = -1, i; 02521 char db[256]; 02522 char table[256]; 02523 va_list ap; 02524 02525 va_start(ap, family); 02526 for (i = 1; ; i++) { 02527 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02528 if (eng->update2_func && !(res = eng->update2_func(db, table, ap))) { 02529 break; 02530 } 02531 } else { 02532 break; 02533 } 02534 } 02535 va_end(ap); 02536 02537 return res; 02538 }
| 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. |
Definition at line 2493 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().
02494 { 02495 struct ast_config_engine *eng; 02496 int res = -1, i; 02497 char db[256]; 02498 char table[256]; 02499 va_list ap; 02500 02501 va_start(ap, lookup); 02502 for (i = 1; ; i++) { 02503 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) { 02504 /* If the update succeeds, it returns 0. */ 02505 if (eng->update_func && !(res = eng->update_func(db, table, keyfield, lookup, ap))) { 02506 break; 02507 } 02508 } else { 02509 break; 02510 } 02511 } 02512 va_end(ap); 02513 02514 return res; 02515 }
| void ast_variable_append | ( | struct ast_category * | category, | |
| struct ast_variable * | variable | |||
| ) |
Definition at line 471 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(), append_row_to_cfg(), 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(), static_realtime_cb(), vm_change_password(), and write_password_to_file().
00472 { 00473 if (!variable) 00474 return; 00475 if (category->last) 00476 category->last->next = variable; 00477 else 00478 category->root = variable; 00479 category->last = variable; 00480 while (category->last->next) 00481 category->last = category->last->next; 00482 }
| 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 561 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_plc_reload(), ast_readconfig(), ast_variable_retrieve(), build_calendar(), build_device(), caldav_load_calendar(), check_tx_freq(), collect_function_digits(), conf_exec(), config_load(), config_module(), do_reload(), do_say(), do_scheduler(), 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_format_config(), load_general_config(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_pktccops_config(), load_rpt_vars(), misdn_cfg_init(), new_realtime_sqlite3_db(), node_lookup(), 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(), search_directory_sub(), 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().
00562 { 00563 struct ast_category *cat = NULL; 00564 00565 if (category && config->last_browse && (config->last_browse->name == category)) { 00566 cat = config->last_browse; 00567 } else { 00568 cat = ast_category_get(config, category); 00569 } 00570 00571 return (cat) ? cat->root : NULL; 00572 }
| int ast_variable_delete | ( | struct ast_category * | category, | |
| const char * | variable, | |||
| const char * | match, | |||
| const char * | line | |||
| ) |
Definition at line 853 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().
00854 { 00855 struct ast_variable *cur, *prev=NULL, *curn; 00856 int res = -1; 00857 int num_item = 0; 00858 int req_item; 00859 00860 req_item = -1; 00861 if (!ast_strlen_zero(line)) { 00862 /* Requesting to delete by item number. */ 00863 if (sscanf(line, "%30d", &req_item) != 1 00864 || req_item < 0) { 00865 /* Invalid item number to delete. */ 00866 return -1; 00867 } 00868 } 00869 00870 prev = NULL; 00871 cur = category->root; 00872 while (cur) { 00873 curn = cur->next; 00874 /* Delete by item number or by variable name with optional value. */ 00875 if ((0 <= req_item && num_item == req_item) 00876 || (req_item < 0 && !strcasecmp(cur->name, variable) 00877 && (ast_strlen_zero(match) || !strcasecmp(cur->value, match)))) { 00878 if (prev) { 00879 prev->next = cur->next; 00880 if (cur == category->last) 00881 category->last = prev; 00882 } else { 00883 category->root = cur->next; 00884 if (cur == category->last) 00885 category->last = NULL; 00886 } 00887 ast_variable_destroy(cur); 00888 res = 0; 00889 } else 00890 prev = cur; 00891 00892 cur = curn; 00893 ++num_item; 00894 } 00895 return res; 00896 }
| void ast_variable_insert | ( | struct ast_category * | category, | |
| struct ast_variable * | variable, | |||
| const char * | line | |||
| ) |
Definition at line 484 of file config.c.
References ast_variable::next, and ast_category::root.
Referenced by handle_updates().
00485 { 00486 struct ast_variable *cur = category->root; 00487 int lineno; 00488 int insertline; 00489 00490 if (!variable || sscanf(line, "%30d", &insertline) != 1) { 00491 return; 00492 } 00493 if (!insertline) { 00494 variable->next = category->root; 00495 category->root = variable; 00496 } else { 00497 for (lineno = 1; lineno < insertline; lineno++) { 00498 cur = cur->next; 00499 if (!cur->next) { 00500 break; 00501 } 00502 } 00503 variable->next = cur->next; 00504 cur->next = variable; 00505 } 00506 }
| struct ast_variable* ast_variable_new | ( | const char * | name, | |
| const char * | value, | |||
| const char * | filename | |||
| ) | [read] |
Definition at line 266 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(), append_row_to_cfg(), apply_outgoing(), ast_channeltype_list(), ast_http_get_post_vars(), ast_include_rename(), ast_variable_update(), ast_variables_dup(), build_calendar(), 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(), row_to_varlist(), sip_cli_notify(), static_realtime_cb(), variable_clone(), vm_change_password(), and write_password_to_file().
00268 { 00269 struct ast_variable *variable; 00270 int name_len = strlen(name) + 1; 00271 int val_len = strlen(value) + 1; 00272 int fn_len = strlen(filename) + 1; 00273 00274 /* Ensure a minimum length in case the filename is changed later. */ 00275 if (fn_len < MIN_VARIABLE_FNAME_SPACE) { 00276 fn_len = MIN_VARIABLE_FNAME_SPACE; 00277 } 00278 00279 if ( 00280 #ifdef MALLOC_DEBUG 00281 (variable = __ast_calloc(1, fn_len + name_len + val_len + sizeof(*variable), file, lineno, func)) 00282 #else 00283 (variable = ast_calloc(1, fn_len + name_len + val_len + sizeof(*variable))) 00284 #endif 00285 ) { 00286 char *dst = variable->stuff; /* writable space starts here */ 00287 00288 /* Put file first so ast_include_rename() can calculate space available. */ 00289 variable->file = strcpy(dst, filename); 00290 dst += fn_len; 00291 variable->name = strcpy(dst, name); 00292 dst += name_len; 00293 variable->value = strcpy(dst, value); 00294 } 00295 return variable; 00296 }
| 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 |
| The | variable value on success | |
| NULL | if unable to find it. |
Definition at line 585 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(), build_extension(), conf_exec(), config_function_read(), config_module(), directory_exec(), do_reload(), do_scheduler(), festival_exec(), find_realtime(), function_macro(), get_insecure_variable_from_config(), get_insecure_variable_from_sipregs(), get_wait_interval(), gtalk_load_config(), iax_template_parse(), init_acf_query(), init_logger_chain(), initialize_cc_devstate_map_helper(), initialize_cc_max_requests(), jingle_load_config(), load_config(), load_config_meetme(), load_format_config(), load_indications(), load_module(), load_modules(), load_rpt_vars(), load_tech_calendars(), make_email_file(), node_lookup(), 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(), retreive_memory(), retrieve_astcfgint(), rpt(), rpt_master(), rpt_tele_thread(), rpt_telemetry(), rt_handle_member_record(), rtp_reload(), saynode(), search_directory(), search_directory_sub(), set_config(), setup_dahdi_int(), sla_build_station(), sla_build_trunk(), sla_load_config(), tds_load_module(), telem_lookup(), vm_change_password(), and vm_forwardoptions().
00586 { 00587 struct ast_variable *v; 00588 00589 if (category) { 00590 for (v = ast_variable_browse(config, category); v; v = v->next) { 00591 if (!strcasecmp(variable, v->name)) { 00592 return v->value; 00593 } 00594 } 00595 } else { 00596 struct ast_category *cat; 00597 00598 for (cat = config->root; cat; cat = cat->next) { 00599 for (v = cat->root; v; v = v->next) { 00600 if (!strcasecmp(variable, v->name)) { 00601 return v->value; 00602 } 00603 } 00604 } 00605 } 00606 00607 return NULL; 00608 }
| 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 898 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().
00900 { 00901 struct ast_variable *cur, *prev=NULL, *newer=NULL; 00902 00903 for (cur = category->root; cur; prev = cur, cur = cur->next) { 00904 if (strcasecmp(cur->name, variable) || 00905 (!ast_strlen_zero(match) && strcasecmp(cur->value, match))) 00906 continue; 00907 00908 if (!(newer = ast_variable_new(variable, value, cur->file))) 00909 return -1; 00910 00911 ast_variable_move(newer, cur); 00912 newer->object = newer->object || object; 00913 00914 /* Replace the old node in the list with the new node. */ 00915 newer->next = cur->next; 00916 if (prev) 00917 prev->next = newer; 00918 else 00919 category->root = newer; 00920 if (category->last == cur) 00921 category->last = newer; 00922 00923 ast_variable_destroy(cur); 00924 00925 return 0; 00926 } 00927 00928 /* Could not find variable to update */ 00929 return -1; 00930 }
| void ast_variables_destroy | ( | struct ast_variable * | var | ) |
Free variable list.
| var | the linked list of variables to free |
Definition at line 550 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(), calendar_destructor(), 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_load_queue_rt_friendly(), 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(), 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(), row_to_varlist(), rt_extend_conf(), sip_destroy_peer(), socket_process(), table_configs_free(), and user_destructor().
00551 { 00552 struct ast_variable *vn; 00553 00554 while (v) { 00555 vn = v; 00556 v = v->next; 00557 ast_variable_destroy(vn); 00558 } 00559 }
| 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 528 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().
00529 { 00530 struct ast_variable *cloned; 00531 struct ast_variable *tmp; 00532 00533 if (!(cloned = ast_variable_new(var->name, var->value, var->file))) { 00534 return NULL; 00535 } 00536 00537 tmp = cloned; 00538 00539 while ((var = var->next)) { 00540 if (!(tmp->next = ast_variable_new(var->name, var->value, var->file))) { 00541 ast_variables_destroy(cloned); 00542 return NULL; 00543 } 00544 tmp = tmp->next; 00545 } 00546 00547 return cloned; 00548 }
| int config_text_file_save | ( | const char * | filename, | |
| const struct ast_config * | cfg, | |||
| const char * | generator | |||
| ) |
Definition at line 1804 of file config.c.
References ast_config_text_file_save().
01805 { 01806 return ast_config_text_file_save(configfile, cfg, generator); 01807 }
| 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 2115 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_WARNING, ast_config::max_include_level, ast_variable::name, ast_variable::next, strsep(), table, and ast_variable::value.
Referenced by main().
02116 { 02117 struct ast_config *config, *configtmp; 02118 struct ast_variable *v; 02119 char *driver, *table, *database, *textpri, *stringp, *tmp; 02120 struct ast_flags flags = { CONFIG_FLAG_NOREALTIME }; 02121 int pri; 02122 02123 clear_config_maps(); 02124 02125 configtmp = ast_config_new(); 02126 configtmp->max_include_level = 1; 02127 config = ast_config_internal_load(extconfig_conf, configtmp, flags, "", "extconfig"); 02128 if (config == CONFIG_STATUS_FILEINVALID) { 02129 return -1; 02130 } else if (!config) { 02131 ast_config_destroy(configtmp); 02132 return 0; 02133 } 02134 02135 for (v = ast_variable_browse(config, "settings"); v; v = v->next) { 02136 char buf[512]; 02137 ast_copy_string(buf, v->value, sizeof(buf)); 02138 stringp = buf; 02139 driver = strsep(&stringp, ","); 02140 02141 if ((tmp = strchr(stringp, '\"'))) 02142 stringp = tmp; 02143 02144 /* check if the database text starts with a double quote */ 02145 if (*stringp == '"') { 02146 stringp++; 02147 database = strsep(&stringp, "\""); 02148 strsep(&stringp, ","); 02149 } else { 02150 /* apparently this text has no quotes */ 02151 database = strsep(&stringp, ","); 02152 } 02153 02154 table = strsep(&stringp, ","); 02155 textpri = strsep(&stringp, ","); 02156 if (!textpri || !(pri = atoi(textpri))) { 02157 pri = 1; 02158 } 02159 02160 if (!strcmp(v->name, extconfig_conf)) { 02161 ast_log(LOG_WARNING, "Cannot bind '%s'!\n", extconfig_conf); 02162 continue; 02163 } 02164 02165 if (!strcmp(v->name, "asterisk.conf")) { 02166 ast_log(LOG_WARNING, "Cannot bind 'asterisk.conf'!\n"); 02167 continue; 02168 } 02169 02170 if (!strcmp(v->name, "logger.conf")) { 02171 ast_log(LOG_WARNING, "Cannot bind 'logger.conf'!\n"); 02172 continue; 02173 } 02174 02175 if (!driver || !database) 02176 continue; 02177 if (!strcasecmp(v->name, "sipfriends")) { 02178 ast_log(LOG_WARNING, "The 'sipfriends' table is obsolete, update your config to use sippeers instead.\n"); 02179 append_mapping("sippeers", driver, database, table ? table : "sipfriends", pri); 02180 } else if (!strcasecmp(v->name, "iaxfriends")) { 02181 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"); 02182 append_mapping("iaxusers", driver, database, table ? table : "iaxfriends", pri); 02183 append_mapping("iaxpeers", driver, database, table ? table : "iaxfriends", pri); 02184 } else 02185 append_mapping(v->name, driver, database, table, pri); 02186 } 02187 02188 ast_config_destroy(config); 02189 return 0; 02190 }
| 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 2902 of file config.c.
References ARRAY_LEN, and ast_cli_register_multiple().
Referenced by main().
02903 { 02904 ast_cli_register_multiple(cli_config, ARRAY_LEN(cli_config)); 02905 return 0; 02906 }
1.5.6