diff --git a/fios.c b/fios.c index 950e26a23e..fb54c0ce9d 100644 --- a/fios.c +++ b/fios.c @@ -20,7 +20,6 @@ # include #else # include -# include #endif /* WIN32 */ /* Variables to display file lists */ @@ -201,6 +200,7 @@ static FiosItem *FiosGetFileList(int mode, fios_getlist_callback_proc *callback_ DIR *dir; FiosItem *fios; int sort_start; + char d_name[sizeof(fios->name)]; /* A parent directory link exists if we are not in the root directory */ if (!FiosIsRoot(_fios_path) && mode != SLD_NEW_GAME) { @@ -212,9 +212,9 @@ static FiosItem *FiosGetFileList(int mode, fios_getlist_callback_proc *callback_ } /* Show subdirectories */ - if (mode != SLD_NEW_GAME && (dir = opendir(_fios_path)) != NULL) { + if (mode != SLD_NEW_GAME && (dir = ttd_opendir(_fios_path)) != NULL) { while ((dirent = readdir(dir)) != NULL) { - const char *d_name = FS2OTTD(dirent->d_name); + ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name)); /* found file must be directory, but not '.' or '..' */ if (FiosIsValidFile(_fios_path, dirent, &sb) && (sb.st_mode & S_IFDIR) && @@ -242,13 +242,13 @@ static FiosItem *FiosGetFileList(int mode, fios_getlist_callback_proc *callback_ sort_start = _fios_count; /* Show files */ - dir = opendir(_fios_path); + dir = ttd_opendir(_fios_path); if (dir != NULL) { while ((dirent = readdir(dir)) != NULL) { char fios_title[64]; char *t; - char *d_name = (char*)FS2OTTD(dirent->d_name); byte type; + ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name)); if (!FiosIsValidFile(_fios_path, dirent, &sb) || !(sb.st_mode & S_IFREG)) continue; diff --git a/fios.h b/fios.h index 85d0b6041d..591297076c 100644 --- a/fios.h +++ b/fios.h @@ -77,10 +77,25 @@ struct DIR { bool at_first_entry; }; -DIR *opendir(const char *path); +DIR *opendir(const wchar_t *path); struct dirent *readdir(DIR *d); int closedir(DIR *d); - +#else +/* Use system-supplied opendir/readdir/closedir functions */ +# include +# include #endif /* defined(WIN32) */ +/** + * A wrapper around opendir() which will convert the string from + * OPENTTD encoding to that of the filesystem. For all purposes this + * function behaves the same as the original opendir function + * @param path string to open directory of + * @return DIR pointer + */ +static inline DIR *ttd_opendir(const char *path) +{ + return opendir(OTTD2FS(path)); +} + #endif /* FIOS_H */ diff --git a/newgrf_config.c b/newgrf_config.c index e4c32cf272..cf58551d5c 100644 --- a/newgrf_config.c +++ b/newgrf_config.c @@ -15,14 +15,10 @@ #include "fileio.h" #include "fios.h" -#include #include #ifdef WIN32 # include -#else -# include -# include #endif /* WIN32 */ @@ -266,7 +262,7 @@ static uint ScanPath(const char *path) DIR *dir; GRFConfig *c; - if ((dir = opendir(path)) == NULL) return 0; + if ((dir = ttd_opendir(path)) == NULL) return 0; while ((dirent = readdir(dir)) != NULL) { const char *d_name = FS2OTTD(dirent->d_name); diff --git a/strings.c b/strings.c index 7a6134361c..a5d39522b3 100644 --- a/strings.c +++ b/strings.c @@ -23,13 +23,8 @@ #include "date.h" #include "industry.h" -#ifdef WIN32 /* for opendir/readdir/closedir */ # include "fios.h" -#else -# include -# include -#endif /* WIN32 */ char _userstring[128]; @@ -1225,7 +1220,7 @@ static int GetLanguageList(char **languages, int max) struct dirent *dirent; int num = 0; - dir = opendir(_paths.lang_dir); + dir = ttd_opendir(_paths.lang_dir); if (dir != NULL) { while ((dirent = readdir(dir)) != NULL) { const char *d_name = FS2OTTD(dirent->d_name); diff --git a/win32.c b/win32.c index 7acc12ab4c..f655ec0c9d 100644 --- a/win32.c +++ b/win32.c @@ -652,19 +652,20 @@ static inline void dir_free(DIR *d) } } -DIR *opendir(const char *path) +DIR *opendir(const wchar_t *path) { DIR *d; UINT sem = SetErrorMode(SEM_FAILCRITICALERRORS); // disable 'no-disk' message box - DWORD fa = GetFileAttributesW(OTTD2FS(path)); + DWORD fa = GetFileAttributesW(path); if ((fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) { d = dir_calloc(); if (d != NULL) { - char search_path[MAX_PATH]; + wchar_t search_path[MAX_PATH]; /* build search path for FindFirstFile */ - snprintf(search_path, lengthof(search_path), "%s" PATHSEP "*", path); - d->hFind = FindFirstFileW(OTTD2FS(search_path), &d->fd); + _snwprintf(search_path, lengthof(search_path), L"%s\\*", path); + *lastof(search_path) = '\0'; + d->hFind = FindFirstFileW(search_path, &d->fd); if (d->hFind != INVALID_HANDLE_VALUE || GetLastError() == ERROR_NO_MORE_FILES) { // the directory is empty