From d7294c8c99ac01d5871973ad8d5bfa7c92fe9889 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Fri, 3 Jul 2009 14:24:26 -0300 Subject: [PATCH] Handle other socket events and push them forward. Handle HUP event and the case where the other end has closed the connection and read returns 0. --- hcconn.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/hcconn.c b/hcconn.c index 3b2a890..3e3f52f 100644 --- a/hcconn.c +++ b/hcconn.c @@ -20,6 +20,7 @@ #include "hcconn.h" #include #include +#include #include "hcconn_internal.h" /* The server connection watch */ @@ -106,7 +107,26 @@ hc_conn_watch (GIOChannel *channel, GIOCondition cond, gpointer data) { 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; @@ -122,7 +142,8 @@ hc_conn_set_driver_channel (HCConn *conn, int fd) 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); -- 2.20.1