From a4216e907b3e139589b5fcee35874b670f985b89 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Wed, 21 Aug 2024 10:57:47 +0800 Subject: [PATCH] Add .ini parser example code --- booster/testcase/etc/example.conf | 15 +++ booster/testcase/conf.c | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+), 0 deletions(-) diff --git a/booster/testcase/conf.c b/booster/testcase/conf.c new file mode 100644 index 0000000..54df0be --- /dev/null +++ b/booster/testcase/conf.c @@ -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; +} diff --git a/booster/testcase/etc/example.conf b/booster/testcase/etc/example.conf new file mode 100644 index 0000000..6c217b9 --- /dev/null +++ b/booster/testcase/etc/example.conf @@ -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 -- Gitblit v1.9.1