#include "hcconn.h"
#include <unistd.h>
#include <fcntl.h>
+#include <sys/socket.h>
#include "hcconn_internal.h"
/* The server connection watch */
{
HCConn *conn = data;
/* TODO: What about other events, like closing? */
- HCEvent event = HC_EVENT_READ;
+ HCEvent event;
+ int fd = g_io_channel_unix_get_fd (channel);
+ char buffer;
+ int r;
+ switch (cond)
+ {
+ case G_IO_IN:
+ event = HC_EVENT_READ;
+ r = recv (fd, &buffer, 1, MSG_PEEK);
+ if (r == 0)
+ event = HC_EVENT_CLOSE;
+ break;
+ case G_IO_HUP:
+ event = HC_EVENT_CLOSE;
+ break;
+ default:
+ /* TODO: handle other conditions and create error event */
+ g_warning ("Received an unexpected IO condition.");
+ break;
+ }
if (conn->func)
conn->func (conn, event, conn->data);
return TRUE;
conn->write = hc_conn_channel_write;
conn->close = hc_conn_channel_close;
/* TODO: We must watch other events */
- layer->watch = g_io_add_watch (layer->channel, G_IO_IN, hc_conn_watch, conn);
+ layer->watch = g_io_add_watch (layer->channel, G_IO_IN | G_IO_HUP,
+ hc_conn_watch, conn);
/* TODO: connection should be asynchronous so this could make sense */
if (conn->func)
conn->func (conn, HC_EVENT_CONNECT, conn->data);