24 #include <netcomm/utils/resolver_thread.h> 25 #include <netcomm/utils/resolver.h> 26 #include <netcomm/utils/addr_size.h> 28 #include <netcomm/dns-sd/avahi_thread.h> 30 #include <core/exceptions/system.h> 33 #include <sys/types.h> 35 #include <netinet/in.h> 64 :
Thread(
"NetworkNameResolverThread",
Thread::OPMODE_WAITFORWAKEUP)
66 __resolver = resolver;
67 __addrq_mutex =
new Mutex();
68 __namesq_mutex =
new Mutex();
71 __namesq = &__namesqs[0];
72 __namesq_proc = &__namesqs[1];
75 __addrq = &__addrqs[0];
76 __addrq_proc = &__addrqs[1];
79 __avahi_thread = avahi_thread;
86 __namesq_mutex->
lock();
88 __namesq_proc->clear();
90 __addrq_mutex->
lock();
91 while ( ! __addrq->empty() ) {
92 AddrQList::iterator nqit = __addrq->begin();
99 while ( ! __addrq_proc->empty() ) {
100 AddrQList::iterator nqit = __addrq_proc->begin();
102 __addrq->erase(nqit);
105 delete __addrq_mutex;
106 delete __namesq_mutex;
124 struct sockaddr **addr, socklen_t *addr_len)
130 if ( getaddrinfo(name.c_str(), NULL, NULL, &ai) == 0 ) {
132 struct sockaddr *tmp = (
struct sockaddr *)malloc(ai->ai_addrlen);
133 memcpy(tmp, ai->ai_addr, ai->ai_addrlen);
135 *addr_len = ai->ai_addrlen;
142 if ( __avahi_thread && name.find(
".local") == name.length() - 6) {
143 __avahi_thread->resolve_name(name.c_str(),
this);
177 std::string &
name,
bool &namefound)
180 char hbuf[NI_MAXHOST];
181 socklen_t addr_len = addr->sa_family == AF_INET ?
sizeof(sockaddr_in) :
sizeof(sockaddr_in6);
183 if ( getnameinfo(addr, addr_len, hbuf,
sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0 ) {
187 }
else if ( getnameinfo(addr, addr_len, hbuf,
sizeof(hbuf), NULL, 0, 0) == 0 ) {
194 if ( __avahi_thread ) {
195 __avahi_thread->resolve_address(addr, addr_len,
this);
211 __namesq_mutex->
lock();
212 if ( __namesq->find(name) == __namesq->end() ) {
213 __namesq->insert(name);
232 __addrq_mutex->
lock();
233 if ( std::find(__addrq->begin(), __addrq->end(), addr) == __addrq->end() ) {
234 struct sockaddr *taddr = (
struct sockaddr *)malloc(addrlen);
235 memcpy(taddr, addr, addrlen);
236 __addrq->push_back(taddr);
257 struct sockaddr *addr, socklen_t addrlen)
259 __resolver->name_resolved(name, addr, addrlen);
277 __resolver->addr_resolved(addr, addrlen, name,
true);
291 __resolver->name_resolution_failed(name);
306 __resolver->address_resolution_failed(addr, addrlen);
316 __addrq_mutex->
lock();
317 __addrq_proc = __addrq;
318 __addrq_active = 1 - __addrq_active;
319 __addrq = &__addrqs[__addrq_active];
321 AddrQList::iterator aqit;
322 while ( ! __addrq_proc->empty() ) {
323 aqit = __addrq_proc->begin();
329 __resolver->addr_resolved(*aqit,
sock_addr_size(*aqit), name, namefound);
331 __resolver->address_resolution_failed(*aqit,
sock_addr_size(*aqit));
333 __addrq_proc->erase(aqit);
336 __namesq_mutex->
lock();
337 __namesq_proc = __namesq;
338 __namesq_active = 1 - __namesq_active;
339 __namesq = &__namesqs[__namesq_active];
341 NamesQMap::iterator nqit;
342 while ( ! __namesq_proc->empty() ) {
343 nqit = __namesq_proc->begin();
344 struct sockaddr *addr;
348 __resolver->name_resolved(*nqit, addr, addrlen);
350 __resolver->name_resolution_failed(*nqit);
352 __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.
void resolve_name(const std::string &name)
Enqueue name for resolution.
const char * name() const
Get name of thread.
size_t sock_addr_size(const struct sockaddr *a)
Get canonical size of sockaddr structure.
~NetworkNameResolverThread()
Destructor.
Network name and address resolver.
virtual void resolved_address(struct sockaddr *addr, socklen_t addrlen, char *name)
Address has been successfully resolved.
virtual void address_resolution_failed(struct sockaddr *addr, socklen_t addrlen)
Address resolution failed.
void lock()
Lock this mutex.
Mutex mutual exclusion lock.
bool resolve_address_immediately(struct sockaddr *addr, std::string &name, bool &namefound)
Immediately resolve address.
bool resolve_name_immediately(const std::string &name, struct sockaddr **addr, socklen_t *addr_len)
Immediately resolve a name.
virtual void loop()
Thread loop.