mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-29 18:50:10 +01:00
util/disk_cache: use stat() to check if entry is a directory
d_type is not supported on all systems. Tested-by: Vinson Lee <vlee@freedesktop.org> Reviewed-by: Emil Velikov <emil.velikov@collabora.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97967
This commit is contained in:
parent
463236bd31
commit
d7b3707c61
1 changed files with 25 additions and 10 deletions
|
|
@ -375,7 +375,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;
|
||||
|
|
@ -392,7 +393,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++;
|
||||
|
|
@ -412,7 +413,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;
|
||||
|
|
@ -437,14 +438,20 @@ 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;
|
||||
|
||||
if (entry->d_type != DT_REG)
|
||||
char *filename;
|
||||
if (asprintf(&filename, "%s/%s", path, entry->d_name) == -1)
|
||||
return false;
|
||||
|
||||
len = strlen (entry->d_name);
|
||||
struct stat sb;
|
||||
stat(filename, &sb);
|
||||
free(filename);
|
||||
|
||||
if (!S_ISREG(sb.st_mode))
|
||||
return false;
|
||||
|
||||
size_t len = strlen (entry->d_name);
|
||||
if (len >= 4 && strcmp(&entry->d_name[len-4], ".tmp") == 0)
|
||||
return false;
|
||||
|
||||
|
|
@ -478,9 +485,17 @@ 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;
|
||||
if (asprintf(&subdir, "%s/%s", path, entry->d_name) == -1)
|
||||
return false;
|
||||
|
||||
struct stat sb;
|
||||
stat(path, &sb);
|
||||
free(subdir);
|
||||
|
||||
if (!S_ISDIR(sb.st_mode))
|
||||
return false;
|
||||
|
||||
if (strlen(entry->d_name) != 2)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue