From 4bc777dcf6bedc0aa0cc81a71bfb0599c986e740 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Mon, 20 Jul 2009 14:37:47 -0300 Subject: [PATCH] Handle ERROR event as a CLOSE one and use masks not case to test events. --- hcconn.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/hcconn.c b/hcconn.c index 0ba378a..af658ca 100644 --- a/hcconn.c +++ b/hcconn.c @@ -111,21 +111,28 @@ hc_conn_watch (GIOChannel *channel, GIOCondition cond, gpointer data) int fd = g_io_channel_unix_get_fd (channel); char buffer; int r; - switch (cond) + if (cond & G_IO_IN) { - 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; + } + } + else if (cond & G_IO_HUP) + { event = HC_EVENT_CLOSE; - break; - default: + } + else if (cond & G_IO_ERR) + { + /* FIXME: create HC_EVENT_ERROR */ + event = HC_EVENT_CLOSE; + } + else + { /* 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); @@ -142,7 +149,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 | G_IO_HUP, + layer->watch = g_io_add_watch (layer->channel, + G_IO_IN | G_IO_HUP | G_IO_ERR, hc_conn_watch, conn); /* TODO: connection should be asynchronous so this could make sense */ if (conn->func) -- 2.20.1