|
@@ -52,6 +52,7 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
|
|
size_t niov,
|
|
size_t niov,
|
|
int **fds,
|
|
int **fds,
|
|
size_t *nfds,
|
|
size_t *nfds,
|
|
|
|
+ int flags,
|
|
Error **errp)
|
|
Error **errp)
|
|
{
|
|
{
|
|
QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
|
|
QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
|
|
@@ -63,7 +64,14 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
- return klass->io_readv(ioc, iov, niov, fds, nfds, errp);
|
|
|
|
|
|
+ if ((flags & QIO_CHANNEL_READ_FLAG_MSG_PEEK) &&
|
|
|
|
+ !qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_READ_MSG_PEEK)) {
|
|
|
|
+ error_setg_errno(errp, EINVAL,
|
|
|
|
+ "Channel does not support peek read");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return klass->io_readv(ioc, iov, niov, fds, nfds, flags, errp);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -146,7 +154,7 @@ int qio_channel_readv_full_all_eof(QIOChannel *ioc,
|
|
while ((nlocal_iov > 0) || local_fds) {
|
|
while ((nlocal_iov > 0) || local_fds) {
|
|
ssize_t len;
|
|
ssize_t len;
|
|
len = qio_channel_readv_full(ioc, local_iov, nlocal_iov, local_fds,
|
|
len = qio_channel_readv_full(ioc, local_iov, nlocal_iov, local_fds,
|
|
- local_nfds, errp);
|
|
|
|
|
|
+ local_nfds, 0, errp);
|
|
if (len == QIO_CHANNEL_ERR_BLOCK) {
|
|
if (len == QIO_CHANNEL_ERR_BLOCK) {
|
|
if (qemu_in_coroutine()) {
|
|
if (qemu_in_coroutine()) {
|
|
qio_channel_yield(ioc, G_IO_IN);
|
|
qio_channel_yield(ioc, G_IO_IN);
|
|
@@ -284,7 +292,7 @@ ssize_t qio_channel_readv(QIOChannel *ioc,
|
|
size_t niov,
|
|
size_t niov,
|
|
Error **errp)
|
|
Error **errp)
|
|
{
|
|
{
|
|
- return qio_channel_readv_full(ioc, iov, niov, NULL, NULL, errp);
|
|
|
|
|
|
+ return qio_channel_readv_full(ioc, iov, niov, NULL, NULL, 0, errp);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -303,7 +311,7 @@ ssize_t qio_channel_read(QIOChannel *ioc,
|
|
Error **errp)
|
|
Error **errp)
|
|
{
|
|
{
|
|
struct iovec iov = { .iov_base = buf, .iov_len = buflen };
|
|
struct iovec iov = { .iov_base = buf, .iov_len = buflen };
|
|
- return qio_channel_readv_full(ioc, &iov, 1, NULL, NULL, errp);
|
|
|
|
|
|
+ return qio_channel_readv_full(ioc, &iov, 1, NULL, NULL, 0, errp);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|