summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-07-16 19:32:39 +0000
committerrubidium <rubidium@openttd.org>2010-07-16 19:32:39 +0000
commit6863b7539c55ef913e7f3124e0cd5753cb2380e1 (patch)
tree6f1fc86120c58c619ef63a78f67e353956248d5a /src
parent2a3ec78d9f35ad788dcaeab306f355d2e496c16d (diff)
downloadopenttd-6863b7539c55ef913e7f3124e0cd5753cb2380e1.tar.xz
(svn r20166) -Fix [FS#3949]: do not scan /data and ~/data (if they happen to be your working directory). If it's the directory where your binary is located it will still scan them.
Diffstat (limited to 'src')
-rw-r--r--src/fileio.cpp42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/fileio.cpp b/src/fileio.cpp
index 9f946c731..f3d57fb72 100644
--- a/src/fileio.cpp
+++ b/src/fileio.cpp
@@ -44,7 +44,7 @@ struct Fio {
FILE *handles[MAX_FILE_SLOTS]; ///< array of file handles we can have open
byte buffer_start[FIO_BUFFER_SIZE]; ///< local buffer when read from file
const char *filenames[MAX_FILE_SLOTS]; ///< array of filenames we (should) have open
- char *shortnames[MAX_FILE_SLOTS];///< array of short names for spriteloader's use
+ char *shortnames[MAX_FILE_SLOTS]; ///< array of short names for spriteloader's use
#if defined(LIMITED_FDS)
uint open_handles; ///< current amount of open handles
uint usage_count[MAX_FILE_SLOTS]; ///< count how many times this file has been opened
@@ -53,6 +53,9 @@ struct Fio {
static Fio _fio;
+/** Whether the working directory should be scanned. */
+static bool _do_scan_working_directory = true;
+
/* Get current position in file */
size_t FioGetPos()
{
@@ -876,6 +879,33 @@ void ChangeWorkingDirectory(const char *exe)
}
/**
+ * Whether we should scan the working directory.
+ * It should not be scanned if it's the root or
+ * the home directory as in both cases a big data
+ * directory can cause huge amounts of unrelated
+ * files scanned. Furthermore there are nearly no
+ * use cases for the home/root directory to have
+ * OpenTTD directories.
+ * @return true if it should be scanned.
+ */
+bool DoScanWorkingDirectory()
+{
+ /* No working directory, so nothing to do. */
+ if (_searchpaths[SP_WORKING_DIR] == NULL) return false;
+
+ /* Working directory is root, so do nothing. */
+ if (strcmp(_searchpaths[SP_WORKING_DIR], PATHSEP) == 0) return false;
+
+ /* No personal/home directory, so the working directory won't be that. */
+ if (_searchpaths[SP_PERSONAL_DIR] == NULL) return true;
+
+ char tmp[MAX_PATH];
+ snprintf(tmp, lengthof(tmp), "%s%s", _searchpaths[SP_WORKING_DIR], PERSONAL_DIR);
+ AppendPathSeparator(tmp, MAX_PATH);
+ return strcmp(tmp, _searchpaths[SP_PERSONAL_DIR]) != 0;
+}
+
+/**
* Determine the base (personal dir and game data dir) paths
* @param exe the path to the executable
*/
@@ -920,6 +950,8 @@ void DetermineBasePaths(const char *exe)
_searchpaths[SP_WORKING_DIR] = strdup(tmp);
#endif
+ _do_scan_working_directory = DoScanWorkingDirectory();
+
/* Change the working directory to that one of the executable */
ChangeWorkingDirectory(exe);
if (getcwd(tmp, MAX_PATH) == NULL) *tmp = '\0';
@@ -960,7 +992,10 @@ void DeterminePaths(const char *exe)
DetermineBasePaths(exe);
Searchpath sp;
- FOR_ALL_SEARCHPATHS(sp) DEBUG(misc, 4, "%s added as search path", _searchpaths[sp]);
+ FOR_ALL_SEARCHPATHS(sp) {
+ if (sp == SP_WORKING_DIR && !_do_scan_working_directory) continue;
+ DEBUG(misc, 4, "%s added as search path", _searchpaths[sp]);
+ }
if (_config_file != NULL) {
_personal_dir = strdup(_config_file);
@@ -1178,6 +1213,9 @@ uint FileScanner::Scan(const char *extension, Subdirectory sd, bool tars, bool r
uint num = 0;
FOR_ALL_SEARCHPATHS(sp) {
+ /* Don't search in the working directory */
+ if (sp == SP_WORKING_DIR && !_do_scan_working_directory) continue;
+
FioAppendDirectory(path, MAX_PATH, sp, sd);
num += ScanPath(this, extension, path, strlen(path), recursive);
}