X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=hcconn.c;h=479db927f174c976342762bc40870d9a5f8286d4;hb=d94d404ce54df23ce24cb7787e83b7747631b4af;hp=adfa4c467b71e13399d12a53c2650f93833a86c0;hpb=b80938c4aea5443143813339f6c524a3f97fc4f1;p=cascardo%2Frnetproxy.git diff --git a/hcconn.c b/hcconn.c index adfa4c4..479db92 100644 --- a/hcconn.c +++ b/hcconn.c @@ -62,25 +62,38 @@ hc_server_add_watch (int fd, hc_server_watch, cb, hc_server_cb_destroy); } +struct channel_layer +{ + GIOChannel *channel; + guint watch; +}; + + ssize_t hc_conn_channel_read (gpointer data, char *buffer, size_t len) { - int fd = g_io_channel_unix_get_fd ((GIOChannel *) data); + struct channel_layer *layer = data; + int fd = g_io_channel_unix_get_fd (layer->channel); return read (fd, buffer, len); } ssize_t hc_conn_channel_write (gpointer data, char *buffer, size_t len) { - int fd = g_io_channel_unix_get_fd ((GIOChannel *) data); + struct channel_layer *layer = data; + int fd = g_io_channel_unix_get_fd (layer->channel); return write (fd, buffer, len); } void hc_conn_channel_close (gpointer data) { - int fd = g_io_channel_unix_get_fd ((GIOChannel *) data); + struct channel_layer *layer = data; + int fd = g_io_channel_unix_get_fd (layer->channel); + g_source_remove (layer->watch); shutdown (fd, SHUT_RDWR); + g_io_channel_unref (layer->channel); + g_slice_free (struct channel_layer, layer); } gboolean @@ -93,22 +106,28 @@ hc_conn_watch (GIOChannel *channel, GIOCondition cond, gpointer data) return TRUE; } -HCConn * -hc_conn_new (int fd, HCClientFunc func, gpointer data) +void +hc_conn_set_driver_channel (HCConn *conn, int fd) { - HCConn *conn; - conn = g_slice_new (HCConn); - conn->channel = g_io_channel_unix_new (fd); - conn->func = func; - conn->data = data; - conn->layer = conn->channel; + struct channel_layer *layer = g_slice_new (struct channel_layer); + layer->channel = g_io_channel_unix_new (fd); + conn->layer = layer; conn->read = hc_conn_channel_read; conn->write = hc_conn_channel_write; conn->close = hc_conn_channel_close; - conn->watch = g_io_add_watch (conn->channel, G_IO_IN, hc_conn_watch, conn); + layer->watch = g_io_add_watch (layer->channel, G_IO_IN, hc_conn_watch, conn); if (conn->func) conn->func (conn, HC_EVENT_CONNECT, conn->data); fcntl (fd, F_SETFL, fcntl (fd, F_GETFL, 0) | O_NONBLOCK); +} + +HCConn * +hc_conn_new (HCClientFunc func, gpointer data) +{ + HCConn *conn; + conn = g_slice_new (HCConn); + conn->func = func; + conn->data = data; return conn; } @@ -136,7 +155,5 @@ void hc_conn_close (HCConn *conn) { conn->close (conn->layer); - g_source_remove (conn->watch); - g_io_channel_unref (conn->channel); g_slice_free (HCConn, conn); }