mirror of https://gitee.com/openkylin/qemu.git
libqtest: add qtest_socket_server()
Add an API that returns a new UNIX domain socket in the listen state. The code for this was already there but only used internally in init_socket(). This new API will be used by vhost-user-blk-test. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com> Message-Id: <20210223144653.811468-3-stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
535255b438
commit
9fb7bb0698
|
@ -132,6 +132,14 @@ void qtest_qmp_send(QTestState *s, const char *fmt, ...)
|
|||
void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...)
|
||||
GCC_FMT_ATTR(2, 3);
|
||||
|
||||
/**
|
||||
* qtest_socket_server:
|
||||
* @socket_path: the UNIX domain socket path
|
||||
*
|
||||
* Create and return a listen socket file descriptor, or abort on failure.
|
||||
*/
|
||||
int qtest_socket_server(const char *socket_path);
|
||||
|
||||
/**
|
||||
* qtest_vqmp_fds:
|
||||
* @s: #QTestState instance to operate on.
|
||||
|
|
|
@ -81,24 +81,8 @@ static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv);
|
|||
|
||||
static int init_socket(const char *socket_path)
|
||||
{
|
||||
struct sockaddr_un addr;
|
||||
int sock;
|
||||
int ret;
|
||||
|
||||
sock = socket(PF_UNIX, SOCK_STREAM, 0);
|
||||
g_assert_cmpint(sock, !=, -1);
|
||||
|
||||
addr.sun_family = AF_UNIX;
|
||||
snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socket_path);
|
||||
int sock = qtest_socket_server(socket_path);
|
||||
qemu_set_cloexec(sock);
|
||||
|
||||
do {
|
||||
ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
|
||||
} while (ret == -1 && errno == EINTR);
|
||||
g_assert_cmpint(ret, !=, -1);
|
||||
ret = listen(sock, 1);
|
||||
g_assert_cmpint(ret, !=, -1);
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
|
@ -638,6 +622,28 @@ QDict *qtest_qmp_receive_dict(QTestState *s)
|
|||
return qmp_fd_receive(s->qmp_fd);
|
||||
}
|
||||
|
||||
int qtest_socket_server(const char *socket_path)
|
||||
{
|
||||
struct sockaddr_un addr;
|
||||
int sock;
|
||||
int ret;
|
||||
|
||||
sock = socket(PF_UNIX, SOCK_STREAM, 0);
|
||||
g_assert_cmpint(sock, !=, -1);
|
||||
|
||||
addr.sun_family = AF_UNIX;
|
||||
snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socket_path);
|
||||
|
||||
do {
|
||||
ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
|
||||
} while (ret == -1 && errno == EINTR);
|
||||
g_assert_cmpint(ret, !=, -1);
|
||||
ret = listen(sock, 1);
|
||||
g_assert_cmpint(ret, !=, -1);
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow users to send a message without waiting for the reply,
|
||||
* in the case that they choose to discard all replies up until
|
||||
|
|
Loading…
Reference in New Issue