From a879114734c7d0fdd54c58aacf925660a43a06ef Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Wed, 1 Apr 2026 14:29:39 +0100 Subject: 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 --- util/libreboot-utils/lib/file.c | 141 ++++++++++------------------------------ 1 file changed, 35 insertions(+), 106 deletions(-) (limited to 'util/libreboot-utils/lib/file.c') 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) { -- cgit v1.2.1