24 #include <netcomm/utils/resolver_thread.h>
25 #include <netcomm/utils/resolver.h>
27 #include <netcomm/dns-sd/avahi_thread.h>
29 #include <core/exceptions/system.h>
31 #include <sys/types.h>
33 #include <netinet/in.h>
62 :
Thread(
"NetworkNameResolverThread",
Thread::OPMODE_WAITFORWAKEUP)
64 __resolver = resolver;
65 __addrq_mutex =
new Mutex();
66 __namesq_mutex =
new Mutex();
69 __namesq = &__namesqs[0];
70 __namesq_proc = &__namesqs[1];
73 __addrq = &__addrqs[0];
74 __addrq_proc = &__addrqs[1];
77 __avahi_thread = avahi_thread;
84 __namesq_mutex->
lock();
85 while ( ! __namesq->empty() ) {
86 NamesQMap::iterator nqit = __namesq->begin();
88 __namesq->erase(nqit);
91 while ( ! __namesq_proc->empty() ) {
92 NamesQMap::iterator nqit = __namesq_proc->begin();
94 __namesq->erase(nqit);
98 __addrq_mutex->
lock();
99 while ( ! __addrq->empty() ) {
100 AddrQMap::iterator nqit = __addrq->begin();
101 free(nqit->second.first);
102 __addrq->erase(nqit);
107 while ( ! __addrq_proc->empty() ) {
108 AddrQMap::iterator nqit = __addrq_proc->begin();
109 free(nqit->second.first);
110 __addrq->erase(nqit);
113 delete __addrq_mutex;
114 delete __namesq_mutex;
132 struct sockaddr **addr, socklen_t *addr_len)
138 if ( getaddrinfo(name, NULL, NULL, &ai) == 0 ) {
140 struct sockaddr *tmp = (
struct sockaddr *)malloc(ai->ai_addrlen);
141 memcpy(tmp, ai->ai_addr, ai->ai_addrlen);
143 *addr_len = ai->ai_addrlen;
150 char *n = (
char *)name + strlen(name) - 6;
151 const char *f = strstr(name,
".local");
152 if ( __avahi_thread && f && (f == n) ) {
153 __avahi_thread->resolve_name(name,
this);
188 char **name,
bool *namefound)
191 char hbuf[NI_MAXHOST];
192 if ( getnameinfo(addr, addr_len, hbuf,
sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0 ) {
193 char *tmp = (
char *)malloc(strlen(hbuf) + 1);
201 }
else if ( getnameinfo(addr, addr_len, hbuf,
sizeof(hbuf), NULL, 0, 0) == 0 ) {
202 char *tmp = (
char *)malloc(strlen(hbuf) + 1);
213 if ( __avahi_thread ) {
214 __avahi_thread->resolve_address(addr, addr_len,
this);
230 __namesq_mutex->
lock();
231 if ( __namesq->find((
char *)name) == __namesq->end() ) {
232 char *tmp = strdup(name);
233 __namesq->insert(tmp);
251 struct ::sockaddr_in *saddr = (struct ::sockaddr_in *)addr;
252 __addrq_mutex->
lock();
253 if ( __addrq->find(saddr->sin_addr.s_addr) == __addrq->end() ) {
254 struct sockaddr *taddr = (
struct sockaddr *)malloc(addrlen);
255 memcpy(taddr, addr, addrlen);
256 (*__addrq)[saddr->sin_addr.s_addr] = std::make_pair(taddr, addrlen);
277 struct sockaddr *addr, socklen_t addrlen)
279 __resolver->name_resolved(name, addr, addrlen);
297 __resolver->addr_resolved((
struct sockaddr *)addr, addrlen, name,
true);
311 __resolver->name_resolution_failed(name);
326 __resolver->address_resolution_failed((
struct sockaddr *)addr, addrlen);
336 __addrq_mutex->
lock();
337 __addrq_proc = __addrq;
338 __addrq_active = 1 - __addrq_active;
339 __addrq = &__addrqs[__addrq_active];
341 AddrQMap::iterator aqit;
342 while ( ! __addrq_proc->empty() ) {
343 aqit = __addrq_proc->begin();
349 __resolver->addr_resolved(aqit->second.first, aqit->second.second, name, namefound);
351 __resolver->address_resolution_failed(aqit->second.first, aqit->second.second);
353 __addrq_proc->erase(aqit);
356 __namesq_mutex->
lock();
357 __namesq_proc = __namesq;
358 __namesq_active = 1 - __namesq_active;
359 __namesq = &__namesqs[__namesq_active];
361 NamesQMap::iterator nqit;
362 while ( ! __namesq_proc->empty() ) {
363 nqit = __namesq_proc->begin();
366 struct sockaddr *addr;
375 __resolver->name_resolved(strdup(nqn), addr, addrlen);
377 __resolver->name_resolution_failed(strdup(nqn));
379 __namesq_proc->erase(nqit);
NetworkNameResolverThread(NetworkNameResolver *resolver, AvahiThread *avahi_thread=NULL)
Constructor.
void resolve_address(struct sockaddr *addr, socklen_t addrlen)
Enqueue address for resolution.
virtual void name_resolution_failed(char *name)
Name resolution failed.
Fawkes library namespace.
void unlock()
Unlock the mutex.
Thread class encapsulation of pthreads.
virtual void resolved_name(char *name, struct sockaddr *addr, socklen_t addrlen)
Name has been successfully resolved.
void wakeup()
Wake up thread.
virtual void address_resolution_failed(struct sockaddr_in *addr, socklen_t addrlen)
Address resolution failed.
bool resolve_address_immediately(struct sockaddr *addr, socklen_t addr_len, char **name, bool *namefound)
Immediately resolve address.
void resolve_name(const char *name)
Enqueue name for resolution.
const char * name() const
Get name of thread.
~NetworkNameResolverThread()
Destructor.
Network name and address resolver.
virtual void resolved_address(struct sockaddr_in *addr, socklen_t addrlen, char *name)
Address has been successfully resolved.
void lock()
Lock this mutex.
Mutex mutual exclusion lock.
bool resolve_name_immediately(const char *name, struct sockaddr **addr, socklen_t *addr_len)
Immediately resolve a name.
System ran out of memory and desired operation could not be fulfilled.
virtual void loop()
Thread loop.