let's make sure we collect the right error code from errno, otherwise
we'll see EPERM (i.e. error 1) for all errors readv() returns (since it
returns -1 on error), including EAGAIN.
This is definitely backport material.
A fix-up for
3691bcf3c5eebdcca5b4f1c51c745441c57a6cd1.
Fixes: #16699
iov = IOVEC_MAKE((uint8_t *)b->rbuffer + b->rbuffer_size, n - b->rbuffer_size);
- if (b->prefer_readv)
+ if (b->prefer_readv) {
k = readv(b->input_fd, &iov, 1);
- else {
+ if (k < 0)
+ k = -errno;
+ } else {
mh = (struct msghdr) {
.msg_iov = &iov,
.msg_iovlen = 1,
iov = IOVEC_MAKE((uint8_t *)bus->rbuffer + bus->rbuffer_size, need - bus->rbuffer_size);
- if (bus->prefer_readv)
+ if (bus->prefer_readv) {
k = readv(bus->input_fd, &iov, 1);
- else {
+ if (k < 0)
+ k = -errno;
+ } else {
mh = (struct msghdr) {
.msg_iov = &iov,
.msg_iovlen = 1,