[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v6 02/11] 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: v6: comment about ownership of buf use lib__sprintf instead of two strncpy v5: rename qmp_prepare_qmp_cmd to qmp_prepare_cmd fix coding style tools/libxl/libxl_qmp.c | 57 ++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 6a5c997546..2dd54d5398 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -571,17 +571,16 @@ 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; + yajl_gen hand = NULL; + /* memory for 'buf' is owned by 'hand' */ + 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); @@ -598,7 +597,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); @@ -608,6 +607,32 @@ 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__sprintf(NOGC, "%*.*s\r\n", (int)len, (int)len, buf); + 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; } @@ -623,13 +648,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, @@ -641,7 +663,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; @@ -650,12 +673,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 |