+void
+pop_destroy (pop_t *pop)
+{
+ g_string_free (pop->buffer, TRUE);
+ g_string_free (pop->line, TRUE);
+ g_string_free (pop->push, TRUE);
+ if (pop->user)
+ g_free (pop->user);
+ g_slice_free (pop_t, (gpointer) pop);
+}
+
+static int
+pop_check_user (pop_t *pop)
+{
+ gchar *end;
+ gchar *s;
+ end = pop->line->str + pop->line->len;
+ s = pop->line->str;
+ while (s < end && *s == ' ') s++;
+ if (end - s < 5)
+ return -1;
+ if (g_ascii_strncasecmp (s, "USER ", 5) != 0)
+ return -1;
+ s += 5;
+ while (s < end && *s == ' ') s++;
+ if (s == end)
+ return -1;
+ end--;
+ while (end >= s && (*end == '\n' || *end == '\r')) end--;
+ if (end < s)
+ return -1;
+ if (pop->user)
+ g_free (pop->user);
+ pop->user = g_strndup (s, end - s + 2);
+ pop->user[end - s + 1] = 0;
+ return 0;
+}
+
+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;
+}
+