changeset 15513:c4bd37c3a0c5 draft

(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.
author rubidium <rubidium@openttd.org>
date Fri, 16 Jul 2010 19:32:39 +0000
parents 9129648e0ffd
children ceb41b9c1b80
files readme.txt src/fileio.cpp
diffstat 2 files changed, 43 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/readme.txt
+++ b/readme.txt
@@ -253,6 +253,9 @@
 as well as other non-compulsory extensions (NewGRFs, AI, heightmaps, scenarios) can be
 placed in a few different locations:
 	1. The current working directory (from where you started OpenTTD)
+		For non-Windows operating systems OpenTTD will not scan for files in this
+		directory if it is your personal directory, i.e. "~/", or when it is the
+		root directory, i.e. "/".
 	2. Your personal directory
 		Windows: C:\My Documents (95, 98, ME)
 		         C:\Documents and Settings\<username>\My Documents\OpenTTD (2000, XP)
--- a/src/fileio.cpp
+++ b/src/fileio.cpp
@@ -44,7 +44,7 @@
 	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 @@
 
 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 @@
 }
 
 /**
+ * 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 @@
 	_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 @@
 	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 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);
 	}