]> git.tdb.fi Git - netvis.git/blobdiff - source/resolver.cpp
Resolve IP addresses to hostnames
[netvis.git] / source / resolver.cpp
diff --git a/source/resolver.cpp b/source/resolver.cpp
new file mode 100644 (file)
index 0000000..1a0b99f
--- /dev/null
@@ -0,0 +1,75 @@
+/* $Id$
+
+This file is part of NetVis
+Copyright @ 2008 Mikko Rasa, Mikkosoft Productions
+Distributed unter the GPL
+*/
+
+#include <netinet/in.h>
+#include <netdb.h>
+#include <msp/time/units.h>
+#include <msp/time/utils.h>
+#include "host.h"
+#include "resolver.h"
+
+using namespace std;
+using namespace Msp;
+
+Resolver::Resolver():
+       done(false)
+{
+       launch();
+}
+
+Resolver::~Resolver()
+{
+       done=true;
+       join();
+}
+
+void Resolver::push(Host *h)
+{
+       MutexLock l_(mutex);
+
+       in_queue.push_back(h);
+}
+
+void Resolver::tick()
+{
+       MutexLock l_(mutex);
+
+       for(list<Result>::iterator i=out_queue.begin(); i!=out_queue.end(); ++i)
+               i->host->set_name(i->name);
+       out_queue.clear();
+}
+
+void Resolver::main()
+{
+       while(!done)
+       {
+               while(1)
+               {
+                       Host *host;
+                       {
+                               MutexLock l_(mutex);
+                               if(in_queue.empty())
+                                       break;
+                               host=in_queue.front();
+                               in_queue.erase(in_queue.begin());
+                       }
+                       
+                       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));
+                       }
+               }
+
+               Time::sleep(Time::sec);
+       }
+}