一. iniparser介绍
iniparser是一个C语言库,是针对INI文件的开源解析器。ini文件则是一些系统或者软件的配置文件。 iniparser可以对配置文件进行解析、添加、修改、删除等操作。git地址如下:
https://github.com/ndevilla/iniparser
二. iniparser的安装
1、下载iniparser
wget https://codeload.github.com/ndevilla/iniparser/tar.gz/refs/tags/v4.1 -O iniparserv4.1.tar.gz
2、解压
tar -zxvf iniparserv4.1.tar.gz
3、进入目录
cd iniparser-4.1/
4、在该目录下我们可以查看到src文件夹
huyuanzhuo@cloud-ubuntu18:~/iniparser/iniparser-4.1$ ls
AUTHORS doc example FAQ-en.md FAQ-zhcn.md html INSTALL LICENSE Makefile README.md src test
进入src文件夹可以看到我们所需要的主要代码
huyuanzhuo@cloud-ubuntu18:~/iniparser/iniparser-4.1$ cd src/
huyuanzhuo@cloud-ubuntu18:~/iniparser/iniparser-4.1/src$ ls
dictionary.c dictionary.h dictionary.o iniparser.c iniparser.h iniparser.o
三. API(应用编程程序接口)
dictionary.h里面声明了一些直接解析ini file的API,iniparser.h头文件里面声明了一些提供用户操作的API。iniparser.h里面的API是对dictionary.h里面API的再次封装,以提供用户友好性。
iniparser.h头文件里面的API
int iniparser_getnsec(dictionary * d); //获取dictionary对象的section个数
char * iniparser_getsecname(dictionary * d, int n); //获取dictionary对象的第n个section的名字
void iniparser_dump_ini(dictionary * d, FILE * f); //保存dictionary对象到file
void iniparser_dumpsection_ini(dictionary * d, char * s, FILE * f); //保存dictionary对象一个section到file
void iniparser_dump(dictionary * d, FILE * f); //保存dictionary对象到file
int iniparser_getsecnkeys(dictionary * d, char * s); //获取dictionary对象某个section下的key个数
char ** iniparser_getseckeys(dictionary * d, char * s); //获取dictionary对象某个section下所有的key
char * iniparser_getstring(dictionary * d, const char * key, char * def); //返回dictionary对象的section:key对应的字串值
int iniparser_getint(dictionary * d, const char * key, int notfound); //返回idictionary对象的section:key对应的整形值
double iniparser_getdouble(dictionary * d, const char * key, double notfound); //返回dictionary对象的section:key对应的双浮点值
int iniparser_getboolean(dictionary * d, const char * key, int notfound); //返回dictionary对象的section:key对应的布尔值
int iniparser_set(dictionary * ini, const char * entry, const char * val); //设置dictionary对象的某个section:key的值
void iniparser_unset(dictionary * ini, const char * entry); //删除dictionary对象中某个section:key
int iniparser_find_entry(dictionary * ini, const char * entry) ; //判断dictionary对象中是否存在某个section:key
dictionary * iniparser_load(const char * ininame); //解析dictionary对象并返回(分配内存)dictionary对象
void iniparser_freedict(dictionary * d); //释放dictionary对象(内存)
dictionary.h头文件里面的API
unsigned dictionary_hash(const char * key); //计算关键词的hash值
dictionary * dictionary_new(int size); //创建dictionary对象
void dictionary_del(dictionary * vd); //删除dictionary对象
char * dictionary_get(dictionary * d, const char * key, char * def); //获取dictionary对象的key值
int dictionary_set(dictionary * vd, const char * key, const char * val); //设置dictionary对象的key值
void dictionary_unset(dictionary * d, const char * key); //删除dictionary对象的key值
void dictionary_dump(dictionary * d, FILE * out); //保存dictionary对象
四. 使用iniparser库实现对ini配置文件的修改
ini配置文件
ini配置文件基本组成单元是key每个key都有一个对应的[name]和[value],如:start = 192.168.0.0
多个key也可以被归类为一组section:
如:
[ipaddrpool]
start =192.168.0.0
end =192.169.1.100
其中[ipaddpool]就是组名,组成员有“start”、“end”.
每个组下的key是唯一不能重复的,但不同组下可以存在相同的key.
注释以分号(;)开头
如: ;地址头
编写配置文件:
vim config.ini
[ipaddrpool]
start = 192.168.1.0
end = 192.168.1.100
[filepath]
leasefile = /var/dhcplease/dhcpd.leases
[network]
interface = en1
[opt]
dns1 = 8.8.8.8
dns2 = 8.8.8.8
subnet = 255.255.255.0
router = 192.168.3.1
domain = local
lease = 864
t1 = 432
t2 = 756
尝试编写iniparser程序对ini文件进行修改:
#include <stdio.h>
#include "iniparser.h"
#include "dictionary.h"
#define PATH "/home/liruiyan/iniparser/iniparser-4.1/src/config.ini"
int main (int argc, char **argv)
{
FILE *fp = NULL ;
dictionary *ini= NULL;
/* 解析dictionary对象并返回(分配内存)dictionary对象*/
ini = iniparser_load(PATH);
if( ini ==NULL)
{
printf("iniparser failure\n");
return -1;
}
/* 设置dictionary对象的某个section:key的值 */
iniparser_set(ini, "ipaddrpool:start", "192.168.0.0");
iniparser_set(ini, "ipaddrpool:end", "192.168.1.1");
/* 返回dictionary对象的section,key对应的字串值 */
printf("%s\n", iniparser_getstring(ini, "ipaddrpool:start", "null"));
printf("%s\n", iniparser_getstring(ini, "ipaddrpool:end", "null"));
printf("%s\n", iniparser_getstring(ini, "filepath:leasefile", "null"));
printf("%s\n", iniparser_getstring(ini, "network:interface", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:dns1", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:dns2", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:subnet", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:router", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:domain", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:lease", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:t1", "null"));
printf("%s\n", iniparser_getstring(ini, "opt:t2", "null"));
fp = fopen(PATH, "w");
if( fp == NULL ) {
printf("stone:fopen error!\n");
exit(-1);
}
/* 保存dictionary对象 */
iniparser_dumpsection_ini(ini, "ipaddrpool", fp);
iniparser_dumpsection_ini(ini, "filepath", fp);
iniparser_dumpsection_ini(ini, "network", fp);
iniparser_dumpsection_ini(ini, "opt", fp);
fclose(fp);
/* 释放dictionary对象(内存)*/
iniparser_freedict(ini);
return 0;
}
运行结果:
以上代码是修改地址池里面的ip,修改之后打开config_ini配置文件,可以看到配置文件里面的ip已经被修改。