summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsandmann <sandmann>2007-01-13 23:24:07 +0000
committersandmann <sandmann>2007-01-13 23:24:07 +0000
commit56ac8c38d5c6e4b63c97b5fcc568c300b76e1c8c (patch)
treea716988d4f62ac19aa5378656429b1a8a68d0c6d
parent7dddf7c049f8b0b5c89113d47f60e69ba9ed847a (diff)
Some lacbytequeue API fixes
-rw-r--r--src/lac.h40
-rw-r--r--src/lacaddress.c2
-rw-r--r--src/lacbytequeue.c129
-rw-r--r--src/lacconnection.c9
4 files changed, 105 insertions, 75 deletions
diff --git a/src/lac.h b/src/lac.h
index 00f436d..2ff1bc0 100644
--- a/src/lac.h
+++ b/src/lac.h
@@ -186,24 +186,28 @@ gchar * lac_gethostname (void);
/* LacByteQueue */
typedef struct LacByteQueue LacByteQueue;
-LacByteQueue *lac_byte_queue_new (void);
-guint8 *lac_byte_queue_free (LacByteQueue *queue,
- gboolean free_data);
-gsize lac_byte_queue_get_length (LacByteQueue *queue);
-const guint8 *lac_byte_queue_get_data (LacByteQueue *queue,
- gsize *n_bytes);
-void lac_byte_queue_put_back (LacByteQueue *queue,
- const guint8 *bytes,
- gsize n_bytes);
-void lac_byte_queue_append (LacByteQueue *queue,
- const guint8 *bytes,
- gsize n_bytes);
-guint8 *lac_byte_queue_alloc_tail (LacByteQueue *queue,
- gsize size);
-void lac_byte_queue_delete_tail (LacByteQueue *queue,
- gsize size);
-void lac_byte_queue_steal_data (LacByteQueue *dest,
- LacByteQueue *src);
+LacByteQueue *lac_byte_queue_new (void);
+guint8 *lac_byte_queue_free (LacByteQueue *queue,
+ gboolean free_data);
+gsize lac_byte_queue_get_length (LacByteQueue *queue);
+const guint8 *lac_byte_queue_peek_data (LacByteQueue *queue,
+ gsize *n_bytes);
+guint8 *lac_byte_queue_steal_data (LacByteQueue *queue,
+ gsize *n_bytes);
+guint8 *lac_byte_queue_alloc_tail (LacByteQueue *queue,
+ gsize size);
+void lac_byte_queue_append (LacByteQueue *queue,
+ const guint8 *bytes,
+ gsize n_bytes);
+void lac_byte_queue_append_printf (LacByteQueue *queue,
+ const gchar *fmt,
+ ...);
+void lac_byte_queue_transfer_data (LacByteQueue *dest,
+ LacByteQueue *src);
+void lac_byte_queue_delete_head (LacByteQueue *queue,
+ gsize size);
+void lac_byte_queue_delete_tail (LacByteQueue *queue,
+ gsize size);
/* TLS */
diff --git a/src/lacaddress.c b/src/lacaddress.c
index 0dba5ea..ca5c52b 100644
--- a/src/lacaddress.c
+++ b/src/lacaddress.c
@@ -514,7 +514,7 @@ lac_address_new_from_a_b_c_d (gchar a,
gchar d)
{
LacAddress *addr = lac_address_allocate ();
- gchar *addr_bytes = (guchar *)&(addr->in_address.s_addr);
+ guchar *addr_bytes = (guchar *)&(addr->in_address.s_addr);
addr_bytes[0] = a;
addr_bytes[1] = b;
diff --git a/src/lacbytequeue.c b/src/lacbytequeue.c
index e2cb53a..cac4d3e 100644
--- a/src/lacbytequeue.c
+++ b/src/lacbytequeue.c
@@ -1,4 +1,6 @@
+#include <stdarg.h>
#include <string.h>
+#include <glib/gprintf.h>
#include "lac.h"
struct LacByteQueue
@@ -48,9 +50,7 @@ lac_byte_queue_free (LacByteQueue *queue,
}
else
{
- memmove (queue->segment, queue->start, queue->end - queue->start);
-
- result = queue->segment;
+ result = lac_byte_queue_steal_data (queue, NULL);
}
g_free (queue);
@@ -59,39 +59,27 @@ lac_byte_queue_free (LacByteQueue *queue,
}
/* The data returned is owned by the byte queue and becomes invalid
- * as soon as any method is called on the queue. It is explicitly
- * allowed to push the returned data back into the queue, and indeed
- * in that case the queue will avoid copying if it can. The push
- * must be the first method called on the queue after the read.
+ * as soon as any method is called on the queue.
*/
const guint8 *
-lac_byte_queue_get_data (LacByteQueue *queue,
- gsize *n_bytes)
+lac_byte_queue_peek_data (LacByteQueue *queue,
+ gsize *n_bytes)
{
- const guint8 *result;
-
if (n_bytes)
*n_bytes = queue->end - queue->start;
-
- result = queue->start;
-
- queue->start = queue->segment;
- queue->end = queue->segment;
-
- if (!result)
- result = (guint8 *)""; /* the result of this function is guaranteed
- * to be NULL terminated
- */
-
- return result;
-}
-static gboolean
-in_segment (LacByteQueue *queue,
- const guint8 *bytes,
- gsize n_bytes)
-{
- return bytes >= queue->segment && bytes + n_bytes < queue->end;
+ if (queue->start)
+ {
+ return queue->start;
+ }
+ else
+ {
+ /* The result of this function is guaranteed
+ * to be NULL terminated, so if the queue is
+ * empty, just return an empty string;
+ */
+ return (guint8 *)"";
+ }
}
static gboolean
@@ -183,11 +171,21 @@ lac_byte_queue_alloc_tail (LacByteQueue *queue,
}
void
+lac_byte_queue_delete_head (LacByteQueue *queue,
+ gsize size)
+{
+ if (queue->end - queue->start < size)
+ queue->start = queue->end = queue->segment;
+ else
+ queue->start += size;
+}
+
+void
lac_byte_queue_delete_tail (LacByteQueue *queue,
gsize size)
{
if (queue->end - queue->start < size)
- queue->end = queue->start;
+ queue->start = queue->end = queue->segment;
else
queue->end -= size;
@@ -199,27 +197,57 @@ lac_byte_queue_append (LacByteQueue *queue,
const guint8 *bytes,
gsize n_bytes)
{
- if (in_segment (queue, bytes, n_bytes) && is_empty (queue))
- {
- queue->start = (guint8 *)bytes;
- queue->end = (guint8 *)bytes + n_bytes;
- }
- else
- {
- guint8 *tail = lac_byte_queue_alloc_tail (queue, n_bytes);
-
- memcpy (tail, bytes, n_bytes);
- }
+ guint8 *tail = lac_byte_queue_alloc_tail (queue, n_bytes);
+
+ memcpy (tail, bytes, n_bytes);
+}
- null_terminate (queue);
+void
+lac_byte_queue_append_printf (LacByteQueue *queue,
+ const gchar *fmt,
+ ...)
+{
+ gint required;
+ va_list args;
+ guint8 *buffer;
+
+ g_return_if_fail (fmt != NULL);
+
+ va_start (args, fmt);
+
+ required = g_vsnprintf (NULL, 0, fmt, args) + 1;
+
+ buffer = lac_byte_queue_alloc_tail (queue, required);
+
+ g_vsprintf ((gchar *)buffer, fmt, args);
+
+ va_end (args);
+}
+
+guint8 *
+lac_byte_queue_steal_data (LacByteQueue *queue,
+ gsize *n_bytes)
+{
+ guint8 *result;
+
+ if (n_bytes)
+ *n_bytes = queue->end - queue->start;
+
+ memmove (queue->segment, queue->start, queue->end - queue->start);
+
+ result = queue->segment;
+
+ initialize (queue);
+
+ return result;
}
/* Transfer data from @src to @dest, if possible without copying.
* The data is appended to @dest's data if @dest is not empty
*/
void
-lac_byte_queue_steal_data (LacByteQueue *dest,
- LacByteQueue *src)
+lac_byte_queue_transfer_data (LacByteQueue *dest,
+ LacByteQueue *src)
{
if (is_empty (dest))
{
@@ -235,10 +263,11 @@ lac_byte_queue_steal_data (LacByteQueue *dest,
}
else
{
- const guint8 *data;
- gsize size;
-
- data = lac_byte_queue_get_data (src, &size);
- lac_byte_queue_append (dest, data, size);
+ lac_byte_queue_append (dest, src->start, src->end - src->start);
+
+ if (src->segment)
+ g_free (src->segment);
+
+ initialize (src);
}
}
diff --git a/src/lacconnection.c b/src/lacconnection.c
index db095c9..cc8df99 100644
--- a/src/lacconnection.c
+++ b/src/lacconnection.c
@@ -262,17 +262,12 @@ lac_connection_do_writes (LacConnection *connection)
const guint8 *unwritten;
gsize len, sent;
- unwritten = lac_byte_queue_get_data (connection->unwritten, &len);
+ unwritten = lac_byte_queue_peek_data (connection->unwritten, &len);
sent = socket_send (connection->socket, unwritten, len, &err);
- lac_byte_queue_append (
- connection->unwritten, unwritten, err? len : len - sent);
-
if (err)
{
- lac_byte_queue_append (connection->unwritten, unwritten, len);
-
if (g_error_matches (
err, LAC_SOCKET_ERROR, LAC_SOCKET_ERROR_AGAIN))
{
@@ -288,6 +283,8 @@ lac_connection_do_writes (LacConnection *connection)
return;
}
+ lac_byte_queue_delete_head (connection->unwritten, sent);
+
/* FIXME check that we haven't used too much time? */
}