[libvirt] [PATCH v4] Implement DNS SRV record into the bridge driver
Eric Blake
eblake at redhat.com
Mon Dec 5 20:31:50 UTC 2011
On 12/05/2011 07:03 AM, Michal Novotny wrote:
> Hi,
> this is the fourth version of my SRV record for DNSMasq patch rebased
> for the current codebase to the bridge driver and libvirt XML file to
> include support for the SRV records in the DNS. The syntax is based on
> DNSMasq man page and tests for both xml2xml and xml2argv were added as
> well. This is basically un-reviewed version 3 of this patch rebased to
> the current codebase with changed version information to 0.9.9 as it's
> supposed to go in 0.9.9 or later because of current 0.9.8 features
> freeze.
>
> Also, the second part of this patch is fixing the networkxml2argv test
> to pass both checks, i.e. both unit tests and also syntax check.
>
> Please review,
> Michal
>
> @@ -217,6 +230,19 @@
> </element>
> </define>
>
> + <define name='unsignedShort'>
> + <data type='integer'>
> + <param name="minInclusive">0</param>
> + <param name="maxInclusive">65535</param>
> + </data>
> + </define>
I'm a bit surprised we didn't have a common definition for this before.
It looks like docs/schemas/nwfilter.rng could be made shorter if we
moved this to a common file between the two, but that can be a separate
cleanup.
> @@ -553,8 +562,99 @@ error:
> }
>
> static int
> +virNetworkDNSSrvDefParseXML(virNetworkDNSDefPtr def,
> + xmlNodePtr cur,
> + xmlXPathContextPtr ctxt)
> +{
> + char *domain;
> + char *service;
> + char *protocol;
> + char *target;
> + int port;
> + int priority;
> + int weight;
> + int ret = 0;
> + char xpath[1024] = { 0 };
I'm not a fan of a fixed-width array,...
> + /* Following attributes are optional but we had to make sure their NULL above */
s/their/they're/
> + if ((target = virXMLPropString(cur, "target")) && (domain = virXMLPropString(cur, "domain"))) {
> + snprintf(xpath, sizeof(xpath), "string(//network/dns/srv[@service='%s']/@port)", service);
...along with an unchecked(!) snprintf into that array. It might be
better to modify ctxt->node (for example, see virDomainDiskDefParseXML),
and construct your query directly relative to the node containing the
srv in question.
> +error:
> + VIR_FREE(domain);
> + VIR_FREE(service);
> + VIR_FREE(protocol);
> + VIR_FREE(target);
> +
> + ret = 1;
Should this be -1?
> @@ -1146,6 +1251,27 @@ virNetworkDNSDefFormat(virBufferPtr buf,
> def->txtrecords[i].value);
> }
>
> + for (i = 0 ; i < def->nsrvrecords ; i++) {
> + if (def->srvrecords[i].service && def->srvrecords[i].protocol) {
> + virBufferAsprintf(buf, " <srv service='%s' protocol='%s' ",
Drop the trailing space here...
> + def->srvrecords[i].service,
> + def->srvrecords[i].protocol);
> +
> + if (def->srvrecords[i].domain)
> + virBufferAsprintf(buf, "domain='%s' ", def->srvrecords[i].domain);
...and use leading space rather than trailing space for each of these...
> + if (def->srvrecords[i].target)
> + virBufferAsprintf(buf, "target='%s' ", def->srvrecords[i].target);
> + if (def->srvrecords[i].port)
> + virBufferAsprintf(buf, "port='%d' ", def->srvrecords[i].port);
> + if (def->srvrecords[i].priority)
> + virBufferAsprintf(buf, "priority='%d' ", def->srvrecords[i].priority);
> + if (def->srvrecords[i].weight)
> + virBufferAsprintf(buf, "weight='%d' ", def->srvrecords[i].weight);
> +
> + virBufferAsprintf(buf, "/>\n");
so that this line does not result in a space prior to the />.
> --dhcp-range 192.168.122.2,192.168.122.254 \
> --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
> ---dhcp-lease-max=253 --dhcp-no-override \
> ---dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile\
> +--dhcp-lease-max=253 \
> +--dhcp-no-override \
> +--dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
This changes the file to add a trailing newline, where it used to end
without one (thanks to the backslash at the end). This has a negative
consequence...
> +++ b/tests/networkxml2argvtest.c
> @@ -18,6 +18,7 @@
> static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) {
> char *inXmlData = NULL;
> char *outArgvData = NULL;
> + char *actual_tmp = NULL;
> char *actual = NULL;
> int ret = -1;
> virNetworkDefPtr dev = NULL;
> @@ -47,9 +48,17 @@ static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) {
> if (networkBuildDhcpDaemonCommandLine(obj, &cmd, pidfile, dctx) < 0)
> goto fail;
>
> - if (!(actual = virCommandToString(cmd)))
> + if (!(actual_tmp = virCommandToString(cmd)))
> goto fail;
>
> + if (VIR_ALLOC_N( actual, (strlen(actual_tmp) + 3) * sizeof(char) ) < 0)
Style. Libvirt code tends not to use spaces before or after nested
layers of arguments. This would be:
if (VIR_ALLOC_N(actual, (strlen(actual_tmp) + 3) * sizeof(char)) < 0)
That said, sizeof(char) is ALWAYS 1, so multiplying by sizeof(char) is
useless. And why the +3? Since you are only adding one byte (plus room
for trailing NUL), this could be:
if (VIR_ALLOC_N(actual, strlen(actual_tmp) + 2) < 0)
but see below why I think we can get away without this malloc in the
first place.
> + goto fail;
> +
> + /* A little hack to make it working for both check and syntax-check */
> + memcpy(actual, actual_tmp, strlen(actual_tmp));
> + actual[ strlen(actual_tmp) ] = '\n';
> + actual[ strlen(actual_tmp) + 1 ] = 0;
...as mentioned above, your change means that there is now a trailing
newline in the expected but not in the actual. Do we really need a
trailing newline in the expected? And if so, it's more efficient to
remove the trailing newline from expected than it is to alloc and memcpy
the actual just to add a newline (that is, it's more efficient to hack
on expected to remove newline than it is to hack actual to add newline).
--
Eric Blake eblake at redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20111205/39a3feab/attachment-0001.sig>
More information about the libvir-list
mailing list