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>
This commit is contained in:
Leah Rowe
2026-04-01 14:29:39 +01:00
parent 229a283604
commit a879114734
3 changed files with 35 additions and 115 deletions
-8
View File
@@ -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);
+34 -105
View File
@@ -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);
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);
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;
}
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)
{
+1 -2
View File
@@ -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,