summaryrefslogtreecommitdiff
path: root/c_src
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2017-03-16 15:51:33 +0100
committerMagnus Ahltorp <map@kth.se>2017-03-16 15:51:33 +0100
commit0d516c793e4abc32a16b31aa0581361fc65d9cb9 (patch)
tree10f5b75279b6c3775cea4e175a5a01b225a7b445 /c_src
parentc0d0492be27e0a19d2538cebba53b90e75ee40b0 (diff)
Implement reading over the file/writebuffer boundary
Diffstat (limited to 'c_src')
-rw-r--r--c_src/filebuffer.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/c_src/filebuffer.c b/c_src/filebuffer.c
index d35bfa7..fb06c64 100644
--- a/c_src/filebuffer.c
+++ b/c_src/filebuffer.c
@@ -163,12 +163,23 @@ bf_read(buffered_file *file, uint64_t offset, size_t length, char **error)
memcpy(result, file->writebuffer + writebufferoffset, length);
} else {
if (offset + length > file->filesize) {
- free(result);
- set_error(error,
- "pread: trying to read over file/writebuffer "
- "boundary for offset %llu and length %zu\n",
- (long long unsigned int) offset, length);
- return NULL;
+ uint64_t offset_1 = offset;
+ size_t length_1 = file->filesize - offset;
+ uint64_t offset_2 = offset_1 + length_1;
+ size_t length_2 = length - length_1;
+ unsigned char *result_1 = bf_read(file, offset_1, length_1, error);
+ unsigned char *result_2 = bf_read(file, offset_2, length_2, error);
+ if (result_1 == NULL || result_2 == NULL) {
+ free(result_1);
+ free(result_2);
+ free(result);
+ return NULL;
+ }
+ memcpy(result, result_1, length_1);
+ memcpy(result + length_1, result_2, length_2);
+ free(result_1);
+ free(result_2);
+ return result;
}
size_t bytes_read = 0;