diff --git a/src/fileio.cpp b/src/fileio.cpp index 92707b58e4..13b0e26f5b 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -68,7 +68,7 @@ TarFileList _tar_filelist[NUM_SUBDIRS]; typedef std::map TarLinkList; static TarLinkList _tar_linklist[NUM_SUBDIRS]; ///< List of directory links -extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb); +extern bool FiosIsValidFile(const std::string &path, const struct dirent *ent, struct stat *sb); /** * Checks whether the given search path is a valid search path diff --git a/src/fios.cpp b/src/fios.cpp index f5444fdb0b..2f33f40cfc 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -36,7 +36,7 @@ SortingBits _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING; /* OS-specific functions are taken from their respective files (win32/unix/os2 .c) */ extern bool FiosIsRoot(const char *path); -extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb); +extern bool FiosIsValidFile(const std::string &path, const struct dirent *ent, struct stat *sb); extern bool FiosIsHiddenFile(const struct dirent *ent); extern void FiosGetDrives(FileList &file_list); extern bool FiosGetDiskFreeSpace(const char *path, uint64 *tot); @@ -381,7 +381,7 @@ static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *c std::string d_name = FS2OTTD(dirent->d_name); /* found file must be directory, but not '.' or '..' */ - if (FiosIsValidFile(_fios_path->c_str(), dirent, &sb) && S_ISDIR(sb.st_mode) && + if (FiosIsValidFile(*_fios_path, dirent, &sb) && S_ISDIR(sb.st_mode) && (!FiosIsHiddenFile(dirent) || StrStartsWithIgnoreCase(PERSONAL_DIR, d_name)) && d_name != "." && d_name != "..") { fios = &file_list.emplace_back(); diff --git a/src/os/os2/os2.cpp b/src/os/os2/os2.cpp index 235478ff27..e3913d7289 100644 --- a/src/os/os2/os2.cpp +++ b/src/os/os2/os2.cpp @@ -120,12 +120,10 @@ bool FiosGetDiskFreeSpace(const char *path, uint64 *tot) #endif } -bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb) +bool FiosIsValidFile(const std::string &path, const struct dirent *ent, struct stat *sb) { - char filename[MAX_PATH]; - - snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, ent->d_name); - return stat(filename, sb) == 0; + std::string filename = fmt::format("{}" PATHSEP "{}", path, ent->d_name); + return stat(filename.c_str(), sb) == 0; } bool FiosIsHiddenFile(const struct dirent *ent) diff --git a/src/os/unix/unix.cpp b/src/os/unix/unix.cpp index 8fa259454b..0f18a977e1 100644 --- a/src/os/unix/unix.cpp +++ b/src/os/unix/unix.cpp @@ -86,18 +86,13 @@ bool FiosGetDiskFreeSpace(const char *path, uint64 *tot) return true; } -bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb) +bool FiosIsValidFile(const std::string &path, const struct dirent *ent, struct stat *sb) { - char filename[MAX_PATH]; - int res; - assert(path[strlen(path) - 1] == PATHSEPCHAR); - if (strlen(path) > 2) assert(path[strlen(path) - 2] != PATHSEPCHAR); - res = seprintf(filename, lastof(filename), "%s%s", path, ent->d_name); + assert(path.back() == PATHSEPCHAR); + if (path.size() > 2) assert(path[path.size() - 2] != PATHSEPCHAR); + std::string filename = fmt::format("{}{}", path, ent->d_name); - /* Could we fully concatenate the path and filename? */ - if (res >= (int)lengthof(filename) || res < 0) return false; - - return stat(filename, sb) == 0; + return stat(filename.c_str(), sb) == 0; } bool FiosIsHiddenFile(const struct dirent *ent) diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index affa3c9dc9..54bf06249f 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -190,7 +190,7 @@ void FiosGetDrives(FileList &file_list) } } -bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb) +bool FiosIsValidFile(const std::string &path, const struct dirent *ent, struct stat *sb) { /* hectonanoseconds between Windows and POSIX epoch */ static const int64 posix_epoch_hns = 0x019DB1DED53E8000LL;