util: add ccw device address parsing into virccw

Add virCCWDeviceAddressParseFromString and use it in nodedev udev.

Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Boris Fiuczynski 2022-05-13 12:31:09 +02:00 committed by Michal Privoznik
parent 2d9fd19bf5
commit 8d52f99f0b
4 changed files with 29 additions and 3 deletions

View File

@ -1928,6 +1928,7 @@ virCCWDeviceAddressAsString;
virCCWDeviceAddressEqual;
virCCWDeviceAddressIncrement;
virCCWDeviceAddressIsValid;
virCCWDeviceAddressParseFromString;
# util/vircgroup.h

View 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);

View 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;
}

View 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);