LingYun Studio embeded system framwork software, such as thirdparty build shell and lingyun library
guowenxue
2024-08-21 a4216e907b3e139589b5fcee35874b670f985b89
Add .ini parser example code
2 files added
217 ■■■■■ changed files
booster/testcase/conf.c 202 ●●●●● patch | view | raw | blame | history
booster/testcase/etc/example.conf 15 ●●●●● patch | view | raw | blame | history
booster/testcase/conf.c
New file
@@ -0,0 +1,202 @@
/*********************************************************************************
 *      Copyright:  (C) 2012 Guo Wenxue <guowenxue@gmail.com>
 *                  All rights reserved.
 *
 *       Filename:  conf.c
 *    Description:  This is the .ini configure file parser example code.
 *
 *         Notice:  Default configure file: etc/example.conf
 *                  Default logger file   : /tmp/test.log
 *
 *        Version:  1.0.0(08/08/2012~)
 *         Author:  Guo Wenxue <guowenxue@gmail.com>
 *      ChangeLog:  1, Release initial version on "08/08/2012 06:51:40 PM"
 *
 ********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
#include <libgen.h>
#include <string.h>
#include <errno.h>
#include "iniparser.h"
#include "logger.h"
typedef struct log_conf_s
{
    char            file[128]; /* logger file */
    int             level;     /* logger level */
    int             size;      /* logger file maxsize, oversize will rollback */
} log_conf_t;
typedef struct sock_conf_s
{
    char            host[128];  /* socker server host name */
    int             port;       /* socket server listen port */
} sock_conf_t;
typedef struct conf_ctx_s
{
    log_conf_t       logger;
    sock_conf_t      sock;
} conf_ctx_t;
static void program_usage(char *progname)
{
    printf("Usage: %s [OPTION]...\n", progname);
    printf(" %s is an .ini parser example program.\n", progname);
    printf("\nMandatory arguments to long options are mandatory for short options too:\n");
    printf(" -c[conf    ]  Specify configure file\n");
    printf(" -d[debug   ]  Running in debug mode\n");
    printf(" -h[help    ]  Display this help information\n");
    printf("\n%s version v1.0.0\n", progname);
    return;
}
int parser_conf(const char *conf_file, conf_ctx_t *conf, int debug);
int main (int argc, char **argv)
{
    char               *conf_file="etc/example.conf";
    char               *progname=NULL;
    int                 debug = 0;
    int                 opt;
    conf_ctx_t          conf;
    struct option long_options[] = {
        {"conf", required_argument, NULL, 'c'},
        {"debug", no_argument, NULL, 'd'},
        {"help", no_argument, NULL, 'h'},
        {NULL, 0, NULL, 0}
    };
    progname = (char *)basename(argv[0]);
    /* parser the command line parameters */
    while ((opt = getopt_long(argc, argv, "c:dh", long_options, NULL)) != -1)
    {
        switch (opt)
        {
            case 'c': /* change default configure file */
                conf_file = optarg;
                break;
            case 'd': /* set debug running */
                debug = 1;
                break;
            case 'h': /* print help information */
                program_usage(progname);
                return 0;
            default:
                break;
        }
    }
    if( !conf_file )
        return 1;
    if( parser_conf(conf_file, &conf, debug) < 0 )
    {
        fprintf(stderr, "Parser configure file '%s' failure\n", conf_file);
        return 2;
    }
    log_warn("Parser configure file '%s' successfully\n", conf_file);
cleanup:
    log_close();
    return 0;
}
int parser_conf(const char *conf_file, conf_ctx_t *conf, int debug)
{
    dictionary         *ini;
    const char         *str;
    int                 val;
    int                 rv = 0;
    log_conf_t         *logger;
    sock_conf_t        *sock;
    if( !conf_file || !conf )
    {
        fprintf(stderr, "%s() Invalid input arguments\n", __func__);
        return -1;
    }
    memset(conf, 0, sizeof(*conf));
    logger = &conf->logger;
    sock = &conf->sock;
    ini = iniparser_load(conf_file);
    if( !ini )
    {
        fprintf(stderr, "ERROR: Configure file '%s' load failed\n", conf_file);
        return -2;
    }
    /*+------------------------------------------------------+
     *|    parser logger settings and start logger system    |
     *+------------------------------------------------------+*/
    if( !debug )
    {
        str = iniparser_getstring(ini, "logger:file", "iotd.log");
        strncpy(logger->file, str, sizeof(logger->file));
        logger->size = iniparser_getint(ini, "logger:size", 1024);
        logger->level = iniparser_getint(ini, "logger:level", LOG_LEVEL_INFO);
    }
    else
    {
        strncpy(logger->file, "console", sizeof(logger->file));
        logger->level = LOG_LEVEL_DEBUG;
        logger->size = 0;
    }
    if( log_open(logger->file, logger->level, logger->size, LOG_LOCK_DISABLE) < 0 )
    {
        fprintf(stderr, "Logger system initialise failure\n");
        rv = -3;
        goto cleanup;
    }
    /*+------------------------------------------------------+
     *|          parser socket server settings               |
     *+------------------------------------------------------+*/
    if( !(str=iniparser_getstring(ini, "server:hostname", NULL)) )
    {
        log_error("ERROR: Parser socket server hostname failure\n");
        rv = -4;
        goto cleanup;
    }
    strncpy(sock->host, str, sizeof(sock->host) );
    if( (val=iniparser_getint(ini, "server:port", -1)) < 0 )
    {
        log_error("ERROR: Parser socket server port failure\n");
        rv = -5;
        goto cleanup;
    }
    sock->port = val;
    log_info("Parser socket server [%s:%d]\n", sock->host, sock->port);
cleanup:
    if( ini )
        iniparser_freedict(ini);
    if( rv )
        log_close();
    return rv;
}
booster/testcase/etc/example.conf
New file
@@ -0,0 +1,15 @@
[logger]
# logger file path
file=/tmp/test.log
# logger level: 0:ERROR 1:WARN 2:INFO 3:DEBUG 4:TRACE
level=2
# logger rollback file size
size=1024
[server]
hostname=weike-iot.com
port=12345