mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 05:52:36 +02:00
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:
@@ -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
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user