Signed-off-by: Shi Lei <shi_lei(a)massclouds.com>
---
docs/schemas/network.rng | 8 ++++++
src/conf/network_conf.c | 58 +++++++++++++++++++++++++++-------------
2 files changed, 47 insertions(+), 19 deletions(-)
diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 919464d..ee4487e 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -336,6 +336,14 @@
<!-- VIRT:DIRECTIVE {
"structure": {"output":
"src/conf/network_conf"},
"clearfunc": {"output":
"src/conf/network_conf"},
+ "parsefunc": {
+ "args.noctxt": true,
+ "args.instname": true,
+ "post": true,
+ "args": [
+ {"name": "partialOkay", "type":
"Bool"}
+ ]
+ },
"members": [{"id": "hostname",
"name": "name"}]
} -->
<element name="host">
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 060d0e3..d9f2252 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -560,6 +560,40 @@ virNetworkDHCPDefParseXML(const char *networkName,
}
+static int
+virNetworkDNSHostDefParseXMLPost(xmlNodePtr curnode G_GNUC_UNUSED,
+ virNetworkDNSHostDefPtr def,
+ const char *networkName,
+ bool partialOkay,
+ const char *ipStr,
+ int nHostnameNodes G_GNUC_UNUSED)
+{
+ if (!ipStr && !partialOkay) {
+ virReportError(VIR_ERR_XML_DETAIL,
+ _("Missing IP address in network '%s' DNS HOST
record"),
+ networkName);
+ return -1;
+ }
+
+ if (def->nnames == 0 && !partialOkay) {
+ virReportError(VIR_ERR_XML_DETAIL,
+ _("Missing hostname in network '%s' DNS HOST
record"),
+ networkName);
+ return -1;
+ }
+
+ if (!VIR_SOCKET_ADDR_VALID(&def->ip) && def->nnames == 0) {
+ virReportError(VIR_ERR_XML_DETAIL,
+ _("Missing ip and hostname in network '%s' DNS HOST
record"),
+ networkName);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/* virNetworkDNSHostDefParseXML will be replaced by generated namesake */
static int
virNetworkDNSHostDefParseXML(const char *networkName,
xmlNodePtr node,
@@ -569,13 +603,7 @@ virNetworkDNSHostDefParseXML(const char *networkName,
xmlNodePtr cur;
char *ip;
- if (!(ip = virXMLPropString(node, "ip")) && !partialOkay) {
- virReportError(VIR_ERR_XML_DETAIL,
- _("Missing IP address in network '%s' DNS HOST
record"),
- networkName);
- goto error;
- }
-
+ ip = virXMLPropString(node, "ip");
if (ip && (virSocketAddrParse(&def->ip, ip, AF_UNSPEC) < 0)) {
virReportError(VIR_ERR_XML_DETAIL,
_("Invalid IP address in network '%s' DNS HOST
record"),
@@ -583,7 +611,6 @@ virNetworkDNSHostDefParseXML(const char *networkName,
VIR_FREE(ip);
goto error;
}
- VIR_FREE(ip);
cur = node->children;
while (cur != NULL) {
@@ -606,23 +633,16 @@ virNetworkDNSHostDefParseXML(const char *networkName,
}
cur = cur->next;
}
- if (def->nnames == 0 && !partialOkay) {
- virReportError(VIR_ERR_XML_DETAIL,
- _("Missing hostname in network '%s' DNS HOST
record"),
- networkName);
- goto error;
- }
- if (!VIR_SOCKET_ADDR_VALID(&def->ip) && def->nnames == 0) {
- virReportError(VIR_ERR_XML_DETAIL,
- _("Missing ip and hostname in network '%s' DNS HOST
record"),
- networkName);
+ if (virNetworkDNSHostDefParseXMLPost(node, def, networkName,
+ partialOkay, ip, def->nnames) < 0)
goto error;
- }
+ VIR_FREE(ip);
return 0;
error:
+ VIR_FREE(ip);
virNetworkDNSHostDefClear(def);
return -1;
}
--
2.17.1