-remove async ecc key generation, not needed
[oweals/gnunet.git] / src / util / server_tc.c
index bffb892b17299afd9a70d888fb426a6d830feaab..f803af48cba988c64f624224577c7c312f63ed88 100644 (file)
@@ -33,6 +33,8 @@
 #include "gnunet_time_lib.h"
 
 
+#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
+
 
 /**
  * How much buffer space do we want to have at least
@@ -79,13 +81,12 @@ transmit_response (void *cls, size_t size, void *buf)
 {
   struct GNUNET_SERVER_TransmitContext *tc = cls;
   size_t msize;
-  if (buf == NULL)
-    {
-      GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR);
-      GNUNET_free_non_null (tc->buf);
-      GNUNET_free (tc);
-      return 0;
-    }
+
+  if (NULL == buf)
+  {
+    GNUNET_SERVER_transmit_context_destroy (tc, GNUNET_SYSERR);
+    return 0;
+  }
   if (tc->total - tc->off > size)
     msize = size;
   else
@@ -93,28 +94,26 @@ transmit_response (void *cls, size_t size, void *buf)
   memcpy (buf, &tc->buf[tc->off], msize);
   tc->off += msize;
   if (tc->total == tc->off)
-    {
-      GNUNET_SERVER_receive_done (tc->client, GNUNET_OK);
-      GNUNET_free_non_null (tc->buf);
-      GNUNET_free (tc);
-    }
+  {
+    GNUNET_SERVER_receive_done (tc->client, GNUNET_OK);
+    GNUNET_SERVER_client_drop (tc->client);
+    GNUNET_free_non_null (tc->buf);
+    GNUNET_free (tc);
+  }
   else
+  {
+    if (NULL ==
+        GNUNET_SERVER_notify_transmit_ready (tc->client,
+                                             GNUNET_MIN (MIN_BLOCK_SIZE,
+                                                         tc->total - tc->off),
+                                             GNUNET_TIME_absolute_get_remaining
+                                             (tc->timeout), &transmit_response,
+                                             tc))
     {
-      if (NULL == GNUNET_SERVER_notify_transmit_ready (tc->client,
-                                                       GNUNET_MIN
-                                                       (MIN_BLOCK_SIZE,
-                                                        tc->total - tc->off),
-                                                       GNUNET_TIME_absolute_get_remaining
-                                                       (tc->timeout),
-                                                       &transmit_response,
-                                                       tc))
-        {
-          GNUNET_break (0);
-          GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR);
-          GNUNET_free_non_null (tc->buf);
-          GNUNET_free (tc);
-        }
+      GNUNET_break (0);
+      GNUNET_SERVER_transmit_context_destroy (tc, GNUNET_SYSERR);
     }
+  }
   return msize;
 }
 
@@ -131,8 +130,9 @@ GNUNET_SERVER_transmit_context_create (struct GNUNET_SERVER_Client *client)
 {
   struct GNUNET_SERVER_TransmitContext *tc;
 
-  GNUNET_assert (client != NULL);
+  GNUNET_assert (NULL != client);
   tc = GNUNET_malloc (sizeof (struct GNUNET_SERVER_TransmitContext));
+  GNUNET_SERVER_client_keep (client);
   tc->client = client;
   return tc;
 }
@@ -149,9 +149,9 @@ GNUNET_SERVER_transmit_context_create (struct GNUNET_SERVER_Client *client)
  * @param type type of the message
  */
 void
-GNUNET_SERVER_transmit_context_append (struct GNUNET_SERVER_TransmitContext
-                                       *tc, const void *data, size_t length,
-                                       uint16_t type)
+GNUNET_SERVER_transmit_context_append_data (struct GNUNET_SERVER_TransmitContext
+                                            *tc, const void *data,
+                                            size_t length, uint16_t type)
 {
   struct GNUNET_MessageHeader *msg;
   size_t size;
@@ -168,6 +168,32 @@ GNUNET_SERVER_transmit_context_append (struct GNUNET_SERVER_TransmitContext
 }
 
 
+/**
+ * Append a message to the transmission context.
+ * All messages in the context will be sent by
+ * the transmit_context_run method.
+ *
+ * @param tc context to use
+ * @param msg message to append
+ */
+void
+GNUNET_SERVER_transmit_context_append_message (struct
+                                               GNUNET_SERVER_TransmitContext
+                                               *tc,
+                                               const struct GNUNET_MessageHeader
+                                               *msg)
+{
+  struct GNUNET_MessageHeader *m;
+  uint16_t size;
+
+  size = ntohs (msg->size);
+  tc->buf = GNUNET_realloc (tc->buf, tc->total + size);
+  m = (struct GNUNET_MessageHeader *) &tc->buf[tc->total];
+  tc->total += size;
+  memcpy (m, msg, size);
+}
+
+
 /**
  * Execute a transmission context.  If there is
  * an error in the transmission, the receive_done
@@ -187,12 +213,34 @@ GNUNET_SERVER_transmit_context_run (struct GNUNET_SERVER_TransmitContext *tc,
                                            GNUNET_MIN (MIN_BLOCK_SIZE,
                                                        tc->total), timeout,
                                            &transmit_response, tc))
-    {
-      GNUNET_break (0);
-      GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR);
-      GNUNET_free_non_null (tc->buf);
-      GNUNET_free (tc);
-    }
+  {
+    GNUNET_break (0);
+    GNUNET_SERVER_transmit_context_destroy (tc, GNUNET_SYSERR);
+  }
 }
 
+
+/**
+ * Destroy a transmission context. This function must not be called
+ * after 'GNUNET_SERVER_transmit_context_run'.
+ *
+ * @param tc transmission context to destroy
+ * @param success code to give to 'GNUNET_SERVER_receive_done' for
+ *        the client:  GNUNET_OK to keep the connection open and
+ *                          continue to receive
+ *                GNUNET_NO to close the connection (normal behavior)
+ *                GNUNET_SYSERR to close the connection (signal
+ *                          serious error)
+ */
+void
+GNUNET_SERVER_transmit_context_destroy (struct GNUNET_SERVER_TransmitContext
+                                        *tc, int success)
+{
+  GNUNET_SERVER_receive_done (tc->client, success);
+  GNUNET_SERVER_client_drop (tc->client);
+  GNUNET_free_non_null (tc->buf);
+  GNUNET_free (tc);
+}
+
+
 /* end of server_tc.c */