[reSIProcate] DNS update in Ares
Dario Bozzali
Dario.Bozzali at ifminfomaster.com
Thu Dec 4 02:34:09 CST 2008
Hi all,
I had a look at the code in rutil/dns and I think that it could be possible to reload DNS servers configuration even after stack initialization.
First of all I'm developing application under Windows OS, so I used IP helper functions to detect network configuration changes.
Then I tried to change some source code in rutil and it seems to work, even if DNS queries that are running during configuration reload terminate with cause ARES_EDESTRUCTION (I didn't find a better solution).
I would appreciate any suggestion/opinion/comment regarding following changes.
In rutil\dns\DnsStub.hxx I added the following method declaration:
bool reloadDnsServers();
and the following data members:
std::vector<GenericIPAddress> mAdditionalNameservers;
AfterSocketCreationFuncPtr mSocketFunc;
In rutil\dns\DnsStub.cxx I changed DnsStub constructor:
DnsStub::DnsStub(const NameserverList& additional,
AfterSocketCreationFuncPtr socketFunc,
AsyncProcessHandler* asyncProcessHandler) :
mTransform(0),
mDnsProvider(ExternalDnsFactory::createExternalDns()),
mAsyncProcessHandler(asyncProcessHandler)
{
mAdditionalNameservers = additional;
mSocketFunc = socketFunc;
[...]
}
Then I defined the following method definition:
bool
DnsStub::reloadDnsServers()
{
bool changed = mDnsProvider->checkDnsChange();
if (changed) {
doClearDnsCache();
mDnsProvider->init(mAdditionalNameservers,
mSocketFunc,
mDnsTimeout,
mDnsTries,
mDnsFeatures);
}
return changed;
}
Finally in rutil\dns\AresDns.cxx I changed method AresDns::internalInit() using ares_destroy() instead of ares_destroy_suppress_callbacks() function like in CARES:
int
AresDns::internalInit(const std::vector<GenericIPAddress>& additionalNameservers,
AfterSocketCreationFuncPtr socketfunc,
unsigned int features,
ares_channeldata** channel,
int timeout,
int tries
)
{
if(*channel)
{
#if defined(USE_ARES)
ares_destroy(*channel);
#elif defined(USE_CARES)
// Callbacks will be supressed by looking for the ARES_EDESTRUCTION
// sentinel status
ares_destroy(*channel);
#endif
*channel = 0;
}
[...]
I think it could also be possible to change AresDns::init() and AresDns::internalInit() methods declaration adding a new parameter (int suppressCallbacks, if necessary defaulted with value 1), so that it could be possible to use "void ares_destroy_internal(ares_channel channel, int suppressCallbacks);" function (this function is used internally by ares_destroy ares_destroy_suppress_callbacks functions): in this way we can decide at initialization time to suppress callback or not.
Thank you in advance and best regards.
Dario.
________________________________
-----Original Message-----
From: Byron Campen [mailto:bcampen at estacado.net]
Sent: martedì 2 dicembre 2008 0.37
To: Dario Bozzali
Cc: resiprocate-devel at list.resiprocate.org
Subject: Re: [reSIProcate] DNS update in Ares
I don't think this can be done while the stack is already up.
Best regards,
Byron Campen
> Hi all,
> I have a question related to Ares and DNS servers.
> DNS servers in Ares are configured at application startup time.
> Does it exist in Resiprocate the opportunity to detect that something
> has been changed in network configuration so that I can refresh/update
> DNS servers in Ares?
> Any suggestion would be appreciated.
> Thank you in advance.
>
> Best regards,
> Dario.
> _______________________________________________
> resiprocate-devel mailing list
> resiprocate-devel at resiprocate.org
> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
More information about the resiprocate-devel
mailing list