[libvirt] [PATCH 17/27] Add APIs for sending 'usb_add' command for host devices

Daniel P. Berrange berrange at redhat.com
Thu Sep 24 15:00:19 UTC 2009


One API adds an exact device based on bus+dev, the other adds
any device matching vendor+product

* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add new
  qemuMonitorAddUSBDeviceExact() and qemuMonitorAddUSBDeviceMatch()
  commands.
* src/qemu/qemu_driver.c: Switch over to using the new
    qemuMonitorAddUSBDeviceExact() and qemuMonitorAddUSBDeviceMatch()
---
 src/qemu/qemu_driver.c       |   43 +++++-------------------
 src/qemu/qemu_monitor_text.c |   73 ++++++++++++++++++++++++++++++++++++++++++
 src/qemu/qemu_monitor_text.h |    7 ++++
 3 files changed, 89 insertions(+), 34 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 635fb84..f33c24e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4984,7 +4984,6 @@ static int qemudDomainAttachHostUsbDevice(virConnectPtr conn,
                                           virDomainDeviceDefPtr dev)
 {
     int ret;
-    char *cmd, *reply;
 
     if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs+1) < 0) {
         virReportOOMError(conn);
@@ -4992,43 +4991,19 @@ static int qemudDomainAttachHostUsbDevice(virConnectPtr conn,
     }
 
     if (dev->data.hostdev->source.subsys.u.usb.vendor) {
-        ret = virAsprintf(&cmd, "usb_add host:%.4x:%.4x",
-                          dev->data.hostdev->source.subsys.u.usb.vendor,
-                          dev->data.hostdev->source.subsys.u.usb.product);
+        ret = qemuMonitorAddUSBDeviceMatch(vm,
+                                           dev->data.hostdev->source.subsys.u.usb.vendor,
+                                           dev->data.hostdev->source.subsys.u.usb.product);
     } else {
-        ret = virAsprintf(&cmd, "usb_add host:%.3d.%.3d",
-                          dev->data.hostdev->source.subsys.u.usb.bus,
-                          dev->data.hostdev->source.subsys.u.usb.device);
-    }
-    if (ret == -1) {
-        virReportOOMError(conn);
-        return -1;
-    }
-
-    if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
-        qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                         "%s", _("cannot attach usb device"));
-        VIR_FREE(cmd);
-        return -1;
+        ret = qemuMonitorAddUSBDeviceExact(vm,
+                                           dev->data.hostdev->source.subsys.u.usb.bus,
+                                           dev->data.hostdev->source.subsys.u.usb.device);
     }
 
-    DEBUG ("%s: attach_usb reply: %s", vm->def->name, reply);
-    /* If the command failed qemu prints:
-     * Could not add ... */
-    if (strstr(reply, "Could not add ")) {
-        qemudReportError (conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                          "%s",
-                          _("adding usb device failed"));
-        VIR_FREE(reply);
-        VIR_FREE(cmd);
-        return -1;
-    }
-
-    vm->def->hostdevs[vm->def->nhostdevs++] = dev->data.hostdev;
+    if (ret != -1)
+        vm->def->hostdevs[vm->def->nhostdevs++] = dev->data.hostdev;
 
-    VIR_FREE(reply);
-    VIR_FREE(cmd);
-    return 0;
+    return ret;
 }
 
 static int qemudDomainAttachHostDevice(virConnectPtr conn,
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index fd50cf2..0e0334c 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -1242,3 +1242,76 @@ cleanup:
     VIR_FREE(safepath);
     return ret;
 }
+
+
+static int qemuMonitorAddUSBDevice(const virDomainObjPtr vm,
+                                   const char *addr)
+{
+    char *cmd;
+    char *reply = NULL;
+    int ret = -1;
+
+    if (virAsprintf(&cmd, "usb_add %s", addr) < 0) {
+        virReportOOMError(NULL);
+        return -1;
+    }
+
+    if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+                         "%s", _("cannot attach usb device"));
+        goto cleanup;
+    }
+
+    DEBUG ("%s: attach_usb reply: %s", vm->def->name, reply);
+    /* If the command failed qemu prints:
+     * Could not add ... */
+    if (strstr(reply, "Could not add ")) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+                         "%s", _("adding usb device failed"));
+        goto cleanup;
+    }
+
+    ret = 0;
+
+cleanup:
+    VIR_FREE(cmd);
+    VIR_FREE(reply);
+    return ret;
+}
+
+
+int qemuMonitorAddUSBDeviceExact(const virDomainObjPtr vm,
+                                 int bus,
+                                 int dev)
+{
+    int ret;
+    char *addr;
+
+    if (virAsprintf(&addr, "host:%.3d.%.3d", bus, dev) < 0) {
+        virReportOOMError(NULL);
+        return -1;
+    }
+
+    ret = qemuMonitorAddUSBDevice(vm, addr);
+
+    VIR_FREE(addr);
+    return ret;
+}
+
+int qemuMonitorAddUSBDeviceMatch(const virDomainObjPtr vm,
+                                 int vendor,
+                                 int product)
+{
+    int ret;
+    char *addr;
+
+    if (virAsprintf(&addr, "host:%.4x:%.4x", vendor, product) < 0) {
+        virReportOOMError(NULL);
+        return -1;
+    }
+
+    ret = qemuMonitorAddUSBDevice(vm, addr);
+
+    VIR_FREE(addr);
+    return ret;
+}
diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h
index 138e7a0..4153090 100644
--- a/src/qemu/qemu_monitor_text.h
+++ b/src/qemu/qemu_monitor_text.h
@@ -140,4 +140,11 @@ int qemuMonitorMigrateToCommand(const virDomainObjPtr vm,
 int qemuMonitorAddUSBDisk(const virDomainObjPtr vm,
                           const char *path);
 
+int qemuMonitorAddUSBDeviceExact(const virDomainObjPtr vm,
+                                 int bus,
+                                 int dev);
+int qemuMonitorAddUSBDeviceMatch(const virDomainObjPtr vm,
+                                 int vendor,
+                                 int product);
+
 #endif /* QEMU_MONITOR_TEXT_H */
-- 
1.6.2.5




More information about the libvir-list mailing list