diff --git a/libretro-common/file/retro_dirent.c b/libretro-common/file/retro_dirent.c index e50973b5be..c21b2d669c 100644 --- a/libretro-common/file/retro_dirent.c +++ b/libretro-common/file/retro_dirent.c @@ -235,6 +235,16 @@ bool retro_dirent_is_dir(struct RDIR *rdir, const char *path) #endif } +void retro_dirent_include_hidden(struct RDIR *rdir, bool include_hidden) +{ +#ifdef _WIN32 + if (include_hidden) + rdir->entry.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; + else + rdir->entry.dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN; +#endif +} + void retro_closedir(struct RDIR *rdir) { if (!rdir) diff --git a/libretro-common/include/retro_dirent.h b/libretro-common/include/retro_dirent.h index d41a21211d..090076ec64 100644 --- a/libretro-common/include/retro_dirent.h +++ b/libretro-common/include/retro_dirent.h @@ -38,6 +38,8 @@ int retro_readdir(struct RDIR *rdir); bool retro_dirent_error(struct RDIR *rdir); +void retro_dirent_include_hidden(struct RDIR *rdir, bool include_hidden); + const char *retro_dirent_get_name(struct RDIR *rdir); /** diff --git a/libretro-common/lists/dir_list.c b/libretro-common/lists/dir_list.c index 2306eff68f..73148c83e3 100644 --- a/libretro-common/lists/dir_list.c +++ b/libretro-common/lists/dir_list.c @@ -174,21 +174,10 @@ static int dir_list_read(const char *dir, { struct RDIR *entry = retro_opendir(dir); - if (!entry) - return -1; + if (!entry || retro_dirent_error(entry)) + goto error; - if (retro_dirent_error(entry)) - { - retro_closedir(entry); - return -1; - } - -#ifdef _WIN32 - if (include_hidden) - entry->entry.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; - else - entry->entry.dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN; -#endif + retro_dirent_include_hidden(entry, include_hidden); while (retro_readdir(entry)) { @@ -222,10 +211,7 @@ static int dir_list_read(const char *dir, include_dirs, include_compressed, list, ext_list, file_ext); if (ret == -1) - { - retro_closedir(entry); - return -1; - } + goto error; if (ret == 1) continue; @@ -234,6 +220,11 @@ static int dir_list_read(const char *dir, retro_closedir(entry); return 0; + +error: + if (entry) + retro_closedir(entry); + return -1; } /**