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;
        }
    }



   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何连接安卓手机_安卓手机如何使用AirPods

苹果公司推出的无线蓝牙耳机AirPods可以说是市面上最好的无线耳机,配合iPhone使用能够给你带来畅快舒适的体验。有很多小米华为oppo,vivo等安卓手机用户也在问了,安卓手机能够支持AirPods呢,答案是肯定的。图片来源:网…

晒一下我的代码生成器

经过最近一段新的尝试【BS架构】,之前的编程一直是CS架构,但也总是在忙那些项目,没法整理出一套符合自己团队的一套编程体系和架构; 新的起点,又是一个新的挑战,现在已经是03年,最早做的时候是07年&a…

discuz viewthread.php,修改discuz论坛的标题header和footer

1、关于去掉DZ论坛标题处的Powered by Discuz!,去掉他的原因是为了使标题更加简洁明了,还有就是不被搜索到导致SPAM:具体的修改方法:打开/templates/default/header.htm,在第五行中直接删除:- Powered by D…

sed命令详解

转载:http://blog.chinaunix.net/u/22677/showart_1076318.html1.简介sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入&#xff…

Oracle中的单值函数

Oracle的函数 Oracle函数可以分为单值函数和分组函数两大类,单值函数又分为字符函数、日期和时间函数、数字函数、转换函数和混合函数:分组函数右count、max、min、avg、sum,都可以和group by 搭配使用。 单值函数 1、 字符函数 l 字符串连…

asterisk账号和拨号方案mysql存储(静态)

asterisk账号和拨号方案的静态存储相对动态的话,比较简单,而且也比较好理解,说白了就是把 sip.conf和extensions.conf文件的内容完完整整的放入到数据库中,不像动态存储那样,不但需要数据库而且还需要 sip.conf和ext…

matlab自动排版,工具方法| Matlab 简单绘图与排版

matlab启动界面 来自百度百科对于很多教师与学生,Matlab是做数值计算很好的一款软件。收集、整理、分析数据十分的方便,我们也可以通过Matlab画出相对比较好看的图。这里简单总结下Matlab的画图方式与排版,供初学者参考、交流。Matlab基本都是…

坦克大战代码_坦克大战系列文章-坦克大战简介

前言本篇主要对坦克大战Robocode做一个简单的介绍,对java最初的人工智能算法演练工具做一个了解坦克大战简介今天我们要谈的是java 最初的基于人工智能算法的仿真模拟坦克大战,全称Robocode。Robocode 是一位IBM的工程师 Mat Nelson 用Java 语言所创造的…

php mongo sort -1出错,mongoDB排序引起的ERROR

mongo 使用过程中遇到了一个问题,需求就是要对mongo 库中数据进行排序查询logger.info("历史采集汇总");// 一天数据calendar Calendar.getInstance();calendar.add(Calendar.HOUR_OF_DAY, -24);cond new BasicDBObject();cond.put("workTime"…

数学_同取对数(HDU_1060)

m n^n > lg(m) lg(n^n) > lg(m) n*lg(n) > m 10^(n*lg(n)) 对于 10^N 10^123.456 10^(1230.456) 10^123 * 10^0.0.456 10^123 的最高位为 1,即 10^N 的最高位取决于 n*lg(n) 的小数部位 #include <stdio.h> #include <string.h> #include &l…

python浮点型数据怎么显示为图片_python数字图像处理(4):图像数据类型及颜色空间转换...

一、图像数据类型及转换在skimage中&#xff0c;一张图片就是一个简单的numpy数组&#xff0c;数组的数据类型有很多种&#xff0c;相互之间也可以转换。这些数据类型及取值范围如下表所示&#xff1a;Data typeRangeuint80 to 255uint160 to 65535uint320 to 232float-1 to 1 …

uboot mkimage使用详解

mkimage使用详解 uboot源代码的tools/目录下有mkimage工具&#xff0c;这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。 mkimage在制作映象文件的时候&#xff0c;是在原来的可执行映象文件的前面加上一个0x40字节的头&#xff0c;记录参数所指定的信息&#xff0c…

php查询文件名,php怎么查询文件名

php查询文件名的方法&#xff1a;可以利用pathinfo()函数来查询。pathinfo()函数以数组的形式返回关于文件路径的信息&#xff0c;包括目录路径、文件名等&#xff0c;如&#xff1a;【print_r(pathinfo("/testweb/test.txt"))】。pathinfo() 函数以数组的形式返回关…

基于live555的视频直播 DM368IPNC RTSP分析

因需要&#xff0c;从个人的理解顺序和需求角度对live555的分析与开发整理&#xff0c;包含RTSP Server与RTSP Client、如何直播H.264流与JPEG流等&#xff0c;均进行了探讨&#xff0c;对live555的初学者有一定的指导意义。 本人习惯使用excel归档&#xff0c;所以本文均为exc…

图像风格迁移_图像风格迁移—谷歌大脑团队任意图像风格化迁移论文详解

点击蓝字关注我们AI研习图书馆&#xff0c;发现不一样的世界风格迁移图像风格化迁移是一个很有意思的研究领域&#xff0c;它可以将一张图的风格迁移到另外一张图像上&#xff0c;由此还诞生了Prisma和Ostagram这样的商业化产品。本文&#xff0c;我们将介绍谷歌大脑团队的一篇…

石子合并问题java,石子合并问题 GarsiaWachs算法

石子合并问题 GarsiaWachs算法目录引入一个较为朴素的算法GarsiaWachs算法引入在一个操场上摆放着一排 \(N\) 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的 \(2\) 堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。试设计一个算法&…

Asterisk NAT

网络结构如下&#xff1a; asterisk(192.168.1.99) <--> 无线路由器&#xff08;公网IP: 55.66.77.88&#xff09; <-----------------------> 无线路由器&#xff08;公网IP: 21.31.41.51&#xff09; <--> eyeBeam(sip软电话: 192.168.12.43) 也就是说ast…

python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

本文面对三种常常遇到的情况&#xff0c;总结三种读取数据的方式&#xff0c;分别用于处理单张图片、大量图片&#xff0c;和TFRecorder读取方式。并且还补充了功能相近的tf函数。1、处理单张图片我们训练完模型之后&#xff0c;常常要用图片测试&#xff0c;有的时候&#xff…

oracle无效的关联运算符,菜鸟请教:关联操作符=>用法

定位符和命名符create or replace procedure CallMe(p_ParameterA varchar2,p_ParameterB number,p_ParameterC boolean,p_ParameterD date) asbeginnull;end CallMe;declarev_Variable1 varchar2(10);v_Variable2 number(7, 6);v_Variable3 boolean;v_Variable4 date;beginCal…

asterisk的NAT配置

【转】asterisk的NAT配置 http://www.asteriskguru.com/tutorials/sip_nat_oneway_or_no_audio_asterisk.html 这篇文章已经把该说的都说了&#xff0c;能理解多少是多少&#xff01; 1. sip.conf: Externip:在[general] context配置的属性&#xff0c;配置你的公网地址&…