Read line by line from client and write it to server.
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Wed, 10 Jun 2009 23:22:36 +0000 (20:22 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Wed, 10 Jun 2009 23:22:36 +0000 (20:22 -0300)
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

diff --git a/pop.c b/pop.c
index 8de50f4..6c33235 100644 (file)
--- 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);