From 71e110748bfb2dddb43d631644911b1cc13e6531 Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Fri, 25 Jan 2019 21:00:16 +0800 Subject: [PATCH] Add config load error log --- src/dns_conf.c | 25 ++++++++++++++++++++++--- src/include/conf.h | 9 +++++++-- src/lib/conf.c | 33 +++++++++++++++++++++++++-------- src/smartdns.c | 2 ++ 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/dns_conf.c b/src/dns_conf.c index e722851..0319e10 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -8,6 +8,7 @@ #include #include #include + #include #define DEFAULT_DNS_CACHE_SIZE 512 @@ -707,6 +708,21 @@ struct config_item config_item[] = { CONF_END(), }; +int conf_printf(const char *file, int lineno, int ret) +{ + if (ret == CONF_RET_ERR) { + tlog(TLOG_ERROR, "process config file '%s' failed at line %d.", file, lineno); + syslog(LOG_NOTICE, "process config file '%s' failed at line %d.", file, lineno); + return -1; + } else if (ret == CONF_RET_WARN) { + tlog(TLOG_WARN, "process config file '%s' failed at line %d.", file, lineno); + syslog(LOG_NOTICE, "process config file '%s' failed at line %d.", file, lineno); + return -1; + } + + return 0; +} + int config_addtional_file(void *data, int argc, char *argv[]) { char *file_path = argv[1]; @@ -716,7 +732,7 @@ int config_addtional_file(void *data, int argc, char *argv[]) return 0; } - return load_conf(file_path, config_item); + return load_conf(file_path, config_item, conf_printf); } int _dns_server_load_conf_init(void) @@ -741,7 +757,10 @@ void dns_server_load_exit(void) int dns_server_load_conf(const char *file) { + int ret = 0; _dns_server_load_conf_init(); - - return load_conf(file, config_item); + openlog ("smartdns", LOG_CONS | LOG_NDELAY, LOG_LOCAL1); + ret = load_conf(file, config_item, conf_printf); + closelog(); + return ret; } diff --git a/src/include/conf.h b/src/include/conf.h index bc6bab0..c9ac0fa 100644 --- a/src/include/conf.h +++ b/src/include/conf.h @@ -8,6 +8,11 @@ #define CONF_INT_MAX (~(1 << 31)) #define CONF_INT_MIN (1 << 31) +#define CONF_RET_OK 0 +#define CONF_RET_ERR -1 +#define CONF_RET_WARN -2 +#define CONF_RET_NOENT -3 + struct config_item { const char *item; int (*item_func)(const char *item, void *data, int argc, char *argv[]); @@ -107,9 +112,9 @@ extern int conf_size(const char *item, void *data, int argc, char *argv[]); * */ -int load_conf(const char *file, struct config_item items[]); +typedef int(conf_error_handler)(const char *file, int lineno, int ret); -int load_conf_get_line_count(void); +int load_conf(const char *file, struct config_item items[], conf_error_handler handler); void load_exit(void); diff --git a/src/lib/conf.c b/src/lib/conf.c index 78a956a..918ab23 100644 --- a/src/lib/conf.c +++ b/src/lib/conf.c @@ -5,8 +5,6 @@ #include #include -__thread int line_no; - int conf_custom(const char *item, void *data, int argc, char *argv[]) { struct config_item_custom *item_custom = data; @@ -182,12 +180,21 @@ void load_exit(void) return; } -int load_conf_get_line_count(void) +int load_conf_printf(const char *file, int lineno, int ret) { - return line_no; + if (ret != CONF_RET_OK) { + printf("process config file '%s' failed at line %d.", file, lineno); + if (ret == CONF_RET_ERR || ret == CONF_RET_NOENT) { + return -1; + } + + return 0; + } + + return 0; } -int load_conf_file(const char *file, struct config_item *items) +int load_conf_file(const char *file, struct config_item *items, conf_error_handler handler) { FILE *fp = NULL; char line[MAX_LINE_LEN]; @@ -197,6 +204,13 @@ int load_conf_file(const char *file, struct config_item *items) int i; int argc; char *argv[1024]; + int ret = 0; + int call_ret = 0; + int line_no = 0; + + if (handler == NULL) { + handler = load_conf_printf; + } fp = fopen(file, "r"); if (fp == NULL) { @@ -223,6 +237,7 @@ int load_conf_file(const char *file, struct config_item *items) for (i = 0;; i++) { if (items[i].item == NULL) { + handler(file, line_no, CONF_RET_NOENT); break; } @@ -236,7 +251,9 @@ int load_conf_file(const char *file, struct config_item *items) conf_getopt_reset(); /* call item function */ - if (items[i].item_func(items[i].item, items[i].data, argc, argv) != 0) { + call_ret = items[i].item_func(items[i].item, items[i].data, argc, argv); + ret = handler(file, line_no, call_ret); + if (ret != 0) { conf_getopt_reset(); goto errout; } @@ -257,7 +274,7 @@ errout: return -1; } -int load_conf(const char *file, struct config_item items[]) +int load_conf(const char *file, struct config_item items[], conf_error_handler handler) { - return load_conf_file(file, items); + return load_conf_file(file, items, handler); } diff --git a/src/smartdns.c b/src/smartdns.c index fadb887..1c69ed6 100644 --- a/src/smartdns.c +++ b/src/smartdns.c @@ -384,6 +384,8 @@ int main(int argc, char *argv[]) } if (dns_server_load_conf(config_file) != 0) { + fprintf(stderr, "load config failed.\n"); + goto errout; } if (create_pid_file(pid_file) != 0) {