diff options
-rw-r--r-- | include/sqfs/block.h | 11 | ||||
-rw-r--r-- | lib/sqfs/data_writer/fileapi.c | 14 |
2 files changed, 20 insertions, 5 deletions
diff --git a/include/sqfs/block.h b/include/sqfs/block.h index 84629eb..7ee3bcb 100644 --- a/include/sqfs/block.h +++ b/include/sqfs/block.h @@ -81,6 +81,15 @@ typedef enum { SQFS_BLK_ALLIGN = 0x0002, /** + * @brief Don't add the tail end of a file to a fragment block. + * + * If set, the @ref sqfs_data_writer_t will always generate a final + * block for a file, even if it is truncated. It will not add the + * tail end to a fragment block. + */ + SQFS_BLK_DONT_FRAGMENT = 0x0004, + + /** * @brief Set by the @ref sqfs_data_writer_t on the first * block of a file. */ @@ -113,7 +122,7 @@ typedef enum { /** * @brief The combination of all flags that are user settable. */ - SQFS_BLK_USER_SETTABLE_FLAGS = 0x0003, + SQFS_BLK_USER_SETTABLE_FLAGS = 0x0007, } E_SQFS_BLK_FLAGS; /** diff --git a/lib/sqfs/data_writer/fileapi.c b/lib/sqfs/data_writer/fileapi.c index 2a5d02a..98bdf5c 100644 --- a/lib/sqfs/data_writer/fileapi.c +++ b/lib/sqfs/data_writer/fileapi.c @@ -56,7 +56,8 @@ static int flush_block(sqfs_data_writer_t *proc, sqfs_block_t *block) return 0; } - if (block->size < proc->max_block_size) { + if (block->size < proc->max_block_size && + !(block->flags & SQFS_BLK_DONT_FRAGMENT)) { block->flags |= SQFS_BLK_IS_FRAGMENT; } else { proc->inode->num_file_blocks += 1; @@ -124,9 +125,14 @@ int sqfs_data_writer_end_file(sqfs_data_writer_t *proc) return test_and_set_status(proc, SQFS_ERROR_INTERNAL); if (!(proc->blk_flags & SQFS_BLK_FIRST_BLOCK)) { - err = add_sentinel_block(proc); - if (err) - return err; + if (proc->blk_current != NULL && + (proc->blk_flags & SQFS_BLK_DONT_FRAGMENT)) { + proc->blk_flags |= SQFS_BLK_LAST_BLOCK; + } else { + err = add_sentinel_block(proc); + if (err) + return err; + } } if (proc->blk_current != NULL) { |