Commit | Line | Data |
---|---|---|
4e7b6ff9 CH |
1 | /* |
2 | The software in this package is distributed under the GNU General | |
3 | Public License version 2 (with a special exception described below). | |
4 | ||
5 | A copy of GNU General Public License (GPL) is included in this distribution, | |
6 | in the file COPYING.GPL. | |
7 | ||
8 | As a special exception, if other files instantiate templates or use macros | |
9 | or inline functions from this file, or you compile this file and link it | |
10 | with other works to produce a work based on this file, this file | |
11 | does not by itself cause the resulting work to be covered | |
12 | by the GNU General Public License. | |
13 | ||
14 | However the source code for this file must still be made available | |
15 | in accordance with section (3) of the GNU General Public License. | |
16 | ||
17 | This exception does not invalidate any other reasons why a work based | |
18 | on this file might be covered by the GNU General Public License. | |
19 | ||
20 | Christian Herdtweck, Intra2net AG 2015 | |
21 | */ | |
22 | ||
c5b4902d CH |
23 | #include "dns/resolverbase.h" |
24 | #include "dns/dnsmaster.h" | |
4e7b6ff9 CH |
25 | |
26 | #include <boost/bind.hpp> | |
27 | ||
cd71d095 CH |
28 | #include <logfunc.hpp> |
29 | ||
30 | using I2n::Logger::GlobalLogger; | |
31 | ||
c5b4902d | 32 | |
4e7b6ff9 | 33 | ResolverBase::~ResolverBase() |
c5b4902d | 34 | { } |
4e7b6ff9 CH |
35 | |
36 | /** | |
37 | * callbacks should be of type | |
38 | * void resolve_callback(const bool was_success, | |
cd71d095 | 39 | * const int recursion_count) |
4e7b6ff9 | 40 | */ |
cd71d095 CH |
41 | void ResolverBase::async_resolve(const callback_type &callback, |
42 | const int recursion_count) | |
4e7b6ff9 | 43 | { |
cd71d095 CH |
44 | // limit depth of recursion |
45 | if (recursion_count >= DnsMaster::get_instance()->get_max_recursion_count()) | |
46 | { // if recursed too much, schedule callback with was_success = false | |
47 | bool was_success = false; | |
48 | IoService->post( boost::bind(callback, was_success, recursion_count) ); | |
49 | } | |
50 | else | |
51 | { | |
52 | // remember callback | |
53 | CallbackList.push(callback); | |
54 | ||
55 | // check for trouble | |
56 | if (CallbackList.size() > 10) | |
57 | GlobalLogger.warning() << "ResolverBase: have " | |
58 | << CallbackList.size() << " callback[s] listed for " << Hostname | |
59 | << "!"; | |
60 | ||
61 | // let subclass do the resolving | |
62 | do_resolve(recursion_count); | |
63 | } | |
4e7b6ff9 | 64 | |
4e7b6ff9 CH |
65 | } |
66 | ||
67 | ResolverBase::ResolverBase(const IoServiceItem &io_serv, | |
68 | const std::string &hostname, | |
69 | const DnsCacheItem &cache ) | |
70 | : IoService( io_serv ) | |
71 | , Hostname( hostname ) | |
72 | , Cache( cache ) | |
73 | , CallbackList() | |
74 | {} | |
75 | ||
dbe986b9 CH |
76 | std::string ResolverBase::get_hostname() const |
77 | { return Hostname; } | |
78 | ||
26b0f687 | 79 | std::string ResolverBase::get_skip_cname() const |
23f51766 CH |
80 | { |
81 | DnsMasterItem master = DnsMaster::get_instance(); | |
82 | std::string first_out_of_date = Cache->get_first_outdated_cname( | |
83 | Hostname, | |
84 | master->get_resolved_ip_ttl_threshold() ); | |
85 | if ( first_out_of_date == Hostname ) | |
86 | return ""; | |
87 | else | |
8d26221d | 88 | return first_out_of_date; |
23f51766 CH |
89 | } |
90 | ||
e18c1337 | 91 | void ResolverBase::update_cache( const std::string &hostname, |
26b0f687 CH |
92 | const HostAddressVec &new_ips ) const |
93 | { Cache->update( hostname, new_ips ); } | |
e18c1337 CH |
94 | |
95 | void ResolverBase::update_cache( const std::string &hostname, | |
dbe986b9 | 96 | const Cname &cname ) const |
e18c1337 CH |
97 | { Cache->update( hostname, cname ); } |
98 | ||
26b0f687 CH |
99 | void ResolverBase::update_cache( const HostAddressVec &new_ips ) const |
100 | { Cache->update( Hostname, new_ips ); } | |
4e7b6ff9 | 101 | |
dbe986b9 | 102 | void ResolverBase::update_cache( const Cname &cname ) const |
ad83004d CH |
103 | { Cache->update( Hostname, cname ); } |
104 | ||
ad83004d | 105 | |
dbe986b9 CH |
106 | HostAddressVec ResolverBase::get_cached_ips_recursively(const std::string host, |
107 | bool check_up_to_date) const | |
4e7b6ff9 CH |
108 | { |
109 | if (host.empty()) | |
dbe986b9 | 110 | return Cache->get_ips_recursive(Hostname, check_up_to_date); |
4e7b6ff9 | 111 | else |
dbe986b9 | 112 | return Cache->get_ips_recursive(host, check_up_to_date); |
4e7b6ff9 CH |
113 | } |
114 | ||
115 | void ResolverBase::schedule_callbacks(const bool was_success, | |
cd71d095 | 116 | const int recursion_count) |
4e7b6ff9 CH |
117 | { |
118 | while ( !CallbackList.empty() ) | |
119 | { | |
120 | callback_type callback = CallbackList.front(); | |
121 | CallbackList.pop(); | |
cd71d095 | 122 | IoService->post( boost::bind(callback, was_success, recursion_count) ); |
4e7b6ff9 CH |
123 | } |
124 | } | |
125 |