diff --git a/src/fileio.cpp b/src/fileio.cpp --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -738,26 +738,28 @@ extern void DetermineBasePaths(const cha */ static bool ChangeWorkingDirectoryToExecutable(const char *exe) { - char tmp[MAX_PATH]; - strecpy(tmp, exe, lastof(tmp)); - - bool success = false; -#ifdef WITH_COCOA - char *app_bundle = strchr(tmp, '.'); - while (app_bundle != nullptr && !StrStartsWithIgnoreCase(app_bundle, ".app")) app_bundle = strchr(&app_bundle[1], '.'); + std::string path = exe; - if (app_bundle != nullptr) *app_bundle = '\0'; -#endif /* WITH_COCOA */ - char *s = strrchr(tmp, PATHSEPCHAR); - if (s != nullptr) { - *s = '\0'; - if (chdir(tmp) != 0) { - Debug(misc, 0, "Directory with the binary does not exist?"); - } else { - success = true; +#ifdef WITH_COCOA + for (size_t pos = path.find_first_of('.'); pos != std::string::npos; pos = path.find_first_of('.', pos + 1)) { + if (StrEqualsIgnoreCase(path.substr(pos, 4), ".app")) { + path.erase(pos); + break; } } - return success; +#endif /* WITH_COCOA */ + + size_t pos = path.find_last_of(PATHSEPCHAR); + if (pos == std::string::npos) return false; + + path.erase(pos); + + if (chdir(path.c_str()) != 0) { + Debug(misc, 0, "Directory with the binary does not exist?"); + return false; + } + + return true; } /**