diff options
author | Anthony PERARD <anthony.perard@citrix.com> | 2011-12-01 18:09:42 +0000 |
---|---|---|
committer | Anthony PERARD <anthony.perard@citrix.com> | 2011-12-01 18:09:42 +0000 |
commit | 5ca4745339164c9c3fb3f3c353a25ed11fe3616f (patch) | |
tree | d6f966a6c94fce1e5601d1dff3cb8707026391e0 /tools/libxl/libxl_qmp.c | |
parent | 953d771e73711b638e7dbcc351fb64d88fb92ed5 (diff) | |
download | xen-5ca4745339164c9c3fb3f3c353a25ed11fe3616f.tar.gz xen-5ca4745339164c9c3fb3f3c353a25ed11fe3616f.tar.bz2 xen-5ca4745339164c9c3fb3f3c353a25ed11fe3616f.zip |
libxl: split libxl__qmp_send
This patch prepares for the next patch, that will introduce an
alternative send function.
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Acked-by: Ian Jackson <ian.jackson.citrix.com>
Committed-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/libxl/libxl_qmp.c')
-rw-r--r-- | tools/libxl/libxl_qmp.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 66a013435e..4c261369d5 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -446,13 +446,14 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp) return rc; } -static int qmp_send(libxl__qmp_handler *qmp, - const char *cmd, libxl_key_value_list *args, - qmp_callback_t callback, void *opaque, - qmp_request_context *context) +static char *qmp_send_prepare(libxl__gc *gc, libxl__qmp_handler *qmp, + const char *cmd, libxl_key_value_list *args, + qmp_callback_t callback, void *opaque, + qmp_request_context *context) { yajl_gen_config conf = { 0, NULL }; - const unsigned char *buf; + const unsigned char *buf = NULL; + char *ret = NULL; unsigned int len = 0; yajl_gen_status s; yajl_gen hand; @@ -460,7 +461,7 @@ static int qmp_send(libxl__qmp_handler *qmp, hand = yajl_gen_alloc(&conf, NULL); if (!hand) { - return -1; + return NULL; } yajl_gen_map_open(hand); @@ -479,14 +480,14 @@ static int qmp_send(libxl__qmp_handler *qmp, if (s) { LIBXL__LOG(qmp->ctx, LIBXL__LOG_ERROR, "Failed to generate a qmp command"); - return -1; + goto out; } elm = malloc(sizeof (callback_id_pair)); if (elm == NULL) { LIBXL__LOG_ERRNO(qmp->ctx, LIBXL__LOG_ERROR, "Failed to allocate a QMP callback"); - goto error; + goto out; } elm->id = qmp->last_id_used; elm->callback = callback; @@ -494,22 +495,41 @@ static int qmp_send(libxl__qmp_handler *qmp, elm->context = context; SIMPLEQ_INSERT_TAIL(&qmp->callback_list, elm, next); + ret = libxl__strndup(gc, (const char*)buf, len); + LIBXL__LOG(qmp->ctx, LIBXL__LOG_DEBUG, "next qmp command: '%s'", buf); - if (libxl_write_exactly(qmp->ctx, qmp->qmp_fd, buf, len, +out: + yajl_gen_free(hand); + return ret; +} + +static int qmp_send(libxl__qmp_handler *qmp, + const char *cmd, libxl_key_value_list *args, + qmp_callback_t callback, void *opaque, + qmp_request_context *context) +{ + char *buf = NULL; + int rc = -1; + libxl__gc gc = LIBXL_INIT_GC(qmp->ctx); + + buf = qmp_send_prepare(&gc, qmp, cmd, args, callback, opaque, context); + + if (buf == NULL) { + goto out; + } + + if (libxl_write_exactly(qmp->ctx, qmp->qmp_fd, buf, strlen(buf), "QMP command", "QMP socket")) - goto error; + goto out; if (libxl_write_exactly(qmp->ctx, qmp->qmp_fd, "\r\n", 2, "CRLF", "QMP socket")) - goto error; + goto out; - yajl_gen_free(hand); - - return qmp->last_id_used; - -error: - yajl_gen_free(hand); - return -1; + rc = qmp->last_id_used; +out: + libxl__free_all(&gc); + return rc; } static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd, |