We already have pwrite_full, add pread_full for symmetry. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- include/libfile.h | 1 + lib/libfile.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/libfile.h b/include/libfile.h index 3c2fe1714dcb..a353ccfa9ea9 100644 --- a/include/libfile.h +++ b/include/libfile.h @@ -2,6 +2,7 @@ #ifndef __LIBFILE_H #define __LIBFILE_H +int pread_full(int fd, void *buf, size_t size, loff_t offset); int pwrite_full(int fd, const void *buf, size_t size, loff_t offset); int write_full(int fd, const void *buf, size_t size); int read_full(int fd, void *buf, size_t size); diff --git a/lib/libfile.c b/lib/libfile.c index 6b373f05ca72..1f533133c593 100644 --- a/lib/libfile.c +++ b/lib/libfile.c @@ -75,6 +75,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 * -- 2.30.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox