Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_con


Modified Files:
      Tag: SPLIT
        ecore_con.c ecore_con_private.h 


Log Message:


thar be tcp/ip support in ecore_con now... you can connect to any machine to
any port.. anywhere or advertise a service on any port... and get clients
connecting... :) it works! only 1 things that really pisses me off.. the
blocking gethostbyname(). i don't like that one little bit. i might want to
add client count limits for services and disconnect error codes in disconnect
events etc. but that doesnt bother me like the blocking gethostbyname()



===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/Attic/ecore_con.c,v
retrieving revision 1.1.2.4
retrieving revision 1.1.2.5
diff -u -3 -r1.1.2.4 -r1.1.2.5
--- ecore_con.c 13 Mar 2003 06:12:50 -0000      1.1.2.4
+++ ecore_con.c 17 Mar 2003 07:33:57 -0000      1.1.2.5
@@ -12,6 +12,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <fcntl.h>
+#include <netdb.h>
 
 static void _ecore_con_server_free(Ecore_Con_Server *svr);
 static void _ecore_con_client_free(Ecore_Con_Client *cl);
@@ -89,6 +90,7 @@
                     const void *data)
 {
    Ecore_Con_Server   *svr;
+   struct sockaddr_in  socket_addr;
    struct sockaddr_un  socket_unix;
    struct linger       lin;
    char                buf[4096];
@@ -142,6 +144,26 @@
                                                    NULL, NULL);
        if (!svr->fd_handler) goto error;
      }
+   else if (type == ECORE_CON_REMOTE_SYSTEM)
+     {
+       svr->fd = socket(AF_INET, SOCK_STREAM, 0);
+       if (svr->fd < 0) goto error;
+       if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
+       if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+       lin.l_onoff = 1;
+       lin.l_linger = 100;
+       if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 
0) goto error;
+       socket_addr.sin_family = AF_INET;
+       socket_addr.sin_port = htons(port);
+       socket_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+       if (bind(svr->fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_in)) 
< 0) goto error;
+       if (listen(svr->fd, 4096) < 0) goto error;
+       svr->fd_handler = ecore_main_fd_handler_add(svr->fd,
+                                                   ECORE_FD_READ,
+                                                   _ecore_con_svr_handler, svr,
+                                                   NULL, NULL);
+       if (!svr->fd_handler) goto error;
+     }
    
    svr->name = strdup(name);
    if (!svr->name) goto error;
@@ -176,6 +198,7 @@
 {
    Ecore_Con_Server   *svr;
    struct sockaddr_un  socket_unix;
+   struct sockaddr_in  socket_addr;
    int                 curstate;
    char                buf[4096];
    
@@ -206,7 +229,7 @@
        if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) 
< 0) goto error;
        socket_unix.sun_family = AF_UNIX;
        strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
-       if (connect(svr->fd, (struct sockaddr *)&socket_unix, SUN_LEN(&socket_unix)) < 
0) goto error;
+       if (connect(svr->fd, (struct sockaddr *)&socket_unix, 
LENGTH_OF_SOCKADDR_UN(&socket_unix)) < 0) goto error;
        svr->path = strdup(buf);
        if (!svr->path) goto error;
        svr->fd_handler = ecore_main_fd_handler_add(svr->fd,
@@ -215,6 +238,38 @@
                                                    NULL, NULL);
        if (!svr->fd_handler) goto error;
      }
+   else if (type == ECORE_CON_REMOTE_SYSTEM)
+     {
+       struct hostent *he;
+       
+       /* FIXME: gethostbyname is blocking... */
+       if (!(he = gethostbyname(name))) goto error;
+       svr->fd = socket(AF_INET, SOCK_STREAM, 0);
+       if (svr->fd < 0) goto error;
+       if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
+       if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+       if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) 
< 0) goto error;
+       socket_addr.sin_family = AF_INET;
+       socket_addr.sin_port = htons(port);
+       memcpy((struct in_addr *)&socket_addr.sin_addr, 
+              he->h_addr, sizeof(struct in_addr));
+       if (connect(svr->fd, (struct sockaddr *)&socket_addr, sizeof(struct 
sockaddr_in)) < 0) 
+         {
+            if (errno != EINPROGRESS)
+              goto error;
+            svr->connecting = 1;
+            svr->fd_handler = ecore_main_fd_handler_add(svr->fd,
+                                                        ECORE_FD_READ | 
ECORE_FD_WRITE,
+                                                        _ecore_con_cl_handler, svr,
+                                                        NULL, NULL);
+         }
+       else
+         svr->fd_handler = ecore_main_fd_handler_add(svr->fd,
+                                                     ECORE_FD_READ,
+                                                     _ecore_con_cl_handler, svr,
+                                                     NULL, NULL);
+       if (!svr->fd_handler) goto error;
+     }
    
    svr->name = strdup(name);
    if (!svr->name) goto error;
@@ -358,7 +413,7 @@
    servers = _ecore_list_remove(servers, svr);
    while (svr->clients)
      _ecore_con_client_free((Ecore_Con_Client *)svr->clients);
-   unlink(svr->path);
+   if ((svr->created) && (svr->path)) unlink(svr->path);
    if (svr->fd >= 0) close(svr->fd);
    if (svr->name) free(svr->name);
    if (svr->path) free(svr->path);
@@ -460,7 +515,7 @@
                    }
                  if ((errno == EIO) ||  (errno == EBADF) || 
                      (errno == EPIPE) || (errno == EINVAL) || 
-                     (errno == ENOSPC))
+                     (errno == ENOSPC) || (num == 0)/* is num == 0 right? */)
                    {
                       /* we lost our server! */
                       Ecore_Con_Event_Server_Del *e;
@@ -487,7 +542,42 @@
          }
      }
    else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
-     _ecore_con_server_flush(svr);
+     {
+       if (svr->connecting)
+         {
+            int so_err;
+            socklen_t size;
+            
+            svr->connecting = 0;
+            so_err = 0;
+            size = sizeof(int);
+            if (getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, &so_err, &size) < 0) so_err 
= -1;
+            if (so_err != 0)
+              {
+                 /* we lost our server! */
+                 Ecore_Con_Event_Server_Del *e;
+                 
+                 e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
+                 if (e)
+                   {
+                      e->server = svr;
+                      ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
+                                      _ecore_con_event_server_del_free, NULL);
+                   }
+                 svr->dead = 1;
+                 ecore_main_fd_handler_del(svr->fd_handler);
+                 svr->fd_handler = NULL;
+                 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+                 return 1;
+              }
+            else
+              {
+                 if (!svr->buf)
+                   ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+              }
+         }
+       _ecore_con_server_flush(svr);
+     }
    return 1;
 }
 
@@ -508,6 +598,7 @@
             char buf[65536];
             int num;
             
+            errno = 0;
             num = read(cl->fd, buf, 65536);
             if (num < 1)
               {
@@ -527,7 +618,7 @@
                    }
                  if ((errno == EIO) ||  (errno == EBADF) || 
                      (errno == EPIPE) || (errno == EINVAL) || 
-                     (errno == ENOSPC))
+                     (errno == ENOSPC) || (num == 0)/* is num == 0 right? */)
                    {
                       /* we lost our client! */
                       Ecore_Con_Event_Client_Del *e;
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/Attic/ecore_con_private.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -3 -r1.1.2.2 -r1.1.2.3
--- ecore_con_private.h 13 Mar 2003 05:32:23 -0000      1.1.2.2
+++ ecore_con_private.h 17 Mar 2003 07:33:57 -0000      1.1.2.3
@@ -43,6 +43,7 @@
    unsigned char    *buf;
    char              dead : 1;
    char              created : 1;
+   char              connecting : 1;
 };
 
 #endif




-------------------------------------------------------
This SF.net email is sponsored by:Crypto Challenge is now open! 
Get cracking and register here for some mind boggling fun and 
the chance of winning an Apple iPod:
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0031en
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to