7 #ifdef HAVE_NETINET_IN_H
8 # include <sys/types.h>
9 # include <netinet/in.h>
12 #ifdef HAVE_WINSOCK2_H
13 # include <winsock2.h>
16 #if USE_GNUTLS_OPENSSL
17 # include <gnutls/openssl.h>
19 # include <openssl/ssl.h>
23 #include <ecore_private.h>
24 #include <Ecore_Con.h>
26 #include "Ecore_Ipc.h"
27 #include "ecore_ipc_private.h"
46 int _ecore_ipc_log_dom = -1;
48 /* byte swappers - for dealing with big vs little endian machines */
50 _ecore_ipc_swap_16(unsigned short v)
54 s = (unsigned char *)(&v);
55 t = s[0]; s[0] = s[1]; s[1] = t;
60 _ecore_ipc_swap_32(unsigned int v)
64 s = (unsigned char *)(&v);
65 t = s[0]; s[0] = s[3]; s[3] = t;
66 t = s[1]; s[1] = s[2]; s[2] = t;
70 EAPI unsigned long long
71 _ecore_ipc_swap_64(unsigned long long v)
75 s = (unsigned char *)(&v);
76 t = s[0]; s[0] = s[7]; s[7] = t;
77 t = s[1]; s[1] = s[6]; s[6] = t;
78 t = s[2]; s[2] = s[5]; s[5] = t;
79 t = s[3]; s[3] = s[4]; s[4] = t;
83 static int _ecore_ipc_dlt_int(int out, int prev, int *mode);
84 static int _ecore_ipc_ddlt_int(int in, int prev, int mode);
87 _ecore_ipc_dlt_int(int out, int prev, int *mode)
97 if (out == (int)0xffffffff)
107 if (out == prev << 1)
112 if (out == prev >> 1)
119 if (!(dlt & 0xffffff00))
125 if (!(dlt & 0xffffff00))
131 if (!(dlt & 0x00ffffff))
134 return (dlt >> 24) & 0xff;
137 if (!(dlt & 0x00ffffff))
140 return (dlt >> 24) & 0xff;
144 if (!(dlt & 0xffff0000))
150 if (!(dlt & 0xffff0000))
156 if (!(dlt & 0x0000ffff))
159 return (dlt >> 16) & 0xffff;
162 if (!(dlt & 0x0000ffff))
165 return (dlt >> 16) & 0xffff;
173 _ecore_ipc_ddlt_int(int in, int prev, int mode)
199 return prev + (in << 24);
202 return prev - (in << 24);
211 return prev + (in << 16);
214 return prev - (in << 16);
231 static Eina_Bool _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
232 static Eina_Bool _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
233 static Eina_Bool _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
234 static Eina_Bool _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
235 static Eina_Bool _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
236 static Eina_Bool _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
237 static void _ecore_ipc_event_client_add_free(void *data, void *ev);
238 static void _ecore_ipc_event_client_del_free(void *data, void *ev);
239 static void _ecore_ipc_event_client_data_free(void *data, void *ev);
240 static void _ecore_ipc_event_server_add_free(void *data, void *ev);
241 static void _ecore_ipc_event_server_del_free(void *data, void *ev);
242 static void _ecore_ipc_event_server_data_free(void *data, void *ev);
244 EAPI int ECORE_IPC_EVENT_CLIENT_ADD = 0;
245 EAPI int ECORE_IPC_EVENT_CLIENT_DEL = 0;
246 EAPI int ECORE_IPC_EVENT_SERVER_ADD = 0;
247 EAPI int ECORE_IPC_EVENT_SERVER_DEL = 0;
248 EAPI int ECORE_IPC_EVENT_CLIENT_DATA = 0;
249 EAPI int ECORE_IPC_EVENT_SERVER_DATA = 0;
251 static int _ecore_ipc_init_count = 0;
252 static Eina_List *servers = NULL;
253 static Ecore_Event_Handler *handler[6];
256 * @defgroup Ecore_IPC_Library_Group IPC Library Functions
258 * Functions that set up and shut down the Ecore IPC Library.
262 * Initialises the Ecore IPC library.
263 * @return Number of times the library has been initialised without
265 * @ingroup Ecore_IPC_Library_Group
272 if (++_ecore_ipc_init_count != 1)
273 return _ecore_ipc_init_count;
274 _ecore_ipc_log_dom = eina_log_domain_register
275 ("ecore_ipc", ECORE_IPC_DEFAULT_LOG_COLOR);
276 if(_ecore_ipc_log_dom < 0)
278 EINA_LOG_ERR("Impossible to create a log domain for the Ecore IPC module.");
279 return --_ecore_ipc_init_count;
281 if (!ecore_con_init())
282 return --_ecore_ipc_init_count;
284 ECORE_IPC_EVENT_CLIENT_ADD = ecore_event_type_new();
285 ECORE_IPC_EVENT_CLIENT_DEL = ecore_event_type_new();
286 ECORE_IPC_EVENT_SERVER_ADD = ecore_event_type_new();
287 ECORE_IPC_EVENT_SERVER_DEL = ecore_event_type_new();
288 ECORE_IPC_EVENT_CLIENT_DATA = ecore_event_type_new();
289 ECORE_IPC_EVENT_SERVER_DATA = ecore_event_type_new();
291 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
292 _ecore_ipc_event_client_add, NULL);
293 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
294 _ecore_ipc_event_client_del, NULL);
295 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
296 _ecore_ipc_event_server_add, NULL);
297 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
298 _ecore_ipc_event_server_del, NULL);
299 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
300 _ecore_ipc_event_client_data, NULL);
301 handler[i] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
302 _ecore_ipc_event_server_data, NULL);
303 return _ecore_ipc_init_count;
307 * Shuts down the Ecore IPC library.
308 * @return Number of times the library has been initialised without being
310 * @ingroup Ecore_IPC_Library_Group
313 ecore_ipc_shutdown(void)
317 if (--_ecore_ipc_init_count != 0)
318 return _ecore_ipc_init_count;
320 while (servers) ecore_ipc_server_del(eina_list_data_get(servers));
322 for (i = 0; i < 6; i++)
323 ecore_event_handler_del(handler[i]);
325 ecore_con_shutdown();
326 eina_log_domain_unregister(_ecore_ipc_log_dom);
327 _ecore_ipc_log_dom = -1;
328 return _ecore_ipc_init_count;
332 * @defgroup Ecore_IPC_Server_Group IPC Server Functions
334 * Functions the deal with IPC server objects.
338 * Creates an IPC server that listens for connections.
340 * For more details about the @p compl_type, @p name and @p port
341 * parameters, see the @ref ecore_con_server_add documentation.
343 * @param compl_type The connection type.
344 * @param name Name to associate with the socket used for connection.
345 * @param port Number to identify with socket used for connection.
346 * @param data Data to associate with the IPC server.
347 * @return New IPC server. If there is an error, @c NULL is returned.
348 * @ingroup Ecore_IPC_Server_Group
349 * @todo Need to add protocol type parameter to this function.
351 EAPI Ecore_Ipc_Server *
352 ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, const void *data)
354 Ecore_Ipc_Server *svr;
356 Ecore_Con_Type extra = 0;
358 svr = calloc(1, sizeof(Ecore_Ipc_Server));
359 if (!svr) return NULL;
361 type &= ~ECORE_IPC_USE_SSL;
362 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
365 case ECORE_IPC_LOCAL_USER:
366 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
368 case ECORE_IPC_LOCAL_SYSTEM:
369 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
371 case ECORE_IPC_REMOTE_SYSTEM:
372 svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
383 svr->max_buf_size = 32 * 1024;
384 svr->data = (void *)data;
385 servers = eina_list_append(servers, svr);
386 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
391 * Creates an IPC server object to represent the IPC server listening
394 * For more details about the @p compl_type, @p name and @p port
395 * parameters, see the @ref ecore_con_server_connect documentation.
397 * @param compl_type The IPC connection type.
398 * @param name Name used to determine which socket to use for the
400 * @param port Number used to identify the socket to use for the
402 * @param data Data to associate with the server.
403 * @return A new IPC server. @c NULL is returned on error.
404 * @ingroup Ecore_IPC_Server_Group
405 * @todo Need to add protocol type parameter.
407 EAPI Ecore_Ipc_Server *
408 ecore_ipc_server_connect(Ecore_Ipc_Type compl_type, char *name, int port, const void *data)
410 Ecore_Ipc_Server *svr;
412 Ecore_Con_Type extra = 0;
414 svr = calloc(1, sizeof(Ecore_Ipc_Server));
415 if (!svr) return NULL;
417 type &= ~ECORE_IPC_USE_SSL;
418 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
421 case ECORE_IPC_LOCAL_USER:
422 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
424 case ECORE_IPC_LOCAL_SYSTEM:
425 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
427 case ECORE_IPC_REMOTE_SYSTEM:
428 svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
439 svr->max_buf_size = -1;
440 svr->data = (void *)data;
441 servers = eina_list_append(servers, svr);
442 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
447 * Closes the connection and frees the given IPC server.
448 * @param svr The given IPC server.
449 * @return The data associated with the server when it was created.
450 * @ingroup Ecore_IPC_Server_Group
453 ecore_ipc_server_del(Ecore_Ipc_Server *svr)
457 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
459 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
460 "ecore_ipc_server_del");
463 if (svr->delete_me) return NULL;
468 if (svr->event_count == 0)
470 Ecore_Ipc_Client *cl;
472 EINA_LIST_FREE(svr->clients, cl)
473 ecore_ipc_client_del(cl);
474 ecore_con_server_del(svr->server);
475 servers = eina_list_remove(servers, svr);
477 if (svr->buf) free(svr->buf);
478 ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
485 * Retrieves the data associated with the given IPC server.
486 * @param svr The given IPC server.
487 * @return The associated data.
488 * @ingroup Ecore_IPC_Server_Group
491 ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
493 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
495 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
496 "ecore_ipc_server_data_get");
503 * Retrieves whether the given IPC server is currently connected.
504 * @param svr The given IPC server.
505 * @return #EINA_TRUE if the server is connected. #EINA_FALSE otherwise.
506 * @ingroup Ecore_IPC_Server_Group
509 ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
511 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
513 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
514 "ecore_ipc_server_connected_get");
517 return ecore_con_server_connected_get(svr->server);
521 * Retrieves the list of clients for this server.
522 * @param svr The given IPC server.
523 * @return An Eina_List with the clients.
524 * @ingroup Ecore_IPC_Server_Group
527 ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
529 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
531 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
532 "ecore_ipc_server_clients_get");
535 return svr->client_list;
538 #define SVENC(_member) \
539 d = _ecore_ipc_dlt_int(msg._member, svr->prev.o._member, &md); \
544 dd = (unsigned char *)&v; \
547 *(dat + s + 0) = dd[0]; \
548 *(dat + s + 1) = dd[1]; \
549 *(dat + s + 2) = dd[2]; \
550 *(dat + s + 3) = dd[3]; \
553 else if (md >= DLT_ADD16) \
557 dd = (unsigned char *)&v; \
560 *(dat + s + 0) = dd[0]; \
561 *(dat + s + 1) = dd[1]; \
564 else if (md >= DLT_ADD8) \
566 *(dat + s + 0) = (unsigned char)d; \
571 * Sends a message to the given IPC server.
573 * The content of the parameters, excluding the @p svr paramter, is up to
576 * @param svr The given IPC server.
577 * @param major Major opcode of the message.
578 * @param minor Minor opcode of the message.
579 * @param ref Message reference number.
580 * @param ref_to Reference number of the message this message refers to.
581 * @param response Requires response.
582 * @param data The data to send as part of the message.
583 * @param size Length of the data, in bytes, to send.
584 * @return Number of bytes sent. @c 0 is returned if there is an error.
585 * @ingroup Ecore_IPC_Server_Group
586 * @todo This function needs to become an IPC message.
587 * @todo Fix up the documentation: Make sure what ref_to and response are.
590 ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
592 Ecore_Ipc_Msg_Head msg;
594 int *head, md = 0, d, s;
595 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
597 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
599 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
600 "ecore_ipc_server_send");
603 if (size < 0) size = 0;
608 msg.response = response;
615 *head |= md << (4 * 1);
617 *head |= md << (4 * 2);
619 *head |= md << (4 * 3);
621 *head |= md << (4 * 4);
623 *head |= md << (4 * 5);
624 *head = htonl(*head);
626 ret = ecore_con_server_send(svr->server, dat, s);
627 if (size > 0) ret += ecore_con_server_send(svr->server, data, size);
632 * Sets a limit on the number of clients that can be handled concurrently
633 * by the given server, and a policy on what to do if excess clients try to
635 * Beware that if you set this once ecore is already running, you may
636 * already have pending CLIENT_ADD events in your event queue. Those
637 * clients have already connected and will not be affected by this call.
638 * Only clients subsequently trying to connect will be affected.
639 * @param svr The given server.
640 * @param client_limit The maximum number of clients to handle
641 * concurrently. -1 means unlimited (default). 0
642 * effectively disables the server.
643 * @param reject_excess_clients Set to 1 to automatically disconnect
644 * excess clients as soon as they connect if you are
645 * already handling client_limit clients. Set to 0
646 * (default) to just hold off on the "accept()"
647 * system call until the number of active clients
648 * drops. This causes the kernel to queue up to 4096
649 * connections (or your kernel's limit, whichever is
651 * @ingroup Ecore_Ipc_Server_Group
654 ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients)
656 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
658 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
659 "ecore_ipc_server_client_limit_set");
662 ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients);
666 * Sets the max data payload size for an Ipc message in bytes
668 * @param svr The given server.
669 * @param size The maximum data payload size in bytes.
670 * @ingroup Ecore_Ipc_Server_Group
673 ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size)
675 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
677 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
678 "ecore_ipc_server_data_size_max_set");
681 svr->max_buf_size = size;
685 * Gets the max data payload size for an Ipc message in bytes
687 * @param svr The given server.
688 * @return The maximum data payload in bytes.
689 * @ingroup Ecore_Ipc_Server_Group
692 ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
694 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
696 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
697 "ecore_ipc_server_data_size_max_get");
700 return svr->max_buf_size;
704 * Gets the IP address of a server that has been connected to.
706 * @param svr The given server.
707 * @return A pointer to an internal string that contains the IP address of
708 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
709 * This string should not be modified or trusted to stay valid after
710 * deletion for the @p svr object. If no IP is known NULL is returned.
711 * @ingroup Ecore_Ipc_Server_Group
714 ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr)
716 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
718 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
719 "ecore_ipc_server_ip_get");
722 return ecore_con_server_ip_get(svr->server);
726 * Flushes all pending data to the given server. Will return when done.
728 * @param svr The given server.
729 * @ingroup Ecore_Ipc_Server_Group
732 ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
734 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
736 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
737 "ecore_ipc_server_server_flush");
740 ecore_con_server_flush(svr->server);
743 #define CLENC(_member) \
744 d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \
749 dd = (unsigned char *)&v; \
752 *(dat + s + 0) = dd[0]; \
753 *(dat + s + 1) = dd[1]; \
754 *(dat + s + 2) = dd[2]; \
755 *(dat + s + 3) = dd[3]; \
758 else if (md >= DLT_ADD16) \
762 dd = (unsigned char *)&v; \
765 *(dat + s + 0) = dd[0]; \
766 *(dat + s + 1) = dd[1]; \
769 else if (md >= DLT_ADD8) \
771 *(dat + s) = (unsigned char)d; \
776 * @defgroup Ecore_IPC_Client_Group IPC Client Functions
778 * Functions that deal with IPC client objects.
782 * Sends a message to the given IPC client.
783 * @param cl The given IPC client.
784 * @param major Major opcode of the message.
785 * @param minor Minor opcode of the message.
786 * @param ref Reference number of the message.
787 * @param ref_to Reference number of the message this message refers to.
788 * @param response Requires response.
789 * @param data The data to send as part of the message.
790 * @param size Length of the data, in bytes, to send.
791 * @return The number of bytes sent. @c 0 will be returned if there is
793 * @ingroup Ecore_IPC_Client_Group
794 * @todo This function needs to become an IPC message.
795 * @todo Make sure ref_to and response parameters are described correctly.
798 ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
800 Ecore_Ipc_Msg_Head msg;
802 int *head, md = 0, d, s;
803 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
805 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
807 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
808 "ecore_ipc_client_send");
811 if (size < 0) size = 0;
816 msg.response = response;
823 *head |= md << (4 * 1);
825 *head |= md << (4 * 2);
827 *head |= md << (4 * 3);
829 *head |= md << (4 * 4);
831 *head |= md << (4 * 5);
832 *head = htonl(*head);
834 ret = ecore_con_client_send(cl->client, dat, s);
835 if (size > 0) ret += ecore_con_client_send(cl->client, data, size);
840 * Retrieves the IPC server that the given IPC client is connected to.
841 * @param cl The given IPC client.
842 * @return The IPC server the IPC client is connected to.
843 * @ingroup Ecore_IPC_Client_Group
845 EAPI Ecore_Ipc_Server *
846 ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
848 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
850 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
851 "ecore_ipc_client_server_get");
854 return (ecore_con_server_data_get(ecore_con_client_server_get(cl->client)));
858 * Closes the connection and frees memory allocated to the given IPC
860 * @param cl The given client.
861 * @return Data associated with the client.
862 * @ingroup Ecore_IPC_Client_Group
865 ecore_ipc_client_del(Ecore_Ipc_Client *cl)
868 Ecore_Ipc_Server *svr;
870 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
872 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
873 "ecore_ipc_client_del");
879 if (cl->event_count == 0)
881 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
882 ecore_con_client_del(cl->client);
883 svr->clients = eina_list_remove(svr->clients, cl);
884 if (cl->buf) free(cl->buf);
885 ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
892 * Sets the IPC data associated with the given IPC client to @p data.
893 * @param cl The given IPC client.
894 * @param data The data to associate with the IPC client.
895 * @ingroup Ecore_IPC_Client_Group
898 ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data)
900 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
902 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
903 "ecore_ipc_client_data_set");
906 cl->data = (void *)data;
910 * Retrieves the data that has been associated with the given IPC client.
911 * @param cl The given client.
912 * @return The data associated with the IPC client.
913 * @ingroup Ecore_IPC_Client_Group
916 ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
918 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
920 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
921 "ecore_ipc_client_data_get");
928 * Sets the max data payload size for an Ipc message in bytes
930 * @param client The given client.
931 * @param size The maximum data payload size in bytes.
932 * @ingroup Ecore_Ipc_Client_Group
935 ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size)
937 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
939 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
940 "ecore_ipc_client_data_size_max_set");
943 cl->max_buf_size = size;
947 * Sets the max data payload size for an Ipc message in bytes
949 * @param cl The given client.
950 * @param size The maximum data payload size in bytes.
951 * @ingroup Ecore_Ipc_Client_Group
954 ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
956 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
958 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
959 "ecore_ipc_client_data_size_max_get");
962 return cl->max_buf_size;
966 * Gets the IP address of a client that has been connected to.
968 * @param cl The given client.
969 * @return A pointer to an internal string that contains the IP address of
970 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
971 * This string should not be modified or trusted to stay valid after
972 * deletion for the @p cl object. If no IP is known NULL is returned.
973 * @ingroup Ecore_Ipc_Client_Group
976 ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl)
978 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
980 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
981 "ecore_ipc_client_ip_get");
984 return ecore_con_client_ip_get(cl->client);
988 * Flushes all pending data to the given client. Will return when done.
990 * @param cl The given client.
991 * @ingroup Ecore_Ipc_Client_Group
994 ecore_ipc_client_flush(Ecore_Ipc_Client *cl)
996 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
998 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
999 "ecore_ipc_client_flush");
1002 ecore_con_client_flush(cl->client);
1006 * Returns if SSL support is available
1007 * @return 1 if SSL is available, 0 if it is not.
1008 * @ingroup Ecore_Con_Client_Group
1011 ecore_ipc_ssl_available_get(void)
1013 return ecore_con_ssl_available_get();
1018 _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1020 Ecore_Con_Event_Client_Add *e;
1023 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1024 /* handling code here */
1026 Ecore_Ipc_Client *cl;
1027 Ecore_Ipc_Server *svr;
1029 cl = calloc(1, sizeof(Ecore_Ipc_Client));
1030 if (!cl) return ECORE_CALLBACK_CANCEL;
1031 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1032 ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
1033 cl->client = e->client;
1034 cl->max_buf_size = 32 * 1024;
1035 ecore_con_client_data_set(cl->client, (void *)cl);
1036 svr->clients = eina_list_append(svr->clients, cl);
1037 svr->client_list = eina_list_append(svr->client_list, cl);
1040 Ecore_Ipc_Event_Client_Add *e2;
1042 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
1047 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
1048 _ecore_ipc_event_client_add_free, NULL);
1052 return ECORE_CALLBACK_CANCEL;
1056 _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1058 Ecore_Con_Event_Client_Del *e;
1061 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1062 /* handling code here */
1064 Ecore_Ipc_Client *cl;
1066 cl = ecore_con_client_data_get(e->client);
1068 Ecore_Ipc_Event_Client_Del *e2;
1069 Ecore_Ipc_Server *svr;
1071 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1072 svr->client_list = eina_list_remove(svr->client_list, cl);
1075 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
1080 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
1081 _ecore_ipc_event_client_del_free, NULL);
1086 return ECORE_CALLBACK_CANCEL;
1090 _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1092 Ecore_Con_Event_Server_Add *e;
1095 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1096 /* handling code here */
1098 Ecore_Ipc_Server *svr;
1100 svr = ecore_con_server_data_get(e->server);
1101 if (!svr->delete_me)
1103 Ecore_Ipc_Event_Server_Add *e2;
1105 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
1110 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
1111 _ecore_ipc_event_server_add_free, NULL);
1115 return ECORE_CALLBACK_CANCEL;
1119 _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1121 Ecore_Con_Event_Server_Del *e;
1124 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1125 /* handling code here */
1127 Ecore_Ipc_Server *svr;
1129 svr = ecore_con_server_data_get(e->server);
1130 if (!svr->delete_me)
1132 Ecore_Ipc_Event_Server_Del *e2;
1134 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
1139 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
1140 _ecore_ipc_event_server_del_free, NULL);
1144 return ECORE_CALLBACK_CANCEL;
1148 md = ((head >> (4 * _n)) & 0xf); \
1149 if (md >= DLT_SET) s += 4; \
1150 else if (md >= DLT_ADD16) s += 2; \
1151 else if (md >= DLT_ADD8) s += 1;
1153 #define CLDEC(_n, _member) \
1154 md = ((head >> (4 * _n)) & 0xf); \
1155 if (md >= DLT_SET) \
1158 unsigned char *dv; \
1159 dv = (unsigned char *)&v; \
1160 dv[0] = *(cl->buf + offset + s + 0); \
1161 dv[1] = *(cl->buf + offset + s + 1); \
1162 dv[2] = *(cl->buf + offset + s + 2); \
1163 dv[3] = *(cl->buf + offset + s + 3); \
1164 d = (int)ntohl(v); \
1167 else if (md >= DLT_ADD16) \
1170 unsigned char *dv; \
1171 dv = (unsigned char *)&v; \
1172 dv[0] = *(cl->buf + offset + s + 0); \
1173 dv[1] = *(cl->buf + offset + s + 1); \
1174 d = (int)ntohs(v); \
1177 else if (md >= DLT_ADD8) \
1180 unsigned char *dv; \
1181 dv = (unsigned char *)&v; \
1182 dv[0] = *(cl->buf + offset + s + 0); \
1186 msg._member = _ecore_ipc_ddlt_int(d, cl->prev.i._member, md);
1189 _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1191 Ecore_Con_Event_Client_Data *e;
1194 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1195 /* handling code here */
1197 Ecore_Ipc_Client *cl;
1198 Ecore_Ipc_Msg_Head msg;
1202 cl = ecore_con_client_data_get(e->client);
1206 cl->buf_size = e->size;
1208 e->data = NULL; /* take it out of the old event */
1212 buf = realloc(cl->buf, cl->buf_size + e->size);
1218 return ECORE_CALLBACK_CANCEL;
1221 memcpy(cl->buf + cl->buf_size, e->data, e->size);
1222 cl->buf_size += e->size;
1224 /* examine header */
1226 if ((cl->buf_size - offset) >= (int)sizeof(int))
1228 int s, md, d = 0, head;
1231 dd = (unsigned char *)&head;
1232 dd[0] = *(cl->buf + offset + 0);
1233 dd[1] = *(cl->buf + offset + 1);
1234 dd[2] = *(cl->buf + offset + 2);
1235 dd[3] = *(cl->buf + offset + 3);
1237 dd = (unsigned char *)&d;
1245 if ((cl->buf_size - offset) < s)
1247 if (offset > 0) goto scroll;
1248 return ECORE_CALLBACK_CANCEL;
1258 if (msg.size < 0) msg.size = 0;
1259 /* there is enough data in the buffer for a full message */
1260 if ((cl->buf_size - offset) >= (s + msg.size))
1262 Ecore_Ipc_Event_Client_Data *e2;
1263 Ecore_Ipc_Server *svr;
1267 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
1268 max = svr->max_buf_size;
1269 max2 = cl->max_buf_size;
1270 if ((max >= 0) && (max2 >= 0))
1272 if (max2 < max) max = max2;
1276 if (max < 0) max = max2;
1278 if ((max < 0) || (msg.size <= max))
1282 buf = malloc(msg.size);
1283 if (!buf) return ECORE_CALLBACK_CANCEL;
1284 memcpy(buf, cl->buf + offset + s, msg.size);
1288 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
1293 e2->major = msg.major;
1294 e2->minor = msg.minor;
1296 e2->ref_to = msg.ref_to;
1297 e2->response = msg.response;
1298 e2->size = msg.size;
1300 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
1301 _ecore_ipc_event_client_data_free,
1307 offset += (s + msg.size);
1308 if (cl->buf_size == offset)
1313 return ECORE_CALLBACK_CANCEL;
1322 buf = malloc(cl->buf_size - offset);
1328 return ECORE_CALLBACK_CANCEL;
1330 memcpy(buf, cl->buf + offset, cl->buf_size - offset);
1333 cl->buf_size -= offset;
1336 return ECORE_CALLBACK_CANCEL;
1340 md = ((head >> (4 * _n)) & 0xf); \
1341 if (md >= DLT_SET) s += 4; \
1342 else if (md >= DLT_ADD16) s += 2; \
1343 else if (md >= DLT_ADD8) s += 1;
1345 #define SVDEC(_n, _member) \
1346 md = ((head >> (4 * _n)) & 0xf); \
1347 if (md >= DLT_SET) \
1350 unsigned char *dv; \
1351 dv = (unsigned char *)&v; \
1352 dv[0] = *(svr->buf + offset + s + 0); \
1353 dv[1] = *(svr->buf + offset + s + 1); \
1354 dv[2] = *(svr->buf + offset + s + 2); \
1355 dv[3] = *(svr->buf + offset + s + 3); \
1356 d = (int)ntohl(v); \
1359 else if (md >= DLT_ADD16) \
1362 unsigned char *dv; \
1363 dv = (unsigned char *)&v; \
1364 dv[0] = *(svr->buf + offset + s + 0); \
1365 dv[1] = *(svr->buf + offset + s + 1); \
1366 d = (int)ntohs(v); \
1369 else if (md >= DLT_ADD8) \
1372 unsigned char *dv; \
1373 dv = (unsigned char *)&v; \
1374 dv[0] = *(svr->buf + offset + s + 0); \
1378 msg._member = _ecore_ipc_ddlt_int(d, svr->prev.i._member, md);
1381 _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1383 Ecore_Con_Event_Server_Data *e;
1386 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1387 /* handling code here */
1389 Ecore_Ipc_Server *svr;
1390 Ecore_Ipc_Msg_Head msg;
1394 svr = ecore_con_server_data_get(e->server);
1398 svr->buf_size = e->size;
1400 e->data = NULL; /* take it out of the old event */
1404 buf = realloc(svr->buf, svr->buf_size + e->size);
1410 return ECORE_CALLBACK_CANCEL;
1413 memcpy(svr->buf + svr->buf_size, e->data, e->size);
1414 svr->buf_size += e->size;
1416 /* examine header */
1418 if ((svr->buf_size - offset) >= (int)sizeof(int))
1420 int s, md, d = 0, head;
1423 dd = (unsigned char *)&head;
1424 dd[0] = *(svr->buf + offset + 0);
1425 dd[1] = *(svr->buf + offset + 1);
1426 dd[2] = *(svr->buf + offset + 2);
1427 dd[3] = *(svr->buf + offset + 3);
1429 dd = (unsigned char *)&d;
1437 if ((svr->buf_size - offset) < s)
1439 if (offset > 0) goto scroll;
1440 return ECORE_CALLBACK_CANCEL;
1450 if (msg.size < 0) msg.size = 0;
1451 /* there is enough data in the buffer for a full message */
1452 if ((svr->buf_size - offset) >= (s + msg.size))
1454 Ecore_Ipc_Event_Server_Data *e2;
1458 max = svr->max_buf_size;
1459 if ((max < 0) || (msg.size <= max))
1463 buf = malloc(msg.size);
1464 if (!buf) return ECORE_CALLBACK_CANCEL;
1465 memcpy(buf, svr->buf + offset + s, msg.size);
1467 if (!svr->delete_me)
1469 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
1474 e2->major = msg.major;
1475 e2->minor = msg.minor;
1477 e2->ref_to = msg.ref_to;
1478 e2->response = msg.response;
1479 e2->size = msg.size;
1481 ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
1482 _ecore_ipc_event_server_data_free,
1488 offset += (s + msg.size);
1489 if (svr->buf_size == offset)
1494 return ECORE_CALLBACK_CANCEL;
1503 buf = malloc(svr->buf_size - offset);
1509 return ECORE_CALLBACK_CANCEL;
1511 memcpy(buf, svr->buf + offset, svr->buf_size - offset);
1514 svr->buf_size -= offset;
1517 return ECORE_CALLBACK_CANCEL;
1521 _ecore_ipc_event_client_add_free(void *data __UNUSED__, void *ev)
1523 Ecore_Ipc_Event_Client_Add *e;
1526 e->client->event_count--;
1527 if ((e->client->event_count == 0) && (e->client->delete_me))
1528 ecore_ipc_client_del(e->client);
1533 _ecore_ipc_event_client_del_free(void *data __UNUSED__, void *ev)
1535 Ecore_Ipc_Event_Client_Del *e;
1538 e->client->event_count--;
1539 if ((e->client->event_count == 0) && (e->client->delete_me))
1540 ecore_ipc_client_del(e->client);
1545 _ecore_ipc_event_client_data_free(void *data __UNUSED__, void *ev)
1547 Ecore_Ipc_Event_Client_Data *e;
1550 e->client->event_count--;
1551 if (e->data) free(e->data);
1552 if ((e->client->event_count == 0) && (e->client->delete_me))
1553 ecore_ipc_client_del(e->client);
1558 _ecore_ipc_event_server_add_free(void *data __UNUSED__, void *ev)
1560 Ecore_Ipc_Event_Server_Add *e;
1563 e->server->event_count--;
1564 if ((e->server->event_count == 0) && (e->server->delete_me))
1565 ecore_ipc_server_del(e->server);
1570 _ecore_ipc_event_server_del_free(void *data __UNUSED__, void *ev)
1572 Ecore_Ipc_Event_Server_Add *e;
1575 e->server->event_count--;
1576 if ((e->server->event_count == 0) && (e->server->delete_me))
1577 ecore_ipc_server_del(e->server);
1582 _ecore_ipc_event_server_data_free(void *data __UNUSED__, void *ev)
1584 Ecore_Ipc_Event_Server_Data *e;
1587 if (e->data) free(e->data);
1588 e->server->event_count--;
1589 if ((e->server->event_count == 0) && (e->server->delete_me))
1590 ecore_ipc_server_del(e->server);