]> git.tdb.fi Git - netvis.git/blobdiff - source/resolver.cpp
Handle ICMP packets
[netvis.git] / source / resolver.cpp
index 1bf6c39c4eb19958f4b1540edfa9d080e77086e0..196a8b2beae1b8bfcaae8cf8fb68260617639ecc 100644 (file)
@@ -34,6 +34,31 @@ void Resolver::push(Host *h)
        in_queue.push_back(h);
 }
 
+void Resolver::cancel(Host *h)
+{
+       MutexLock l_(mutex);
+
+       if(h==current)
+       {
+               current=0;
+               return;
+       }
+
+       for(list<Host *>::iterator i=in_queue.begin(); i!=in_queue.end(); ++i)
+               if(*i==h)
+               {
+                       in_queue.erase(i);
+                       break;
+               }
+
+       for(list<Result>::iterator i=out_queue.begin(); i!=out_queue.end(); ++i)
+               if(i->host==h)
+               {
+                       out_queue.erase(i);
+                       break;
+               }
+}
+
 void Resolver::tick()
 {
        MutexLock l_(mutex);
@@ -47,29 +72,28 @@ void Resolver::main()
 {
        while(!done)
        {
-               while(1)
+               while(!done)
                {
-                       Host *host;
+                       sockaddr_storage addr;
                        {
                                MutexLock l_(mutex);
                                if(in_queue.empty())
                                        break;
-                               host = in_queue.front();
+                               current = in_queue.front();
                                in_queue.erase(in_queue.begin());
+                               current->get_address().to_sockaddr(addr);
                        }
                        
-                       sockaddr_in addr;
-                       addr.sin_family = AF_INET;
-                       addr.sin_addr.s_addr = htonl(host->get_address());
                        char buf[128];
                        int err = getnameinfo(reinterpret_cast<sockaddr *>(&addr), sizeof(addr), buf, sizeof(buf), 0, 0, NI_NOFQDN|NI_NAMEREQD);
                        if(err==0)
                        {
                                MutexLock l_(mutex);
-                               out_queue.push_back(Result(host, buf));
+                               if(current)
+                                       out_queue.push_back(Result(current, buf));
                        }
                }
 
-               Time::sleep(Time::sec);
+               Time::sleep(100*Time::msec);
        }
 }