[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 05/15] libxl_qmp: Separate QMP message generation from qmp_send_prepare
To be able to re-use qmp_prepare_qmp_cmd with libxl__ev_qmp. Also, add the QMP end of command '\r\n' into the generated string. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> --- Notes: v5: rename qmp_prepare_qmp_cmd to qmp_prepare_cmd fix coding style tools/libxl/libxl_qmp.c | 56 ++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 3817c70830..a537dd13e8 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -577,17 +577,15 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp) return rc; } -static char *qmp_send_prepare(libxl__gc *gc, libxl__qmp_handler *qmp, - const char *cmd, libxl__json_object *args, - qmp_callback_t callback, void *opaque, - qmp_request_context *context) +static char *qmp_prepare_cmd(libxl__gc *gc, const char *cmd, + const libxl__json_object *args, + int id, size_t *len_r) { - const unsigned char *buf = NULL; - char *ret = NULL; - libxl_yajl_length len = 0; + const unsigned char *buf; + libxl_yajl_length len; yajl_gen_status s; yajl_gen hand; - callback_id_pair *elm = NULL; + char *ret = NULL; hand = libxl_yajl_gen_alloc(NULL); @@ -604,7 +602,7 @@ static char *qmp_send_prepare(libxl__gc *gc, libxl__qmp_handler *qmp, libxl__yajl_gen_asciiz(hand, "execute"); libxl__yajl_gen_asciiz(hand, cmd); libxl__yajl_gen_asciiz(hand, "id"); - yajl_gen_integer(hand, ++qmp->last_id_used); + yajl_gen_integer(hand, id); if (args) { libxl__yajl_gen_asciiz(hand, "arguments"); libxl__json_object_to_yajl_gen(gc, hand, args); @@ -614,6 +612,34 @@ static char *qmp_send_prepare(libxl__gc *gc, libxl__qmp_handler *qmp, s = yajl_gen_get_buf(hand, &buf, &len); if (s) { + goto out; + } + + ret = libxl__malloc(NOGC, len + 3); + strncpy(ret, (const char *)buf, len + 3); + strncpy(ret + len, "\r\n", 3); + len += 2; + + if (len_r) + *len_r = len; + +out: + yajl_gen_free(hand); + return ret; +} + +static char *qmp_send_prepare(libxl__gc *gc, libxl__qmp_handler *qmp, + const char *cmd, libxl__json_object *args, + qmp_callback_t callback, void *opaque, + qmp_request_context *context, + size_t *len_r) +{ + char *buf; + callback_id_pair *elm; + + buf = qmp_prepare_cmd(gc, cmd, args, ++qmp->last_id_used, NULL); + + if (!buf) { LOGD(ERROR, qmp->domid, "Failed to generate a qmp command"); goto out; } @@ -629,13 +655,10 @@ static char *qmp_send_prepare(libxl__gc *gc, libxl__qmp_handler *qmp, elm->context = context; LIBXL_STAILQ_INSERT_TAIL(&qmp->callback_list, elm, next); - ret = libxl__strndup(gc, (const char*)buf, len); - LOGD(DEBUG, qmp->domid, "next qmp command: '%s'", buf); out: - yajl_gen_free(hand); - return ret; + return buf; } static int qmp_send(libxl__qmp_handler *qmp, @@ -647,7 +670,8 @@ static int qmp_send(libxl__qmp_handler *qmp, int rc = -1; GC_INIT(qmp->ctx); - buf = qmp_send_prepare(gc, qmp, cmd, args, callback, opaque, context); + buf = qmp_send_prepare(gc, qmp, cmd, args, callback, opaque, context, + NULL); if (buf == NULL) { goto out; @@ -656,12 +680,10 @@ static int qmp_send(libxl__qmp_handler *qmp, if (libxl_write_exactly(qmp->ctx, qmp->qmp_fd, buf, strlen(buf), "QMP command", "QMP socket")) goto out; - if (libxl_write_exactly(qmp->ctx, qmp->qmp_fd, "\r\n", 2, - "CRLF", "QMP socket")) - goto out; rc = qmp->last_id_used; out: + free(buf); GC_FREE; return rc; } -- 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 |