Add a possibility to keep socket non-block status when passing through qio channel. We need this to support migration of open fds through migration channel.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@yandex-team.ru> --- include/io/channel-socket.h | 3 +++ io/channel-socket.c | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h index a88cf8b3a9..0a4327d745 100644 --- a/include/io/channel-socket.h +++ b/include/io/channel-socket.h @@ -49,6 +49,7 @@ struct QIOChannelSocket { socklen_t remoteAddrLen; ssize_t zero_copy_queued; ssize_t zero_copy_sent; + bool keep_nonblock; }; @@ -275,4 +276,6 @@ int qio_channel_socket_set_send_buffer(QIOChannelSocket *ioc, size_t size, Error **errp); +void qio_channel_socket_keep_nonblock(QIOChannel *ioc); + #endif /* QIO_CHANNEL_SOCKET_H */ diff --git a/io/channel-socket.c b/io/channel-socket.c index 3b7ca924ff..cd93d7f180 100644 --- a/io/channel-socket.c +++ b/io/channel-socket.c @@ -462,9 +462,16 @@ static void qio_channel_socket_finalize(Object *obj) } +void qio_channel_socket_keep_nonblock(QIOChannel *ioc) +{ + QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc); + sioc->keep_nonblock = true; +} + + #ifndef WIN32 static void qio_channel_socket_copy_fds(struct msghdr *msg, - int **fds, size_t *nfds) + int **fds, size_t *nfds, bool set_block) { struct cmsghdr *cmsg; @@ -497,8 +504,9 @@ static void qio_channel_socket_copy_fds(struct msghdr *msg, continue; } - /* O_NONBLOCK is preserved across SCM_RIGHTS so reset it */ - qemu_socket_set_block(fd); + if (set_block) { + qemu_socket_set_block(fd); + } #ifndef MSG_CMSG_CLOEXEC qemu_set_cloexec(fd); @@ -556,7 +564,7 @@ static ssize_t qio_channel_socket_readv(QIOChannel *ioc, } if (fds && nfds) { - qio_channel_socket_copy_fds(&msg, fds, nfds); + qio_channel_socket_copy_fds(&msg, fds, nfds, !sioc->keep_nonblock); } return ret; -- 2.48.1