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> --- Notes: v6: use libxl_domid type for domid instead of plain uin32_t avoid the work "chained", rewrite the paragraph about sending one cmd after another Rewrite the comment about the callback, and explain that on error, the `ev` may be Idle or may still be Connected Change the carefd to a simple int (field cfd -> fd) v5: some changes in the comment tools/libxl/libxl_internal.h | 74 +++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index ae5960d869..f089524460 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -186,6 +186,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, @@ -349,6 +351,74 @@ 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. + * + * Commands can be submited one after an other with the same + * connection (e.g. the result from the "add-fd" command need to be + * use in a follow-up command before disconnecting from QMP). 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_* function. + * 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 (on error: Idle/Connected) + * When called, ev is Connected and can be reused or disposed of. + * On error, the callback is called with response == NULL and the + * error code in rc. The new state of ev depending on the value of rc: + * - rc == ERROR_QMP_*: This is an error associated with the cmd to + * run, ev is Connected. + * - otherwise: An other error happend, ev is now Idle. + * 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 */ + libxl_domid domid; + libxl__ev_qmp_callback *callback; + int fd; /* set to send a fd with the command, -1 otherwise */ +}; + /* * evgen structures, which are the state we use for generating @@ -1895,7 +1965,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; @@ -1908,7 +1978,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