aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-service-dns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vpn/gnunet-service-dns.c')
-rw-r--r--src/vpn/gnunet-service-dns.c79
1 files changed, 38 insertions, 41 deletions
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c
index 9732f90c4..c3d136406 100644
--- a/src/vpn/gnunet-service-dns.c
+++ b/src/vpn/gnunet-service-dns.c
@@ -39,21 +39,18 @@
39#include "gnunet_crypto_lib.h" 39#include "gnunet_crypto_lib.h"
40#include "gnunet_signatures.h" 40#include "gnunet_signatures.h"
41 41
42struct dns_cls { 42static struct GNUNET_SCHEDULER_Handle *sched;
43 struct GNUNET_SCHEDULER_Handle *sched;
44 43
45 struct GNUNET_NETWORK_Handle *dnsout; 44static struct GNUNET_NETWORK_Handle *dnsout;
46 45
47 struct GNUNET_DHT_Handle *dht; 46static struct GNUNET_DHT_Handle *dht;
48 47
49 unsigned short dnsoutport; 48static unsigned short dnsoutport;
50 49
51 const struct GNUNET_CONFIGURATION_Handle *cfg; 50static const struct GNUNET_CONFIGURATION_Handle *cfg;
52 51
53 struct answer_packet_list *head; 52static struct answer_packet_list *head;
54 struct answer_packet_list *tail; 53static struct answer_packet_list *tail;
55};
56static struct dns_cls mycls;
57 54
58struct dns_query_id_state { 55struct dns_query_id_state {
59 unsigned valid:1; 56 unsigned valid:1;
@@ -163,7 +160,7 @@ void receive_dht(void *cls,
163 160
164 answer->pkt.addroffset = htons((unsigned short)((unsigned long)(&drec_data->data)-(unsigned long)(&answer->pkt))); 161 answer->pkt.addroffset = htons((unsigned short)((unsigned long)(&drec_data->data)-(unsigned long)(&answer->pkt)));
165 162
166 GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer); 163 GNUNET_CONTAINER_DLL_insert_after(head, tail, tail, answer);
167 164
168 GNUNET_SERVER_notify_transmit_ready(query_states[id].client, 165 GNUNET_SERVER_notify_transmit_ready(query_states[id].client,
169 len, 166 len,
@@ -178,8 +175,8 @@ void receive_dht(void *cls,
178 * This receives a GNUNET_MESSAGE_TYPE_REHIJACK and rehijacks the DNS 175 * This receives a GNUNET_MESSAGE_TYPE_REHIJACK and rehijacks the DNS
179 */ 176 */
180void rehijack(void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { 177void rehijack(void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) {
181 unhijack(mycls.dnsoutport); 178 unhijack(dnsoutport);
182 hijack(mycls.dnsoutport); 179 hijack(dnsoutport);
183} 180}
184 181
185/** 182/**
@@ -212,7 +209,7 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct
212 struct receive_dht_cls* cls = GNUNET_malloc(sizeof(struct receive_dht_cls)); 209 struct receive_dht_cls* cls = GNUNET_malloc(sizeof(struct receive_dht_cls));
213 cls->id = dns->s.id; 210 cls->id = dns->s.id;
214 211
215 cls->handle = GNUNET_DHT_get_start(mycls.dht, 212 cls->handle = GNUNET_DHT_get_start(dht,
216 GNUNET_TIME_UNIT_MINUTES, 213 GNUNET_TIME_UNIT_MINUTES,
217 GNUNET_BLOCK_TYPE_DNS, 214 GNUNET_BLOCK_TYPE_DNS,
218 &key, 215 &key,
@@ -235,26 +232,26 @@ void receive_query(void *cls, struct GNUNET_SERVER_Client *client, const struct
235 dest.sin_port = htons(53); 232 dest.sin_port = htons(53);
236 dest.sin_addr.s_addr = pkt->orig_to; 233 dest.sin_addr.s_addr = pkt->orig_to;
237 234
238 /* int r = */ GNUNET_NETWORK_socket_sendto(mycls.dnsout, dns, ntohs(pkt->hdr.size) - sizeof(struct query_packet) + 1, (struct sockaddr*) &dest, sizeof dest); 235 /* int r = */ GNUNET_NETWORK_socket_sendto(dnsout, dns, ntohs(pkt->hdr.size) - sizeof(struct query_packet) + 1, (struct sockaddr*) &dest, sizeof dest);
239 236
240out: 237out:
241 GNUNET_SERVER_receive_done(client, GNUNET_OK); 238 GNUNET_SERVER_receive_done(client, GNUNET_OK);
242} 239}
243 240
244size_t send_answer(void* cls, size_t size, void* buf) { 241size_t send_answer(void* cls, size_t size, void* buf) {
245 struct answer_packet_list* query = mycls.head; 242 struct answer_packet_list* query = head;
246 size_t len = ntohs(query->pkt.hdr.size); 243 size_t len = ntohs(query->pkt.hdr.size);
247 244
248 GNUNET_assert(len <= size); 245 GNUNET_assert(len <= size);
249 246
250 memcpy(buf, &query->pkt.hdr, len); 247 memcpy(buf, &query->pkt.hdr, len);
251 248
252 GNUNET_CONTAINER_DLL_remove (mycls.head, mycls.tail, query); 249 GNUNET_CONTAINER_DLL_remove (head, tail, query);
253 250
254 GNUNET_free(query); 251 GNUNET_free(query);
255 252
256 if (mycls.head != NULL) { 253 if (head != NULL) {
257 GNUNET_SERVER_notify_transmit_ready(cls, ntohs(mycls.head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, cls); 254 GNUNET_SERVER_notify_transmit_ready(cls, ntohs(head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, cls);
258 } 255 }
259 256
260 return len; 257 return len;
@@ -272,7 +269,7 @@ static void read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext
272 unsigned int addrlen = sizeof addr; 269 unsigned int addrlen = sizeof addr;
273 270
274 int r; 271 int r;
275 r = GNUNET_NETWORK_socket_recvfrom(mycls.dnsout, buf, 65536, (struct sockaddr*)&addr, &addrlen); 272 r = GNUNET_NETWORK_socket_recvfrom(dnsout, buf, 65536, (struct sockaddr*)&addr, &addrlen);
276 273
277 /* if (r < 0) TODO */ 274 /* if (r < 0) TODO */
278 275
@@ -289,12 +286,12 @@ static void read_response (void *cls, const struct GNUNET_SCHEDULER_TaskContext
289 answer->pkt.dst_port = query_states[dns->s.id].local_port; 286 answer->pkt.dst_port = query_states[dns->s.id].local_port;
290 memcpy(answer->pkt.data, buf, r); 287 memcpy(answer->pkt.data, buf, r);
291 288
292 GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer); 289 GNUNET_CONTAINER_DLL_insert_after(head, tail, tail, answer);
293 290
294 /* struct GNUNET_CONNECTION_TransmitHandle* th = */ GNUNET_SERVER_notify_transmit_ready(query_states[dns->s.id].client, len, GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[dns->s.id].client); 291 /* struct GNUNET_CONNECTION_TransmitHandle* th = */ GNUNET_SERVER_notify_transmit_ready(query_states[dns->s.id].client, len, GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[dns->s.id].client);
295 } 292 }
296 293
297 GNUNET_SCHEDULER_add_read_net(mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.dnsout, &read_response, NULL); 294 GNUNET_SCHEDULER_add_read_net(sched, GNUNET_TIME_UNIT_FOREVER_REL, dnsout, &read_response, NULL);
298} 295}
299 296
300 297
@@ -308,8 +305,8 @@ static void
308cleanup_task (void *cls, 305cleanup_task (void *cls,
309 const struct GNUNET_SCHEDULER_TaskContext *tc) 306 const struct GNUNET_SCHEDULER_TaskContext *tc)
310{ 307{
311 unhijack(mycls.dnsoutport); 308 unhijack(dnsoutport);
312 GNUNET_DHT_disconnect(mycls.dht); 309 GNUNET_DHT_disconnect(dht);
313} 310}
314 311
315static void 312static void
@@ -330,7 +327,7 @@ publish_name (void *cls,
330 GNUNET_CRYPTO_hash(name, strlen(name)+1, &data.service_descriptor); 327 GNUNET_CRYPTO_hash(name, strlen(name)+1, &data.service_descriptor);
331 328
332 char* keyfile; 329 char* keyfile;
333 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename(mycls.cfg, "GNUNETD", 330 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename(cfg, "GNUNETD",
334 "HOSTKEY", &keyfile)) 331 "HOSTKEY", &keyfile))
335 { 332 {
336 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "could not read keyfile-value\n"); 333 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "could not read keyfile-value\n");
@@ -359,7 +356,7 @@ publish_name (void *cls,
359 356
360 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Putting with key %08x\n", *((unsigned int*)&data.service_descriptor)); 357 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Putting with key %08x\n", *((unsigned int*)&data.service_descriptor));
361 358
362 GNUNET_DHT_put(mycls.dht, 359 GNUNET_DHT_put(dht,
363 &data.service_descriptor, 360 &data.service_descriptor,
364 GNUNET_DHT_RO_NONE, 361 GNUNET_DHT_RO_NONE,
365 GNUNET_BLOCK_TYPE_DNS, 362 GNUNET_BLOCK_TYPE_DNS,
@@ -370,7 +367,7 @@ publish_name (void *cls,
370 NULL, 367 NULL,
371 NULL); 368 NULL);
372 369
373 GNUNET_SCHEDULER_add_delayed (mycls.sched, GNUNET_TIME_UNIT_HOURS, publish_name, NULL); 370 GNUNET_SCHEDULER_add_delayed (sched, GNUNET_TIME_UNIT_HOURS, publish_name, NULL);
374} 371}
375 372
376/** 373/**
@@ -381,9 +378,9 @@ publish_name (void *cls,
381 */ 378 */
382static void 379static void
383run (void *cls, 380run (void *cls,
384 struct GNUNET_SCHEDULER_Handle *sched, 381 struct GNUNET_SCHEDULER_Handle *sched_,
385 struct GNUNET_SERVER_Handle *server, 382 struct GNUNET_SERVER_Handle *server,
386 const struct GNUNET_CONFIGURATION_Handle *cfg) 383 const struct GNUNET_CONFIGURATION_Handle *cfg_)
387{ 384{
388 static const struct GNUNET_SERVER_MessageHandler handlers[] = { 385 static const struct GNUNET_SERVER_MessageHandler handlers[] = {
389 /* callback, cls, type, size */ 386 /* callback, cls, type, size */
@@ -392,7 +389,8 @@ run (void *cls,
392 {NULL, NULL, 0, 0} 389 {NULL, NULL, 0, 0}
393 }; 390 };
394 391
395 mycls.cfg = cfg; 392 cfg = cfg_;
393 sched = sched_;
396 394
397 { 395 {
398 int i; 396 int i;
@@ -401,18 +399,17 @@ run (void *cls,
401 } 399 }
402 } 400 }
403 401
404 mycls.dht = GNUNET_DHT_connect(sched, cfg, 1024); 402 dht = GNUNET_DHT_connect(sched, cfg, 1024);
405 403
406 struct sockaddr_in addr; 404 struct sockaddr_in addr;
407 405
408 mycls.sched = sched; 406 dnsout = GNUNET_NETWORK_socket_create (AF_INET, SOCK_DGRAM, 0);
409 mycls.dnsout = GNUNET_NETWORK_socket_create (AF_INET, SOCK_DGRAM, 0); 407 if (dnsout == NULL)
410 if (mycls.dnsout == NULL)
411 return; 408 return;
412 memset(&addr, 0, sizeof(struct sockaddr_in)); 409 memset(&addr, 0, sizeof(struct sockaddr_in));
413 410
414 int err = GNUNET_NETWORK_socket_bind (mycls.dnsout, 411 int err = GNUNET_NETWORK_socket_bind (dnsout,
415 (struct sockaddr*)&addr, 412 (struct sockaddr*)&addr,
416 sizeof(struct sockaddr_in)); 413 sizeof(struct sockaddr_in));
417 414
418 if (err != GNUNET_YES) { 415 if (err != GNUNET_YES) {
@@ -420,17 +417,17 @@ run (void *cls,
420 return; 417 return;
421 } 418 }
422 socklen_t addrlen = sizeof(struct sockaddr_in); 419 socklen_t addrlen = sizeof(struct sockaddr_in);
423 err = getsockname(GNUNET_NETWORK_get_fd(mycls.dnsout), 420 err = getsockname(GNUNET_NETWORK_get_fd(dnsout),
424 (struct sockaddr*) &addr, 421 (struct sockaddr*) &addr,
425 &addrlen); 422 &addrlen);
426 423
427 mycls.dnsoutport = htons(addr.sin_port); 424 dnsoutport = htons(addr.sin_port);
428 425
429 hijack(htons(addr.sin_port)); 426 hijack(htons(addr.sin_port));
430 427
431 GNUNET_SCHEDULER_add_now (mycls.sched, publish_name, NULL); 428 GNUNET_SCHEDULER_add_now (sched, publish_name, NULL);
432 429
433 GNUNET_SCHEDULER_add_read_net(sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.dnsout, &read_response, NULL); 430 GNUNET_SCHEDULER_add_read_net(sched, GNUNET_TIME_UNIT_FOREVER_REL, dnsout, &read_response, NULL);
434 431
435 GNUNET_SERVER_add_handlers (server, handlers); 432 GNUNET_SERVER_add_handlers (server, handlers);
436 GNUNET_SCHEDULER_add_delayed (sched, 433 GNUNET_SCHEDULER_add_delayed (sched,