Changeset - r15503:084a4ba274a8
[Not reviewed]
master
0 2 0
rubidium - 14 years ago 2010-07-16 19:32:39
rubidium@openttd.org
(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.
2 files changed with 43 insertions and 2 deletions:
0 comments (0 inline, 0 general)
readme.txt
Show inline comments
 
@@ -250,12 +250,15 @@ 4.2) OpenTTD directories
 
---- -------------------------------
 

	
 
The required 3rd party files listed in the section 4.1 "(Required) 3rd party files"
 
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)
 
		         C:\Users\<username>\Documents\OpenTTD (Vista, 7)
 
		Mac OSX: ~/Documents/OpenTTD
 
		Linux:   ~/.openttd
src/fileio.cpp
Show inline comments
 
@@ -41,21 +41,24 @@ struct Fio {
 
	size_t pos;                            ///< current (system) position in file
 
	FILE *cur_fh;                          ///< current file handle
 
	const char *filename;                  ///< current filename
 
	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
 
#endif /* LIMITED_FDS */
 
};
 

	
 
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()
 
{
 
	return _fio.pos + (_fio.buffer - _fio.buffer_end);
 
}
 

	
 
@@ -873,12 +876,39 @@ void ChangeWorkingDirectory(const char *
 
#ifdef WITH_COCOA
 
	if (app_bundle != NULL) app_bundle[0] = '.';
 
#endif /* WITH_COCOA */
 
}
 

	
 
/**
 
 * 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
 
 */
 
void DetermineBasePaths(const char *exe)
 
{
 
	char tmp[MAX_PATH];
 
@@ -917,12 +947,14 @@ void DetermineBasePaths(const char *exe)
 
#else
 
	if (getcwd(tmp, MAX_PATH) == NULL) *tmp = '\0';
 
	AppendPathSeparator(tmp, MAX_PATH);
 
	_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';
 
	AppendPathSeparator(tmp, MAX_PATH);
 
	_searchpaths[SP_BINARY_DIR] = strdup(tmp);
 

	
 
@@ -957,13 +989,16 @@ char *_personal_dir;
 
 */
 
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);
 
		char *end = strrchr(_personal_dir, PATHSEPCHAR);
 
		if (end == NULL) {
 
			_personal_dir[0] = '\0';
 
@@ -1175,12 +1210,15 @@ uint FileScanner::Scan(const char *exten
 
	Searchpath sp;
 
	char path[MAX_PATH];
 
	TarFileList::iterator tar;
 
	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);
 
	}
 

	
 
	if (tars) {
 
		FOR_ALL_TARS(tar) {
0 comments (0 inline, 0 general)