diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2022-03-18 15:49:42 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-03-28 10:56:21 +0200 |
commit | 59d6b83f1d4bb3a8b63c9d1de279ac3eb5f75e58 (patch) | |
tree | ec2a72652a068e820427a47ea01c6929607727d8 /lib/libfile.c | |
parent | 9e052f53708c98092b79aa8556fd977c05cd0136 (diff) | |
download | barebox-59d6b83f1d4bb3a8b63c9d1de279ac3eb5f75e58.tar.gz barebox-59d6b83f1d4bb3a8b63c9d1de279ac3eb5f75e58.tar.xz |
libfile: implement new pread_full
We already have pwrite_full, add pread_full for symmetry.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Link: https://lore.barebox.org/20220318144942.498124-1-a.fatoum@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib/libfile.c')
-rw-r--r-- | lib/libfile.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/lib/libfile.c b/lib/libfile.c index 6b373f05ca..1f533133c5 100644 --- a/lib/libfile.c +++ b/lib/libfile.c @@ -76,6 +76,31 @@ int write_full(int fd, const void *buf, size_t size) EXPORT_SYMBOL(write_full); /* + * pread_full - read to filedescriptor at offset + * + * Like pread, but this function only returns less bytes than + * requested when the end of file is reached. + */ +int pread_full(int fd, void *buf, size_t size, loff_t offset) +{ + size_t insize = size; + int now; + + while (size) { + now = pread(fd, buf, size, offset); + if (now == 0) + break; + if (now < 0) + return now; + size -= now; + buf += now; + } + + return insize - size; +} +EXPORT_SYMBOL(pread_full); + +/* * read_full - read from filedescriptor * * Like read, but this function only returns less bytes than |