[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 06/15] libxl_qmp: Prepare the command to be sent
The actual sent will be done in a separate patch. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> --- tools/libxl/libxl_internal.h | 3 +++ tools/libxl/libxl_qmp.c | 40 +++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 0590801b30..0f3eda249a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -439,6 +439,7 @@ struct libxl__ev_qmp { libxl__carefd *qmp_cfd; libxl__ev_fd qmp_efd; libxl__qmp_state qmp_state; + unsigned int last_id_used; /* receive buffer, with: * buf_size: current allocated size, * buf_used: actual data in the buffer, @@ -447,6 +448,8 @@ struct libxl__ev_qmp { size_t buf_size; size_t buf_used; size_t buf_consumed; + char *tx_buf; + size_t tx_buf_len; }; diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index a537dd13e8..b5cc0af513 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -1310,6 +1310,25 @@ int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid, /* ------------ Implementation of libxl__ev_qmp ---------------- */ +static int qmp_ev_prepare_cmd(libxl__gc *gc, + libxl__ev_qmp *ev, + const char *cmd, + const libxl__json_object *args) +{ + char *buf = NULL; + size_t len; + + buf = qmp_prepare_cmd(gc, cmd, args, ++ev->last_id_used, &len); + if (!buf) + return ERROR_FAIL; + + ev->id = ev->last_id_used; + ev->tx_buf = buf; + ev->tx_buf_len = len; + + return 0; +} + /* * QMP FD callbacks */ @@ -1418,6 +1437,9 @@ static void qmp_ev_callback_error(libxl__egc *egc, libxl__ev_qmp *ev) /* On error, deallocate all private ressources */ libxl__ev_qmp_dispose(gc, ev); + + ev->id = -1; + ev->callback(egc, ev, NULL, ERROR_FAIL); } static void qmp_ev_fd_callback(libxl__egc *egc, libxl__ev_fd *ev_fd, @@ -1515,17 +1537,32 @@ void libxl__ev_qmp_init(libxl__ev_qmp *ev) ev->qmp_cfd = NULL; libxl__ev_fd_init(&ev->qmp_efd); ev->qmp_state = qmp_state_disconnected; + ev->last_id_used = 0; ev->rx_buf = NULL; + ev->tx_buf = NULL; } 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 */ - return qmp_ev_connect(gc, ev); + rc = qmp_ev_connect(gc, ev); + if (rc) + goto out; + + rc = qmp_ev_prepare_cmd(gc, ev, cmd, args); + if (rc) + goto out; + +out: + if (rc) + libxl__ev_qmp_dispose(gc, ev); + return rc; } void libxl__ev_qmp_dispose(libxl__gc *gc, libxl__ev_qmp *ev) @@ -1533,6 +1570,7 @@ void libxl__ev_qmp_dispose(libxl__gc *gc, libxl__ev_qmp *ev) LOGD(DEBUG, ev->domid, " ev %p", ev); free(ev->rx_buf); + free(ev->tx_buf); libxl__ev_fd_deregister(gc, &ev->qmp_efd); libxl__carefd_close(ev->qmp_cfd); -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |