25#include <core/exceptions/system.h>
26#include <core/threading/mutex_locker.h>
27#include <netcomm/utils/resolver.h>
28#include <netcomm/utils/resolver_thread.h>
29#include <netinet/in.h>
31#include <utils/system/hostinfo.h>
87 addr2name_cache.clear();
88 name2addr_cache.clear();
92 resolver_thread->
start();
103 resolver_thread->
cancel();
104 resolver_thread->
join();
105 delete resolver_thread;
118 cache_timeout_ = sec;
127 return cache_timeout_;
136 addr2name_cache.
lock();
137 addr2name_cache.clear();
139 name2addr_cache.
lock();
140 while (!name2addr_cache.empty()) {
141 n2acit = name2addr_cache.begin();
142 free(n2acit->second.first);
143 name2addr_cache.erase(n2acit);
171 name2addr_cache.
lock();
173 if (name2addr_cache.find((
char *)name) != name2addr_cache.end()) {
175 std::pair<struct sockaddr *, time_t> &nrec = name2addr_cache[(
char *)name];
176 if (nrec.second <= time(NULL)) {
181 *addrlen =
sizeof(
struct sockaddr_in);
204 struct sockaddr **addr,
210 struct sockaddr *_addr;
213 name_resolved(strdup(name), _addr, _addrlen);
236 addr2name_cache.
lock();
237 struct sockaddr_in *saddr = (
struct sockaddr_in *)addr;
239 if (addr2name_cache.find(saddr->sin_addr.s_addr) != addr2name_cache.end()) {
241 std::pair<std::string, time_t> &nrec = addr2name_cache[saddr->sin_addr.s_addr];
243 if (nrec.second <= time(NULL)) {
251 char tmp[INET_ADDRSTRLEN];
252 if (inet_ntop(AF_INET, &(saddr->sin_addr), tmp,
sizeof(tmp))) {
253 char *n = strdup(tmp);
255 addr2name_cache[saddr->sin_addr.s_addr] =
256 std::pair<char *, time_t>(n, time(NULL) + cache_timeout_);
295NetworkNameResolver::name_resolved(std::string name,
struct sockaddr *addr, socklen_t addrlen)
297 name2addr_cache.
lock();
298 if ((n2acit = name2addr_cache.find(name)) != name2addr_cache.end()) {
300 free(n2acit->second.first);
301 name2addr_cache.erase(n2acit);
303 name2addr_cache[name] = std::pair<struct sockaddr *, time_t>(addr, time(NULL) + cache_timeout_);
308NetworkNameResolver::addr_resolved(
struct sockaddr *addr,
313 addr2name_cache.
lock();
314 struct sockaddr_in *saddr = (
struct sockaddr_in *)addr;
316 if ((a2ncit = addr2name_cache.find(saddr->sin_addr.s_addr)) != addr2name_cache.end()) {
318 addr2name_cache.erase(a2ncit);
319 addr2name_cache[saddr->sin_addr.s_addr] = std::make_pair(name, time(NULL) + cache_timeout_);
322 if ((a2ncit = addr2name_cache.find(saddr->sin_addr.s_addr)) == addr2name_cache.end()) {
323 addr2name_cache[saddr->sin_addr.s_addr] = std::make_pair(name, 0);
331NetworkNameResolver::name_resolution_failed(std::string name)
336NetworkNameResolver::address_resolution_failed(
struct sockaddr *addr, socklen_t addrlen)
347 return host_info_->
name();
const char * name()
Get full hostname.
void update()
Update information.
const char * short_name()
Get short hostname (up to first dot).
void lock() const
Lock map.
void unlock() const
Unlock map.
Worker thread for NetworkNameResolver.
bool resolve_name_immediately(const std::string &name, struct sockaddr **addr, socklen_t *addr_len)
Immediately resolve a name.
void resolve_name(const std::string &name)
Enqueue name for resolution.
void resolve_address(struct sockaddr *addr, socklen_t addrlen)
Enqueue address for resolution.
unsigned int cache_timeout()
Get cache timeout.
void set_cache_timeout(unsigned int sec)
Set cache timeout.
void flush_cache()
Flush cache.
bool resolve_address(struct sockaddr *addr, socklen_t addr_len, std::string &name)
Resolve address.
NetworkNameResolver(AvahiThread *avahi_thread=NULL)
Constructor.
bool resolve_name(const char *name, struct sockaddr **addr, socklen_t *addrlen)
Resolve name.
const char * hostname()
Get long hostname.
~NetworkNameResolver()
Destructor.
bool resolve_name_blocking(const char *name, struct sockaddr **addr, socklen_t *addrlen)
Resolve name and wait for the result.
const char * short_hostname()
Get short hostname.
void start(bool wait=true)
Call this method to start the thread.
void join()
Join the thread.
void cancel()
Cancel a thread.
Fawkes library namespace.