]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Store USB port path as an array of integers
authorJán Tomko <jtomko@redhat.com>
Wed, 12 Aug 2015 14:52:13 +0000 (16:52 +0200)
committerJán Tomko <jtomko@redhat.com>
Mon, 18 Jul 2016 08:55:35 +0000 (10:55 +0200)
In preparation to tracking which USB addresses are occupied.
Introduce two helper functions for printing the port path
as a string and appending it to a virBuffer.

src/conf/device_conf.h
src/conf/domain_addr.c
src/conf/domain_addr.h
src/conf/domain_conf.c
src/libvirt_private.syms
src/qemu/qemu_command.c

index 9b7916092d6f4c5e7ad99b125c40ddd19e9d6c38..8443de6ef26594282a069bd8f445f957e8f3cf7a 100644 (file)
@@ -84,7 +84,7 @@ typedef struct _virDomainDeviceCcidAddress {
 
 typedef struct _virDomainDeviceUSBAddress {
     unsigned int bus;
-    char *port;
+    unsigned int port[VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH];
 } virDomainDeviceUSBAddress, *virDomainDeviceUSBAddressPtr;
 
 typedef struct _virDomainDeviceSpaprVioAddress {
index 794270dadb51fc1d7c4a83f8aba5f1bc511f4978..741d04552b6230a4814d5c77a2aae6291644ab4e 100644 (file)
@@ -1251,3 +1251,36 @@ virDomainVirtioSerialAddrRelease(virDomainVirtioSerialAddrSetPtr addrs,
     VIR_FREE(str);
     return ret;
 }
+
+
+bool
+virDomainUSBAddressPortIsValid(unsigned int *port)
+{
+    return port[0] != 0;
+}
+
+
+void
+virDomainUSBAddressPortFormatBuf(virBufferPtr buf,
+                                 unsigned int *port)
+{
+    size_t i;
+
+    for (i = 0; i < VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH; i++) {
+        if (port[i] == 0)
+            break;
+        virBufferAsprintf(buf, "%u.", port[i]);
+    }
+    virBufferTrim(buf, ".", -1);
+}
+
+
+char *
+virDomainUSBAddressPortFormat(unsigned int *port)
+{
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    virDomainUSBAddressPortFormatBuf(&buf, port);
+    if (virBufferCheckError(&buf) < 0)
+        return NULL;
+    return virBufferContentAndReset(&buf);
+}
index f3eda89d5c1a038d1c1b56d286d46635b0aac619..cfc74d5f65a7afb7576c53d81db0e0ecd260b6c1 100644 (file)
@@ -237,4 +237,16 @@ virDomainVirtioSerialAddrRelease(virDomainVirtioSerialAddrSetPtr addrs,
                                  virDomainDeviceInfoPtr info)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+bool
+virDomainUSBAddressPortIsValid(unsigned int *port)
+    ATTRIBUTE_NONNULL(1);
+
+void
+virDomainUSBAddressPortFormatBuf(virBufferPtr buf,
+                                 unsigned int *port)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+char *
+virDomainUSBAddressPortFormat(unsigned int *port)
+    ATTRIBUTE_NONNULL(1);
+
 #endif /* __DOMAIN_ADDR_H__ */
index 44d98579413f8e89a4c69b854bfcaa078fa6045f..82d9d1d9a01b365997b012b9b817812449b17856 100644 (file)
@@ -32,6 +32,7 @@
 #include "internal.h"
 #include "virerror.h"
 #include "datatypes.h"
+#include "domain_addr.h"
 #include "domain_conf.h"
 #include "snapshot_conf.h"
 #include "viralloc.h"
@@ -3325,8 +3326,6 @@ virDomainDeviceInfoCopy(virDomainDeviceInfoPtr dst,
 void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info)
 {
     VIR_FREE(info->alias);
-    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB)
-        VIR_FREE(info->addr.usb.port);
     memset(&info->addr, 0, sizeof(info->addr));
     info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
     VIR_FREE(info->romfile);
@@ -4840,7 +4839,11 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
 
     case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB:
         virBufferAsprintf(buf, " bus='%d'", info->addr.usb.bus);
-        virBufferEscapeString(buf, " port='%s'", info->addr.usb.port);
+        if (virDomainUSBAddressPortIsValid(info->addr.usb.port)) {
+            virBufferAddLit(buf, " port='");
+            virDomainUSBAddressPortFormatBuf(buf, info->addr.usb.port);
+            virBufferAddLit(buf, "'");
+        }
         break;
 
     case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO:
@@ -5072,14 +5075,14 @@ virDomainDeviceCcidAddressParseXML(xmlNodePtr node,
 }
 
 static int
-virDomainDeviceUSBAddressParsePort(char *port)
+virDomainDeviceUSBAddressParsePort(virDomainDeviceUSBAddressPtr addr,
+                                   char *port)
 {
-    unsigned int p;
     char *tmp = port;
     size_t i;
 
     for (i = 0; i < VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH; i++) {
-        if (virStrToLong_uip(tmp, &tmp, 10, &p) < 0)
+        if (virStrToLong_uip(tmp, &tmp, 10, &addr->port[i]) < 0)
             break;
 
         if (*tmp == '\0')
@@ -5106,12 +5109,9 @@ virDomainDeviceUSBAddressParseXML(xmlNodePtr node,
     port = virXMLPropString(node, "port");
     bus = virXMLPropString(node, "bus");
 
-    if (port && virDomainDeviceUSBAddressParsePort(port) < 0)
+    if (port && virDomainDeviceUSBAddressParsePort(addr, port) < 0)
         goto cleanup;
 
-    addr->port = port;
-    port = NULL;
-
     if (bus &&
         virStrToLong_uip(bus, NULL, 10, &addr->bus) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
index ba718b8de0310e9b4614022d8e45cc37670e9442..3580a7286242cbaead1fef1d50a0d31f95f890ee 100644 (file)
@@ -107,6 +107,9 @@ virDomainPCIAddressSetGrow;
 virDomainPCIAddressSlotInUse;
 virDomainPCIAddressValidate;
 virDomainPCIControllerModelToConnectType;
+virDomainUSBAddressPortFormat;
+virDomainUSBAddressPortFormatBuf;
+virDomainUSBAddressPortIsValid;
 virDomainVirtioSerialAddrAssign;
 virDomainVirtioSerialAddrAutoAssign;
 virDomainVirtioSerialAddrIsComplete;
index 7a3ee8151497a39c58f2a1872b07b2e2124a20d8..1916590d086d08552d1d0ef35b18e14bc1a14a7b 100644 (file)
@@ -376,7 +376,10 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
                                                        info->addr.usb.bus)))
             goto cleanup;
         virBufferAsprintf(buf, ",bus=%s.0", contAlias);
-        virBufferEscapeString(buf, ",port=%s", info->addr.usb.port);
+        if (virDomainUSBAddressPortIsValid(info->addr.usb.port)) {
+            virBufferAddLit(buf, ",port=");
+            virDomainUSBAddressPortFormatBuf(buf, info->addr.usb.port);
+        }
     } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
         if (info->addr.spaprvio.has_reg)
             virBufferAsprintf(buf, ",reg=0x%llx", info->addr.spaprvio.reg);