The corresponding structs are declared there.
Signed-off-by: Andrea Bolognani
---
src/conf/device_conf.c | 267 ++
src/conf/device_conf.h | 17 +++
src/conf/domain_conf.c | 270 ---
src/libvirt_private.syms | 6 +
4 files changed, 290 insertions(+), 270 deletions(-)
diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c
index 48788540d3..18592bbc1d 100644
--- a/src/conf/device_conf.c
+++ b/src/conf/device_conf.c
@@ -343,6 +343,273 @@
virDomainDeviceCCWAddressIsValid(virDomainDeviceCCWAddressPtr addr)
addr->devno <= VIR_DOMAIN_DEVICE_CCW_MAX_DEVNO;
}
+int
+virDomainDeviceCCWAddressParseXML(xmlNodePtr node,
+ virDomainDeviceCCWAddressPtr addr)
+{
+int ret = -1;
+char *cssid;
+char *ssid;
+char *devno;
+
+memset(addr, 0, sizeof(*addr));
+
+cssid = virXMLPropString(node, "cssid");
+ssid = virXMLPropString(node, "ssid");
+devno = virXMLPropString(node, "devno");
+
+if (cssid && ssid && devno) {
+if (cssid &&
+virStrToLong_uip(cssid, NULL, 0, >cssid) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'cssid' attribute"));
+goto cleanup;
+}
+if (ssid &&
+virStrToLong_uip(ssid, NULL, 0, >ssid) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'ssid' attribute"));
+goto cleanup;
+}
+if (devno &&
+virStrToLong_uip(devno, NULL, 0, >devno) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'devno' attribute"));
+goto cleanup;
+}
+if (!virDomainDeviceCCWAddressIsValid(addr)) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Invalid specification for virtio ccw"
+ " address: cssid='%s' ssid='%s' devno='%s'"),
+ cssid, ssid, devno);
+goto cleanup;
+}
+addr->assigned = true;
+} else if (cssid || ssid || devno) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Invalid partial specification for virtio ccw"
+ " address"));
+goto cleanup;
+}
+
+ret = 0;
+
+ cleanup:
+VIR_FREE(cssid);
+VIR_FREE(ssid);
+VIR_FREE(devno);
+return ret;
+}
+
+int
+virDomainDeviceDriveAddressParseXML(xmlNodePtr node,
+virDomainDeviceDriveAddressPtr addr)
+{
+char *bus, *unit, *controller, *target;
+int ret = -1;
+
+memset(addr, 0, sizeof(*addr));
+
+controller = virXMLPropString(node, "controller");
+bus = virXMLPropString(node, "bus");
+target = virXMLPropString(node, "target");
+unit = virXMLPropString(node, "unit");
+
+if (controller &&
+virStrToLong_uip(controller, NULL, 10, >controller) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'controller' attribute"));
+goto cleanup;
+}
+
+if (bus &&
+virStrToLong_uip(bus, NULL, 10, >bus) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'bus' attribute"));
+goto cleanup;
+}
+
+if (target &&
+virStrToLong_uip(target, NULL, 10, >target) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'target' attribute"));
+goto cleanup;
+}
+
+if (unit &&
+virStrToLong_uip(unit, NULL, 10, >unit) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'unit' attribute"));
+goto cleanup;
+}
+
+ret = 0;
+
+ cleanup:
+VIR_FREE(controller);
+VIR_FREE(bus);
+VIR_FREE(target);
+VIR_FREE(unit);
+return ret;
+}
+
+int
+virDomainDeviceVirtioSerialAddressParseXML(xmlNodePtr node,
+
virDomainDeviceVirtioSerialAddressPtr addr)
+{
+char *controller, *bus, *port;
+int ret = -1;
+
+memset(addr, 0, sizeof(*addr));
+
+controller = virXMLPropString(node, "controller");
+bus = virXMLPropString(node, "bus");
+port = virXMLPropString(node, "port");
+
+if (controller &&
+virStrToLong_uip(controller, NULL, 10, >controller) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'controller' attribute"));
+goto cleanup;
+}
+
+if (bus &&
+virStrToLong_uip(bus, NULL, 10, >bus) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse 'bus' attribute"));
+goto cleanup;
+}
+
+if (port &&
+virStrToLong_uip(port, NULL, 10, >port) < 0) {
+