diff options
| author | Magnus Ahltorp <map@kth.se> | 2017-03-16 15:51:33 +0100 | 
|---|---|---|
| committer | Magnus Ahltorp <map@kth.se> | 2017-03-16 15:51:33 +0100 | 
| commit | 0d516c793e4abc32a16b31aa0581361fc65d9cb9 (patch) | |
| tree | 10f5b75279b6c3775cea4e175a5a01b225a7b445 | |
| parent | c0d0492be27e0a19d2538cebba53b90e75ee40b0 (diff) | |
Implement reading over the file/writebuffer boundary
| -rw-r--r-- | c_src/filebuffer.c | 23 | 
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; | 
