diff options
author | sandmann <sandmann> | 2007-01-12 05:25:31 +0000 |
---|---|---|
committer | sandmann <sandmann> | 2007-01-12 05:25:31 +0000 |
commit | 6f97c690e85d3c9e7e6264059cb28bd4eaeefc69 (patch) | |
tree | ae45a3c5b6bff53a14b85cf0958facb0047cbe96 | |
parent | 81d6c3f502b896123a28e1daa4a891b69e8e1e71 (diff) |
Fix bug in lacbytequeue.c and port LacConnection to LacByteQueue
-rw-r--r-- | src/lacaddress.c | 2 | ||||
-rw-r--r-- | src/lacbytequeue.c | 8 | ||||
-rw-r--r-- | src/lacconnection.c | 47 |
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) { |