summaryrefslogtreecommitdiff
path: root/util/libreboot-utils
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-04-01 14:29:39 +0100
committerLeah Rowe <leah@libreboot.org>2026-04-01 14:29:39 +0100
commita879114734c7d0fdd54c58aacf925660a43a06ef (patch)
treed13f4951b92a19d31680c61b61177891a8d33b36 /util/libreboot-utils
parent229a2836045d102423688c3af259aab5dfbf520c (diff)
lbutils: remove rw on_eintr functions. just use rw
rw is enough. i unified everything there. next commit will remove rw_type and instead run positional i/o depending on whether the offset is zero. i'm simplifying the API a lot. Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'util/libreboot-utils')
-rw-r--r--util/libreboot-utils/include/common.h8
-rw-r--r--util/libreboot-utils/lib/file.c141
-rw-r--r--util/libreboot-utils/lib/rand.c3
3 files changed, 36 insertions, 116 deletions
diff --git a/util/libreboot-utils/include/common.h b/util/libreboot-utils/include/common.h
index b30bcc93..5058317c 100644
--- a/util/libreboot-utils/include/common.h
+++ b/util/libreboot-utils/include/common.h
@@ -471,14 +471,6 @@ int check_file(int fd, struct stat *st);
ssize_t rw_over_nrw(ssize_t r, size_t nrw);
off_t lseek_on_eintr(int fd, off_t off,
int whence);
-ssize_t read_on_eintr(int fd,
- void *buf, size_t count);
-ssize_t write_on_eintr(int fd,
- void *buf, size_t count);
-ssize_t pread_on_eintr(int fd,
- void *buf, size_t count, off_t off);
-ssize_t pwrite_on_eintr(int fd,
- void *buf, size_t count, off_t off);
int off_retry(int saved_errno, off_t rval);
int sys_retry(int saved_errno, long rval);
int fs_retry(int saved_errno, int rval);
diff --git a/util/libreboot-utils/lib/file.c b/util/libreboot-utils/lib/file.c
index 1df5cfb3..d44d8cf9 100644
--- a/util/libreboot-utils/lib/file.c
+++ b/util/libreboot-utils/lib/file.c
@@ -202,14 +202,20 @@ err_rw_file_exact:
return with_fallback_errno(EIO);
}
-/* rw() - read-write but with more
+/**
+ * rw() - read-write but with more
* safety checks than barebones libc
*
* A fallback is provided for regular read/write.
* rw_type can be IO_READ (read), IO_WRITE (write),
* IO_PREAD (pread) or IO_PWRITE
+ *
+ * WARNING: this function allows zero-byte returns.
+ * this is intentional, to mimic libc behaviour.
+ * use rw_file_exact if you need to avoid this.
+ * (ditto partial writes/reads)
+ *
*/
-
ssize_t
rw(int fd, void *mem, size_t nrw,
off_t off, int rw_type)
@@ -219,27 +225,34 @@ rw(int fd, void *mem, size_t nrw,
int saved_errno = errno;
errno = 0;
- if (io_args(fd, mem, nrw, off, rw_type) == -1)
- return with_fallback_errno(EINVAL);
-
- switch (rw_type) {
- case IO_WRITE:
- r = write_on_eintr(fd, mem, nrw);
- break;
- case IO_READ:
- r = read_on_eintr(fd, mem, nrw);
- break;
- case IO_PWRITE:
- r = pwrite_on_eintr(fd, mem, nrw, off);
- break;
- case IO_PREAD:
- r = pread_on_eintr(fd, mem, nrw, off);
- break;
- default:
- errno = EINVAL;
- break;
- }
+ if (io_args(fd, mem, nrw, off, rw_type) == -1 ||
+ if_err(mem == NULL, EFAULT) ||
+ if_err(fd < 0, EBADF) ||
+ if_err(off < 0, EFAULT) ||
+ if_err(nrw == 0, EINVAL))
+ return with_fallback_errno(EIO);
+ do {
+ switch (rw_type) {
+ case IO_READ:
+ r = read(fd, mem, nrw);
+ break;
+ case IO_WRITE:
+ r = write(fd, mem, nrw);
+ break;
+ case IO_PREAD:
+ r = pread(fd, mem, nrw, off);
+ break;
+ case IO_PWRITE:
+ r = pwrite(fd, mem, nrw, off);
+ break;
+ default:
+ errno = EINVAL;
+ break;
+ }
+
+ } while (rw_retry(saved_errno, r));
+
if ((rval = rw_over_nrw(r, nrw)) < 0)
return with_fallback_errno(EIO);
@@ -703,90 +716,6 @@ mkdirat_on_eintr(int dirfd,
return rval;
}
-ssize_t
-read_on_eintr(int fd,
- void *buf, size_t count)
-{
- int saved_errno = errno;
- ssize_t rval = 0;
- errno = 0;
-
- if (if_err(buf == NULL, EFAULT) ||
- if_err(fd < 0, EBADF) ||
- if_err(count == 0, EINVAL))
- return with_fallback_errno(EIO);
-
- while (rw_retry(saved_errno,
- rval = read(fd, buf, count)));
-
- reset_caller_errno(rval);
- return rval;
-}
-
-ssize_t
-pread_on_eintr(int fd,
- void *buf, size_t count,
- off_t off)
-{
- int saved_errno = errno;
- ssize_t rval = 0;
- errno = 0;
-
- if (if_err(buf == NULL, EFAULT) ||
- if_err(fd < 0, EBADF) ||
- if_err(off < 0, EFAULT) ||
- if_err(count == 0, EINVAL))
- return with_fallback_errno(EIO);
-
- while (rw_retry(saved_errno,
- rval = pread(fd, buf, count, off)));
-
- reset_caller_errno(rval);
- return rval;
-}
-
-ssize_t
-write_on_eintr(int fd,
- void *buf, size_t count)
-{
- int saved_errno = errno;
- ssize_t rval = 0;
- errno = 0;
-
- if (if_err(buf == NULL, EFAULT) ||
- if_err(fd < 0, EBADF) ||
- if_err(count == 0, EINVAL))
- return with_fallback_errno(EIO);
-
- while (rw_retry(saved_errno,
- rval = write(fd, buf, count)));
-
- reset_caller_errno(rval);
- return rval;
-}
-
-ssize_t
-pwrite_on_eintr(int fd,
- void *buf, size_t count,
- off_t off)
-{
- int saved_errno = errno;
- ssize_t rval = 0;
- errno = 0;
-
- if (if_err(buf == NULL, EFAULT) ||
- if_err(fd < 0, EBADF) ||
- if_err(off < 0, EFAULT) ||
- if_err(count == 0, EINVAL))
- return with_fallback_errno(EIO);
-
- while (rw_retry(saved_errno,
- rval = pwrite(fd, buf, count, off)));
-
- reset_caller_errno(rval);
- return rval;
-}
-
int
fsync_on_eintr(int fd)
{
diff --git a/util/libreboot-utils/lib/rand.c b/util/libreboot-utils/lib/rand.c
index 1591a3b0..a5617b18 100644
--- a/util/libreboot-utils/lib/rand.c
+++ b/util/libreboot-utils/lib/rand.c
@@ -165,8 +165,7 @@ retry_rand: {
open_file_on_eintr("/dev/urandom", &fd, O_RDONLY, 0400, NULL);
while (rw_retry(saved_errno,
- rc = read_on_eintr(fd,
- (unsigned char *)buf + off, n - off)));
+ rc = rw(fd, (unsigned char *)buf + off, n - off, 0, IO_READ)));
#elif defined(__linux__)
long rc;
while (sys_retry(saved_errno,