openwrt中通过uci 系统保存的参数都存放在/etc/config/
目录下面,保存参数的具体文件与用户自己的使用的commit语句中参数有关。
例如:uci commit system
该语句保存配置的文件就在 /etc/config/system
配置参数的保存的按照一定格式保存例:
config wifidetect 'servercfg'
option device_id '123456'
option servernumber '1'
以上参数可通过uci 语句uci set system.servercfg.device_id=xxx设置。
请注意参数的保存和格式,每行保存一个参数,且参数格式满足option空格${参数名}空格'${value}',所以为了精确的找到值我们只需要每次取一行去匹配字符串就好。代码如下:
int get_para_from_string(const char* data, const char* name, char* val, const int maxlen)
{
int i;
char key_name[64] = {0};
char *start = NULL;
if(val == NULL)
return -1;
sprintf(key_name, " %s \'", name);//config file key style
if((start = strstr(data, key_name)) == NULL)
return -1;
i = 0;
start = start + strlen(key_name);
while(start[i]!='\'' && start[i] != '\0')
{
val[i] = start[i];
i++;
if(i > maxlen)
break;
}
//printf("%s=%s\n", name, val);
if(i == 0)
return -1;
else
return 0;
}
#define SYSTEM_CONFIG_FILE_USR '/etc/config/system'
int get_sys_config(void)
{
FILE * sys_config=NULL;
char readtmpdata[256];
char tmp_str[64];
char str_data[64]={0};
int num_data = 0;
sys_config = fopen(SYSTEM_CONFIG_FILE_USR, "r");
if(sys_config == NULL)
{
printf("Open sys_config file failed!\n");
return -1;
}
while(!feof(sys_config))
{
memset(readtmpdata, 0, sizeof(readtmpdata));
memset(tmp_str, 0, sizeof(tmp_str));
fgets(readtmpdata, sizeof(readtmpdata), sys_config);
if(get_para_from_string(readtmpdata, "server", str_data, 64) == 0){
printf("get server %s\n", str_data);
}
else if(get_para_from_string(readtmpdata, "port", tmp_str, 32) ==0){
num_data = atoi(tmp_str);
printf("get port %s\n", num_data);
}
}
fclose(sys_config);
return 0;
}
参数是完全匹配,所以允许关键词存在包含关系,也就是说允许同时存在server
和fakeserver
。