18.3.2 SHTTPD文件配置解析的实现
服务器SHTTPD配置文件的优先级最高,对其进行解析后的值覆盖其他配置部分的值。单行配置文件的格式为:
[[空格]#注释|[空格]关键字[空格]=[空格]value]
先获得配置的关键字和值部分,这两个部分是以“=”来分割的,然后根据关键字对其值进行不同的处理。如果一行为“#”开始则为注释行。
void Para_FileParse(char *file)
{
#define LINELENGTH 256
char line[LINELENGTH];
char *name = NULL, *value = NULL;
int fd = -1;
int n = 0;
fd = open(file, O_RDONLY);
if(fd == -1)
{
goto EXITPara_FileParse;
}
/*
*命令格式如下:
*[#注释|[空格]关键字[空格]=[空格]value]
*/
while( (n = conf_readline(fd, line, LINELENGTH)) !=0)
{
char *pos = line;
while(isspace(*pos)){ /*跳过一行开头部分的空格*/
pos++;
}
if(*pos == '#'){ /*注释?*/
continue;
}
name = pos; /*关键字开始部分*/
while(!isspace(*pos) && *pos != '=') /*关键字的末尾*/
{
pos++;
}
*pos = '/0'; /*生成关键字字符串*/
while(isspace(*pos)) { /*value部分前面空格*/
pos++;
}
value = pos; /*value开始*/
while(!isspace(*pos) && *pos != '/r' && *pos != '/n'){/*到结束*/
pos++;
}
*pos = '/0'; /*生成值的字符串*/
/*根据关键字部分,获得value部分的值*/
int ivalue;
/*"CGIRoot","DefaultFile","DocumentRoot","ListenPort",
"MaxClient", "TimeOut"*/
if(strncmp("CGIRoot", name, 7)) { /*CGIRoot部分*/
memcpy(conf_para.CGIRoot, value, strlen(value)+1);
}else if(strncmp("DefaultFile", name, 11)){
/*DefaultFile部分*/
memcpy(conf_para.DefaultFile, value, strlen(value)+1);
}else if(strncmp("DocumentRoot", name, 12)){
/*DocumentRoot部分*/
memcpy(conf_para.DocumentRoot, value, strlen(value)+1);
}else if(strncmp("ListenPort", name, 10)){
/*ListenPort部分*/
ivalue = strtol(value, NULL, 10);
conf_para.ListenPort = ivalue;
}else if(strncmp("MaxClient", name, 9)){ /*MaxClient部分*/
ivalue = strtol(value, NULL, 10);
conf_para.MaxClient = ivalue;
}else if(strncmp("TimeOut", name, 7)){ /*TimeOut部分*/
ivalue = strtol(value, NULL, 10);
conf_para.TimeOut = ivalue;
}
}
close(fd);
EXITPara_FileParse:
return;
}