summaryrefslogtreecommitdiffstats
path: root/src/cc4group.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cc4group.c')
-rw-r--r--src/cc4group.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/src/cc4group.c b/src/cc4group.c
index 1a8c344..fb2036e 100644
--- a/src/cc4group.c
+++ b/src/cc4group.c
@@ -10,14 +10,16 @@
#include "c4groupentrycore.h"
#include "GenericList.h"
+#include "platform/platform.h"
+
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
-#include <sys/mman.h>
#include <sys/time.h>
#include <time.h>
+#include <utime.h>
#include <assert.h>
#include <stdio.h>
@@ -208,7 +210,7 @@ static void deleteChildren(GroupEntryList* const entries)
GroupEntryListDestroy(entries);
}
-static void* cc4group_mapSizedWriteFd(CC4Group* const this, int fd, size_t size)
+static void* cc4group_mapSizedWriteFd(CC4Group* const this, int fd, size_t size, void** extra)
{
// allocate file size
// https://gist.github.com/marcetcheverry/991042
@@ -224,17 +226,18 @@ static void* cc4group_mapSizedWriteFd(CC4Group* const this, int fd, size_t size)
return MAP_FAILED;
}
- return mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ return cc4group_mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0, extra);
}
typedef struct {
void* addr;
size_t size;
+ void* extra;
} MunmapData;
static void cc4group_unmapTmpMemoryFile(MunmapData* data)
{
- if(munmap(data->addr, data->size) == -1)
+ if(cc4group_munmap(data->addr, data->size, data->extra) == -1)
{
fprintf(stderr, "WARNING: munmap: Unmapping tempory file failed: %s\n", strerror(errno));
}
@@ -246,7 +249,7 @@ static void* cc4group_createTmpMemoryFile(CC4Group* const this, const size_t siz
{
void* ret;
#define TMP_FILE "cc4group.tmp"
- int tmpFile = open(TMP_FILE, O_CREAT | O_RDWR | O_TRUNC | O_EXCL, 0600);
+ int tmpFile = open(TMP_FILE, O_CREAT | O_BINARY | O_RDWR | O_TRUNC | O_EXCL, 0600);
if(tmpFile == -1)
{
SET_ERRNO_ERROR("open: Opening tmp file \"" TMP_FILE "\"");
@@ -259,7 +262,8 @@ static void* cc4group_createTmpMemoryFile(CC4Group* const this, const size_t siz
}
#undef TMP_FILE
- ret = cc4group_mapSizedWriteFd(this, tmpFile, size);
+ void* mmapExtra;
+ ret = cc4group_mapSizedWriteFd(this, tmpFile, size, &mmapExtra);
if(ret == MAP_FAILED)
{
// error message is set in the method
@@ -274,7 +278,7 @@ static void* cc4group_createTmpMemoryFile(CC4Group* const this, const size_t siz
fprintf(stderr, "ERROR: allocating memory for cleanup data: %s\n", strerror(errno));
}
- *unmapData = (MunmapData){ret, size};
+ *unmapData = (MunmapData){ret, size, mmapExtra};
*cleanupJob = (CC4Group_CleanupJob){(CC4Group_CleanupFunc)cc4group_unmapTmpMemoryFile, unmapData};
}
@@ -330,6 +334,7 @@ static void cc4group_uncompressGroup(CC4Group* const this)
uint8_t* retData = NULL;
C4GroupHeader* header = NULL;
uint8_t* mappedFile = MAP_FAILED;
+ void* mapExtra;
uint8_t* mappedTmpFile = NULL;
bool inflateStarted = false;
size_t currentSize = 0;
@@ -344,7 +349,7 @@ static void cc4group_uncompressGroup(CC4Group* const this)
int file = -1;
for(;;)
{
- file = open(this->path, O_RDONLY);
+ file = open(this->path, O_RDONLY | O_BINARY);
if(file != -1)
{
break;
@@ -386,7 +391,7 @@ static void cc4group_uncompressGroup(CC4Group* const this)
}
off_t size = st.st_size;
- mappedFile = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, file, 0);
+ mappedFile = cc4group_mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, file, 0, &mapExtra);
if(close(file) == -1)
{
@@ -537,7 +542,7 @@ ret:
if(mappedFile != MAP_FAILED)
{
- if(munmap(mappedFile, size) == -1)
+ if(cc4group_munmap(mappedFile, size, mapExtra) == -1)
{
fprintf(stderr, "WARNING: munmap: Unmapping the group file failed: %s\n", strerror(errno));
}
@@ -814,7 +819,7 @@ static bool cc4group_extractEntry(CC4Group* const this, const C4GroupEntryData*
assert(root);
assert(!root->core.Directory);
- int file = open(targetPath, O_WRONLY | O_CREAT | O_EXCL, root->core.Executable ? 0755 : 0644);
+ int file = open(targetPath, O_WRONLY | O_BINARY | O_CREAT | O_EXCL, root->core.Executable ? 0755 : 0644);
if(file == -1)
{
SET_ERRNO_ERROR("open: Creating target file");
@@ -827,10 +832,10 @@ static bool cc4group_extractEntry(CC4Group* const this, const C4GroupEntryData*
fprintf(stderr, "WARNING: close: Closing the extracted file \"%s\" failed: %s\n", targetPath, strerror(errno));
}
- struct timeval tv[2] = {{.tv_usec = 0, .tv_sec = root->core.Modified}, {.tv_usec = 0, .tv_sec = root->core.Modified}};
- if(utimes(targetPath, tv) == -1)
+ struct utimbuf times = {.actime = root->core.Modified, .modtime = root->core.Modified};
+ if(utime(targetPath, &times) == -1)
{
- fprintf(stderr, "WARNING: utimes: Setting modification time for \"%s\" failed: %s\n", targetPath, strerror(errno));
+ fprintf(stderr, "WARNING: utime: Setting modification time for \"%s\" failed: %s\n", targetPath, strerror(errno));
}
return true;
@@ -861,7 +866,7 @@ static bool cc4group_extractChildren(CC4Group* const this, const C4GroupEntryDat
if(root->core.Directory)
{
assert(root->children);
- if(mkdir(tmpPath, 0755) == -1 /*&& errno != EEXIST*/)
+ if(cc4group_mkdir(tmpPath, 0755) == -1 /*&& errno != EEXIST*/)
{
SET_ERRNO_ERROR("mkdir: Creating target directory");
success = false;
@@ -1184,7 +1189,7 @@ static bool cc4group_saveIt(CC4Group* const this, const char* const path, bool c
assert(this);
bool success = false;
- int file = open(path, O_WRONLY | O_CREAT | (overwrite ? O_TRUNC : O_EXCL), 0644);
+ int file = open(path, O_WRONLY | O_BINARY | O_CREAT | (overwrite ? O_TRUNC : O_EXCL), 0644);
if(file == -1)
{