+static ssize_t
+pop_read (gpointer data, gchar *buffer, size_t len)
+{
+ pop_t *pop = data;
+ int r;
+ if (len > pop->push->len)
+ {
+ r = pop->push->len;
+ memcpy (buffer, pop->push->str, r);
+ g_string_truncate (pop->push, 0);
+ }
+ else
+ {
+ r = len;
+ memcpy (buffer, pop->push->str, r);
+ g_string_erase (pop->push, 0, r);
+ }
+ return r;
+}
+
+static ssize_t
+pop_write (gpointer data, gchar *buffer, size_t len)
+{
+ pop_t *pop = data;
+ hc_conn_write (pop->lowconn, buffer, len);
+ return len;
+}
+
+static void
+pop_close (gpointer data)
+{
+ pop_t *pop = data;
+ hc_conn_close (pop->lowconn);
+ pop_destroy (pop);
+}
+
+int
+hc_conn_set_driver_pop (HCConn *conn, HCConn *lowconn)