summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2011-05-15 17:18:46 +0000
committerfrosch <frosch@openttd.org>2011-05-15 17:18:46 +0000
commitb319fb31d59ba436d9fc2d10482df77a9222378e (patch)
treea47b660e03f5b900b2ae97c1556c67c1c420cad5
parent003dee6e382369eb506adae74c61a9109d400563 (diff)
downloadopenttd-b319fb31d59ba436d9fc2d10482df77a9222378e.tar.xz
(svn r22465) -Fix [FS#4613]: When determining the executable path failed, the working directory was used instead, circumventing the not-home-directory check.
-rw-r--r--src/fileio.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/fileio.cpp b/src/fileio.cpp
index 8ecf8138c..78e946d23 100644
--- a/src/fileio.cpp
+++ b/src/fileio.cpp
@@ -867,8 +867,9 @@ extern void DetermineBasePaths(const char *exe);
* 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 *exe)
/* 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)