Handle ERROR event as a CLOSE one and use masks not case to test events.
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Mon, 20 Jul 2009 17:37:47 +0000 (14:37 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Mon, 20 Jul 2009 17:37:47 +0000 (14:37 -0300)
hcconn.c

index 0ba378a..af658ca 100644 (file)
--- 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)