diff options
| author | Leah Rowe <leah@libreboot.org> | 2026-04-01 14:29:39 +0100 |
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2026-04-01 14:29:39 +0100 |
| commit | a879114734c7d0fdd54c58aacf925660a43a06ef (patch) | |
| tree | d13f4951b92a19d31680c61b61177891a8d33b36 /util/libreboot-utils | |
| parent | 229a2836045d102423688c3af259aab5dfbf520c (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.h | 8 | ||||
| -rw-r--r-- | util/libreboot-utils/lib/file.c | 141 | ||||
| -rw-r--r-- | util/libreboot-utils/lib/rand.c | 3 |
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, |
