diff options
author | Aaron Durbin <adurbin@chromium.org> | 2014-06-27 15:28:39 -0500 |
---|---|---|
committer | Marc Jones <marc.jones@se-eng.com> | 2015-01-13 21:30:14 +0100 |
commit | b3e0202fd45f415b4e92ad824e28d79fb9b33abf (patch) | |
tree | fd9001311ae44e430319341a6949e197c6f10238 /src | |
parent | b312b7f4660d6e32d08659ebb5fe0d3bb5635916 (diff) | |
download | coreboot-b3e0202fd45f415b4e92ad824e28d79fb9b33abf.tar.xz |
cbfs: add cbfs_read()
Allow for reading from cbfs media without having a handle
to a non-CBFS_DEFAULT_MEDIA cbfs_media. In conjunction with
cbfs_locate_file() one can locate and cbfs_read() a file
without bringing the entire file through a potentially
temporary buffer (non-memory-mappable cbfs media platforms).
BUG=chrome-os-partner:29922
BRANCH=None
TEST=Built.
Original-Change-Id: Ib5d965334bce1267650fc23c9e9f496675cf8450
Original-Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/205991
Original-Reviewed-by: Furquan Shaikh <furquan@chromium.org>
(cherry picked from commit 85200f28863e5ea8888322f5787dc6de9a2999f0)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>
Change-Id: I25e3221beefd0155305ad63da6be9f47e756f7d0
Reviewed-on: http://review.coreboot.org/8181
Tested-by: build bot (Jenkins)
Reviewed-by: Furquan Shaikh <furquan@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/include/cbfs_core.h | 4 | ||||
-rw-r--r-- | src/lib/cbfs_core.c | 16 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/include/cbfs_core.h b/src/include/cbfs_core.h index 3cef9031ab..b01a30718f 100644 --- a/src/include/cbfs_core.h +++ b/src/include/cbfs_core.h @@ -224,6 +224,10 @@ struct cbfs_media { ssize_t cbfs_locate_file(struct cbfs_media *media, struct cbfs_file *file, const char *name); +/* Read count bytes at offset into dest. Return number of bytes read. */ +size_t cbfs_read(struct cbfs_media *media, void *dest, size_t offset, + size_t count); + /* returns pointer to a file entry inside CBFS or NULL */ struct cbfs_file *cbfs_get_file(struct cbfs_media *media, const char *name); diff --git a/src/lib/cbfs_core.c b/src/lib/cbfs_core.c index 24e5998f71..6455a07708 100644 --- a/src/lib/cbfs_core.c +++ b/src/lib/cbfs_core.c @@ -194,6 +194,22 @@ ssize_t cbfs_locate_file(struct cbfs_media *media, struct cbfs_file *file, return -1; } +size_t cbfs_read(struct cbfs_media *media, void *dest, size_t offset, + size_t count) +{ + struct cbfs_media default_media; + size_t nread; + + if (init_media(&media, &default_media)) + return 0; + + media->open(media); + nread = media->read(media, dest, offset, count); + media->close(media); + + return nread; +} + struct cbfs_file *cbfs_get_file(struct cbfs_media *media, const char *name) { struct cbfs_media default_media; |