aboutsummaryrefslogtreecommitdiff
path: root/src/gns/gnunet-dns2gns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gns/gnunet-dns2gns.c')
-rw-r--r--src/gns/gnunet-dns2gns.c801
1 files changed, 402 insertions, 399 deletions
diff --git a/src/gns/gnunet-dns2gns.c b/src/gns/gnunet-dns2gns.c
index 4058aba99..a1ae888dd 100644
--- a/src/gns/gnunet-dns2gns.c
+++ b/src/gns/gnunet-dns2gns.c
@@ -37,7 +37,8 @@
37/** 37/**
38 * Data kept per request. 38 * Data kept per request.
39 */ 39 */
40struct Request { 40struct Request
41{
41 /** 42 /**
42 * Socket to use for sending the reply. 43 * Socket to use for sending the reply.
43 */ 44 */
@@ -155,39 +156,39 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg;
155 * @param cls unused 156 * @param cls unused
156 */ 157 */
157static void 158static void
158do_shutdown(void *cls) 159do_shutdown (void *cls)
159{ 160{
160 (void)cls; 161 (void) cls;
161 if (NULL != t4) 162 if (NULL != t4)
162 { 163 {
163 GNUNET_SCHEDULER_cancel(t4); 164 GNUNET_SCHEDULER_cancel (t4);
164 t4 = NULL; 165 t4 = NULL;
165 } 166 }
166 if (NULL != t6) 167 if (NULL != t6)
167 { 168 {
168 GNUNET_SCHEDULER_cancel(t6); 169 GNUNET_SCHEDULER_cancel (t6);
169 t6 = NULL; 170 t6 = NULL;
170 } 171 }
171 if (NULL != listen_socket4) 172 if (NULL != listen_socket4)
172 { 173 {
173 GNUNET_NETWORK_socket_close(listen_socket4); 174 GNUNET_NETWORK_socket_close (listen_socket4);
174 listen_socket4 = NULL; 175 listen_socket4 = NULL;
175 } 176 }
176 if (NULL != listen_socket6) 177 if (NULL != listen_socket6)
177 { 178 {
178 GNUNET_NETWORK_socket_close(listen_socket6); 179 GNUNET_NETWORK_socket_close (listen_socket6);
179 listen_socket6 = NULL; 180 listen_socket6 = NULL;
180 } 181 }
181 if (NULL != gns) 182 if (NULL != gns)
182 { 183 {
183 GNUNET_GNS_disconnect(gns); 184 GNUNET_GNS_disconnect (gns);
184 gns = NULL; 185 gns = NULL;
185 } 186 }
186 if (NULL != dns_stub) 187 if (NULL != dns_stub)
187 { 188 {
188 GNUNET_DNSSTUB_stop(dns_stub); 189 GNUNET_DNSSTUB_stop (dns_stub);
189 dns_stub = NULL; 190 dns_stub = NULL;
190 } 191 }
191} 192}
192 193
193 194
@@ -197,38 +198,38 @@ do_shutdown(void *cls)
197 * @param request context for the request. 198 * @param request context for the request.
198 */ 199 */
199static void 200static void
200send_response(struct Request *request) 201send_response (struct Request *request)
201{ 202{
202 char *buf; 203 char *buf;
203 size_t size; 204 size_t size;
204 ssize_t sret; 205 ssize_t sret;
205 206
206 if (GNUNET_SYSERR == 207 if (GNUNET_SYSERR ==
207 GNUNET_DNSPARSER_pack(request->packet, 208 GNUNET_DNSPARSER_pack (request->packet,
208 UINT16_MAX /* is this not too much? */, 209 UINT16_MAX /* is this not too much? */,
209 &buf, 210 &buf,
210 &size)) 211 &size))
211 { 212 {
212 GNUNET_log(GNUNET_ERROR_TYPE_WARNING, 213 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
213 _("Failed to pack DNS response into UDP packet!\n")); 214 _ ("Failed to pack DNS response into UDP packet!\n"));
214 } 215 }
215 else 216 else
216 { 217 {
217 sret = GNUNET_NETWORK_socket_sendto(request->lsock, 218 sret = GNUNET_NETWORK_socket_sendto (request->lsock,
218 buf, 219 buf,
219 size, 220 size,
220 request->addr, 221 request->addr,
221 request->addr_len); 222 request->addr_len);
222 if ((sret < 0) || 223 if ((sret < 0) ||
223 (size != (size_t)sret)) 224 (size != (size_t) sret))
224 GNUNET_log_strerror(GNUNET_ERROR_TYPE_WARNING, 225 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
225 "sendto"); 226 "sendto");
226 GNUNET_free(buf); 227 GNUNET_free (buf);
227 } 228 }
228 GNUNET_SCHEDULER_cancel(request->timeout_task); 229 GNUNET_SCHEDULER_cancel (request->timeout_task);
229 GNUNET_DNSPARSER_free_packet(request->packet); 230 GNUNET_DNSPARSER_free_packet (request->packet);
230 GNUNET_free(request->udp_msg); 231 GNUNET_free (request->udp_msg);
231 GNUNET_free(request); 232 GNUNET_free (request);
232} 233}
233 234
234 235
@@ -238,18 +239,18 @@ send_response(struct Request *request)
238 * @param cls `struct Request *` of the request to clean up 239 * @param cls `struct Request *` of the request to clean up
239 */ 240 */
240static void 241static void
241do_timeout(void *cls) 242do_timeout (void *cls)
242{ 243{
243 struct Request *request = cls; 244 struct Request *request = cls;
244 245
245 if (NULL != request->packet) 246 if (NULL != request->packet)
246 GNUNET_DNSPARSER_free_packet(request->packet); 247 GNUNET_DNSPARSER_free_packet (request->packet);
247 if (NULL != request->lookup) 248 if (NULL != request->lookup)
248 GNUNET_GNS_lookup_with_tld_cancel(request->lookup); 249 GNUNET_GNS_lookup_with_tld_cancel (request->lookup);
249 if (NULL != request->dns_lookup) 250 if (NULL != request->dns_lookup)
250 GNUNET_DNSSTUB_resolve_cancel(request->dns_lookup); 251 GNUNET_DNSSTUB_resolve_cancel (request->dns_lookup);
251 GNUNET_free(request->udp_msg); 252 GNUNET_free (request->udp_msg);
252 GNUNET_free(request); 253 GNUNET_free (request);
253} 254}
254 255
255 256
@@ -261,28 +262,28 @@ do_timeout(void *cls)
261 * @param r size of the DNS payload 262 * @param r size of the DNS payload
262 */ 263 */
263static void 264static void
264dns_result_processor(void *cls, 265dns_result_processor (void *cls,
265 const struct GNUNET_TUN_DnsHeader *dns, 266 const struct GNUNET_TUN_DnsHeader *dns,
266 size_t r) 267 size_t r)
267{ 268{
268 struct Request *request = cls; 269 struct Request *request = cls;
269 270
270 if (NULL == dns) 271 if (NULL == dns)
271 { 272 {
272 /* DNSSTUB gave up, so we trigger timeout early */ 273 /* DNSSTUB gave up, so we trigger timeout early */
273 GNUNET_SCHEDULER_cancel(request->timeout_task); 274 GNUNET_SCHEDULER_cancel (request->timeout_task);
274 do_timeout(request); 275 do_timeout (request);
275 return; 276 return;
276 } 277 }
277 if (request->original_request_id != dns->id) 278 if (request->original_request_id != dns->id)
278 { 279 {
279 /* for a another query, ignore */ 280 /* for a another query, ignore */
280 return; 281 return;
281 } 282 }
282 request->packet = GNUNET_DNSPARSER_parse((char*)dns, 283 request->packet = GNUNET_DNSPARSER_parse ((char*) dns,
283 r); 284 r);
284 GNUNET_DNSSTUB_resolve_cancel(request->dns_lookup); 285 GNUNET_DNSSTUB_resolve_cancel (request->dns_lookup);
285 send_response(request); 286 send_response (request);
286} 287}
287 288
288 289
@@ -295,10 +296,10 @@ dns_result_processor(void *cls,
295 * @param rd the records in reply 296 * @param rd the records in reply
296 */ 297 */
297static void 298static void
298result_processor(void *cls, 299result_processor (void *cls,
299 int was_gns, 300 int was_gns,
300 uint32_t rd_count, 301 uint32_t rd_count,
301 const struct GNUNET_GNSRECORD_Data *rd) 302 const struct GNUNET_GNSRECORD_Data *rd)
302{ 303{
303 struct Request *request = cls; 304 struct Request *request = cls;
304 struct GNUNET_DNSPARSER_Packet *packet; 305 struct GNUNET_DNSPARSER_Packet *packet;
@@ -306,22 +307,22 @@ result_processor(void *cls,
306 307
307 request->lookup = NULL; 308 request->lookup = NULL;
308 if (GNUNET_NO == was_gns) 309 if (GNUNET_NO == was_gns)
309 { 310 {
310 /* TLD not configured for GNS, fall back to DNS */ 311 /* TLD not configured for GNS, fall back to DNS */
311 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 312 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
312 "Using DNS resolver IP `%s' to resolve `%s'\n", 313 "Using DNS resolver IP `%s' to resolve `%s'\n",
313 dns_ip, 314 dns_ip,
314 request->packet->queries[0].name); 315 request->packet->queries[0].name);
315 request->original_request_id = request->packet->id; 316 request->original_request_id = request->packet->id;
316 GNUNET_DNSPARSER_free_packet(request->packet); 317 GNUNET_DNSPARSER_free_packet (request->packet);
317 request->packet = NULL; 318 request->packet = NULL;
318 request->dns_lookup = GNUNET_DNSSTUB_resolve(dns_stub, 319 request->dns_lookup = GNUNET_DNSSTUB_resolve (dns_stub,
319 request->udp_msg, 320 request->udp_msg,
320 request->udp_msg_size, 321 request->udp_msg_size,
321 &dns_result_processor, 322 &dns_result_processor,
322 request); 323 request);
323 return; 324 return;
324 } 325 }
325 packet = request->packet; 326 packet = request->packet;
326 packet->flags.query_or_response = 1; 327 packet->flags.query_or_response = 1;
327 packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR; 328 packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR;
@@ -331,63 +332,63 @@ result_processor(void *cls,
331 packet->flags.recursion_available = 1; 332 packet->flags.recursion_available = 1;
332 packet->flags.message_truncated = 0; 333 packet->flags.message_truncated = 0;
333 packet->flags.authoritative_answer = 0; 334 packet->flags.authoritative_answer = 0;
334 //packet->flags.opcode = GNUNET_TUN_DNS_OPCODE_STATUS; // ??? 335 // packet->flags.opcode = GNUNET_TUN_DNS_OPCODE_STATUS; // ???
335 for (uint32_t i = 0; i < rd_count; i++) 336 for (uint32_t i = 0; i < rd_count; i++)
337 {
338 // FIXME: do we need to hanlde #GNUNET_GNSRECORD_RF_SHADOW_RECORD
339 // here? Or should we do this in libgnunetgns?
340 rec.expiration_time.abs_value_us = rd[i].expiration_time;
341 switch (rd[i].record_type)
336 { 342 {
337 // FIXME: do we need to hanlde #GNUNET_GNSRECORD_RF_SHADOW_RECORD 343 case GNUNET_DNSPARSER_TYPE_A:
338 // here? Or should we do this in libgnunetgns? 344 GNUNET_assert (sizeof(struct in_addr) == rd[i].data_size);
339 rec.expiration_time.abs_value_us = rd[i].expiration_time; 345 rec.name = GNUNET_strdup (packet->queries[0].name);
340 switch (rd[i].record_type) 346 rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET;
341 { 347 rec.type = GNUNET_DNSPARSER_TYPE_A;
342 case GNUNET_DNSPARSER_TYPE_A: 348 rec.data.raw.data = GNUNET_new (struct in_addr);
343 GNUNET_assert(sizeof(struct in_addr) == rd[i].data_size); 349 GNUNET_memcpy (rec.data.raw.data,
344 rec.name = GNUNET_strdup(packet->queries[0].name); 350 rd[i].data,
345 rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; 351 rd[i].data_size);
346 rec.type = GNUNET_DNSPARSER_TYPE_A; 352 rec.data.raw.data_len = sizeof(struct in_addr);
347 rec.data.raw.data = GNUNET_new(struct in_addr); 353 GNUNET_array_append (packet->answers,
348 GNUNET_memcpy(rec.data.raw.data, 354 packet->num_answers,
349 rd[i].data, 355 rec);
350 rd[i].data_size); 356 break;
351 rec.data.raw.data_len = sizeof(struct in_addr); 357
352 GNUNET_array_append(packet->answers, 358 case GNUNET_DNSPARSER_TYPE_AAAA:
353 packet->num_answers, 359 GNUNET_assert (sizeof(struct in6_addr) == rd[i].data_size);
354 rec); 360 rec.name = GNUNET_strdup (packet->queries[0].name);
355 break; 361 rec.data.raw.data = GNUNET_new (struct in6_addr);
356 362 rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET;
357 case GNUNET_DNSPARSER_TYPE_AAAA: 363 rec.type = GNUNET_DNSPARSER_TYPE_AAAA;
358 GNUNET_assert(sizeof(struct in6_addr) == rd[i].data_size); 364 GNUNET_memcpy (rec.data.raw.data,
359 rec.name = GNUNET_strdup(packet->queries[0].name); 365 rd[i].data,
360 rec.data.raw.data = GNUNET_new(struct in6_addr); 366 rd[i].data_size);
361 rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; 367 rec.data.raw.data_len = sizeof(struct in6_addr);
362 rec.type = GNUNET_DNSPARSER_TYPE_AAAA; 368 GNUNET_array_append (packet->answers,
363 GNUNET_memcpy(rec.data.raw.data, 369 packet->num_answers,
364 rd[i].data, 370 rec);
365 rd[i].data_size); 371 break;
366 rec.data.raw.data_len = sizeof(struct in6_addr); 372
367 GNUNET_array_append(packet->answers, 373 case GNUNET_DNSPARSER_TYPE_CNAME:
368 packet->num_answers, 374 rec.name = GNUNET_strdup (packet->queries[0].name);
369 rec); 375 rec.data.hostname = GNUNET_strdup (rd[i].data);
370 break; 376 rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET;
371 377 rec.type = GNUNET_DNSPARSER_TYPE_CNAME;
372 case GNUNET_DNSPARSER_TYPE_CNAME: 378 GNUNET_memcpy (rec.data.hostname,
373 rec.name = GNUNET_strdup(packet->queries[0].name); 379 rd[i].data,
374 rec.data.hostname = GNUNET_strdup(rd[i].data); 380 rd[i].data_size);
375 rec.dns_traffic_class = GNUNET_TUN_DNS_CLASS_INTERNET; 381 GNUNET_array_append (packet->answers,
376 rec.type = GNUNET_DNSPARSER_TYPE_CNAME; 382 packet->num_answers,
377 GNUNET_memcpy(rec.data.hostname, 383 rec);
378 rd[i].data, 384 break;
379 rd[i].data_size); 385
380 GNUNET_array_append(packet->answers, 386 default:
381 packet->num_answers, 387 /* skip */
382 rec); 388 break;
383 break;
384
385 default:
386 /* skip */
387 break;
388 }
389 } 389 }
390 send_response(request); 390 }
391 send_response (request);
391} 392}
392 393
393 394
@@ -401,73 +402,73 @@ result_processor(void *cls,
401 * @param udp_msg_size number of bytes in @a udp_msg 402 * @param udp_msg_size number of bytes in @a udp_msg
402 */ 403 */
403static void 404static void
404handle_request(struct GNUNET_NETWORK_Handle *lsock, 405handle_request (struct GNUNET_NETWORK_Handle *lsock,
405 const void *addr, 406 const void *addr,
406 size_t addr_len, 407 size_t addr_len,
407 const char *udp_msg, 408 const char *udp_msg,
408 size_t udp_msg_size) 409 size_t udp_msg_size)
409{ 410{
410 struct Request *request; 411 struct Request *request;
411 struct GNUNET_DNSPARSER_Packet *packet; 412 struct GNUNET_DNSPARSER_Packet *packet;
412 413
413 packet = GNUNET_DNSPARSER_parse(udp_msg, 414 packet = GNUNET_DNSPARSER_parse (udp_msg,
414 udp_msg_size); 415 udp_msg_size);
415 if (NULL == packet) 416 if (NULL == packet)
416 { 417 {
417 GNUNET_log(GNUNET_ERROR_TYPE_WARNING, 418 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
418 _("Cannot parse DNS request from %s\n"), 419 _ ("Cannot parse DNS request from %s\n"),
419 GNUNET_a2s(addr, addr_len)); 420 GNUNET_a2s (addr, addr_len));
420 return; 421 return;
421 } 422 }
422 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 423 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
423 "Received request for `%s' with flags %u, #answers %d, #auth %d, #additional %d\n", 424 "Received request for `%s' with flags %u, #answers %d, #auth %d, #additional %d\n",
424 packet->queries[0].name, 425 packet->queries[0].name,
425 (unsigned int)packet->flags.query_or_response, 426 (unsigned int) packet->flags.query_or_response,
426 (int)packet->num_answers, 427 (int) packet->num_answers,
427 (int)packet->num_authority_records, 428 (int) packet->num_authority_records,
428 (int)packet->num_additional_records); 429 (int) packet->num_additional_records);
429 if ((0 != packet->flags.query_or_response) || 430 if ((0 != packet->flags.query_or_response) ||
430 (0 != packet->num_answers) || 431 (0 != packet->num_answers) ||
431 (0 != packet->num_authority_records)) 432 (0 != packet->num_authority_records))
432 { 433 {
433 GNUNET_log(GNUNET_ERROR_TYPE_WARNING, 434 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
434 _("Received malformed DNS request from %s\n"), 435 _ ("Received malformed DNS request from %s\n"),
435 GNUNET_a2s(addr, addr_len)); 436 GNUNET_a2s (addr, addr_len));
436 GNUNET_DNSPARSER_free_packet(packet); 437 GNUNET_DNSPARSER_free_packet (packet);
437 return; 438 return;
438 } 439 }
439 if ((1 != packet->num_queries)) 440 if ((1 != packet->num_queries))
440 { 441 {
441 GNUNET_log(GNUNET_ERROR_TYPE_WARNING, 442 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
442 _("Received unsupported DNS request from %s\n"), 443 _ ("Received unsupported DNS request from %s\n"),
443 GNUNET_a2s(addr, 444 GNUNET_a2s (addr,
444 addr_len)); 445 addr_len));
445 GNUNET_DNSPARSER_free_packet(packet); 446 GNUNET_DNSPARSER_free_packet (packet);
446 return; 447 return;
447 } 448 }
448 request = GNUNET_malloc(sizeof(struct Request) + addr_len); 449 request = GNUNET_malloc (sizeof(struct Request) + addr_len);
449 request->lsock = lsock; 450 request->lsock = lsock;
450 request->packet = packet; 451 request->packet = packet;
451 request->addr = &request[1]; 452 request->addr = &request[1];
452 request->addr_len = addr_len; 453 request->addr_len = addr_len;
453 GNUNET_memcpy(&request[1], 454 GNUNET_memcpy (&request[1],
454 addr, 455 addr,
455 addr_len); 456 addr_len);
456 request->udp_msg_size = udp_msg_size; 457 request->udp_msg_size = udp_msg_size;
457 request->udp_msg = GNUNET_memdup(udp_msg, 458 request->udp_msg = GNUNET_memdup (udp_msg,
458 udp_msg_size); 459 udp_msg_size);
459 request->timeout_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT, 460 request->timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
460 &do_timeout, 461 &do_timeout,
461 request); 462 request);
462 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 463 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
463 "Calling GNS on `%s'\n", 464 "Calling GNS on `%s'\n",
464 packet->queries[0].name); 465 packet->queries[0].name);
465 request->lookup = GNUNET_GNS_lookup_with_tld(gns, 466 request->lookup = GNUNET_GNS_lookup_with_tld (gns,
466 packet->queries[0].name, 467 packet->queries[0].name,
467 packet->queries[0].type, 468 packet->queries[0].type,
468 GNUNET_NO, 469 GNUNET_NO,
469 &result_processor, 470 &result_processor,
470 request); 471 request);
471} 472}
472 473
473 474
@@ -477,49 +478,49 @@ handle_request(struct GNUNET_NETWORK_Handle *lsock,
477 * @param cls the 'listen_socket4' 478 * @param cls the 'listen_socket4'
478 */ 479 */
479static void 480static void
480read_dns4(void *cls) 481read_dns4 (void *cls)
481{ 482{
482 struct sockaddr_in v4; 483 struct sockaddr_in v4;
483 socklen_t addrlen; 484 socklen_t addrlen;
484 ssize_t size; 485 ssize_t size;
485 const struct GNUNET_SCHEDULER_TaskContext *tc; 486 const struct GNUNET_SCHEDULER_TaskContext *tc;
486 487
487 GNUNET_assert(listen_socket4 == cls); 488 GNUNET_assert (listen_socket4 == cls);
488 t4 = GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, 489 t4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
489 listen_socket4, 490 listen_socket4,
490 &read_dns4, 491 &read_dns4,
491 listen_socket4); 492 listen_socket4);
492 tc = GNUNET_SCHEDULER_get_task_context(); 493 tc = GNUNET_SCHEDULER_get_task_context ();
493 if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason)) 494 if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason))
494 return; /* shutdown? */ 495 return; /* shutdown? */
495 size = GNUNET_NETWORK_socket_recvfrom_amount(listen_socket4); 496 size = GNUNET_NETWORK_socket_recvfrom_amount (listen_socket4);
496 if (0 > size) 497 if (0 > size)
497 { 498 {
498 GNUNET_break(0); 499 GNUNET_break (0);
499 return; /* read error!? */ 500 return; /* read error!? */
500 } 501 }
501 { 502 {
502 char buf[size + 1]; 503 char buf[size + 1];
503 ssize_t sret; 504 ssize_t sret;
504 505
505 addrlen = sizeof(v4); 506 addrlen = sizeof(v4);
506 sret = GNUNET_NETWORK_socket_recvfrom(listen_socket4, 507 sret = GNUNET_NETWORK_socket_recvfrom (listen_socket4,
507 buf, 508 buf,
508 size + 1, 509 size + 1,
509 (struct sockaddr *)&v4, 510 (struct sockaddr *) &v4,
510 &addrlen); 511 &addrlen);
511 if (0 > sret) 512 if (0 > sret)
512 { 513 {
513 GNUNET_log_strerror(GNUNET_ERROR_TYPE_WARNING, 514 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
514 "recvfrom"); 515 "recvfrom");
515 return; 516 return;
516 } 517 }
517 GNUNET_break(size == sret); 518 GNUNET_break (size == sret);
518 handle_request(listen_socket4, 519 handle_request (listen_socket4,
519 &v4, 520 &v4,
520 addrlen, 521 addrlen,
521 buf, 522 buf,
522 size); 523 size);
523 } 524 }
524} 525}
525 526
@@ -530,49 +531,49 @@ read_dns4(void *cls)
530 * @param cls the 'listen_socket6' 531 * @param cls the 'listen_socket6'
531 */ 532 */
532static void 533static void
533read_dns6(void *cls) 534read_dns6 (void *cls)
534{ 535{
535 struct sockaddr_in6 v6; 536 struct sockaddr_in6 v6;
536 socklen_t addrlen; 537 socklen_t addrlen;
537 ssize_t size; 538 ssize_t size;
538 const struct GNUNET_SCHEDULER_TaskContext *tc; 539 const struct GNUNET_SCHEDULER_TaskContext *tc;
539 540
540 GNUNET_assert(listen_socket6 == cls); 541 GNUNET_assert (listen_socket6 == cls);
541 t6 = GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, 542 t6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
542 listen_socket6, 543 listen_socket6,
543 &read_dns6, 544 &read_dns6,
544 listen_socket6); 545 listen_socket6);
545 tc = GNUNET_SCHEDULER_get_task_context(); 546 tc = GNUNET_SCHEDULER_get_task_context ();
546 if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason)) 547 if (0 == (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason))
547 return; /* shutdown? */ 548 return; /* shutdown? */
548 size = GNUNET_NETWORK_socket_recvfrom_amount(listen_socket6); 549 size = GNUNET_NETWORK_socket_recvfrom_amount (listen_socket6);
549 if (0 > size) 550 if (0 > size)
550 { 551 {
551 GNUNET_break(0); 552 GNUNET_break (0);
552 return; /* read error!? */ 553 return; /* read error!? */
553 } 554 }
554 { 555 {
555 char buf[size]; 556 char buf[size];
556 ssize_t sret; 557 ssize_t sret;
557 558
558 addrlen = sizeof(v6); 559 addrlen = sizeof(v6);
559 sret = GNUNET_NETWORK_socket_recvfrom(listen_socket6, 560 sret = GNUNET_NETWORK_socket_recvfrom (listen_socket6,
560 buf, 561 buf,
561 size, 562 size,
562 (struct sockaddr *)&v6, 563 (struct sockaddr *) &v6,
563 &addrlen); 564 &addrlen);
564 if (0 > sret) 565 if (0 > sret)
565 { 566 {
566 GNUNET_log_strerror(GNUNET_ERROR_TYPE_WARNING, 567 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
567 "recvfrom"); 568 "recvfrom");
568 return; 569 return;
569 } 570 }
570 GNUNET_break(size == sret); 571 GNUNET_break (size == sret);
571 handle_request(listen_socket6, 572 handle_request (listen_socket6,
572 &v6, 573 &v6,
573 addrlen, 574 addrlen,
574 buf, 575 buf,
575 size); 576 size);
576 } 577 }
577} 578}
578 579
@@ -586,150 +587,150 @@ read_dns6(void *cls)
586 * @param c configuration 587 * @param c configuration
587 */ 588 */
588static void 589static void
589run(void *cls, 590run (void *cls,
590 char *const *args, 591 char *const *args,
591 const char *cfgfile, 592 const char *cfgfile,
592 const struct GNUNET_CONFIGURATION_Handle *c) 593 const struct GNUNET_CONFIGURATION_Handle *c)
593{ 594{
594 char *addr_str; 595 char *addr_str;
595 596
596 (void)cls; 597 (void) cls;
597 (void)args; 598 (void) args;
598 (void)cfgfile; 599 (void) cfgfile;
599 cfg = c; 600 cfg = c;
600 if (NULL == dns_ip) 601 if (NULL == dns_ip)
601 { 602 {
602 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 603 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
603 _("No DNS server specified!\n")); 604 _ ("No DNS server specified!\n"));
604 return;
605 }
606 GNUNET_SCHEDULER_add_shutdown(&do_shutdown,
607 NULL);
608 if (NULL == (gns = GNUNET_GNS_connect(cfg)))
609 return; 605 return;
610 GNUNET_assert(NULL != (dns_stub = GNUNET_DNSSTUB_start(128))); 606 }
607 GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
608 NULL);
609 if (NULL == (gns = GNUNET_GNS_connect (cfg)))
610 return;
611 GNUNET_assert (NULL != (dns_stub = GNUNET_DNSSTUB_start (128)));
611 if (GNUNET_OK != 612 if (GNUNET_OK !=
612 GNUNET_DNSSTUB_add_dns_ip(dns_stub, 613 GNUNET_DNSSTUB_add_dns_ip (dns_stub,
613 dns_ip)) 614 dns_ip))
614 { 615 {
615 GNUNET_DNSSTUB_stop(dns_stub); 616 GNUNET_DNSSTUB_stop (dns_stub);
616 GNUNET_GNS_disconnect(gns); 617 GNUNET_GNS_disconnect (gns);
617 gns = NULL; 618 gns = NULL;
618 return; 619 return;
619 } 620 }
620 621
621 /* Get address to bind to */ 622 /* Get address to bind to */
622 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(c, "dns2gns", 623 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (c, "dns2gns",
623 "BIND_TO", 624 "BIND_TO",
624 &addr_str)) 625 &addr_str))
625 { 626 {
626 //No address specified 627 // No address specified
627 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 628 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
628 "Don't know what to bind to...\n"); 629 "Don't know what to bind to...\n");
629 GNUNET_free(addr_str); 630 GNUNET_free (addr_str);
630 GNUNET_SCHEDULER_shutdown(); 631 GNUNET_SCHEDULER_shutdown ();
631 return; 632 return;
632 } 633 }
633 if (1 != inet_pton(AF_INET, addr_str, &address)) 634 if (1 != inet_pton (AF_INET, addr_str, &address))
634 { 635 {
635 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 636 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
636 "Unable to parse address %s\n", 637 "Unable to parse address %s\n",
637 addr_str); 638 addr_str);
638 GNUNET_free(addr_str); 639 GNUNET_free (addr_str);
639 GNUNET_SCHEDULER_shutdown(); 640 GNUNET_SCHEDULER_shutdown ();
640 return; 641 return;
641 } 642 }
642 GNUNET_free(addr_str); 643 GNUNET_free (addr_str);
643 /* Get address to bind to */ 644 /* Get address to bind to */
644 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(c, "dns2gns", 645 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (c, "dns2gns",
645 "BIND_TO6", 646 "BIND_TO6",
646 &addr_str)) 647 &addr_str))
647 { 648 {
648 //No address specified 649 // No address specified
649 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 650 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
650 "Don't know what to bind6 to...\n"); 651 "Don't know what to bind6 to...\n");
651 GNUNET_free(addr_str); 652 GNUNET_free (addr_str);
652 GNUNET_SCHEDULER_shutdown(); 653 GNUNET_SCHEDULER_shutdown ();
653 return; 654 return;
654 } 655 }
655 if (1 != inet_pton(AF_INET6, addr_str, &address6)) 656 if (1 != inet_pton (AF_INET6, addr_str, &address6))
656 { 657 {
657 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 658 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
658 "Unable to parse IPv6 address %s\n", 659 "Unable to parse IPv6 address %s\n",
659 addr_str); 660 addr_str);
660 GNUNET_free(addr_str); 661 GNUNET_free (addr_str);
661 GNUNET_SCHEDULER_shutdown(); 662 GNUNET_SCHEDULER_shutdown ();
662 return; 663 return;
663 } 664 }
664 GNUNET_free(addr_str); 665 GNUNET_free (addr_str);
665 666
666 listen_socket4 = GNUNET_NETWORK_socket_create(PF_INET, 667 listen_socket4 = GNUNET_NETWORK_socket_create (PF_INET,
667 SOCK_DGRAM, 668 SOCK_DGRAM,
668 IPPROTO_UDP); 669 IPPROTO_UDP);
669 if (NULL != listen_socket4) 670 if (NULL != listen_socket4)
670 { 671 {
671 struct sockaddr_in v4; 672 struct sockaddr_in v4;
672 673
673 memset(&v4, 0, sizeof(v4)); 674 memset (&v4, 0, sizeof(v4));
674 v4.sin_family = AF_INET; 675 v4.sin_family = AF_INET;
675 v4.sin_addr.s_addr = address; 676 v4.sin_addr.s_addr = address;
676#if HAVE_SOCKADDR_IN_SIN_LEN 677#if HAVE_SOCKADDR_IN_SIN_LEN
677 v4.sin_len = sizeof(v4); 678 v4.sin_len = sizeof(v4);
678#endif 679#endif
679 v4.sin_port = htons(listen_port); 680 v4.sin_port = htons (listen_port);
680 if (GNUNET_OK != 681 if (GNUNET_OK !=
681 GNUNET_NETWORK_socket_bind(listen_socket4, 682 GNUNET_NETWORK_socket_bind (listen_socket4,
682 (struct sockaddr *)&v4, 683 (struct sockaddr *) &v4,
683 sizeof(v4))) 684 sizeof(v4)))
684 { 685 {
685 GNUNET_log_strerror(GNUNET_ERROR_TYPE_ERROR, "bind"); 686 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
686 GNUNET_NETWORK_socket_close(listen_socket4); 687 GNUNET_NETWORK_socket_close (listen_socket4);
687 listen_socket4 = NULL; 688 listen_socket4 = NULL;
688 }
689 } 689 }
690 listen_socket6 = GNUNET_NETWORK_socket_create(PF_INET6, 690 }
691 SOCK_DGRAM, 691 listen_socket6 = GNUNET_NETWORK_socket_create (PF_INET6,
692 IPPROTO_UDP); 692 SOCK_DGRAM,
693 IPPROTO_UDP);
693 if (NULL != listen_socket6) 694 if (NULL != listen_socket6)
694 { 695 {
695 struct sockaddr_in6 v6; 696 struct sockaddr_in6 v6;
696 697
697 memset(&v6, 0, sizeof(v6)); 698 memset (&v6, 0, sizeof(v6));
698 v6.sin6_family = AF_INET6; 699 v6.sin6_family = AF_INET6;
699 v6.sin6_addr = address6; 700 v6.sin6_addr = address6;
700#if HAVE_SOCKADDR_IN_SIN_LEN 701#if HAVE_SOCKADDR_IN_SIN_LEN
701 v6.sin6_len = sizeof(v6); 702 v6.sin6_len = sizeof(v6);
702#endif 703#endif
703 v6.sin6_port = htons(listen_port); 704 v6.sin6_port = htons (listen_port);
704 if (GNUNET_OK != 705 if (GNUNET_OK !=
705 GNUNET_NETWORK_socket_bind(listen_socket6, 706 GNUNET_NETWORK_socket_bind (listen_socket6,
706 (struct sockaddr *)&v6, 707 (struct sockaddr *) &v6,
707 sizeof(v6))) 708 sizeof(v6)))
708 { 709 {
709 GNUNET_log_strerror(GNUNET_ERROR_TYPE_ERROR, "bind"); 710 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
710 GNUNET_NETWORK_socket_close(listen_socket6); 711 GNUNET_NETWORK_socket_close (listen_socket6);
711 listen_socket6 = NULL; 712 listen_socket6 = NULL;
712 }
713 } 713 }
714 }
714 if ((NULL == listen_socket4) && 715 if ((NULL == listen_socket4) &&
715 (NULL == listen_socket6)) 716 (NULL == listen_socket6))
716 { 717 {
717 GNUNET_GNS_disconnect(gns); 718 GNUNET_GNS_disconnect (gns);
718 gns = NULL; 719 gns = NULL;
719 GNUNET_DNSSTUB_stop(dns_stub); 720 GNUNET_DNSSTUB_stop (dns_stub);
720 dns_stub = NULL; 721 dns_stub = NULL;
721 return; 722 return;
722 } 723 }
723 if (NULL != listen_socket4) 724 if (NULL != listen_socket4)
724 t4 = GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, 725 t4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
725 listen_socket4, 726 listen_socket4,
726 &read_dns4, 727 &read_dns4,
727 listen_socket4); 728 listen_socket4);
728 if (NULL != listen_socket6) 729 if (NULL != listen_socket6)
729 t6 = GNUNET_SCHEDULER_add_read_net(GNUNET_TIME_UNIT_FOREVER_REL, 730 t6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
730 listen_socket6, 731 listen_socket6,
731 &read_dns6, 732 &read_dns6,
732 listen_socket6); 733 listen_socket6);
733} 734}
734 735
735 736
@@ -741,39 +742,41 @@ run(void *cls,
741 * @return 0 ok, 1 on error 742 * @return 0 ok, 1 on error
742 */ 743 */
743int 744int
744main(int argc, 745main (int argc,
745 char *const *argv) 746 char *const *argv)
746{ 747{
747 struct GNUNET_GETOPT_CommandLineOption options[] = { 748 struct GNUNET_GETOPT_CommandLineOption options[] = {
748 GNUNET_GETOPT_option_string('d', 749 GNUNET_GETOPT_option_string ('d',
749 "dns", 750 "dns",
750 "IP", 751 "IP",
751 gettext_noop("IP of recursive DNS resolver to use (required)"), 752 gettext_noop (
752 &dns_ip), 753 "IP of recursive DNS resolver to use (required)"),
753 GNUNET_GETOPT_option_uint('p', 754 &dns_ip),
754 "port", 755 GNUNET_GETOPT_option_uint ('p',
755 "UDPPORT", 756 "port",
756 gettext_noop("UDP port to listen on for inbound DNS requests; default: 2853"), 757 "UDPPORT",
757 &listen_port), 758 gettext_noop (
759 "UDP port to listen on for inbound DNS requests; default: 2853"),
760 &listen_port),
758 GNUNET_GETOPT_OPTION_END 761 GNUNET_GETOPT_OPTION_END
759 }; 762 };
760 int ret; 763 int ret;
761 764
762 if (GNUNET_OK != 765 if (GNUNET_OK !=
763 GNUNET_STRINGS_get_utf8_args(argc, argv, 766 GNUNET_STRINGS_get_utf8_args (argc, argv,
764 &argc, &argv)) 767 &argc, &argv))
765 return 2; 768 return 2;
766 GNUNET_log_setup("gnunet-dns2gns", 769 GNUNET_log_setup ("gnunet-dns2gns",
767 "WARNING", 770 "WARNING",
768 NULL); 771 NULL);
769 ret = 772 ret =
770 (GNUNET_OK == 773 (GNUNET_OK ==
771 GNUNET_PROGRAM_run(argc, argv, 774 GNUNET_PROGRAM_run (argc, argv,
772 "gnunet-dns2gns", 775 "gnunet-dns2gns",
773 _("GNUnet DNS-to-GNS proxy (a DNS server)"), 776 _ ("GNUnet DNS-to-GNS proxy (a DNS server)"),
774 options, 777 options,
775 &run, NULL)) ? 0 : 1; 778 &run, NULL)) ? 0 : 1;
776 GNUNET_free((void*)argv); 779 GNUNET_free ((void*) argv);
777 return ret; 780 return ret;
778} 781}
779 782