gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r37474 - in gnunet/src: include transport


From: gnunet
Subject: [GNUnet-SVN] r37474 - in gnunet/src: include transport
Date: Thu, 7 Jul 2016 01:05:01 +0200

Author: grothoff
Date: 2016-07-07 01:05:01 +0200 (Thu, 07 Jul 2016)
New Revision: 37474

Modified:
   gnunet/src/include/gnunet_transport_service.h
   gnunet/src/transport/transport_api_address_to_string.c
Log:
converting GNUNET_TRANSPORT_address_to_string to MQ

Modified: gnunet/src/include/gnunet_transport_service.h
===================================================================
--- gnunet/src/include/gnunet_transport_service.h       2016-07-06 22:52:03 UTC 
(rev 37473)
+++ gnunet/src/include/gnunet_transport_service.h       2016-07-06 23:05:01 UTC 
(rev 37474)
@@ -399,10 +399,10 @@
 /**
  * Cancel request for address conversion.
  *
- * @param pic the context handle
+ * @param alc the context handle
  */
 void
-GNUNET_TRANSPORT_address_to_string_cancel (struct 
GNUNET_TRANSPORT_AddressToStringContext *pic);
+GNUNET_TRANSPORT_address_to_string_cancel (struct 
GNUNET_TRANSPORT_AddressToStringContext *alc);
 
 
 /* *********************** Monitoring ************************** */

Modified: gnunet/src/transport/transport_api_address_to_string.c
===================================================================
--- gnunet/src/transport/transport_api_address_to_string.c      2016-07-06 
22:52:03 UTC (rev 37473)
+++ gnunet/src/transport/transport_api_address_to_string.c      2016-07-06 
23:05:01 UTC (rev 37474)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2009-2014 GNUnet e.V.
+     Copyright (C) 2009-2014, 2016 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -48,7 +48,7 @@
   /**
    * Connection to the service.
    */
-  struct GNUNET_CLIENT_Connection *client;
+  struct GNUNET_MQ_Handle *mq;
 
 };
 
@@ -57,46 +57,59 @@
  * Function called with responses from the service.
  *
  * @param cls our `struct GNUNET_TRANSPORT_AddressToStringContext *`
- * @param msg NULL on timeout or error, otherwise presumably a
- *        message with the human-readable address
+ * @param msg message with the human-readable address
+ * @return #GNUNET_OK if message is well-formed
  */
-static void
-address_response_processor (void *cls,
-                            const struct GNUNET_MessageHeader *msg)
+static int
+check_reply (void *cls,
+             const struct AddressToStringResultMessage *atsm)
 {
-  struct GNUNET_TRANSPORT_AddressToStringContext *alucb = cls;
-  const struct AddressToStringResultMessage *atsm;
+  uint16_t size = ntohs (atsm->header.size) - sizeof (*atsm);
   const char *address;
-  uint16_t size;
   int result;
   uint32_t addr_len;
 
-  if (NULL == msg)
+  result = (int) ntohl (atsm->res);
+  addr_len = ntohl (atsm->addr_len);
+  if (GNUNET_SYSERR == result)
+    return GNUNET_OK;
+  if (0 == size)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Disconnected from transport, address resolution failed\n");
-    alucb->cb (alucb->cb_cls,
-               NULL,
-               GNUNET_SYSERR);
-    GNUNET_TRANSPORT_address_to_string_cancel (alucb);
-    return;
+    if (GNUNET_OK != result)
+    {
+      GNUNET_break (0);
+      return GNUNET_SYSERR;
+    }
+    return GNUNET_OK;
   }
-  GNUNET_break (ntohs (msg->type) ==
-                GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY);
-
-  size = ntohs (msg->size);
-  if (size < sizeof (struct AddressToStringResultMessage))
+  address = (const char *) &atsm[1];
+  if ( (addr_len > size) ||
+       (address[addr_len -1] != '\0') )
   {
+    /* invalid reply */
     GNUNET_break (0);
-    alucb->cb (alucb->cb_cls,
-               NULL,
-               GNUNET_SYSERR);
-    GNUNET_TRANSPORT_address_to_string_cancel (alucb);
-    return;
+    return GNUNET_SYSERR;
   }
-  atsm = (const struct AddressToStringResultMessage *) msg;
+  return GNUNET_OK;
+}
+
+
+/**
+ * Function called with responses from the service.
+ *
+ * @param cls our `struct GNUNET_TRANSPORT_AddressToStringContext *`
+ * @param msg message with the human-readable address
+ */
+static void
+handle_reply (void *cls,
+              const struct AddressToStringResultMessage *atsm)
+{
+  struct GNUNET_TRANSPORT_AddressToStringContext *alucb = cls;
+  uint16_t size = ntohs (atsm->header.size) - sizeof (*atsm);
+  const char *address;
+  int result;
+
   result = (int) ntohl (atsm->res);
-  addr_len = ntohl (atsm->addr_len);
   if (GNUNET_SYSERR == result)
   {
     /* expect more replies; as this is not the last
@@ -106,24 +119,10 @@
     alucb->cb (alucb->cb_cls,
                "",
                GNUNET_NO);
-    GNUNET_CLIENT_receive (alucb->client,
-                           &address_response_processor,
-                           alucb,
-                           GNUNET_TIME_UNIT_FOREVER_REL);
     return;
   }
-  if (size == (sizeof (struct AddressToStringResultMessage)))
+  if (0 == size)
   {
-    if (GNUNET_OK != result)
-    {
-      GNUNET_break (0);
-      alucb->cb (alucb->cb_cls,
-                 NULL,
-                 GNUNET_SYSERR);
-      GNUNET_CLIENT_disconnect (alucb->client);
-      GNUNET_free (alucb);
-      return;
-    }
     /* we are done (successfully, without communication errors) */
     alucb->cb (alucb->cb_cls,
                NULL,
@@ -132,23 +131,7 @@
     return;
   }
   address = (const char *) &atsm[1];
-  if ( (addr_len > (size - (sizeof (struct AddressToStringResultMessage)))) ||
-       (address[addr_len -1] != '\0') )
-  {
-    /* invalid reply */
-    GNUNET_break (0);
-    alucb->cb (alucb->cb_cls,
-               NULL,
-               GNUNET_SYSERR);
-    GNUNET_TRANSPORT_address_to_string_cancel (alucb);
-    return;
-  }
-  /* expect more replies */
-  GNUNET_CLIENT_receive (alucb->client,
-                         &address_response_processor,
-                         alucb,
-                         GNUNET_TIME_UNIT_FOREVER_REL);
-  /* return normal reply to caller */
+  /* return normal reply to caller, also expect more replies */
   alucb->cb (alucb->cb_cls,
              address,
              GNUNET_OK);
@@ -156,6 +139,30 @@
 
 
 /**
+ * Generic error handler, called with the appropriate
+ * error code and the same closure specified at the creation of
+ * the message queue.
+ * Not every message queue implementation supports an error handler.
+ *
+ * @param cls the `struct GNUNET_TRANSPORT_AddressToStringContext *`
+ * @param error error code
+ */
+static void
+mq_error_handler (void *cls,
+                  enum GNUNET_MQ_Error error)
+{
+  struct GNUNET_TRANSPORT_AddressToStringContext *alucb = cls;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Disconnected from transport, address resolution failed\n");
+  alucb->cb (alucb->cb_cls,
+             NULL,
+             GNUNET_SYSERR);
+  GNUNET_TRANSPORT_address_to_string_cancel (alucb);
+}
+
+
+/**
  * Convert a binary address into a human readable address.
  *
  * @param cfg configuration to use
@@ -175,39 +182,53 @@
                                     GNUNET_TRANSPORT_AddressToStringCallback 
aluc,
                                     void *aluc_cls)
 {
-  size_t len;
+  GNUNET_MQ_hd_var_size (reply,
+                         GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY,
+                         struct AddressToStringResultMessage);
+  struct GNUNET_TRANSPORT_AddressToStringContext *alc
+    = GNUNET_new (struct GNUNET_TRANSPORT_AddressToStringContext);
+  struct GNUNET_MQ_MessageHandler handlers[] = {
+    make_reply_handler (alc),
+    GNUNET_MQ_handler_end ()
+  };
   size_t alen;
   size_t slen;
   struct AddressLookupMessage *msg;
-  struct GNUNET_TRANSPORT_AddressToStringContext *alc;
-  struct GNUNET_CLIENT_Connection *client;
+  struct GNUNET_MQ_Envelope *env;
   char *addrbuf;
 
-  GNUNET_assert (NULL != address);
   alen = address->address_length;
   slen = strlen (address->transport_name) + 1;
-  len = sizeof (struct AddressLookupMessage) + alen + slen;
-  if (len >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
+  if ( (alen + slen >= GNUNET_SERVER_MAX_MESSAGE_SIZE
+        - sizeof (struct AddressLookupMessage)) ||
+       (alen >= GNUNET_SERVER_MAX_MESSAGE_SIZE) ||
+       (slen >= GNUNET_SERVER_MAX_MESSAGE_SIZE) )
   {
     GNUNET_break (0);
+    GNUNET_free (alc);
     return NULL;
   }
-  client = GNUNET_CLIENT_connect ("transport", cfg);
-  if (NULL == client)
+  alc->cb = aluc;
+  alc->cb_cls = aluc_cls;
+  alc->mq = GNUNET_CLIENT_connecT (cfg,
+                                   "transport",
+                                   handlers,
+                                   &mq_error_handler,
+                                   alc);
+  if (NULL == alc->mq)
   {
     GNUNET_break (0);
+    GNUNET_free (alc);
     return NULL;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              "Client %p tries to resolve for peer `%s' address plugin %s len 
%u\n",
-              client,
+              "Client tries to resolve for peer `%s' address plugin %s len 
%u\n",
               GNUNET_i2s (&address->peer),
               address->transport_name,
               (unsigned int) address->address_length);
-
-  msg = GNUNET_malloc (len);
-  msg->header.size = htons (len);
-  msg->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING);
+  env = GNUNET_MQ_msg_extra (msg,
+                             alen + slen,
+                             GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING);
   msg->numeric_only = htons ((int16_t) numeric);
   msg->addrlen = htons ((uint16_t) alen);
   msg->timeout = GNUNET_TIME_relative_hton (timeout);
@@ -218,18 +239,8 @@
   memcpy (&addrbuf[alen],
           address->transport_name,
           slen);
-  alc = GNUNET_new (struct GNUNET_TRANSPORT_AddressToStringContext);
-  alc->cb = aluc;
-  alc->cb_cls = aluc_cls;
-  alc->client = client;
-  GNUNET_assert (GNUNET_OK ==
-                 GNUNET_CLIENT_transmit_and_get_response (client,
-                                                          &msg->header,
-                                                          
GNUNET_TIME_UNIT_FOREVER_REL,
-                                                          GNUNET_YES,
-                                                          
&address_response_processor,
-                                                          alc));
-  GNUNET_free (msg);
+  GNUNET_MQ_send (alc->mq,
+                  env);
   return alc;
 }
 
@@ -237,15 +248,14 @@
 /**
  * Cancel request for address conversion.
  *
- * @param pic the context handle
+ * @param alc the context handle
  */
 void
-GNUNET_TRANSPORT_address_to_string_cancel (struct 
GNUNET_TRANSPORT_AddressToStringContext *pic)
+GNUNET_TRANSPORT_address_to_string_cancel (struct 
GNUNET_TRANSPORT_AddressToStringContext *alc)
 {
-  GNUNET_CLIENT_disconnect (pic->client);
-  GNUNET_free (pic);
+  GNUNET_MQ_destroy (alc->mq);
+  GNUNET_free (alc);
 }
 
 
-
 /* end of transport_api_address_to_string.c */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]