上节讲解了read_config函数,读取配置信息到server_config的相应成员变量里,但read_config函数只负责把配置信息重文件里读出来,具体怎么把信息填写到指定的地址内,是调用keywords数组里元素的handler成员指向的函数完成。这节就是讲解完成具体的写入操作中比较复杂的函数。

1) int read_opt(const char *line, void *arg)

在read_config从udhcpd.conf里读到 token = “opt” 或 “option”;

摘自udhcp.conf里的options配置信息

调用handler: read_opt

const_line的从udhcpd.conf的读出的line

line的值 例:

dns 192.168.10.2 192.168.10.10

subnet 255.255.255.0 等

arg的值是 &(server_config.options)

即是把line的值存储到头结点为*arg的链表里去。

read_opt函数与read_config有点类似,也借助一个辅助的数组进行信息添加。

在以前章节有讲解过选项信息的存储组织方式,CLV:Code + Length + Value,value我们文件里读出来了,Code和Length在哪?

现在来看下这个辅助数组:

元素结构体的定义:

该结构体定义的数组:

这个辅助数组的做法与read_config里的有些类似,name即是keyword,flag可以求出Length,code即Code。

讲解这些函数真是痛苦,给你下套,而且是一环套一环的!

得到了每个选项信息里的value,其值保存在opt指向的内存,value长度为length,Code在struct dhcp_option类型的option里。

调用attach_option函数把选项信息的添加到server_config.options选项链表里。

/*

* add an option to the opt_list

*

* attach_option函数把从文件里读出的以options 或opt标识的配置信息

* 在函数read_opt,通过option->flag处理好了line里val 值 存放在buffer

* 再把配置信息填入到struct option_set的链表里

*

* 参数:opt_list: &(server_config.options)

* option: 根据选项头确定的dhcp_options数组里的一项

* buffer 配置信息(去除了option/opt和选项头,而且已经转换过了)

* length 配置信息的大小(以字节为单位)

*/

static void attach_option(struct option_set **opt_list, struct dhcp_option *option, char *buffer, int length);

添加到链表里分为两种情况

①链表里没有与将要添加的选项信息的Code一样的结点,直接添加到链表即可。

②链表里已有与将要添加的选项信息的Code一样的结点,该Code选项信息flag选项里OPT_LIST(例如:dns选项的value是IP List 有两个IP):

}


2)、int read_staticlease(const char *line, void *arg)

udhcpd.conf里static lease:

udhcp源码详解(三) 下 之配置信息的读取的更多相关文章

  1. udhcp源码详解(五) 之DHCP包--options字段

    中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说 ...

  2. udhcp源码详解(三)上 之配置信息的读取

    上节介绍了存储管理配置信息的结构体struct server_config_t,该结构体贯穿整个server端程序的运行. 在dhcpd.c里的用该结构体定义个一个全局的变量: struct serv ...

  3. OkHttp3源码详解(三) 拦截器-RetryAndFollowUpInterceptor

    最大恢复追逐次数: ; 处理的业务: 实例化StreamAllocation,初始化一个Socket连接对象,获取到输入/输出流()基于Okio 开启循环,执行下一个调用链(拦截器),等待返回结果(R ...

  4. OkHttp3源码详解(三) 拦截器

    1.构造Demo 首先构造一个简单的异步网络访问Demo: OkHttpClient client = new OkHttpClient(); Request request = new Reques ...

  5. udhcp源码详解(四) 之租赁IP的管理

    Server端对于租赁出去的IP的管理是基于结构体dhcpOfferedAddr的,该结构体的定义是在leases.c文件里:(结构体的成员介绍说明见详解之数据结构) 1: struct dhcpOf ...

  6. udhcp源码详解(一)之文件组织结构(dhcp server) --转

    udhcp目录下有十几个源文件,一个源文件相对应一个模块,完成一系列相关的功能,例如在static_leases.c主要针对static_lease链表增删查找等操作. dhcpd.c——   整个d ...

  7. udhcp源码详解(二)--转

    定义的数据结构对于C程序的重要性,不言而喻.面向对象设计的程序是一个个对象的集合,而面向过程语言设计的程序则是数据结构与算法的集合. 下面来分析的是dhcp server中的定义结构体: 1).在pa ...

  8. spring事务详解(三)源码详解

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  9. Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解

    Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...

随机推荐

  1. (7) openssl dgst(生成和验证数字签名)

    该伪命令是单向加密工具,用于生成文件的摘要信息                  也可以进行数字签名,及验证数字签名. 首先要明白的是,数字签名的过程是计算出摘要信息,然后使用私钥对摘要信息进行加密得 ...

  2. vue 框架原理

    参考:https://segmentfault.com/a/1190000006599500#articleHeader4 记录自己的理解: 核心的响应原理通过Object.definePropert ...

  3. fshc模块fsch2mcu_if理解

    fshc2mcu_if中包括ahb2reg/ahb2fifo两个文件,都是协议转换文件.ahb2reg下游文件是reg files,ahb2fifo下游文件是fifo控制器.所有的配置和flag都是要 ...

  4. python_函数递归

    函数递归 函数递归:函数的递归调用,即在函数调用的过程中,又直接或间接地调用了函数本身 # import sys # print(sys.getrecursionlimit()) # sys.setr ...

  5. uwsgs loading shared libraries: libicui18n.so.58 异常处理

    背景 想使用 ningx + uwsgi + flask 搭建 python 应用环境 Python使用的是anaconda3(pyhton 3.6) 依赖包安装完毕,但是执行 uwsgi 的时候出现 ...

  6. 又见GCD (已知最大公约数和其中一个数求另一个数)

    #include<cstdio> int f1(int a,int b) //最大公约数 { ) return b; else return f1(b,a%b); } int f2(int ...

  7. 关于面试总结-python笔试题(递归)

    前言 本篇继续收集一些常见的python笔试题,以基础知识为主,递归是面试最喜欢考的一个问题,不管是做开发还是测试,都无法避免考递归.本篇结合实际案例,讲下几种关于递归的场景. 计算n的阶乘 计算n! ...

  8. Python+selenium(操作隐藏元素)

    测试过程中,偶尔会碰到一些页面的隐藏元素,如下,是小编举的一个简单的例子: test.html <html> <head></head> <body> ...

  9. 把disable maven nature后的项目,恢复菜单呈现出来(Convert to Maven Project)

    把disable maven nature后的项目,恢复菜单呈现出来(Convert to Maven Project) 有的时候需求把disable maven nature后的项目,再转换为mav ...

  10. [转]Android SDK下载和更新失败的解决方法

    今天更新sdk,遇到了更新下载失败问题: Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xmlFetched ...