diff options
author | Patrick Georgi <pgeorgi@chromium.org> | 2015-09-17 20:45:52 +0200 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2015-09-17 20:13:47 +0000 |
commit | eb33b3f80e2fac8f92035a7960cf460981487b2d (patch) | |
tree | c622dd4dc4f43720b174ef60ef02fae5aada50cf | |
parent | 1bb487c474c378cf61bd28f83b9eb87162ffc1c4 (diff) |
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 <pgeorgi@chromium.org>
Reviewed-on: http://review.coreboot.org/11678
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: build bot (Jenkins)
-rw-r--r-- | payloads/libpayload/include/cbfs_core.h | 5 | ||||
-rw-r--r-- | 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) { |