This maps to XML like:
...
To dnsmasq config options
...
foo=bar
cname=*.foo.example.com,master.example.com
Signed-off-by: Cole Robinson
---
docs/schemas/network.rng | 11 ++
src/network/bridge_driver.c | 130 +-
src/network/bridge_driver.h | 12 ++
tests/Makefile.am | 14 +-
.../networkxml2confdata/dnsmasq-options.conf | 18 +++
tests/networkxml2confdata/dnsmasq-options.xml | 15 ++
tests/networkxml2conftest.c | 8 +-
tests/networkxml2xmlin/dnsmasq-options.xml| 15 ++
tests/networkxml2xmlout/dnsmasq-options.xml | 17 +++
tests/networkxml2xmltest.c| 11 +-
10 files changed, 239 insertions(+), 12 deletions(-)
create mode 100644 tests/networkxml2confdata/dnsmasq-options.conf
create mode 100644 tests/networkxml2confdata/dnsmasq-options.xml
create mode 100644 tests/networkxml2xmlin/dnsmasq-options.xml
create mode 100644 tests/networkxml2xmlout/dnsmasq-options.xml
diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 2a6e3358fd..56937d6a4e 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -405,6 +405,17 @@
+
+
+
+http://libvirt.org/schemas/network/dnsmasq/1.0;>
+
+
+
+
+
+
+
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 1a4d6e7f7b..41fa89a4af 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -69,6 +69,8 @@
#include "virjson.h"
#include "virnetworkportdef.h"
+#include
+
#define VIR_FROM_THIS VIR_FROM_NETWORK
#define MAX_BRIDGE_ID 256
@@ -83,6 +85,8 @@
VIR_LOG_INIT("network.bridge_driver");
+#define DNSMASQ_NAMESPACE_HREF "http://libvirt.org/schemas/network/dnsmasq/1.0;
+
static virNetworkDriverStatePtr network_driver;
@@ -136,10 +140,126 @@ networkDnsmasqCapsRefresh(virNetworkDriverStatePtr
driver)
return 0;
}
-static virNetworkXMLOptionPtr
+
+static void
+networkDnsmasqDefNamespaceFree(void *nsdata)
+{
+networkDnsmasqXmlNsDefPtr def = nsdata;
+if (!def)
+return;
+
+virStringListFreeCount(def->options, def->noptions);
+
+VIR_FREE(def);
+}
+
+
+static int
+networkDnsmasqDefNamespaceParseOptions(networkDnsmasqXmlNsDefPtr nsdef,
+ xmlXPathContextPtr ctxt)
+{
+VIR_AUTOFREE(xmlNodePtr *) nodes = NULL;
+ssize_t nnodes;
+size_t i;
+
+if ((nnodes = virXPathNodeSet("./dnsmasq:options/dnsmasq:option",
+ ctxt, )) < 0)
+return -1;
+
+if (nnodes == 0)
+return 0;
+
+if (VIR_ALLOC_N(nsdef->options, nnodes) < 0)
+return -1;
+
+for (i = 0; i < nnodes; i++) {
+if (!(nsdef->options[nsdef->noptions++] = virXMLPropString(nodes[i],
"value"))) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("No dnsmasq options value specified"));
+return -1;
+}
+}
+
+return 0;
+}
+
+
+static int
+networkDnsmasqDefNamespaceParse(xmlXPathContextPtr ctxt,
+void **data)
+{
+networkDnsmasqXmlNsDefPtr nsdata = NULL;
+int ret = -1;
+
+if (xmlXPathRegisterNs(ctxt, BAD_CAST "dnsmasq",
+ BAD_CAST DNSMASQ_NAMESPACE_HREF) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to register xml namespace '%s'"),
+ DNSMASQ_NAMESPACE_HREF);
+return -1;
+}
+
+if (VIR_ALLOC(nsdata) < 0)
+return -1;
+
+if (networkDnsmasqDefNamespaceParseOptions(nsdata, ctxt))
+goto cleanup;
+
+if (nsdata->noptions > 0)
+VIR_STEAL_PTR(*data, nsdata);
+
+ret = 0;
+
+ cleanup:
+networkDnsmasqDefNamespaceFree(nsdata);
+return ret;
+}
+
+
+static int
+networkDnsmasqDefNamespaceFormatXML(virBufferPtr buf,
+void *nsdata)
+{
+networkDnsmasqXmlNsDefPtr def = nsdata;
+size_t i;
+
+if (!def->noptions)
+return 0;
+
+virBufferAddLit(buf, "\n");
+virBufferAdjustIndent(buf, 2);
+
+for (i = 0; i < def->noptions; i++) {
+virBufferEscapeString(buf, "\n",
+ def->options[i]);
+}
+
+virBufferAdjustIndent(buf, -2);
+virBufferAddLit(buf, "\n");
+
+return 0;
+}
+
+
+static const char *
+networkDnsmasqDefNamespaceHref(void)
+{
+return "xmlns:dnsmasq='" DNSMASQ_NAMESPACE_HREF "'";
+}
+
+
+virNetworkXMLNamespace networkDnsmasqXMLNamespace = {
+.parse = networkDnsmasqDefNamespaceParse,
+.free = networkDnsmasqDefNamespaceFree,
+.format = networkDnsmasqDefNamespaceFormatXML,
+.href = networkDnsmasqDefNamespaceHref,
+};
+
+
+virNetworkXMLOptionPtr
networkDnsmasqCreateXMLConf(void)
{
-return