summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cc4group.c126
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;