aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-service-transport_clients.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-08-05 08:37:59 +0000
committerChristian Grothoff <christian@grothoff.org>2011-08-05 08:37:59 +0000
commit6d99e0c26d6cb6dc6e00f21b9a75327f30886f4f (patch)
tree542a78aa7f59ffd9208f517b14d49e3afeb03061 /src/transport/gnunet-service-transport_clients.c
parent3b289fa38ecb8b298efb43f3745c216092129fdc (diff)
downloadgnunet-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.c81
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 */
483static void
484transmit_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