diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-08-05 08:37:59 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-08-05 08:37:59 +0000 |
commit | 6d99e0c26d6cb6dc6e00f21b9a75327f30886f4f (patch) | |
tree | 542a78aa7f59ffd9208f517b14d49e3afeb03061 /src/transport/gnunet-service-transport_clients.c | |
parent | 3b289fa38ecb8b298efb43f3745c216092129fdc (diff) | |
download | gnunet-6d99e0c26d6cb6dc6e00f21b9a75327f30886f4f.tar.gz gnunet-6d99e0c26d6cb6dc6e00f21b9a75327f30886f4f.zip |
use relative timeouts over network
Diffstat (limited to 'src/transport/gnunet-service-transport_clients.c')
-rw-r--r-- | src/transport/gnunet-service-transport_clients.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/transport/gnunet-service-transport_clients.c b/src/transport/gnunet-service-transport_clients.c index 2e345a9c0..1cf3d0959 100644 --- a/src/transport/gnunet-service-transport_clients.c +++ b/src/transport/gnunet-service-transport_clients.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include "gnunet-service-transport_clients.h" | 27 | #include "gnunet-service-transport_clients.h" |
28 | #include "gnunet-service-transport_hello.h" | 28 | #include "gnunet-service-transport_hello.h" |
29 | #include "gnunet-service-transport_neighbours.h" | 29 | #include "gnunet-service-transport_neighbours.h" |
30 | #include "gnunet-service-transport_plugins.h" | ||
30 | #include "gnunet-service-transport.h" | 31 | #include "gnunet-service-transport.h" |
31 | #include "transport.h" | 32 | #include "transport.h" |
32 | 33 | ||
@@ -473,6 +474,33 @@ GST_clients_handle_set_quota (void *cls, | |||
473 | 474 | ||
474 | 475 | ||
475 | /** | 476 | /** |
477 | * Take the given address and append it to the set of results sent back to | ||
478 | * the client. | ||
479 | * | ||
480 | * @param cls the transmission context used ('struct GNUNET_SERVER_TransmitContext*') | ||
481 | * @param address the resolved name, NULL to indicate the last response | ||
482 | */ | ||
483 | static void | ||
484 | transmit_address_to_client (void *cls, | ||
485 | const char *address) | ||
486 | { | ||
487 | struct GNUNET_SERVER_TransmitContext *tc = cls; | ||
488 | |||
489 | if (NULL == address) | ||
490 | { | ||
491 | GNUNET_SERVER_transmit_context_append_data (tc, NULL, 0, | ||
492 | GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY); | ||
493 | GNUNET_SERVER_transmit_context_run (tc, | ||
494 | GNUNET_TIME_UNIT_FOREVER_REL); | ||
495 | return; | ||
496 | } | ||
497 | GNUNET_SERVER_transmit_context_append_data (tc, | ||
498 | address, strlen (address) + 1, | ||
499 | GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY); | ||
500 | } | ||
501 | |||
502 | |||
503 | /** | ||
476 | * Client asked to resolve an address. Process the request. | 504 | * Client asked to resolve an address. Process the request. |
477 | * | 505 | * |
478 | * @param cls unused | 506 | * @param cls unused |
@@ -484,6 +512,59 @@ GST_clients_handle_address_lookup (void *cls, | |||
484 | struct GNUNET_SERVER_Client *client, | 512 | struct GNUNET_SERVER_Client *client, |
485 | const struct GNUNET_MessageHeader *message) | 513 | const struct GNUNET_MessageHeader *message) |
486 | { | 514 | { |
515 | const struct AddressLookupMessage *alum; | ||
516 | struct GNUNET_TRANSPORT_PluginFunctions *papi; | ||
517 | const char *plugin_name; | ||
518 | const char *address; | ||
519 | uint32_t address_len; | ||
520 | uint16_t size; | ||
521 | struct GNUNET_SERVER_TransmitContext *tc; | ||
522 | struct GNUNET_TIME_Relative rtimeout; | ||
523 | int32_t numeric; | ||
524 | |||
525 | size = ntohs (message->size); | ||
526 | if (size < sizeof (struct AddressLookupMessage)) | ||
527 | { | ||
528 | GNUNET_break (0); | ||
529 | GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); | ||
530 | return; | ||
531 | } | ||
532 | alum = (const struct AddressLookupMessage *) message; | ||
533 | address_len = ntohl (alum->addrlen); | ||
534 | if (size <= sizeof (struct AddressLookupMessage) + address_len) | ||
535 | { | ||
536 | GNUNET_break (0); | ||
537 | GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); | ||
538 | return; | ||
539 | } | ||
540 | address = (const char *) &alum[1]; | ||
541 | plugin_name = (const char *) &address[address_len]; | ||
542 | if (plugin_name | ||
543 | [size - sizeof (struct AddressLookupMessage) - address_len - 1] != '\0') | ||
544 | { | ||
545 | GNUNET_break (0); | ||
546 | GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); | ||
547 | return; | ||
548 | } | ||
549 | rtimeout = GNUNET_TIME_relative_ntoh (alum->timeout); | ||
550 | numeric = ntohl (alum->numeric_only); | ||
551 | papi = GST_plugins_find (plugin_name); | ||
552 | if (NULL == papi) | ||
553 | { | ||
554 | tc = GNUNET_SERVER_transmit_context_create (client); | ||
555 | GNUNET_SERVER_transmit_context_append_data (tc, NULL, 0, | ||
556 | GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY); | ||
557 | GNUNET_SERVER_transmit_context_run (tc, rtimeout); | ||
558 | return; | ||
559 | } | ||
560 | GNUNET_SERVER_disable_receive_done_warning (client); | ||
561 | tc = GNUNET_SERVER_transmit_context_create (client); | ||
562 | papi->address_pretty_printer (papi->cls, | ||
563 | plugin_name, | ||
564 | address, address_len, | ||
565 | numeric, | ||
566 | rtimeout, | ||
567 | &transmit_address_to_client, tc); | ||
487 | } | 568 | } |
488 | 569 | ||
489 | 570 | ||