/********************************************************************************* * Copyright: (C) 2012 Guo Wenxue * 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 * ChangeLog: 1, Release initial version on "08/08/2012 06:51:40 PM" * ********************************************************************************/ #include #include #include #include #include #include #include #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; }