[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 13/31] libxl_qmp: Separate QMP message generation from qmp_send_prepare
This new function qmp_prepare_qmp_cmd() can be reuse later when introducing a different way to communicate with a QMP server, libxl__ev_qmp. Also, add the QMP end of command '\r\n' into the generated string. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> --- tools/libxl/libxl_qmp.c | 60 +++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 1184ca823f..9f4c3f5c20 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -578,17 +578,17 @@ 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_qmp_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); @@ -600,7 +600,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); @@ -610,6 +610,36 @@ 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_qmp_cmd(gc, + cmd, args, ++qmp->last_id_used, + NULL); + + if (!buf) { LOGD(ERROR, qmp->domid, "Failed to generate a qmp command"); goto out; } @@ -625,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, @@ -643,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; @@ -659,12 +687,10 @@ static int qmp_send(libxl__qmp_handler *qmp, "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 |