summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsandmann <sandmann>2007-01-12 05:25:31 +0000
committersandmann <sandmann>2007-01-12 05:25:31 +0000
commit6f97c690e85d3c9e7e6264059cb28bd4eaeefc69 (patch)
treeae45a3c5b6bff53a14b85cf0958facb0047cbe96
parent81d6c3f502b896123a28e1daa4a891b69e8e1e71 (diff)
Fix bug in lacbytequeue.c and port LacConnection to LacByteQueue
-rw-r--r--src/lacaddress.c2
-rw-r--r--src/lacbytequeue.c8
-rw-r--r--src/lacconnection.c47
3 files changed, 37 insertions, 20 deletions
diff --git a/src/lacaddress.c b/src/lacaddress.c
index 512b72b..0dba5ea 100644
--- a/src/lacaddress.c
+++ b/src/lacaddress.c
@@ -661,7 +661,7 @@ lac_address_to_string (const LacAddress *addr)
lac_address_get_in_addr (addr, &in_addr);
- addr_bytes = (gchar *)&(in_addr.s_addr);
+ addr_bytes = (guchar *)&(in_addr.s_addr);
return g_strdup_printf ("%d.%d.%d.%d",
addr_bytes[0], addr_bytes[1],
diff --git a/src/lacbytequeue.c b/src/lacbytequeue.c
index 16eaa6a..6761430 100644
--- a/src/lacbytequeue.c
+++ b/src/lacbytequeue.c
@@ -22,6 +22,12 @@ lac_byte_queue_new (void)
return queue;
}
+gsize
+lac_byte_queue_get_length (LacByteQueue *queue)
+{
+ return queue->end - queue->start;
+}
+
guint8 *
lac_byte_queue_free (LacByteQueue *queue,
gboolean free_data)
@@ -114,7 +120,7 @@ ensure_room (LacByteQueue *queue,
}
queue->start = queue->segment;
- queue->end = queue->start + new_data_size;
+ queue->end = queue->start + old_data_size;
}
}
diff --git a/src/lacconnection.c b/src/lacconnection.c
index d65c5a5..db095c9 100644
--- a/src/lacconnection.c
+++ b/src/lacconnection.c
@@ -36,7 +36,7 @@ static gboolean socket_connect (Socket *socket,
GError **err);
static gboolean socket_is_connected (Socket *socket);
static gint socket_send (Socket *socket,
- const gchar *msg,
+ const guint8 *msg,
guint len,
GError **err);
static gint socket_recv (Socket *socket,
@@ -81,7 +81,7 @@ struct _LacConnection {
GQueue * pending_events;
ConnectionState state;
- GString * unwritten;
+ LacByteQueue * unwritten;
gboolean has_fd;
gboolean write_shutdown;
@@ -256,16 +256,23 @@ lac_connection_do_writes (LacConnection *connection)
return;
}
- while (connection->unwritten->len > 0)
+ while (lac_byte_queue_get_length (connection->unwritten) > 0)
{
- GError *err = NULL;
+ GError *err = NULL;
+ const guint8 *unwritten;
+ gsize len, sent;
+
+ unwritten = lac_byte_queue_get_data (connection->unwritten, &len);
- gsize sent = socket_send (
- connection->socket,
- connection->unwritten->str, connection->unwritten->len, &err);
+ 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))
{
@@ -280,9 +287,7 @@ lac_connection_do_writes (LacConnection *connection)
g_error_free (err);
return;
}
-
- g_string_erase (connection->unwritten, 0, sent);
-
+
/* FIXME check that we haven't used too much time? */
}
@@ -410,7 +415,7 @@ lac_connection_new (const LacAddress *address,
connection->state = UNDEFINED;
connection->has_fd = FALSE;
- connection->unwritten = g_string_new ("");
+ connection->unwritten = lac_byte_queue_new ();
connection->write_shutdown = FALSE;
connection->in_emit_events = FALSE;
@@ -467,9 +472,9 @@ lac_connection_write (LacConnection *connection,
if (len == 0)
return;
- do_writes = (connection->unwritten->len == 0);
-
- g_string_append_len (connection->unwritten, (gchar *)data, len);
+ do_writes = (lac_byte_queue_get_length (connection->unwritten) == 0);
+
+ lac_byte_queue_append (connection->unwritten, data, len);
if (do_writes)
{
@@ -533,8 +538,8 @@ lac_connection_unref (LacConnection *connection)
lac_connection_discard_pending_events (connection);
g_queue_free (connection->pending_events);
-
- g_string_free (connection->unwritten, TRUE);
+
+ lac_byte_queue_free (connection->unwritten, TRUE);
if (connection->has_fd)
{
@@ -569,7 +574,7 @@ lac_connection_flush (LacConnection *connection)
{
connection->need_flush = TRUE;
- if (connection->unwritten->len == 0)
+ if (lac_byte_queue_get_length (connection->unwritten) == 0)
lac_connection_do_writes (connection);
}
@@ -698,6 +703,12 @@ override_writable (gpointer data)
set_normal_callbacks (socket);
}
+static gboolean
+lactls_needs_write (LacTLS *tls)
+{
+ return FALSE;
+}
+
static void
override_callbacks (Socket *socket,
LacWatchCallback func)
@@ -718,7 +729,7 @@ override_callbacks (Socket *socket,
static gint
socket_send (Socket *socket,
- const gchar *msg,
+ const guint8 *msg,
guint len,
GError **err)
{