From 018c0d5082955a7484b55083bc8c986e3492879c Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 13 Dec 2016 23:00:37 +0000 Subject: [PATCH] Fix #4874: OpenRCT fails to launch if no .config folder exists... Change platform_ensure_directory_exists to create the directory chain given, e.g. mkdir -p. Based on https://gist.github.com/JonathonReinhart/8c0d90191c38af2dcadb102c4e202950. --- src/platform/posix.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/platform/posix.c b/src/platform/posix.c index 1e0e2912e8..8a2566daba 100644 --- a/src/platform/posix.c +++ b/src/platform/posix.c @@ -174,14 +174,36 @@ static mode_t getumask() bool platform_ensure_directory_exists(const utf8 *path) { + mode_t mask = getumask(); char buffer[MAX_PATH]; platform_utf8_to_multibyte(path, buffer, MAX_PATH); - mode_t mask = getumask(); - log_verbose("%s", buffer); - const int result = mkdir(buffer, mask); - if (result == 0 || (result == -1 && errno == EEXIST)) - return true; - return false; + + log_verbose("Create directory: %s", buffer); + for (char *p = buffer + 1; *p != '\0'; p++) { + if (*p == '/') { + // Temporarily truncate + *p = '\0'; + + log_verbose("mkdir(%s)", buffer); + if (mkdir(buffer, mask) != 0) { + if (errno != EEXIST) { + return false; + } + } + + // Restore truncation + *p = '/'; + } + } + + log_verbose("mkdir(%s)", buffer); + if (mkdir(buffer, mask) != 0) { + if (errno != EEXIST) { + return false; + } + } + + return true; } bool platform_directory_delete(const utf8 *path)