and no more segv's in ecore-con and ecore-ipc. see changelog.
[framework/uifw/ecore.git] / src / lib / ecore_ipc / ecore_ipc.c
index e5d8a73..54ee3ad 100644 (file)
@@ -1,7 +1,3 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
@@ -9,6 +5,7 @@
 #include <string.h>
 
 #ifdef HAVE_NETINET_IN_H
+# include <sys/types.h>
 # include <netinet/in.h>
 #endif
 
 # include <winsock2.h>
 #endif
 
-#include "Ecore.h"
-#include "ecore_private.h"
-#include "Ecore_Con.h"
-#include "ecore_ipc_private.h"
+#if USE_GNUTLS_OPENSSL
+# include <gnutls/openssl.h>
+#elif USE_OPENSSL
+# include <openssl/ssl.h>
+#endif
+
+#include <Ecore.h>
+#include <ecore_private.h>
+#include <Ecore_Con.h>
+
 #include "Ecore_Ipc.h"
+#include "ecore_ipc_private.h"
 
 #define DLT_ZERO   0
 #define DLT_ONE    1
@@ -41,7 +45,6 @@
 
 int _ecore_ipc_log_dom = -1;
 
-/* byte swappers - for dealing with big vs little endian machines */
 EAPI unsigned short
 _ecore_ipc_swap_16(unsigned short v)
 {
@@ -87,78 +90,78 @@ _ecore_ipc_dlt_int(int out, int prev, int *mode)
    /* 0 byte */
    if (out == 0)
      {
-       *mode = DLT_ZERO;
-       return 0;
+        *mode = DLT_ZERO;
+        return 0;
      }
    if (out == (int)0xffffffff)
      {
-       *mode = DLT_ONE;
-       return 0;
+        *mode = DLT_ONE;
+        return 0;
      }
    if (out == prev)
      {
-       *mode = DLT_SAME;
-       return 0;
+        *mode = DLT_SAME;
+        return 0;
      }
    if (out == prev << 1)
      {
-       *mode = DLT_SHL;
-       return 0;
+        *mode = DLT_SHL;
+        return 0;
      }
    if (out == prev >> 1)
      {
-       *mode = DLT_SHR;
-       return 0;
+        *mode = DLT_SHR;
+        return 0;
      }
    /* 1 byte */
    dlt = out - prev;
    if (!(dlt & 0xffffff00))
      {
-       *mode = DLT_ADD8;
-       return dlt & 0xff;
+        *mode = DLT_ADD8;
+        return dlt & 0xff;
      }
    dlt = prev - out;
    if (!(dlt & 0xffffff00))
      {
-       *mode = DLT_DEL8;
-       return dlt & 0xff;
+        *mode = DLT_DEL8;
+        return dlt & 0xff;
      }
    dlt = out - prev;
    if (!(dlt & 0x00ffffff))
      {
-       *mode = DLT_ADDU8;
-       return (dlt >> 24) & 0xff;
+        *mode = DLT_ADDU8;
+        return (dlt >> 24) & 0xff;
      }
    dlt = prev - out;
    if (!(dlt & 0x00ffffff))
      {
-       *mode = DLT_DELU8;
-       return (dlt >> 24) & 0xff;
+        *mode = DLT_DELU8;
+        return (dlt >> 24) & 0xff;
      }
    /* 2 byte */
    dlt = out - prev;
    if (!(dlt & 0xffff0000))
      {
-       *mode = DLT_ADD16;
-       return dlt & 0xffff;
+        *mode = DLT_ADD16;
+        return dlt & 0xffff;
      }
    dlt = prev - out;
    if (!(dlt & 0xffff0000))
      {
-       *mode = DLT_DEL16;
-       return dlt & 0xffff;
+        *mode = DLT_DEL16;
+        return dlt & 0xffff;
      }
    dlt = out - prev;
    if (!(dlt & 0x0000ffff))
      {
-       *mode = DLT_ADDU16;
-       return (dlt >> 16) & 0xffff;
+        *mode = DLT_ADDU16;
+        return (dlt >> 16) & 0xffff;
      }
    dlt = prev - out;
    if (!(dlt & 0x0000ffff))
      {
-       *mode = DLT_DELU16;
-       return (dlt >> 16) & 0xffff;
+        *mode = DLT_DELU16;
+        return (dlt >> 16) & 0xffff;
      }
    /* 4 byte */
    *mode = DLT_SET;
@@ -171,65 +174,65 @@ _ecore_ipc_ddlt_int(int in, int prev, int mode)
    switch (mode)
      {
       case DLT_ZERO:
-       return 0;
-       break;
+        return 0;
+        break;
       case DLT_ONE:
-       return 0xffffffff;
-       break;
+        return 0xffffffff;
+        break;
       case DLT_SAME:
-       return prev;
-       break;
+        return prev;
+        break;
       case DLT_SHL:
-       return prev << 1;
-       break;
+        return prev << 1;
+        break;
       case DLT_SHR:
-       return prev >> 1;
-       break;
+        return prev >> 1;
+        break;
       case DLT_ADD8:
-       return prev + in;
-       break;
+        return prev + in;
+        break;
       case DLT_DEL8:
-       return prev - in;
-       break;
+        return prev - in;
+        break;
       case DLT_ADDU8:
-       return prev + (in << 24);
-       break;
+        return prev + (in << 24);
+        break;
       case DLT_DELU8:
-       return prev - (in << 24);
-       break;
+        return prev - (in << 24);
+        break;
       case DLT_ADD16:
-       return prev + in;
-       break;
+        return prev + in;
+        break;
       case DLT_DEL16:
-       return prev - in;
-       break;
+        return prev - in;
+        break;
       case DLT_ADDU16:
-       return prev + (in << 16);
-       break;
+        return prev + (in << 16);
+        break;
       case DLT_DELU16:
-       return prev - (in << 16);
-       break;
+        return prev - (in << 16);
+        break;
       case DLT_SET:
-       return in;
-       break;
+        return in;
+        break;
       case DLT_R1:
-       return 0;
-       break;
+        return 0;
+        break;
       case DLT_R2:
-       return 0;
-       break;
+        return 0;
+        break;
       default:
-       break;
+        break;
      }
    return 0;
 }
 
-static int _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
 static void _ecore_ipc_event_client_add_free(void *data, void *ev);
 static void _ecore_ipc_event_client_del_free(void *data, void *ev);
 static void _ecore_ipc_event_client_data_free(void *data, void *ev);
@@ -267,7 +270,8 @@ ecore_ipc_init(void)
 
    if (++_ecore_ipc_init_count != 1)
      return _ecore_ipc_init_count;
-   _ecore_ipc_log_dom = eina_log_domain_register("EcoreIpc", ECORE_DEFAULT_LOG_COLOR);
+   _ecore_ipc_log_dom = eina_log_domain_register
+     ("ecore_ipc", ECORE_IPC_DEFAULT_LOG_COLOR);
    if(_ecore_ipc_log_dom < 0)
      {
        EINA_LOG_ERR("Impossible to create a log domain for the Ecore IPC module.");
@@ -284,17 +288,17 @@ ecore_ipc_init(void)
    ECORE_IPC_EVENT_SERVER_DATA = ecore_event_type_new();
 
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
-                                         _ecore_ipc_event_client_add, NULL);
+                                          _ecore_ipc_event_client_add, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
-                                         _ecore_ipc_event_client_del, NULL);
+                                          _ecore_ipc_event_client_del, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
-                                         _ecore_ipc_event_server_add, NULL);
+                                          _ecore_ipc_event_server_add, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
-                                         _ecore_ipc_event_server_del, NULL);
+                                          _ecore_ipc_event_server_del, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
-                                         _ecore_ipc_event_client_data, NULL);
+                                          _ecore_ipc_event_client_data, NULL);
    handler[i] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
-                                         _ecore_ipc_event_server_data, NULL);
+                                          _ecore_ipc_event_server_data, NULL);
    return _ecore_ipc_init_count;
 }
 
@@ -312,7 +316,10 @@ ecore_ipc_shutdown(void)
    if (--_ecore_ipc_init_count != 0)
      return _ecore_ipc_init_count;
 
-   while (servers) ecore_ipc_server_del(eina_list_data_get(servers));
+   Eina_List *l, *l2;
+   Ecore_Ipc_Server *svr;
+   EINA_LIST_FOREACH_SAFE(servers, l, l2, svr)
+     ecore_ipc_server_del(svr);
 
    for (i = 0; i < 6; i++)
      ecore_event_handler_del(handler[i]);
@@ -358,22 +365,22 @@ ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, cons
    switch (type)
      {
       case ECORE_IPC_LOCAL_USER:
-       svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
+        break;
       case ECORE_IPC_LOCAL_SYSTEM:
-       svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
+        break;
       case ECORE_IPC_REMOTE_SYSTEM:
-       svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
+        break;
       default:
-       free(svr);
-       return NULL;
+        free(svr);
+        return NULL;
      }
    if (!svr->server)
      {
-       free(svr);
-       return NULL;
+        free(svr);
+        return NULL;
      }
    svr->max_buf_size = 32 * 1024;
    svr->data = (void *)data;
@@ -414,22 +421,22 @@ ecore_ipc_server_connect(Ecore_Ipc_Type compl_type, char *name, int port, const
    switch (type)
      {
       case ECORE_IPC_LOCAL_USER:
-       svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
+        break;
       case ECORE_IPC_LOCAL_SYSTEM:
-       svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
+        break;
       case ECORE_IPC_REMOTE_SYSTEM:
-       svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
+        break;
       default:
-       free(svr);
-       return NULL;
+        free(svr);
+        return NULL;
      }
    if (!svr->server)
      {
-       free(svr);
-       return NULL;
+        free(svr);
+        return NULL;
      }
    svr->max_buf_size = -1;
    svr->data = (void *)data;
@@ -451,9 +458,9 @@ ecore_ipc_server_del(Ecore_Ipc_Server *svr)
 
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_del");
+        return NULL;
      }
    if (svr->delete_me) return NULL;
 
@@ -462,16 +469,16 @@ ecore_ipc_server_del(Ecore_Ipc_Server *svr)
    svr->delete_me = 1;
    if (svr->event_count == 0)
      {
-       Ecore_Ipc_Client *cl;
+        Ecore_Ipc_Client *cl;
 
-       EINA_LIST_FREE(svr->clients, cl)
-         ecore_ipc_client_del(cl);
-       ecore_con_server_del(svr->server);
-       servers = eina_list_remove(servers, svr);
+        EINA_LIST_FREE(svr->clients, cl)
+          ecore_ipc_client_del(cl);
+        ecore_con_server_del(svr->server);
+        servers = eina_list_remove(servers, svr);
 
-       if (svr->buf) free(svr->buf);
-       ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
-       free(svr);
+        if (svr->buf) free(svr->buf);
+        ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
+        free(svr);
      }
    return data;
 }
@@ -487,9 +494,9 @@ ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_data_get");
+        return NULL;
      }
    return svr->data;
 }
@@ -497,17 +504,17 @@ ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
 /**
  * Retrieves whether the given IPC server is currently connected.
  * @param   svr The given IPC server.
- * @return  @c 1 if the server is connected.  @c 0 otherwise.
+ * @return @c EINA_TRUE if the server is connected, @c EINA_FALSE otherwise.
  * @ingroup Ecore_IPC_Server_Group
  */
-EAPI int
+EAPI Eina_Bool
 ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_connected_get");
-       return 0;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_connected_get");
+        return EINA_FALSE;
      }
    return ecore_con_server_connected_get(svr->server);
 }
@@ -523,9 +530,9 @@ ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_clients_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_clients_get");
+        return NULL;
      }
    return svr->client_list;
 }
@@ -534,32 +541,32 @@ ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
    d = _ecore_ipc_dlt_int(msg._member, svr->prev.o._member, &md); \
    if (md >= DLT_SET) \
      { \
-       unsigned int v; \
-       unsigned char *dd; \
-       dd = (unsigned char *)&v; \
-       v = d; \
-       v = htonl(v); \
-       *(dat + s + 0) = dd[0]; \
-       *(dat + s + 1) = dd[1]; \
-       *(dat + s + 2) = dd[2]; \
-       *(dat + s + 3) = dd[3]; \
-       s += 4; \
+        unsigned int v; \
+        unsigned char *dd; \
+        dd = (unsigned char *)&v; \
+        v = d; \
+        v = htonl(v); \
+        *(dat + s + 0) = dd[0]; \
+        *(dat + s + 1) = dd[1]; \
+        *(dat + s + 2) = dd[2]; \
+        *(dat + s + 3) = dd[3]; \
+        s += 4; \
      } \
    else if (md >= DLT_ADD16) \
      { \
-       unsigned short v; \
-       unsigned char *dd; \
-       dd = (unsigned char *)&v; \
-       v = d; \
-       v = htons(v); \
-       *(dat + s + 0) = dd[0]; \
-       *(dat + s + 1) = dd[1]; \
-       s += 2; \
+        unsigned short v; \
+        unsigned char *dd; \
+        dd = (unsigned char *)&v; \
+        v = d; \
+        v = htons(v); \
+        *(dat + s + 0) = dd[0]; \
+        *(dat + s + 1) = dd[1]; \
+        s += 2; \
      } \
    else if (md >= DLT_ADD8) \
      { \
-       *(dat + s + 0) = (unsigned char)d; \
-       s += 1; \
+        *(dat + s + 0) = (unsigned char)d; \
+        s += 1; \
      }
 
 /**
@@ -591,9 +598,9 @@ ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int
 
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_send");
-       return 0;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_send");
+        return 0;
      }
    if (size < 0) size = 0;
    msg.major    = major;
@@ -650,9 +657,9 @@ ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_client_limit_set");
-       return;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_client_limit_set");
+        return;
      }
    ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients);
 }
@@ -669,9 +676,9 @@ ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_data_size_max_set");
-       return;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_data_size_max_set");
+        return;
      }
    svr->max_buf_size = size;
 }
@@ -688,9 +695,9 @@ ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_data_size_max_get");
-       return -1;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_data_size_max_get");
+        return -1;
      }
    return svr->max_buf_size;
 }
@@ -705,14 +712,14 @@ ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
  *          deletion for the @p svr object. If no IP is known NULL is returned.
  * @ingroup Ecore_Ipc_Server_Group
  */
-EAPI char *
+EAPI const char *
 ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_ip_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_ip_get");
+        return NULL;
      }
    return ecore_con_server_ip_get(svr->server);
 }
@@ -728,9 +735,9 @@ ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_server_flush");
-       return;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_server_flush");
+        return;
      }
    ecore_con_server_flush(svr->server);
 }
@@ -739,32 +746,32 @@ ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
    d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \
    if (md >= DLT_SET) \
      { \
-       unsigned int v; \
-       unsigned char *dd; \
-       dd = (unsigned char *)&v; \
-       v = d; \
-       v = htonl(v); \
-       *(dat + s + 0) = dd[0]; \
-       *(dat + s + 1) = dd[1]; \
-       *(dat + s + 2) = dd[2]; \
-       *(dat + s + 3) = dd[3]; \
-       s += 4; \
+        unsigned int v; \
+        unsigned char *dd; \
+        dd = (unsigned char *)&v; \
+        v = d; \
+        v = htonl(v); \
+        *(dat + s + 0) = dd[0]; \
+        *(dat + s + 1) = dd[1]; \
+        *(dat + s + 2) = dd[2]; \
+        *(dat + s + 3) = dd[3]; \
+        s += 4; \
      } \
    else if (md >= DLT_ADD16) \
      { \
-       unsigned short v; \
-       unsigned char *dd; \
-       dd = (unsigned char *)&v; \
-       v = d; \
-       v = htons(v); \
-       *(dat + s + 0) = dd[0]; \
-       *(dat + s + 1) = dd[1]; \
-       s += 2; \
+        unsigned short v; \
+        unsigned char *dd; \
+        dd = (unsigned char *)&v; \
+        v = d; \
+        v = htons(v); \
+        *(dat + s + 0) = dd[0]; \
+        *(dat + s + 1) = dd[1]; \
+        s += 2; \
      } \
    else if (md >= DLT_ADD8) \
      { \
-       *(dat + s) = (unsigned char)d; \
-       s += 1; \
+        *(dat + s) = (unsigned char)d; \
+        s += 1; \
      }
 
 /**
@@ -799,9 +806,9 @@ ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int r
 
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_send");
-       return 0;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_send");
+        return 0;
      }
    if (size < 0) size = 0;
    msg.major    = major;
@@ -842,9 +849,9 @@ ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_server_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_server_get");
+        return NULL;
      }
    return (ecore_con_server_data_get(ecore_con_client_server_get(cl->client)));
 }
@@ -864,21 +871,21 @@ ecore_ipc_client_del(Ecore_Ipc_Client *cl)
 
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_del");
+        return NULL;
      }
    data = cl->data;
    cl->data = NULL;
    cl->delete_me = 1;
    if (cl->event_count == 0)
      {
-       svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
-       ecore_con_client_del(cl->client);
-       svr->clients = eina_list_remove(svr->clients, cl);
-       if (cl->buf) free(cl->buf);
-       ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
-       free(cl);
+        svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
+        ecore_con_client_unref(cl->client);
+        svr->clients = eina_list_remove(svr->clients, cl);
+        if (cl->buf) free(cl->buf);
+        ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
+        free(cl);
      }
    return data;
 }
@@ -894,9 +901,9 @@ ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_data_set");
-       return;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_data_set");
+        return;
      }
    cl->data = (void *)data;
 }
@@ -912,9 +919,9 @@ ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_data_get");
+        return NULL;
      }
    return cl->data;
 }
@@ -922,7 +929,7 @@ ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
 /**
  * Sets the max data payload size for an Ipc message in bytes
  *
- * @param   client        The given client.
+ * @param   cl        The given client.
  * @param   size          The maximum data payload size in bytes.
  * @ingroup Ecore_Ipc_Client_Group
  */
@@ -931,18 +938,18 @@ ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_data_size_max_set");
-       return;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_data_size_max_set");
+        return;
      }
    cl->max_buf_size = size;
 }
 
 /**
- * Sets the max data payload size for an Ipc message in bytes
+ * Gets the max data payload size for an Ipc message in bytes
  *
  * @param   cl            The given client.
- * @param   size          The maximum data payload size in bytes.
+ * @return The maximum data payload size in bytes on success, @c -1 on failure.
  * @ingroup Ecore_Ipc_Client_Group
  */
 EAPI int
@@ -950,9 +957,9 @@ ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_data_size_max_get");
-       return -1;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_data_size_max_get");
+        return -1;
      }
    return cl->max_buf_size;
 }
@@ -964,17 +971,18 @@ ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
  * @return  A pointer to an internal string that contains the IP address of
  *          the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
  *          This string should not be modified or trusted to stay valid after
- *          deletion for the @p cl object. If no IP is known NULL is returned.
+ *          deletion for the @p cl object. If no IP is known @c NULL is
+ *          returned.
  * @ingroup Ecore_Ipc_Client_Group
  */
-EAPI char *
+EAPI const char *
 ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_ip_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_ip_get");
+        return NULL;
      }
    return ecore_con_client_ip_get(cl->client);
 }
@@ -990,9 +998,9 @@ ecore_ipc_client_flush(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_flush");
-       return;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_flush");
+        return;
      }
    ecore_con_client_flush(cl->client);
 }
@@ -1009,134 +1017,135 @@ ecore_ipc_ssl_available_get(void)
 }
 
 
-static int
+static Eina_Bool
 _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Add *e;
 
    e = ev;
-   if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Client *cl;
-       Ecore_Ipc_Server *svr;
-
-       cl = calloc(1, sizeof(Ecore_Ipc_Client));
-       if (!cl) return 0;
-       svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
-       ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
-       cl->client = e->client;
-       cl->max_buf_size = 32 * 1024;
-       ecore_con_client_data_set(cl->client, (void *)cl);
-       svr->clients = eina_list_append(svr->clients, cl);
-       svr->client_list = eina_list_append(svr->client_list, cl);
-       if (!cl->delete_me)
-         {
-            Ecore_Ipc_Event_Client_Add *e2;
-
-            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
-            if (e2)
-              {
+        Ecore_Ipc_Client *cl;
+        Ecore_Ipc_Server *svr;
+
+        cl = calloc(1, sizeof(Ecore_Ipc_Client));
+        if (!cl) return ECORE_CALLBACK_CANCEL;
+        svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
+        ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
+        cl->client = e->client;
+        ecore_con_client_ref(cl->client);
+        cl->max_buf_size = 32 * 1024;
+        ecore_con_client_data_set(cl->client, (void *)cl);
+        svr->clients = eina_list_append(svr->clients, cl);
+        svr->client_list = eina_list_append(svr->client_list, cl);
+        if (!cl->delete_me)
+          {
+             Ecore_Ipc_Event_Client_Add *e2;
+
+             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
+             if (e2)
+               {
                   cl->event_count++;
-                 e2->client = cl;
-                 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
-                                 _ecore_ipc_event_client_add_free, NULL);
-              }
-         }
+                  e2->client = cl;
+                  ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
+                                  _ecore_ipc_event_client_add_free, NULL);
+               }
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
-static int
+static Eina_Bool
 _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Del *e;
 
    e = ev;
-   if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Client *cl;
-
-       cl = ecore_con_client_data_get(e->client);
-         {
-            Ecore_Ipc_Event_Client_Del *e2;
-            Ecore_Ipc_Server *svr;
-
-            svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
-            svr->client_list = eina_list_remove(svr->client_list, cl);
-            if (!cl->delete_me)
-              {
-                 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
-                 if (e2)
-                   {
-                      cl->event_count++;
-                      e2->client = cl;
-                      ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
-                                      _ecore_ipc_event_client_del_free, NULL);
-                   }
-              }
-         }
+        Ecore_Ipc_Client *cl;
+
+        cl = ecore_con_client_data_get(e->client);
+          {
+             Ecore_Ipc_Event_Client_Del *e2;
+             Ecore_Ipc_Server *svr;
+
+             svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
+             svr->client_list = eina_list_remove(svr->client_list, cl);
+             if (!cl->delete_me)
+               {
+                  e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
+                  if (e2)
+                    {
+                       cl->event_count++;
+                       e2->client = cl;
+                       ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
+                                       _ecore_ipc_event_client_del_free, NULL);
+                    }
+               }
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
-static int
+static Eina_Bool
 _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Add *e;
 
    e = ev;
-   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Server *svr;
+        Ecore_Ipc_Server *svr;
 
-       svr = ecore_con_server_data_get(e->server);
-       if (!svr->delete_me)
-         {
-            Ecore_Ipc_Event_Server_Add *e2;
+        svr = ecore_con_server_data_get(e->server);
+        if (!svr->delete_me)
+          {
+             Ecore_Ipc_Event_Server_Add *e2;
 
-            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
-            if (e2)
-              {
+             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
+             if (e2)
+               {
                   svr->event_count++;
-                 e2->server = svr;
-                 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
-                                 _ecore_ipc_event_server_add_free, NULL);
-              }
-         }
+                  e2->server = svr;
+                  ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
+                                  _ecore_ipc_event_server_add_free, NULL);
+               }
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
-static int
+static Eina_Bool
 _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Del *e;
 
    e = ev;
-   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Server *svr;
+        Ecore_Ipc_Server *svr;
 
-       svr = ecore_con_server_data_get(e->server);
-       if (!svr->delete_me)
-         {
-            Ecore_Ipc_Event_Server_Del *e2;
+        svr = ecore_con_server_data_get(e->server);
+        if (!svr->delete_me)
+          {
+             Ecore_Ipc_Event_Server_Del *e2;
 
-            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
-            if (e2)
-              {
+             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
+             if (e2)
+               {
                   svr->event_count++;
-                 e2->server = svr;
-                 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
-                                 _ecore_ipc_event_server_del_free, NULL);
-              }
-         }
+                  e2->server = svr;
+                  ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
+                                  _ecore_ipc_event_server_del_free, NULL);
+               }
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
 #define CLSZ(_n) \
@@ -1149,186 +1158,186 @@ _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void
    md = ((head >> (4 * _n)) & 0xf); \
    if (md >= DLT_SET) \
      { \
-       unsigned int v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(cl->buf + offset + s + 0); \
-       dv[1] = *(cl->buf + offset + s + 1); \
-       dv[2] = *(cl->buf + offset + s + 2); \
-       dv[3] = *(cl->buf + offset + s + 3); \
-       d = (int)ntohl(v); \
-       s += 4; \
+        unsigned int v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(cl->buf + offset + s + 0); \
+        dv[1] = *(cl->buf + offset + s + 1); \
+        dv[2] = *(cl->buf + offset + s + 2); \
+        dv[3] = *(cl->buf + offset + s + 3); \
+        d = (int)ntohl(v); \
+        s += 4; \
      } \
    else if (md >= DLT_ADD16) \
      { \
-       unsigned short v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(cl->buf + offset + s + 0); \
-       dv[1] = *(cl->buf + offset + s + 1); \
-       d = (int)ntohs(v); \
-       s += 2; \
+        unsigned short v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(cl->buf + offset + s + 0); \
+        dv[1] = *(cl->buf + offset + s + 1); \
+        d = (int)ntohs(v); \
+        s += 2; \
      } \
    else if (md >= DLT_ADD8) \
      { \
-       unsigned char v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(cl->buf + offset + s + 0); \
-       d = (int)v; \
-       s += 1; \
+        unsigned char v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(cl->buf + offset + s + 0); \
+        d = (int)v; \
+        s += 1; \
      } \
    msg._member = _ecore_ipc_ddlt_int(d, cl->prev.i._member, md);
 
-static int
+static Eina_Bool
 _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Data *e;
 
    e = ev;
-   if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Client *cl;
-       Ecore_Ipc_Msg_Head msg;
-       int offset = 0;
-       unsigned char *buf;
-
-       cl = ecore_con_client_data_get(e->client);
-
-       if (!cl->buf)
-         {
-            cl->buf_size = e->size;
-            cl->buf = e->data;
-            e->data = NULL; /* take it out of the old event */
-         }
-       else
-         {
-            buf = realloc(cl->buf, cl->buf_size + e->size);
-            if (!buf)
-              {
-                 free(cl->buf);
-                 cl->buf = 0;
-                 cl->buf_size  = 0;
-                 return 0;
-              }
-            cl->buf = buf;
-            memcpy(cl->buf + cl->buf_size, e->data, e->size);
-            cl->buf_size += e->size;
-         }
-       /* examine header */
-       redo:
-       if ((cl->buf_size - offset) >= (int)sizeof(int))
-         {
-            int s, md, d = 0, head;
-            unsigned char *dd;
-
-            dd = (unsigned char *)&head;
-            dd[0] = *(cl->buf + offset + 0);
-            dd[1] = *(cl->buf + offset + 1);
-            dd[2] = *(cl->buf + offset + 2);
-            dd[3] = *(cl->buf + offset + 3);
-            head = ntohl(head);
-            dd = (unsigned char *)&d;
-            s = 4;
-            CLSZ(0);
-            CLSZ(1);
-            CLSZ(2);
-            CLSZ(3);
-            CLSZ(4);
-            CLSZ(5);
-            if ((cl->buf_size - offset) < s)
-              {
-                 if (offset > 0) goto scroll;
-                 return 0;
-              }
-
-            s = 4;
-            CLDEC(0, major);
-            CLDEC(1, minor);
-            CLDEC(2, ref);
-            CLDEC(3, ref_to);
-            CLDEC(4, response);
-            CLDEC(5, size);
-            if (msg.size < 0) msg.size = 0;
-            /* there is enough data in the buffer for a full message */
-            if ((cl->buf_size - offset) >= (s + msg.size))
-              {
-                 Ecore_Ipc_Event_Client_Data *e2;
-                 Ecore_Ipc_Server *svr;
-                 int max, max2;
-
-                 buf = NULL;
-                 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
-                 max = svr->max_buf_size;
-                 max2 = cl->max_buf_size;
-                 if ((max >= 0) && (max2 >= 0))
-                   {
-                      if (max2 < max) max = max2;
-                   }
-                 else
-                   {
-                      if (max < 0) max = max2;
-                   }
-                 if ((max < 0) || (msg.size <= max))
-                   {
-                      if (msg.size > 0)
-                        {
-                           buf = malloc(msg.size);
-                           if (!buf) return 0;
-                           memcpy(buf, cl->buf + offset + s, msg.size);
-                        }
-                      if (!cl->delete_me)
-                        {
-                           e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
-                           if (e2)
-                             {
-                                cl->event_count++;
-                                e2->client   = cl;
-                                e2->major    = msg.major;
-                                e2->minor    = msg.minor;
-                                e2->ref      = msg.ref;
-                                e2->ref_to   = msg.ref_to;
-                                e2->response = msg.response;
-                                e2->size     = msg.size;
-                                e2->data     = buf;
-                                ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
-                                                _ecore_ipc_event_client_data_free,
-                                                NULL);
-                             }
-                        }
-                   }
-                 cl->prev.i = msg;
-                 offset += (s + msg.size);
-                 if (cl->buf_size == offset)
-                   {
-                      free(cl->buf);
-                      cl->buf = NULL;
-                      cl->buf_size = 0;
-                      return 0;
-                   }
-                 goto redo;
-              }
-            else goto scroll;
-         }
-       else
-         {
-            scroll:
-            buf = malloc(cl->buf_size - offset);
-            if (!buf)
-              {
-                 free(cl->buf);
-                 cl->buf = NULL;
-                 cl->buf_size = 0;
-                 return 0;
-              }
-            memcpy(buf, cl->buf + offset, cl->buf_size - offset);
-            free(cl->buf);
-            cl->buf = buf;
-            cl->buf_size -= offset;
-         }
+        Ecore_Ipc_Client *cl;
+        Ecore_Ipc_Msg_Head msg;
+        int offset = 0;
+        unsigned char *buf;
+
+        cl = ecore_con_client_data_get(e->client);
+
+        if (!cl->buf)
+          {
+             cl->buf_size = e->size;
+             cl->buf = e->data;
+             e->data = NULL; /* take it out of the old event */
+          }
+        else
+          {
+             buf = realloc(cl->buf, cl->buf_size + e->size);
+             if (!buf)
+               {
+                  free(cl->buf);
+                  cl->buf = 0;
+                  cl->buf_size  = 0;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             cl->buf = buf;
+             memcpy(cl->buf + cl->buf_size, e->data, e->size);
+             cl->buf_size += e->size;
+          }
+        /* examine header */
+        redo:
+        if ((cl->buf_size - offset) >= (int)sizeof(int))
+          {
+             int s, md, d = 0, head;
+             unsigned char *dd;
+
+             dd = (unsigned char *)&head;
+             dd[0] = *(cl->buf + offset + 0);
+             dd[1] = *(cl->buf + offset + 1);
+             dd[2] = *(cl->buf + offset + 2);
+             dd[3] = *(cl->buf + offset + 3);
+             head = ntohl(head);
+             dd = (unsigned char *)&d;
+             s = 4;
+             CLSZ(0);
+             CLSZ(1);
+             CLSZ(2);
+             CLSZ(3);
+             CLSZ(4);
+             CLSZ(5);
+             if ((cl->buf_size - offset) < s)
+               {
+                  if (offset > 0) goto scroll;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+
+             s = 4;
+             CLDEC(0, major);
+             CLDEC(1, minor);
+             CLDEC(2, ref);
+             CLDEC(3, ref_to);
+             CLDEC(4, response);
+             CLDEC(5, size);
+             if (msg.size < 0) msg.size = 0;
+             /* there is enough data in the buffer for a full message */
+             if ((cl->buf_size - offset) >= (s + msg.size))
+               {
+                  Ecore_Ipc_Event_Client_Data *e2;
+                  Ecore_Ipc_Server *svr;
+                  int max, max2;
+
+                  buf = NULL;
+                  svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
+                  max = svr->max_buf_size;
+                  max2 = cl->max_buf_size;
+                  if ((max >= 0) && (max2 >= 0))
+                    {
+                       if (max2 < max) max = max2;
+                    }
+                  else
+                    {
+                       if (max < 0) max = max2;
+                    }
+                  if ((max < 0) || (msg.size <= max))
+                    {
+                       if (msg.size > 0)
+                         {
+                            buf = malloc(msg.size);
+                            if (!buf) return ECORE_CALLBACK_CANCEL;
+                            memcpy(buf, cl->buf + offset + s, msg.size);
+                         }
+                       if (!cl->delete_me)
+                         {
+                            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
+                            if (e2)
+                              {
+                                 cl->event_count++;
+                                 e2->client   = cl;
+                                 e2->major    = msg.major;
+                                 e2->minor    = msg.minor;
+                                 e2->ref      = msg.ref;
+                                 e2->ref_to   = msg.ref_to;
+                                 e2->response = msg.response;
+                                 e2->size     = msg.size;
+                                 e2->data     = buf;
+                                 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
+                                                 _ecore_ipc_event_client_data_free,
+                                                 NULL);
+                              }
+                         }
+                    }
+                  cl->prev.i = msg;
+                  offset += (s + msg.size);
+                  if (cl->buf_size == offset)
+                    {
+                       free(cl->buf);
+                       cl->buf = NULL;
+                       cl->buf_size = 0;
+                       return ECORE_CALLBACK_CANCEL;
+                    }
+                  goto redo;
+               }
+             else goto scroll;
+          }
+        else
+          {
+             scroll:
+             buf = malloc(cl->buf_size - offset);
+             if (!buf)
+               {
+                  free(cl->buf);
+                  cl->buf = NULL;
+                  cl->buf_size = 0;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             memcpy(buf, cl->buf + offset, cl->buf_size - offset);
+             free(cl->buf);
+             cl->buf = buf;
+             cl->buf_size -= offset;
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
 #define SVSZ(_n) \
@@ -1341,175 +1350,175 @@ _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void
    md = ((head >> (4 * _n)) & 0xf); \
    if (md >= DLT_SET) \
      { \
-       unsigned int v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(svr->buf + offset + s + 0); \
-       dv[1] = *(svr->buf + offset + s + 1); \
-       dv[2] = *(svr->buf + offset + s + 2); \
-       dv[3] = *(svr->buf + offset + s + 3); \
-       d = (int)ntohl(v); \
-       s += 4; \
+        unsigned int v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(svr->buf + offset + s + 0); \
+        dv[1] = *(svr->buf + offset + s + 1); \
+        dv[2] = *(svr->buf + offset + s + 2); \
+        dv[3] = *(svr->buf + offset + s + 3); \
+        d = (int)ntohl(v); \
+        s += 4; \
      } \
    else if (md >= DLT_ADD16) \
      { \
-       unsigned short v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(svr->buf + offset + s + 0); \
-       dv[1] = *(svr->buf + offset + s + 1); \
-       d = (int)ntohs(v); \
-       s += 2; \
+        unsigned short v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(svr->buf + offset + s + 0); \
+        dv[1] = *(svr->buf + offset + s + 1); \
+        d = (int)ntohs(v); \
+        s += 2; \
      } \
    else if (md >= DLT_ADD8) \
      { \
-       unsigned char v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(svr->buf + offset + s + 0); \
-       d = (int)v; \
-       s += 1; \
+        unsigned char v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(svr->buf + offset + s + 0); \
+        d = (int)v; \
+        s += 1; \
      } \
    msg._member = _ecore_ipc_ddlt_int(d, svr->prev.i._member, md);
 
-static int
+static Eina_Bool
 _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Data *e;
 
    e = ev;
-   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Server *svr;
-       Ecore_Ipc_Msg_Head msg;
-       int offset = 0;
-       unsigned char *buf;
-
-       svr = ecore_con_server_data_get(e->server);
-
-       if (!svr->buf)
-         {
-            svr->buf_size = e->size;
-            svr->buf = e->data;
-            e->data = NULL; /* take it out of the old event */
-         }
-       else
-         {
-            buf = realloc(svr->buf, svr->buf_size + e->size);
-            if (!buf)
-              {
-                 free(svr->buf);
-                 svr->buf = 0;
-                 svr->buf_size  = 0;
-                 return 0;
-              }
-            svr->buf = buf;
-            memcpy(svr->buf + svr->buf_size, e->data, e->size);
-            svr->buf_size += e->size;
-         }
-       /* examine header */
-       redo:
-       if ((svr->buf_size - offset) >= (int)sizeof(int))
-         {
-            int s, md, d = 0, head;
-            unsigned char *dd;
-
-            dd = (unsigned char *)&head;
-            dd[0] = *(svr->buf + offset + 0);
-            dd[1] = *(svr->buf + offset + 1);
-            dd[2] = *(svr->buf + offset + 2);
-            dd[3] = *(svr->buf + offset + 3);
-            head = ntohl(head);
-            dd = (unsigned char *)&d;
-            s = 4;
-            SVSZ(0);
-            SVSZ(1);
-            SVSZ(2);
-            SVSZ(3);
-            SVSZ(4);
-            SVSZ(5);
-            if ((svr->buf_size - offset) < s)
-              {
-                 if (offset > 0) goto scroll;
-                 return 0;
-              }
-
-            s = 4;
-            SVDEC(0, major);
-            SVDEC(1, minor);
-            SVDEC(2, ref);
-            SVDEC(3, ref_to);
-            SVDEC(4, response);
-            SVDEC(5, size);
-            if (msg.size < 0) msg.size = 0;
-            /* there is enough data in the buffer for a full message */
-            if ((svr->buf_size - offset) >= (s + msg.size))
-              {
-                 Ecore_Ipc_Event_Server_Data *e2;
-                 int max;
-
-                 buf = NULL;
-                 max = svr->max_buf_size;
-                 if ((max < 0) || (msg.size <= max))
-                   {
-                      if (msg.size > 0)
-                        {
-                           buf = malloc(msg.size);
-                           if (!buf) return 0;
-                           memcpy(buf, svr->buf + offset + s, msg.size);
-                        }
-                      if (!svr->delete_me)
-                        {
-                           e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
-                           if (e2)
-                             {
-                                svr->event_count++;
-                                e2->server   = svr;
-                                e2->major    = msg.major;
-                                e2->minor    = msg.minor;
-                                e2->ref      = msg.ref;
-                                e2->ref_to   = msg.ref_to;
-                                e2->response = msg.response;
-                                e2->size     = msg.size;
-                                e2->data     = buf;
-                                ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
-                                                _ecore_ipc_event_server_data_free,
-                                                NULL);
-                             }
-                        }
-                   }
-                 svr->prev.i = msg;
-                 offset += (s + msg.size);
-                 if (svr->buf_size == offset)
-                   {
-                      free(svr->buf);
-                      svr->buf = NULL;
-                      svr->buf_size = 0;
-                      return 0;
-                   }
-                 goto redo;
-              }
-            else goto scroll;
-         }
-       else
-         {
-            scroll:
-            buf = malloc(svr->buf_size - offset);
-            if (!buf)
-              {
-                 free(svr->buf);
-                 svr->buf = NULL;
-                 svr->buf_size = 0;
-                 return 0;
-              }
-            memcpy(buf, svr->buf + offset, svr->buf_size - offset);
-            free(svr->buf);
-            svr->buf = buf;
-            svr->buf_size -= offset;
-         }
+        Ecore_Ipc_Server *svr;
+        Ecore_Ipc_Msg_Head msg;
+        int offset = 0;
+        unsigned char *buf;
+
+        svr = ecore_con_server_data_get(e->server);
+
+        if (!svr->buf)
+          {
+             svr->buf_size = e->size;
+             svr->buf = e->data;
+             e->data = NULL; /* take it out of the old event */
+          }
+        else
+          {
+             buf = realloc(svr->buf, svr->buf_size + e->size);
+             if (!buf)
+               {
+                  free(svr->buf);
+                  svr->buf = 0;
+                  svr->buf_size  = 0;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             svr->buf = buf;
+             memcpy(svr->buf + svr->buf_size, e->data, e->size);
+             svr->buf_size += e->size;
+          }
+        /* examine header */
+        redo:
+        if ((svr->buf_size - offset) >= (int)sizeof(int))
+          {
+             int s, md, d = 0, head;
+             unsigned char *dd;
+
+             dd = (unsigned char *)&head;
+             dd[0] = *(svr->buf + offset + 0);
+             dd[1] = *(svr->buf + offset + 1);
+             dd[2] = *(svr->buf + offset + 2);
+             dd[3] = *(svr->buf + offset + 3);
+             head = ntohl(head);
+             dd = (unsigned char *)&d;
+             s = 4;
+             SVSZ(0);
+             SVSZ(1);
+             SVSZ(2);
+             SVSZ(3);
+             SVSZ(4);
+             SVSZ(5);
+             if ((svr->buf_size - offset) < s)
+               {
+                  if (offset > 0) goto scroll;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+
+             s = 4;
+             SVDEC(0, major);
+             SVDEC(1, minor);
+             SVDEC(2, ref);
+             SVDEC(3, ref_to);
+             SVDEC(4, response);
+             SVDEC(5, size);
+             if (msg.size < 0) msg.size = 0;
+             /* there is enough data in the buffer for a full message */
+             if ((svr->buf_size - offset) >= (s + msg.size))
+               {
+                  Ecore_Ipc_Event_Server_Data *e2;
+                  int max;
+
+                  buf = NULL;
+                  max = svr->max_buf_size;
+                  if ((max < 0) || (msg.size <= max))
+                    {
+                       if (msg.size > 0)
+                         {
+                            buf = malloc(msg.size);
+                            if (!buf) return ECORE_CALLBACK_CANCEL;
+                            memcpy(buf, svr->buf + offset + s, msg.size);
+                         }
+                       if (!svr->delete_me)
+                         {
+                            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
+                            if (e2)
+                              {
+                                 svr->event_count++;
+                                 e2->server   = svr;
+                                 e2->major    = msg.major;
+                                 e2->minor    = msg.minor;
+                                 e2->ref      = msg.ref;
+                                 e2->ref_to   = msg.ref_to;
+                                 e2->response = msg.response;
+                                 e2->size     = msg.size;
+                                 e2->data     = buf;
+                                 ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
+                                                 _ecore_ipc_event_server_data_free,
+                                                 NULL);
+                              }
+                         }
+                    }
+                  svr->prev.i = msg;
+                  offset += (s + msg.size);
+                  if (svr->buf_size == offset)
+                    {
+                       free(svr->buf);
+                       svr->buf = NULL;
+                       svr->buf_size = 0;
+                       return ECORE_CALLBACK_CANCEL;
+                    }
+                  goto redo;
+               }
+             else goto scroll;
+          }
+        else
+          {
+             scroll:
+             buf = malloc(svr->buf_size - offset);
+             if (!buf)
+               {
+                  free(svr->buf);
+                  svr->buf = NULL;
+                  svr->buf_size = 0;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             memcpy(buf, svr->buf + offset, svr->buf_size - offset);
+             free(svr->buf);
+             svr->buf = buf;
+             svr->buf_size -= offset;
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
 static void