diff options
Diffstat (limited to 'lib/sqfs/dir_writer.c')
| -rw-r--r-- | lib/sqfs/dir_writer.c | 40 | 
1 files changed, 16 insertions, 24 deletions
diff --git a/lib/sqfs/dir_writer.c b/lib/sqfs/dir_writer.c index 5b8f6b1..a4aebe6 100644 --- a/lib/sqfs/dir_writer.c +++ b/lib/sqfs/dir_writer.c @@ -291,10 +291,13 @@ sqfs_inode_generic_t  			      sqfs_u32 parent_ino)  {  	sqfs_inode_generic_t *inode; +	sqfs_dir_index_t *ent;  	sqfs_u64 start_block;  	sqfs_u16 block_offset; +	index_ent_t *idx; +	sqfs_u8 *ptr; -	inode = calloc(1, sizeof(*inode)); +	inode = alloc_flex(sizeof(*inode), 1, writer->idx_size);  	if (inode == NULL)  		return NULL; @@ -323,32 +326,21 @@ sqfs_inode_generic_t  		inode->data.dir_ext.xattr_idx = xattr;  		inode->data.dir_ext.inodex_count =  			writer->idx_size ? (writer->idx_size - 1) : 0; -	} - -	return inode; -} - -int sqfs_dir_writer_write_index(const sqfs_dir_writer_t *writer, -				sqfs_meta_writer_t *im) -{ -	sqfs_dir_index_t ent; -	index_ent_t *idx; -	int err; -	for (idx = writer->idx; idx != NULL; idx = idx->next) { -		ent.start_block = htole32(idx->block); -		ent.index = htole32(idx->index); -		ent.size = htole32(idx->ent->name_len - 1); +		inode->num_dir_idx_bytes = writer->idx_size; +		ptr = inode->extra; -		err = sqfs_meta_writer_append(im, &ent, sizeof(ent)); -		if (err) -			return err; +		for (idx = writer->idx; idx != NULL; idx = idx->next) { +			ent = (sqfs_dir_index_t *)ptr; +			ent->start_block = idx->block; +			ent->index = idx->index; +			ent->size = idx->ent->name_len - 1; -		err = sqfs_meta_writer_append(im, idx->ent->name, -					      idx->ent->name_len); -		if (err) -			return err; +			ptr += sizeof(*ent); +			memcpy(ptr, idx->ent->name, idx->ent->name_len); +			ptr += idx->ent->name_len; +		}  	} -	return 0; +	return inode;  }  | 
