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 while ( ! addr2name_cache.empty() ) {
145 a2ncit = addr2name_cache.begin();
146 free((*a2ncit).second.first);
147 addr2name_cache.erase(a2ncit);
149 addr2name_cache.unlock();
150 name2addr_cache.lock();
151 while ( ! name2addr_cache.empty() ) {
152 n2acit = name2addr_cache.begin();
153 char *name = (*n2acit).first;
154 free((*n2acit).second.first);
155 name2addr_cache.erase(n2acit);
158 name2addr_cache.unlock();
159 __host_info->update();
183 NetworkNameResolver::resolve_name(
const char *name,
184 struct sockaddr **addr, socklen_t *addrlen)
186 name2addr_cache.lock();
188 if ( name2addr_cache.find( (
char *)name ) != name2addr_cache.end() ) {
190 std::pair<struct sockaddr *, time_t> &nrec = name2addr_cache[(
char *)name];
191 if ( nrec.second <= time(NULL) ) {
193 resolver_thread->resolve_name(name);
196 *addrlen =
sizeof(
struct sockaddr_in);
197 name2addr_cache.unlock();
200 name2addr_cache.unlock();
201 resolver_thread->resolve_name(name);
219 NetworkNameResolver::resolve_name_blocking(
const char *name,
220 struct sockaddr **addr, socklen_t *addrlen)
222 if ( resolve_name(name, addr, addrlen) ) {
225 struct sockaddr *_addr;
227 if ( resolver_thread->resolve_name_immediately(name, &_addr, &_addrlen) ) {
228 name_resolved(strdup(name), _addr, _addrlen);
250 NetworkNameResolver::resolve_address(
struct sockaddr *addr, socklen_t addr_len, std::string &name)
252 addr2name_cache.lock();
253 struct sockaddr_in *saddr = (
struct sockaddr_in *)addr;
255 if ( addr2name_cache.find( saddr->sin_addr.s_addr ) != addr2name_cache.end() ) {
257 std::pair<char *, time_t> &nrec = addr2name_cache[saddr->sin_addr.s_addr];
259 if ( nrec.second <= time(NULL) ) {
261 addr2name_cache.unlock();
262 resolver_thread->resolve_address(addr, addr_len);
264 addr2name_cache.unlock();
267 char tmp[INET_ADDRSTRLEN];
268 if ( inet_ntop(AF_INET, &(saddr->sin_addr), tmp,
sizeof(tmp)) ) {
269 char *n = strdup(tmp);
271 addr2name_cache[saddr->sin_addr.s_addr] = std::pair<char *, time_t>(n, time(NULL) + __cache_timeout);
273 addr2name_cache.unlock();
275 addr2name_cache.unlock();
279 resolver_thread->resolve_address(addr, addr_len);
311 NetworkNameResolver::name_resolved(
char *name,
struct sockaddr *addr,
314 name2addr_cache.lock();
315 if ( (n2acit = name2addr_cache.find( name )) != name2addr_cache.end() ) {
317 char *n = (*n2acit).first;
318 free((*n2acit).second.first);
319 name2addr_cache.erase(n2acit);
322 name2addr_cache[name] = std::pair<struct sockaddr *, time_t>(addr, time(NULL) + __cache_timeout);
323 name2addr_cache.unlock();
328 NetworkNameResolver::addr_resolved(
struct sockaddr *addr,
330 char *name,
bool namefound)
332 addr2name_cache.lock();
333 struct sockaddr_in *saddr = (
struct sockaddr_in *)addr;
335 if ((a2ncit = addr2name_cache.find( saddr->sin_addr.s_addr )) != addr2name_cache.end() ) {
337 free(a2ncit->second.first);
338 addr2name_cache.erase(a2ncit);
339 addr2name_cache[saddr->sin_addr.s_addr] = std::pair<char *, time_t>(name, time(NULL) + __cache_timeout);
344 if ((a2ncit = addr2name_cache.find( saddr->sin_addr.s_addr )) == addr2name_cache.end() ) {
345 addr2name_cache[saddr->sin_addr.s_addr] = std::pair<char *, time_t>(name, 0);
351 addr2name_cache.unlock();
356 NetworkNameResolver::name_resolution_failed(
char *name)
363 NetworkNameResolver::address_resolution_failed(
struct sockaddr *addr,
374 NetworkNameResolver::hostname()
376 return __host_info->name();
384 NetworkNameResolver::short_hostname()
386 return __host_info->short_name();
Worker thread for NetworkNameResolver.