aboutsummaryrefslogtreecommitdiff
path: root/src/util/dnsstub.c
diff options
context:
space:
mode:
authorng0 <ng0@n0.is>2019-09-06 22:46:29 +0000
committerng0 <ng0@n0.is>2019-09-06 22:46:29 +0000
commit6e599264ad13e8fc105493d74d7c11d46f8739ed (patch)
tree169bef1ecbade5a659831fb169f3ae6943af127f /src/util/dnsstub.c
parent4f13bc15113021ebf71d5d81e99bc29f8a07fc9c (diff)
downloadgnunet-6e599264ad13e8fc105493d74d7c11d46f8739ed.tar.gz
gnunet-6e599264ad13e8fc105493d74d7c11d46f8739ed.zip
first step to remove plibc
Diffstat (limited to 'src/util/dnsstub.c')
-rw-r--r--src/util/dnsstub.c168
1 files changed, 63 insertions, 105 deletions
diff --git a/src/util/dnsstub.c b/src/util/dnsstub.c
index a16a9a7dd..aa0c2191a 100644
--- a/src/util/dnsstub.c
+++ b/src/util/dnsstub.c
@@ -28,7 +28,8 @@
28/** 28/**
29 * Timeout for retrying DNS queries. 29 * Timeout for retrying DNS queries.
30 */ 30 */
31#define DNS_RETRANSMIT_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 250) 31#define DNS_RETRANSMIT_DELAY \
32 GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 250)
32 33
33 34
34/** 35/**
@@ -92,7 +93,6 @@ struct GNUNET_DNSSTUB_RequestSocket
92 * Number of bytes in @a request. 93 * Number of bytes in @a request.
93 */ 94 */
94 size_t request_len; 95 size_t request_len;
95
96}; 96};
97 97
98 98
@@ -149,7 +149,6 @@ struct GNUNET_DNSSTUB_Context
149 * Length of @e sockets array. 149 * Length of @e sockets array.
150 */ 150 */
151 unsigned int num_sockets; 151 unsigned int num_sockets;
152
153}; 152};
154 153
155 154
@@ -223,13 +222,11 @@ open_socket (int af)
223 return NULL; 222 return NULL;
224 } 223 }
225 sa->sa_family = af; 224 sa->sa_family = af;
226 if (GNUNET_OK != GNUNET_NETWORK_socket_bind (ret, 225 if (GNUNET_OK != GNUNET_NETWORK_socket_bind (ret, sa, alen))
227 sa,
228 alen))
229 { 226 {
230 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 227 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
231 _("Could not bind to any port: %s\n"), 228 _ ("Could not bind to any port: %s\n"),
232 STRERROR (errno)); 229 strerror (errno));
233 GNUNET_NETWORK_socket_close (ret); 230 GNUNET_NETWORK_socket_close (ret);
234 return NULL; 231 return NULL;
235 } 232 }
@@ -249,7 +246,7 @@ get_request_socket (struct GNUNET_DNSSTUB_Context *ctx)
249{ 246{
250 struct GNUNET_DNSSTUB_RequestSocket *rs; 247 struct GNUNET_DNSSTUB_RequestSocket *rs;
251 248
252 for (unsigned int i=0;i<256;i++) 249 for (unsigned int i = 0; i < 256; i++)
253 { 250 {
254 rs = &ctx->sockets[GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, 251 rs = &ctx->sockets[GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
255 ctx->num_sockets)]; 252 ctx->num_sockets)];
@@ -259,9 +256,7 @@ get_request_socket (struct GNUNET_DNSSTUB_Context *ctx)
259 if (NULL != rs->rc) 256 if (NULL != rs->rc)
260 { 257 {
261 /* signal "failure" */ 258 /* signal "failure" */
262 rs->rc (rs->rc_cls, 259 rs->rc (rs->rc_cls, NULL, 0);
263 NULL,
264 0);
265 rs->rc = NULL; 260 rs->rc = NULL;
266 } 261 }
267 if (NULL != rs->read_task) 262 if (NULL != rs->read_task)
@@ -294,16 +289,14 @@ get_request_socket (struct GNUNET_DNSSTUB_Context *ctx)
294 */ 289 */
295static int 290static int
296do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs, 291do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
297 struct GNUNET_NETWORK_Handle *dnsout) 292 struct GNUNET_NETWORK_Handle *dnsout)
298{ 293{
299 struct GNUNET_DNSSTUB_Context *ctx = rs->ctx; 294 struct GNUNET_DNSSTUB_Context *ctx = rs->ctx;
300 ssize_t r; 295 ssize_t r;
301 int len; 296 int len;
302 297
303#ifndef MINGW 298#ifndef MINGW
304 if (0 != ioctl (GNUNET_NETWORK_get_fd (dnsout), 299 if (0 != ioctl (GNUNET_NETWORK_get_fd (dnsout), FIONREAD, &len))
305 FIONREAD,
306 &len))
307 { 300 {
308 /* conservative choice: */ 301 /* conservative choice: */
309 len = UINT16_MAX; 302 len = UINT16_MAX;
@@ -312,9 +305,7 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
312 /* port the code above? */ 305 /* port the code above? */
313 len = UINT16_MAX; 306 len = UINT16_MAX;
314#endif 307#endif
315 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 308 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Receiving %d byte DNS reply\n", len);
316 "Receiving %d byte DNS reply\n",
317 len);
318 { 309 {
319 unsigned char buf[len] GNUNET_ALIGN; 310 unsigned char buf[len] GNUNET_ALIGN;
320 int found; 311 int found;
@@ -323,18 +314,15 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
323 struct GNUNET_TUN_DnsHeader *dns; 314 struct GNUNET_TUN_DnsHeader *dns;
324 315
325 addrlen = sizeof (addr); 316 addrlen = sizeof (addr);
326 memset (&addr, 317 memset (&addr, 0, sizeof (addr));
327 0,
328 sizeof (addr));
329 r = GNUNET_NETWORK_socket_recvfrom (dnsout, 318 r = GNUNET_NETWORK_socket_recvfrom (dnsout,
330 buf, 319 buf,
331 sizeof (buf), 320 sizeof (buf),
332 (struct sockaddr*) &addr, 321 (struct sockaddr *) &addr,
333 &addrlen); 322 &addrlen);
334 if (-1 == r) 323 if (-1 == r)
335 { 324 {
336 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, 325 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "recvfrom");
337 "recvfrom");
338 GNUNET_NETWORK_socket_close (dnsout); 326 GNUNET_NETWORK_socket_close (dnsout);
339 return GNUNET_SYSERR; 327 return GNUNET_SYSERR;
340 } 328 }
@@ -343,8 +331,7 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
343 { 331 {
344 if (0 == memcmp (&addr, 332 if (0 == memcmp (&addr,
345 &ds->ss, 333 &ds->ss,
346 GNUNET_MIN (sizeof (struct sockaddr_storage), 334 GNUNET_MIN (sizeof (struct sockaddr_storage), addrlen)))
347 addrlen)))
348 { 335 {
349 found = GNUNET_YES; 336 found = GNUNET_YES;
350 break; 337 break;
@@ -353,26 +340,24 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
353 if (GNUNET_NO == found) 340 if (GNUNET_NO == found)
354 { 341 {
355 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 342 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
356 "Received DNS response from server we never asked (ignored)"); 343 "Received DNS response from server we never asked (ignored)");
357 return GNUNET_NO; 344 return GNUNET_NO;
358 } 345 }
359 if (sizeof (struct GNUNET_TUN_DnsHeader) > (size_t) r) 346 if (sizeof (struct GNUNET_TUN_DnsHeader) > (size_t) r)
360 { 347 {
361 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 348 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
362 _("Received DNS response that is too small (%u bytes)"), 349 _ ("Received DNS response that is too small (%u bytes)"),
363 (unsigned int) r); 350 (unsigned int) r);
364 return GNUNET_NO; 351 return GNUNET_NO;
365 } 352 }
366 dns = (struct GNUNET_TUN_DnsHeader *) buf; 353 dns = (struct GNUNET_TUN_DnsHeader *) buf;
367 if (NULL == rs->rc) 354 if (NULL == rs->rc)
368 { 355 {
369 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 356 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
370 "Request timeout or cancelled; ignoring reply\n"); 357 "Request timeout or cancelled; ignoring reply\n");
371 return GNUNET_NO; 358 return GNUNET_NO;
372 } 359 }
373 rs->rc (rs->rc_cls, 360 rs->rc (rs->rc_cls, dns, r);
374 dns,
375 r);
376 } 361 }
377 return GNUNET_OK; 362 return GNUNET_OK;
378} 363}
@@ -401,17 +386,16 @@ schedule_read (struct GNUNET_DNSSTUB_RequestSocket *rs)
401 GNUNET_SCHEDULER_cancel (rs->read_task); 386 GNUNET_SCHEDULER_cancel (rs->read_task);
402 rset = GNUNET_NETWORK_fdset_create (); 387 rset = GNUNET_NETWORK_fdset_create ();
403 if (NULL != rs->dnsout4) 388 if (NULL != rs->dnsout4)
404 GNUNET_NETWORK_fdset_set (rset, 389 GNUNET_NETWORK_fdset_set (rset, rs->dnsout4);
405 rs->dnsout4);
406 if (NULL != rs->dnsout6) 390 if (NULL != rs->dnsout6)
407 GNUNET_NETWORK_fdset_set (rset, 391 GNUNET_NETWORK_fdset_set (rset, rs->dnsout6);
408 rs->dnsout6); 392 rs->read_task =
409 rs->read_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, 393 GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
410 GNUNET_TIME_UNIT_FOREVER_REL, 394 GNUNET_TIME_UNIT_FOREVER_REL,
411 rset, 395 rset,
412 NULL, 396 NULL,
413 &read_response, 397 &read_response,
414 rs); 398 rs);
415 GNUNET_NETWORK_fdset_destroy (rset); 399 GNUNET_NETWORK_fdset_destroy (rset);
416} 400}
417 401
@@ -430,19 +414,13 @@ read_response (void *cls)
430 rs->read_task = NULL; 414 rs->read_task = NULL;
431 tc = GNUNET_SCHEDULER_get_task_context (); 415 tc = GNUNET_SCHEDULER_get_task_context ();
432 /* read and process ready sockets */ 416 /* read and process ready sockets */
433 if ( (NULL != rs->dnsout4) && 417 if ((NULL != rs->dnsout4) &&
434 (GNUNET_NETWORK_fdset_isset (tc->read_ready, 418 (GNUNET_NETWORK_fdset_isset (tc->read_ready, rs->dnsout4)) &&
435 rs->dnsout4)) && 419 (GNUNET_SYSERR == do_dns_read (rs, rs->dnsout4)))
436 (GNUNET_SYSERR ==
437 do_dns_read (rs,
438 rs->dnsout4)) )
439 rs->dnsout4 = NULL; 420 rs->dnsout4 = NULL;
440 if ( (NULL != rs->dnsout6) && 421 if ((NULL != rs->dnsout6) &&
441 (GNUNET_NETWORK_fdset_isset (tc->read_ready, 422 (GNUNET_NETWORK_fdset_isset (tc->read_ready, rs->dnsout6)) &&
442 rs->dnsout6)) && 423 (GNUNET_SYSERR == do_dns_read (rs, rs->dnsout6)))
443 (GNUNET_SYSERR ==
444 do_dns_read (rs,
445 rs->dnsout6)) )
446 rs->dnsout6 = NULL; 424 rs->dnsout6 = NULL;
447 /* re-schedule read task */ 425 /* re-schedule read task */
448 schedule_read (rs); 426 schedule_read (rs);
@@ -465,9 +443,8 @@ transmit_query (void *cls)
465 struct DnsServer *ds; 443 struct DnsServer *ds;
466 struct GNUNET_NETWORK_Handle *dnsout; 444 struct GNUNET_NETWORK_Handle *dnsout;
467 445
468 rs->retry_task = GNUNET_SCHEDULER_add_delayed (ctx->retry_freq, 446 rs->retry_task =
469 &transmit_query, 447 GNUNET_SCHEDULER_add_delayed (ctx->retry_freq, &transmit_query, rs);
470 rs);
471 ds = rs->ds_pos; 448 ds = rs->ds_pos;
472 rs->ds_pos = ds->next; 449 rs->ds_pos = ds->next;
473 if (NULL == rs->ds_pos) 450 if (NULL == rs->ds_pos)
@@ -499,22 +476,19 @@ transmit_query (void *cls)
499 "Unable to use configure DNS server, skipping\n"); 476 "Unable to use configure DNS server, skipping\n");
500 return; 477 return;
501 } 478 }
502 if (GNUNET_SYSERR == 479 if (GNUNET_SYSERR == GNUNET_NETWORK_socket_sendto (dnsout,
503 GNUNET_NETWORK_socket_sendto (dnsout, 480 rs->request,
504 rs->request, 481 rs->request_len,
505 rs->request_len, 482 sa,
506 sa, 483 salen))
507 salen))
508 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 484 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
509 _("Failed to send DNS request to %s: %s\n"), 485 _ ("Failed to send DNS request to %s: %s\n"),
510 GNUNET_a2s (sa, 486 GNUNET_a2s (sa, salen),
511 salen), 487 strerror (errno));
512 STRERROR (errno));
513 else 488 else
514 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 489 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
515 _("Sent DNS request to %s\n"), 490 _ ("Sent DNS request to %s\n"),
516 GNUNET_a2s (sa, 491 GNUNET_a2s (sa, salen));
517 salen));
518 schedule_read (rs); 492 schedule_read (rs);
519} 493}
520 494
@@ -531,10 +505,10 @@ transmit_query (void *cls)
531 */ 505 */
532struct GNUNET_DNSSTUB_RequestSocket * 506struct GNUNET_DNSSTUB_RequestSocket *
533GNUNET_DNSSTUB_resolve (struct GNUNET_DNSSTUB_Context *ctx, 507GNUNET_DNSSTUB_resolve (struct GNUNET_DNSSTUB_Context *ctx,
534 const void *request, 508 const void *request,
535 size_t request_len, 509 size_t request_len,
536 GNUNET_DNSSTUB_ResultCallback rc, 510 GNUNET_DNSSTUB_ResultCallback rc,
537 void *rc_cls) 511 void *rc_cls)
538{ 512{
539 struct GNUNET_DNSSTUB_RequestSocket *rs; 513 struct GNUNET_DNSSTUB_RequestSocket *rs;
540 514
@@ -553,11 +527,9 @@ GNUNET_DNSSTUB_resolve (struct GNUNET_DNSSTUB_Context *ctx,
553 rs->ds_pos = ctx->dns_head; 527 rs->ds_pos = ctx->dns_head;
554 rs->rc = rc; 528 rs->rc = rc;
555 rs->rc_cls = rc_cls; 529 rs->rc_cls = rc_cls;
556 rs->request = GNUNET_memdup (request, 530 rs->request = GNUNET_memdup (request, request_len);
557 request_len);
558 rs->request_len = request_len; 531 rs->request_len = request_len;
559 rs->retry_task = GNUNET_SCHEDULER_add_now (&transmit_query, 532 rs->retry_task = GNUNET_SCHEDULER_add_now (&transmit_query, rs);
560 rs);
561 return rs; 533 return rs;
562} 534}
563 535
@@ -603,8 +575,8 @@ GNUNET_DNSSTUB_start (unsigned int num_sockets)
603 } 575 }
604 ctx = GNUNET_new (struct GNUNET_DNSSTUB_Context); 576 ctx = GNUNET_new (struct GNUNET_DNSSTUB_Context);
605 ctx->num_sockets = num_sockets; 577 ctx->num_sockets = num_sockets;
606 ctx->sockets = GNUNET_new_array (num_sockets, 578 ctx->sockets =
607 struct GNUNET_DNSSTUB_RequestSocket); 579 GNUNET_new_array (num_sockets, struct GNUNET_DNSSTUB_RequestSocket);
608 ctx->retry_freq = DNS_RETRANSMIT_DELAY; 580 ctx->retry_freq = DNS_RETRANSMIT_DELAY;
609 return ctx; 581 return ctx;
610} 582}
@@ -627,9 +599,7 @@ GNUNET_DNSSTUB_add_dns_ip (struct GNUNET_DNSSTUB_Context *ctx,
627 struct in6_addr i6; 599 struct in6_addr i6;
628 600
629 ds = GNUNET_new (struct DnsServer); 601 ds = GNUNET_new (struct DnsServer);
630 if (1 == inet_pton (AF_INET, 602 if (1 == inet_pton (AF_INET, dns_ip, &i4))
631 dns_ip,
632 &i4))
633 { 603 {
634 struct sockaddr_in *s4 = (struct sockaddr_in *) &ds->ss; 604 struct sockaddr_in *s4 = (struct sockaddr_in *) &ds->ss;
635 605
@@ -640,9 +610,7 @@ GNUNET_DNSSTUB_add_dns_ip (struct GNUNET_DNSSTUB_Context *ctx,
640 s4->sin_len = (u_char) sizeof (struct sockaddr_in); 610 s4->sin_len = (u_char) sizeof (struct sockaddr_in);
641#endif 611#endif
642 } 612 }
643 else if (1 == inet_pton (AF_INET6, 613 else if (1 == inet_pton (AF_INET6, dns_ip, &i6))
644 dns_ip,
645 &i6))
646 { 614 {
647 struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) &ds->ss; 615 struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) &ds->ss;
648 616
@@ -661,9 +629,7 @@ GNUNET_DNSSTUB_add_dns_ip (struct GNUNET_DNSSTUB_Context *ctx,
661 GNUNET_free (ds); 629 GNUNET_free (ds);
662 return GNUNET_SYSERR; 630 return GNUNET_SYSERR;
663 } 631 }
664 GNUNET_CONTAINER_DLL_insert (ctx->dns_head, 632 GNUNET_CONTAINER_DLL_insert (ctx->dns_head, ctx->dns_tail, ds);
665 ctx->dns_tail,
666 ds);
667 return GNUNET_OK; 633 return GNUNET_OK;
668} 634}
669 635
@@ -686,23 +652,17 @@ GNUNET_DNSSTUB_add_dns_sa (struct GNUNET_DNSSTUB_Context *ctx,
686 switch (sa->sa_family) 652 switch (sa->sa_family)
687 { 653 {
688 case AF_INET: 654 case AF_INET:
689 GNUNET_memcpy (&ds->ss, 655 GNUNET_memcpy (&ds->ss, sa, sizeof (struct sockaddr_in));
690 sa,
691 sizeof (struct sockaddr_in));
692 break; 656 break;
693 case AF_INET6: 657 case AF_INET6:
694 GNUNET_memcpy (&ds->ss, 658 GNUNET_memcpy (&ds->ss, sa, sizeof (struct sockaddr_in6));
695 sa,
696 sizeof (struct sockaddr_in6));
697 break; 659 break;
698 default: 660 default:
699 GNUNET_break (0); 661 GNUNET_break (0);
700 GNUNET_free (ds); 662 GNUNET_free (ds);
701 return GNUNET_SYSERR; 663 return GNUNET_SYSERR;
702 } 664 }
703 GNUNET_CONTAINER_DLL_insert (ctx->dns_head, 665 GNUNET_CONTAINER_DLL_insert (ctx->dns_head, ctx->dns_tail, ds);
704 ctx->dns_tail,
705 ds);
706 return GNUNET_OK; 666 return GNUNET_OK;
707} 667}
708 668
@@ -734,12 +694,10 @@ GNUNET_DNSSTUB_stop (struct GNUNET_DNSSTUB_Context *ctx)
734 694
735 while (NULL != (ds = ctx->dns_head)) 695 while (NULL != (ds = ctx->dns_head))
736 { 696 {
737 GNUNET_CONTAINER_DLL_remove (ctx->dns_head, 697 GNUNET_CONTAINER_DLL_remove (ctx->dns_head, ctx->dns_tail, ds);
738 ctx->dns_tail,
739 ds);
740 GNUNET_free (ds); 698 GNUNET_free (ds);
741 } 699 }
742 for (unsigned int i=0;i<ctx->num_sockets;i++) 700 for (unsigned int i = 0; i < ctx->num_sockets; i++)
743 cleanup_rs (&ctx->sockets[i]); 701 cleanup_rs (&ctx->sockets[i]);
744 GNUNET_free (ctx->sockets); 702 GNUNET_free (ctx->sockets);
745 GNUNET_free (ctx); 703 GNUNET_free (ctx);