udhcpd_main的初始化和配置
udhcpd_main是DHCP服务器的入口,也是其主循环,在该函数中可以了解到DHCP服务的基本所有功能和流程。
开启LOG,初始化server_config
打开名为udhcpd的log文件,打印log信息,并将server_config初始化为0
if (!(opt & 1)) { /* no -f */
bb_daemonize_or_rexec(0, argv);
logmode &= ~LOGMODE_STDIO;
}
if (opt & 2) { /* -S */
openlog(applet_name, LOG_PID, LOG_LOCAL0);
logmode |= LOGMODE_SYSLOG;
}
读取配置文件信息read_config
DHCP服务器开启后,第一步就是从配置文件读取配置信息,写入server_config。如果未在函数入口指定配置文件路径,则读取默认路径
read_config函数定义在file.c中,用于读取配置文件,以后遇到类似需要读取配置信息的函数可以参照read_config的写法。理解read_config函数需要先看一个file.h中定义的一个辅助数据结构:
struct config_keyword {
char keyword[14];
int (*handler)(char *line, void *var);
void *var;
char def[30];
};
该结构的数组在file.c中初始化如下,可以看出config_keyword结构的四个成员中,keyword对应着server_config的变量名称,该成员名字所指示的就是server_config_t里的哪个成员;handler是一个函数指针,指向的函数用于读取该项配置信息,并把配置信息写到指定位置;第三项variable address设置的是把参数存储到的地址,第四项default是参数的默认值。
static const struct config_keyword keywords[] = {
/* keyword handler variable address default */
{
"start", read_ip, &(server_config.start_ip), "192.168.0.20"},
{
"end", read_ip, &(server_config.end_ip), "192.168.0.254"},
{
"interface", read_str, &(server_config.interface), "eth0"},
{
"option", read_opt, &(server_config.options), ""},
{
"opt", read_opt, &(server_config.options), ""},
/* Avoid "max_leases value not sane" warning by setting default
* to default_end_ip - default_start_ip + 1: */
{
"max_leases", read_u32, &(server_config.max_leases)