mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-19 19:23:24 +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);
|
ssize_t rw_over_nrw(ssize_t r, size_t nrw);
|
||||||
off_t lseek_on_eintr(int fd, off_t off,
|
off_t lseek_on_eintr(int fd, off_t off,
|
||||||
int whence);
|
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 off_retry(int saved_errno, off_t rval);
|
||||||
int sys_retry(int saved_errno, long rval);
|
int sys_retry(int saved_errno, long rval);
|
||||||
int fs_retry(int saved_errno, int rval);
|
int fs_retry(int saved_errno, int rval);
|
||||||
|
|||||||
+34
-105
@@ -202,14 +202,20 @@ err_rw_file_exact:
|
|||||||
return with_fallback_errno(EIO);
|
return with_fallback_errno(EIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rw() - read-write but with more
|
/**
|
||||||
|
* rw() - read-write but with more
|
||||||
* safety checks than barebones libc
|
* safety checks than barebones libc
|
||||||
*
|
*
|
||||||
* A fallback is provided for regular read/write.
|
* A fallback is provided for regular read/write.
|
||||||
* rw_type can be IO_READ (read), IO_WRITE (write),
|
* rw_type can be IO_READ (read), IO_WRITE (write),
|
||||||
* IO_PREAD (pread) or IO_PWRITE
|
* 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
|
ssize_t
|
||||||
rw(int fd, void *mem, size_t nrw,
|
rw(int fd, void *mem, size_t nrw,
|
||||||
off_t off, int rw_type)
|
off_t off, int rw_type)
|
||||||
@@ -219,27 +225,34 @@ rw(int fd, void *mem, size_t nrw,
|
|||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
if (io_args(fd, mem, nrw, off, rw_type) == -1)
|
if (io_args(fd, mem, nrw, off, rw_type) == -1 ||
|
||||||
return with_fallback_errno(EINVAL);
|
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) {
|
do {
|
||||||
case IO_WRITE:
|
switch (rw_type) {
|
||||||
r = write_on_eintr(fd, mem, nrw);
|
case IO_READ:
|
||||||
break;
|
r = read(fd, mem, nrw);
|
||||||
case IO_READ:
|
break;
|
||||||
r = read_on_eintr(fd, mem, nrw);
|
case IO_WRITE:
|
||||||
break;
|
r = write(fd, mem, nrw);
|
||||||
case IO_PWRITE:
|
break;
|
||||||
r = pwrite_on_eintr(fd, mem, nrw, off);
|
case IO_PREAD:
|
||||||
break;
|
r = pread(fd, mem, nrw, off);
|
||||||
case IO_PREAD:
|
break;
|
||||||
r = pread_on_eintr(fd, mem, nrw, off);
|
case IO_PWRITE:
|
||||||
break;
|
r = pwrite(fd, mem, nrw, off);
|
||||||
default:
|
break;
|
||||||
errno = EINVAL;
|
default:
|
||||||
break;
|
errno = EINVAL;
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (rw_retry(saved_errno, r));
|
||||||
|
|
||||||
if ((rval = rw_over_nrw(r, nrw)) < 0)
|
if ((rval = rw_over_nrw(r, nrw)) < 0)
|
||||||
return with_fallback_errno(EIO);
|
return with_fallback_errno(EIO);
|
||||||
|
|
||||||
@@ -703,90 +716,6 @@ mkdirat_on_eintr(int dirfd,
|
|||||||
return rval;
|
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
|
int
|
||||||
fsync_on_eintr(int fd)
|
fsync_on_eintr(int fd)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -165,8 +165,7 @@ retry_rand: {
|
|||||||
open_file_on_eintr("/dev/urandom", &fd, O_RDONLY, 0400, NULL);
|
open_file_on_eintr("/dev/urandom", &fd, O_RDONLY, 0400, NULL);
|
||||||
|
|
||||||
while (rw_retry(saved_errno,
|
while (rw_retry(saved_errno,
|
||||||
rc = read_on_eintr(fd,
|
rc = rw(fd, (unsigned char *)buf + off, n - off, 0, IO_READ)));
|
||||||
(unsigned char *)buf + off, n - off)));
|
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
long rc;
|
long rc;
|
||||||
while (sys_retry(saved_errno,
|
while (sys_retry(saved_errno,
|
||||||
|
|||||||
Reference in New Issue
Block a user