diff options
Diffstat (limited to 'src/vpn/gnunet-service-dns.c')
-rw-r--r-- | src/vpn/gnunet-service-dns.c | 79 |
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 | ||
42 | struct dns_cls { | 42 | static struct GNUNET_SCHEDULER_Handle *sched; |
43 | struct GNUNET_SCHEDULER_Handle *sched; | ||
44 | 43 | ||
45 | struct GNUNET_NETWORK_Handle *dnsout; | 44 | static struct GNUNET_NETWORK_Handle *dnsout; |
46 | 45 | ||
47 | struct GNUNET_DHT_Handle *dht; | 46 | static struct GNUNET_DHT_Handle *dht; |
48 | 47 | ||
49 | unsigned short dnsoutport; | 48 | static unsigned short dnsoutport; |
50 | 49 | ||
51 | const struct GNUNET_CONFIGURATION_Handle *cfg; | 50 | static const struct GNUNET_CONFIGURATION_Handle *cfg; |
52 | 51 | ||
53 | struct answer_packet_list *head; | 52 | static struct answer_packet_list *head; |
54 | struct answer_packet_list *tail; | 53 | static struct answer_packet_list *tail; |
55 | }; | ||
56 | static struct dns_cls mycls; | ||
57 | 54 | ||
58 | struct dns_query_id_state { | 55 | struct 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 | */ |
180 | void rehijack(void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { | 177 | void 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 | ||
240 | out: | 237 | out: |
241 | GNUNET_SERVER_receive_done(client, GNUNET_OK); | 238 | GNUNET_SERVER_receive_done(client, GNUNET_OK); |
242 | } | 239 | } |
243 | 240 | ||
244 | size_t send_answer(void* cls, size_t size, void* buf) { | 241 | size_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 | |||
308 | cleanup_task (void *cls, | 305 | cleanup_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 | ||
315 | static void | 312 | static 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 | */ |
382 | static void | 379 | static void |
383 | run (void *cls, | 380 | run (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, |