1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-08 08:58:27 +03:00

util: minor simplification for loop_write() and loop_read()

This commit is contained in:
Lennart Poettering 2014-12-12 03:12:58 +01:00
parent 0c3c42847d
commit 6ce830fa61

View File

@ -2268,21 +2268,25 @@ ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
ssize_t k;
k = read(fd, p, nbytes);
if (k < 0 && errno == EINTR)
continue;
if (k < 0) {
if (errno == EINTR)
continue;
if (k < 0 && errno == EAGAIN && do_poll) {
if (errno == EAGAIN && do_poll) {
/* We knowingly ignore any return value here,
* and expect that any error/EOF is reported
* via read() */
/* We knowingly ignore any return value here,
* and expect that any error/EOF is reported
* via read() */
fd_wait_for_event(fd, POLLIN, USEC_INFINITY);
continue;
fd_wait_for_event(fd, POLLIN, USEC_INFINITY);
continue;
}
return n > 0 ? n : -errno;
}
if (k <= 0)
return n > 0 ? n : (k < 0 ? -errno : 0);
if (k == 0)
return n;
p += k;
nbytes -= k;
@ -2294,7 +2298,6 @@ ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
const uint8_t *p = buf;
ssize_t n = 0;
assert(fd >= 0);
assert(buf);
@ -2305,26 +2308,27 @@ int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
ssize_t k;
k = write(fd, p, nbytes);
if (k < 0 && errno == EINTR)
continue;
if (k < 0) {
if (errno == EINTR)
continue;
if (k < 0 && errno == EAGAIN && do_poll) {
if (errno == EAGAIN && do_poll) {
/* We knowingly ignore any return value here,
* and expect that any error/EOF is reported
* via write() */
/* We knowingly ignore any return value here,
* and expect that any error/EOF is reported
* via write() */
fd_wait_for_event(fd, POLLOUT, USEC_INFINITY);
continue;
}
fd_wait_for_event(fd, POLLOUT, USEC_INFINITY);
continue;
return -errno;
}
if (k <= 0)
/* We were not done yet, and a write error occured. */
return errno ? -errno : -EIO;
if (k == 0) /* Can't really happen */
return -EIO;
p += k;
nbytes -= k;
n += k;
}
return 0;