/** * Default directory fallback is: * - (command line argument) * - <platform dependent> */ void platform_resolve_user_data_path() { const char separator[2] = { platform_get_path_separator(), 0 }; if (gCustomUserDataPath[0] != 0) { if (realpath(gCustomUserDataPath, _userDataDirectoryPath) == NULL) { log_error("Could not resolve path \"%s\"", gCustomUserDataPath); return; } // Ensure path ends with separator int len = strlen(_userDataDirectoryPath); if (_userDataDirectoryPath[len - 1] != separator[0]) { strncat(_userDataDirectoryPath, separator, MAX_PATH - 1); } return; } char buffer[MAX_PATH]; buffer[0] = '\0'; log_verbose("buffer = '%s'", buffer); const char *homedir = getpwuid(getuid())->pw_dir; platform_posix_sub_user_data_path(buffer, homedir, separator); log_verbose("OpenRCT2 user data directory = '%s'", buffer); int len = strnlen(buffer, MAX_PATH); wchar_t *w_buffer = regular_to_wchar(buffer); w_buffer[len] = '\0'; utf8 *path = widechar_to_utf8(w_buffer); free(w_buffer); safe_strcpy(_userDataDirectoryPath, path, MAX_PATH); free(path); }
/** * Default directory fallback is: * - (command line argument) * - $XDG_CONFIG_HOME/.config/OpenRCT2 * - /home/[uid]/.config/OpenRCT2 */ void platform_resolve_user_data_path() { const char separator[2] = { platform_get_path_separator(), 0 }; if (gCustomUserDataPath[0] != 0) { realpath(gCustomUserDataPath, _userDataDirectoryPath); // Ensure path ends with separator int len = strlen(_userDataDirectoryPath); if (_userDataDirectoryPath[len - 1] != separator[0]) { strcat(_userDataDirectoryPath, separator); } return; } char buffer[MAX_PATH]; buffer[0] = '\0'; log_verbose("buffer = '%s'", buffer); const char *homedir = getenv("XDG_CONFIG_HOME"); log_verbose("homedir = '%s'", homedir); if (homedir == NULL) { homedir = getpwuid(getuid())->pw_dir; log_verbose("homedir was null, used getuid, now is = '%s'", homedir); if (homedir == NULL) { log_fatal("Couldn't find user data directory"); exit(-1); return; } strncat(buffer, homedir, MAX_PATH); strncat(buffer, separator, MAX_PATH); strncat(buffer, ".config", MAX_PATH); } else { strncat(buffer, homedir, MAX_PATH); } strncat(buffer, separator, MAX_PATH); strncat(buffer, "OpenRCT2", MAX_PATH); strncat(buffer, separator, MAX_PATH); log_verbose("OpenRCT2 user data directory = '%s'", buffer); int len = strnlen(buffer, MAX_PATH); wchar_t *w_buffer = regular_to_wchar(buffer); w_buffer[len] = '\0'; utf8 *path = widechar_to_utf8(w_buffer); free(w_buffer); safe_strncpy(_userDataDirectoryPath, path, MAX_PATH); free(path); }
void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory, size_t outSize) { char buffer[MAX_PATH]; safe_strcpy(buffer, _userDataDirectoryPath, sizeof(buffer)); if (subDirectory != NULL && subDirectory[0] != 0) { log_verbose("adding subDirectory '%s'", subDirectory); safe_strcat_path(buffer, subDirectory, sizeof(buffer)); path_end_with_separator(buffer, sizeof(buffer)); } sint32 len = strnlen(buffer, MAX_PATH); wchar_t *w_buffer = regular_to_wchar(buffer); w_buffer[len] = '\0'; utf8 *path = widechar_to_utf8(w_buffer); free(w_buffer); safe_strcpy(outPath, path, outSize); free(path); log_verbose("outPath + subDirectory = '%s'", buffer); }
void platform_get_user_directory(utf8 *outPath, const utf8 *subDirectory) { const char separator[2] = { platform_get_path_separator(), 0 }; char buffer[MAX_PATH]; safe_strcpy(buffer, _userDataDirectoryPath, sizeof(buffer)); if (subDirectory != NULL && subDirectory[0] != 0) { log_verbose("adding subDirectory '%s'", subDirectory); strncat(buffer, subDirectory, MAX_PATH - strnlen(buffer, MAX_PATH) - 1); strncat(buffer, separator, MAX_PATH - strnlen(buffer, MAX_PATH) - 1); } int len = strnlen(buffer, MAX_PATH); wchar_t *w_buffer = regular_to_wchar(buffer); w_buffer[len] = '\0'; utf8 *path = widechar_to_utf8(w_buffer); free(w_buffer); safe_strcpy(outPath, path, MAX_PATH); free(path); log_verbose("outPath + subDirectory = '%s'", buffer); }
/** * Default directory fallback is: * - (command line argument) * - <platform dependent> */ void platform_resolve_user_data_path() { if (gCustomUserDataPath[0] != 0) { if (!platform_ensure_directory_exists(gCustomUserDataPath)) { log_error("Failed to create directory \"%s\", make sure you have permissions.", gCustomUserDataPath); return; } char *path; if ((path = realpath(gCustomUserDataPath, NULL)) == NULL) { log_error("Could not resolve path \"%s\"", gCustomUserDataPath); return; } safe_strcpy(_userDataDirectoryPath, path, MAX_PATH); free(path); // Ensure path ends with separator path_end_with_separator(_userDataDirectoryPath, MAX_PATH); log_verbose("User data path resolved to: %s", _userDataDirectoryPath); if (!platform_directory_exists(_userDataDirectoryPath)) { log_error("Custom user data directory %s does not exist", _userDataDirectoryPath); } return; } char buffer[MAX_PATH]; log_verbose("buffer = '%s'", buffer); const char *homedir = getpwuid(getuid())->pw_dir; platform_posix_sub_user_data_path(buffer, MAX_PATH, homedir); log_verbose("OpenRCT2 user data directory = '%s'", buffer); sint32 len = strnlen(buffer, MAX_PATH); wchar_t *w_buffer = regular_to_wchar(buffer); w_buffer[len] = '\0'; utf8 *path = widechar_to_utf8(w_buffer); free(w_buffer); safe_strcpy(_userDataDirectoryPath, path, MAX_PATH); free(path); log_verbose("User data path resolved to: %s", _userDataDirectoryPath); }