日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

res_config_mysql和chan_sip模块的加载分析

發布時間:2023/12/10 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 res_config_mysql和chan_sip模块的加载分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. res_config_mysql的模塊加載早于chan_sip,他們的加載函數均為load_module

??? 先分析res_config_mysql的load_module函數

????

??? parse_config(0);

???parse_config解析res_config_mysql文件,并用文件中的配置信息填充mysql_conn結構體

???? 我當前的res_config_mysql文件如下

??? [general]

??? dbhost = 192.168.1.182

??? dbname = asterisk

??? dbuser = root

??? dbpass = 123456

??? dbport = 3306

???? 解析完成后,mysql_conn里面會得到這些數據

struct mysql_conn {
?? ?AST_RWLIST_ENTRY(mysql_conn) list;
?? ?ast_mutex_t?? ?lock;
?? ?MYSQL?????? handle;
?? ?char??????? host[50];??????????????? 192.168.1.182
?? ?char??????? name[50];????????????? asterisk
?? ?char??????? user[50];??????????????? root
?? ?char??????? pass[50];?????????????? 123456
?? ?char??????? sock[50];
?? ?char??????? charset[50];
?? ?int???????? port;???????????????????????? 3306
?? ?int???????? connected;
?? ?time_t????? connect_time;
?? ?enum requirements requirements;
?? ?char??????? unique_name[0];
};

?? ?ast_config_engine_register(&mysql_engine);

??? 將res_config_mysql這個模塊的函數結構體注冊到

??? static struct ast_config_engine *config_engine_list;


實際res_config_mysql的load_module函數完成兩個事情,解析res_config_mysql.conf配置文件,并存儲。

然后向系統注冊res_config_mysql的功能函數



2. chan_sip模塊的加載

??? chan_sip模塊的加載也是load_module函數,在這個函數中我們主要關注reload_config函數

??? 在reload_config函數中調用

??? cfg = ast_config_load(config, config_flags);? config為sip.conf

???? 但是這里ast_config_load并不是直接加載sip.conf文件來生成一個ast_config結構體的。

??? 我們將其展開來分析,ast_config_load最終是調用了ast_config_internal_load


3. ast_config_internal_load分析

??? if (!ast_test_flag(&flags, CONFIG_FLAG_NOREALTIME) && config_engine_list) {

???????? flags是0,并且res_config_mysql模塊將其函數注冊到了config_engine_list中,因此if語句為真

??? ???? struct ast_config_engine *eng;
????? 從下面find_engine的分析,eng將得到res_config_mysql的ast_config_engine結構體
?? ??? ?eng = find_engine(filename, 1, db, sizeof(db), table, sizeof(table));


?? ??? ?if (eng && eng->load_func) {
?? ??? ??? ?loader = eng;
?? ??? ?} else {
?? ??? ??? ?eng = find_engine("global", 1, db, sizeof(db), table, sizeof(table));
?? ??? ??? ?if (eng && eng->load_func)
?? ??? ??? ??? ?loader = eng;
?? ??? ?}
?? ?}

???????? 最后調用了res_config_mysql的oad_func函數,即config_mysql函數

???? ??? result = loader->load_func(db, table, filename, cfg, flags, suggested_include_file, who_asked);

4. find_engine分析

?? find_engine展開解釋,在extconfig.conf被解析后,config_maps里面如下

?? name = extensions??dirver =mysql?? database =general??? table =extensions

?? name = sip.conf?????? dirver =mysql?? database =general??? table =sip_config2

??

??? for (map = config_maps; map; map = map->next) {

??????? family為"sip.conf",因此,for結束后,database = general, table = sip_config2

??? ???? if (!strcasecmp(family, map->name) && (priority == map->priority)) {
?? ??? ??? ?if (database)
?? ??? ??? ??? ?ast_copy_string(database, map->database, dbsiz);
?? ??? ??? ?if (table)
?? ??? ??? ??? ?ast_copy_string(table, map->table ? map->table : family, tabsiz);
?? ??? ??? ?break;
?? ??? ?}
?? ?}

?? ?/* Check if the required driver (engine) exist */
?? ?if (map) {

???? 從res_config_mysql看他的ast_config_engine的定義里面,其name為mysql,從上面看map的driver也是mysql,

??? 因此 find_engine這個函數最后返回了res_config_mysql這個ast_config_engine

?? ???? for (eng = config_engine_list; !ret && eng; eng = eng->next) {
?? ??? ??? ?if (!strcasecmp(eng->name, map->driver))
?? ??? ??? ??? ?ret = eng;
?? ??? ?}
?? ?}


???

總結

以上是生活随笔為你收集整理的res_config_mysql和chan_sip模块的加载分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。