diff --git a/include/sparse.h b/include/sparse.h index 9eca9df657ec80663132d5cb13c026b7ed9b9839..96c9bd7dffc7a7bae5bdf9244c411840e542699f 100644 --- a/include/sparse.h +++ b/include/sparse.h @@ -81,8 +81,8 @@ struct Sparse_ChunkHeader struct Sparse_Chunk { struct Sparse_ChunkHeader header; - size_t size; - size_t offset; // Data start location + size_t size; // Data size + size_t offset; // Data offset char * data; }; /*------------------------------------------------------------------------------ @@ -116,6 +116,10 @@ void Sparse_ReadHeader(struct Sparse * const sparse); Sparse_ReadChunksHeader() ------------------------------------------------------------------------------*/ void Sparse_ReadChunksHeader(struct Sparse * const sparse); +/*------------------------------------------------------------------------------ + Sparse_Read() +------------------------------------------------------------------------------*/ +void Sparse_Read(struct Sparse * const sparse); /*------------------------------------------------------------------------------ Sparse_PrintHeader() ------------------------------------------------------------------------------*/ diff --git a/src/sparse.c b/src/sparse.c index a8ba503e120ae6438b712d3572931c2fc387d154..d0b78ff7bb4270f744566b77e558b7f8cc0430eb 100644 --- a/src/sparse.c +++ b/src/sparse.c @@ -144,6 +144,33 @@ void Sparse_ReadChunksHeader(struct Sparse * const sparse) exit(-1); } } +/*------------------------------------------------------------------------------ + Sparse_Read() +------------------------------------------------------------------------------*/ +void Sparse_Read(struct Sparse * const sparse) +{ + assert(sparse != NULL); + Sparse_ReadHeader(sparse); + Sparse_ReadChunksHeader(sparse); + int fd = sparse->fd; + for(size_t i = 0; i < sparse->header.chunk_count; i++) { + size_t data_size = sparse->chunks[i].size; + sparse->chunks[i].data = malloc(data_size); + if(sparse->chunks[i].data != NULL) { + FIO_Seek(fd, sparse->chunks[i].offset, SEEK_SET); + size_t read_size = sparse->chunks[i].size; + size_t bytes_read = FIO_Read(fd, sparse->chunks[i].data, read_size); + Log_Debug(&s_logger, "read_size = %zu | bytes_read = %zu\n", read_size, bytes_read); + if(bytes_read != read_size) { + Log_Fatal(&s_logger, "FIO_Read(%d) failed! %s\n", fd, strerror(errno)); + exit(-1); + } + } else { + Log_Fatal(&s_logger, "malloc() : %s\n", strerror(errno)); + exit(-1); + } + } +} /*------------------------------------------------------------------------------ Sparse_PrintHeader() ------------------------------------------------------------------------------*/