All the functions will be implemented in later patches. This patch includes the API that libxl can use to send QMP commands to QEMU.
Signed-off-by: Anthony PERARD <anthony.per...@citrix.com> --- tools/libxl/libxl_internal.h | 76 +++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 5b71a23d23..c453ac10a5 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -202,6 +202,8 @@ typedef struct libxl__ao libxl__ao; typedef struct libxl__aop_occurred libxl__aop_occurred; typedef struct libxl__osevent_hook_nexus libxl__osevent_hook_nexus; typedef struct libxl__osevent_hook_nexi libxl__osevent_hook_nexi; +typedef struct libxl__json_object libxl__json_object; +typedef struct libxl__carefd libxl__carefd; typedef struct libxl__domain_create_state libxl__domain_create_state; typedef void libxl__domain_create_cb(struct libxl__egc *egc, @@ -357,6 +359,76 @@ struct libxl__ev_child { LIBXL_LIST_ENTRY(struct libxl__ev_child) entry; }; +/* + * QMP asynchronous calls + */ + +/* + * This facility allows a command to be sent to QEMU, and the response to be + * handed to a callback function. Each libxl__ev_qmp handles zero or one + * outstanding command. + * + * Commands can be chained, with a same connection. (e.g. "add-fd" will need to + * be chained to the next command). A libxl__ev_qmp can be reused when the + * callback is been called in order to use the same connection. + * + * Only one connection at a time can be made to one QEMU, so avoid keeping a + * libxl__ev_qmp Connected for to long and call libxl__ev_qmp_dispose as soon + * as it is not needed anymore. + * + * Possible states of a libxl__ev_qmp: + * Undefined + * Might contain anything. + * Idle + * Struct contents are defined enough to pass to any libxl__ev_qmp_* + * functions. + * The struct does not contain references to any allocated private resources + * so can be thrown away. + * Active + * Currently waiting for the callback to be called. + * _dispose must be called to reclaim resources. + * Connected + * Struct contain allocated ressources. + * Calling _send() with this same ev will use the same QMP connection. + * _dispose() must be called to reclaim resources. + * + * libxl__ev_qmp_init: Undefined/Idle -> Idle + * + * libxl__ev_qmp_send: Idle/Connected -> Active (on error: Idle) + * Sends a command to QEMU. + * callback will be called when a response is received or when an error + * as occured. + * + * libxl__ev_qmp_dispose: Connected/Active/Idle -> Idle + * + * callback: When called: Active -> Connected + * When called, ev is Connected and can be reused or disposed of. + * When an error occured, it is called with response == NULL and the error + * code in rc. + * The callback is only called once. + */ +typedef struct libxl__ev_qmp libxl__ev_qmp; +typedef void libxl__ev_qmp_callback(libxl__egc *egc, libxl__ev_qmp *ev, + const libxl__json_object *response, + int rc); + +_hidden void libxl__ev_qmp_init(libxl__ev_qmp *ev); +_hidden int libxl__ev_qmp_send(libxl__gc *gc, libxl__ev_qmp *ev, + const char *cmd, libxl__json_object *args); +_hidden void libxl__ev_qmp_dispose(libxl__gc *gc, libxl__ev_qmp *ev); + +struct libxl__ev_qmp { + /* caller should include this in their own struct */ + /* caller must fill these in, and they must all remain valid */ + uint32_t domid; + libxl__ev_qmp_callback *callback; + libxl__carefd *cfd; /* set to send a fd with the command, NULL otherwise */ + + /* remaining fields are private to libxl_ev_qmp_* */ + + int id; +}; + /* * evgen structures, which are the state we use for generating @@ -1902,7 +1974,7 @@ typedef enum { JSON_ANY = 255 /* this is a mask of all values above, adjust as needed */ } libxl__json_node_type; -typedef struct libxl__json_object { +struct libxl__json_object { libxl__json_node_type type; union { bool b; @@ -1915,7 +1987,7 @@ typedef struct libxl__json_object { flexarray_t *map; } u; struct libxl__json_object *parent; -} libxl__json_object; +}; typedef int (*libxl__json_parse_callback)(libxl__gc *gc, libxl__json_object *o, -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel