This allows qemu to be started with guest agent support via:
qemu -chardev qmp_proxy,path=<optional>,id=qmp_proxy \
-device ...,chardev=qmp_proxy
It is essentially a wrapper for -chardev socket, which takes the extra
step of setting required defaults and initializing the qmp proxy by
passing the path argument along.
Not sure if this is the most elegant approach, but in terms of the
command-line invocation it seems to be the most consistent way to do
it.
Signed-off-by: Michael Roth<address@hidden>
---
qemu-char.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 46 insertions(+), 0 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index d301925..6ff7698 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2275,6 +2275,51 @@ static CharDriverState *qemu_chr_open_socket(QemuOpts
*opts)
return NULL;
}
+#include "qmp-proxy-core.h"
+
+extern QmpProxy *qmp_proxy_default;
+
+static CharDriverState *qemu_chr_open_qmp_proxy(QemuOpts *opts)
+{
+ CharDriverState *chr;
+ QmpProxy *p;
+ const char *path;
+
+ /* revert to/enforce default socket chardev options for qmp proxy */
+ path = qemu_opt_get(opts, "path");
+ if (path == NULL) {
+ path = QMP_PROXY_PATH_DEFAULT;
+ qemu_opt_set_qerr(opts, "path", path);
+ }
+ /* required options for qmp proxy */
+ qemu_opt_set_qerr(opts, "server", "on");
+ qemu_opt_set_qerr(opts, "wait", "off");
+ qemu_opt_set_qerr(opts, "telnet", "off");
+
+ chr = qemu_chr_open_socket(opts);
+ if (chr == NULL) {
+ goto err;
+ }
+
+ /* initialize virtagent using the socket we just set up */
+ if (qmp_proxy_default) {
+ fprintf(stderr, "error, multiple qmp guest proxies are not allowed\n");
+ }
+ p = qmp_proxy_new(path);
+ if (p == NULL) {
+ fprintf(stderr, "error initializing qmp guest proxy\n");
+ goto err;
+ }
+ qmp_proxy_default = p;
+
+ return chr;
+err:
+ if (chr) {
+ qemu_free(chr);
+ }
+ return NULL;
+}
+
/***********************************************************/
/* Memory chardev */
typedef struct {
@@ -2495,6 +2540,7 @@ static const struct {
|| defined(__FreeBSD_kernel__)
{ .name = "parport", .open = qemu_chr_open_pp },
#endif
+ { .name = "qmp_proxy", .open = qemu_chr_open_qmp_proxy },
};
CharDriverState *qemu_chr_open_opts(QemuOpts *opts,