diff options
Diffstat (limited to 'src/cc4group.c')
| -rw-r--r-- | src/cc4group.c | 37 |
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, ×) == -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) { |
