* ecore_con: improve error detection.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 7 Jun 2010 13:05:49 +0000 (13:05 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 7 Jun 2010 13:05:49 +0000 (13:05 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@49551 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_con/ecore_con.c

index 5a912e8..2df5522 100644 (file)
@@ -978,6 +978,8 @@ _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *net_info)
 static void
 _ecore_con_cb_udp_connect(void *data, Ecore_Con_Info *net_info)
 {
+   char test[INET6_ADDRSTRLEN];
+   char *tmp;
    Ecore_Con_Server   *svr;
    int                 curstate = 0;
    int                broadcast = 1;
@@ -1293,7 +1295,7 @@ _ecore_con_cl_udp_handler(void *data, Ecore_Fd_Handler *fd_handler)
 
        errno = 0;
        num = read(svr->fd, buf, 65536);
-       if (num > 0)
+       if (num >= 0)
         {
           if (!svr->delete_me)
             {
@@ -1318,6 +1320,15 @@ _ecore_con_cl_udp_handler(void *data, Ecore_Fd_Handler *fd_handler)
                 }
             }
         }
+       else
+        {
+          if ((errno == EIO) ||  (errno == EBADF) ||
+              (errno == EPIPE) || (errno == EINVAL) ||
+              (errno == ENOSPC) || (errno == ECONNREFUSED))
+            {
+               kill_server(svr);
+            }
+        }
      }
    else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
        _ecore_con_server_flush(svr);
@@ -1350,7 +1361,7 @@ _ecore_con_svr_udp_handler(void *data, Ecore_Fd_Handler *fd_handler)
        num = recvfrom(svr->fd, buf, sizeof(buf), MSG_DONTWAIT, (struct sockaddr*) &client_addr, &client_addr_len);
 #endif
 
-       if (num > 0)
+       if (num >= 0)
         {
           if (!svr->delete_me)
             {
@@ -1414,9 +1425,12 @@ _ecore_con_svr_udp_handler(void *data, Ecore_Fd_Handler *fd_handler)
                     }
                 }
             }
-          if ((errno == EIO) ||  (errno == EBADF) ||
+        }
+       else
+        {
+           if ((errno == EIO) ||  (errno == EBADF) ||
               (errno == EPIPE) || (errno == EINVAL) ||
-              (errno == ENOSPC) || (num == 0)/* is num == 0 right? */)
+              (errno == ENOSPC) || (errno == ECONNREFUSED))
             {
               if (!svr->delete_me)
                 {
@@ -1476,7 +1490,7 @@ _ecore_con_svr_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
               if (!(num = ecore_con_ssl_client_read(cl, buf, 65536)))
                 lost_client = 0;
 
-            if (num < 1)
+            if (num < 0)
               {
                  if (inbuf && !cl->delete_me)
                    {
@@ -1552,7 +1566,6 @@ _ecore_con_server_flush(Ecore_Con_Server *svr)
      count = write(svr->fd, svr->write_buf + svr->write_buf_offset, num);
    else
      count = ecore_con_ssl_server_write(svr, svr->write_buf + svr->write_buf_offset, num);
-
    if (count < 0)
      {
        /* we lost our server! */
@@ -1583,10 +1596,10 @@ _ecore_con_client_flush(Ecore_Con_Client *cl)
      count = write(cl->fd, cl->buf + cl->buf_offset, num);
    else
      count = ecore_con_ssl_client_write(cl, cl->buf + cl->buf_offset, num);
-   if (count < 1)
+   if (count < 0)
      {
        if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) ||
-           (errno == EINVAL) || (errno == ENOSPC))
+           (errno == EINVAL) || (errno == ENOSPC) || (errno == ECONNREFUSED))
          {
             if (!cl->delete_me)
               {