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 while ( ! addr2name_cache.empty() ) {
145 a2ncit = addr2name_cache.begin();
146 free((*a2ncit).second.first);
147 addr2name_cache.erase(a2ncit);
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();
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) ) {
196 *addrlen =
sizeof(
struct sockaddr_in);
197 name2addr_cache.unlock();
200 name2addr_cache.unlock();
220 struct sockaddr **addr, socklen_t *addrlen)
225 struct sockaddr *_addr;
228 name_resolved(strdup(name), _addr, _addrlen);
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) ) {
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);
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);
356 NetworkNameResolver::name_resolution_failed(
char *name)
363 NetworkNameResolver::address_resolution_failed(
struct sockaddr *addr,
376 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 unlock() const
Unlock map.
const char * name()
Get full hostname.
bool resolve_address(struct sockaddr *addr, socklen_t addr_len, std::string &name)
Resolve address.
void lock() const
Lock map.
void resolve_name(const char *name)
Enqueue name for resolution.
void cancel()
Cancel a thread.
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.
bool resolve_name_immediately(const char *name, struct sockaddr **addr, socklen_t *addr_len)
Immediately resolve a name.
void set_cache_timeout(unsigned int sec)
Set cache timeout.
NetworkNameResolver(AvahiThread *avahi_thread=NULL)
Constructor.
void start(bool wait=true)
Call this method to start the thread.