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);
}
gboolean
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;
}
void
hc_conn_close (HCConn *conn)
{
- g_source_remove (conn->watch);
conn->close (conn->layer);
- g_io_channel_unref (conn->channel);
g_slice_free (HCConn, conn);
}
typedef void (*HCClientFunc) (HCConn *, HCEvent, gpointer);
-HCConn * hc_conn_new (int, HCClientFunc, gpointer);
+HCConn * hc_conn_new (HCClientFunc, gpointer);
ssize_t hc_conn_read (HCConn *, char *, size_t);
void hc_conn_write (HCConn *, char *, size_t);
void hc_conn_close (HCConn *);
void hc_conn_set_callback (HCConn *, HCClientFunc, gpointer);
+void hc_conn_set_driver_channel (HCConn *, int);
+
#endif
static net_hook_t* null_server_hook_new (net_hook_t* client_hook, char *server)
{
net_hook_t* hook;
+ int fd;
hook = g_slice_new (net_hook_t);
hook->peer = client_hook;
hook->server = TRUE;
hook->close = null_close;
hook->read = null_read;
hook->data = NULL;
- hook->conn = hc_conn_new (hc_tcp_connect (server, "110"), nethook_event, hook);
+ hook->conn = hc_conn_new (nethook_event, hook);
+ fd = hc_tcp_connect (server, "110");
+ hc_conn_set_driver_channel (hook->conn, fd);
return hook;
}
ssl_server_hook_new (net_hook_t *client_hook, char *server, char *port)
{
net_hook_t *hook;
+ int fd;
hook = g_slice_new (net_hook_t);
hook->peer = client_hook;
hook->server = TRUE;
hook->close = ssl_server_close;
hook->read = ssl_server_read;
hook->data = ssl_data_new ();
- hook->conn = hc_conn_new (hc_tcp_connect (server, port), nethook_event, hook);
+ hook->conn = hc_conn_new (nethook_event, hook);
+ fd = hc_tcp_connect (server, port);
+ hc_conn_set_driver_channel (hook->conn, fd);
return hook;
}