[libvirt] [PATCH 0/2] more work on qemu add-fd support

As promised, here's my first contribution into what is turning into a joint effort between myself and Stefan to support fd passing in qemu 1.3 and newer. Patch 2 in this series is basically a rewrite of Stefan's patch 1/4, and I tested that the capability was successfully set on qemu 1.3 and clear on qemu 1.2. I'm still wondering what we can do to the testsuite to expose more capability testing of qemu 1.2 and beyond (the existing qemuhelptest.c is hard-coded to -help scraping, which limits its usefulness; qemumonitorjsontest looks like a nice way to replay various QMP sessions, but we'd still need to figure out how to capture appropriate sessions from various qemu versions and replay them in the context of qemuhelptest). Eric Blake (1): qemu: expose qemu 1.3 add-fd monitor command Stefan Berger (1): Add support for QEMU -add-fd support detection src/qemu/qemu_capabilities.c | 22 ++++++++++++- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_monitor.c | 74 +++++++++++++++++++++++++++++++++++++++++++- src/qemu/qemu_monitor.h | 9 +++--- src/qemu/qemu_monitor_json.c | 73 ++++++++++++++++++++++++++++++++++++++++++- src/qemu/qemu_monitor_json.h | 5 ++- 6 files changed, 176 insertions(+), 8 deletions(-) -- 1.8.1

Add entry points for calling the qemu 'add-fd' and 'remove-fd' monitor commands. There is no entry point for 'query-fdsets'; the assumption is that a developer can use virsh qemu-monitor-command domain '{"execute":"query-fdsets"}' when debugging issues, and that meanwhile, libvirt is responsible enough to remember what fds it associated with what fdsets. Likewise, on the 'add-fd' command, it is assumed that libvirt will always pass a set id, rather than letting qemu autogenerate the next available id number. * src/qemu/qemu_monitor.c (qemuMonitorAddFd, qemuMonitorRemoveFd): New functions. * src/qemu/qemu_monitor.h (qemuMonitorAddFd, qemuMonitorRemoveFd): New prototypes. * src/qemu/qemu_monitor_json.c (qemuMonitorJSONAddFd) (qemuMonitorJSONRemoveFd): New functions. * src/qemu/qemu_monitor_json.h (qemuMonitorJSONAddFd) (qemuMonitorJSONRemoveFd): New prototypes. --- src/qemu/qemu_monitor.c | 74 +++++++++++++++++++++++++++++++++++++++++++- src/qemu/qemu_monitor.h | 9 +++--- src/qemu/qemu_monitor_json.c | 73 ++++++++++++++++++++++++++++++++++++++++++- src/qemu/qemu_monitor_json.h | 5 ++- 4 files changed, 154 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index a160c9a..3f1aed8 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1,7 +1,7 @@ /* * qemu_monitor.c: interaction with QEMU monitor console * - * Copyright (C) 2006-2012 Red Hat, Inc. + * Copyright (C) 2006-2013 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -2353,6 +2353,78 @@ cleanup: } +/* Add the open file descriptor FD into the non-negative set FDSET. + * If NAME is present, it will be passed along for logging purposes. + * Returns the counterpart fd that qemu received, or -1 on error. */ +int +qemuMonitorAddFd(qemuMonitorPtr mon, int fdset, int fd, const char *name) +{ + int ret = -1; + VIR_DEBUG("mon=%p, fdset=%d, fd=%d, name=%s", + mon, fdset, fd, NULLSTR(name)); + + if (!mon) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("monitor must not be NULL")); + return -1; + } + + if (fd < 0 || fdset < 0) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("fd and fdset must be valid")); + return -1; + } + + if (!mon->hasSendFD) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("qemu is not using a unix socket monitor, " + "cannot send fd %s"), NULLSTR(name)); + return -1; + } + + if (mon->json) + ret = qemuMonitorJSONAddFd(mon, fdset, fd, name); + else + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("add fd requires JSON monitor")); + return ret; +} + + +/* Remove one of qemu's fds from the given FDSET, or if FD is + * negative, remove the entire set. Preserve any previous error on + * entry. Returns 0 on success, -1 on error. */ +int +qemuMonitorRemoveFd(qemuMonitorPtr mon, int fdset, int fd) +{ + int ret = -1; + virErrorPtr error; + + VIR_DEBUG("mon=%p, fdset=%d, fd=%d", mon, fdset, fd); + + error = virSaveLastError(); + + if (!mon) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("monitor must not be NULL")); + goto cleanup; + } + + if (mon->json) + ret = qemuMonitorJSONRemoveFd(mon, fdset, fd); + else + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("remove fd requires JSON monitor")); + +cleanup: + if (error) { + virSetError(error); + virFreeError(error); + } + return ret; +} + + int qemuMonitorAddHostNetwork(qemuMonitorPtr mon, const char *netstr, int tapfd, const char *tapfd_name, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 7953b82..ac77158 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1,7 +1,7 @@ /* * qemu_monitor.h: interaction with QEMU monitor console * - * Copyright (C) 2006-2012 Red Hat, Inc. + * Copyright (C) 2006-2013 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -439,13 +439,14 @@ int qemuMonitorRemovePCIDevice(qemuMonitorPtr mon, int qemuMonitorSendFileHandle(qemuMonitorPtr mon, const char *fdname, int fd); +int qemuMonitorAddFd(qemuMonitorPtr mon, int fdset, int fd, const char *name); -/* The function preserves previous error and only sets it's own error if no - * error was set before. +/* These two functions preserve previous error and only set their own + * error if no error was set before. */ int qemuMonitorCloseFileHandle(qemuMonitorPtr mon, const char *fdname); - +int qemuMonitorRemoveFd(qemuMonitorPtr mon, int fdset, int fd); /* XXX do we really want to hardcode 'netstr' as the * sendable item here diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 2d2a5d0..686cee9 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -1,7 +1,7 @@ /* * qemu_monitor_json.c: interaction with QEMU monitor console * - * Copyright (C) 2006-2012 Red Hat, Inc. + * Copyright (C) 2006-2013 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -2646,6 +2646,77 @@ int qemuMonitorJSONCloseFileHandle(qemuMonitorPtr mon, } +int +qemuMonitorJSONAddFd(qemuMonitorPtr mon, int fdset, int fd, const char *name) +{ + int ret; + virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("add-fd", + "i:fdset-id", fdset, + name ? "s:opaque" : NULL, + name, NULL); + virJSONValuePtr reply = NULL; + if (!cmd) + return -1; + + ret = qemuMonitorJSONCommandWithFd(mon, cmd, fd, &reply); + + if (ret == 0) + ret = qemuMonitorJSONCheckError(cmd, reply); + if (ret == 0) { + virJSONValuePtr data = virJSONValueObjectGet(reply, "return"); + + if (!data || data->type != VIR_JSON_TYPE_OBJECT) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing return information")); + goto error; + } + data = virJSONValueObjectGet(data, "fd"); + if (!data || data->type != VIR_JSON_TYPE_NUMBER || + virJSONValueGetNumberInt(data, &ret) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("incomplete return information")); + goto error; + } + } + +cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; + +error: + /* Best effort cleanup - kill the entire fdset (even if it has + * earlier successful fd registrations), since we don't know which + * fd qemu got, and don't want to leave the fd leaked in qemu. */ + qemuMonitorJSONRemoveFd(mon, fdset, -1); + ret = -1; + goto cleanup; +} + + +int +qemuMonitorJSONRemoveFd(qemuMonitorPtr mon, int fdset, int fd) +{ + int ret; + virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("remove-fd", + "i:fdset-id", fdset, + fd < 0 ? NULL : "i:fd", + fd, NULL); + virJSONValuePtr reply = NULL; + if (!cmd) + return -1; + + ret = qemuMonitorJSONCommand(mon, cmd, &reply); + + if (ret == 0) + ret = qemuMonitorJSONCheckError(cmd, reply); + + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + + int qemuMonitorJSONAddNetdev(qemuMonitorPtr mon, const char *netdevstr) { diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 2b09a8f..925d937 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -1,7 +1,7 @@ /* * qemu_monitor_json.h: interaction with QEMU monitor console * - * Copyright (C) 2006-2009, 2011-2012 Red Hat, Inc. + * Copyright (C) 2006-2009, 2011-2013 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -175,9 +175,12 @@ int qemuMonitorJSONRemovePCIDevice(qemuMonitorPtr mon, int qemuMonitorJSONSendFileHandle(qemuMonitorPtr mon, const char *fdname, int fd); +int qemuMonitorJSONAddFd(qemuMonitorPtr mon, int fdset, int fd, + const char *name); int qemuMonitorJSONCloseFileHandle(qemuMonitorPtr mon, const char *fdname); +int qemuMonitorJSONRemoveFd(qemuMonitorPtr mon, int fdset, int fd); int qemuMonitorJSONAddNetdev(qemuMonitorPtr mon, const char *netdevstr); -- 1.8.1

On 01/30/2013 11:21 PM, Eric Blake wrote:
Add entry points for calling the qemu 'add-fd' and 'remove-fd' monitor commands. There is no entry point for 'query-fdsets'; the assumption is that a developer can use virsh qemu-monitor-command domain '{"execute":"query-fdsets"}' when debugging issues, and that meanwhile, libvirt is responsible enough to remember what fds it associated with what fdsets. Likewise, on the 'add-fd' command, it is assumed that libvirt will always pass a set id, rather than letting qemu autogenerate the next available id number.
* src/qemu/qemu_monitor.c (qemuMonitorAddFd, qemuMonitorRemoveFd): New functions. * src/qemu/qemu_monitor.h (qemuMonitorAddFd, qemuMonitorRemoveFd): New prototypes. * src/qemu/qemu_monitor_json.c (qemuMonitorJSONAddFd) (qemuMonitorJSONRemoveFd): New functions. * src/qemu/qemu_monitor_json.h (qemuMonitorJSONAddFd) (qemuMonitorJSONRemoveFd): New prototypes.
ACK Stefan

From: Stefan Berger <stefanb@linux.vnet.ibm.com> Add support for QEMU -add-fd command line parameter detection. This intentionally rejects qemu 1.2, where 'add-fd' QMP did not allow full control of set ids, and where there was no command line counterpart, but accepts qemu 1.3. Signed-off-by: Eric Blake <eblake@redhat.com> --- v1 was here: https://www.redhat.com/archives/libvir-list/2013-January/msg02056.html Okay, so most of v2 is mine, but I kept Stefan as author for his contribution in adding just one capability named QEMU_CAPS_ADD_FD. src/qemu/qemu_capabilities.c | 22 +++++++++++++++++++++- src/qemu/qemu_capabilities.h | 1 + 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 29693c3..0820fe4 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1,7 +1,7 @@ /* * qemu_capabilities.c: QEMU capabilities generation * - * Copyright (C) 2006-2012 Red Hat, Inc. + * Copyright (C) 2006-2013 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -39,6 +39,7 @@ #include "virnodesuspend.h" #include "qemu_monitor.h" +#include <fcntl.h> #include <sys/stat.h> #include <unistd.h> #include <sys/wait.h> @@ -203,6 +204,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST, "usb-serial", /* 125 */ "usb-net", + "add-fd", ); @@ -1961,10 +1963,28 @@ qemuCapsProbeQMPCommands(qemuCapsPtr caps, qemuCapsSet(caps, QEMU_CAPS_DRIVE_MIRROR); else if (STREQ(name, "blockdev-snapshot-sync")) qemuCapsSet(caps, QEMU_CAPS_DISK_SNAPSHOT); + else if (STREQ(name, "add-fd")) + qemuCapsSet(caps, QEMU_CAPS_ADD_FD); VIR_FREE(name); } VIR_FREE(commands); + /* QMP add-fd was introduced in 1.2, but did not support + * management control of set numbering, and did not have a + * counterpart -add-fd command line option. We require the + * add-fd features from 1.3 or later. */ + if (qemuCapsGet(caps, QEMU_CAPS_ADD_FD)) { + int fd = open("/dev/null", O_RDONLY); + if (fd < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("unable to probe for add-fd")); + return -1; + } + if (qemuMonitorAddFd(mon, 0, fd, "/dev/null") < 0) + qemuCapsClear(caps, QEMU_CAPS_ADD_FD); + VIR_FORCE_CLOSE(fd); + } + return 0; } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5279d07..cb0dad0 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -165,6 +165,7 @@ enum qemuCapsFlags { QEMU_CAPS_SCLP_S390 = 124, /* -device sclp* */ QEMU_CAPS_DEVICE_USB_SERIAL = 125, /* -device usb-serial */ QEMU_CAPS_DEVICE_USB_NET = 126, /* -device usb-net */ + QEMU_CAPS_ADD_FD = 127, /* -add-fd */ QEMU_CAPS_LAST, /* this must always be the last item */ }; -- 1.8.1

On 01/30/2013 11:21 PM, Eric Blake wrote:
From: Stefan Berger <stefanb@linux.vnet.ibm.com>
Add support for QEMU -add-fd command line parameter detection. This intentionally rejects qemu 1.2, where 'add-fd' QMP did not allow full control of set ids, and where there was no command line counterpart, but accepts qemu 1.3.
Signed-off-by: Eric Blake <eblake@redhat.com> ---
v1 was here: https://www.redhat.com/archives/libvir-list/2013-January/msg02056.html
Okay, so most of v2 is mine, but I kept Stefan as author for his contribution in adding just one capability named QEMU_CAPS_ADD_FD.
src/qemu/qemu_capabilities.c | 22 +++++++++++++++++++++- src/qemu/qemu_capabilities.h | 1 + 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 29693c3..0820fe4 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1,7 +1,7 @@ /* * qemu_capabilities.c: QEMU capabilities generation * - * Copyright (C) 2006-2012 Red Hat, Inc. + * Copyright (C) 2006-2013 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -39,6 +39,7 @@ #include "virnodesuspend.h" #include "qemu_monitor.h"
+#include <fcntl.h> #include <sys/stat.h> #include <unistd.h> #include <sys/wait.h> @@ -203,6 +204,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
"usb-serial", /* 125 */ "usb-net", + "add-fd",
);
@@ -1961,10 +1963,28 @@ qemuCapsProbeQMPCommands(qemuCapsPtr caps, qemuCapsSet(caps, QEMU_CAPS_DRIVE_MIRROR); else if (STREQ(name, "blockdev-snapshot-sync")) qemuCapsSet(caps, QEMU_CAPS_DISK_SNAPSHOT); + else if (STREQ(name, "add-fd")) + qemuCapsSet(caps, QEMU_CAPS_ADD_FD);
This checks for QMP support -> version 1.2.
VIR_FREE(name); } VIR_FREE(commands);
+ /* QMP add-fd was introduced in 1.2, but did not support + * management control of set numbering, and did not have a + * counterpart -add-fd command line option. We require the + * add-fd features from 1.3 or later. */ + if (qemuCapsGet(caps, QEMU_CAPS_ADD_FD)) { + int fd = open("/dev/null", O_RDONLY); + if (fd < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("unable to probe for add-fd")); + return -1; + } + if (qemuMonitorAddFd(mon, 0, fd, "/dev/null") < 0) + qemuCapsClear(caps, QEMU_CAPS_ADD_FD); + VIR_FORCE_CLOSE(fd); + } +
Aren't you only detecting version 1.2 with this? I thought we would need something along the lines of this example here: if (version >= 9000) qemuCapsSet(caps, QEMU_CAPS_VNC_COLON); Stefan

On 01/31/2013 04:46 AM, Stefan Berger wrote:
On 01/30/2013 11:21 PM, Eric Blake wrote:
From: Stefan Berger <stefanb@linux.vnet.ibm.com>
Add support for QEMU -add-fd command line parameter detection. This intentionally rejects qemu 1.2, where 'add-fd' QMP did not allow full control of set ids, and where there was no command line counterpart, but accepts qemu 1.3.
Signed-off-by: Eric Blake <eblake@redhat.com> ---
+ else if (STREQ(name, "add-fd")) + qemuCapsSet(caps, QEMU_CAPS_ADD_FD);
This checks for QMP support -> version 1.2.
Yes, but then...
VIR_FREE(name); } VIR_FREE(commands);
+ /* QMP add-fd was introduced in 1.2, but did not support + * management control of set numbering, and did not have a + * counterpart -add-fd command line option. We require the + * add-fd features from 1.3 or later. */ + if (qemuCapsGet(caps, QEMU_CAPS_ADD_FD)) { + int fd = open("/dev/null", O_RDONLY); + if (fd < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("unable to probe for add-fd")); + return -1; + } + if (qemuMonitorAddFd(mon, 0, fd, "/dev/null") < 0) + qemuCapsClear(caps, QEMU_CAPS_ADD_FD); + VIR_FORCE_CLOSE(fd); + } +
Aren't you only detecting version 1.2 with this?
...this code is what checks for 1.3. In 1.2, the qemuMonitorAddFd() call fails with an error, so we clear the bit back out. Only 1.3 allows libvirt to specify its own set number, because that was one of the changes qemu had to make in order to add the -add-fd command-line option.
I thought we would need something along the lines of this example here:
if (version >= 9000) qemuCapsSet(caps, QEMU_CAPS_VNC_COLON);
That was my original idea, but a version number check is more fragile (it doesn't backport well); anywhere that we can do a feature check instead of a version check, we make backporting easier. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 01/31/2013 09:06 AM, Eric Blake wrote:
On 01/31/2013 04:46 AM, Stefan Berger wrote:
On 01/30/2013 11:21 PM, Eric Blake wrote:
From: Stefan Berger <stefanb@linux.vnet.ibm.com>
Add support for QEMU -add-fd command line parameter detection. This intentionally rejects qemu 1.2, where 'add-fd' QMP did not allow full control of set ids, and where there was no command line counterpart, but accepts qemu 1.3.
Signed-off-by: Eric Blake <eblake@redhat.com> ---
+ else if (STREQ(name, "add-fd")) + qemuCapsSet(caps, QEMU_CAPS_ADD_FD);
This checks for QMP support -> version 1.2.
Yes, but then...
VIR_FREE(name); } VIR_FREE(commands);
+ /* QMP add-fd was introduced in 1.2, but did not support + * management control of set numbering, and did not have a + * counterpart -add-fd command line option. We require the + * add-fd features from 1.3 or later. */ + if (qemuCapsGet(caps, QEMU_CAPS_ADD_FD)) { + int fd = open("/dev/null", O_RDONLY); + if (fd < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("unable to probe for add-fd")); + return -1; + } + if (qemuMonitorAddFd(mon, 0, fd, "/dev/null") < 0) + qemuCapsClear(caps, QEMU_CAPS_ADD_FD); + VIR_FORCE_CLOSE(fd); + } +
Aren't you only detecting version 1.2 with this?
...this code is what checks for 1.3. In 1.2, the qemuMonitorAddFd() call fails with an error, so we clear the bit back out. Only 1.3 allows libvirt to specify its own set number, because that was one of the changes qemu had to make in order to add the -add-fd command-line option.
This approach looks fine for verifying the availability of 1.3 support (assuming no fd sets were introduced prior to this point). -- Regards, Corey Bryant
I thought we would need something along the lines of this example here:
if (version >= 9000) qemuCapsSet(caps, QEMU_CAPS_VNC_COLON);
That was my original idea, but a version number check is more fragile (it doesn't backport well); anywhere that we can do a feature check instead of a version check, we make backporting easier.
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

On 01/31/2013 07:42 AM, Corey Bryant wrote:
...this code is what checks for 1.3. In 1.2, the qemuMonitorAddFd() call fails with an error, so we clear the bit back out. Only 1.3 allows libvirt to specify its own set number, because that was one of the changes qemu had to make in order to add the -add-fd command-line option.
This approach looks fine for verifying the availability of 1.3 support (assuming no fd sets were introduced prior to this point).
This particular check is done during our initial probe (basically, inside something resembling 'qemu -M none -nodefaults -nographic -qmp /path/to/socket'), and there are indeed no other fd sets in use. I've gone ahead and pushed these two patches. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Wed, Jan 30, 2013 at 09:21:44PM -0700, Eric Blake wrote:
As promised, here's my first contribution into what is turning into a joint effort between myself and Stefan to support fd passing in qemu 1.3 and newer. Patch 2 in this series is basically a rewrite of Stefan's patch 1/4, and I tested that the capability was successfully set on qemu 1.3 and clear on qemu 1.2.
I'm still wondering what we can do to the testsuite to expose more capability testing of qemu 1.2 and beyond (the existing qemuhelptest.c is hard-coded to -help scraping, which limits its usefulness; qemumonitorjsontest looks like a nice way to replay various QMP sessions, but we'd still need to figure out how to capture appropriate sessions from various qemu versions and replay them in the context of qemuhelptest).
Eric Blake (1): qemu: expose qemu 1.3 add-fd monitor command
Stefan Berger (1): Add support for QEMU -add-fd support detection
src/qemu/qemu_capabilities.c | 22 ++++++++++++- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_monitor.c | 74 +++++++++++++++++++++++++++++++++++++++++++- src/qemu/qemu_monitor.h | 9 +++--- src/qemu/qemu_monitor_json.c | 73 ++++++++++++++++++++++++++++++++++++++++++- src/qemu/qemu_monitor_json.h | 5 ++- 6 files changed, 176 insertions(+), 8 deletions(-)
ACK both, these are the uncontroversial parts Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
participants (4)
-
Corey Bryant
-
Daniel P. Berrange
-
Eric Blake
-
Stefan Berger