24 #include <netcomm/utils/addr_size.h>
25 #include <netcomm/utils/resolver.h>
26 #include <netcomm/utils/resolver_thread.h>
28 # include <netcomm/dns-sd/avahi_thread.h>
30 #include <core/exceptions/system.h>
31 #include <netinet/in.h>
32 #include <sys/types.h>
63 :
Thread(
"NetworkNameResolverThread",
Thread::OPMODE_WAITFORWAKEUP)
66 addrq_mutex_ =
new Mutex();
67 namesq_mutex_ =
new Mutex();
70 namesq_ = &namesqs_[0];
71 namesq_proc_ = &namesqs_[1];
75 addrq_proc_ = &addrqs_[1];
78 avahi_thread_ = avahi_thread;
85 namesq_mutex_->
lock();
87 namesq_proc_->clear();
90 while (!addrq_->empty()) {
91 AddrQList::iterator nqit = addrq_->begin();
98 while (!addrq_proc_->empty()) {
99 AddrQList::iterator nqit = addrq_proc_->begin();
105 delete namesq_mutex_;
122 struct sockaddr ** addr,
123 socklen_t * addr_len)
129 if (getaddrinfo(
name.c_str(), NULL, NULL, &ai) == 0) {
131 struct sockaddr *tmp = (
struct sockaddr *)malloc(ai->ai_addrlen);
132 memcpy(tmp, ai->ai_addr, ai->ai_addrlen);
134 *addr_len = ai->ai_addrlen;
141 if (avahi_thread_ &&
name.find(
".local") ==
name.length() - 6) {
142 avahi_thread_->resolve_name(
name.c_str(),
this);
179 char hbuf[NI_MAXHOST];
180 socklen_t addr_len = addr->sa_family == AF_INET ?
sizeof(sockaddr_in) :
sizeof(sockaddr_in6);
182 if (getnameinfo(addr, addr_len, hbuf,
sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0) {
186 }
else if (getnameinfo(addr, addr_len, hbuf,
sizeof(hbuf), NULL, 0, 0) == 0) {
194 avahi_thread_->resolve_address(addr, addr_len,
this);
209 namesq_mutex_->
lock();
210 if (namesq_->find(
name) == namesq_->end()) {
211 namesq_->insert(
name);
228 addrq_mutex_->
lock();
229 if (std::find(addrq_->begin(), addrq_->end(), addr) == addrq_->end()) {
230 struct sockaddr *taddr = (
struct sockaddr *)malloc(addrlen);
231 memcpy(taddr, addr, addrlen);
232 addrq_->push_back(taddr);
253 resolver_->name_resolved(
name, addr, addrlen);
269 resolver_->addr_resolved(addr, addrlen,
name,
true);
282 resolver_->name_resolution_failed(
name);
296 resolver_->address_resolution_failed(addr, addrlen);
305 addrq_mutex_->
lock();
306 addrq_proc_ = addrq_;
307 addrq_active_ = 1 - addrq_active_;
308 addrq_ = &addrqs_[addrq_active_];
310 AddrQList::iterator aqit;
311 while (!addrq_proc_->empty()) {
312 aqit = addrq_proc_->begin();
320 resolver_->address_resolution_failed(*aqit,
sock_addr_size(*aqit));
322 addrq_proc_->erase(aqit);
325 namesq_mutex_->
lock();
326 namesq_proc_ = namesq_;
327 namesq_active_ = 1 - namesq_active_;
328 namesq_ = &namesqs_[namesq_active_];
330 NamesQMap::iterator nqit;
331 while (!namesq_proc_->empty()) {
332 nqit = namesq_proc_->begin();
333 struct sockaddr *addr;
337 resolver_->name_resolved(*nqit, addr, addrlen);
339 resolver_->name_resolution_failed(*nqit);
341 namesq_proc_->erase(nqit);
Mutex mutual exclusion lock.
void lock()
Lock this mutex.
void unlock()
Unlock the mutex.
~NetworkNameResolverThread()
Destructor.
virtual void address_resolution_failed(struct sockaddr *addr, socklen_t addrlen)
Address resolution failed.
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.
virtual void loop()
Thread loop.
virtual void name_resolution_failed(char *name)
Name resolution failed.
NetworkNameResolverThread(NetworkNameResolver *resolver, AvahiThread *avahi_thread=NULL)
Constructor.
virtual void resolved_name(char *name, struct sockaddr *addr, socklen_t addrlen)
Name has been successfully resolved.
bool resolve_address_immediately(struct sockaddr *addr, std::string &name, bool &namefound)
Immediately resolve address.
virtual void resolved_address(struct sockaddr *addr, socklen_t addrlen, char *name)
Address has been successfully resolved.
Network name and address resolver.
Thread class encapsulation of pthreads.
const char * name() const
Get name of thread.
void wakeup()
Wake up thread.
Fawkes library namespace.
size_t sock_addr_size(const struct sockaddr *a)
Get canonical size of sockaddr structure.