]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
mbuffers: Add mbuffer_linearize.
authorJonathan Bastien-Filiatrault <joe@x2a.org>
Wed, 8 Sep 2010 22:34:43 +0000 (18:34 -0400)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 9 Sep 2010 06:34:58 +0000 (08:34 +0200)
Signed-off-by: Jonathan Bastien-Filiatrault <joe@x2a.org>
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
lib/gnutls_mbuffers.c
lib/gnutls_mbuffers.h

index 45c4b97f0d7c32009edc6a783411186e25176fa7..c9af21d9e1b27197b90c27867749c14a146a91a5 100644 (file)
@@ -272,3 +272,42 @@ _mbuffer_append_data (mbuffer_st *bufel, void* newdata, size_t newdata_size)
 
   return 0;
 }
+
+/* Takes a buffer in multiple chunks and puts all the data in a single
+ * contiguous segment.
+ *
+ * Returns 0 on success or an error code otherwise.
+ *
+ * Cost: O(n)
+ * n: number of segments initially in the buffer
+ */
+int
+_mbuffer_linearize (mbuffer_head_st *buf)
+{
+  mbuffer_st *bufel, *cur;
+  gnutls_datum_t msg;
+  size_t pos=0;
+
+  if (buf->length <= 1)
+    /* Nothing to do */
+    return 0;
+
+  bufel = _mbuffer_alloc (buf->byte_length, buf->byte_length);
+  if (!bufel) {
+    gnutls_assert ();
+    return GNUTLS_E_MEMORY_ERROR;
+  }
+
+  for (cur = _mbuffer_get_first(buf, &msg);
+       msg.data != NULL;
+       cur = _mbuffer_get_next(cur, &msg))
+    {
+      memcpy (&bufel->msg.data[pos], msg.data, cur->msg.size);
+      pos += cur->msg.size;
+    }
+
+  _mbuffer_clear (buf);
+  _mbuffer_enqueue (buf, bufel);
+
+  return 0;
+}
index ed94824826ce1d6c3a919291f2145c4467773a72..8f08a96f9c451eb537943261d34ba2132b9b9649 100644 (file)
@@ -40,6 +40,7 @@ mbuffer_st* _mbuffer_get_next (mbuffer_st * cur, gnutls_datum_t *msg);
  * one.
  */
 int _mbuffer_append_data (mbuffer_st *bufel, void* newdata, size_t newdata_size);
+int _mbuffer_linearize (mbuffer_head_st *buf);
 
 
 /* For "user" use. One can have buffer data and header.