#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#define COMMENT1 "//"
#define COMMENT2 "#"
unsigned int get_config_string(
const char *node,
const char *key,
char *returnvalue,
unsigned int length,
const char *defaultvalue,
const char *filefullname
);
unsigned int mod_config_string(
const char *node,
const char *key,
const char *orivlaue, //如果等于NULL,表示任何时候都替换成目标
const char *destvalue,
const char *filefullname
);
//find status查找状态
enum _tag_search_status{
I_START=0,//初始状态
I_KEYFOUND,//节点发现
I_VALUEFIND,//配置建直发现
I_ERR
}search_status;
int main(int argc, char **argv)
{
char configfile[FILENAME_MAX];
char IP1[60];
bzero(IP1,60);
snprintf(configfile,FILENAME_MAX,"%s/scusys.cfg",getenv("HOME"));
get_config_string("[node.0]","IP1",IP1,sizeof(IP1),"",file.c_str());
fprintf(stdout,"IP1=%s",IP1);
unsigned int ret=mod_config_string("[node.0]","IP1",NULL,"10.10.10.10",file.c_str());
fprintf(stdout,"ret =%d",ret);
}
/*****************************************
* 函数名:mod_config_string
* 功能:根据文件名和配置名,将指定的值替换
* first localte the pos of the key,compare the value is the origvalue
* if its,mk a tempfile copy the not mod line;
* mod the buff line to destvalue.
* 返回值:替换后字符串的长度,0-表示替换不成功(没找到,或者跳过)
* 参数:
* 作者:masathem@163.com
* 历史记录:
* 1.0 2007-4-7 complete
* ***************************************/
unsigned int mod_config_string(
const char *node,//配置节点名,如:[SCP],!=NULL
const char *key,//配置项名,!=NULL
const char *orivlaue, //原值,如果等于NULL,表示任何时候都替换成目标
const char *destvalue,//目标值,!=NULL
const char *filefullname//配置文件名
)
{
//make sure all nessary para is not null
if(NULL==node||NULL==key||filefullname==NULL||NULL==destvalue)
{
return 0;
}
char resultvalue[1024],buff[1024],aftersep[1024];
char *str1,*str2;
unsigned int pos=get_config_string(node,key,resultvalue,1024,"",filefullname);
if(pos==0||strcmp(resultvalue,"")==0)
{
return 0;
}
if(orivlaue==NULL||strcmp(resultvalue,orivlaue)!=0)
{
//proceed relace
//int tmpfd=mkstemp("mod_config");
char *tmpfilename="mod_config9090.tmp";
remove(tmpfilename);
FILE *tmpfp=fopen(tmpfilename,"w+");
FILE *orifp=fopen(filefullname,"r");
int writesiz=0;
if(orifp)
{
//cpy the content before the key(pos)
for(int i=0;i<pos-1;i++)
{
bzero(buff,1024);
fgets(buff,1024,orifp);
if(buff==NULL)
{
fclose(orifp);
fclose(tmpfp);
return 0;
}
writesiz=fputs(buff,tmpfp);
if((unsigned int)writesiz<0)
{
fclose(orifp);
fclose(tmpfp);
return 0;
}
}
//
fgets(buff,1024,orifp);
str1=strstr(buff,"//");
//backup comment
if(str1!=NULL)
{
strncpy(aftersep,str1,1024);
}
str2=strstr(buff,"=");
memset(++str2,'/t',1);
strcpy(++str2,destvalue);
memset(str2+=strlen(destvalue),'/t',1);
str2++;
if(strlen(aftersep)>0)
{
strcpy(str2,aftersep);
str2+=strlen(aftersep);
}
fputs(buff,tmpfp);
while(fgets(buff,1024,orifp))
{
fputs(buff,tmpfp);
}
fclose(orifp);
fclose(tmpfp);
rename(tmpfilename,filefullname);
return sizeof(destvalue);
}
}
return 0;
}
/*****************************************
* 函数名:get_config_string
* 功能:获取配置
* 返回值:该健值在文件的多少行
* 参数:
* 作者:masathem@163.com
* 历史记录:
* 1.0 2007-4-7 complete
* ***************************************/
unsigned int get_config_string(
const char *node,//配置节点名,如:[SCP],!=NULL
const char *key,//配置项名,!=NULL
char *returnvalue,//存储配置值
unsigned int length,//returnvalue的最大长度
const char *defaultvalue,//默认值
const char *filefullname//配置文件名
)
{
search_status=I_START;
//return value
int nRet=1;
char buff[8019];
bzero(buff,8019);
char *tstr;
char *tstr1;
char *tstr2;
char *cRet=returnvalue;
bool IS_START=false;
//make sure all nessary para is not null
if(NULL==node||NULL==key||filefullname==NULL)
{
return 0;
}
//give the def
if(strlen(defaultvalue)>0)
{
strncpy(returnvalue,defaultvalue,strlen(defaultvalue)>length?length:strlen(defaultvalue));
}
FILE *fp=fopen(filefullname,"r");
if(fp)
{
while(fgets(buff,8019,fp)!=NULL&search_status!=I_ERR)
{
switch(search_status)
{
case I_START: //find the NODE
{
//if the NODE find in the line
if((tstr=strstr(buff,node))!=NULL)
{
tstr1=strstr(buff,COMMENT1);
tstr1=tstr1==NULL?tstr+1:tstr1;
tstr2=strstr(buff,COMMENT2);
tstr2=tstr2==NULL?tstr+1:tstr2;
//if find the NODE word postion in the left of comment1(2) is say NODE found
if(strlen(tstr)>strlen(tstr1)&strlen(tstr)>strlen(tstr2))
{
search_status=I_KEYFOUND;
}
}
break;
}
case I_KEYFOUND://find the keyvalue,it's end with meet first char is '['
{
if(buff[0]=='[')
{
search_status=I_ERR;
break;
}
if((tstr=strstr(buff,key))!=NULL)
{
tstr1=strstr(buff,COMMENT1);
tstr1=tstr1==NULL?tstr+1:tstr1;
tstr2=strstr(buff,COMMENT2);
tstr2=tstr2==NULL?tstr+1:tstr2;
//if find the keyword postion in the left of comment1(2) is say key found
if(strlen(tstr)>strlen(tstr1)&strlen(tstr)>strlen(tstr2))
{
tstr=strstr(tstr,"=");
tstr++;
while(*tstr!='/0')
{
if(*tstr!='/t'&*tstr!=' ')
{
IS_START=true;
*cRet=*tstr;
cRet++;
tstr++;
}
else
{
if(IS_START)
break;
tstr++;
}
}
fclose(fp);
return nRet;
}
}
break;
}
default:
break;
}
bzero(buff,8019);
nRet++;
}
}
fclose(fp);
return 0;
}