From 2b10227932141f86d8bb5f0706bfe87b4c0a8bcf Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Wed, 10 Jun 2009 20:22:36 -0300 Subject: [PATCH] Read line by line from client and write it to server. Now, it is possible to look at a whole line in case we receive only part of it in a given TCP segment. --- pop.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/pop.c b/pop.c index 8de50f4..6c33235 100644 --- a/pop.c +++ b/pop.c @@ -29,14 +29,34 @@ typedef struct net_read orig_read; gpointer orig_data; GString *buffer; + GString *line; } pop_t; +static int +pop_getline (pop_t *pop) +{ + char * end; + size_t len; + if (pop->buffer->len == 0) + return -1; + end = memchr (pop->buffer->str, '\n', pop->buffer->len); + if (end == NULL) + return -1; + len = end - pop->buffer->str + 1; + g_string_truncate (pop->line, 0); + g_string_append_len (pop->line, pop->buffer->str, len); + g_string_erase (pop->buffer, 0, len); + return 0; +} + static void pop_read (net_hook_t *hook, gchar *buffer, size_t len) { pop_t *pop = hook->data; + g_string_append_len (pop->buffer, buffer, len); hook->data = pop->orig_data; - pop->orig_read (hook, buffer, len); + while (pop_getline (pop) == 0) + pop->orig_read (hook, pop->line->str, pop->line->len); hook->data = pop; } @@ -48,6 +68,7 @@ pop_hook_new (net_hook_t *layer) pop->orig_read = layer->read; pop->orig_data = layer->data; pop->buffer = g_string_sized_new (4096); + pop->line = g_string_sized_new (4096); layer->read = pop_read; layer->data = pop; return layer; @@ -58,6 +79,7 @@ pop_destroy (net_hook_t *hook) { pop_t *pop = hook->data; g_string_free (pop->buffer, TRUE); + g_string_free (pop->line, TRUE); hook->read = pop->orig_read; hook->data = pop->orig_data; g_slice_free (net_hook_t, (gpointer) pop); -- 2.20.1