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 8a69b10..54ee3ad 100644 (file)
 # 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
@@ -38,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)
 {
@@ -310,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]);
@@ -495,7 +504,7 @@ 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  #EINA_TRUE if the server is connected.  #EINA_FALSE otherwise.
+ * @return @c EINA_TRUE if the server is connected, @c EINA_FALSE otherwise.
  * @ingroup Ecore_IPC_Server_Group
  */
 EAPI Eina_Bool
@@ -844,8 +853,7 @@ ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
                          "ecore_ipc_client_server_get");
         return NULL;
      }
-   if (!ecore_con_client_server_get(cl->client)) return NULL;
-   return ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
+   return (ecore_con_server_data_get(ecore_con_client_server_get(cl->client)));
 }
 
 /**
@@ -872,15 +880,9 @@ ecore_ipc_client_del(Ecore_Ipc_Client *cl)
    cl->delete_me = 1;
    if (cl->event_count == 0)
      {
-        Ecore_Con_Server *s;
-
-        ecore_con_client_del(cl->client);
-        s = ecore_con_client_server_get(cl->client);
-        if (s)
-          {
-             svr = ecore_con_server_data_get(s);
-             svr->clients = eina_list_remove(svr->clients, 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);
@@ -927,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
  */
@@ -944,10 +946,10 @@ ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int 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
@@ -969,7 +971,8 @@ 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 const char *
@@ -1018,23 +1021,20 @@ static Eina_Bool
 _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Add *e;
-   Ecore_Con_Server *s;
-   Ecore_Ipc_Server *svr;
 
    e = ev;
-   s = ecore_con_client_server_get(e->client);
-   if (!s) return ECORE_CALLBACK_RENEW;
-   svr = ecore_con_server_data_get(s);
-   if (!svr) return ECORE_CALLBACK_RENEW;
-   if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
+   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 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);
@@ -1060,15 +1060,9 @@ static Eina_Bool
 _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Del *e;
-   Ecore_Con_Server *s;
-   Ecore_Ipc_Server *svr;
 
    e = ev;
-   s = ecore_con_client_server_get(e->client);
-   if (!s) return ECORE_CALLBACK_RENEW;
-   svr = ecore_con_server_data_get(s);
-   if (!svr) return ECORE_CALLBACK_RENEW;
-   if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
+   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;
@@ -1076,7 +1070,9 @@ _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void
         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)
                {
@@ -1098,23 +1094,26 @@ static Eina_Bool
 _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Add *e;
-   Ecore_Ipc_Server *svr;
 
    e = ev;
-   svr = ecore_con_server_data_get(e->server);
-   if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
-   if (!svr->delete_me)
      {
-        Ecore_Ipc_Event_Server_Add *e2;
+        Ecore_Ipc_Server *svr;
 
-        e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
-        if (e2)
+        svr = ecore_con_server_data_get(e->server);
+        if (!svr->delete_me)
           {
-             svr->event_count++;
-             e2->server = svr;
-             ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
-                             _ecore_ipc_event_server_add_free, NULL);
+             Ecore_Ipc_Event_Server_Add *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);
+               }
           }
      }
    return ECORE_CALLBACK_CANCEL;
@@ -1124,23 +1123,26 @@ static Eina_Bool
 _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Del *e;
-   Ecore_Ipc_Server *svr;
 
    e = ev;
-   svr = ecore_con_server_data_get(e->server);
-   if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
-   if (!svr->delete_me)
      {
-        Ecore_Ipc_Event_Server_Del *e2;
+        Ecore_Ipc_Server *svr;
 
-        e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
-        if (e2)
+        svr = ecore_con_server_data_get(e->server);
+        if (!svr->delete_me)
           {
-             svr->event_count++;
-             e2->server = svr;
-             ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
-                             _ecore_ipc_event_server_del_free, NULL);
+             Ecore_Ipc_Event_Server_Del *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);
+               }
           }
      }
    return ECORE_CALLBACK_CANCEL;
@@ -1191,19 +1193,17 @@ static Eina_Bool
 _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Data *e;
-   Ecore_Con_Server *svr;
-   Ecore_Ipc_Client *cl;
 
    e = ev;
-   svr = ecore_con_client_server_get(e->client);
-   cl = ecore_con_server_data_get(svr);
-   if (!eina_list_data_find(servers, cl)) return ECORE_CALLBACK_RENEW;
+   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)
           {
@@ -1265,13 +1265,10 @@ _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void
                {
                   Ecore_Ipc_Event_Client_Data *e2;
                   Ecore_Ipc_Server *svr;
-                  Ecore_Con_Server *sv;
                   int max, max2;
 
                   buf = NULL;
-                  sv = ecore_con_client_server_get(cl->client);
-                  if (!sv) return ECORE_CALLBACK_CANCEL;
-                  svr = ecore_con_server_data_get(sv);
+                  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))
@@ -1388,17 +1385,18 @@ static Eina_Bool
 _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Data *e;
-   Ecore_Ipc_Server *svr;
 
    e = ev;
-   svr = ecore_con_server_data_get(e->server);
-   if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
+   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;