Changeset - r17678:4858d18290aa
[Not reviewed]
master
0 1 0
frosch - 13 years ago 2011-05-15 17:18:46
frosch@openttd.org
(svn r22465) -Fix [FS#4613]: When determining the executable path failed, the working directory was used instead, circumventing the not-home-directory check.
1 file changed with 18 insertions and 7 deletions:
0 comments (0 inline, 0 general)
src/fileio.cpp
Show inline comments
 
@@ -867,8 +867,9 @@ extern void DetermineBasePaths(const cha
 
 * in the same way we remove the name from the executable name.
 
 * @param exe the path to the executable
 
 */
 
void ChangeWorkingDirectory(const char *exe)
 
static bool ChangeWorkingDirectoryToExecutable(const char *exe)
 
{
 
	bool success = false;
 
#ifdef WITH_COCOA
 
	char *app_bundle = strchr(exe, '.');
 
	while (app_bundle != NULL && strncasecmp(app_bundle, ".app", 4) != 0) app_bundle = strchr(&app_bundle[1], '.');
 
@@ -882,12 +883,17 @@ void ChangeWorkingDirectory(const char *
 
		/* If we want to go to the root, we can't use cd C:, but we must use '/' */
 
		if (s[-1] == ':') chdir("/");
 
#endif
 
		if (chdir(exe) != 0) DEBUG(misc, 0, "Directory with the binary does not exist?");
 
		if (chdir(exe) != 0) {
 
			DEBUG(misc, 0, "Directory with the binary does not exist?");
 
		} else {
 
			success = true;
 
		}
 
		*s = PATHSEPCHAR;
 
	}
 
#ifdef WITH_COCOA
 
	if (app_bundle != NULL) app_bundle[0] = '.';
 
#endif /* WITH_COCOA */
 
	return success;
 
}
 

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

	
 
	if (_searchpaths[SP_WORKING_DIR] != NULL) {
 
		/* Go back to the current working directory. */
 
		ChangeWorkingDirectory(_searchpaths[SP_WORKING_DIR]);
 
		if (chdir(_searchpaths[SP_WORKING_DIR]) != 0) {
 
			DEBUG(misc, 0, "Failed to return to working directory!");
 
		}
 
	}
 

	
 
#if defined(__MORPHOS__) || defined(__AMIGA__) || defined(DOS) || defined(OS2)
0 comments (0 inline, 0 general)