Linux C代码实现读取配置文件示例

来源:互联网 发布:linux连接工具 ssh 编辑:程序博客网 时间:2024/05/18 03:27

最近在看hostapd,该程序使用了conf配置文件,本文参考hostapd代码抽取出读取配置文件的示例,由于配置选项和业务密切相关,实际使用中仍需要做修改。

下面是代码示例:

/**读配置文件示例注:配置文件必须为unix格式,即\n结尾*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <stdint.h>// 结构体struct hostapd_config{    char iface[16];    uint16_t beacon_int;    uint8_t channel;    char country[3]; /* first two octets: country code as described in              * ISO/IEC 3166-1. Third octet:              * ' ' (ascii 32): all environments              * 'O': Outdoor environemnt only              * 'I': Indoor environment only              */};// 默认值struct hostapd_config * config_defaults(void){    struct hostapd_config *conf = NULL;    conf = (struct hostapd_config *)calloc(1, sizeof(*conf));    if (conf == NULL)    {        return NULL;    }    // set default value    conf->beacon_int = 100;    conf->channel = 1;    return conf;}// 根据读取到的信息填充结构体static int config_defaults(struct hostapd_config *conf, const char *buf, char *pos, int line){    if (strcmp(buf, "interface") == 0)    {        strncpy(conf->iface, pos, sizeof(conf->iface));    }    else if (strcmp(buf, "channel") == 0)    {        int val = atoi(pos);        conf->channel = val;    }    else if (strcmp(buf, "beacon_int") == 0)    {        int val = atoi(pos);        conf->beacon_int = val;    }    else if (strcmp(buf, "country_code") == 0)    {        memcpy(conf->country, pos, 2);        conf->country[2] = ' ';    }    // more ...    return 0;}//////////////////////////////////////// 读配置文件struct hostapd_config* config_read(const char *fname){    struct hostapd_config *conf = NULL;    FILE *f = NULL;    char buf[1024] = {0};    char *pos = NULL;    int line = 0;    int errors = 0;        f = fopen(fname, "r");    if (f == NULL)    {        printf("Could not open configuration file '%s' for reading.\n", fname);        return NULL;    }        conf = config_defaults();    if (conf == NULL)    {        fclose(f);        return NULL;    }        while (fgets(buf, sizeof(buf), f))    {        line++;        if (buf[0] == '#')            continue;        pos = buf;        while (*pos != '\0')        {            if (*pos == '\n')            {                *pos = '\0';                break;            }            pos++;        }        if (buf[0] == '\0')            continue;        pos = strchr(buf, '=');        if (pos == NULL) {            printf("Line %d: invalid line '%s'\n", line, buf);            errors++;            continue;        }        *pos = '\0';        pos++;        errors += config_defaults(conf, buf, pos, line);    }    fclose(f);    return conf;}/////////////////////////////////////int main(int argc, char *argv[]){    const char* conf_file = "foo.conf";    if (argc == 2)    {        conf_file = argv[1];    }    struct hostapd_config *conf = NULL;        conf = config_read(conf_file);    if (conf == NULL)    {        printf("failed to read file: %s\n", conf_file);        return -1;    }    printf("%d %s %s\n", conf->channel, conf->country, conf->iface);    return 0;}

李迟 2016.8.21 周日

0 0
原创粉丝点击