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>
62 AvahiThread * avahi_thread)
63 : Thread(
"NetworkNameResolverThread", Thread::OPMODE_WAITFORWAKEUP)
66 addrq_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);