]> git.tdb.fi Git - netvis.git/blob - source/resolver.cpp
Handle ICMP packets
[netvis.git] / source / resolver.cpp
1 /* $Id$
2
3 This file is part of NetVis
4 Copyright @ 2008 Mikko Rasa, Mikkosoft Productions
5 Distributed unter the GPL
6 */
7
8 #include <netinet/in.h>
9 #include <netdb.h>
10 #include <msp/time/units.h>
11 #include <msp/time/utils.h>
12 #include "host.h"
13 #include "resolver.h"
14
15 using namespace std;
16 using namespace Msp;
17
18 Resolver::Resolver():
19         done(false)
20 {
21         launch();
22 }
23
24 Resolver::~Resolver()
25 {
26         done = true;
27         join();
28 }
29
30 void Resolver::push(Host *h)
31 {
32         MutexLock l_(mutex);
33
34         in_queue.push_back(h);
35 }
36
37 void Resolver::cancel(Host *h)
38 {
39         MutexLock l_(mutex);
40
41         if(h==current)
42         {
43                 current=0;
44                 return;
45         }
46
47         for(list<Host *>::iterator i=in_queue.begin(); i!=in_queue.end(); ++i)
48                 if(*i==h)
49                 {
50                         in_queue.erase(i);
51                         break;
52                 }
53
54         for(list<Result>::iterator i=out_queue.begin(); i!=out_queue.end(); ++i)
55                 if(i->host==h)
56                 {
57                         out_queue.erase(i);
58                         break;
59                 }
60 }
61
62 void Resolver::tick()
63 {
64         MutexLock l_(mutex);
65
66         for(list<Result>::iterator i=out_queue.begin(); i!=out_queue.end(); ++i)
67                 i->host->set_name(i->name);
68         out_queue.clear();
69 }
70
71 void Resolver::main()
72 {
73         while(!done)
74         {
75                 while(!done)
76                 {
77                         sockaddr_storage addr;
78                         {
79                                 MutexLock l_(mutex);
80                                 if(in_queue.empty())
81                                         break;
82                                 current = in_queue.front();
83                                 in_queue.erase(in_queue.begin());
84                                 current->get_address().to_sockaddr(addr);
85                         }
86                         
87                         char buf[128];
88                         int err = getnameinfo(reinterpret_cast<sockaddr *>(&addr), sizeof(addr), buf, sizeof(buf), 0, 0, NI_NOFQDN|NI_NAMEREQD);
89                         if(err==0)
90                         {
91                                 MutexLock l_(mutex);
92                                 if(current)
93                                         out_queue.push_back(Result(current, buf));
94                         }
95                 }
96
97                 Time::sleep(100*Time::msec);
98         }
99 }