From nobody Sat May 4 00:58:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1498179019361230.1907260409272; Thu, 22 Jun 2017 17:50:19 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A25087F40E; Fri, 23 Jun 2017 00:50:16 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5C9D97F487; Fri, 23 Jun 2017 00:50:16 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id B1B1F4E986; Fri, 23 Jun 2017 00:50:14 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v5N0kAHr023978 for ; Thu, 22 Jun 2017 20:46:10 -0400 Received: by smtp.corp.redhat.com (Postfix) id 62A206FEFF; Fri, 23 Jun 2017 00:46:10 +0000 (UTC) Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com [10.5.110.39]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 57C5A6FF02 for ; Fri, 23 Jun 2017 00:46:08 +0000 (UTC) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8D401142892 for ; Fri, 23 Jun 2017 00:46:04 +0000 (UTC) Received: by mail-wr0-f196.google.com with SMTP id x23so8667675wrb.0 for ; Thu, 22 Jun 2017 17:46:04 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:b390:8e00:de53:60ff:fe04:de4]) by smtp.gmail.com with ESMTPSA id l6sm2365874wmg.31.2017.06.22.17.46.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 22 Jun 2017 17:46:01 -0700 (PDT) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A25087F40E Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=gnome.org Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com A25087F40E Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XXz3gyF6" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 8D401142892 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=gnome.org Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=arclnx@gmail.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 8D401142892 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=2HFNF90X7KjeXEntbMWVisIbxdAMzMiQ4bIhdpN2RME=; b=XXz3gyF6NGdOYE9GT8t0nDtA5Q/dD7bW0xQN3Vyh7NrzQ5M8B3Mfp1onstz3a20YeV V79cZWcBZUKe/2empxVybiTvArQ5vdACWFEQcCyBMZaALbSQ/XhfoAc1S4rhf5W5G2Eq GONoFtRralPqrvfqjrEYor+kXAaR2RVqATCBTyGqZEuX+dEEcmSmgCffxgbHI7WXTkh0 2Tt0FHGjVm/8ItM7a/+GcdV2u6ExKduS/cRJ2nR5MqTJPShYgvx1C/C/NdFUfSAW34gP glWfxLsgcVJK0nJ0IvW5npwVG155wMM0s7jfnDbpphj/kxOKwnvk7alC3/DECSUxZwsp lUMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=2HFNF90X7KjeXEntbMWVisIbxdAMzMiQ4bIhdpN2RME=; b=AekWT6GTiJ3uoKG7y1VXuObBZ2YeY32QP6E2hKLvfFJdF1VdX7a6Gl4Ve/73/fXe9x jV4MB9khK6Up5BYTq00nXk7xStgU1o2kYwZ/1NZXPzAcTDpUk+klHc4Ircx9RaZkeLp+ 8LNAH88sHxQ99pGI1xI7yM+u9LgNYwQZ2EB/fhJfFk2NxOsoayfYoI3R2pPytfMnRRk+ I9779abh4Z+f7dpypN2xW6RtKMsSgZfkOW5eMj/KlXj3F/IVfxfFgW2Vu5UmSzeJXlEg sFxamkUeBSLkD063qHUyEyBuf5pWeqjwumXp+FsiAmmGf7QPMv/95oTcuO2lm1D66KK/ U7Fw== X-Gm-Message-State: AKS2vOxvubAO6XT4DHCpoGlA/rFnE+7tfdqUY05AV+vLtzrX9lPk1piZ wUMYijxcrM8PpW0/2QA= X-Received: by 10.223.146.166 with SMTP id 35mr3968023wrn.104.1498178762778; Thu, 22 Jun 2017 17:46:02 -0700 (PDT) From: aruiz@gnome.org To: libvir-list@redhat.com Date: Fri, 23 Jun 2017 01:44:47 +0100 Message-Id: <20170623004447.9605-1-aruiz@gnome.org> In-Reply-To: <20170620180045.25076-1-aruiz@gnome.org> References: <20170620180045.25076-1-aruiz@gnome.org> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 23 Jun 2017 00:46:05 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 23 Jun 2017 00:46:05 +0000 (UTC) for IP:'209.85.128.196' DOMAIN:'mail-wr0-f196.google.com' HELO:'mail-wr0-f196.google.com' FROM:'arclnx@gmail.com' RCPT:'' X-RedHat-Spam-Score: -0.207 (BAYES_50, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, HK_RANDOM_ENVFROM, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_PASS) 209.85.128.196 mail-wr0-f196.google.com 209.85.128.196 mail-wr0-f196.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Cc: Alberto Ruiz Subject: [libvirt] [PATCH] leasetime support for X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 23 Jun 2017 00:50:17 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Alberto Ruiz Fixes #913446 This patch addresses a few problems found by the initial reviews: * leaseTimeUnit RNG type renamed to timeUnit * virNetworkDHCPDefGetLeaseTime() renamed to virNetworkDHCPLeaseTimeParseXM= L() * consistent use of braces in if-else-if * use %lu instead of PRId64 * use 0 as infinite lease * add a leasetime_defined field to struct _virNetworkIPDef to describe whet= her the value was set in the xml configuration or not * use uint32_t for the leasetime instead of int64_t * fail on all invalid leasetime values * squash all patches into one --- docs/schemas/basictypes.rng | 16 +++ docs/schemas/network.rng | 8 ++ src/conf/network_conf.c | 93 +++++++++++++++- src/conf/network_conf.h | 5 +- src/libvirt_private.syms | 1 + src/network/bridge_driver.c | 119 ++++++++++++++++-= ---- src/network/bridge_driver.h | 1 + src/util/virdnsmasq.c | 106 +++++++++++------- src/util/virdnsmasq.h | 2 + .../dhcp6-nat-network.hostsfile | 7 ++ tests/networkxml2confdata/dhcp6-network.hostsfile | 5 + .../dhcp6host-routed-network.hostsfile | 7 ++ tests/networkxml2confdata/leasetime-days.conf | 18 ++++ tests/networkxml2confdata/leasetime-days.xml | 18 ++++ tests/networkxml2confdata/leasetime-hours.conf | 18 ++++ tests/networkxml2confdata/leasetime-hours.xml | 18 ++++ tests/networkxml2confdata/leasetime-infinite.conf | 18 ++++ tests/networkxml2confdata/leasetime-infinite.xml | 18 ++++ tests/networkxml2confdata/leasetime-minutes.conf | 18 ++++ tests/networkxml2confdata/leasetime-minutes.xml | 18 ++++ tests/networkxml2confdata/leasetime-seconds.conf | 18 ++++ tests/networkxml2confdata/leasetime-seconds.xml | 18 ++++ tests/networkxml2confdata/leasetime.conf | 18 ++++ tests/networkxml2confdata/leasetime.xml | 18 ++++ .../nat-network-dns-srv-record-minimal.hostsfile | 2 + .../nat-network-dns-srv-record.hostsfile | 2 + .../nat-network-dns-txt-record.hostsfile | 2 + .../nat-network-name-with-quotes.hostsfile | 2 + tests/networkxml2confdata/nat-network.hostsfile | 2 + .../networkxml2confdata/ptr-domains-auto.hostsfile | 2 + tests/networkxml2conftest.c | 45 ++++++-- 31 files changed, 571 insertions(+), 72 deletions(-) create mode 100644 tests/networkxml2confdata/dhcp6-nat-network.hostsfile create mode 100644 tests/networkxml2confdata/dhcp6-network.hostsfile create mode 100644 tests/networkxml2confdata/dhcp6host-routed-network.host= sfile create mode 100644 tests/networkxml2confdata/leasetime-days.conf create mode 100644 tests/networkxml2confdata/leasetime-days.xml create mode 100644 tests/networkxml2confdata/leasetime-hours.conf create mode 100644 tests/networkxml2confdata/leasetime-hours.xml create mode 100644 tests/networkxml2confdata/leasetime-infinite.conf create mode 100644 tests/networkxml2confdata/leasetime-infinite.xml create mode 100644 tests/networkxml2confdata/leasetime-minutes.conf create mode 100644 tests/networkxml2confdata/leasetime-minutes.xml create mode 100644 tests/networkxml2confdata/leasetime-seconds.conf create mode 100644 tests/networkxml2confdata/leasetime-seconds.xml create mode 100644 tests/networkxml2confdata/leasetime.conf create mode 100644 tests/networkxml2confdata/leasetime.xml create mode 100644 tests/networkxml2confdata/nat-network-dns-srv-record-mi= nimal.hostsfile create mode 100644 tests/networkxml2confdata/nat-network-dns-srv-record.ho= stsfile create mode 100644 tests/networkxml2confdata/nat-network-dns-txt-record.ho= stsfile create mode 100644 tests/networkxml2confdata/nat-network-name-with-quotes.= hostsfile create mode 100644 tests/networkxml2confdata/nat-network.hostsfile create mode 100644 tests/networkxml2confdata/ptr-domains-auto.hostsfile diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng index 1ea667cdf..9db19c7f0 100644 --- a/docs/schemas/basictypes.rng +++ b/docs/schemas/basictypes.rng @@ -564,4 +564,20 @@ =20 + + + seconds + minutes + hours + days + + + + + + -1 + 4294967295 + + + diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng index 1048dabf3..a0d878e4a 100644 --- a/docs/schemas/network.rng +++ b/docs/schemas/network.rng @@ -357,6 +357,14 @@ + + + + + + + + diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 3ebf67ff5..8431ee806 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include =20 #include "virerror.h" #include "datatypes.h" @@ -514,8 +516,92 @@ virNetworkDHCPHostDefParseXML(const char *networkName, =20 =20 static int +virNetworkDHCPLeaseTimeParseXML (xmlNodePtr node, + xmlXPathContextPtr ctxt, + uint32_t *lease, + bool *defined) +{ + int ret =3D 0; + uint32_t multiplier; + char *leaseString, *leaseUnit; + xmlNodePtr save; + + *defined =3D 0; + + save =3D ctxt->node; + ctxt->node =3D node; + + leaseString =3D virXPathString ("string(./leasetime/text())", ctxt); + leaseUnit =3D virXPathString ("string(./leasetime/@unit)", ctxt); + + /* If value is not present we set the value to -2 */ + if (leaseString =3D=3D NULL) { + goto cleanup; + } + if (leaseString[0] =3D=3D '-') { + virReportError(VIR_ERR_XML_ERROR, + _(" value (%s) cannot be negative"), + leaseString); + } + + *defined =3D 1; + + if (leaseUnit =3D=3D NULL || strcmp (leaseUnit, "seconds") =3D=3D 0) { + multiplier =3D 1; + } + else if (strcmp (leaseUnit, "minutes") =3D=3D 0) { + multiplier =3D 60; + } + else if (strcmp (leaseUnit, "hours") =3D=3D 0) { + multiplier =3D 60 * 60; + } + else if (strcmp (leaseUnit, "days") =3D=3D 0) { + multiplier =3D 60 * 60 * 24; + } + else { + virReportError(VIR_ERR_XML_ERROR, + _("invalid value for unit parameter in = element" + "found in network, only 'seconds', 'minute= s', " + "'hours' or 'days' are valid: %s"), + leaseUnit); + ret =3D -1; + goto cleanup; + } + + errno =3D 0; + *lease =3D (uint32_t) strtoul((const char*)leaseString, NULL, 10); + + /* Report any errors parsing the string */ + if (errno !=3D 0) { + virReportError(VIR_ERR_XML_ERROR, + _(" value could not be converted to a si= gned integer: %s"), + leaseString); + ret =3D -1; + goto cleanup; + } + + if (*lease > (UINT32_MAX / multiplier)) { + virReportError (VIR_ERR_XML_ERROR, + _(" value %lu %s exceeds the maximum of %= lu seconds"), + (unsigned long)*lease, leaseUnit, (unsigned long)UIN= T32_MAX); + ret =3D -1; + goto cleanup; + } + + *lease =3D *lease * multiplier; + +cleanup: + VIR_FREE(leaseString); + VIR_FREE(leaseUnit); + ctxt->node =3D save; + return ret; +} + + +static int virNetworkDHCPDefParseXML(const char *networkName, xmlNodePtr node, + xmlXPathContextPtr ctxt, virNetworkIPDefPtr def) { int ret =3D -1; @@ -526,6 +612,11 @@ virNetworkDHCPDefParseXML(const char *networkName, memset(&range, 0, sizeof(range)); memset(&host, 0, sizeof(host)); =20 + if (virNetworkDHCPLeaseTimeParseXML (node, ctxt, + &def->leasetime, + &def->leasetime_defined)) + goto cleanup; + cur =3D node->children; while (cur !=3D NULL) { if (cur->type =3D=3D XML_ELEMENT_NODE && @@ -1104,7 +1195,7 @@ virNetworkIPDefParseXML(const char *networkName, } =20 if ((dhcp =3D virXPathNode("./dhcp[1]", ctxt)) && - virNetworkDHCPDefParseXML(networkName, dhcp, def) < 0) + virNetworkDHCPDefParseXML(networkName, dhcp, ctxt, def) < 0) goto cleanup; =20 if (virXPathNode("./tftp[1]", ctxt)) { diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index e9a5baf5b..466220e81 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -175,7 +175,10 @@ struct _virNetworkIPDef { char *tftproot; char *bootfile; virSocketAddr bootserver; - }; + + uint32_t leasetime; + bool leasetime_defined; +}; =20 typedef struct _virNetworkForwardIfDef virNetworkForwardIfDef; typedef virNetworkForwardIfDef *virNetworkForwardIfDefPtr; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index c1e9471c5..5ef33dcfe 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1561,6 +1561,7 @@ dnsmasqCapsRefresh; dnsmasqContextFree; dnsmasqContextNew; dnsmasqDelete; +dnsmasqDhcpHostsToString; dnsmasqReload; dnsmasqSave; =20 diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 3ba70180b..cdb0230ab 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -41,6 +41,8 @@ #include #include #include +#include +#include #if HAVE_SYS_SYSCTL_H # include #endif @@ -948,6 +950,62 @@ networkKillDaemon(pid_t pid, const char *daemonName, c= onst char *networkName) return ret; } =20 +static int +networkBuildDnsmasqHostsList(dnsmasqContext *dctx, + virNetworkDNSDefPtr dnsdef) +{ + size_t i, j; + + if (dnsdef) { + for (i =3D 0; i < dnsdef->nhosts; i++) { + virNetworkDNSHostDefPtr host =3D &(dnsdef->hosts[i]); + if (VIR_SOCKET_ADDR_VALID(&host->ip)) { + for (j =3D 0; j < host->nnames; j++) + if (dnsmasqAddHost(dctx, &host->ip, host->names[j]) < = 0) + return -1; + } + } + } + + return 0; +} + +/* translates the leasetime value into a dnsmasq configuration string + * for dhcp-range/host */ +static char * +networkDnsmasqConfLeaseValueToString (int64_t leasetime, bool defined) +{ + char *result =3D NULL; + virBuffer leasebuf =3D VIR_BUFFER_INITIALIZER; + + /* Leasetime parameter set on the XML */ + + /* defined =3D FALSE means we fallback to dnsmasq defaults*/ + if (defined =3D=3D 0) { + virBufferAsprintf(&leasebuf, "%s", ""); + } + /* 0 means no expiration */ + else if (leasetime =3D=3D 0) { + virBufferAsprintf(&leasebuf, ",infinite"); + } + /* DHCP value for lease time is a unsigned four octect integer */ + else if (leasetime <=3D UINT32_MAX) { + virBufferAsprintf(&leasebuf, ",%lu", (unsigned long)leasetime); + } + else { + if (leasetime < 120) + virReportError (VIR_ERR_CONFIG_UNSUPPORTED, + _("lease time must be greater than 120 seconds")= ); + goto cleanup; + } + + result =3D virBufferContentAndReset(&leasebuf); + +cleanup: + virBufferFreeAndReset (&leasebuf); + return result; +} + /* the following does not build a file, it builds a list * which is later saved into a file */ @@ -956,8 +1014,14 @@ static int networkBuildDnsmasqDhcpHostsList(dnsmasqContext *dctx, virNetworkIPDefPtr ipdef) { + int ret =3D -1; size_t i; bool ipv6 =3D false; + char *leasetime =3D networkDnsmasqConfLeaseValueToString(ipdef->leaset= ime, + ipdef->leasetim= e_defined); + + if (!leasetime) + goto cleanup; =20 if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET6)) ipv6 =3D true; @@ -965,31 +1029,14 @@ networkBuildDnsmasqDhcpHostsList(dnsmasqContext *dct= x, virNetworkDHCPHostDefPtr host =3D &(ipdef->hosts[i]); if (VIR_SOCKET_ADDR_VALID(&host->ip)) if (dnsmasqAddDhcpHost(dctx, host->mac, &host->ip, - host->name, host->id, ipv6) < 0) - return -1; - } - - return 0; -} - -static int -networkBuildDnsmasqHostsList(dnsmasqContext *dctx, - virNetworkDNSDefPtr dnsdef) -{ - size_t i, j; - - if (dnsdef) { - for (i =3D 0; i < dnsdef->nhosts; i++) { - virNetworkDNSHostDefPtr host =3D &(dnsdef->hosts[i]); - if (VIR_SOCKET_ADDR_VALID(&host->ip)) { - for (j =3D 0; j < host->nnames; j++) - if (dnsmasqAddHost(dctx, &host->ip, host->names[j]) < = 0) - return -1; - } - } + host->name, host->id, leasetime, ipv6) = < 0) + goto cleanup; } =20 - return 0; + ret =3D 0; +cleanup: + VIR_FREE(leasetime); + return ret; } =20 =20 @@ -1034,6 +1081,7 @@ int networkDnsmasqConfContents(virNetworkObjPtr network, const char *pidfile, char **configstr, + char **hostsfilestr, dnsmasqContext *dctx, dnsmasqCapsPtr caps ATTRIBUTE_UNUSED) { @@ -1362,6 +1410,7 @@ networkDnsmasqConfContents(virNetworkObjPtr network, } for (r =3D 0; r < ipdef->nranges; r++) { int thisRange; + char *leasestr; =20 if (!(saddr =3D virSocketAddrFormat(&ipdef->ranges[r].start)) = || !(eaddr =3D virSocketAddrFormat(&ipdef->ranges[r].end))) @@ -1369,12 +1418,23 @@ networkDnsmasqConfContents(virNetworkObjPtr network, =20 virBufferAsprintf(&configbuf, "dhcp-range=3D%s,%s", saddr, eaddr); - if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET6)) + + /* Add ipv6 prefix length parameter if needed */ + if (ipdef =3D=3D ipv6def) virBufferAsprintf(&configbuf, ",%d", prefix); + + leasestr =3D networkDnsmasqConfLeaseValueToString (ipdef->leas= etime, + ipdef->leaset= ime_defined); + if (!leasestr) + goto cleanup; + virBufferAsprintf(&configbuf, "%s", leasestr); + + /* Add the newline */ virBufferAddLit(&configbuf, "\n"); =20 VIR_FREE(saddr); VIR_FREE(eaddr); + VIR_FREE(leasestr); thisRange =3D virSocketAddrGetRange(&ipdef->ranges[r].start, &ipdef->ranges[r].end, &ipdef->address, @@ -1405,6 +1465,15 @@ networkDnsmasqConfContents(virNetworkObjPtr network, if (networkBuildDnsmasqDhcpHostsList(dctx, ipdef) < 0) goto cleanup; =20 + /* Return the contents of the hostsfile if requested */ + if (hostsfilestr) { + *hostsfilestr =3D dnsmasqDhcpHostsToString (dctx->hostsfile->h= osts, + dctx->hostsfile->nho= sts); + + if (!hostsfilestr) + goto cleanup; + } + /* Note: the following is IPv4 only */ if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET)) { if (ipdef->nranges || ipdef->nhosts) { @@ -1506,7 +1575,7 @@ networkBuildDhcpDaemonCommandLine(virNetworkDriverSta= tePtr driver, =20 network->dnsmasqPid =3D -1; =20 - if (networkDnsmasqConfContents(network, pidfile, &configstr, + if (networkDnsmasqConfContents(network, pidfile, &configstr, NULL, dctx, dnsmasq_caps) < 0) goto cleanup; if (!configstr) diff --git a/src/network/bridge_driver.h b/src/network/bridge_driver.h index 7832b6031..56329eb59 100644 --- a/src/network/bridge_driver.h +++ b/src/network/bridge_driver.h @@ -53,6 +53,7 @@ int networkGetActualType(virDomainNetDefPtr iface) int networkDnsmasqConfContents(virNetworkObjPtr network, const char *pidfile, char **configstr, + char **hostsfilestr, dnsmasqContext *dctx, dnsmasqCapsPtr caps); =20 diff --git a/src/util/virdnsmasq.c b/src/util/virdnsmasq.c index 1b78c1fad..94c9a3bb1 100644 --- a/src/util/virdnsmasq.c +++ b/src/util/virdnsmasq.c @@ -308,52 +308,47 @@ hostsfileAdd(dnsmasqHostsfile *hostsfile, virSocketAddr *ip, const char *name, const char *id, + const char *leasetime, bool ipv6) { + int ret =3D -1; char *ipstr =3D NULL; + virBuffer hostbuf =3D VIR_BUFFER_INITIALIZER; + if (VIR_REALLOC_N(hostsfile->hosts, hostsfile->nhosts + 1) < 0) goto error; =20 if (!(ipstr =3D virSocketAddrFormat(ip))) - return -1; + goto error; =20 /* the first test determines if it is a dhcpv6 host */ if (ipv6) { - if (name && id) { - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, - "id:%s,%s,[%s]", id, name, ipstr) < 0) - goto error; - } else if (name && !id) { - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, - "%s,[%s]", name, ipstr) < 0) - goto error; - } else if (!name && id) { - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, - "id:%s,[%s]", id, ipstr) < 0) - goto error; - } + if (name && id) + virBufferAsprintf(&hostbuf, "id:%s,%s,[%s]", id, name, ipstr); + else if (name && !id) + virBufferAsprintf(&hostbuf, "%s,[%s]", name, ipstr); + else if (!name && id) + virBufferAsprintf(&hostbuf, "id:%s,[%s]", id, ipstr); } else if (name && mac) { - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, "%s,%s,= %s", - mac, ipstr, name) < 0) - goto error; + virBufferAsprintf(&hostbuf, "%s,%s,%s", mac, ipstr, name); } else if (name && !mac) { - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, "%s,%s", - name, ipstr) < 0) - goto error; + virBufferAsprintf(&hostbuf, "%s,%s", name, ipstr); } else { - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, "%s,%s", - mac, ipstr) < 0) - goto error; + virBufferAsprintf(&hostbuf, "%s,%s", mac, ipstr); } - VIR_FREE(ipstr); =20 - hostsfile->nhosts++; + /* The leasetime string already includes comma if there's any value at= all */ + virBufferAsprintf(&hostbuf, "%s", leasetime); =20 - return 0; + if (!(hostsfile->hosts[hostsfile->nhosts].host =3D virBufferContentAnd= Reset (&hostbuf))) + goto error; =20 + hostsfile->nhosts++; + ret =3D 0; error: + virBufferFreeAndReset(&hostbuf); VIR_FREE(ipstr); - return -1; + return ret; } =20 static dnsmasqHostsfile * @@ -391,10 +386,9 @@ hostsfileWrite(const char *path, dnsmasqDhcpHost *hosts, unsigned int nhosts) { - char *tmp; + char *tmp, *content =3D NULL; FILE *f; bool istmp =3D true; - size_t i; int rc =3D 0; =20 /* even if there are 0 hosts, create a 0 length file, to allow @@ -412,17 +406,21 @@ hostsfileWrite(const char *path, } } =20 - for (i =3D 0; i < nhosts; i++) { - if (fputs(hosts[i].host, f) =3D=3D EOF || fputc('\n', f) =3D=3D EO= F) { - rc =3D -errno; - VIR_FORCE_FCLOSE(f); + if (!(content =3D dnsmasqDhcpHostsToString(hosts, nhosts))) { + rc =3D -ENOMEM; + goto cleanup; + } =20 - if (istmp) - unlink(tmp); + if (fputs(content, f) =3D=3D EOF) { + rc =3D -errno; + VIR_FORCE_FCLOSE(f); + + if (istmp) + unlink(tmp); + + goto cleanup; + } =20 - goto cleanup; - } - } =20 if (VIR_FCLOSE(f) =3D=3D EOF) { rc =3D -errno; @@ -436,6 +434,7 @@ hostsfileWrite(const char *path, } =20 cleanup: + VIR_FREE(content); VIR_FREE(tmp); =20 return rc; @@ -524,9 +523,10 @@ dnsmasqAddDhcpHost(dnsmasqContext *ctx, virSocketAddr *ip, const char *name, const char *id, + const char *leasetime, bool ipv6) { - return hostsfileAdd(ctx->hostsfile, mac, ip, name, id, ipv6); + return hostsfileAdd(ctx->hostsfile, mac, ip, name, id, leasetime, ipv6= ); } =20 /* @@ -892,3 +892,31 @@ dnsmasqCapsGet(dnsmasqCapsPtr caps, dnsmasqCapsFlags f= lag) =20 return caps && virBitmapIsBitSet(caps->flags, flag); } + +/** dnsmasqDhcpHostsToString: + * + * Turns a vector of dnsmasqDhcpHost into the string that is ought to be + * stored in the hostsfile, this functionality is split to make hostsfil= es + * testable. Returs NULL if nhosts is 0. + */ +char * +dnsmasqDhcpHostsToString (dnsmasqDhcpHost *hosts, + unsigned int nhosts) +{ + int i; + char *result =3D NULL; + virBuffer hostsfilebuf =3D VIR_BUFFER_INITIALIZER; + + if (nhosts =3D=3D 0) + goto cleanup; + + for (i =3D 0; i < nhosts; i++) { + virBufferAsprintf(&hostsfilebuf, "%s\n", hosts[i].host); + } + + result =3D virBufferContentAndReset(&hostsfilebuf); + +cleanup: + virBufferFreeAndReset(&hostsfilebuf); + return result; +} diff --git a/src/util/virdnsmasq.h b/src/util/virdnsmasq.h index f47bea3ab..1795bc83b 100644 --- a/src/util/virdnsmasq.h +++ b/src/util/virdnsmasq.h @@ -88,6 +88,7 @@ int dnsmasqAddDhcpHost(dnsmasqContext *ctx, virSocketAddr *ip, const char *name, const char *id, + const char *leastime, bool ipv6); int dnsmasqAddHost(dnsmasqContext *ctx, virSocketAddr *ip, @@ -105,6 +106,7 @@ int dnsmasqCapsRefresh(dnsmasqCapsPtr *caps, const char= *binaryPath); bool dnsmasqCapsGet(dnsmasqCapsPtr caps, dnsmasqCapsFlags flag); const char *dnsmasqCapsGetBinaryPath(dnsmasqCapsPtr caps); unsigned long dnsmasqCapsGetVersion(dnsmasqCapsPtr caps); +char *dnsmasqDhcpHostsToString(dnsmasqDhcpHost *hosts, unsigned int nhosts= ); =20 # define DNSMASQ_DHCPv6_MAJOR_REQD 2 # define DNSMASQ_DHCPv6_MINOR_REQD 64 diff --git a/tests/networkxml2confdata/dhcp6-nat-network.hostsfile b/tests/= networkxml2confdata/dhcp6-nat-network.hostsfile new file mode 100644 index 000000000..de659b98c --- /dev/null +++ b/tests/networkxml2confdata/dhcp6-nat-network.hostsfile @@ -0,0 +1,7 @@ +00:16:3e:77:e2:ed,192.168.122.10,a.example.com +00:16:3e:3e:a9:1a,192.168.122.11,b.example.com +id:0:4:7e:7d:f0:7d:a8:bc:c5:d2:13:32:11:ed:16:ea:84:63,[2001:db8:ac10:fd01= ::1:20] +paul,[2001:db8:ac10:fd01::1:21] +id:0:3:0:1:0:16:3e:11:22:33,peter.xyz,[2001:db8:ac10:fd01::1:22] +id:0:3:0:1:0:16:3e:44:55:33,[2001:db8:ac10:fd01::1:23] +id:0:1:0:1:18:aa:62:fe:0:16:3e:44:55:66,badbob,[2001:db8:ac10:fd01::1:24] diff --git a/tests/networkxml2confdata/dhcp6-network.hostsfile b/tests/netw= orkxml2confdata/dhcp6-network.hostsfile new file mode 100644 index 000000000..9dfb172ce --- /dev/null +++ b/tests/networkxml2confdata/dhcp6-network.hostsfile @@ -0,0 +1,5 @@ +id:0:4:7e:7d:f0:7d:a8:bc:c5:d2:13:32:11:ed:16:ea:84:63,[2001:db8:ac10:fd01= ::1:20] +paul,[2001:db8:ac10:fd01::1:21] +id:0:3:0:1:0:16:3e:11:22:33,peter.xyz,[2001:db8:ac10:fd01::1:22] +id:0:3:0:1:0:16:3e:44:55:33,[2001:db8:ac10:fd01::1:23] +id:0:1:0:1:18:aa:62:fe:0:16:3e:44:55:66,badbob,[2001:db8:ac10:fd01::1:24] diff --git a/tests/networkxml2confdata/dhcp6host-routed-network.hostsfile b= /tests/networkxml2confdata/dhcp6host-routed-network.hostsfile new file mode 100644 index 000000000..de659b98c --- /dev/null +++ b/tests/networkxml2confdata/dhcp6host-routed-network.hostsfile @@ -0,0 +1,7 @@ +00:16:3e:77:e2:ed,192.168.122.10,a.example.com +00:16:3e:3e:a9:1a,192.168.122.11,b.example.com +id:0:4:7e:7d:f0:7d:a8:bc:c5:d2:13:32:11:ed:16:ea:84:63,[2001:db8:ac10:fd01= ::1:20] +paul,[2001:db8:ac10:fd01::1:21] +id:0:3:0:1:0:16:3e:11:22:33,peter.xyz,[2001:db8:ac10:fd01::1:22] +id:0:3:0:1:0:16:3e:44:55:33,[2001:db8:ac10:fd01::1:23] +id:0:1:0:1:18:aa:62:fe:0:16:3e:44:55:66,badbob,[2001:db8:ac10:fd01::1:24] diff --git a/tests/networkxml2confdata/leasetime-days.conf b/tests/networkx= ml2confdata/leasetime-days.conf new file mode 100644 index 000000000..d227be67a --- /dev/null +++ b/tests/networkxml2confdata/leasetime-days.conf @@ -0,0 +1,18 @@ +##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE +##OVERWRITTEN AND LOST. Changes to this configuration should be made usin= g: +## virsh net-edit default +## or other application using the libvirt API. +## +## dnsmasq conf file created by libvirt +strict-order +except-interface=3Dlo +bind-dynamic +interface=3Dvirbr0 +dhcp-range=3D192.168.122.2,192.168.122.254,86400 +dhcp-no-override +dhcp-authoritative +dhcp-range=3D2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff,64,86400 +dhcp-lease-max=3D493 +dhcp-hostsfile=3D/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=3D/var/lib/libvirt/dnsmasq/default.addnhosts +enable-ra diff --git a/tests/networkxml2confdata/leasetime-days.xml b/tests/networkxm= l2confdata/leasetime-days.xml new file mode 100644 index 000000000..b990b4d68 --- /dev/null +++ b/tests/networkxml2confdata/leasetime-days.xml @@ -0,0 +1,18 @@ + + default + 81ff0d90-c91e-6742-64da-4a736edb9a9b + + + + + 1 + + + + + + 1 + + + + diff --git a/tests/networkxml2confdata/leasetime-hours.conf b/tests/network= xml2confdata/leasetime-hours.conf new file mode 100644 index 000000000..e5e8c19cd --- /dev/null +++ b/tests/networkxml2confdata/leasetime-hours.conf @@ -0,0 +1,18 @@ +##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE +##OVERWRITTEN AND LOST. Changes to this configuration should be made usin= g: +## virsh net-edit default +## or other application using the libvirt API. +## +## dnsmasq conf file created by libvirt +strict-order +except-interface=3Dlo +bind-dynamic +interface=3Dvirbr0 +dhcp-range=3D192.168.122.2,192.168.122.254,3600 +dhcp-no-override +dhcp-authoritative +dhcp-range=3D2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff,64,3600 +dhcp-lease-max=3D493 +dhcp-hostsfile=3D/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=3D/var/lib/libvirt/dnsmasq/default.addnhosts +enable-ra diff --git a/tests/networkxml2confdata/leasetime-hours.xml b/tests/networkx= ml2confdata/leasetime-hours.xml new file mode 100644 index 000000000..3b9609601 --- /dev/null +++ b/tests/networkxml2confdata/leasetime-hours.xml @@ -0,0 +1,18 @@ + + default + 81ff0d90-c91e-6742-64da-4a736edb9a9b + + + + + 1 + + + + + + 1 + + + + diff --git a/tests/networkxml2confdata/leasetime-infinite.conf b/tests/netw= orkxml2confdata/leasetime-infinite.conf new file mode 100644 index 000000000..52f4798e5 --- /dev/null +++ b/tests/networkxml2confdata/leasetime-infinite.conf @@ -0,0 +1,18 @@ +##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE +##OVERWRITTEN AND LOST. Changes to this configuration should be made usin= g: +## virsh net-edit default +## or other application using the libvirt API. +## +## dnsmasq conf file created by libvirt +strict-order +except-interface=3Dlo +bind-dynamic +interface=3Dvirbr0 +dhcp-range=3D192.168.122.2,192.168.122.254,infinite +dhcp-no-override +dhcp-authoritative +dhcp-range=3D2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff,64,infinite +dhcp-lease-max=3D493 +dhcp-hostsfile=3D/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=3D/var/lib/libvirt/dnsmasq/default.addnhosts +enable-ra diff --git a/tests/networkxml2confdata/leasetime-infinite.xml b/tests/netwo= rkxml2confdata/leasetime-infinite.xml new file mode 100644 index 000000000..d855978a1 --- /dev/null +++ b/tests/networkxml2confdata/leasetime-infinite.xml @@ -0,0 +1,18 @@ + + default + 81ff0d90-c91e-6742-64da-4a736edb9a9b + + + + + 0 + + + + + + 0 + + + + diff --git a/tests/networkxml2confdata/leasetime-minutes.conf b/tests/netwo= rkxml2confdata/leasetime-minutes.conf new file mode 100644 index 000000000..37da5702f --- /dev/null +++ b/tests/networkxml2confdata/leasetime-minutes.conf @@ -0,0 +1,18 @@ +##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE +##OVERWRITTEN AND LOST. Changes to this configuration should be made usin= g: +## virsh net-edit default +## or other application using the libvirt API. +## +## dnsmasq conf file created by libvirt +strict-order +except-interface=3Dlo +bind-dynamic +interface=3Dvirbr0 +dhcp-range=3D192.168.122.2,192.168.122.254,300 +dhcp-no-override +dhcp-authoritative +dhcp-range=3D2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff,64,300 +dhcp-lease-max=3D493 +dhcp-hostsfile=3D/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=3D/var/lib/libvirt/dnsmasq/default.addnhosts +enable-ra diff --git a/tests/networkxml2confdata/leasetime-minutes.xml b/tests/networ= kxml2confdata/leasetime-minutes.xml new file mode 100644 index 000000000..e7a27afe6 --- /dev/null +++ b/tests/networkxml2confdata/leasetime-minutes.xml @@ -0,0 +1,18 @@ + + default + 81ff0d90-c91e-6742-64da-4a736edb9a9b + + + + + 5 + + + + + + 5 + + + + diff --git a/tests/networkxml2confdata/leasetime-seconds.conf b/tests/netwo= rkxml2confdata/leasetime-seconds.conf new file mode 100644 index 000000000..ea0845e21 --- /dev/null +++ b/tests/networkxml2confdata/leasetime-seconds.conf @@ -0,0 +1,18 @@ +##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE +##OVERWRITTEN AND LOST. Changes to this configuration should be made usin= g: +## virsh net-edit default +## or other application using the libvirt API. +## +## dnsmasq conf file created by libvirt +strict-order +except-interface=3Dlo +bind-dynamic +interface=3Dvirbr0 +dhcp-range=3D192.168.122.2,192.168.122.254,125 +dhcp-no-override +dhcp-authoritative +dhcp-range=3D2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff,64,125 +dhcp-lease-max=3D493 +dhcp-hostsfile=3D/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=3D/var/lib/libvirt/dnsmasq/default.addnhosts +enable-ra diff --git a/tests/networkxml2confdata/leasetime-seconds.xml b/tests/networ= kxml2confdata/leasetime-seconds.xml new file mode 100644 index 000000000..56b07f8ae --- /dev/null +++ b/tests/networkxml2confdata/leasetime-seconds.xml @@ -0,0 +1,18 @@ + + default + 81ff0d90-c91e-6742-64da-4a736edb9a9b + + + + + 125 + + + + + + 125 + + + + diff --git a/tests/networkxml2confdata/leasetime.conf b/tests/networkxml2co= nfdata/leasetime.conf new file mode 100644 index 000000000..b754c3ffb --- /dev/null +++ b/tests/networkxml2confdata/leasetime.conf @@ -0,0 +1,18 @@ +##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE +##OVERWRITTEN AND LOST. Changes to this configuration should be made usin= g: +## virsh net-edit default +## or other application using the libvirt API. +## +## dnsmasq conf file created by libvirt +strict-order +except-interface=3Dlo +bind-dynamic +interface=3Dvirbr0 +dhcp-range=3D192.168.122.2,192.168.122.254,122 +dhcp-no-override +dhcp-authoritative +dhcp-range=3D2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff,64,121 +dhcp-lease-max=3D493 +dhcp-hostsfile=3D/var/lib/libvirt/dnsmasq/default.hostsfile +addn-hosts=3D/var/lib/libvirt/dnsmasq/default.addnhosts +enable-ra diff --git a/tests/networkxml2confdata/leasetime.xml b/tests/networkxml2con= fdata/leasetime.xml new file mode 100644 index 000000000..fdbb15fc0 --- /dev/null +++ b/tests/networkxml2confdata/leasetime.xml @@ -0,0 +1,18 @@ + + default + 81ff0d90-c91e-6742-64da-4a736edb9a9b + + + + + 122 + + + + + + 121 + + + + diff --git a/tests/networkxml2confdata/nat-network-dns-srv-record-minimal.h= ostsfile b/tests/networkxml2confdata/nat-network-dns-srv-record-minimal.hos= tsfile new file mode 100644 index 000000000..deb3f00ac --- /dev/null +++ b/tests/networkxml2confdata/nat-network-dns-srv-record-minimal.hostsfile @@ -0,0 +1,2 @@ +00:16:3e:77:e2:ed,192.168.122.10,a.example.com +00:16:3e:3e:a9:1a,192.168.122.11,b.example.com diff --git a/tests/networkxml2confdata/nat-network-dns-srv-record.hostsfile= b/tests/networkxml2confdata/nat-network-dns-srv-record.hostsfile new file mode 100644 index 000000000..deb3f00ac --- /dev/null +++ b/tests/networkxml2confdata/nat-network-dns-srv-record.hostsfile @@ -0,0 +1,2 @@ +00:16:3e:77:e2:ed,192.168.122.10,a.example.com +00:16:3e:3e:a9:1a,192.168.122.11,b.example.com diff --git a/tests/networkxml2confdata/nat-network-dns-txt-record.hostsfile= b/tests/networkxml2confdata/nat-network-dns-txt-record.hostsfile new file mode 100644 index 000000000..deb3f00ac --- /dev/null +++ b/tests/networkxml2confdata/nat-network-dns-txt-record.hostsfile @@ -0,0 +1,2 @@ +00:16:3e:77:e2:ed,192.168.122.10,a.example.com +00:16:3e:3e:a9:1a,192.168.122.11,b.example.com diff --git a/tests/networkxml2confdata/nat-network-name-with-quotes.hostsfi= le b/tests/networkxml2confdata/nat-network-name-with-quotes.hostsfile new file mode 100644 index 000000000..deb3f00ac --- /dev/null +++ b/tests/networkxml2confdata/nat-network-name-with-quotes.hostsfile @@ -0,0 +1,2 @@ +00:16:3e:77:e2:ed,192.168.122.10,a.example.com +00:16:3e:3e:a9:1a,192.168.122.11,b.example.com diff --git a/tests/networkxml2confdata/nat-network.hostsfile b/tests/networ= kxml2confdata/nat-network.hostsfile new file mode 100644 index 000000000..deb3f00ac --- /dev/null +++ b/tests/networkxml2confdata/nat-network.hostsfile @@ -0,0 +1,2 @@ +00:16:3e:77:e2:ed,192.168.122.10,a.example.com +00:16:3e:3e:a9:1a,192.168.122.11,b.example.com diff --git a/tests/networkxml2confdata/ptr-domains-auto.hostsfile b/tests/n= etworkxml2confdata/ptr-domains-auto.hostsfile new file mode 100644 index 000000000..deb3f00ac --- /dev/null +++ b/tests/networkxml2confdata/ptr-domains-auto.hostsfile @@ -0,0 +1,2 @@ +00:16:3e:77:e2:ed,192.168.122.10,a.example.com +00:16:3e:3e:a9:1a,192.168.122.11,b.example.com diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c index ab3c13aa0..15f783fb1 100644 --- a/tests/networkxml2conftest.c +++ b/tests/networkxml2conftest.c @@ -19,9 +19,13 @@ #define VIR_FROM_THIS VIR_FROM_NONE =20 static int -testCompareXMLToConfFiles(const char *inxml, const char *outconf, dnsmasqC= apsPtr caps) +testCompareXMLToConfFiles(const char *inxml, + const char *outconf, + const char *outhostsfile, + dnsmasqCapsPtr caps) { - char *actual =3D NULL; + char *actualconf =3D NULL; + char *actualhosts =3D NULL; int ret =3D -1; virNetworkDefPtr dev =3D NULL; virNetworkObjPtr obj =3D NULL; @@ -41,7 +45,11 @@ testCompareXMLToConfFiles(const char *inxml, const char = *outconf, dnsmasqCapsPtr if (dctx =3D=3D NULL) goto fail; =20 - if (networkDnsmasqConfContents(obj, pidfile, &actual, dctx, caps) < 0) + if (networkDnsmasqConfContents(obj, pidfile, &actualconf, &actualhosts, + dctx, caps) < 0) + goto fail; + + if (virTestCompareToFile(actualconf, outconf) < 0) goto fail; =20 /* Any changes to this function ^^ should be reflected here too. */ @@ -57,13 +65,27 @@ testCompareXMLToConfFiles(const char *inxml, const char= *outconf, dnsmasqCapsPtr tmp =3D NULL; #endif =20 - if (virTestCompareToFile(actual, outconf) < 0) + if (virFileExists(outhostsfile)) { + if (!actualhosts) { + fprintf(stderr, + "%s: hostsfile exists but the configuration did not sp= ecify any host", + outhostsfile); + goto fail; + } else if (virTestCompareToFile(actualhosts, outhostsfile) < 0) { + goto fail; + } + } else if (actualhosts) { + fprintf(stderr, + "%s: file does not exist but actual data was expected", + outhostsfile); goto fail; + } =20 ret =3D 0; =20 fail: - VIR_FREE(actual); + VIR_FREE(actualconf); + VIR_FREE(actualhosts); VIR_FREE(pidfile); virCommandFree(cmd); virObjectUnref(obj); @@ -83,19 +105,23 @@ testCompareXMLToConfHelper(const void *data) const testInfo *info =3D data; char *inxml =3D NULL; char *outconf =3D NULL; + char *outhostsfile =3D NULL; =20 if (virAsprintf(&inxml, "%s/networkxml2confdata/%s.xml", abs_srcdir, info->name) < 0 || virAsprintf(&outconf, "%s/networkxml2confdata/%s.conf", + abs_srcdir, info->name) < 0 || + virAsprintf(&outhostsfile, "%s/networkxml2confdata/%s.hostsfile", abs_srcdir, info->name) < 0) { goto cleanup; } =20 - result =3D testCompareXMLToConfFiles(inxml, outconf, info->caps); + result =3D testCompareXMLToConfFiles(inxml, outconf, outhostsfile, inf= o->caps); =20 cleanup: VIR_FREE(inxml); VIR_FREE(outconf); + VIR_FREE(outhostsfile); =20 return result; } @@ -143,6 +169,13 @@ mymain(void) DO_TEST("dhcp6-nat-network", dhcpv6); DO_TEST("dhcp6host-routed-network", dhcpv6); DO_TEST("ptr-domains-auto", dhcpv6); + DO_TEST("leasetime", dhcpv6); + DO_TEST("leasetime-seconds", dhcpv6); + DO_TEST("leasetime-hours", dhcpv6); + DO_TEST("leasetime-minutes", dhcpv6); + DO_TEST("leasetime-hours", dhcpv6); + DO_TEST("leasetime-days", dhcpv6); + DO_TEST("leasetime-infinite", dhcpv6); =20 virObjectUnref(dhcpv6); virObjectUnref(full); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list