上节讲解了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: