On 27/05/2019 11.33, Yury Kotov wrote: > Signed-off-by: Yury Kotov <yury-ko...@yandex-team.ru> > --- > tests/libqtest.c | 83 ++++++++++++++++++++++++++++++-- > tests/libqtest.h | 51 +++++++++++++++++++- > tests/migration-test.c | 107 +++++++++++++++++++++++++++++++++++++++-- > 3 files changed, 233 insertions(+), 8 deletions(-) > > diff --git a/tests/libqtest.c b/tests/libqtest.c > index 8ac0c02af4..de8468d213 100644 > --- a/tests/libqtest.c > +++ b/tests/libqtest.c > @@ -32,6 +32,7 @@ > > #define MAX_IRQ 256 > #define SOCKET_TIMEOUT 50 > +#define SOCKET_MAX_FDS 16 > > QTestState *global_qtest; > > @@ -391,6 +392,43 @@ static void GCC_FMT_ATTR(2, 3) qtest_sendf(QTestState > *s, const char *fmt, ...) > va_end(ap); > }
A short description in front of the function about its purpose would be nice. > +static void socket_send_fds(int fd, int *fds, size_t fds_num, > + const char *buf, size_t buf_size) > +{ > +#ifndef WIN32 > + ssize_t ret; > + struct msghdr msg = { 0 }; > + char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 }; > + size_t fdsize = sizeof(int) * fds_num; > + struct cmsghdr *cmsg; > + struct iovec iov = { .iov_base = (char *)buf, .iov_len = buf_size }; > + > + msg.msg_iov = &iov; > + msg.msg_iovlen = 1; > + > + if (fds && fds_num > 0) { > + g_assert_cmpuint(fds_num, <, SOCKET_MAX_FDS); > + > + msg.msg_control = control; > + msg.msg_controllen = CMSG_SPACE(fdsize); > + > + cmsg = CMSG_FIRSTHDR(&msg); > + cmsg->cmsg_len = CMSG_LEN(fdsize); > + cmsg->cmsg_level = SOL_SOCKET; > + cmsg->cmsg_type = SCM_RIGHTS; > + memcpy(CMSG_DATA(cmsg), fds, fdsize); > + } > + > + do { > + ret = sendmsg(fd, &msg, 0); > + } while (ret < 0 && errno == EINTR); > + g_assert_cmpint(ret, >, 0); > +#else > + g_test_skip("sendmsg is not supported under Win32"); > + return; > +#endif > +} We're only compiling the qtests if CONFIG_POSIX=y, so I think you don't need to check for WIN32 here. Thomas