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