openwrt中uci配置参数读取

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;
}

参数是完全匹配,所以允许关键词存在包含关系,也就是说允许同时存在serverfakeserver。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值