From eb33b3f80e2fac8f92035a7960cf460981487b2d Mon Sep 17 00:00:00 2001 From: Patrick Georgi Date: Thu, 17 Sep 2015 20:45:52 +0200 Subject: libpayload: provide cbfs_file_find_attr() cbfs_file_find_attr(file, tag) finds the first attribute of file with the given tag. Change-Id: I78ee3b996b4b086605244c5d7d57ef7e3fc1db47 Signed-off-by: Patrick Georgi Reviewed-on: http://review.coreboot.org/11678 Reviewed-by: Aaron Durbin Tested-by: build bot (Jenkins) --- payloads/libpayload/include/cbfs_core.h | 5 +++++ payloads/libpayload/libcbfs/cbfs_core.c | 21 +++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/payloads/libpayload/include/cbfs_core.h b/payloads/libpayload/include/cbfs_core.h index 3878e55f23..ec59a20d72 100644 --- a/payloads/libpayload/include/cbfs_core.h +++ b/payloads/libpayload/include/cbfs_core.h @@ -170,6 +170,11 @@ struct cbfs_file_attribute *cbfs_file_first_attr(struct cbfs_file *file); struct cbfs_file_attribute *cbfs_file_next_attr(struct cbfs_file *file, struct cbfs_file_attribute *attr); +/* Given a cbfs_file and an attribute tag, return the first instance of the + * attribute or NULL if none found. */ +struct cbfs_file_attribute *cbfs_file_find_attr(struct cbfs_file *file, + uint32_t tag); + /*** Component sub-headers ***/ /* Following are component sub-headers for the "standard" diff --git a/payloads/libpayload/libcbfs/cbfs_core.c b/payloads/libpayload/libcbfs/cbfs_core.c index 5a46af8daa..153dc8a939 100644 --- a/payloads/libpayload/libcbfs/cbfs_core.c +++ b/payloads/libpayload/libcbfs/cbfs_core.c @@ -212,12 +212,8 @@ void *cbfs_get_file_content(struct cbfs_media *media, const char *name, void *file_content = (void *)CBFS_SUBHEADER(file); - struct cbfs_file_attribute *attr = cbfs_file_first_attr(file); - while (attr) { - if (ntohl(attr->tag) == CBFS_FILE_ATTR_TAG_COMPRESSION) - break; - attr = cbfs_file_next_attr(file, attr); - } + struct cbfs_file_attribute *attr = + cbfs_file_find_attr(file, CBFS_FILE_ATTR_TAG_COMPRESSION); int compression_algo = CBFS_COMPRESS_NONE; if (attr) { @@ -285,6 +281,19 @@ struct cbfs_file_attribute *cbfs_file_next_attr(struct cbfs_file *file, return next; } +struct cbfs_file_attribute *cbfs_file_find_attr(struct cbfs_file *file, + uint32_t tag) +{ + struct cbfs_file_attribute *attr = cbfs_file_first_attr(file); + while (attr) { + if (ntohl(attr->tag) == tag) + break; + attr = cbfs_file_next_attr(file, attr); + } + return attr; + +} + int cbfs_decompress(int algo, void *src, void *dst, int len) { switch (algo) { -- cgit v1.2.3