diff --git a/src/dns_conf.c b/src/dns_conf.c index 3bf0467..c8e6cbe 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -2957,7 +2957,7 @@ int config_additional_file(void *data, int argc, char *argv[]) conf_file = argv[1]; if (conf_file[0] != '/') { safe_strncpy(file_path_dir, conf_get_conf_file(), DNS_MAX_PATH); - dirname(file_path_dir); + dir_name(file_path_dir); if (strncmp(file_path_dir, conf_get_conf_file(), sizeof(file_path_dir)) == 0) { if (snprintf(file_path, DNS_MAX_PATH, "%s", conf_file) < 0) { return -1; diff --git a/src/lib/conf.c b/src/lib/conf.c index 1127aa9..7669156 100644 --- a/src/lib/conf.c +++ b/src/lib/conf.c @@ -32,6 +32,16 @@ const char *conf_get_conf_file(void) return current_conf_file; } +static char *get_dir_name(char *path) +{ + if (strstr(path, "/") == NULL) { + strncpy(path, "./", PATH_MAX); + return path; + } + + return dirname(path); +} + const char *conf_get_conf_fullpath(const char *path, char *fullpath, size_t path_len) { char file_path_dir[PATH_MAX]; @@ -47,7 +57,7 @@ const char *conf_get_conf_fullpath(const char *path, char *fullpath, size_t path strncpy(file_path_dir, conf_get_conf_file(), PATH_MAX - 1); file_path_dir[PATH_MAX - 1] = 0; - dirname(file_path_dir); + get_dir_name(file_path_dir); if (file_path_dir[0] == '\0') { strncpy(fullpath, path, path_len); return fullpath; diff --git a/src/smartdns.c b/src/smartdns.c index 65774f3..50fd995 100644 --- a/src/smartdns.c +++ b/src/smartdns.c @@ -542,7 +542,7 @@ static int _smartdns_create_logdir(void) int gid = 0; char logdir[PATH_MAX] = {0}; safe_strncpy(logdir, _smartdns_log_path(), PATH_MAX); - dirname(logdir); + dir_name(logdir); if (access(logdir, F_OK) == 0) { return 0; diff --git a/src/util.c b/src/util.c index add7942..fcf63c8 100644 --- a/src/util.c +++ b/src/util.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -109,6 +110,16 @@ unsigned long get_tick_count(void) return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000); } +char *dir_name(char *path) +{ + if (strstr(path, "/") == NULL) { + safe_strncpy(path, "./", PATH_MAX); + return path; + } + + return dirname(path); +} + char *get_host_by_addr(char *host, int maxsize, struct sockaddr *addr) { struct sockaddr_storage *addr_store = (struct sockaddr_storage *)addr; diff --git a/src/util.h b/src/util.h index 4ffb70d..5816cc0 100644 --- a/src/util.h +++ b/src/util.h @@ -55,6 +55,8 @@ void bug_ext(const char *file, int line, const char *func, const char *errfmt, . unsigned long get_tick_count(void); +char *dir_name(char *path); + char *get_host_by_addr(char *host, int maxsize, struct sockaddr *addr); int getaddr_by_host(const char *host, struct sockaddr *addr, socklen_t *addr_len);