From b359b185d54e47a38cdf2e68d0e32811c33e1a00 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Wed, 8 Feb 2017 15:05:19 +1100 Subject: [PATCH] util/disk_cache: use stat() to check if entry is a directory d_type is not supported on all systems. --- src/util/disk_cache.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index a70bd66..7691621 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -437,7 +437,8 @@ make_cache_file_directory(struct disk_cache *cache, cache_key key) */ static char * choose_random_file_matching(const char *dir_path, - bool (*predicate)(struct dirent *)) + bool (*predicate)(struct dirent *, + const char *dir_path)) { DIR *dir; struct dirent *entry; @@ -454,7 +455,7 @@ choose_random_file_matching(const char *dir_path, entry = readdir(dir); if (entry == NULL) break; - if (! predicate(entry)) + if (!predicate(entry, dir_path)) continue; count++; @@ -474,7 +475,7 @@ choose_random_file_matching(const char *dir_path, entry = readdir(dir); if (entry == NULL) break; - if (! predicate(entry)) + if (!predicate(entry, dir_path)) continue; if (count == victim) break; @@ -499,14 +500,19 @@ choose_random_file_matching(const char *dir_path, * ".tmp" */ static bool -is_regular_non_tmp_file(struct dirent *entry) +is_regular_non_tmp_file(struct dirent *entry, const char *path) { - size_t len; + char *filename; + asprintf(&filename, "%s/%s", path, entry->d_name); + + struct stat sb; + stat(filename, &sb); + free(filename); - if (entry->d_type != DT_REG) + if (!S_ISREG(sb.st_mode)) return false; - len = strlen (entry->d_name); + size_t len = strlen (entry->d_name); if (len >= 4 && strcmp(&entry->d_name[len-4], ".tmp") == 0) return false; @@ -540,9 +546,16 @@ unlink_random_file_from_directory(const char *path) * special name of "..") */ static bool -is_two_character_sub_directory(struct dirent *entry) +is_two_character_sub_directory(struct dirent *entry, const char *path) { - if (entry->d_type != DT_DIR) + char *subdir; + asprintf(&subdir, "%s/%s", path, entry->d_name); + + struct stat sb; + stat(path, &sb); + free(subdir); + + if (!S_ISDIR(sb.st_mode)) return false; if (strlen(entry->d_name) != 2) -- 2.9.3