aboutsummaryrefslogtreecommitdiff
path: root/src/gns/gnunet-service-gns.c
diff options
context:
space:
mode:
authorMartin Schanzenbach <mschanzenbach@posteo.de>2012-02-20 16:31:47 +0000
committerMartin Schanzenbach <mschanzenbach@posteo.de>2012-02-20 16:31:47 +0000
commit2a3f7ede791d3ae2ee809b242abe9fff3969c64a (patch)
tree7f44361b2f1ed3186bf4c8c507447bf36bace26d /src/gns/gnunet-service-gns.c
parentc7e7b05c19dd113c065a73dde7d60a68e5fe7659 (diff)
downloadgnunet-2a3f7ede791d3ae2ee809b242abe9fff3969c64a.tar.gz
gnunet-2a3f7ede791d3ae2ee809b242abe9fff3969c64a.zip
-gns service with dns/namestore api added
Diffstat (limited to 'src/gns/gnunet-service-gns.c')
-rw-r--r--src/gns/gnunet-service-gns.c174
1 files changed, 155 insertions, 19 deletions
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c
index 9d3b93aee..902c2adec 100644
--- a/src/gns/gnunet-service-gns.c
+++ b/src/gns/gnunet-service-gns.c
@@ -28,6 +28,7 @@
28#include "gnunet_transport_service.h" 28#include "gnunet_transport_service.h"
29#include "gnunet_dns_service.h" 29#include "gnunet_dns_service.h"
30#include "gnunet_dnsparser_lib.h" 30#include "gnunet_dnsparser_lib.h"
31#include "gnunet_namestore_service.h"
31#include "gnunet_gns_service.h" 32#include "gnunet_gns_service.h"
32#include "gns.h" 33#include "gns.h"
33 34
@@ -37,11 +38,38 @@
37#define GNUNET_MESSAGE_TYPE_GNS_CLIENT_RESULT 24 38#define GNUNET_MESSAGE_TYPE_GNS_CLIENT_RESULT 24
38 39
39/** 40/**
41 * A result list for namestore queries
42 */
43struct GNUNET_GNS_PendingQuery
44{
45 /* the answer packet */
46 struct GNUNET_DNSPARSER_Packet *answer;
47
48 /* records to put into answer packet */
49 struct GNUNET_CONTAINER_SList *records;
50
51 int num_records;
52 int num_authority_records; //FIXME are all of our replies auth?
53
54 /* the dns request id */
55 int id; // FIXME can handle->request_id also be used here?
56
57 /* the request handle to reply to */
58 struct GNUNET_DNS_RequestHandle *request_handle;
59};
60
61
62/**
40 * Our handle to the DNS handler library 63 * Our handle to the DNS handler library
41 */ 64 */
42struct GNUNET_DNS_Handle *dns_handle; 65struct GNUNET_DNS_Handle *dns_handle;
43 66
44/** 67/**
68 * Our handle to the namestore service
69 */
70struct GNUNET_NAMESTORE_Handle *namestore_handle;
71
72/**
45 * The configuration the GNS service is running with 73 * The configuration the GNS service is running with
46 */ 74 */
47const struct GNUNET_CONFIGURATION_Handle *GNS_cfg; 75const struct GNUNET_CONFIGURATION_Handle *GNS_cfg;
@@ -52,6 +80,11 @@ const struct GNUNET_CONFIGURATION_Handle *GNS_cfg;
52static struct GNUNET_SERVER_NotificationContext *nc; 80static struct GNUNET_SERVER_NotificationContext *nc;
53 81
54/** 82/**
83 * Our zone hash
84 */
85const GNUNET_HashCode *my_zone;
86
87/**
55 * Task run during shutdown. 88 * Task run during shutdown.
56 * 89 *
57 * @param cls unused 90 * @param cls unused
@@ -63,6 +96,87 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
63 GNUNET_DNS_disconnect(dns_handle); 96 GNUNET_DNS_disconnect(dns_handle);
64} 97}
65 98
99static void
100process_ns_result(void* cls, const GNUNET_HashCode *zone,
101 const char *name, uint32_t record_type,
102 struct GNUNET_TIME_Absolute expiration,
103 enum GNUNET_NAMESTORE_RecordFlags flags,
104 const struct GNUNET_NAMESTORE_SignatureLocation *sig_loc,
105 size_t size, const void *data)
106{
107 struct GNUNET_GNS_PendingQuery *answer;
108 struct GNUNET_DNSPARSER_Record *record;
109 struct GNUNET_DNSPARSER_Packet *packet;
110 struct GNUNET_DNSPARSER_Flags dnsflags;
111 char *reply_buffer;
112
113 answer = (struct GNUNET_GNS_PendingQuery *) cls;
114
115
116 if (NULL == data)
117 {
118 /**
119 * Last result received (or none)
120 * FIXME extract to func
121 */
122 reply_buffer = GNUNET_malloc(6000); //FIXME magic number
123 packet = GNUNET_malloc(sizeof(struct GNUNET_DNSPARSER_Packet));
124 packet->answers =
125 GNUNET_malloc(sizeof(struct GNUNET_DNSPARSER_Record) * answer->num_records);
126 /* FIXME how to handle auth, additional etc */
127 packet->num_answers = answer->num_records;
128 packet->num_authority_records = answer->num_authority_records;
129
130 dnsflags.authoritative_answer = 1;
131 dnsflags.return_code = GNUNET_DNSPARSER_RETURN_CODE_YXDOMAIN; //not sure
132 dnsflags.query_or_response = 1;
133 packet->flags = dnsflags;
134
135 packet->id = answer->id;
136 size_t bufsize = 6000;
137 int ret = GNUNET_DNSPARSER_pack (packet,
138 600, /* FIXME max udp payload */
139 &reply_buffer,
140 &bufsize); // FIXME magic number bufsize
141 if (ret == GNUNET_OK)
142 {
143 GNUNET_DNS_request_answer(answer->request_handle,
144 6000, //FIXME what length here
145 reply_buffer);
146 }
147 else
148 {
149 //FIXME log
150 }
151 }
152 else
153 {
154 /**
155 * New result
156 */
157 record = GNUNET_malloc(sizeof(struct GNUNET_DNSPARSER_Record));
158 record->name = (char*)name;
159 /* FIXME for gns records this requires the dnsparser to be modified!*/
160 //record->data = data; FIXME!
161 record->expiration_time = expiration;
162 record->type = record_type;
163 record->class = GNUNET_DNSPARSER_CLASS_INTERNET; /* srsly? */
164
165 if (flags == GNUNET_NAMESTORE_RF_AUTHORITY)
166 {
167 answer->num_authority_records++;
168 }
169
170 answer->num_records++;
171
172 //FIXME watch for leaks
173 GNUNET_CONTAINER_slist_add (answer->records,
174 GNUNET_CONTAINER_SLIST_DISPOSITION_DYNAMIC,
175 &record, sizeof(struct GNUNET_DNSPARSER_Record*));
176 }
177}
178
179
66/** 180/**
67 * The DNS request handler 181 * The DNS request handler
68 * Is this supposed to happen here in the service (config option) 182 * Is this supposed to happen here in the service (config option)
@@ -81,8 +195,9 @@ handle_dns_request(void *cls,
81{ 195{
82 /** 196 /**
83 * parse request for tld 197 * parse request for tld
84 **/ 198 */
85 struct GNUNET_DNSPARSER_Packet *p; 199 struct GNUNET_DNSPARSER_Packet *p;
200 struct GNUNET_GNS_PendingQuery *answer;
86 int namelen; 201 int namelen;
87 int i; 202 int i;
88 char *tail; 203 char *tail;
@@ -98,27 +213,40 @@ handle_dns_request(void *cls,
98 * FIXME factor out 213 * FIXME factor out
99 * Check tld and decide if we or 214 * Check tld and decide if we or
100 * legacy dns is responsible 215 * legacy dns is responsible
101 **/ 216 */
102 for (i=0;i<p->num_queries;i++) 217 for (i=0;i<p->num_queries;i++)
103 { 218 {
104 namelen = strlen(p->queries[i].name); 219 namelen = strlen(p->queries[i].name);
105 if (namelen >= 7) 220
221 if (namelen < 7) /* this can't be .gnunet */
222 continue;
223 /**
224 * FIXME off by 1?
225 * Move our tld/root to config file
226 * Generate fake DNS reply that replaces .gnunet with .org for testing?
227 */
228 tail = p->queries[i].name+(namelen-7);
229 if (0 == strcmp(tail, ".gnunet"))
106 { 230 {
107 /** 231 /**
108 * FIXME off by 1? 232 * Do db lookup here. Make dht lookup if necessary
109 * Move our tld/root to config file 233 * FIXME for now only local lookups for our zone!
110 * Generate fake DNS reply that replaces .gnunet with .org 234 */
111 **/ 235 answer = GNUNET_malloc(sizeof (struct GNUNET_GNS_PendingQuery));
112 tail = p->queries[i].name+(namelen-7); 236 answer->records = GNUNET_CONTAINER_slist_create ();
113 if (0 == strcmp(tail, ".gnunet")) 237 answer->id = p->id;
114 { 238
115 /* Do db lookup here. Make dht lookup if necessary */ 239 GNUNET_NAMESTORE_lookup_name(namestore_handle,
116 GNUNET_DNS_request_answer(rh, 0 /*length*/, NULL/*reply*/); 240 my_zone,
117 } 241 p->queries[i].name,
118 else 242 p->queries[i].type,
119 { 243 &process_ns_result,
120 GNUNET_DNS_request_forward (rh); 244 answer);
121 } 245 //GNUNET_DNS_request_answer(rh, 0 /*length*/, NULL/*reply*/);
246 }
247 else
248 {
249 GNUNET_DNS_request_forward (rh);
122 } 250 }
123 } 251 }
124} 252}
@@ -152,17 +280,25 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
152 280
153 nc = GNUNET_SERVER_notification_context_create (server, 1); 281 nc = GNUNET_SERVER_notification_context_create (server, 1);
154 282
155 /* TODO do some config parsing */ 283 /* FIXME - do some config parsing
284 * - Maybe only hijack dns if option is set (HIJACK_DNS=1)
285 */
156 286
157 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, 287 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
158 NULL); 288 NULL);
159 /** 289 /**
160 * Do gnunet dns init here 290 * Do gnunet dns init here
161 * */ 291 */
162 dns_handle = GNUNET_DNS_connect(c, 292 dns_handle = GNUNET_DNS_connect(c,
163 GNUNET_DNS_FLAG_PRE_RESOLUTION, 293 GNUNET_DNS_FLAG_PRE_RESOLUTION,
164 &handle_dns_request, /* rh */ 294 &handle_dns_request, /* rh */
165 NULL); /* Closure */ 295 NULL); /* Closure */
296
297 /**
298 * handle to our local namestore
299 */
300 namestore_handle = GNUNET_NAMESTORE_connect(c);
301
166 GNUNET_SERVER_add_handlers (server, handlers); 302 GNUNET_SERVER_add_handlers (server, handlers);
167 /** 303 /**
168 * Esp the lookup would require to keep track of the clients' context 304 * Esp the lookup would require to keep track of the clients' context