mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-20 05:36:23 +02:00
libreboot-utils/lib: loop eintr on [p]read/[p]write
i forgot to do this! with this, I/O should be bullet proof now. i already loop this on other I/O commands. Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
@@ -482,6 +482,14 @@ 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 loop_eagain, int loop_eintr);
|
int whence, int loop_eagain, int loop_eintr);
|
||||||
int try_err(int loop_err, int errval);
|
int try_err(int loop_err, int errval);
|
||||||
|
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);
|
||||||
|
|
||||||
/* Error handling and cleanup
|
/* Error handling and cleanup
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -323,15 +323,15 @@ try_rw_again:
|
|||||||
real_pread_pwrite:
|
real_pread_pwrite:
|
||||||
#endif
|
#endif
|
||||||
if (rw_type == IO_WRITE)
|
if (rw_type == IO_WRITE)
|
||||||
r = write(fd, mem, nrw);
|
r = write_on_eintr(fd, mem, nrw);
|
||||||
else if (rw_type == IO_READ)
|
else if (rw_type == IO_READ)
|
||||||
r = read(fd, mem, nrw);
|
r = read_on_eintr(fd, mem, nrw);
|
||||||
#if defined(REAL_POS_IO) && \
|
#if defined(REAL_POS_IO) && \
|
||||||
REAL_POS_IO > 0
|
REAL_POS_IO > 0
|
||||||
else if (rw_type == IO_PWRITE)
|
else if (rw_type == IO_PWRITE)
|
||||||
r = pwrite(fd, mem, nrw, off);
|
r = pwrite_on_eintr(fd, mem, nrw, off);
|
||||||
else if (rw_type == IO_PREAD)
|
else if (rw_type == IO_PREAD)
|
||||||
r = pread(fd, mem, nrw, off);
|
r = pread_on_eintr(fd, mem, nrw, off);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (r == -1 && (errno == try_err(loop_eintr, EINTR)
|
if (r == -1 && (errno == try_err(loop_eintr, EINTR)
|
||||||
@@ -386,9 +386,9 @@ real_pread_pwrite:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rw_type == IO_PREAD)
|
if (rw_type == IO_PREAD)
|
||||||
r = read(fd, mem, nrw);
|
r = read_on_eintr(fd, mem, nrw);
|
||||||
else if (rw_type == IO_PWRITE)
|
else if (rw_type == IO_PWRITE)
|
||||||
r = write(fd, mem, nrw);
|
r = write_on_eintr(fd, mem, nrw);
|
||||||
|
|
||||||
if (rw_over_nrw(r, nrw) == -1)
|
if (rw_over_nrw(r, nrw) == -1)
|
||||||
break;
|
break;
|
||||||
@@ -955,13 +955,118 @@ retry:
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
read_on_eintr(int fd,
|
||||||
|
void *buf, size_t count)
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
int rval;
|
||||||
|
|
||||||
|
if (if_err(buf == NULL, EFAULT) ||
|
||||||
|
if_err(fd < 0, EBADF) ||
|
||||||
|
if_err(count == 0, EINVAL))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
retry:
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
if ((rval = read(fd, buf, count)) == -1 && (
|
||||||
|
errno == EINTR ||
|
||||||
|
errno == EAGAIN ||
|
||||||
|
errno == EWOULDBLOCK ||
|
||||||
|
errno == ETXTBSY))
|
||||||
|
goto retry;
|
||||||
|
|
||||||
|
errno = saved_errno;
|
||||||
|
return rval;
|
||||||
|
err:
|
||||||
|
return set_errno(saved_errno, EIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
pread_on_eintr(int fd,
|
||||||
|
void *buf, size_t count,
|
||||||
|
off_t off)
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
int rval;
|
||||||
|
|
||||||
|
if (if_err(buf == NULL, EFAULT) ||
|
||||||
|
if_err(fd < 0, EBADF) ||
|
||||||
|
if_err(off < 0, EFAULT) ||
|
||||||
|
if_err(count == 0, EINVAL))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
retry:
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
if ((rval = pread(fd, buf, count, off)) == -1 && (
|
||||||
|
errno == EINTR ||
|
||||||
|
errno == EAGAIN ||
|
||||||
|
errno == EWOULDBLOCK ||
|
||||||
|
errno == ETXTBSY))
|
||||||
|
goto retry;
|
||||||
|
|
||||||
|
errno = saved_errno;
|
||||||
|
return rval;
|
||||||
|
err:
|
||||||
|
return set_errno(saved_errno, EIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
write_on_eintr(int fd,
|
||||||
|
void *buf, size_t count)
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
int rval;
|
||||||
|
|
||||||
|
if (if_err(buf == NULL, EFAULT) ||
|
||||||
|
if_err(fd < 0, EBADF) ||
|
||||||
|
if_err(count == 0, EINVAL))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
retry:
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
if ((rval = write(fd, buf, count)) == -1 && (
|
||||||
|
errno == EINTR ||
|
||||||
|
errno == EAGAIN ||
|
||||||
|
errno == EWOULDBLOCK ||
|
||||||
|
errno == ETXTBSY))
|
||||||
|
goto retry;
|
||||||
|
|
||||||
|
errno = saved_errno;
|
||||||
|
return rval;
|
||||||
|
err:
|
||||||
|
return set_errno(saved_errno, EIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
pwrite_on_eintr(int fd,
|
||||||
|
void *buf, size_t count,
|
||||||
|
off_t off)
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
int rval;
|
||||||
|
|
||||||
|
if (if_err(buf == NULL, EFAULT) ||
|
||||||
|
if_err(fd < 0, EBADF) ||
|
||||||
|
if_err(off < 0, EFAULT) ||
|
||||||
|
if_err(count == 0, EINVAL))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
retry:
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
if ((rval = pwrite(fd, buf, count, off)) == -1 && (
|
||||||
|
errno == EINTR ||
|
||||||
|
errno == EAGAIN ||
|
||||||
|
errno == EWOULDBLOCK ||
|
||||||
|
errno == ETXTBSY))
|
||||||
|
goto retry;
|
||||||
|
|
||||||
|
errno = saved_errno;
|
||||||
|
return rval;
|
||||||
|
err:
|
||||||
|
return set_errno(saved_errno, EIO);
|
||||||
|
}
|
||||||
|
|||||||
@@ -150,7 +150,8 @@ rset(void *buf, size_t n)
|
|||||||
int fd = -1;
|
int fd = -1;
|
||||||
open_on_eintr("/dev/urandom", &fd, O_RDONLY, 0400, NULL);
|
open_on_eintr("/dev/urandom", &fd, O_RDONLY, 0400, NULL);
|
||||||
retry_rand:
|
retry_rand:
|
||||||
if ((rc = read(fd, (unsigned char *)buf + off, n - off)) < 0) {
|
if ((rc = read_on_eintr(fd,
|
||||||
|
(unsigned char *)buf + off, n - off)) < 0) {
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
retry_rand:
|
retry_rand:
|
||||||
if ((rc = (ssize_t)syscall(SYS_getrandom,
|
if ((rc = (ssize_t)syscall(SYS_getrandom,
|
||||||
|
|||||||
Reference in New Issue
Block a user