mirror of https://github.com/xemu-project/xemu.git
libqtest: make qtest_qmp_add_client work on win32
Use the "get-win32-socket" function to pass an opened socket to QEMU, instead of using "getfd", which relies on socket ancillary FD message passing. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Message-Id: <20230306122751.2355515-10-marcandre.lureau@redhat.com>
This commit is contained in:
parent
4cda177c60
commit
61683d278b
|
@ -1478,13 +1478,28 @@ void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
|
||||||
qobject_unref(args);
|
qobject_unref(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
||||||
{
|
{
|
||||||
QDict *resp;
|
QDict *resp;
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
WSAPROTOCOL_INFOW info;
|
||||||
|
g_autofree char *info64 = NULL;
|
||||||
|
SOCKET s;
|
||||||
|
|
||||||
|
assert(fd_is_socket(fd));
|
||||||
|
s = _get_osfhandle(fd);
|
||||||
|
if (WSADuplicateSocketW(s, GetProcessId((HANDLE)qts->qemu_pid), &info) == SOCKET_ERROR) {
|
||||||
|
g_autofree char *emsg = g_win32_error_message(WSAGetLastError());
|
||||||
|
g_error("WSADuplicateSocketW failed: %s", emsg);
|
||||||
|
}
|
||||||
|
info64 = g_base64_encode((guchar *)&info, sizeof(info));
|
||||||
|
resp = qtest_qmp(qts, "{'execute': 'get-win32-socket',"
|
||||||
|
"'arguments': {'fdname': 'fdname', 'info': %s}}", info64);
|
||||||
|
#else
|
||||||
resp = qtest_qmp_fds(qts, &fd, 1, "{'execute': 'getfd',"
|
resp = qtest_qmp_fds(qts, &fd, 1, "{'execute': 'getfd',"
|
||||||
"'arguments': {'fdname': 'fdname'}}");
|
"'arguments': {'fdname': 'fdname'}}");
|
||||||
|
#endif
|
||||||
g_assert(resp);
|
g_assert(resp);
|
||||||
g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
|
g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
|
||||||
g_assert(!qdict_haskey(resp, "error"));
|
g_assert(!qdict_haskey(resp, "error"));
|
||||||
|
@ -1498,7 +1513,6 @@ void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
||||||
g_assert(!qdict_haskey(resp, "error"));
|
g_assert(!qdict_haskey(resp, "error"));
|
||||||
qobject_unref(resp);
|
qobject_unref(resp);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic hot-unplugging test via the device_del QMP command.
|
* Generic hot-unplugging test via the device_del QMP command.
|
||||||
|
|
|
@ -758,17 +758,16 @@ void qtest_qmp_device_add_qdict(QTestState *qts, const char *drv,
|
||||||
void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
|
void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
|
||||||
const char *fmt, ...) G_GNUC_PRINTF(4, 5);
|
const char *fmt, ...) G_GNUC_PRINTF(4, 5);
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
/**
|
/**
|
||||||
* qtest_qmp_add_client:
|
* qtest_qmp_add_client:
|
||||||
* @qts: QTestState instance to operate on
|
* @qts: QTestState instance to operate on
|
||||||
* @protocol: the protocol to add to
|
* @protocol: the protocol to add to
|
||||||
* @fd: the client file-descriptor
|
* @fd: the client file-descriptor
|
||||||
*
|
*
|
||||||
* Call QMP ``getfd`` followed by ``add_client`` with the given @fd.
|
* Call QMP ``getfd`` (on Windows ``get-win32-socket``) followed by
|
||||||
|
* ``add_client`` with the given @fd.
|
||||||
*/
|
*/
|
||||||
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd);
|
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd);
|
||||||
#endif /* _WIN32 */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qtest_qmp_device_del_send:
|
* qtest_qmp_device_del_send:
|
||||||
|
|
Loading…
Reference in New Issue