/*********************************************************************************
|
* 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;
|
}
|