1. int read_config_maps(void), 定义在main/config.c,被main函数调用,下面开始分析read_config_maps
struct ast_config *config, *configtmp;
新建一个配置结构体
configtmp = ast_config_new();
从extconfig_conf即extconfig.conf得到配置信息并存储在config 中。ast_config_internal_load执行后,extconfig.conf
文件中的信息都保存在了config中。
config = ast_config_internal_load(extconfig_conf, configtmp, flags, "", "extconfig");
然后依次分析config中的settings配置项的每一条信息,v为struct ast_variable*,因为我的配置文件中的setting下面有
如下两行,
extensions => mysql,general,extensions
sip.conf => mysql,general,sip_conf2
经过对v->name和v->value进行打印输出,下面for循环执行两次,其中,name保存=>前面的值,value保存=>后面的字符串
for (v = ast_variable_browse(config, "settings"); v; v = v->next)
然后将value的值分别解析出来,放到driver(mysql), database(general), table(extensions)后,最后通过下面这个函数追加到config_maps里
append_mapping(v->name, driver, database, table, pri);
2. struct ast_config *ast_config_internal_load(const char *filename, struct ast_config *cfg, struct ast_flags flags, const char *suggested_include_file, const char *who_asked)
定义在config.c中
这个函数根据传入的filename(配置文件名称),来构建一个ast_config结构体
static struct ast_config_engine text_file_engine = {
.name = "text",
.load_func = config_text_file_load,
};
得到默认的文件加载器
struct ast_config_engine *loader = &text_file_engine;
此时刻,config_engine_list还为空,因此下面if语句不执行
if (!ast_test_flag(&flags, CONFIG_FLAG_NOREALTIME) && config_engine_list)
调用text_file_engine的load_func来解析extconfig.conf文件并构造ast_config结构体
result = loader->load_func(db, table, filename, cfg, flags, suggested_include_file, who_asked);
3. static int append_mapping(const char *name, const char *driver, const char *database, const char *table, int priority)
定义在config.c
这个函数将extconfig.conf中的每一条数据,构造ast_config_map结构体,并加入到config_maps链表中
ast_config_map定义如下:
static struct ast_config_map {
struct ast_config_map *next;
char *name;
char *driver;
char *database;
char *table;
char stuff[0];
} *config_maps = NULL;
在read_config_maps执行完成后,config_maps里面有两项,
name = extensions dirver = mysql database =general table = extensions
name = sip.conf dirver =mysql database = general table = sip_config2