]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Run 'qmp_capabilities' command at QEMU monitor startup
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 12 Feb 2010 13:45:20 +0000 (13:45 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 16 Feb 2010 14:21:25 +0000 (14:21 +0000)
When in JSON mode, QEMU requires that 'qmp_capabilities' is run as
the first command in the monitor. This is a no-op when run in the
text mode monitor

* src/qemu/qemu_driver.c: Run capabilities negotiation when
  connecting to the monitor
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
  src/qemu/qemu_monitor_json.c, src/qemu/qemu_monitor_json.h: Add
  support for the 'qmp_capabilities' command, no-op in text mode.

src/qemu/qemu_driver.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h

index 30742fc81d573ffccc1e2e746697d781f45f3e9d..77306f3e945460a10a59cb47154dae85a47a1168 100644 (file)
@@ -830,9 +830,10 @@ static qemuMonitorCallbacks monitorCallbacks = {
 };
 
 static int
-qemuConnectMonitor(virDomainObjPtr vm)
+qemuConnectMonitor(struct qemud_driver *driver, virDomainObjPtr vm)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
+    int ret;
 
     /* Hold an extra reference because we can't allow 'vm' to be
      * deleted while the monitor is active */
@@ -846,7 +847,16 @@ qemuConnectMonitor(virDomainObjPtr vm)
         return -1;
     }
 
-    return 0;
+    qemuDomainObjEnterMonitorWithDriver(driver, vm);
+    ret = qemuMonitorSetCapabilities(priv->mon);
+    qemuDomainObjExitMonitorWithDriver(driver, vm);
+
+    if (ret < 0) {
+        qemuMonitorClose(priv->mon);
+        priv->mon = NULL;
+    }
+
+    return ret;
 }
 
 /*
@@ -868,7 +878,7 @@ qemuReconnectDomain(void *payload, const char *name ATTRIBUTE_UNUSED, void *opaq
     priv = obj->privateData;
 
     /* XXX check PID liveliness & EXE path */
-    if (qemuConnectMonitor(obj) < 0)
+    if (qemuConnectMonitor(driver, obj) < 0)
         goto error;
 
     if (qemuUpdateActivePciHostdevs(driver, obj->def) < 0) {
@@ -1577,7 +1587,7 @@ qemudWaitForMonitor(struct qemud_driver* driver,
         return -1;
 
     VIR_DEBUG("Connect monitor to %p '%s'", vm, vm->def->name);
-    if (qemuConnectMonitor(vm) < 0)
+    if (qemuConnectMonitor(driver, vm) < 0)
         return -1;
 
     /* Try to get the pty path mappings again via the monitor. This is much more
index c1d369b218a2aa19f10d52ea2b4b22d3222ab792..b88532c7cf011b4a8f0668a64c026e3cd327bfe0 100644 (file)
@@ -791,6 +791,19 @@ int qemuMonitorEmitStop(qemuMonitorPtr mon)
 }
 
 
+int qemuMonitorSetCapabilities(qemuMonitorPtr mon)
+{
+    int ret;
+    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+
+    if (mon->json)
+        ret = qemuMonitorJSONSetCapabilities(mon);
+    else
+        ret = 0;
+    return ret;
+}
+
+
 int
 qemuMonitorStartCPUs(qemuMonitorPtr mon,
                      virConnectPtr conn)
index 786ad7abe1a163a0751ba0b5e3308b1b55816a62..0ac39574fc7d01ebdd54c2a419d53c598b6bf57c 100644 (file)
@@ -99,6 +99,8 @@ qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm,
 
 int qemuMonitorClose(qemuMonitorPtr mon);
 
+int qemuMonitorSetCapabilities(qemuMonitorPtr mon);
+
 void qemuMonitorLock(qemuMonitorPtr mon);
 void qemuMonitorUnlock(qemuMonitorPtr mon);
 
index c9b8d6049f00811c038e54b3d46997d829f2e390..f0dcf81c40716db4e00ec5b231163f74dd4e9b4d 100644 (file)
@@ -476,6 +476,26 @@ static void qemuMonitorJSONHandleStop(qemuMonitorPtr mon, virJSONValuePtr data A
 }
 
 
+int
+qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon)
+{
+    int ret;
+    virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("qmp_capabilities", 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
 qemuMonitorJSONStartCPUs(qemuMonitorPtr mon,
                          virConnectPtr conn ATTRIBUTE_UNUSED)
index 65a70e3194fe67ebace9e97d6f77a1c6073c1272..c6a6d5141a4bbd9edcb6f72b503aa77652388306 100644 (file)
@@ -34,6 +34,8 @@ int qemuMonitorJSONIOProcess(qemuMonitorPtr mon,
                              size_t len,
                              qemuMonitorMessagePtr msg);
 
+int qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon);
+
 int qemuMonitorJSONStartCPUs(qemuMonitorPtr mon,
                              virConnectPtr conn);
 int qemuMonitorJSONStopCPUs(qemuMonitorPtr mon);