summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-05-29 18:20:58 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-05-29 18:24:25 +0200
commit50b901d5ebdad40227de66cd5a0a0f62548f1563 (patch)
tree167e0da994a64a59164099b5d01b1e8aea8a5f66 /lib
parentcada7ca7d9386e68c38fc504c01bd2cac33dac44 (diff)
Support associating a user pointer with data blocks
This commit modifies the block processor to support associating a user data pointer with data blocks that it forwards to the block writer, which is modified to accept an optional user data pointer. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib')
-rw-r--r--lib/common/data_writer.c2
-rw-r--r--lib/sqfs/block_processor/common.c5
-rw-r--r--lib/sqfs/block_processor/frontend.c6
-rw-r--r--lib/sqfs/block_processor/internal.h4
-rw-r--r--lib/sqfs/block_writer.c5
5 files changed, 16 insertions, 6 deletions
diff --git a/lib/common/data_writer.c b/lib/common/data_writer.c
index bc5a43b..ceccaac 100644
--- a/lib/common/data_writer.c
+++ b/lib/common/data_writer.c
@@ -16,7 +16,7 @@ int write_data_from_file(const char *filename, sqfs_block_processor_t *data,
size_t diff;
int ret;
- ret = sqfs_block_processor_begin_file(data, inode, flags);
+ ret = sqfs_block_processor_begin_file(data, inode, NULL, flags);
if (ret) {
sqfs_perror(filename, "beginning file data blocks", ret);
return -1;
diff --git a/lib/sqfs/block_processor/common.c b/lib/sqfs/block_processor/common.c
index 6a62d4f..bfcc3d5 100644
--- a/lib/sqfs/block_processor/common.c
+++ b/lib/sqfs/block_processor/common.c
@@ -69,8 +69,9 @@ static int process_completed_block(sqfs_block_processor_t *proc,
sqfs_u32 size;
int err;
- err = proc->wr->write_data_block(proc->wr, blk->size, blk->checksum,
- blk->flags, blk->data, &location);
+ err = proc->wr->write_data_block(proc->wr, blk->user, blk->size,
+ blk->checksum, blk->flags,
+ blk->data, &location);
if (err)
goto out;
diff --git a/lib/sqfs/block_processor/frontend.c b/lib/sqfs/block_processor/frontend.c
index 8381dd8..d6571ea 100644
--- a/lib/sqfs/block_processor/frontend.c
+++ b/lib/sqfs/block_processor/frontend.c
@@ -55,7 +55,8 @@ static int flush_block(sqfs_block_processor_t *proc)
}
int sqfs_block_processor_begin_file(sqfs_block_processor_t *proc,
- sqfs_inode_generic_t **inode, sqfs_u32 flags)
+ sqfs_inode_generic_t **inode,
+ void *user, sqfs_u32 flags)
{
if (proc->begin_called)
return SQFS_ERROR_SEQUENCE;
@@ -76,6 +77,7 @@ int sqfs_block_processor_begin_file(sqfs_block_processor_t *proc,
proc->inode = inode;
proc->blk_flags = flags | SQFS_BLK_FIRST_BLOCK;
proc->blk_index = 0;
+ proc->user = user;
return 0;
}
@@ -104,6 +106,7 @@ int sqfs_block_processor_append(sqfs_block_processor_t *proc, const void *data,
proc->blk_current = new;
proc->blk_current->flags = proc->blk_flags;
proc->blk_current->inode = proc->inode;
+ proc->blk_current->user = proc->user;
}
diff = proc->max_block_size - proc->blk_current->size;
@@ -162,6 +165,7 @@ int sqfs_block_processor_end_file(sqfs_block_processor_t *proc)
proc->begin_called = false;
proc->inode = NULL;
+ proc->user = NULL;
proc->blk_flags = 0;
return 0;
}
diff --git a/lib/sqfs/block_processor/internal.h b/lib/sqfs/block_processor/internal.h
index 61e13d7..d28e023 100644
--- a/lib/sqfs/block_processor/internal.h
+++ b/lib/sqfs/block_processor/internal.h
@@ -42,6 +42,9 @@ typedef struct sqfs_block_t {
consolidate in reverse order. */
struct sqfs_block_t *frag_list;
+ /* User data pointer */
+ void *user;
+
sqfs_u8 data[];
} sqfs_block_t;
@@ -59,6 +62,7 @@ struct sqfs_block_processor_t {
sqfs_block_t *blk_current;
sqfs_u32 blk_flags;
sqfs_u32 blk_index;
+ void *user;
sqfs_block_t *free_list;
diff --git a/lib/sqfs/block_writer.c b/lib/sqfs/block_writer.c
index a6ca4b3..07780d7 100644
--- a/lib/sqfs/block_writer.c
+++ b/lib/sqfs/block_writer.c
@@ -115,8 +115,8 @@ static void block_writer_destroy(sqfs_object_t *wr)
free(wr);
}
-static int write_data_block(sqfs_block_writer_t *base, sqfs_u32 size,
- sqfs_u32 checksum, sqfs_u32 flags,
+static int write_data_block(sqfs_block_writer_t *base, void *user,
+ sqfs_u32 size, sqfs_u32 checksum, sqfs_u32 flags,
const sqfs_u8 *data, sqfs_u64 *location)
{
block_writer_default_t *wr = (block_writer_default_t *)base;
@@ -124,6 +124,7 @@ static int write_data_block(sqfs_block_writer_t *base, sqfs_u32 size,
sqfs_u64 offset;
sqfs_u32 out;
int err;
+ (void)user;
if (flags & SQFS_BLK_FIRST_BLOCK) {
wr->start = wr->file->get_size(wr->file);