From 531634c403a2ab76cad1e6465d45c30fbf0c8aae Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 15 Aug 2015 00:56:21 -0700 Subject: [PATCH] Fix creation of the key directory --- libgamestream/client.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/libgamestream/client.c b/libgamestream/client.c index c84caef..eb9ade1 100644 --- a/libgamestream/client.c +++ b/libgamestream/client.c @@ -50,6 +50,34 @@ static EVP_PKEY *privateKey; const char* gs_error; +static int mkdirtree(const char* directory) { + char buffer[1024]; + char* p = buffer; + + // The passed in string could be a string literal + // so we must copy it first + strcpy(p, directory); + + while (*p != 0) { + // Find the end of the path element + do { + p++; + } while (*p != 0 && *p != '/'); + + char oldChar = *p; + *p = 0; + + // Create the directory if it doesn't exist already + if (mkdir(buffer, 0775) == -1 && errno != EEXIST) { + return -1; + } + + *p = oldChar; + } + + return 0; +} + static int load_unique_id(const char* keyDirectory) { char uniqueFilePath[4096]; sprintf(uniqueFilePath, "%s/%s", keyDirectory, UNIQUE_FILE_NAME); @@ -416,7 +444,7 @@ int gs_quit_app(PSERVER_DATA server) { } int gs_init(PSERVER_DATA server, const char *keyDirectory) { - mkdir(keyDirectory, 00755); + mkdirtree(keyDirectory); if (load_unique_id(keyDirectory) != GS_OK) return GS_FAILED;