[PATCH 11/16] virsh: virshAddress*: Move out of cmdAttachDisk block

Peter Krempa pkrempa at redhat.com
Thu Nov 19 16:26:17 UTC 2020


The helper started as helper for cmdAttachDisk but is now used outside
of it too.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 tools/virsh-domain.c | 343 ++++++++++++++++++++++---------------------
 1 file changed, 172 insertions(+), 171 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index afb859eaa0..f8d97593b8 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -52,6 +52,178 @@
 #include "virenum.h"
 #include "virutil.h"

+enum virshAddressType {
+    VIRSH_ADDRESS_TYPE_PCI,
+    VIRSH_ADDRESS_TYPE_SCSI,
+    VIRSH_ADDRESS_TYPE_IDE,
+    VIRSH_ADDRESS_TYPE_CCW,
+    VIRSH_ADDRESS_TYPE_USB,
+    VIRSH_ADDRESS_TYPE_SATA,
+
+    VIRSH_ADDRESS_TYPE_LAST
+};
+
+VIR_ENUM_DECL(virshAddress);
+VIR_ENUM_IMPL(virshAddress,
+              VIRSH_ADDRESS_TYPE_LAST,
+              "pci",
+              "scsi",
+              "ide",
+              "ccw",
+              "usb",
+              "sata");
+
+struct virshAddressPCI {
+    unsigned int domain;
+    unsigned int bus;
+    unsigned int slot;
+    unsigned int function;
+    bool multifunction;
+};
+
+struct virshAddressDrive {
+    unsigned int controller;
+    unsigned int bus;
+    unsigned long long unit;
+};
+
+struct virshAddressCCW {
+    unsigned int cssid;
+    unsigned int ssid;
+    unsigned int devno;
+};
+
+struct virshAddressUSB {
+    unsigned int bus;
+    unsigned int port;
+};
+
+struct virshAddress {
+    int type; /* enum virshAddressType */
+    union {
+        struct virshAddressPCI pci;
+        struct virshAddressDrive drive;
+        struct virshAddressCCW ccw;
+        struct virshAddressUSB usb;
+    } addr;
+};
+
+
+/* pci address pci:0000.00.0x0a.0 (domain:bus:slot:function)
+ * ide disk address: ide:00.00.0 (controller:bus:unit)
+ * scsi disk address: scsi:00.00.0 (controller:bus:unit)
+ * ccw disk address: ccw:0xfe.0.0000 (cssid:ssid:devno)
+ * usb disk address: usb:00.00 (bus:port)
+ * sata disk address: sata:00.00.0 (controller:bus:unit)
+ */
+static int
+virshAddressParse(const char *str,
+                  bool multifunction,
+                  struct virshAddress *addr)
+{
+    g_autofree char *type = g_strdup(str);
+    char *a = strchr(type, ':');
+
+    if (!addr)
+        return -1;
+
+    *a = '\0';
+
+    addr->type = virshAddressTypeFromString(type);
+
+    switch ((enum virshAddressType) addr->type) {
+    case VIRSH_ADDRESS_TYPE_PCI:
+        addr->addr.pci.multifunction = multifunction;
+
+        if (virStrToLong_uip(++a, &a, 16, &addr->addr.pci.domain) < 0 ||
+            virStrToLong_uip(++a, &a, 16, &addr->addr.pci.bus) < 0 ||
+            virStrToLong_uip(++a, &a, 16, &addr->addr.pci.slot) < 0 ||
+            virStrToLong_uip(++a, &a, 16, &addr->addr.pci.function) < 0)
+            return -1;
+        break;
+
+    case VIRSH_ADDRESS_TYPE_SATA:
+    case VIRSH_ADDRESS_TYPE_IDE:
+    case VIRSH_ADDRESS_TYPE_SCSI:
+        if (virStrToLong_uip(++a, &a, 10, &addr->addr.drive.controller) < 0 ||
+            virStrToLong_uip(++a, &a, 10, &addr->addr.drive.bus) < 0 ||
+            virStrToLong_ullp(++a, &a, 10, &addr->addr.drive.unit) < 0)
+            return -1;
+        break;
+
+    case VIRSH_ADDRESS_TYPE_CCW:
+        if (virStrToLong_uip(++a, &a, 16, &addr->addr.ccw.cssid) < 0 ||
+            virStrToLong_uip(++a, &a, 16, &addr->addr.ccw.ssid) < 0 ||
+            virStrToLong_uip(++a, &a, 16, &addr->addr.ccw.devno) < 0)
+            return -1;
+        break;
+
+    case VIRSH_ADDRESS_TYPE_USB:
+        if (virStrToLong_uip(++a, &a, 10, &addr->addr.usb.bus) < 0 ||
+            virStrToLong_uip(++a, &a, 10, &addr->addr.usb.port) < 0)
+            return -1;
+        break;
+
+    case VIRSH_ADDRESS_TYPE_LAST:
+    default:
+        return -1;
+    }
+
+    return 0;
+}
+
+
+static void
+virshAddressFormat(virBufferPtr buf,
+                   struct virshAddress *addr)
+{
+    switch ((enum virshAddressType) addr->type) {
+    case VIRSH_ADDRESS_TYPE_PCI:
+        virBufferAsprintf(buf,
+                          "<address type='pci' domain='0x%04x' bus='0x%02x' slot='0x%02x' function='0x%0x'",
+                          addr->addr.pci.domain,
+                          addr->addr.pci.bus,
+                          addr->addr.pci.slot,
+                          addr->addr.pci.function);
+
+        if (addr->addr.pci.multifunction)
+            virBufferAddLit(buf, " multifunction='on'");
+
+        virBufferAddLit(buf, "/>\n");
+        break;
+
+    case VIRSH_ADDRESS_TYPE_SATA:
+    case VIRSH_ADDRESS_TYPE_IDE:
+    case VIRSH_ADDRESS_TYPE_SCSI:
+        virBufferAsprintf(buf,
+                          "<address type='drive' controller='%u' bus='%u' unit='%llu'/>\n",
+                          addr->addr.drive.controller,
+                          addr->addr.drive.bus,
+                          addr->addr.drive.unit);
+        break;
+
+    case VIRSH_ADDRESS_TYPE_CCW:
+        virBufferAsprintf(buf,
+                          "<address type='ccw' cssid='0x%02x' ssid='0x%01x' devno='0x%04x'/>\n",
+                          addr->addr.ccw.cssid,
+                          addr->addr.ccw.ssid,
+                          addr->addr.ccw.devno);
+        break;
+
+    case VIRSH_ADDRESS_TYPE_USB:
+        virBufferAsprintf(buf,
+                          "<address type='usb' bus='%u' port='%u'/>\n",
+                          addr->addr.usb.bus,
+                          addr->addr.usb.port);
+        break;
+
+    case VIRSH_ADDRESS_TYPE_LAST:
+    default:
+        return;
+    }
+}
+
+
 #define VIRSH_COMMON_OPT_DOMAIN_PERSISTENT \
     {.name = "persistent", \
      .type = VSH_OT_BOOL, \
@@ -305,177 +477,6 @@ static const vshCmdOptDef opts_attach_disk[] = {
     {.name = NULL}
 };

-enum virshAddressType {
-    VIRSH_ADDRESS_TYPE_PCI,
-    VIRSH_ADDRESS_TYPE_SCSI,
-    VIRSH_ADDRESS_TYPE_IDE,
-    VIRSH_ADDRESS_TYPE_CCW,
-    VIRSH_ADDRESS_TYPE_USB,
-    VIRSH_ADDRESS_TYPE_SATA,
-
-    VIRSH_ADDRESS_TYPE_LAST
-};
-
-VIR_ENUM_DECL(virshAddress);
-VIR_ENUM_IMPL(virshAddress,
-              VIRSH_ADDRESS_TYPE_LAST,
-              "pci",
-              "scsi",
-              "ide",
-              "ccw",
-              "usb",
-              "sata");
-
-struct virshAddressPCI {
-    unsigned int domain;
-    unsigned int bus;
-    unsigned int slot;
-    unsigned int function;
-    bool multifunction;
-};
-
-struct virshAddressDrive {
-    unsigned int controller;
-    unsigned int bus;
-    unsigned long long unit;
-};
-
-struct virshAddressCCW {
-    unsigned int cssid;
-    unsigned int ssid;
-    unsigned int devno;
-};
-
-struct virshAddressUSB {
-    unsigned int bus;
-    unsigned int port;
-};
-
-struct virshAddress {
-    int type; /* enum virshAddressType */
-    union {
-        struct virshAddressPCI pci;
-        struct virshAddressDrive drive;
-        struct virshAddressCCW ccw;
-        struct virshAddressUSB usb;
-    } addr;
-};
-
-
-/* pci address pci:0000.00.0x0a.0 (domain:bus:slot:function)
- * ide disk address: ide:00.00.0 (controller:bus:unit)
- * scsi disk address: scsi:00.00.0 (controller:bus:unit)
- * ccw disk address: ccw:0xfe.0.0000 (cssid:ssid:devno)
- * usb disk address: usb:00.00 (bus:port)
- * sata disk address: sata:00.00.0 (controller:bus:unit)
- */
-static int
-virshAddressParse(const char *str,
-                  bool multifunction,
-                  struct virshAddress *addr)
-{
-    g_autofree char *type = g_strdup(str);
-    char *a = strchr(type, ':');
-
-    if (!addr)
-        return -1;
-
-    *a = '\0';
-
-    addr->type = virshAddressTypeFromString(type);
-
-    switch ((enum virshAddressType) addr->type) {
-    case VIRSH_ADDRESS_TYPE_PCI:
-        addr->addr.pci.multifunction = multifunction;
-
-        if (virStrToLong_uip(++a, &a, 16, &addr->addr.pci.domain) < 0 ||
-            virStrToLong_uip(++a, &a, 16, &addr->addr.pci.bus) < 0 ||
-            virStrToLong_uip(++a, &a, 16, &addr->addr.pci.slot) < 0 ||
-            virStrToLong_uip(++a, &a, 16, &addr->addr.pci.function) < 0)
-            return -1;
-        break;
-
-    case VIRSH_ADDRESS_TYPE_SATA:
-    case VIRSH_ADDRESS_TYPE_IDE:
-    case VIRSH_ADDRESS_TYPE_SCSI:
-        if (virStrToLong_uip(++a, &a, 10, &addr->addr.drive.controller) < 0 ||
-            virStrToLong_uip(++a, &a, 10, &addr->addr.drive.bus) < 0 ||
-            virStrToLong_ullp(++a, &a, 10, &addr->addr.drive.unit) < 0)
-            return -1;
-        break;
-
-    case VIRSH_ADDRESS_TYPE_CCW:
-        if (virStrToLong_uip(++a, &a, 16, &addr->addr.ccw.cssid) < 0 ||
-            virStrToLong_uip(++a, &a, 16, &addr->addr.ccw.ssid) < 0 ||
-            virStrToLong_uip(++a, &a, 16, &addr->addr.ccw.devno) < 0)
-            return -1;
-        break;
-
-    case VIRSH_ADDRESS_TYPE_USB:
-        if (virStrToLong_uip(++a, &a, 10, &addr->addr.usb.bus) < 0 ||
-            virStrToLong_uip(++a, &a, 10, &addr->addr.usb.port) < 0)
-            return -1;
-        break;
-
-    case VIRSH_ADDRESS_TYPE_LAST:
-    default:
-        return -1;
-    }
-
-    return 0;
-}
-
-
-static void
-virshAddressFormat(virBufferPtr buf,
-                   struct virshAddress *addr)
-{
-    switch ((enum virshAddressType) addr->type) {
-    case VIRSH_ADDRESS_TYPE_PCI:
-        virBufferAsprintf(buf,
-                          "<address type='pci' domain='0x%04x' bus='0x%02x' slot='0x%02x' function='0x%0x'",
-                          addr->addr.pci.domain,
-                          addr->addr.pci.bus,
-                          addr->addr.pci.slot,
-                          addr->addr.pci.function);
-
-        if (addr->addr.pci.multifunction)
-            virBufferAddLit(buf, " multifunction='on'");
-
-        virBufferAddLit(buf, "/>\n");
-        break;
-
-    case VIRSH_ADDRESS_TYPE_SATA:
-    case VIRSH_ADDRESS_TYPE_IDE:
-    case VIRSH_ADDRESS_TYPE_SCSI:
-        virBufferAsprintf(buf,
-                          "<address type='drive' controller='%u' bus='%u' unit='%llu'/>\n",
-                          addr->addr.drive.controller,
-                          addr->addr.drive.bus,
-                          addr->addr.drive.unit);
-        break;
-
-    case VIRSH_ADDRESS_TYPE_CCW:
-        virBufferAsprintf(buf,
-                          "<address type='ccw' cssid='0x%02x' ssid='0x%01x' devno='0x%04x'/>\n",
-                          addr->addr.ccw.cssid,
-                          addr->addr.ccw.ssid,
-                          addr->addr.ccw.devno);
-        break;
-
-    case VIRSH_ADDRESS_TYPE_USB:
-        virBufferAsprintf(buf,
-                          "<address type='usb' bus='%u' port='%u'/>\n",
-                          addr->addr.usb.bus,
-                          addr->addr.usb.port);
-        break;
-
-    case VIRSH_ADDRESS_TYPE_LAST:
-    default:
-        return;
-    }
-}
-

 static int
 cmdAttachDiskFormatAddress(vshControl *ctl,
-- 
2.28.0




More information about the libvir-list mailing list