[PATCH] libfile: implement new pread_full
Ahmad Fatoum
a.fatoum at pengutronix.de
Fri Mar 18 07:49:42 PDT 2022
We already have pwrite_full, add pread_full for symmetry.
Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
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
More information about the barebox
mailing list