networkDnsmasqLeaseFileNameFunc networkDnsmasqLeaseFileName =
networkDnsmasqLeaseFileNameDefault;
+static char *
+networkDnsmasqConfigFileName(const char *netname)
+{
+ char *conffile;
+
+ ignore_value(virAsprintf(&conffile, DNSMASQ_STATE_DIR "/%s.conf",
+ netname));
+ return conffile;
+}
+
static char *
networkRadvdPidfileBasename(const char *netname)
{
{
char *leasefile = NULL;
char *radvdconfigfile = NULL;
+ char *configfile = NULL;
char *radvdpidbase = NULL;
dnsmasqContext *dctx = NULL;
virNetworkDefPtr def = virNetworkObjGetPersistentDef(net);
if (!(radvdpidbase = networkRadvdPidfileBasename(def->name)))
goto no_memory;
+ if (!(configfile = networkDnsmasqConfigFileName(def->name)))
+ goto no_memory;
+
/* dnsmasq */
dnsmasqDelete(dctx);
unlink(leasefile);
+ unlink(configfile);
/* radvd */
unlink(radvdconfigfile);
cleanup:
VIR_FREE(leasefile);
+ VIR_FREE(configfile);
VIR_FREE(radvdconfigfile);
VIR_FREE(radvdpidbase);
dnsmasqContextFree(dctx);
}
-static int
-networkBuildDnsmasqArgv(virNetworkObjPtr network,
+int
+networkDnsmasqConfContents(virNetworkObjPtr network,
const char *pidfile,
- virCommandPtr cmd,
+ char **configstr,
dnsmasqContext *dctx,
dnsmasqCapsPtr caps ATTRIBUTE_UNUSED)
{
+ virBuffer configbuf = VIR_BUFFER_INITIALIZER;
int r, ret = -1;
int nbleases = 0;
int ii;
virNetworkIpDefPtr tmpipdef, ipdef, ipv4def, ipv6def;
bool ipv6SLAAC;
+ *configstr = NULL;
+
/*
- * NB, be careful about syntax for dnsmasq options in long format.
- *
- * If the flag has a mandatory argument, it can be given using
- * either syntax:
- *
- * --foo bar
- * --foo=bar
+ * All dnsmasq parameters are put into a configuration file, except the
+ * command line --conf-file=parameter which specifies the location of
+ * configuration file.
*
- * If the flag has a optional argument, it *must* be given using
- * the syntax:
- *
- * --foo=bar
- *
- * It is hard to determine whether a flag is optional or not,
- * without reading the dnsmasq source :-( The manpage is not
- * very explicit on this.
+ * All dnsmasq conf-file parameters must be specified as "foo=bar"
+ * as oppose to "--foo bar" which was acceptable on the command line.
*/
/*
* Needed to ensure dnsmasq uses same algorithm for processing
* multiple namedriver entries in /etc/resolv.conf as GLibC.
*/
- virCommandAddArgList(cmd, "--strict-order",
- "--domain-needed",
- NULL);
-
- if (network->def->domain) {
- virCommandAddArgPair(cmd, "--domain", network->def->domain);
- virCommandAddArg(cmd, "--expand-hosts");
- }
- /* need to specify local even if no domain specified */
- virCommandAddArgFormat(cmd, "--local=/%s/",
- network->def->domain ? network->def->domain : "");
-
- if (pidfile)
- virCommandAddArgPair(cmd, "--pid-file", pidfile);
- /* *no* conf file */
- virCommandAddArg(cmd, "--conf-file=");
+ /* create dnsmasq config file appropriate for this network */
+ virBufferAsprintf(&configbuf,
+ "##WARNING: THIS IS AN AUTO-GENERATED FILE. "
+ "CHANGES TO IT ARE LIKELY TO BE\n"
+ "##OVERWRITTEN AND LOST. Changes to this "
+ "configuration should be made using:\n"
+ "## virsh net-edit %s\n"
+ "## of other applications using the libvirt API.\n"
+ "##\n## dnsmasq conf file created by libvirt\n"
+ "strict-order\n"
+ "domain-needed\n",
+ network->def->name);
+
+ if (network->def->domain) {
+ virBufferAsprintf(&configbuf,
+ "domain=%s\n"
+ "expand-hosts\n",
+ network->def->domain);
+ }
+ /* need to specify local even if no domain specified */
+ virBufferAsprintf(&configbuf,
+ "local=/%s/\n",
+ network->def->domain ? network->def->domain : "");
+
+ if (pidfile)
+ virBufferAsprintf(&configbuf, "pid-file=%s\n", pidfile);
if (dnsmasqCapsGet(caps, DNSMASQ_CAPS_BIND_DYNAMIC)) {
/* using --bind-dynamic with only --interface (no
* other than one of the virtual guests connected directly to
* this network). This was added in response to CVE 2012-3411.
*/
- virCommandAddArgList(cmd,
- "--bind-dynamic",
- "--interface", network->def->bridge,
- NULL);
+ virBufferAsprintf(&configbuf,
+ "bind-dynamic\n"
+ "interface=%s\n",
+ network->def->bridge);
} else {
- virCommandAddArgList(cmd,
- "--bind-interfaces",
- "--except-interface", "lo",
- NULL);
+ virBufferAddLit(&configbuf,
+ "bind-interfaces\n"
+ "except-interface=lo\n");
/*
* --interface does not actually work with dnsmasq < 2.47,
* due to DAD for ipv6 addresses on the interface.
if (!ipaddr)
goto cleanup;
/* also part of CVE 2012-3411 - if the host's version of
- * dnsmasq doesn't have --bind-dynamic, only allow listening on
+ * dnsmasq doesn't have bind-dynamic, only allow listening on
* private/local IP addresses (see RFC1918/RFC3484/RFC4193)
*/
if (!virSocketAddrIsPrivate(&tmpipdef->address)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Publicly routable address %s is prohibited. "
"The version of dnsmasq on this host (%d.%d) doesn't "
- "support the --bind-dynamic option, which is required "
+ "support the bind-dynamic option, which is required "
"for safe operation on a publicly routable subnet "
"(see CVE-2012-3411). You must either upgrade dnsmasq, "
"or use a private/local subnet range for this network "
(int)version / 1000000, (int)(version % 1000000) / 1000);
goto cleanup;
}
- virCommandAddArgList(cmd, "--listen-address", ipaddr, NULL);
+ virBufferAsprintf(&configbuf, "listen-address=%s\n", ipaddr);
VIR_FREE(ipaddr);
}
}
/* If this is an isolated network, set the default route option
* (3) to be empty to avoid setting a default route that's
- * guaranteed to not work, and set --no-resolv so that no dns
+ * guaranteed to not work, and set no-resolv so that no dns
* requests are forwarded on to the dns server listed in the
* host's /etc/resolv.conf (since this could be used as a channel
* to build a connection to the outside).
*/
if (network->def->forward.type == VIR_NETWORK_FORWARD_NONE) {
- virCommandAddArgList(cmd, "--dhcp-option=3",
- "--no-resolv", NULL);
+ virBufferAddLit(&configbuf, "dhcp-option=3\n"
+ "no-resolv\n");
}
for (ii = 0; ii < dns->ntxts; ii++) {
- virCommandAddArgFormat(cmd, "--txt-record=%s,%s",
- dns->txts[ii].name,
- dns->txts[ii].value);
+ virBufferAsprintf(&configbuf, "txt-record=%s,%s\n",
+ dns->txts[ii].name,
+ dns->txts[ii].value);
}
for (ii = 0; ii < dns->nsrvs; ii++) {
goto cleanup;
}
- virCommandAddArgPair(cmd, "--srv-host", record);
+ virBufferAsprintf(&configbuf, "srv-host=%s\n", record);
VIR_FREE(record);
VIR_FREE(recordPort);
VIR_FREE(recordWeight);
VIR_FREE(saddr);
goto cleanup;
}
- virCommandAddArg(cmd, "--dhcp-range");
- virCommandAddArgFormat(cmd, "%s,%s", saddr, eaddr);
+ virBufferAsprintf(&configbuf, "dhcp-range=%s,%s\n",
+ saddr, eaddr);
VIR_FREE(saddr);
VIR_FREE(eaddr);
nbleases += virSocketAddrGetRange(&ipdef->ranges[r].start,
char *bridgeaddr = virSocketAddrFormat(&ipdef->address);
if (!bridgeaddr)
goto cleanup;
- virCommandAddArg(cmd, "--dhcp-range");
- virCommandAddArgFormat(cmd, "%s,static", bridgeaddr);
+ virBufferAsprintf(&configbuf, "dhcp-range=%s,static\n", bridgeaddr);
VIR_FREE(bridgeaddr);
}
/* Note: the following is IPv4 only */
if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET)) {
if (ipdef->nranges || ipdef->nhosts)
- virCommandAddArg(cmd, "--dhcp-no-override");
+ virBufferAddLit(&configbuf, "dhcp-no-override\n");
if (ipdef->tftproot) {
- virCommandAddArgList(cmd, "--enable-tftp",
- "--tftp-root", ipdef->tftproot,
- NULL);
+ virBufferAddLit(&configbuf, "enable-tftp\n");
+ virBufferAsprintf(&configbuf, "tftp-root=%s\n", ipdef->tftproot);
}
if (ipdef->bootfile) {
- virCommandAddArg(cmd, "--dhcp-boot");
if (VIR_SOCKET_ADDR_VALID(&ipdef->bootserver)) {
char *bootserver = virSocketAddrFormat(&ipdef->bootserver);
virReportOOMError();
goto cleanup;
}
- virCommandAddArgFormat(cmd, "%s%s%s",
+ virBufferAsprintf(&configbuf, "dhcp-boot=%s%s%s\n",
ipdef->bootfile, ",,", bootserver);
VIR_FREE(bootserver);
} else {
- virCommandAddArg(cmd, ipdef->bootfile);
+ virBufferAsprintf(&configbuf, "dhcp-boot=%s\n", ipdef->bootfile);
}
}
}
virReportOOMError();
goto cleanup;
}
- virCommandAddArgFormat(cmd, "--dhcp-leasefile=%s", leasefile);
+ virBufferAsprintf(&configbuf, "dhcp-leasefile=%s\n", leasefile);
VIR_FREE(leasefile);
- virCommandAddArgFormat(cmd, "--dhcp-lease-max=%d", nbleases);
+ virBufferAsprintf(&configbuf, "dhcp-lease-max=%d\n", nbleases);
}
/* this is done once per interface */
* file to allow for runtime additions.
*/
if (ipv4def || ipv6def)
- virCommandAddArgPair(cmd, "--dhcp-hostsfile",
- dctx->hostsfile->path);
+ virBufferAsprintf(&configbuf, "dhcp-hostsfile=%s\n",
+ dctx->hostsfile->path);
- /* Likewise, always create this file and put it on the commandline,
- * to allow for runtime additions.
+ /* Likewise, always create this file and put it on the commandline, to allow for
+ * for runtime additions.
*/
- virCommandAddArgPair(cmd, "--addn-hosts",
- dctx->addnhostsfile->path);
+ virBufferAsprintf(&configbuf, "addn-hosts=%s\n",
+ dctx->addnhostsfile->path);
/* Are we doing RA instead of radvd? */
if (DNSMASQ_RA_SUPPORT(caps)) {
if (ipv6def)
- virCommandAddArg(cmd, "--enable-ra");
+ virBufferAddLit(&configbuf, "enable-ra\n");
else {
for (ii = 0;
(ipdef = virNetworkDefGetIpByIndex(network->def, AF_INET6, ii));
char *bridgeaddr = virSocketAddrFormat(&ipdef->address);
if (!bridgeaddr)
goto cleanup;
- virCommandAddArgFormat(cmd, "--dhcp-range=%s,ra-only",
- bridgeaddr);
+ virBufferAsprintf(&configbuf,
+ "dhcp-range=%s,ra-only\n", bridgeaddr);
VIR_FREE(bridgeaddr);
}
}
}
}
+ if (!(*configstr = virBufferContentAndReset(&configbuf)))
+ goto cleanup;
+
ret = 0;
cleanup:
+ virBufferFreeAndReset(&configbuf);
VIR_FREE(record);
VIR_FREE(recordPort);
VIR_FREE(recordWeight);
return ret;
}
-int
+/* build the dnsmasq command line */
+static int
networkBuildDhcpDaemonCommandLine(virNetworkObjPtr network, virCommandPtr *cmdout,
char *pidfile, dnsmasqContext *dctx,
dnsmasqCapsPtr caps)
{
virCommandPtr cmd = NULL;
int ret = -1;
+ char *configfile = NULL;
+ char *configstr = NULL;
network->dnsmasqPid = -1;
- cmd = virCommandNew(dnsmasqCapsGetBinaryPath(caps));
- if (networkBuildDnsmasqArgv(network, pidfile, cmd, dctx, caps) < 0) {
+ if (networkDnsmasqConfContents(network, pidfile, &configstr, dctx, caps) < 0)
+ goto cleanup;
+ if (!configstr)
+ goto cleanup;
+
+ /* construct the filename */
+ if (!(configfile = networkDnsmasqConfigFileName(network->def->name))) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ /* Write the file */
+ if (virFileWriteStr(configfile, configstr, 0600) < 0) {
+ virReportSystemError(errno,
+ _("couldn't write dnsmasq config file '%s'"),
+ configfile);
goto cleanup;
}
+ cmd = virCommandNew(dnsmasqCapsGetBinaryPath(caps));
+ virCommandAddArgFormat(cmd, "--conf-file=%s", configfile);
+
if (cmdout)
*cmdout = cmd;
ret = 0;
network->radvdPid = -1;
/* Is dnsmasq handling RA? */
- if (DNSMASQ_RA_SUPPORT(driver->dnsmasqCaps)) {
+ if (DNSMASQ_RA_SUPPORT(driver->dnsmasqCaps)) {
ret = 0;
goto cleanup;
}
int networkGetNetworkAddress(const char *netname, char **netaddr)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-int networkBuildDhcpDaemonCommandLine(virNetworkObjPtr network,
- virCommandPtr *cmdout, char *pidfile,
- dnsmasqContext *dctx,
- dnsmasqCapsPtr caps)
- ;
+int networkDnsmasqConfContents(virNetworkObjPtr network,
+ const char *pidfile,
+ char **configstr,
+ dnsmasqContext *dctx,
+ dnsmasqCapsPtr caps);
# else
/* Define no-op replacements that don't drag in any link dependencies. */
# define networkAllocateActualDevice(iface) 0
# define networkNotifyActualDevice(iface) (iface=iface, 0)
# define networkReleaseActualDevice(iface) (iface=iface, 0)
# define networkGetNetworkAddress(netname, netaddr) (-2)
-# define networkBuildDhcpDaemonCommandLine(network, cmdout, pidfile, dctx, caps) 0
+# define networkDnsmasqConfContents(network, pidfile, configstr, \
+ dctx, caps) 0
# endif
typedef char *(*networkDnsmasqLeaseFileNameFunc)(const char *netname);
networkschematest \
networkxml2xmlin \
networkxml2xmlout \
- networkxml2argvdata \
+ networkxml2confdata \
nodedevschemadata \
nodedevschematest \
nodeinfodata \
test_programs += networkxml2xmltest
if WITH_NETWORK
-test_programs += networkxml2argvtest
+test_programs += networkxml2conftest
endif
if WITH_STORAGE_SHEEPDOG
networkxml2xmltest_LDADD = $(LDADDS)
if WITH_NETWORK
-networkxml2argvtest_SOURCES = \
- networkxml2argvtest.c \
+networkxml2conftest_SOURCES = \
+ networkxml2conftest.c \
testutils.c testutils.h
-networkxml2argvtest_LDADD = ../src/libvirt_driver_network_impl.la $(LDADDS)
+networkxml2conftest_LDADD = ../src/libvirt_driver_network_impl.la $(LDADDS)
else
-EXTRA_DIST += networkxml2argvtest.c
+EXTRA_DIST += networkxml2conftest.c
endif
if WITH_STORAGE_SHEEPDOG
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---local=// \
---conf-file= \
---bind-dynamic \
---interface virbr0 \
---dhcp-range 192.168.122.2,192.168.122.254 \
---dhcp-no-override \
---dhcp-range 2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
---dhcp-lease-max=493 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts \
---enable-ra\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---domain=mynet \
---expand-hosts \
---local=/mynet/ \
---conf-file= \
---bind-dynamic \
---interface virbr0 \
---dhcp-range 2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
---dhcp-lease-max=240 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts \
---enable-ra\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---local=// \
---conf-file= \
---bind-dynamic \
---interface virbr1 \
---dhcp-range 192.168.122.1,static \
---dhcp-no-override \
---dhcp-range 2001:db8:ac10:fd01::1,static \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/local.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/local.addnhosts \
---enable-ra\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---local=// \
---conf-file= \
---bind-interfaces \
---except-interface lo \
---listen-address 192.168.152.1 \
---dhcp-option=3 \
---no-resolv \
---dhcp-range 192.168.152.2,192.168.152.254 \
---dhcp-no-override \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/private.leases \
---dhcp-lease-max=253 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/private.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/private.addnhosts\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---domain=example.com \
---expand-hosts \
---local=/example.com/ \
---conf-file= \
---bind-dynamic \
---interface virbr0 \
---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---local=// \
---conf-file= \
---bind-interfaces \
---except-interface lo \
---listen-address 192.168.122.1 \
---listen-address 192.168.123.1 \
---listen-address fc00:db8:ac10:fe01::1 \
---listen-address fc00:db8:ac10:fd01::1 \
---listen-address 10.24.10.1 \
---srv-host=name.tcp.,,,, \
---dhcp-range 192.168.122.2,192.168.122.254 \
---dhcp-no-override \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
---dhcp-lease-max=253 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---local=// \
---conf-file= \
---bind-dynamic \
---interface virbr0 \
---srv-host=name.tcp.test-domain-name,.,1024,10,10 \
---dhcp-range 192.168.122.2,192.168.122.254 \
---dhcp-no-override \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
---dhcp-lease-max=253 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---local=// \
---conf-file= \
---bind-dynamic --interface virbr0 \
-'--txt-record=example,example value' \
---dhcp-range 192.168.122.2,192.168.122.254 \
---dhcp-no-override \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
---dhcp-lease-max=253 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---local=// \
---conf-file= \
---bind-dynamic \
---interface virbr0 \
---dhcp-range 192.168.122.2,192.168.122.254 \
---dhcp-no-override \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
---dhcp-lease-max=253 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts \
---dhcp-range=2001:db8:ac10:fe01::1,ra-only \
---dhcp-range=2001:db8:ac10:fd01::1,ra-only\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---domain=example.com \
---expand-hosts \
---local=/example.com/ \
---conf-file= \
---bind-interfaces \
---except-interface lo \
---listen-address 192.168.122.1 \
---dhcp-range 192.168.122.2,192.168.122.254 \
---dhcp-no-override \
---enable-tftp \
---tftp-root /var/lib/tftproot \
---dhcp-boot pxeboot.img \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases \
---dhcp-lease-max=253 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/netboot.addnhosts\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---domain=example.com \
---expand-hosts \
---local=/example.com/ \
---conf-file= \
---bind-interfaces \
---except-interface lo \
---listen-address 192.168.122.1 \
---dhcp-range 192.168.122.2,192.168.122.254 \
---dhcp-no-override \
---dhcp-boot pxeboot.img,,10.20.30.40 \
---dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases \
---dhcp-lease-max=253 \
---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile \
---addn-hosts=/var/lib/libvirt/dnsmasq/netboot.addnhosts\
+++ /dev/null
-@DNSMASQ@ \
---strict-order \
---domain-needed \
---local=// \
---conf-file= \
---bind-dynamic \
---interface virbr1 \
---addn-hosts=/var/lib/libvirt/dnsmasq/local.addnhosts\
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit default
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+local=//
+bind-dynamic
+interface=virbr0
+dhcp-range=192.168.122.2,192.168.122.254
+dhcp-no-override
+dhcp-range=2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases
+dhcp-lease-max=493
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
+enable-ra
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit default
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+domain=mynet
+expand-hosts
+local=/mynet/
+bind-dynamic
+interface=virbr0
+dhcp-range=2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases
+dhcp-lease-max=240
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
+enable-ra
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit local
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+local=//
+bind-dynamic
+interface=virbr1
+dhcp-range=192.168.122.1,static
+dhcp-no-override
+dhcp-range=2001:db8:ac10:fd01::1,static
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/local.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/local.addnhosts
+enable-ra
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit private
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+local=//
+bind-interfaces
+except-interface=lo
+listen-address=192.168.152.1
+dhcp-option=3
+no-resolv
+dhcp-range=192.168.152.2,192.168.152.254
+dhcp-no-override
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/private.leases
+dhcp-lease-max=253
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/private.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/private.addnhosts
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit default
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+domain=example.com
+expand-hosts
+local=/example.com/
+bind-dynamic
+interface=virbr0
+addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit default
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+local=//
+bind-interfaces
+except-interface=lo
+listen-address=192.168.122.1
+listen-address=192.168.123.1
+listen-address=fc00:db8:ac10:fe01::1
+listen-address=fc00:db8:ac10:fd01::1
+listen-address=10.24.10.1
+srv-host=name.tcp.,,,,
+dhcp-range=192.168.122.2,192.168.122.254
+dhcp-no-override
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases
+dhcp-lease-max=253
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit default
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+local=//
+bind-dynamic
+interface=virbr0
+srv-host=name.tcp.test-domain-name,.,1024,10,10
+dhcp-range=192.168.122.2,192.168.122.254
+dhcp-no-override
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases
+dhcp-lease-max=253
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit default
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+local=//
+bind-dynamic
+interface=virbr0
+txt-record=example,example value
+dhcp-range=192.168.122.2,192.168.122.254
+dhcp-no-override
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases
+dhcp-lease-max=253
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit default
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+local=//
+bind-dynamic
+interface=virbr0
+dhcp-range=192.168.122.2,192.168.122.254
+dhcp-no-override
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases
+dhcp-lease-max=253
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
+dhcp-range=2001:db8:ac10:fe01::1,ra-only
+dhcp-range=2001:db8:ac10:fd01::1,ra-only
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit netboot
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+domain=example.com
+expand-hosts
+local=/example.com/
+bind-interfaces
+except-interface=lo
+listen-address=192.168.122.1
+dhcp-range=192.168.122.2,192.168.122.254
+dhcp-no-override
+enable-tftp
+tftp-root=/var/lib/tftproot
+dhcp-boot=pxeboot.img
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases
+dhcp-lease-max=253
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/netboot.addnhosts
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit netboot
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+domain=example.com
+expand-hosts
+local=/example.com/
+bind-interfaces
+except-interface=lo
+listen-address=192.168.122.1
+dhcp-range=192.168.122.2,192.168.122.254
+dhcp-no-override
+dhcp-boot=pxeboot.img,,10.20.30.40
+dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases
+dhcp-lease-max=253
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/netboot.addnhosts
--- /dev/null
+##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
+## virsh net-edit local
+## of other applications using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+domain-needed
+local=//
+bind-dynamic
+interface=virbr1
+addn-hosts=/var/lib/libvirt/dnsmasq/local.addnhosts
#include "memory.h"
#include "network/bridge_driver.h"
-/* Replace all occurrences of @token in @buf by @replacement and adjust size of
- * @buf accordingly. Returns 0 on success and -1 on out-of-memory errors. */
-static int replaceTokens(char **buf, const char *token, const char *replacement) {
- size_t token_start, token_end;
- size_t buf_len, rest_len;
- const size_t token_len = strlen(token);
- const size_t replacement_len = strlen(replacement);
- const int diff = replacement_len - token_len;
-
- buf_len = rest_len = strlen(*buf) + 1;
- token_end = 0;
- for (;;) {
- char *match = strstr(*buf + token_end, token);
- if (match == NULL)
- break;
- token_start = match - *buf;
- rest_len -= token_start + token_len - token_end;
- token_end = token_start + token_len;
- buf_len += diff;
- if (diff > 0)
- if (VIR_REALLOC_N(*buf, buf_len) < 0)
- return -1;
- if (diff != 0)
- memmove(*buf + token_end + diff, *buf + token_end, rest_len);
- memcpy(*buf + token_start, replacement, replacement_len);
- token_end += diff;
- }
- /* if diff < 0, we could shrink the buffer here... */
- return 0;
-}
-
static int
-testCompareXMLToArgvFiles(const char *inxml, const char *outargv, dnsmasqCapsPtr caps)
+testCompareXMLToConfFiles(const char *inxml, const char *outconf, dnsmasqCapsPtr caps)
{
char *inXmlData = NULL;
- char *outArgvData = NULL;
+ char *outConfData = NULL;
char *actual = NULL;
int ret = -1;
virNetworkDefPtr dev = NULL;
if (virtTestLoadFile(inxml, &inXmlData) < 0)
goto fail;
- if (virtTestLoadFile(outargv, &outArgvData) < 0)
- goto fail;
-
- if (replaceTokens(&outArgvData, "@DNSMASQ@", DNSMASQ))
+ if (virtTestLoadFile(outconf, &outConfData) < 0)
goto fail;
if (!(dev = virNetworkDefParseString(inXmlData)))
if (dctx == NULL)
goto fail;
- if (networkBuildDhcpDaemonCommandLine(obj, &cmd, pidfile, dctx, caps) < 0)
- goto fail;
-
- if (!(actual = virCommandToString(cmd)))
+ if (networkDnsmasqConfContents(obj, pidfile, &actual,
+ dctx, caps) < 0)
goto fail;
- if (STRNEQ(outArgvData, actual)) {
- virtTestDifference(stderr, outArgvData, actual);
+ if (STRNEQ(outConfData, actual)) {
+ virtTestDifference(stderr, outConfData, actual);
goto fail;
}
fail:
VIR_FREE(inXmlData);
- VIR_FREE(outArgvData);
+ VIR_FREE(outConfData);
VIR_FREE(actual);
VIR_FREE(pidfile);
virCommandFree(cmd);
} testInfo;
static int
-testCompareXMLToArgvHelper(const void *data)
+testCompareXMLToConfHelper(const void *data)
{
int result = -1;
const testInfo *info = data;
char *inxml = NULL;
char *outxml = NULL;
- if (virAsprintf(&inxml, "%s/networkxml2argvdata/%s.xml",
+ if (virAsprintf(&inxml, "%s/networkxml2confdata/%s.xml",
abs_srcdir, info->name) < 0 ||
- virAsprintf(&outxml, "%s/networkxml2argvdata/%s.argv",
+ virAsprintf(&outxml, "%s/networkxml2confdata/%s.conf",
abs_srcdir, info->name) < 0) {
goto cleanup;
}
- result = testCompareXMLToArgvFiles(inxml, outxml, info->caps);
+ result = testCompareXMLToConfFiles(inxml, outxml, info->caps);
cleanup:
VIR_FREE(inxml);
\
info.name = xname; \
info.caps = xcaps; \
- if (virtTestRun("Network XML-2-Argv " xname, \
- 1, testCompareXMLToArgvHelper, &info) < 0) { \
+ if (virtTestRun("Network XML-2-Conf " xname, \
+ 1, testCompareXMLToConfHelper, &info) < 0) { \
ret = -1; \
} \
} while (0)