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> 91 addr2name_cache.clear();
92 name2addr_cache.clear();
96 resolver_thread->
start();
108 resolver_thread->
cancel();
109 resolver_thread->
join();
110 delete resolver_thread;
123 __cache_timeout = sec;
133 return __cache_timeout;
143 addr2name_cache.
lock();
144 addr2name_cache.clear();
146 name2addr_cache.
lock();
147 while ( ! name2addr_cache.empty() ) {
148 n2acit = name2addr_cache.begin();
149 free(n2acit->second.first);
150 name2addr_cache.erase(n2acit);
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) ) {
190 *addrlen =
sizeof(
struct sockaddr_in);
214 struct sockaddr **addr, socklen_t *addrlen)
219 struct sockaddr *_addr;
222 name_resolved(strdup(name), _addr, _addrlen);
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) ) {
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);
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);
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);
344 NetworkNameResolver::name_resolution_failed(std::string name)
350 NetworkNameResolver::address_resolution_failed(
struct sockaddr *addr,
363 return __host_info->
name();
bool resolve_name(const char *name, struct sockaddr **addr, socklen_t *addrlen)
Resolve name.
const char * hostname()
Get long hostname.
const char * short_name()
Get short hostname (up to first dot).
void resolve_address(struct sockaddr *addr, socklen_t addrlen)
Enqueue address for resolution.
void update()
Update information.
Fawkes library namespace.
Worker thread for NetworkNameResolver.
~NetworkNameResolver()
Destructor.
void flush_cache()
Flush cache.
const char * short_hostname()
Get short hostname.
void resolve_name(const std::string &name)
Enqueue name for resolution.
const char * name()
Get full hostname.
bool resolve_address(struct sockaddr *addr, socklen_t addr_len, std::string &name)
Resolve address.
void cancel()
Cancel a thread.
void unlock() const
Unlock map.
unsigned int cache_timeout()
Get cache timeout.
void join()
Join the thread.
bool resolve_name_blocking(const char *name, struct sockaddr **addr, socklen_t *addrlen)
Resolve name and wait for the result.
void set_cache_timeout(unsigned int sec)
Set cache timeout.
NetworkNameResolver(AvahiThread *avahi_thread=NULL)
Constructor.
void lock() const
Lock map.
bool resolve_name_immediately(const std::string &name, struct sockaddr **addr, socklen_t *addr_len)
Immediately resolve a name.
void start(bool wait=true)
Call this method to start the thread.