24 #include <netcomm/utils/resolver.h> 25 #include <netcomm/utils/resolver_thread.h> 26 #include <core/exceptions/system.h> 27 #include <core/threading/mutex_locker.h> 28 #include <utils/system/hostinfo.h> 30 #include <sys/types.h> 31 #include <arpa/inet.h> 33 #include <netinet/in.h> 89 NetworkNameResolver::NetworkNameResolver(
AvahiThread *avahi_thread)
91 addr2name_cache.clear();
92 name2addr_cache.clear();
96 resolver_thread->start();
105 NetworkNameResolver::~NetworkNameResolver()
108 resolver_thread->cancel();
109 resolver_thread->join();
110 delete resolver_thread;
121 NetworkNameResolver::set_cache_timeout(
unsigned int sec)
123 __cache_timeout = sec;
131 NetworkNameResolver::cache_timeout()
133 return __cache_timeout;
141 NetworkNameResolver::flush_cache()
143 addr2name_cache.lock();
144 addr2name_cache.clear();
145 addr2name_cache.unlock();
146 name2addr_cache.lock();
147 while ( ! name2addr_cache.empty() ) {
148 n2acit = name2addr_cache.begin();
149 free(n2acit->second.first);
150 name2addr_cache.erase(n2acit);
152 name2addr_cache.unlock();
153 __host_info->update();
177 NetworkNameResolver::resolve_name(
const char *name,
178 struct sockaddr **addr, socklen_t *addrlen)
180 name2addr_cache.lock();
182 if ( name2addr_cache.find( (
char *)name ) != name2addr_cache.end() ) {
184 std::pair<struct sockaddr *, time_t> &nrec = name2addr_cache[(
char *)name];
185 if ( nrec.second <= time(NULL) ) {
187 resolver_thread->resolve_name(name);
190 *addrlen =
sizeof(
struct sockaddr_in);
191 name2addr_cache.unlock();
194 name2addr_cache.unlock();
195 resolver_thread->resolve_name(name);
213 NetworkNameResolver::resolve_name_blocking(
const char *name,
214 struct sockaddr **addr, socklen_t *addrlen)
216 if ( resolve_name(name, addr, addrlen) ) {
219 struct sockaddr *_addr;
221 if ( resolver_thread->resolve_name_immediately(name, &_addr, &_addrlen) ) {
222 name_resolved(strdup(name), _addr, _addrlen);
244 NetworkNameResolver::resolve_address(
struct sockaddr *addr, socklen_t addr_len, std::string &name)
246 addr2name_cache.lock();
247 struct sockaddr_in *saddr = (
struct sockaddr_in *)addr;
249 if ( addr2name_cache.find( saddr->sin_addr.s_addr ) != addr2name_cache.end() ) {
251 std::pair<std::string, time_t> &nrec = addr2name_cache[saddr->sin_addr.s_addr];
253 if ( nrec.second <= time(NULL) ) {
255 addr2name_cache.unlock();
256 resolver_thread->resolve_address(addr, addr_len);
258 addr2name_cache.unlock();
261 char tmp[INET_ADDRSTRLEN];
262 if ( inet_ntop(AF_INET, &(saddr->sin_addr), tmp,
sizeof(tmp)) ) {
263 char *n = strdup(tmp);
265 addr2name_cache[saddr->sin_addr.s_addr] = std::pair<char *, time_t>(n, time(NULL) + __cache_timeout);
267 addr2name_cache.unlock();
269 addr2name_cache.unlock();
273 resolver_thread->resolve_address(addr, addr_len);
305 NetworkNameResolver::name_resolved(std::string name,
struct sockaddr *addr,
308 name2addr_cache.lock();
309 if ( (n2acit = name2addr_cache.find(name)) != name2addr_cache.end() ) {
311 free(n2acit->second.first);
312 name2addr_cache.erase(n2acit);
314 name2addr_cache[name] = std::pair<struct sockaddr *, time_t>(addr, time(NULL) + __cache_timeout);
315 name2addr_cache.unlock();
320 NetworkNameResolver::addr_resolved(
struct sockaddr *addr,
322 std::string name,
bool namefound)
324 addr2name_cache.lock();
325 struct sockaddr_in *saddr = (
struct sockaddr_in *)addr;
327 if ((a2ncit = addr2name_cache.find( saddr->sin_addr.s_addr )) != addr2name_cache.end() ) {
329 addr2name_cache.erase(a2ncit);
330 addr2name_cache[saddr->sin_addr.s_addr] =
331 std::make_pair(name, time(NULL) + __cache_timeout);
334 if ((a2ncit = addr2name_cache.find( saddr->sin_addr.s_addr )) == addr2name_cache.end() ) {
335 addr2name_cache[saddr->sin_addr.s_addr] = std::make_pair(name, 0);
339 addr2name_cache.unlock();
344 NetworkNameResolver::name_resolution_failed(std::string name)
350 NetworkNameResolver::address_resolution_failed(
struct sockaddr *addr,
361 NetworkNameResolver::hostname()
363 return __host_info->name();
371 NetworkNameResolver::short_hostname()
373 return __host_info->short_name();
Fawkes library namespace.
Worker thread for NetworkNameResolver.