# HG changeset patch # User rubidium # Date 1173220624 0 # Node ID a780a47d6af3c21d856b22e686b789dc1857aec7 # Parent 3cea8776104b8787df70204e003f8c5e0372c557 (svn r9043) -Fix [FS#652]: the personal (.openttd) directories were hidden in the load/save directory listings (stepancheg). diff -r 3cea8776104b -r a780a47d6af3 src/fios.cpp --- a/src/fios.cpp Tue Mar 06 22:16:43 2007 +0000 +++ b/src/fios.cpp Tue Mar 06 22:37:04 2007 +0000 @@ -33,6 +33,7 @@ /* 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 FiosIsHiddenFile(const struct dirent *ent); extern void FiosGetDrives(void); extern bool FiosGetDiskFreeSpace(const char *path, uint32 *tot); @@ -227,7 +228,8 @@ /* found file must be directory, but not '.' or '..' */ if (FiosIsValidFile(_fios_path, dirent, &sb) && (sb.st_mode & S_IFDIR) && - strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) { + (!FiosIsHiddenFile(dirent) || strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) == 0) && + strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) { fios = FiosAlloc(); fios->type = FIOS_TYPE_DIR; fios->mtime = 0; @@ -258,7 +260,7 @@ char *t; ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name)); - if (!FiosIsValidFile(_fios_path, dirent, &sb) || !(sb.st_mode & S_IFREG)) continue; + if (!FiosIsValidFile(_fios_path, dirent, &sb) || !(sb.st_mode & S_IFREG) || FiosIsHiddenFile(dirent)) continue; /* File has no extension, skip it */ if ((t = strrchr(d_name, '.')) == NULL) continue; diff -r 3cea8776104b -r a780a47d6af3 src/os2.cpp --- a/src/os2.cpp Tue Mar 06 22:16:43 2007 +0000 +++ b/src/os2.cpp Tue Mar 06 22:37:04 2007 +0000 @@ -114,11 +114,15 @@ char filename[MAX_PATH]; snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, ent->d_name); - if (stat(filename, sb) != 0) return false; + return stat(filename, sb) == 0; +} - return (ent->d_name[0] != '.'); // hidden file +bool FiosIsHiddenFile(const struct dirent *ent) +{ + return ent->d_name[0] == '.'; } + static void ChangeWorkingDirectory(char *exe) { char *s = strrchr(exe, PATHSEPCHAR); diff -r 3cea8776104b -r a780a47d6af3 src/unix.cpp --- a/src/unix.cpp Tue Mar 06 22:16:43 2007 +0000 +++ b/src/unix.cpp Tue Mar 06 22:37:04 2007 +0000 @@ -92,9 +92,12 @@ #endif snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, ent->d_name); - if (stat(filename, sb) != 0) return false; + return stat(filename, sb) == 0; +} - return (ent->d_name[0] != '.'); // hidden file +bool FiosIsHiddenFile(const struct dirent *ent) +{ + return ent->d_name[0] == '.'; } #if defined(__BEOS__) || defined(__linux__) diff -r 3cea8776104b -r a780a47d6af3 src/win32.cpp --- a/src/win32.cpp Tue Mar 06 22:16:43 2007 +0000 +++ b/src/win32.cpp Tue Mar 06 22:37:04 2007 +0000 @@ -749,7 +749,6 @@ // hectonanoseconds between Windows and POSIX epoch static const int64 posix_epoch_hns = 0x019DB1DED53E8000LL; const WIN32_FIND_DATAW *fd = &ent->dir->fd; - if (fd->dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) return false; sb->st_size = ((uint64) fd->nFileSizeHigh << 32) + fd->nFileSizeLow; /* UTC FILETIME to seconds-since-1970 UTC @@ -763,6 +762,11 @@ return true; } +bool FiosIsHiddenFile(const struct dirent *ent) +{ + return (ent->dir->fd.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) != 0; +} + bool FiosGetDiskFreeSpace(const char *path, uint32 *tot) { UINT sem = SetErrorMode(SEM_FAILCRITICALERRORS); // disable 'no-disk' message box