From ef8c30a091b5b0f08f9405878b49c21c5525dd0a Mon Sep 17 00:00:00 2001 Message-Id: From: Boris Fiuczynski Date: Fri, 13 May 2022 12:31:12 +0200 Subject: [PATCH] nodedev: refactor ccw device address parsing from XML Move ccw device address XML parsing into new method for later reuse. Signed-off-by: Boris Fiuczynski Reviewed-by: Michal Privoznik (cherry picked from commit 4402295d371a62ab8632d23002283b8a7721e6a7) Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011 Signed-off-by: Thomas Huth --- src/conf/node_device_conf.c | 96 ++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 1e00f65717..8982368465 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -1141,6 +1141,58 @@ virNodeDevAPMatrixCapabilityParseXML(xmlXPathContextPtr ctxt, } +static int +virNodeDevCCWDeviceAddressParseXML(xmlXPathContextPtr ctxt, + xmlNodePtr node, + const char *dev_name, + virCCWDeviceAddress *ccw_addr) +{ + VIR_XPATH_NODE_AUTORESTORE(ctxt) + g_autofree char *cssid = NULL; + g_autofree char *ssid = NULL; + g_autofree char *devno = NULL; + + ctxt->node = node; + + if (!(cssid = virXPathString("string(./cssid[1])", ctxt))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("missing cssid value for '%s'"), dev_name); + return -1; + } + if (virStrToLong_uip(cssid, NULL, 0, &ccw_addr->cssid) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid cssid value '%s' for '%s'"), + cssid, dev_name); + return -1; + } + + if (!(ssid = virXPathString("string(./ssid[1])", ctxt))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("missing ssid value for '%s'"), dev_name); + return -1; + } + if (virStrToLong_uip(ssid, NULL, 0, &ccw_addr->ssid) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid ssid value '%s' for '%s'"), + ssid, dev_name); + return -1; + } + + if (!(devno = virXPathString("string(./devno[1])", ctxt))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("missing devno value for '%s'"), dev_name); + return -1; + } + if (virStrToLong_uip(devno, NULL, 16, &ccw_addr->devno) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid devno value '%s' for '%s'"), + devno, dev_name); + return -1; + } + + return 0; +} + static int virNodeDevCSSCapabilityParseXML(xmlXPathContextPtr ctxt, xmlNodePtr node, @@ -1178,50 +1230,18 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt, g_autofree xmlNodePtr *nodes = NULL; int n = 0; size_t i = 0; - g_autofree char *cssid = NULL; - g_autofree char *ssid = NULL; - g_autofree char *devno = NULL; + g_autofree virCCWDeviceAddress *ccw_addr = NULL; ctxt->node = node; - if (!(cssid = virXPathString("string(./cssid[1])", ctxt))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("missing cssid value for '%s'"), def->name); - return -1; - } - - if (virStrToLong_uip(cssid, NULL, 0, &ccw_dev->cssid) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("invalid cssid value '%s' for '%s'"), - cssid, def->name); - return -1; - } - - if (!(ssid = virXPathString("string(./ssid[1])", ctxt))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("missing ssid value for '%s'"), def->name); - return -1; - } + ccw_addr = g_new0(virCCWDeviceAddress, 1); - if (virStrToLong_uip(ssid, NULL, 0, &ccw_dev->ssid) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("invalid ssid value '%s' for '%s'"), - ssid, def->name); + if (virNodeDevCCWDeviceAddressParseXML(ctxt, node, def->name, ccw_addr) < 0) return -1; - } - if (!(devno = virXPathString("string(./devno[1])", ctxt))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("missing devno value for '%s'"), def->name); - return -1; - } - - if (virStrToLong_uip(devno, NULL, 16, &ccw_dev->devno) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("invalid devno value '%s' for '%s'"), - devno, def->name); - return -1; - } + ccw_dev->cssid = ccw_addr->cssid; + ccw_dev->ssid = ccw_addr->ssid; + ccw_dev->devno = ccw_addr->devno; if ((n = virXPathNodeSet("./capability", ctxt, &nodes)) < 0) return -1; -- 2.39.1