diff --git a/src/dns_conf.c b/src/dns_conf.c index 0ebcfc0099..8d210d8dc0 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -1527,7 +1527,7 @@ static int _conf_domain_rule_address(char *domain, const char *domain_address) field = ptr; ptr = strstr(ptr, ","); - if (field == NULL) { + if (field == NULL || *field == '\0') { break; } @@ -1657,7 +1657,8 @@ static int _conf_domain_rule_address(char *domain, const char *domain_address) _dns_rule_put(address); } - tlog(TLOG_ERROR, "add address %s, %s failed", domain, domain_address); + tlog(TLOG_ERROR, "add address %s, %s at %s:%d failed", domain, domain_address, conf_get_conf_file(), + conf_get_current_lineno()); return 0; } diff --git a/src/include/conf.h b/src/include/conf.h index e2016626c9..c3a7067d41 100644 --- a/src/include/conf.h +++ b/src/include/conf.h @@ -189,6 +189,8 @@ int load_conf(const char *file, struct config_item items[], conf_error_handler h void load_exit(void); +int conf_get_current_lineno(void); + const char *conf_get_conf_file(void); const char *conf_get_conf_fullpath(const char *path, char *fullpath, size_t path_len); diff --git a/src/lib/conf.c b/src/lib/conf.c index eb3f6c5a25..4e2c749a68 100644 --- a/src/lib/conf.c +++ b/src/lib/conf.c @@ -26,12 +26,18 @@ #include static const char *current_conf_file = NULL; +static int current_conf_lineno = 0; const char *conf_get_conf_file(void) { return current_conf_file; } +int conf_get_current_lineno(void) +{ + return current_conf_lineno; +} + static char *get_dir_name(char *path) { if (strstr(path, "/") == NULL) { @@ -355,6 +361,8 @@ static int load_conf_file(const char *file, struct config_item *items, conf_erro int line_no = 0; int line_len = 0; int read_len = 0; + int is_last_line_wrap = 0; + int current_line_wrap = 0; const char *last_file = NULL; if (handler == NULL) { @@ -368,14 +376,44 @@ static int load_conf_file(const char *file, struct config_item *items, conf_erro line_no = 0; while (fgets(line + line_len, MAX_LINE_LEN - line_len, fp)) { + current_line_wrap = 0; line_no++; read_len = strnlen(line + line_len, sizeof(line)); if (read_len >= 2 && *(line + line_len + read_len - 2) == '\\') { - line_len += read_len - 2; + read_len -= 1; + current_line_wrap = 1; + } + + /* comment in wrap line, skip */ + if (is_last_line_wrap && read_len > 0) { + if (*(line + line_len) == '#') { + continue; + } + } + + /* trim prefix spaces in wrap line */ + if ((current_line_wrap == 1 || is_last_line_wrap == 1) && read_len > 0) { + is_last_line_wrap = current_line_wrap; + read_len -= 1; + for (i = 0; i < read_len; i++) { + char *ptr = line + line_len + i; + if (*ptr == ' ' || *ptr == '\t') { + continue; + } + + memmove(line + line_len, ptr, read_len - i + 1); + line_len += read_len - i; + break; + } + line[line_len] = '\0'; - continue; + if (current_line_wrap) { + continue; + } } + line_len = 0; + is_last_line_wrap = 0; filed_num = sscanf(line, "%63s %8191[^\r\n]s", key, value); if (filed_num <= 0) { @@ -419,6 +457,7 @@ static int load_conf_file(const char *file, struct config_item *items, conf_erro /* call item function */ last_file = current_conf_file; current_conf_file = file; + current_conf_lineno = line_no; call_ret = items[i].item_func(items[i].item, items[i].data, argc, argv); ret = handler(file, line_no, call_ret); if (ret != 0) {