diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-15 17:56:07 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-15 17:59:00 +0200 |
commit | 8ee3ee9c71418dbdb73d4350c17056024fb7ec41 (patch) | |
tree | 28416eda2893ed28750c29b41b64d783a1aaa35d /lib/sqfshelper/data_writer.c | |
parent | ab2d7fd8bfb1eafc61953e74757e84ed407b1f21 (diff) |
Replace file descriptor IO in data_writer with sqfs_file_t
First, this commit moves the create-blocks-from-fd function over to
libsquashfs and ports it to work on an sqfs_file_t instead.
Second, the function in the data_writer that reads from a file descriptor
is adjusted to use an sqfs_file_t instead.
Finally, the tools that use it have to be adjusted accordingly.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfshelper/data_writer.c')
-rw-r--r-- | lib/sqfshelper/data_writer.c | 44 |
1 files changed, 12 insertions, 32 deletions
diff --git a/lib/sqfshelper/data_writer.c b/lib/sqfshelper/data_writer.c index 43d5851..edd1770 100644 --- a/lib/sqfshelper/data_writer.c +++ b/lib/sqfshelper/data_writer.c @@ -319,34 +319,11 @@ static int add_sentinel_block(data_writer_t *data, file_info_t *fi, return sqfs_block_processor_enqueue(data->proc, blk); } -static sqfs_block_t *create_block(file_info_t *fi, int fd, size_t size, - uint32_t flags) -{ - sqfs_block_t *blk = alloc_flex(sizeof(*blk), 1, size); - - if (blk == NULL) { - perror(fi->input_file); - return NULL; - } - - if (fd >= 0) { - if (read_data(fi->input_file, fd, blk->data, size)) { - free(blk); - return NULL; - } - } - - blk->size = size; - blk->user = fi; - blk->flags = flags; - return blk; -} - -int write_data_from_fd(data_writer_t *data, file_info_t *fi, - int infd, int flags) +int write_data_from_file(data_writer_t *data, file_info_t *fi, + sqfs_file_t *file, int flags) { uint32_t blk_flags = BLK_FIRST_BLOCK; - uint64_t file_size = fi->size; + uint64_t offset, file_size; size_t diff, i = 0; sqfs_block_t *blk; @@ -356,16 +333,19 @@ int write_data_from_fd(data_writer_t *data, file_info_t *fi, if (flags & DW_ALLIGN_DEVBLK) blk_flags |= BLK_ALLIGN; - for (; file_size > 0; file_size -= diff) { - if (file_size > data->super->block_size) { + file_size = file->get_size(file); + + for (offset = 0; offset < file_size; offset += diff) { + if (file_size - offset > data->super->block_size) { diff = data->super->block_size; } else { - diff = file_size; + diff = file_size - offset; } - blk = create_block(fi, infd, diff, blk_flags); - if (blk == NULL) + if (sqfs_file_create_block(file, offset, diff, fi, + blk_flags, &blk)) { return -1; + } blk->index = i++; @@ -405,7 +385,7 @@ int write_data_from_fd(data_writer_t *data, file_info_t *fi, return -1; } - data->stats.bytes_read += fi->size; + data->stats.bytes_read += file_size; data->stats.file_count += 1; return 0; } |