17 # define alloca __builtin_alloca
19 # define alloca __alloca
20 # elif defined _MSC_VER
22 # define alloca _alloca
23 # elif !defined HAVE_ALLOCA
27 void *alloca (size_t);
33 #ifdef HAVE_NETINET_IN_H
34 # include <sys/types.h>
35 # include <netinet/in.h>
38 #ifdef HAVE_WINSOCK2_H
39 # include <winsock2.h>
42 #if USE_GNUTLS_OPENSSL
43 # include <gnutls/openssl.h>
45 # include <openssl/ssl.h>
49 #include <ecore_private.h>
50 #include <Ecore_Con.h>
52 #include "Ecore_Ipc.h"
53 #include "ecore_ipc_private.h"
72 int _ecore_ipc_log_dom = -1;
75 _ecore_ipc_swap_16(unsigned short v)
79 s = (unsigned char *)(&v);
80 t = s[0]; s[0] = s[1]; s[1] = t;
85 _ecore_ipc_swap_32(unsigned int v)
89 s = (unsigned char *)(&v);
90 t = s[0]; s[0] = s[3]; s[3] = t;
91 t = s[1]; s[1] = s[2]; s[2] = t;
95 EAPI unsigned long long
96 _ecore_ipc_swap_64(unsigned long long v)
100 s = (unsigned char *)(&v);
101 t = s[0]; s[0] = s[7]; s[7] = t;
102 t = s[1]; s[1] = s[6]; s[6] = t;
103 t = s[2]; s[2] = s[5]; s[5] = t;
104 t = s[3]; s[3] = s[4]; s[4] = t;
108 static int _ecore_ipc_dlt_int(int out, int prev, int *mode);
109 static int _ecore_ipc_ddlt_int(int in, int prev, int mode);
112 _ecore_ipc_dlt_int(int out, int prev, int *mode)
122 if (out == (int)0xffffffff)
132 if (out == prev << 1)
137 if (out == prev >> 1)
144 if (!(dlt & 0xffffff00))
150 if (!(dlt & 0xffffff00))
156 if (!(dlt & 0x00ffffff))
159 return (dlt >> 24) & 0xff;
162 if (!(dlt & 0x00ffffff))
165 return (dlt >> 24) & 0xff;
169 if (!(dlt & 0xffff0000))
175 if (!(dlt & 0xffff0000))
181 if (!(dlt & 0x0000ffff))
184 return (dlt >> 16) & 0xffff;
187 if (!(dlt & 0x0000ffff))
190 return (dlt >> 16) & 0xffff;
198 _ecore_ipc_ddlt_int(int in, int prev, int mode)
224 return prev + (in << 24);
227 return prev - (in << 24);
236 return prev + (in << 16);
239 return prev - (in << 16);
256 static Eina_Bool _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
257 static Eina_Bool _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
258 static Eina_Bool _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
259 static Eina_Bool _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
260 static Eina_Bool _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
261 static Eina_Bool _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
262 static void _ecore_ipc_event_client_add_free(void *data, void *ev);
263 static void _ecore_ipc_event_client_del_free(void *data, void *ev);
264 static void _ecore_ipc_event_client_data_free(void *data, void *ev);
265 static void _ecore_ipc_event_server_add_free(void *data, void *ev);
266 static void _ecore_ipc_event_server_del_free(void *data, void *ev);
267 static void _ecore_ipc_event_server_data_free(void *data, void *ev);
269 EAPI int ECORE_IPC_EVENT_CLIENT_ADD = 0;
270 EAPI int ECORE_IPC_EVENT_CLIENT_DEL = 0;
271 EAPI int ECORE_IPC_EVENT_SERVER_ADD = 0;
272 EAPI int ECORE_IPC_EVENT_SERVER_DEL = 0;
273 EAPI int ECORE_IPC_EVENT_CLIENT_DATA = 0;
274 EAPI int ECORE_IPC_EVENT_SERVER_DATA = 0;
276 static int _ecore_ipc_init_count = 0;
277 static Eina_List *servers = NULL;
278 static Ecore_Event_Handler *handler[6];
281 * @defgroup Ecore_IPC_Library_Group IPC Library Functions
283 * Functions that set up and shut down the Ecore IPC Library.
287 * Initialises the Ecore IPC library.
288 * @return Number of times the library has been initialised without
290 * @ingroup Ecore_IPC_Library_Group
297 if (++_ecore_ipc_init_count != 1)
298 return _ecore_ipc_init_count;
299 _ecore_ipc_log_dom = eina_log_domain_register
300 ("ecore_ipc", ECORE_IPC_DEFAULT_LOG_COLOR);
301 if(_ecore_ipc_log_dom < 0)
303 EINA_LOG_ERR("Impossible to create a log domain for the Ecore IPC module.");
304 return --_ecore_ipc_init_count;
306 if (!ecore_con_init())
307 return --_ecore_ipc_init_count;
309 ECORE_IPC_EVENT_CLIENT_ADD = ecore_event_type_new();
310 ECORE_IPC_EVENT_CLIENT_DEL = ecore_event_type_new();
311 ECORE_IPC_EVENT_SERVER_ADD = ecore_event_type_new();
312 ECORE_IPC_EVENT_SERVER_DEL = ecore_event_type_new();
313 ECORE_IPC_EVENT_CLIENT_DATA = ecore_event_type_new();
314 ECORE_IPC_EVENT_SERVER_DATA = ecore_event_type_new();
316 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
317 _ecore_ipc_event_client_add, NULL);
318 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
319 _ecore_ipc_event_client_del, NULL);
320 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
321 _ecore_ipc_event_server_add, NULL);
322 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
323 _ecore_ipc_event_server_del, NULL);
324 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
325 _ecore_ipc_event_client_data, NULL);
326 handler[i] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
327 _ecore_ipc_event_server_data, NULL);
328 return _ecore_ipc_init_count;
332 * Shuts down the Ecore IPC library.
333 * @return Number of times the library has been initialised without being
335 * @ingroup Ecore_IPC_Library_Group
338 ecore_ipc_shutdown(void)
342 if (--_ecore_ipc_init_count != 0)
343 return _ecore_ipc_init_count;
346 Ecore_Ipc_Server *svr;
347 EINA_LIST_FOREACH_SAFE(servers, l, l2, svr)
348 ecore_ipc_server_del(svr);
350 for (i = 0; i < 6; i++)
351 ecore_event_handler_del(handler[i]);
353 ecore_con_shutdown();
354 eina_log_domain_unregister(_ecore_ipc_log_dom);
355 _ecore_ipc_log_dom = -1;
356 return _ecore_ipc_init_count;
360 * @defgroup Ecore_IPC_Server_Group IPC Server Functions
362 * Functions the deal with IPC server objects.
366 * Creates an IPC server that listens for connections.
368 * For more details about the @p compl_type, @p name and @p port
369 * parameters, see the @ref ecore_con_server_add documentation.
371 * @param compl_type The connection type.
372 * @param name Name to associate with the socket used for connection.
373 * @param port Number to identify with socket used for connection.
374 * @param data Data to associate with the IPC server.
375 * @return New IPC server. If there is an error, @c NULL is returned.
376 * @ingroup Ecore_IPC_Server_Group
377 * @todo Need to add protocol type parameter to this function.
379 EAPI Ecore_Ipc_Server *
380 ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, const void *data)
382 Ecore_Ipc_Server *svr;
384 Ecore_Con_Type extra = 0;
386 if (!name) return NULL;
388 svr = calloc(1, sizeof(Ecore_Ipc_Server));
389 if (!svr) return NULL;
391 type &= ~ECORE_IPC_USE_SSL;
392 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
395 case ECORE_IPC_LOCAL_USER:
396 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
398 case ECORE_IPC_LOCAL_SYSTEM:
399 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
401 case ECORE_IPC_REMOTE_SYSTEM:
402 svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
413 svr->max_buf_size = 32 * 1024;
414 svr->data = (void *)data;
415 servers = eina_list_append(servers, svr);
416 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
421 * Creates an IPC server object to represent the IPC server listening
424 * For more details about the @p compl_type, @p name and @p port
425 * parameters, see the @ref ecore_con_server_connect documentation.
427 * @param compl_type The IPC connection type.
428 * @param name Name used to determine which socket to use for the
430 * @param port Number used to identify the socket to use for the
432 * @param data Data to associate with the server.
433 * @return A new IPC server. @c NULL is returned on error.
434 * @ingroup Ecore_IPC_Server_Group
435 * @todo Need to add protocol type parameter.
437 EAPI Ecore_Ipc_Server *
438 ecore_ipc_server_connect(Ecore_Ipc_Type compl_type, char *name, int port, const void *data)
440 Ecore_Ipc_Server *svr;
442 Ecore_Con_Type extra = 0;
445 svr = calloc(1, sizeof(Ecore_Ipc_Server));
446 if (!svr) return NULL;
447 type = compl_type & ECORE_IPC_TYPE;
448 features = compl_type & ECORE_IPC_SSL;
449 if ((features & ECORE_IPC_USE_SSL) == ECORE_IPC_USE_SSL)
450 extra |= ECORE_CON_USE_SSL;
451 if ((features & ECORE_IPC_NO_PROXY) == ECORE_IPC_NO_PROXY)
452 extra |= ECORE_CON_NO_PROXY;
455 case ECORE_IPC_LOCAL_USER:
456 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
458 case ECORE_IPC_LOCAL_SYSTEM:
459 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
461 case ECORE_IPC_REMOTE_SYSTEM:
462 svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
473 svr->max_buf_size = -1;
474 svr->data = (void *)data;
475 servers = eina_list_append(servers, svr);
476 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
481 * Closes the connection and frees the given IPC server.
482 * @param svr The given IPC server.
483 * @return The data associated with the server when it was created.
484 * @ingroup Ecore_IPC_Server_Group
487 ecore_ipc_server_del(Ecore_Ipc_Server *svr)
491 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
493 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
494 "ecore_ipc_server_del");
497 if (svr->delete_me) return NULL;
502 if (svr->event_count == 0)
504 Ecore_Ipc_Client *cl;
506 EINA_LIST_FREE(svr->clients, cl)
507 ecore_ipc_client_del(cl);
508 if (svr->server) ecore_con_server_del(svr->server);
509 servers = eina_list_remove(servers, svr);
511 if (svr->buf) free(svr->buf);
512 ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
519 * Retrieves the data associated with the given IPC server.
520 * @param svr The given IPC server.
521 * @return The associated data.
522 * @ingroup Ecore_IPC_Server_Group
525 ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
527 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
529 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
530 "ecore_ipc_server_data_get");
537 * Retrieves whether the given IPC server is currently connected.
538 * @param svr The given IPC server.
539 * @return @c EINA_TRUE if the server is connected, @c EINA_FALSE otherwise.
540 * @ingroup Ecore_IPC_Server_Group
543 ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
545 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
547 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
548 "ecore_ipc_server_connected_get");
551 return ecore_con_server_connected_get(svr->server);
555 * Retrieves the list of clients for this server.
556 * @param svr The given IPC server.
557 * @return An Eina_List with the clients.
558 * @ingroup Ecore_IPC_Server_Group
561 ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
563 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
565 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
566 "ecore_ipc_server_clients_get");
572 #define SVENC(_member) \
573 d = _ecore_ipc_dlt_int(msg._member, svr->prev.o._member, &md); \
578 dd = (unsigned char *)&v; \
581 *(dat + s + 0) = dd[0]; \
582 *(dat + s + 1) = dd[1]; \
583 *(dat + s + 2) = dd[2]; \
584 *(dat + s + 3) = dd[3]; \
587 else if (md >= DLT_ADD16) \
591 dd = (unsigned char *)&v; \
594 *(dat + s + 0) = dd[0]; \
595 *(dat + s + 1) = dd[1]; \
598 else if (md >= DLT_ADD8) \
600 *(dat + s + 0) = (unsigned char)d; \
605 * Sends a message to the given IPC server.
607 * The content of the parameters, excluding the @p svr paramter, is up to
610 * @param svr The given IPC server.
611 * @param major Major opcode of the message.
612 * @param minor Minor opcode of the message.
613 * @param ref Message reference number.
614 * @param ref_to Reference number of the message this message refers to.
615 * @param response Requires response.
616 * @param data The data to send as part of the message.
617 * @param size Length of the data, in bytes, to send.
618 * @return Number of bytes sent. @c 0 is returned if there is an error.
619 * @ingroup Ecore_IPC_Server_Group
620 * @todo This function needs to become an IPC message.
621 * @todo Fix up the documentation: Make sure what ref_to and response are.
624 ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
626 Ecore_Ipc_Msg_Head msg;
628 int *head, md = 0, d, s;
629 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
631 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
633 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
634 "ecore_ipc_server_send");
637 if (size < 0) size = 0;
642 msg.response = response;
649 *head |= md << (4 * 1);
651 *head |= md << (4 * 2);
653 *head |= md << (4 * 3);
655 *head |= md << (4 * 4);
657 *head |= md << (4 * 5);
658 *head = htonl(*head);
660 ret = ecore_con_server_send(svr->server, dat, s);
661 if (size > 0) ret += ecore_con_server_send(svr->server, data, size);
666 * Sets a limit on the number of clients that can be handled concurrently
667 * by the given server, and a policy on what to do if excess clients try to
669 * Beware that if you set this once ecore is already running, you may
670 * already have pending CLIENT_ADD events in your event queue. Those
671 * clients have already connected and will not be affected by this call.
672 * Only clients subsequently trying to connect will be affected.
673 * @param svr The given server.
674 * @param client_limit The maximum number of clients to handle
675 * concurrently. -1 means unlimited (default). 0
676 * effectively disables the server.
677 * @param reject_excess_clients Set to 1 to automatically disconnect
678 * excess clients as soon as they connect if you are
679 * already handling client_limit clients. Set to 0
680 * (default) to just hold off on the "accept()"
681 * system call until the number of active clients
682 * drops. This causes the kernel to queue up to 4096
683 * connections (or your kernel's limit, whichever is
685 * @ingroup Ecore_Ipc_Server_Group
688 ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients)
690 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
692 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
693 "ecore_ipc_server_client_limit_set");
696 ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients);
700 * Sets the max data payload size for an Ipc message in bytes
702 * @param svr The given server.
703 * @param size The maximum data payload size in bytes.
704 * @ingroup Ecore_Ipc_Server_Group
707 ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size)
709 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
711 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
712 "ecore_ipc_server_data_size_max_set");
715 svr->max_buf_size = size;
719 * Gets the max data payload size for an Ipc message in bytes
721 * @param svr The given server.
722 * @return The maximum data payload in bytes.
723 * @ingroup Ecore_Ipc_Server_Group
726 ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
728 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
730 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
731 "ecore_ipc_server_data_size_max_get");
734 return svr->max_buf_size;
738 * Gets the IP address of a server that has been connected to.
740 * @param svr The given server.
741 * @return A pointer to an internal string that contains the IP address of
742 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
743 * This string should not be modified or trusted to stay valid after
744 * deletion for the @p svr object. If no IP is known NULL is returned.
745 * @ingroup Ecore_Ipc_Server_Group
748 ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr)
750 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
752 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
753 "ecore_ipc_server_ip_get");
756 return ecore_con_server_ip_get(svr->server);
760 * Flushes all pending data to the given server. Will return when done.
762 * @param svr The given server.
763 * @ingroup Ecore_Ipc_Server_Group
766 ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
768 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
770 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
771 "ecore_ipc_server_server_flush");
774 ecore_con_server_flush(svr->server);
777 #define CLENC(_member) \
778 d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \
783 dd = (unsigned char *)&v; \
786 *(dat + s + 0) = dd[0]; \
787 *(dat + s + 1) = dd[1]; \
788 *(dat + s + 2) = dd[2]; \
789 *(dat + s + 3) = dd[3]; \
792 else if (md >= DLT_ADD16) \
796 dd = (unsigned char *)&v; \
799 *(dat + s + 0) = dd[0]; \
800 *(dat + s + 1) = dd[1]; \
803 else if (md >= DLT_ADD8) \
805 *(dat + s) = (unsigned char)d; \
810 * @defgroup Ecore_IPC_Client_Group IPC Client Functions
812 * Functions that deal with IPC client objects.
816 * Sends a message to the given IPC client.
817 * @param cl The given IPC client.
818 * @param major Major opcode of the message.
819 * @param minor Minor opcode of the message.
820 * @param ref Reference number of the message.
821 * @param ref_to Reference number of the message this message refers to.
822 * @param response Requires response.
823 * @param data The data to send as part of the message.
824 * @param size Length of the data, in bytes, to send.
825 * @return The number of bytes sent. @c 0 will be returned if there is
827 * @ingroup Ecore_IPC_Client_Group
828 * @todo This function needs to become an IPC message.
829 * @todo Make sure ref_to and response parameters are described correctly.
832 ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
834 Ecore_Ipc_Msg_Head msg;
836 int *head, md = 0, d, s;
837 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
839 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
841 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
842 "ecore_ipc_client_send");
845 EINA_SAFETY_ON_TRUE_RETURN_VAL(!cl->client, 0);
846 EINA_SAFETY_ON_TRUE_RETURN_VAL(!ecore_con_client_connected_get(cl->client), 0);
847 if (size < 0) size = 0;
852 msg.response = response;
859 *head |= md << (4 * 1);
861 *head |= md << (4 * 2);
863 *head |= md << (4 * 3);
865 *head |= md << (4 * 4);
867 *head |= md << (4 * 5);
868 *head = htonl(*head);
870 ret = ecore_con_client_send(cl->client, dat, s);
871 if (size > 0) ret += ecore_con_client_send(cl->client, data, size);
876 * Retrieves the IPC server that the given IPC client is connected to.
877 * @param cl The given IPC client.
878 * @return The IPC server the IPC client is connected to.
879 * @ingroup Ecore_IPC_Client_Group
881 EAPI Ecore_Ipc_Server *
882 ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
884 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
886 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
887 "ecore_ipc_client_server_get");
894 * Closes the connection and frees memory allocated to the given IPC
896 * @param cl The given client.
897 * @return Data associated with the client.
898 * @ingroup Ecore_IPC_Client_Group
901 ecore_ipc_client_del(Ecore_Ipc_Client *cl)
904 Ecore_Ipc_Server *svr;
906 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
908 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
909 "ecore_ipc_client_del");
915 if (cl->event_count == 0)
918 if (cl->client) ecore_con_client_del(cl->client);
919 svr->clients = eina_list_remove(svr->clients, cl);
920 if (cl->buf) free(cl->buf);
921 ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
928 * Sets the IPC data associated with the given IPC client to @p data.
929 * @param cl The given IPC client.
930 * @param data The data to associate with the IPC client.
931 * @ingroup Ecore_IPC_Client_Group
934 ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data)
936 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
938 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
939 "ecore_ipc_client_data_set");
942 cl->data = (void *)data;
946 * Retrieves the data that has been associated with the given IPC client.
947 * @param cl The given client.
948 * @return The data associated with the IPC client.
949 * @ingroup Ecore_IPC_Client_Group
952 ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
954 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
956 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
957 "ecore_ipc_client_data_get");
964 * Sets the max data payload size for an Ipc message in bytes
966 * @param cl The given client.
967 * @param size The maximum data payload size in bytes.
968 * @ingroup Ecore_Ipc_Client_Group
971 ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size)
973 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
975 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
976 "ecore_ipc_client_data_size_max_set");
979 cl->max_buf_size = size;
983 * Gets the max data payload size for an Ipc message in bytes
985 * @param cl The given client.
986 * @return The maximum data payload size in bytes on success, @c -1 on failure.
987 * @ingroup Ecore_Ipc_Client_Group
990 ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
992 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
994 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
995 "ecore_ipc_client_data_size_max_get");
998 return cl->max_buf_size;
1002 * Gets the IP address of a client that has been connected to.
1004 * @param cl The given client.
1005 * @return A pointer to an internal string that contains the IP address of
1006 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
1007 * This string should not be modified or trusted to stay valid after
1008 * deletion for the @p cl object. If no IP is known @c NULL is
1010 * @ingroup Ecore_Ipc_Client_Group
1013 ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl)
1015 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
1017 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
1018 "ecore_ipc_client_ip_get");
1021 return ecore_con_client_ip_get(cl->client);
1025 * Flushes all pending data to the given client. Will return when done.
1027 * @param cl The given client.
1028 * @ingroup Ecore_Ipc_Client_Group
1031 ecore_ipc_client_flush(Ecore_Ipc_Client *cl)
1033 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
1035 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
1036 "ecore_ipc_client_flush");
1039 ecore_con_client_flush(cl->client);
1043 * Returns if SSL support is available
1044 * @return 1 if SSL is available, 0 if it is not.
1045 * @ingroup Ecore_Con_Client_Group
1048 ecore_ipc_ssl_available_get(void)
1050 return ecore_con_ssl_available_get();
1055 _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1057 Ecore_Con_Event_Client_Add *e;
1058 Ecore_Ipc_Server *svr;
1061 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1062 if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
1063 /* handling code here */
1065 Ecore_Ipc_Client *cl;
1067 cl = calloc(1, sizeof(Ecore_Ipc_Client));
1068 if (!cl) return ECORE_CALLBACK_CANCEL;
1070 ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
1071 cl->client = e->client;
1072 cl->max_buf_size = 32 * 1024;
1073 ecore_con_client_data_set(cl->client, (void *)cl);
1074 svr->clients = eina_list_append(svr->clients, cl);
1077 Ecore_Ipc_Event_Client_Add *e2;
1079 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
1084 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
1085 _ecore_ipc_event_client_add_free, NULL);
1089 return ECORE_CALLBACK_CANCEL;
1093 _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1095 Ecore_Con_Event_Client_Del *e;
1096 Ecore_Ipc_Server *svr;
1099 if (!e->client) return ECORE_CALLBACK_RENEW;
1100 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1101 if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
1102 /* handling code here */
1104 Ecore_Ipc_Client *cl;
1106 cl = ecore_con_client_data_get(e->client);
1109 Ecore_Ipc_Event_Client_Del *e2;
1113 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
1118 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
1119 _ecore_ipc_event_client_del_free, NULL);
1124 return ECORE_CALLBACK_CANCEL;
1128 _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1130 Ecore_Con_Event_Server_Add *e;
1133 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1134 /* handling code here */
1136 Ecore_Ipc_Server *svr;
1138 svr = ecore_con_server_data_get(e->server);
1139 if (!svr->delete_me)
1141 Ecore_Ipc_Event_Server_Add *e2;
1143 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
1148 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
1149 _ecore_ipc_event_server_add_free, NULL);
1153 return ECORE_CALLBACK_CANCEL;
1157 _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1159 Ecore_Con_Event_Server_Del *e;
1162 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1163 /* handling code here */
1165 Ecore_Ipc_Server *svr;
1167 svr = ecore_con_server_data_get(e->server);
1169 if (!svr->delete_me)
1171 Ecore_Ipc_Event_Server_Del *e2;
1173 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
1178 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
1179 _ecore_ipc_event_server_del_free, NULL);
1183 return ECORE_CALLBACK_CANCEL;
1187 md = ((head >> (4 * _n)) & 0xf); \
1188 if (md >= DLT_SET) s += 4; \
1189 else if (md >= DLT_ADD16) s += 2; \
1190 else if (md >= DLT_ADD8) s += 1;
1192 #define CLDEC(_n, _member) \
1193 md = ((head >> (4 * _n)) & 0xf); \
1194 if (md >= DLT_SET) \
1197 unsigned char *dv; \
1198 dv = (unsigned char *)&v; \
1199 dv[0] = *(cl->buf + offset + s + 0); \
1200 dv[1] = *(cl->buf + offset + s + 1); \
1201 dv[2] = *(cl->buf + offset + s + 2); \
1202 dv[3] = *(cl->buf + offset + s + 3); \
1203 d = (int)ntohl(v); \
1206 else if (md >= DLT_ADD16) \
1209 unsigned char *dv; \
1210 dv = (unsigned char *)&v; \
1211 dv[0] = *(cl->buf + offset + s + 0); \
1212 dv[1] = *(cl->buf + offset + s + 1); \
1213 d = (int)ntohs(v); \
1216 else if (md >= DLT_ADD8) \
1219 unsigned char *dv; \
1220 dv = (unsigned char *)&v; \
1221 dv[0] = *(cl->buf + offset + s + 0); \
1225 msg._member = _ecore_ipc_ddlt_int(d, cl->prev.i._member, md);
1228 _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1230 Ecore_Con_Event_Client_Data *e;
1231 Ecore_Ipc_Server *svr;
1234 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1235 if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
1236 /* handling code here */
1238 Ecore_Ipc_Client *cl;
1239 Ecore_Ipc_Msg_Head msg;
1243 cl = ecore_con_client_data_get(e->client);
1247 cl->buf_size = e->size;
1249 e->data = NULL; /* take it out of the old event */
1253 buf = realloc(cl->buf, cl->buf_size + e->size);
1259 return ECORE_CALLBACK_CANCEL;
1262 memcpy(cl->buf + cl->buf_size, e->data, e->size);
1263 cl->buf_size += e->size;
1265 /* examine header */
1267 if ((cl->buf_size - offset) >= (int)sizeof(int))
1269 int s, md, d = 0, head;
1272 dd = (unsigned char *)&head;
1273 dd[0] = *(cl->buf + offset + 0);
1274 dd[1] = *(cl->buf + offset + 1);
1275 dd[2] = *(cl->buf + offset + 2);
1276 dd[3] = *(cl->buf + offset + 3);
1278 dd = (unsigned char *)&d;
1286 if ((cl->buf_size - offset) < s)
1288 if (offset > 0) goto scroll;
1289 return ECORE_CALLBACK_CANCEL;
1299 if (msg.size < 0) msg.size = 0;
1300 /* there is enough data in the buffer for a full message */
1301 if ((cl->buf_size - offset) >= (s + msg.size))
1303 Ecore_Ipc_Event_Client_Data *e2;
1307 max = svr->max_buf_size;
1308 max2 = cl->max_buf_size;
1309 if ((max >= 0) && (max2 >= 0))
1311 if (max2 < max) max = max2;
1315 if (max < 0) max = max2;
1317 if ((max < 0) || (msg.size <= max))
1321 buf = malloc(msg.size);
1322 if (!buf) return ECORE_CALLBACK_CANCEL;
1323 memcpy(buf, cl->buf + offset + s, msg.size);
1327 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
1332 e2->major = msg.major;
1333 e2->minor = msg.minor;
1335 e2->ref_to = msg.ref_to;
1336 e2->response = msg.response;
1337 e2->size = msg.size;
1339 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
1340 _ecore_ipc_event_client_data_free,
1346 offset += (s + msg.size);
1347 if (cl->buf_size == offset)
1352 return ECORE_CALLBACK_CANCEL;
1361 buf = malloc(cl->buf_size - offset);
1367 return ECORE_CALLBACK_CANCEL;
1369 memcpy(buf, cl->buf + offset, cl->buf_size - offset);
1372 cl->buf_size -= offset;
1375 return ECORE_CALLBACK_CANCEL;
1379 md = ((head >> (4 * _n)) & 0xf); \
1380 if (md >= DLT_SET) s += 4; \
1381 else if (md >= DLT_ADD16) s += 2; \
1382 else if (md >= DLT_ADD8) s += 1;
1384 #define SVDEC(_n, _member) \
1385 md = ((head >> (4 * _n)) & 0xf); \
1386 if (md >= DLT_SET) \
1389 unsigned char *dv; \
1390 dv = (unsigned char *)&v; \
1391 dv[0] = *(svr->buf + offset + s + 0); \
1392 dv[1] = *(svr->buf + offset + s + 1); \
1393 dv[2] = *(svr->buf + offset + s + 2); \
1394 dv[3] = *(svr->buf + offset + s + 3); \
1395 d = (int)ntohl(v); \
1398 else if (md >= DLT_ADD16) \
1401 unsigned char *dv; \
1402 dv = (unsigned char *)&v; \
1403 dv[0] = *(svr->buf + offset + s + 0); \
1404 dv[1] = *(svr->buf + offset + s + 1); \
1405 d = (int)ntohs(v); \
1408 else if (md >= DLT_ADD8) \
1411 unsigned char *dv; \
1412 dv = (unsigned char *)&v; \
1413 dv[0] = *(svr->buf + offset + s + 0); \
1417 msg._member = _ecore_ipc_ddlt_int(d, svr->prev.i._member, md);
1420 _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1422 Ecore_Con_Event_Server_Data *e;
1425 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1426 /* handling code here */
1428 Ecore_Ipc_Server *svr;
1429 Ecore_Ipc_Msg_Head msg;
1433 svr = ecore_con_server_data_get(e->server);
1437 svr->buf_size = e->size;
1439 e->data = NULL; /* take it out of the old event */
1443 buf = realloc(svr->buf, svr->buf_size + e->size);
1449 return ECORE_CALLBACK_CANCEL;
1452 memcpy(svr->buf + svr->buf_size, e->data, e->size);
1453 svr->buf_size += e->size;
1455 /* examine header */
1457 if ((svr->buf_size - offset) >= (int)sizeof(int))
1459 int s, md, d = 0, head;
1462 dd = (unsigned char *)&head;
1463 dd[0] = *(svr->buf + offset + 0);
1464 dd[1] = *(svr->buf + offset + 1);
1465 dd[2] = *(svr->buf + offset + 2);
1466 dd[3] = *(svr->buf + offset + 3);
1468 dd = (unsigned char *)&d;
1476 if ((svr->buf_size - offset) < s)
1478 if (offset > 0) goto scroll;
1479 return ECORE_CALLBACK_CANCEL;
1489 if (msg.size < 0) msg.size = 0;
1490 /* there is enough data in the buffer for a full message */
1491 if ((svr->buf_size - offset) >= (s + msg.size))
1493 Ecore_Ipc_Event_Server_Data *e2;
1497 max = svr->max_buf_size;
1498 if ((max < 0) || (msg.size <= max))
1502 buf = malloc(msg.size);
1503 if (!buf) return ECORE_CALLBACK_CANCEL;
1504 memcpy(buf, svr->buf + offset + s, msg.size);
1506 if (!svr->delete_me)
1508 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
1513 e2->major = msg.major;
1514 e2->minor = msg.minor;
1516 e2->ref_to = msg.ref_to;
1517 e2->response = msg.response;
1518 e2->size = msg.size;
1520 ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
1521 _ecore_ipc_event_server_data_free,
1527 offset += (s + msg.size);
1528 if (svr->buf_size == offset)
1533 return ECORE_CALLBACK_CANCEL;
1542 buf = malloc(svr->buf_size - offset);
1548 return ECORE_CALLBACK_CANCEL;
1550 memcpy(buf, svr->buf + offset, svr->buf_size - offset);
1553 svr->buf_size -= offset;
1556 return ECORE_CALLBACK_CANCEL;
1560 _ecore_ipc_event_client_add_free(void *data __UNUSED__, void *ev)
1562 Ecore_Ipc_Event_Client_Add *e;
1565 e->client->event_count--;
1566 if ((e->client->event_count == 0) && (e->client->delete_me))
1567 ecore_ipc_client_del(e->client);
1572 _ecore_ipc_event_client_del_free(void *data __UNUSED__, void *ev)
1574 Ecore_Ipc_Event_Client_Del *e;
1577 e->client->event_count--;
1578 if ((e->client->event_count == 0) && (e->client->delete_me))
1579 ecore_ipc_client_del(e->client);
1584 _ecore_ipc_event_client_data_free(void *data __UNUSED__, void *ev)
1586 Ecore_Ipc_Event_Client_Data *e;
1589 e->client->event_count--;
1590 if (e->data) free(e->data);
1591 if ((e->client->event_count == 0) && (e->client->delete_me))
1592 ecore_ipc_client_del(e->client);
1597 _ecore_ipc_event_server_add_free(void *data __UNUSED__, void *ev)
1599 Ecore_Ipc_Event_Server_Add *e;
1602 e->server->event_count--;
1603 if ((e->server->event_count == 0) && (e->server->delete_me))
1604 ecore_ipc_server_del(e->server);
1609 _ecore_ipc_event_server_del_free(void *data __UNUSED__, void *ev)
1611 Ecore_Ipc_Event_Server_Add *e;
1614 e->server->event_count--;
1615 if ((e->server->event_count == 0) && (e->server->delete_me))
1616 ecore_ipc_server_del(e->server);
1621 _ecore_ipc_event_server_data_free(void *data __UNUSED__, void *ev)
1623 Ecore_Ipc_Event_Server_Data *e;
1626 if (e->data) free(e->data);
1627 e->server->event_count--;
1628 if ((e->server->event_count == 0) && (e->server->delete_me))
1629 ecore_ipc_server_del(e->server);