143 const char*
name() const noexcept
override {
return "DnsStubException"; }
156 mDnsTimeout = timeoutInSec;
203 QueryCommand<QueryType>* command =
new QueryCommand<QueryType>(target, protocol, sink, *
this);
221 void cache(
const Data& key, in_addr addr);
222 void cache(
const Data& key,
const unsigned char* abuf,
int alen);
223 void cacheTTL(
const Data& key,
int rrType,
int status,
const unsigned char* abuf,
int alen);
226 class ResultConverter
229 virtual void notifyUser(
const Data& target,
234 virtual ~ResultConverter() {}
237 template<
class QueryType>
238 class ResultConverterImpl :
public ResultConverter
241 virtual void notifyUser(
const Data& target,
248 DNSResult<typename QueryType::Type> result;
249 for (
unsigned int i = 0; i < src.size(); ++i)
251 typename QueryType::Type* r =
dynamic_cast<typename QueryType::Type*
>(src[i]);
254 result.records.push_back(*r);
258 ErrLog(<<
"unexpected result type: " <<
typeid(src[i]).name());
261 result.domain = target;
262 result.status = status;
264 sink->onLogDnsResult(result);
265 sink->onDnsResult(result);
269 class Query :
public DnsRawSink
272 Query(DnsStub& stub, ResultTransform* transform, ResultConverter* resultConv,
273 const Data& target,
int rrType,
bool followCname,
int proto, DnsResultSink* s);
276 enum {MAX_REQUERIES = 5};
279 void process(
int status,
const unsigned char* abuf,
const int alen);
280 void onDnsRaw(
int status,
const unsigned char* abuf,
int alen);
281 void followCname(
const unsigned char* aptr,
const unsigned char*abuf,
const int alen,
bool& bGotAnswers,
bool& bDeleteThis, Data& targetToQuery);
287 ResultTransform* mTransform;
288 ResultConverter* mResultConverter;
292 DnsResultSink* mSink;
298 DnsStub& operator=(
const DnsStub&);
304 template<
class QueryType>
307 Query*
query =
new Query(*
this, mTransform,
308 new ResultConverterImpl<QueryType>(),
309 target, QueryType::getRRType(),
310 QueryType::SupportsCName, proto, sink);
311 mQueries.insert(
query);
317 template<
class QueryType>
318 class QueryCommand :
public Command
321 QueryCommand(
const Data& target,
335 mStub.query<QueryType>(mTarget, mProto, mSink);
341 DnsResultSink* mSink;
345 void doSetEnumSuffixes(
const std::vector<Data>& suffixes);
346 void doSetEnumDomains(
const std::map<Data,Data>& domains);
348 class SetEnumSuffixesCommand :
public Command
351 SetEnumSuffixesCommand(DnsStub& stub,
352 const std::vector<Data>& suffixes)
354 mEnumSuffixes(suffixes)
356 ~SetEnumSuffixesCommand() {}
359 mStub.doSetEnumSuffixes(mEnumSuffixes);
364 std::vector<Data> mEnumSuffixes;
367 class SetEnumDomainsCommand :
public Command
370 SetEnumDomainsCommand(DnsStub& stub,
371 const std::map<Data,Data>& domains)
373 mEnumDomains(domains)
375 ~SetEnumDomainsCommand() {}
378 mStub.doSetEnumDomains(mEnumDomains);
383 std::map<Data,Data> mEnumDomains;
386 void doClearDnsCache();
388 class ClearDnsCacheCommand :
public Command
391 ClearDnsCacheCommand(DnsStub& stub)
394 ~ClearDnsCacheCommand() {}
397 mStub.doClearDnsCache();
404 void doLogDnsCache();
406 class LogDnsCacheCommand :
public Command
409 LogDnsCacheCommand(DnsStub& stub)
412 ~LogDnsCacheCommand() {}
415 mStub.doLogDnsCache();
422 void doGetDnsCacheDump(std::pair<unsigned long, unsigned long> key, GetDnsCacheDumpHandler* handler);
424 class GetDnsCacheDumpCommand :
public Command
427 GetDnsCacheDumpCommand(DnsStub& stub, std::pair<unsigned long, unsigned long> key, GetDnsCacheDumpHandler* handler)
428 : mStub(stub), mKey(key), mHandler(handler)
430 ~GetDnsCacheDumpCommand() {}
433 mStub.doGetDnsCacheDump(mKey, mHandler);
438 std::pair<unsigned long, unsigned long> mKey;
439 GetDnsCacheDumpHandler* mHandler;
442 void doReloadDnsServers();
444 class ReloadDnsServersCommand :
public Command
447 ReloadDnsServersCommand(DnsStub& stub)
450 ~ReloadDnsServersCommand() {}
453 mStub.doReloadDnsServers();
460 SelectInterruptor mSelectInterruptor;
465 const unsigned char* skipDNSQuestion(
const unsigned char *aptr,
466 const unsigned char *abuf,
468 const unsigned char* createOverlay(
const unsigned char* abuf,
470 const unsigned char* aptr,
471 std::vector<RROverlay>&,
473 void removeQuery(Query*);
474 void lookupRecords(
const Data& target,
unsigned short type, DnsRawSink* sink);
475 Data errorMessage(
int status);
477 ResultTransform* mTransform;
478 ExternalDns* mDnsProvider;
480 std::set<Query*> mQueries;
482 std::vector<Data> mEnumSuffixes;
483 std::map<Data,Data> mEnumDomains;
485 static int mDnsTimeout;
486 static int mDnsTries;
487 static unsigned int mDnsFeatures;
490 AsyncProcessHandler* mAsyncProcessHandler;