]> xenbits.xensource.com Git - libvirt.git/commitdiff
Split out QEMU code for building PCI/USB hostdev arg values
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 26 Jan 2010 13:44:12 +0000 (13:44 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 2 Feb 2010 15:41:29 +0000 (15:41 +0000)
To allow for better code reuse from hotplug methods, the code for
generating PCI/USB hostdev arg values is split out into separate
methods

* qemu/qemu_conf.h, qemu/qemu_conf.c: Introduce new APis for
  qemuBuildPCIHostdevPCIDevStr, qemuBuildUSBHostdevUsbDevStr
  and qemuBuildUSBHostdevDevStr

src/qemu/qemu_conf.c
src/qemu/qemu_conf.h

index 232dc5d85d31b250a841e70ffe40a06b42859532..bbf49fdd2da0db17db4fd84bdd3277a792ae5e69 100644 (file)
@@ -2506,6 +2506,65 @@ error:
 }
 
 
+char *
+qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev)
+{
+    char *ret = NULL;
+
+    if (virAsprintf(&ret, "host=%.2x:%.2x.%.1x",
+                    dev->source.subsys.u.pci.bus,
+                    dev->source.subsys.u.pci.slot,
+                    dev->source.subsys.u.pci.function) < 0)
+        virReportOOMError(NULL);
+
+    return ret;
+}
+
+
+char *
+qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev)
+{
+    char *ret = NULL;
+
+    if (!dev->source.subsys.u.usb.bus &&
+        !dev->source.subsys.u.usb.device) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+                         _("USB host device is missing bus/device information"));
+        return NULL;
+    }
+
+    if (virAsprintf(&ret, "usb-host,hostbus=%.3d,hostaddr=%.3d,id=%s",
+                    dev->source.subsys.u.usb.bus,
+                    dev->source.subsys.u.usb.device,
+                    dev->info.alias) < 0)
+        virReportOOMError(NULL);
+
+    return ret;
+}
+
+
+char *
+qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev)
+{
+    char *ret = NULL;
+
+    if (!dev->source.subsys.u.usb.bus &&
+        !dev->source.subsys.u.usb.device) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+                         _("USB host device is missing bus/device information"));
+        return NULL;
+    }
+
+    if (virAsprintf(&ret, "host:%.3d.%.3d",
+                    dev->source.subsys.u.usb.bus,
+                    dev->source.subsys.u.usb.device) < 0)
+        virReportOOMError(NULL);
+
+    return ret;
+}
+
+
+
 /* This function outputs a -chardev command line option which describes only the
  * host side of the character device */
 char *
@@ -3758,10 +3817,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
 
     /* Add host passthrough hardware */
     for (i = 0 ; i < def->nhostdevs ; i++) {
-        int ret;
-        char* usbdev;
-        char* pcidev;
         virDomainHostdevDefPtr hostdev = def->hostdevs[i];
+        char *devstr;
 
         /* USB */
         if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
@@ -3769,33 +3826,15 @@ int qemudBuildCommandLine(virConnectPtr conn,
 
             if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
                 ADD_ARG_LIT("-device");
-                if (hostdev->source.subsys.u.usb.vendor) {
-                    ret = virAsprintf(&usbdev, "usb-host,vendor=%.4x,product=%.4x,id=%s",
-                                      hostdev->source.subsys.u.usb.vendor,
-                                      hostdev->source.subsys.u.usb.product,
-                                      hostdev->info.alias);
-                } else {
-                    ret = virAsprintf(&usbdev, "usb-host,hostbus=%.3d,hostaddr=%.3d,id=%s",
-                                      hostdev->source.subsys.u.usb.bus,
-                                      hostdev->source.subsys.u.usb.device,
-                                      hostdev->info.alias);
-                }
+                if (!(devstr = qemuBuildUSBHostdevDevStr(hostdev)))
+                    goto error;
+                ADD_ARG(devstr);
             } else {
                 ADD_ARG_LIT("-usbdevice");
-                if (hostdev->source.subsys.u.usb.vendor) {
-                    ret = virAsprintf(&usbdev, "host:%.4x:%.4x",
-                                      hostdev->source.subsys.u.usb.vendor,
-                                      hostdev->source.subsys.u.usb.product);
-                } else {
-                    ret = virAsprintf(&usbdev, "host:%.3d.%.3d",
-                                      hostdev->source.subsys.u.usb.bus,
-                                      hostdev->source.subsys.u.usb.device);
-                }
+                if (!(devstr = qemuBuildUSBHostdevUsbDevStr(hostdev)))
+                    goto error;
+                ADD_ARG(devstr);
             }
-            if (ret < 0)
-                goto error;
-
-            ADD_ARG(usbdev);
         }
 
         /* PCI */
@@ -3803,21 +3842,19 @@ int qemudBuildCommandLine(virConnectPtr conn,
             hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
             if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
                 ADD_ARG_LIT("-device");
-                if (!(pcidev = qemuBuildPCIHostdevDevStr(hostdev)))
+                if (!(devstr = qemuBuildPCIHostdevDevStr(hostdev)))
                     goto error;
+                ADD_ARG(devstr);
             } else if (qemuCmdFlags & QEMUD_CMD_FLAG_PCIDEVICE) {
                 ADD_ARG_LIT("-pcidevice");
-                if (virAsprintf(&pcidev, "host=%.2x:%.2x.%.1x",
-                                hostdev->source.subsys.u.pci.bus,
-                                hostdev->source.subsys.u.pci.slot,
-                                hostdev->source.subsys.u.pci.function) < 0)
-                    goto no_memory;
+                if (!(devstr = qemuBuildPCIHostdevPCIDevStr(hostdev)))
+                    goto error;
+                ADD_ARG(devstr);
             } else {
                 qemudReportError(conn, NULL, NULL, VIR_ERR_NO_SUPPORT, "%s",
                                  _("PCI device assignment is not supported by this version of qemu"));
                 goto error;
             }
-            ADD_ARG(pcidev);
         }
     }
 
index 4eb093788517490eb4aea1869e5c5a297c1b6393..b0e007d790ed556be57492d2186e3ae0373dcedd 100644 (file)
@@ -227,11 +227,21 @@ char * qemuBuildUSBInputDevStr(virDomainInputDefPtr dev);
 
 char * qemuBuildSoundDevStr(virDomainSoundDefPtr sound);
 
+/* Legacy, pre device support */
+char * qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev);
+/* Current, best practice */
 char * qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev);
 
+/* Current, best practice */
 char * qemuBuildChrChardevStr(virDomainChrDefPtr dev);
+/* Legacy, pre device support */
 char * qemuBuildChrArgStr(virDomainChrDefPtr dev, const char *prefix);
 
+/* Legacy, pre device support */
+char * qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev);
+/* Current, best practice */
+char * qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev);
+
 
 
 int         qemudNetworkIfaceConnect    (virConnectPtr conn,