diff options
Diffstat (limited to 'src/cc4group.c')
| -rw-r--r-- | src/cc4group.c | 126 |
1 files changed, 52 insertions, 74 deletions
diff --git a/src/cc4group.c b/src/cc4group.c index 95d604d..db0ea59 100644 --- a/src/cc4group.c +++ b/src/cc4group.c @@ -124,10 +124,10 @@ static void cc4group_applyMemoryManagementEnd(CC4Group_MemoryManagement const ma } static const uint8_t* cc4group_getOnlyEntryData(CC4Group* const this, const C4GroupEntryData* entry); -static const C4GroupEntryData* cc4group_getEntryByPath(CC4Group* const this, const char* const entryPath, bool* error); -static const C4GroupEntryData* cc4group_getDirectoryByPath(CC4Group* const this, const char* const entryPath); +static const C4GroupEntryData* cc4group_getEntryByPath(CC4Group* const this, const char* const entryPath, bool allowRoot, bool* error); +static const C4GroupEntryData* cc4group_getDirectoryByPath(CC4Group* const this, const char* const entryPath, bool allowRoot); static const C4GroupEntryData* cc4group_getFileByPath(CC4Group* const this, const char* const entryPath); -static const C4GroupEntryData* cc4group_getFileOrDirectoryByPath(CC4Group* const this, const char* const entryPath); +static const C4GroupEntryData* cc4group_getFileOrDirectoryByPath(CC4Group* const this, const char* const entryPath, bool allowRoot); static char* cc4group_strerrorFormatter(int32_t const code, const char* const method, const char* const causer, void* const data) { @@ -801,7 +801,7 @@ static bool cc4group_setSubRoot(CC4Group* const this, const char* const subPath) { this->realRoot = this->root; - const C4GroupEntryData* subRoot = cc4group_getDirectoryByPath(this, subPath); + const C4GroupEntryData* subRoot = cc4group_getDirectoryByPath(this, subPath, false); if(subRoot == NULL) { @@ -951,19 +951,11 @@ static bool cc4group_setMaker(CC4Group* const this, const char* const maker, con assert(this); assert(maker); - const C4GroupEntryData* entry; - if(path == NULL || *path == '\0') - { - entry = &this->root; - } - else - { - entry = cc4group_getDirectoryByPath(this, path); + const C4GroupEntryData* entry = cc4group_getDirectoryByPath(this, path, true); - if(entry == NULL) - { - return false; - } + if(entry == NULL) + { + return false; } C4GroupHeader_setMaker(entry->header, maker); @@ -990,19 +982,11 @@ static bool cc4group_setOfficial(CC4Group* const this, bool const official, cons { assert(this); - const C4GroupEntryData* entry; - if(path == NULL || *path == '\0') - { - entry = &this->root; - } - else - { - entry = cc4group_getDirectoryByPath(this, path); + const C4GroupEntryData* entry = cc4group_getDirectoryByPath(this, path, true); - if(entry == NULL) - { - return false; - } + if(entry == NULL) + { + return false; } C4GroupHeader_setOfficial(entry->header, official); @@ -1030,19 +1014,11 @@ static bool cc4group_setCreation(CC4Group* const this, int32_t const creation, c { assert(this); - C4GroupEntryData* entry; - if(path == NULL || *path == '\0') - { - entry = &this->root; - } - else - { - entry = (C4GroupEntryData*)cc4group_getFileOrDirectoryByPath(this, path); + C4GroupEntryData* entry = (C4GroupEntryData*)cc4group_getFileOrDirectoryByPath(this, path, true); - if(entry == NULL) - { - return false; - } + if(entry == NULL) + { + return false; } entry->core.Modified = creation; @@ -1243,15 +1219,23 @@ static bool cc4group_extractAll(CC4Group* const this, const char* const targetPa // sets *error to true if any error is set -static const C4GroupEntryData* cc4group_getEntryByPath(CC4Group* const this, const char* const entryPath, bool* error) +static const C4GroupEntryData* cc4group_getEntryByPath(CC4Group* const this, const char* const entryPath, bool allowRoot, bool* error) { assert(this); assert(this->root.children); - assert(entryPath); - if(*entryPath == '\0') + if(entryPath == NULL || *entryPath == '\0') { - return &this->root; + if(allowRoot) + { + return &this->root; + } + else + { + SET_MESSAGE_ERROR("The root directory is not allowed for this"); + *error = true; + return NULL; + } } const C4GroupEntryData* currentParent = &this->root; @@ -1303,11 +1287,11 @@ static const C4GroupEntryData* cc4group_getEntryByPath(CC4Group* const this, con } // sets error -static const C4GroupEntryData* cc4group_getDirectoryByPath(CC4Group* const this, const char* const entryPath) +static const C4GroupEntryData* cc4group_getDirectoryByPath(CC4Group* const this, const char* const entryPath, bool allowRoot) { // asserts are in cc4group_getEntryByPath bool error = false; - const C4GroupEntryData* entry = cc4group_getEntryByPath(this, entryPath, &error); + const C4GroupEntryData* entry = cc4group_getEntryByPath(this, entryPath, allowRoot, &error); if(error) { return NULL; @@ -1333,7 +1317,7 @@ static const C4GroupEntryData* cc4group_getFileByPath(CC4Group* const this, cons { // asserts are in cc4group_getEntryByPath bool error = false; - const C4GroupEntryData* entry = cc4group_getEntryByPath(this, entryPath, &error); + const C4GroupEntryData* entry = cc4group_getEntryByPath(this, entryPath, true, &error); if(error) { return NULL; @@ -1355,11 +1339,11 @@ static const C4GroupEntryData* cc4group_getFileByPath(CC4Group* const this, cons } // sets error -static const C4GroupEntryData* cc4group_getFileOrDirectoryByPath(CC4Group* const this, const char* const entryPath) +static const C4GroupEntryData* cc4group_getFileOrDirectoryByPath(CC4Group* const this, const char* const entryPath, bool allowRoot) { // asserts are in cc4group_getEntryByPath bool error = false; - const C4GroupEntryData* entry = cc4group_getEntryByPath(this, entryPath, &error); + const C4GroupEntryData* entry = cc4group_getEntryByPath(this, entryPath, allowRoot, &error); if(error) { return false; @@ -1377,10 +1361,9 @@ static const C4GroupEntryData* cc4group_getFileOrDirectoryByPath(CC4Group* const static bool cc4group_extractSingle(CC4Group* const this, const char* const entryPath, const char* const targetPath) { assert(this); - assert(entryPath); assert(targetPath); - const C4GroupEntryData* entry = cc4group_getFileOrDirectoryByPath(this, entryPath); + const C4GroupEntryData* entry = cc4group_getFileOrDirectoryByPath(this, entryPath, true); if(entry == NULL) { return false; @@ -1400,7 +1383,6 @@ static const uint8_t* cc4group_getOnlyEntryData(CC4Group* const this, const C4Gr static bool cc4group_getEntryData(CC4Group* const this, const char* const entryPath, const void** const data, size_t* size) { assert(this); - assert(entryPath); assert(data); assert(size); @@ -1559,6 +1541,7 @@ static bool cc4group_writeEntriesToGzFile(CC4Group* const this, C4GroupEntryData static bool cc4group_saveIt(CC4Group* const this, const char* const path, bool const overwrite) { assert(this); + assert(path); bool success = false; int file = open(path, O_WRONLY | O_BINARY | O_CREAT | (overwrite ? O_TRUNC : O_EXCL), 0644); @@ -1667,10 +1650,9 @@ static void cc4group_getEntryInfoForEntry(const C4GroupEntryData* const entry, C static bool cc4group_getEntryInfo(CC4Group* const this, const char* const path, CC4Group_EntryInfo* const info) { assert(this); - assert(path); assert(info); - const C4GroupEntryData* entry = cc4group_getFileOrDirectoryByPath(this, path); + const C4GroupEntryData* entry = cc4group_getFileOrDirectoryByPath(this, path, true); if(entry == NULL) { return false; @@ -1690,7 +1672,7 @@ static bool cc4group_getEntryInfos(CC4Group* const this, const char* const path, if(path != NULL && *path != '\0') { - const C4GroupEntryData* entry = cc4group_getDirectoryByPath(this, path); + const C4GroupEntryData* entry = cc4group_getDirectoryByPath(this, path, true); if(entry == NULL) { return false; @@ -1743,6 +1725,12 @@ static bool cc4group_getParentAndChildEntries(CC4Group* const this, const char* { const C4GroupEntryData* parent; + if(path == NULL || *path == '\0') + { + SET_MESSAGE_ERROR("The path must contain at least one parent folder separated with /"); + return false; + } + char* myPath = strdup(path); if(myPath == NULL) @@ -1754,7 +1742,7 @@ static bool cc4group_getParentAndChildEntries(CC4Group* const this, const char* const char* parentPath; char* entryName = cc4group_splitParentAndChildPaths(myPath, &parentPath); - parent = cc4group_getDirectoryByPath(this, parentPath); + parent = cc4group_getDirectoryByPath(this, parentPath, true); if(parent == NULL) { @@ -1788,7 +1776,6 @@ static bool cc4group_getParentAndChildEntries(CC4Group* const this, const char* static bool cc4group_deleteEntry(CC4Group* const this, const char* const path, bool const recursive) { assert(this); - assert(path); const C4GroupEntryData* parent; GroupEntryListEntry* deleteEntry = NULL; @@ -1830,11 +1817,10 @@ static C4GroupEntryData* cc4group_addEntryToDirectory(C4GroupEntryData* const di static bool cc4group_renameEntry(CC4Group* const this, const char* const oldPath, const char* const newPath) { assert(this); - assert(oldPath); assert(newPath); bool error = false; - if(cc4group_getEntryByPath(this, newPath, &error) != NULL) + if(cc4group_getEntryByPath(this, newPath, false, &error) != NULL) { SET_MESSAGE_ERROR("The desired target path already exists"); return false; @@ -1864,7 +1850,7 @@ static bool cc4group_renameEntry(CC4Group* const this, const char* const oldPath const char* targetDirectory; char* targetName = cc4group_splitParentAndChildPaths(targetPath, &targetDirectory); - C4GroupEntryData* newParent = (C4GroupEntryData*)cc4group_getDirectoryByPath(this, targetDirectory); + C4GroupEntryData* newParent = (C4GroupEntryData*)cc4group_getDirectoryByPath(this, targetDirectory, true); if(newParent == NULL) { free(targetPath); @@ -1882,7 +1868,7 @@ static bool cc4group_renameEntry(CC4Group* const this, const char* const oldPath static C4GroupEntryData* cc4group_createEntry(CC4Group* const this, const char* const path) { bool error = false; - if(cc4group_getEntryByPath(this, path, &error) != NULL) + if(cc4group_getEntryByPath(this, path, false, &error) != NULL) { SET_MESSAGE_ERROR("The desired target path already exists"); return NULL; @@ -1904,7 +1890,7 @@ static C4GroupEntryData* cc4group_createEntry(CC4Group* const this, const char* const char* targetDirectory; char* targetName = cc4group_splitParentAndChildPaths(targetPath, &targetDirectory); - C4GroupEntryData* parent = (C4GroupEntryData*)cc4group_getDirectoryByPath(this, targetDirectory); + C4GroupEntryData* parent = (C4GroupEntryData*)cc4group_getDirectoryByPath(this, targetDirectory, true); if(parent == NULL) { free(targetPath); @@ -2015,19 +2001,11 @@ static bool cc4group_setExecutable(CC4Group* const this, bool const executable, { assert(this); - C4GroupEntryData* entry; - if(path == NULL || *path == '\0') - { - entry = &this->root; - } - else - { - entry = (C4GroupEntryData*)cc4group_getFileByPath(this, path); + C4GroupEntryData* entry = (C4GroupEntryData*)cc4group_getFileByPath(this, path); - if(entry == NULL) - { - return false; - } + if(entry == NULL) + { + return false; } entry->core.Executable = executable ? 1 : 0; |
