lookup .gnunet-addresses in the dht
authorPhilipp Tölke <toelke@in.tum.de>
Fri, 8 Oct 2010 09:03:37 +0000 (09:03 +0000)
committerPhilipp Tölke <toelke@in.tum.de>
Fri, 8 Oct 2010 09:03:37 +0000 (09:03 +0000)
src/vpn/Makefile.am
src/vpn/gnunet-service-dns.c

index 5bfa296008ad78afc60bba0cc6843fee6114d131..027ce687f018e878062cf7ad8f3a8ff664087093 100644 (file)
@@ -51,6 +51,7 @@ gnunet_service_dns_LDADD = \
   $(top_builddir)/src/core/libgnunetcore.la \
   $(top_builddir)/src/statistics/libgnunetstatistics.la \
   $(top_builddir)/src/util/libgnunetutil.la \
+  $(top_builddir)/src/dht/libgnunetdht.la \
   $(GN_LIBINTL)
 
 #check_PROGRAMS = \
index 1545d6cb27aeea1c58309ed868a60cee2b3ce78f..1bf94ce48163d109ac6e18f8b89c1c92deaa14ce 100644 (file)
 #include "gnunet-vpn-pretty-print.h"
 #include "gnunet_container_lib.h"
 #include "gnunet-dns-parser.h"
+#include "gnunet_dht_service.h"
+#include "gnunet_block_lib.h"
+#include "gnunet_block_dns.h"
 
 struct dns_cls {
        struct GNUNET_SCHEDULER_Handle *sched;
 
        struct GNUNET_NETWORK_Handle *dnsout;
 
+       struct GNUNET_DHT_Handle *dht;
+
        unsigned short dnsoutport;
 
        struct answer_packet_list *head;
@@ -70,6 +75,20 @@ void unhijack(unsigned short port) {
        GNUNET_OS_start_process(NULL, NULL, "gnunet-helper-hijack-dns", "gnunet-hijack-dns", "-d", port_s, NULL);
 }
 
+void receive_dht(void *cls,
+                struct GNUNET_TIME_Absolute exp,
+                const GNUNET_HashCode *key,
+                const struct GNUNET_PeerIdentity *const *get_path,
+                const struct GNUNET_PeerIdentity *const *put_path,
+                enum GNUNET_BLOCK_Type type,
+                size_t size,
+                const void *data)
+{
+  GNUNET_assert(type == GNUNET_BLOCK_TYPE_DNS);
+  const struct GNUNET_DNS_Record* rec = data;
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Got block of size %s, peer: %08x, desc: %08x\n", size, *((unsigned int*)&rec->peer), *((unsigned int*)&rec->service_descriptor));
+}
+
 /**
  * This receives the dns-payload from the daemon-vpn and sends it on over the udp-socket
  */
@@ -82,6 +101,20 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct
        if (pdns->queries[0]->namelen > 9 &&
            0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen - 9), ".gnunet.", 9)) {
            GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Query for .gnunet!\n");
+           GNUNET_HashCode key;
+           GNUNET_CRYPTO_hash(pdns->queries[0]->name, pdns->queries[0]->namelen, &key);
+           GNUNET_DHT_get_start(mycls.dht,
+                                GNUNET_TIME_UNIT_MINUTES,
+                                GNUNET_BLOCK_TYPE_DNS,
+                                &key,
+                                GNUNET_DHT_RO_NONE,
+                                NULL,
+                                0,
+                                NULL,
+                                0,
+                                receive_dht,
+                                NULL);
+           goto out;
        }
 
        GNUNET_free(pdns);
@@ -98,6 +131,7 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct
 
        /* int r = */ GNUNET_NETWORK_socket_sendto(mycls.dnsout, dns, ntohs(pkt->hdr.size) - sizeof(struct query_packet) + 1, (struct sockaddr*) &dest, sizeof dest);
 
+out:
        GNUNET_SERVER_receive_done(client, GNUNET_OK);
 }
 
@@ -168,6 +202,7 @@ cleanup_task (void *cls,
              const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
        unhijack(mycls.dnsoutport);
+       GNUNET_DHT_disconnect(mycls.dht);
 }
 
 /**
@@ -195,6 +230,8 @@ run (void *cls,
   }
   }
 
+  mycls.dht = GNUNET_DHT_connect(sched, cfg, 1024);
+
   struct sockaddr_in addr;
 
   mycls.sched = sched;