summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2022-03-18 15:49:42 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2022-03-28 10:56:21 +0200
commit59d6b83f1d4bb3a8b63c9d1de279ac3eb5f75e58 (patch)
treeec2a72652a068e820427a47ea01c6929607727d8 /lib
parent9e052f53708c98092b79aa8556fd977c05cd0136 (diff)
downloadbarebox-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')
-rw-r--r--lib/libfile.c25
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