From a202f17d7bc2a51af53352c6e21d6a70d167effe Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 15 Mar 2021 18:00:16 +1300 Subject: cbfs: Support reading compression information CBFS now supports compressed filed. Add support for reading this information so that the correct decompression can be applied. The decompression itself is not implemented in CBFS. Signed-off-by: Simon Glass --- fs/cbfs/cbfs.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'fs/cbfs/cbfs.c') diff --git a/fs/cbfs/cbfs.c b/fs/cbfs/cbfs.c index 9e534d1..443a148 100644 --- a/fs/cbfs/cbfs.c +++ b/fs/cbfs/cbfs.c @@ -91,6 +91,7 @@ static int fill_node(struct cbfs_cachenode *node, void *start, struct cbfs_fileheader *header) { uint name_len; + uint offset; /* Check the header is large enough */ if (header->offset < sizeof(struct cbfs_fileheader)) @@ -104,6 +105,27 @@ static int fill_node(struct cbfs_cachenode *node, void *start, node->name = start + sizeof(struct cbfs_fileheader); node->name_length = name_len; node->attr_offset = header->attributes_offset; + node->comp_algo = CBFS_COMPRESS_NONE; + node->decomp_size = 0; + + for (offset = node->attr_offset; offset < header->offset;) { + const struct cbfs_file_attribute *attr; + uint tag, len; + + attr = start + offset; + tag = be32_to_cpu(attr->tag); + len = be32_to_cpu(attr->len); + if (tag == CBFS_FILE_ATTR_TAG_COMPRESSION) { + struct cbfs_file_attr_compression *comp; + + comp = start + offset; + node->comp_algo = be32_to_cpu(comp->compression); + node->decomp_size = + be32_to_cpu(comp->decompressed_size); + } + + offset += len; + } return 0; } -- cgit v1.1