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;
49 _ecore_ipc_swap_16(unsigned short v)
53 s = (unsigned char *)(&v);
54 t = s[0]; s[0] = s[1]; s[1] = t;
59 _ecore_ipc_swap_32(unsigned int v)
63 s = (unsigned char *)(&v);
64 t = s[0]; s[0] = s[3]; s[3] = t;
65 t = s[1]; s[1] = s[2]; s[2] = t;
69 EAPI unsigned long long
70 _ecore_ipc_swap_64(unsigned long long v)
74 s = (unsigned char *)(&v);
75 t = s[0]; s[0] = s[7]; s[7] = t;
76 t = s[1]; s[1] = s[6]; s[6] = t;
77 t = s[2]; s[2] = s[5]; s[5] = t;
78 t = s[3]; s[3] = s[4]; s[4] = t;
82 static int _ecore_ipc_dlt_int(int out, int prev, int *mode);
83 static int _ecore_ipc_ddlt_int(int in, int prev, int mode);
86 _ecore_ipc_dlt_int(int out, int prev, int *mode)
96 if (out == (int)0xffffffff)
106 if (out == prev << 1)
111 if (out == prev >> 1)
118 if (!(dlt & 0xffffff00))
124 if (!(dlt & 0xffffff00))
130 if (!(dlt & 0x00ffffff))
133 return (dlt >> 24) & 0xff;
136 if (!(dlt & 0x00ffffff))
139 return (dlt >> 24) & 0xff;
143 if (!(dlt & 0xffff0000))
149 if (!(dlt & 0xffff0000))
155 if (!(dlt & 0x0000ffff))
158 return (dlt >> 16) & 0xffff;
161 if (!(dlt & 0x0000ffff))
164 return (dlt >> 16) & 0xffff;
172 _ecore_ipc_ddlt_int(int in, int prev, int mode)
198 return prev + (in << 24);
201 return prev - (in << 24);
210 return prev + (in << 16);
213 return prev - (in << 16);
230 static Eina_Bool _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
231 static Eina_Bool _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
232 static Eina_Bool _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
233 static Eina_Bool _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
234 static Eina_Bool _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
235 static Eina_Bool _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
236 static void _ecore_ipc_event_client_add_free(void *data, void *ev);
237 static void _ecore_ipc_event_client_del_free(void *data, void *ev);
238 static void _ecore_ipc_event_client_data_free(void *data, void *ev);
239 static void _ecore_ipc_event_server_add_free(void *data, void *ev);
240 static void _ecore_ipc_event_server_del_free(void *data, void *ev);
241 static void _ecore_ipc_event_server_data_free(void *data, void *ev);
243 EAPI int ECORE_IPC_EVENT_CLIENT_ADD = 0;
244 EAPI int ECORE_IPC_EVENT_CLIENT_DEL = 0;
245 EAPI int ECORE_IPC_EVENT_SERVER_ADD = 0;
246 EAPI int ECORE_IPC_EVENT_SERVER_DEL = 0;
247 EAPI int ECORE_IPC_EVENT_CLIENT_DATA = 0;
248 EAPI int ECORE_IPC_EVENT_SERVER_DATA = 0;
250 static int _ecore_ipc_init_count = 0;
251 static Eina_List *servers = NULL;
252 static Ecore_Event_Handler *handler[6];
255 * @defgroup Ecore_IPC_Library_Group IPC Library Functions
257 * Functions that set up and shut down the Ecore IPC Library.
261 * Initialises the Ecore IPC library.
262 * @return Number of times the library has been initialised without
264 * @ingroup Ecore_IPC_Library_Group
271 if (++_ecore_ipc_init_count != 1)
272 return _ecore_ipc_init_count;
273 _ecore_ipc_log_dom = eina_log_domain_register
274 ("ecore_ipc", ECORE_IPC_DEFAULT_LOG_COLOR);
275 if(_ecore_ipc_log_dom < 0)
277 EINA_LOG_ERR("Impossible to create a log domain for the Ecore IPC module.");
278 return --_ecore_ipc_init_count;
280 if (!ecore_con_init())
281 return --_ecore_ipc_init_count;
283 ECORE_IPC_EVENT_CLIENT_ADD = ecore_event_type_new();
284 ECORE_IPC_EVENT_CLIENT_DEL = ecore_event_type_new();
285 ECORE_IPC_EVENT_SERVER_ADD = ecore_event_type_new();
286 ECORE_IPC_EVENT_SERVER_DEL = ecore_event_type_new();
287 ECORE_IPC_EVENT_CLIENT_DATA = ecore_event_type_new();
288 ECORE_IPC_EVENT_SERVER_DATA = ecore_event_type_new();
290 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
291 _ecore_ipc_event_client_add, NULL);
292 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
293 _ecore_ipc_event_client_del, NULL);
294 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
295 _ecore_ipc_event_server_add, NULL);
296 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
297 _ecore_ipc_event_server_del, NULL);
298 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
299 _ecore_ipc_event_client_data, NULL);
300 handler[i] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
301 _ecore_ipc_event_server_data, NULL);
302 return _ecore_ipc_init_count;
306 * Shuts down the Ecore IPC library.
307 * @return Number of times the library has been initialised without being
309 * @ingroup Ecore_IPC_Library_Group
312 ecore_ipc_shutdown(void)
316 if (--_ecore_ipc_init_count != 0)
317 return _ecore_ipc_init_count;
319 while (servers) ecore_ipc_server_del(eina_list_data_get(servers));
321 for (i = 0; i < 6; i++)
322 ecore_event_handler_del(handler[i]);
324 ecore_con_shutdown();
325 eina_log_domain_unregister(_ecore_ipc_log_dom);
326 _ecore_ipc_log_dom = -1;
327 return _ecore_ipc_init_count;
331 * @defgroup Ecore_IPC_Server_Group IPC Server Functions
333 * Functions the deal with IPC server objects.
337 * Creates an IPC server that listens for connections.
339 * For more details about the @p compl_type, @p name and @p port
340 * parameters, see the @ref ecore_con_server_add documentation.
342 * @param compl_type The connection type.
343 * @param name Name to associate with the socket used for connection.
344 * @param port Number to identify with socket used for connection.
345 * @param data Data to associate with the IPC server.
346 * @return New IPC server. If there is an error, @c NULL is returned.
347 * @ingroup Ecore_IPC_Server_Group
348 * @todo Need to add protocol type parameter to this function.
350 EAPI Ecore_Ipc_Server *
351 ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, const void *data)
353 Ecore_Ipc_Server *svr;
355 Ecore_Con_Type extra = 0;
357 svr = calloc(1, sizeof(Ecore_Ipc_Server));
358 if (!svr) return NULL;
360 type &= ~ECORE_IPC_USE_SSL;
361 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
364 case ECORE_IPC_LOCAL_USER:
365 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
367 case ECORE_IPC_LOCAL_SYSTEM:
368 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
370 case ECORE_IPC_REMOTE_SYSTEM:
371 svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
382 svr->max_buf_size = 32 * 1024;
383 svr->data = (void *)data;
384 servers = eina_list_append(servers, svr);
385 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
390 * Creates an IPC server object to represent the IPC server listening
393 * For more details about the @p compl_type, @p name and @p port
394 * parameters, see the @ref ecore_con_server_connect documentation.
396 * @param compl_type The IPC connection type.
397 * @param name Name used to determine which socket to use for the
399 * @param port Number used to identify the socket to use for the
401 * @param data Data to associate with the server.
402 * @return A new IPC server. @c NULL is returned on error.
403 * @ingroup Ecore_IPC_Server_Group
404 * @todo Need to add protocol type parameter.
406 EAPI Ecore_Ipc_Server *
407 ecore_ipc_server_connect(Ecore_Ipc_Type compl_type, char *name, int port, const void *data)
409 Ecore_Ipc_Server *svr;
411 Ecore_Con_Type extra = 0;
413 svr = calloc(1, sizeof(Ecore_Ipc_Server));
414 if (!svr) return NULL;
416 type &= ~ECORE_IPC_USE_SSL;
417 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
420 case ECORE_IPC_LOCAL_USER:
421 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
423 case ECORE_IPC_LOCAL_SYSTEM:
424 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
426 case ECORE_IPC_REMOTE_SYSTEM:
427 svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
438 svr->max_buf_size = -1;
439 svr->data = (void *)data;
440 servers = eina_list_append(servers, svr);
441 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
446 * Closes the connection and frees the given IPC server.
447 * @param svr The given IPC server.
448 * @return The data associated with the server when it was created.
449 * @ingroup Ecore_IPC_Server_Group
452 ecore_ipc_server_del(Ecore_Ipc_Server *svr)
456 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
458 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
459 "ecore_ipc_server_del");
462 if (svr->delete_me) return NULL;
467 if (svr->event_count == 0)
469 Ecore_Ipc_Client *cl;
471 EINA_LIST_FREE(svr->clients, cl)
472 ecore_ipc_client_del(cl);
473 ecore_con_server_del(svr->server);
474 servers = eina_list_remove(servers, svr);
476 if (svr->buf) free(svr->buf);
477 ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
484 * Retrieves the data associated with the given IPC server.
485 * @param svr The given IPC server.
486 * @return The associated data.
487 * @ingroup Ecore_IPC_Server_Group
490 ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
492 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
494 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
495 "ecore_ipc_server_data_get");
502 * Retrieves whether the given IPC server is currently connected.
503 * @param svr The given IPC server.
504 * @return #EINA_TRUE if the server is connected. #EINA_FALSE otherwise.
505 * @ingroup Ecore_IPC_Server_Group
508 ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
510 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
512 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
513 "ecore_ipc_server_connected_get");
516 return ecore_con_server_connected_get(svr->server);
520 * Retrieves the list of clients for this server.
521 * @param svr The given IPC server.
522 * @return An Eina_List with the clients.
523 * @ingroup Ecore_IPC_Server_Group
526 ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
528 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
530 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
531 "ecore_ipc_server_clients_get");
534 return svr->client_list;
537 #define SVENC(_member) \
538 d = _ecore_ipc_dlt_int(msg._member, svr->prev.o._member, &md); \
543 dd = (unsigned char *)&v; \
546 *(dat + s + 0) = dd[0]; \
547 *(dat + s + 1) = dd[1]; \
548 *(dat + s + 2) = dd[2]; \
549 *(dat + s + 3) = dd[3]; \
552 else if (md >= DLT_ADD16) \
556 dd = (unsigned char *)&v; \
559 *(dat + s + 0) = dd[0]; \
560 *(dat + s + 1) = dd[1]; \
563 else if (md >= DLT_ADD8) \
565 *(dat + s + 0) = (unsigned char)d; \
570 * Sends a message to the given IPC server.
572 * The content of the parameters, excluding the @p svr paramter, is up to
575 * @param svr The given IPC server.
576 * @param major Major opcode of the message.
577 * @param minor Minor opcode of the message.
578 * @param ref Message reference number.
579 * @param ref_to Reference number of the message this message refers to.
580 * @param response Requires response.
581 * @param data The data to send as part of the message.
582 * @param size Length of the data, in bytes, to send.
583 * @return Number of bytes sent. @c 0 is returned if there is an error.
584 * @ingroup Ecore_IPC_Server_Group
585 * @todo This function needs to become an IPC message.
586 * @todo Fix up the documentation: Make sure what ref_to and response are.
589 ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
591 Ecore_Ipc_Msg_Head msg;
593 int *head, md = 0, d, s;
594 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
596 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
598 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
599 "ecore_ipc_server_send");
602 if (size < 0) size = 0;
607 msg.response = response;
614 *head |= md << (4 * 1);
616 *head |= md << (4 * 2);
618 *head |= md << (4 * 3);
620 *head |= md << (4 * 4);
622 *head |= md << (4 * 5);
623 *head = htonl(*head);
625 ret = ecore_con_server_send(svr->server, dat, s);
626 if (size > 0) ret += ecore_con_server_send(svr->server, data, size);
631 * Sets a limit on the number of clients that can be handled concurrently
632 * by the given server, and a policy on what to do if excess clients try to
634 * Beware that if you set this once ecore is already running, you may
635 * already have pending CLIENT_ADD events in your event queue. Those
636 * clients have already connected and will not be affected by this call.
637 * Only clients subsequently trying to connect will be affected.
638 * @param svr The given server.
639 * @param client_limit The maximum number of clients to handle
640 * concurrently. -1 means unlimited (default). 0
641 * effectively disables the server.
642 * @param reject_excess_clients Set to 1 to automatically disconnect
643 * excess clients as soon as they connect if you are
644 * already handling client_limit clients. Set to 0
645 * (default) to just hold off on the "accept()"
646 * system call until the number of active clients
647 * drops. This causes the kernel to queue up to 4096
648 * connections (or your kernel's limit, whichever is
650 * @ingroup Ecore_Ipc_Server_Group
653 ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients)
655 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
657 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
658 "ecore_ipc_server_client_limit_set");
661 ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients);
665 * Sets the max data payload size for an Ipc message in bytes
667 * @param svr The given server.
668 * @param size The maximum data payload size in bytes.
669 * @ingroup Ecore_Ipc_Server_Group
672 ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size)
674 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
676 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
677 "ecore_ipc_server_data_size_max_set");
680 svr->max_buf_size = size;
684 * Gets the max data payload size for an Ipc message in bytes
686 * @param svr The given server.
687 * @return The maximum data payload in bytes.
688 * @ingroup Ecore_Ipc_Server_Group
691 ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
693 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
695 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
696 "ecore_ipc_server_data_size_max_get");
699 return svr->max_buf_size;
703 * Gets the IP address of a server that has been connected to.
705 * @param svr The given server.
706 * @return A pointer to an internal string that contains the IP address of
707 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
708 * This string should not be modified or trusted to stay valid after
709 * deletion for the @p svr object. If no IP is known NULL is returned.
710 * @ingroup Ecore_Ipc_Server_Group
713 ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr)
715 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
717 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
718 "ecore_ipc_server_ip_get");
721 return ecore_con_server_ip_get(svr->server);
725 * Flushes all pending data to the given server. Will return when done.
727 * @param svr The given server.
728 * @ingroup Ecore_Ipc_Server_Group
731 ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
733 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
735 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
736 "ecore_ipc_server_server_flush");
739 ecore_con_server_flush(svr->server);
742 #define CLENC(_member) \
743 d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \
748 dd = (unsigned char *)&v; \
751 *(dat + s + 0) = dd[0]; \
752 *(dat + s + 1) = dd[1]; \
753 *(dat + s + 2) = dd[2]; \
754 *(dat + s + 3) = dd[3]; \
757 else if (md >= DLT_ADD16) \
761 dd = (unsigned char *)&v; \
764 *(dat + s + 0) = dd[0]; \
765 *(dat + s + 1) = dd[1]; \
768 else if (md >= DLT_ADD8) \
770 *(dat + s) = (unsigned char)d; \
775 * @defgroup Ecore_IPC_Client_Group IPC Client Functions
777 * Functions that deal with IPC client objects.
781 * Sends a message to the given IPC client.
782 * @param cl The given IPC client.
783 * @param major Major opcode of the message.
784 * @param minor Minor opcode of the message.
785 * @param ref Reference number of the message.
786 * @param ref_to Reference number of the message this message refers to.
787 * @param response Requires response.
788 * @param data The data to send as part of the message.
789 * @param size Length of the data, in bytes, to send.
790 * @return The number of bytes sent. @c 0 will be returned if there is
792 * @ingroup Ecore_IPC_Client_Group
793 * @todo This function needs to become an IPC message.
794 * @todo Make sure ref_to and response parameters are described correctly.
797 ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
799 Ecore_Ipc_Msg_Head msg;
801 int *head, md = 0, d, s;
802 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
804 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
806 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
807 "ecore_ipc_client_send");
810 if (size < 0) size = 0;
815 msg.response = response;
822 *head |= md << (4 * 1);
824 *head |= md << (4 * 2);
826 *head |= md << (4 * 3);
828 *head |= md << (4 * 4);
830 *head |= md << (4 * 5);
831 *head = htonl(*head);
833 ret = ecore_con_client_send(cl->client, dat, s);
834 if (size > 0) ret += ecore_con_client_send(cl->client, data, size);
839 * Retrieves the IPC server that the given IPC client is connected to.
840 * @param cl The given IPC client.
841 * @return The IPC server the IPC client is connected to.
842 * @ingroup Ecore_IPC_Client_Group
844 EAPI Ecore_Ipc_Server *
845 ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
847 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
849 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
850 "ecore_ipc_client_server_get");
853 return (ecore_con_server_data_get(ecore_con_client_server_get(cl->client)));
857 * Closes the connection and frees memory allocated to the given IPC
859 * @param cl The given client.
860 * @return Data associated with the client.
861 * @ingroup Ecore_IPC_Client_Group
864 ecore_ipc_client_del(Ecore_Ipc_Client *cl)
867 Ecore_Ipc_Server *svr;
869 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
871 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
872 "ecore_ipc_client_del");
878 if (cl->event_count == 0)
880 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
881 ecore_con_client_del(cl->client);
882 svr->clients = eina_list_remove(svr->clients, cl);
883 if (cl->buf) free(cl->buf);
884 ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
891 * Sets the IPC data associated with the given IPC client to @p data.
892 * @param cl The given IPC client.
893 * @param data The data to associate with the IPC client.
894 * @ingroup Ecore_IPC_Client_Group
897 ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data)
899 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
901 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
902 "ecore_ipc_client_data_set");
905 cl->data = (void *)data;
909 * Retrieves the data that has been associated with the given IPC client.
910 * @param cl The given client.
911 * @return The data associated with the IPC client.
912 * @ingroup Ecore_IPC_Client_Group
915 ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
917 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
919 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
920 "ecore_ipc_client_data_get");
927 * Sets the max data payload size for an Ipc message in bytes
929 * @param cl The given client.
930 * @param size The maximum data payload size in bytes.
931 * @ingroup Ecore_Ipc_Client_Group
934 ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size)
936 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
938 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
939 "ecore_ipc_client_data_size_max_set");
942 cl->max_buf_size = size;
946 * Sets the max data payload size for an Ipc message in bytes
948 * @param cl The given client.
949 * @ingroup Ecore_Ipc_Client_Group
952 ecore_ipc_client_data_size_max_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_size_max_get");
960 return cl->max_buf_size;
964 * Gets the IP address of a client that has been connected to.
966 * @param cl The given client.
967 * @return A pointer to an internal string that contains the IP address of
968 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
969 * This string should not be modified or trusted to stay valid after
970 * deletion for the @p cl object. If no IP is known NULL is returned.
971 * @ingroup Ecore_Ipc_Client_Group
974 ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl)
976 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
978 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
979 "ecore_ipc_client_ip_get");
982 return ecore_con_client_ip_get(cl->client);
986 * Flushes all pending data to the given client. Will return when done.
988 * @param cl The given client.
989 * @ingroup Ecore_Ipc_Client_Group
992 ecore_ipc_client_flush(Ecore_Ipc_Client *cl)
994 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
996 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
997 "ecore_ipc_client_flush");
1000 ecore_con_client_flush(cl->client);
1004 * Returns if SSL support is available
1005 * @return 1 if SSL is available, 0 if it is not.
1006 * @ingroup Ecore_Con_Client_Group
1009 ecore_ipc_ssl_available_get(void)
1011 return ecore_con_ssl_available_get();
1016 _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1018 Ecore_Con_Event_Client_Add *e;
1021 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1022 /* handling code here */
1024 Ecore_Ipc_Client *cl;
1025 Ecore_Ipc_Server *svr;
1027 cl = calloc(1, sizeof(Ecore_Ipc_Client));
1028 if (!cl) return ECORE_CALLBACK_CANCEL;
1029 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1030 ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
1031 cl->client = e->client;
1032 cl->max_buf_size = 32 * 1024;
1033 ecore_con_client_data_set(cl->client, (void *)cl);
1034 svr->clients = eina_list_append(svr->clients, cl);
1035 svr->client_list = eina_list_append(svr->client_list, cl);
1038 Ecore_Ipc_Event_Client_Add *e2;
1040 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
1045 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
1046 _ecore_ipc_event_client_add_free, NULL);
1050 return ECORE_CALLBACK_CANCEL;
1054 _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1056 Ecore_Con_Event_Client_Del *e;
1059 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1060 /* handling code here */
1062 Ecore_Ipc_Client *cl;
1064 cl = ecore_con_client_data_get(e->client);
1066 Ecore_Ipc_Event_Client_Del *e2;
1067 Ecore_Ipc_Server *svr;
1069 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1070 svr->client_list = eina_list_remove(svr->client_list, cl);
1073 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
1078 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
1079 _ecore_ipc_event_client_del_free, NULL);
1084 return ECORE_CALLBACK_CANCEL;
1088 _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1090 Ecore_Con_Event_Server_Add *e;
1093 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1094 /* handling code here */
1096 Ecore_Ipc_Server *svr;
1098 svr = ecore_con_server_data_get(e->server);
1099 if (!svr->delete_me)
1101 Ecore_Ipc_Event_Server_Add *e2;
1103 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
1108 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
1109 _ecore_ipc_event_server_add_free, NULL);
1113 return ECORE_CALLBACK_CANCEL;
1117 _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1119 Ecore_Con_Event_Server_Del *e;
1122 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1123 /* handling code here */
1125 Ecore_Ipc_Server *svr;
1127 svr = ecore_con_server_data_get(e->server);
1128 if (!svr->delete_me)
1130 Ecore_Ipc_Event_Server_Del *e2;
1132 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
1137 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
1138 _ecore_ipc_event_server_del_free, NULL);
1142 return ECORE_CALLBACK_CANCEL;
1146 md = ((head >> (4 * _n)) & 0xf); \
1147 if (md >= DLT_SET) s += 4; \
1148 else if (md >= DLT_ADD16) s += 2; \
1149 else if (md >= DLT_ADD8) s += 1;
1151 #define CLDEC(_n, _member) \
1152 md = ((head >> (4 * _n)) & 0xf); \
1153 if (md >= DLT_SET) \
1156 unsigned char *dv; \
1157 dv = (unsigned char *)&v; \
1158 dv[0] = *(cl->buf + offset + s + 0); \
1159 dv[1] = *(cl->buf + offset + s + 1); \
1160 dv[2] = *(cl->buf + offset + s + 2); \
1161 dv[3] = *(cl->buf + offset + s + 3); \
1162 d = (int)ntohl(v); \
1165 else if (md >= DLT_ADD16) \
1168 unsigned char *dv; \
1169 dv = (unsigned char *)&v; \
1170 dv[0] = *(cl->buf + offset + s + 0); \
1171 dv[1] = *(cl->buf + offset + s + 1); \
1172 d = (int)ntohs(v); \
1175 else if (md >= DLT_ADD8) \
1178 unsigned char *dv; \
1179 dv = (unsigned char *)&v; \
1180 dv[0] = *(cl->buf + offset + s + 0); \
1184 msg._member = _ecore_ipc_ddlt_int(d, cl->prev.i._member, md);
1187 _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1189 Ecore_Con_Event_Client_Data *e;
1192 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1193 /* handling code here */
1195 Ecore_Ipc_Client *cl;
1196 Ecore_Ipc_Msg_Head msg;
1200 cl = ecore_con_client_data_get(e->client);
1204 cl->buf_size = e->size;
1206 e->data = NULL; /* take it out of the old event */
1210 buf = realloc(cl->buf, cl->buf_size + e->size);
1216 return ECORE_CALLBACK_CANCEL;
1219 memcpy(cl->buf + cl->buf_size, e->data, e->size);
1220 cl->buf_size += e->size;
1222 /* examine header */
1224 if ((cl->buf_size - offset) >= (int)sizeof(int))
1226 int s, md, d = 0, head;
1229 dd = (unsigned char *)&head;
1230 dd[0] = *(cl->buf + offset + 0);
1231 dd[1] = *(cl->buf + offset + 1);
1232 dd[2] = *(cl->buf + offset + 2);
1233 dd[3] = *(cl->buf + offset + 3);
1235 dd = (unsigned char *)&d;
1243 if ((cl->buf_size - offset) < s)
1245 if (offset > 0) goto scroll;
1246 return ECORE_CALLBACK_CANCEL;
1256 if (msg.size < 0) msg.size = 0;
1257 /* there is enough data in the buffer for a full message */
1258 if ((cl->buf_size - offset) >= (s + msg.size))
1260 Ecore_Ipc_Event_Client_Data *e2;
1261 Ecore_Ipc_Server *svr;
1265 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
1266 max = svr->max_buf_size;
1267 max2 = cl->max_buf_size;
1268 if ((max >= 0) && (max2 >= 0))
1270 if (max2 < max) max = max2;
1274 if (max < 0) max = max2;
1276 if ((max < 0) || (msg.size <= max))
1280 buf = malloc(msg.size);
1281 if (!buf) return ECORE_CALLBACK_CANCEL;
1282 memcpy(buf, cl->buf + offset + s, msg.size);
1286 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
1291 e2->major = msg.major;
1292 e2->minor = msg.minor;
1294 e2->ref_to = msg.ref_to;
1295 e2->response = msg.response;
1296 e2->size = msg.size;
1298 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
1299 _ecore_ipc_event_client_data_free,
1305 offset += (s + msg.size);
1306 if (cl->buf_size == offset)
1311 return ECORE_CALLBACK_CANCEL;
1320 buf = malloc(cl->buf_size - offset);
1326 return ECORE_CALLBACK_CANCEL;
1328 memcpy(buf, cl->buf + offset, cl->buf_size - offset);
1331 cl->buf_size -= offset;
1334 return ECORE_CALLBACK_CANCEL;
1338 md = ((head >> (4 * _n)) & 0xf); \
1339 if (md >= DLT_SET) s += 4; \
1340 else if (md >= DLT_ADD16) s += 2; \
1341 else if (md >= DLT_ADD8) s += 1;
1343 #define SVDEC(_n, _member) \
1344 md = ((head >> (4 * _n)) & 0xf); \
1345 if (md >= DLT_SET) \
1348 unsigned char *dv; \
1349 dv = (unsigned char *)&v; \
1350 dv[0] = *(svr->buf + offset + s + 0); \
1351 dv[1] = *(svr->buf + offset + s + 1); \
1352 dv[2] = *(svr->buf + offset + s + 2); \
1353 dv[3] = *(svr->buf + offset + s + 3); \
1354 d = (int)ntohl(v); \
1357 else if (md >= DLT_ADD16) \
1360 unsigned char *dv; \
1361 dv = (unsigned char *)&v; \
1362 dv[0] = *(svr->buf + offset + s + 0); \
1363 dv[1] = *(svr->buf + offset + s + 1); \
1364 d = (int)ntohs(v); \
1367 else if (md >= DLT_ADD8) \
1370 unsigned char *dv; \
1371 dv = (unsigned char *)&v; \
1372 dv[0] = *(svr->buf + offset + s + 0); \
1376 msg._member = _ecore_ipc_ddlt_int(d, svr->prev.i._member, md);
1379 _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1381 Ecore_Con_Event_Server_Data *e;
1384 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1385 /* handling code here */
1387 Ecore_Ipc_Server *svr;
1388 Ecore_Ipc_Msg_Head msg;
1392 svr = ecore_con_server_data_get(e->server);
1396 svr->buf_size = e->size;
1398 e->data = NULL; /* take it out of the old event */
1402 buf = realloc(svr->buf, svr->buf_size + e->size);
1408 return ECORE_CALLBACK_CANCEL;
1411 memcpy(svr->buf + svr->buf_size, e->data, e->size);
1412 svr->buf_size += e->size;
1414 /* examine header */
1416 if ((svr->buf_size - offset) >= (int)sizeof(int))
1418 int s, md, d = 0, head;
1421 dd = (unsigned char *)&head;
1422 dd[0] = *(svr->buf + offset + 0);
1423 dd[1] = *(svr->buf + offset + 1);
1424 dd[2] = *(svr->buf + offset + 2);
1425 dd[3] = *(svr->buf + offset + 3);
1427 dd = (unsigned char *)&d;
1435 if ((svr->buf_size - offset) < s)
1437 if (offset > 0) goto scroll;
1438 return ECORE_CALLBACK_CANCEL;
1448 if (msg.size < 0) msg.size = 0;
1449 /* there is enough data in the buffer for a full message */
1450 if ((svr->buf_size - offset) >= (s + msg.size))
1452 Ecore_Ipc_Event_Server_Data *e2;
1456 max = svr->max_buf_size;
1457 if ((max < 0) || (msg.size <= max))
1461 buf = malloc(msg.size);
1462 if (!buf) return ECORE_CALLBACK_CANCEL;
1463 memcpy(buf, svr->buf + offset + s, msg.size);
1465 if (!svr->delete_me)
1467 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
1472 e2->major = msg.major;
1473 e2->minor = msg.minor;
1475 e2->ref_to = msg.ref_to;
1476 e2->response = msg.response;
1477 e2->size = msg.size;
1479 ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
1480 _ecore_ipc_event_server_data_free,
1486 offset += (s + msg.size);
1487 if (svr->buf_size == offset)
1492 return ECORE_CALLBACK_CANCEL;
1501 buf = malloc(svr->buf_size - offset);
1507 return ECORE_CALLBACK_CANCEL;
1509 memcpy(buf, svr->buf + offset, svr->buf_size - offset);
1512 svr->buf_size -= offset;
1515 return ECORE_CALLBACK_CANCEL;
1519 _ecore_ipc_event_client_add_free(void *data __UNUSED__, void *ev)
1521 Ecore_Ipc_Event_Client_Add *e;
1524 e->client->event_count--;
1525 if ((e->client->event_count == 0) && (e->client->delete_me))
1526 ecore_ipc_client_del(e->client);
1531 _ecore_ipc_event_client_del_free(void *data __UNUSED__, void *ev)
1533 Ecore_Ipc_Event_Client_Del *e;
1536 e->client->event_count--;
1537 if ((e->client->event_count == 0) && (e->client->delete_me))
1538 ecore_ipc_client_del(e->client);
1543 _ecore_ipc_event_client_data_free(void *data __UNUSED__, void *ev)
1545 Ecore_Ipc_Event_Client_Data *e;
1548 e->client->event_count--;
1549 if (e->data) free(e->data);
1550 if ((e->client->event_count == 0) && (e->client->delete_me))
1551 ecore_ipc_client_del(e->client);
1556 _ecore_ipc_event_server_add_free(void *data __UNUSED__, void *ev)
1558 Ecore_Ipc_Event_Server_Add *e;
1561 e->server->event_count--;
1562 if ((e->server->event_count == 0) && (e->server->delete_me))
1563 ecore_ipc_server_del(e->server);
1568 _ecore_ipc_event_server_del_free(void *data __UNUSED__, void *ev)
1570 Ecore_Ipc_Event_Server_Add *e;
1573 e->server->event_count--;
1574 if ((e->server->event_count == 0) && (e->server->delete_me))
1575 ecore_ipc_server_del(e->server);
1580 _ecore_ipc_event_server_data_free(void *data __UNUSED__, void *ev)
1582 Ecore_Ipc_Event_Server_Data *e;
1585 if (e->data) free(e->data);
1586 e->server->event_count--;
1587 if ((e->server->event_count == 0) && (e->server->delete_me))
1588 ecore_ipc_server_del(e->server);