[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