Subject: Re: [RFC] Support querying IPv6 servers

Re: [RFC] Support querying IPv6 servers

From: Gregor Jasny <jasny_at_vidsoft.de>
Date: Thu, 27 Nov 2008 00:44:35 +0100

On Wed, Nov 26, 2008 at 11:48:49PM +0100, Gregor Jasny wrote:
> On Wed, Nov 26, 2008 at 09:26:03PM +0000, Phil Blundell wrote:
> > On Wed, 2008-11-26 at 20:29 +0100, Yang Tse wrote:
> > > As you have already mentioned it breaks ABI compatibility due to the
> > > change it introduces in one of the ares_options structure member. Yes
> > > the affected member is the 'servers' member which changes its data
> > > type. And the change is unavoidable if we want to support ipv6
> > > servers.
> >
> > It isn't completely unavoidable: one could create a new option, say
> > ARES_OPT_IPV6_SERVERS, with a corresponding new member at the end of
> > struct ares_options, to be used by new applications. (Obviously,
> > despite the name, you could in fact pass both v4 and v6 servers through
> > this interface.) Since the applications need to change anyway to pass
> > in v6 servers, this doesn't seem like it would be much of a problem.
> > Old sources and binaries would go on passing ARES_OPT_SERVERS and
> > filling in the old "servers" member, which would continue to work just
> > fine.
>
> Good point. I'll prepare a patch on top of Yangs.

I've just noticed, that extending the ares_options struct will
definitely break ABI compatibility: The new ares_save_options would
write behind the old allocated option space when saving the new option.

So a major number bump seems unavoidable. And if a recompilation is
necessary, I don't know if its worth the trouble of keeping two
different lists in the options struct. Maybe you could add something
like this into the release notes:

#include <ares_version.h>

...

#if ARES_VERSION > 0x010503
opt.servers = malloc (sizeof(struct ares_addr));
opt.servers[0].family = AF_INET;
opt.servers[0].addr.addr4.s_addr = ntohl(INADDR_LOOPBACK);
#else
opt.servers = malloc (sizeof(struct in_addr));
opt.servers[0].s_addr = ntohl(INADDR_LOOPBACK);
#endif

...

In Debian the only two packages depending on c-ares don't use the
ARES_OPT_SERVERS at all, so a simple recompile will be sufficient.

Cheers,
Gregor
Received on 2008-11-27