|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 13/32] libxl_qmp: Connect to QMP socket
On Fri, Jul 27, 2018 at 03:05:55PM +0100, Anthony PERARD wrote:
> This is a first patch to implement libxl__ev_qmp, it only connect to the
^ connects
> QMP socket of QEMU and register a fd callback that does nothing.
^ registers
>
> Callback functions will be implemented in following patches.
>
> Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
> ---
> tools/libxl/libxl_internal.h | 11 +++++
> tools/libxl/libxl_qmp.c | 96 ++++++++++++++++++++++++++++++++++++
> 2 files changed, 107 insertions(+)
>
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index c453ac10a5..90ac48a659 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -417,6 +417,14 @@ _hidden int libxl__ev_qmp_send(libxl__gc *gc,
> libxl__ev_qmp *ev,
> const char *cmd, libxl__json_object *args);
> _hidden void libxl__ev_qmp_dispose(libxl__gc *gc, libxl__ev_qmp *ev);
>
> +typedef enum {
> + qmp_state_disconnected = 1,
> + qmp_state_connecting,
> + qmp_state_greeting,
> + qmp_state_capability_negociation,
> + qmp_state_connected,
> +} libxl__qmp_state;
> +
I think this should be declared in libxl_types_internal.idl?
And (maybe) a description of each state would be helpful for future
reference?
> struct libxl__ev_qmp {
> /* caller should include this in their own struct */
> /* caller must fill these in, and they must all remain valid */
> @@ -427,6 +435,9 @@ struct libxl__ev_qmp {
> /* remaining fields are private to libxl_ev_qmp_* */
>
> int id;
> + libxl__carefd *qmp_cfd;
> + libxl__ev_fd qmp_efd;
> + libxl__qmp_state qmp_state;
> };
>
>
> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
> index c5e05e5679..96a347dd3b 100644
> --- a/tools/libxl/libxl_qmp.c
> +++ b/tools/libxl/libxl_qmp.c
> @@ -1276,6 +1276,102 @@ int libxl__qmp_initializations(libxl__gc *gc,
> uint32_t domid,
> return ret;
> }
>
> +/* ------------ Implementation of libxl__ev_qmp ---------------- */
> +
> +static void qmp_ev_fd_callback(libxl__egc *egc, libxl__ev_fd *ev_fd,
> + int fd, short events, short revents)
> +{
> +}
> +
> +static int qmp_ev_connect(libxl__gc *gc, libxl__ev_qmp *ev)
> +{
> + int rc, r;
> + struct sockaddr_un un;
> + const char *qmp_socket_path;
> +
> + if (ev->qmp_state != qmp_state_disconnected)
> + return 0;
> +
> + qmp_socket_path = libxl__qemu_qmp_path(gc, ev->domid);
> +
> + LOGD(DEBUG, ev->domid, "Connecting to %s", qmp_socket_path);
> +
> + libxl__carefd_begin();
> + ev->qmp_cfd = libxl__carefd_opened(CTX, socket(AF_UNIX, SOCK_STREAM, 0));
> + if (!ev->qmp_cfd) {
> + LOGED(ERROR, ev->domid, "socket() failed");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> + rc = libxl_fd_set_nonblock(CTX, libxl__carefd_fd(ev->qmp_cfd), 1);
> + if (rc)
> + goto out;
> +
> + rc = libxl__prepare_sockaddr_un(gc, &un, qmp_socket_path, "QMP socket");
> + if (rc)
> + goto out;
> +
> + r = connect(libxl__carefd_fd(ev->qmp_cfd),
> + (struct sockaddr *) &un, sizeof(un));
> + if (r) {
> + LOGED(ERROR, ev->domid, "Failed to connect to QMP socket %s",
> + qmp_socket_path);
> + rc = ERROR_FAIL;
> + goto out;
> + }
> +
> + rc = libxl__ev_fd_register(gc, &ev->qmp_efd, qmp_ev_fd_callback,
> + libxl__carefd_fd(ev->qmp_cfd), POLLIN);
> + if (rc)
> + goto out;
> +
> + ev->qmp_state = qmp_state_connecting;
> + return 0;
> +
> +out:
> + libxl__carefd_close(ev->qmp_cfd);
> + ev->qmp_cfd = NULL;
> + return rc;
> +}
> +
> +
Double newline.
> +/*
> + * libxl__ev_qmp_*
> + */
> +
> +void libxl__ev_qmp_init(libxl__ev_qmp *ev)
> +{
> + ev->id = -1;
> +
> + ev->qmp_cfd = NULL;
> + libxl__ev_fd_init(&ev->qmp_efd);
> + ev->qmp_state = qmp_state_disconnected;
> +}
> +
> +int libxl__ev_qmp_send(libxl__gc *gc, libxl__ev_qmp *ev,
> + const char *cmd, libxl__json_object *args)
> +{
> + int rc;
> +
> + LOGD(DEBUG, ev->domid, " ev %p, cmd '%s'", ev, cmd);
> +
> + /* Connect to QEMU if not already connected */
> + rc = qmp_ev_connect(gc, ev);
> +
> + return rc;
You can get rid of rc and just use:
return qmp_ev_connect(gc, ev);
> +}
> +
> +void libxl__ev_qmp_dispose(libxl__gc *gc, libxl__ev_qmp *ev)
> +{
> + LOGD(DEBUG, ev->domid, " ev %p", ev);
> +
> + libxl__ev_fd_deregister(gc, &ev->qmp_efd);
> + libxl__carefd_close(ev->qmp_cfd);
> + ev->qmp_cfd = NULL;
No need to set qmp_cfd to NULL if you call _init afterwards.
> +
> + libxl__ev_qmp_init(ev);
Thanks, Roger.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |