]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: add ccw device address parsing into virccw
authorBoris Fiuczynski <fiuczy@linux.ibm.com>
Fri, 13 May 2022 10:31:09 +0000 (12:31 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 23 May 2022 14:31:57 +0000 (16:31 +0200)
Add virCCWDeviceAddressParseFromString and use it in nodedev udev.

Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/libvirt_private.syms
src/node_device/node_device_udev.c
src/util/virccw.c
src/util/virccw.h

index 68716ec2f00ac50019d8048a62c2a09c992c77dc..6f50b4ca1d532935e65c565745b24b4dd8da9ad8 100644 (file)
@@ -1928,6 +1928,7 @@ virCCWDeviceAddressAsString;
 virCCWDeviceAddressEqual;
 virCCWDeviceAddressIncrement;
 virCCWDeviceAddressIsValid;
+virCCWDeviceAddressParseFromString;
 
 
 # util/vircgroup.h
index b68dc1215842157c984a67a6c7b13bdf990af861..4bb841c66bccdf9f9937fcffdc3a2d0b3869fd03 100644 (file)
@@ -36,6 +36,7 @@
 #include "viruuid.h"
 #include "virbuffer.h"
 #include "virfile.h"
+#include "virccw.h"
 #include "virpci.h"
 #include "virpidfile.h"
 #include "virstring.h"
@@ -1086,9 +1087,10 @@ udevGetCCWAddress(const char *sysfs_path,
     char *p;
 
     if ((p = strrchr(sysfs_path, '/')) == NULL ||
-        virStrToLong_ui(p + 1, &p, 16, &data->ccw_dev.cssid) < 0 || p == NULL ||
-        virStrToLong_ui(p + 1, &p, 16, &data->ccw_dev.ssid) < 0 || p == NULL ||
-        virStrToLong_ui(p + 1, &p, 16, &data->ccw_dev.devno) < 0) {
+        virCCWDeviceAddressParseFromString(p + 1,
+                                           &data->ccw_dev.cssid,
+                                           &data->ccw_dev.ssid,
+                                           &data->ccw_dev.devno) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("failed to parse the CCW address from sysfs path: '%s'"),
                        sysfs_path);
index e2785bd9ab5cc4f9e90a0dff99e37a1e73bd7c48..33df1c24284e966d09764fe6baa744ae3972867d 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <config.h>
 #include "virccw.h"
+#include "virstring.h"
 
 
 bool
@@ -60,3 +61,20 @@ virCCWDeviceAddressIncrement(virCCWDeviceAddress *addr)
     *addr = ccwaddr;
     return 0;
 }
+
+int
+virCCWDeviceAddressParseFromString(const char *address,
+                                   unsigned int *cssid,
+                                   unsigned int *ssid,
+                                   unsigned int *devno)
+{
+    char *p;
+
+    if (address == NULL || virStrToLong_ui(address, &p, 16, cssid) < 0 ||
+        p == NULL || virStrToLong_ui(p + 1, &p, 16, ssid) < 0 ||
+        p == NULL || virStrToLong_ui(p + 1, &p, 16, devno) < 0) {
+        return -1;
+    }
+
+    return 0;
+}
index aebbd4ab6d98b154701e37872d68f1e80032df2c..df0273bcacd9ad37ce256352c71ccd1059fd8410 100644 (file)
@@ -42,3 +42,8 @@ bool virCCWDeviceAddressEqual(virCCWDeviceAddress *addr1,
 char* virCCWDeviceAddressAsString(virCCWDeviceAddress *addr)
     ATTRIBUTE_NONNULL(1);
 int virCCWDeviceAddressIncrement(virCCWDeviceAddress *addr);
+
+int virCCWDeviceAddressParseFromString(const char *address,
+                                       unsigned int *cssid,
+                                       unsigned int *ssid,
+                                       unsigned int *devno);