]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Fix problem with QEMU monitor welcome prompt confusing libvirt
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 6 Jul 2009 14:45:04 +0000 (15:45 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 16 Jul 2009 10:32:03 +0000 (11:32 +0100)
after a libvirtd daemon restart with active guests

* src/qemu_driver: Read and dicard pending monitor data
  before issuing new monitor commands.

src/qemu_driver.c

index e2b7acb9a88a69c8aced46c0bea6ec612e543c60..2e55045b48d30e7516d05bda1a895a8efd46e3db 100644 (file)
@@ -1744,6 +1744,28 @@ cleanup:
     qemuDriverUnlock(driver);
 }
 
+
+/* Throw away any data available on the monitor
+ * This is done before executing a command, in order
+ * to allow re-synchronization if something went badly
+ * wrong in the past. it also deals with problem of
+ * QEMU *sometimes* re-printing its initial greeting
+ * when we reconnect to the monitor after restarts.
+ */
+static void
+qemuMonitorDiscardPendingData(virDomainObjPtr vm) {
+    char buf[1024];
+    int ret = 0;
+
+    /* Monitor is non-blocking, so just loop till we
+     * get -1 or 0. Don't bother with detecting
+     * errors, since we'll deal with that better later */
+    do {
+        ret = read(vm->monitor, buf, sizeof (buf)-1);
+    } while (ret > 0);
+}
+
+
 static int
 qemudMonitorCommandExtra(const virDomainObjPtr vm,
                          const char *cmd,
@@ -1755,6 +1777,8 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm,
     size_t cmdlen = strlen(cmd);
     size_t extralen = extra ? strlen(extra) : 0;
 
+    qemuMonitorDiscardPendingData(vm);
+
     if (safewrite(vm->monitor, cmd, cmdlen) != cmdlen)
         return -1;
     if (safewrite(vm->monitor, "\r", 1) != 1)