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;
320 Ecore_Ipc_Server *svr;
321 EINA_LIST_FOREACH_SAFE(servers, l, l2, svr)
322 ecore_ipc_server_del(svr);
324 for (i = 0; i < 6; i++)
325 ecore_event_handler_del(handler[i]);
327 ecore_con_shutdown();
328 eina_log_domain_unregister(_ecore_ipc_log_dom);
329 _ecore_ipc_log_dom = -1;
330 return _ecore_ipc_init_count;
334 * @defgroup Ecore_IPC_Server_Group IPC Server Functions
336 * Functions the deal with IPC server objects.
340 * Creates an IPC server that listens for connections.
342 * For more details about the @p compl_type, @p name and @p port
343 * parameters, see the @ref ecore_con_server_add documentation.
345 * @param compl_type The connection type.
346 * @param name Name to associate with the socket used for connection.
347 * @param port Number to identify with socket used for connection.
348 * @param data Data to associate with the IPC server.
349 * @return New IPC server. If there is an error, @c NULL is returned.
350 * @ingroup Ecore_IPC_Server_Group
351 * @todo Need to add protocol type parameter to this function.
353 EAPI Ecore_Ipc_Server *
354 ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, const void *data)
356 Ecore_Ipc_Server *svr;
358 Ecore_Con_Type extra = 0;
360 if (!name) return NULL;
362 svr = calloc(1, sizeof(Ecore_Ipc_Server));
363 if (!svr) return NULL;
365 type &= ~ECORE_IPC_USE_SSL;
366 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
369 case ECORE_IPC_LOCAL_USER:
370 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
372 case ECORE_IPC_LOCAL_SYSTEM:
373 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
375 case ECORE_IPC_REMOTE_SYSTEM:
376 svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
387 svr->max_buf_size = 32 * 1024;
388 svr->data = (void *)data;
389 servers = eina_list_append(servers, svr);
390 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
395 * Creates an IPC server object to represent the IPC server listening
398 * For more details about the @p compl_type, @p name and @p port
399 * parameters, see the @ref ecore_con_server_connect documentation.
401 * @param compl_type The IPC connection type.
402 * @param name Name used to determine which socket to use for the
404 * @param port Number used to identify the socket to use for the
406 * @param data Data to associate with the server.
407 * @return A new IPC server. @c NULL is returned on error.
408 * @ingroup Ecore_IPC_Server_Group
409 * @todo Need to add protocol type parameter.
411 EAPI Ecore_Ipc_Server *
412 ecore_ipc_server_connect(Ecore_Ipc_Type compl_type, char *name, int port, const void *data)
414 Ecore_Ipc_Server *svr;
416 Ecore_Con_Type extra = 0;
419 svr = calloc(1, sizeof(Ecore_Ipc_Server));
420 if (!svr) return NULL;
421 type = compl_type & ECORE_IPC_TYPE;
422 features = compl_type & ECORE_IPC_SSL;
423 if ((features & ECORE_IPC_USE_SSL) == ECORE_IPC_USE_SSL)
424 extra |= ECORE_CON_USE_SSL;
425 if ((features & ECORE_IPC_NO_PROXY) == ECORE_IPC_NO_PROXY)
426 extra |= ECORE_CON_NO_PROXY;
429 case ECORE_IPC_LOCAL_USER:
430 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
432 case ECORE_IPC_LOCAL_SYSTEM:
433 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
435 case ECORE_IPC_REMOTE_SYSTEM:
436 svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
447 svr->max_buf_size = -1;
448 svr->data = (void *)data;
449 servers = eina_list_append(servers, svr);
450 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
455 * Closes the connection and frees the given IPC server.
456 * @param svr The given IPC server.
457 * @return The data associated with the server when it was created.
458 * @ingroup Ecore_IPC_Server_Group
461 ecore_ipc_server_del(Ecore_Ipc_Server *svr)
465 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
467 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
468 "ecore_ipc_server_del");
471 if (svr->delete_me) return NULL;
476 if (svr->event_count == 0)
478 Ecore_Ipc_Client *cl;
480 EINA_LIST_FREE(svr->clients, cl)
481 ecore_ipc_client_del(cl);
482 if (svr->server) ecore_con_server_del(svr->server);
483 servers = eina_list_remove(servers, svr);
485 if (svr->buf) free(svr->buf);
486 ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
493 * Retrieves the data associated with the given IPC server.
494 * @param svr The given IPC server.
495 * @return The associated data.
496 * @ingroup Ecore_IPC_Server_Group
499 ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
501 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
503 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
504 "ecore_ipc_server_data_get");
511 * Retrieves whether the given IPC server is currently connected.
512 * @param svr The given IPC server.
513 * @return @c EINA_TRUE if the server is connected, @c EINA_FALSE otherwise.
514 * @ingroup Ecore_IPC_Server_Group
517 ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
519 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
521 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
522 "ecore_ipc_server_connected_get");
525 return ecore_con_server_connected_get(svr->server);
529 * Retrieves the list of clients for this server.
530 * @param svr The given IPC server.
531 * @return An Eina_List with the clients.
532 * @ingroup Ecore_IPC_Server_Group
535 ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
537 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
539 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
540 "ecore_ipc_server_clients_get");
546 #define SVENC(_member) \
547 d = _ecore_ipc_dlt_int(msg._member, svr->prev.o._member, &md); \
552 dd = (unsigned char *)&v; \
555 *(dat + s + 0) = dd[0]; \
556 *(dat + s + 1) = dd[1]; \
557 *(dat + s + 2) = dd[2]; \
558 *(dat + s + 3) = dd[3]; \
561 else if (md >= DLT_ADD16) \
565 dd = (unsigned char *)&v; \
568 *(dat + s + 0) = dd[0]; \
569 *(dat + s + 1) = dd[1]; \
572 else if (md >= DLT_ADD8) \
574 *(dat + s + 0) = (unsigned char)d; \
579 * Sends a message to the given IPC server.
581 * The content of the parameters, excluding the @p svr paramter, is up to
584 * @param svr The given IPC server.
585 * @param major Major opcode of the message.
586 * @param minor Minor opcode of the message.
587 * @param ref Message reference number.
588 * @param ref_to Reference number of the message this message refers to.
589 * @param response Requires response.
590 * @param data The data to send as part of the message.
591 * @param size Length of the data, in bytes, to send.
592 * @return Number of bytes sent. @c 0 is returned if there is an error.
593 * @ingroup Ecore_IPC_Server_Group
594 * @todo This function needs to become an IPC message.
595 * @todo Fix up the documentation: Make sure what ref_to and response are.
598 ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
600 Ecore_Ipc_Msg_Head msg;
602 int *head, md = 0, d, s;
603 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
605 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
607 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
608 "ecore_ipc_server_send");
611 if (size < 0) size = 0;
616 msg.response = response;
623 *head |= md << (4 * 1);
625 *head |= md << (4 * 2);
627 *head |= md << (4 * 3);
629 *head |= md << (4 * 4);
631 *head |= md << (4 * 5);
632 *head = htonl(*head);
634 ret = ecore_con_server_send(svr->server, dat, s);
635 if (size > 0) ret += ecore_con_server_send(svr->server, data, size);
640 * Sets a limit on the number of clients that can be handled concurrently
641 * by the given server, and a policy on what to do if excess clients try to
643 * Beware that if you set this once ecore is already running, you may
644 * already have pending CLIENT_ADD events in your event queue. Those
645 * clients have already connected and will not be affected by this call.
646 * Only clients subsequently trying to connect will be affected.
647 * @param svr The given server.
648 * @param client_limit The maximum number of clients to handle
649 * concurrently. -1 means unlimited (default). 0
650 * effectively disables the server.
651 * @param reject_excess_clients Set to 1 to automatically disconnect
652 * excess clients as soon as they connect if you are
653 * already handling client_limit clients. Set to 0
654 * (default) to just hold off on the "accept()"
655 * system call until the number of active clients
656 * drops. This causes the kernel to queue up to 4096
657 * connections (or your kernel's limit, whichever is
659 * @ingroup Ecore_Ipc_Server_Group
662 ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients)
664 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
666 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
667 "ecore_ipc_server_client_limit_set");
670 ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients);
674 * Sets the max data payload size for an Ipc message in bytes
676 * @param svr The given server.
677 * @param size The maximum data payload size in bytes.
678 * @ingroup Ecore_Ipc_Server_Group
681 ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size)
683 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
685 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
686 "ecore_ipc_server_data_size_max_set");
689 svr->max_buf_size = size;
693 * Gets the max data payload size for an Ipc message in bytes
695 * @param svr The given server.
696 * @return The maximum data payload in bytes.
697 * @ingroup Ecore_Ipc_Server_Group
700 ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
702 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
704 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
705 "ecore_ipc_server_data_size_max_get");
708 return svr->max_buf_size;
712 * Gets the IP address of a server that has been connected to.
714 * @param svr The given server.
715 * @return A pointer to an internal string that contains the IP address of
716 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
717 * This string should not be modified or trusted to stay valid after
718 * deletion for the @p svr object. If no IP is known NULL is returned.
719 * @ingroup Ecore_Ipc_Server_Group
722 ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr)
724 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
726 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
727 "ecore_ipc_server_ip_get");
730 return ecore_con_server_ip_get(svr->server);
734 * Flushes all pending data to the given server. Will return when done.
736 * @param svr The given server.
737 * @ingroup Ecore_Ipc_Server_Group
740 ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
742 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
744 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
745 "ecore_ipc_server_server_flush");
748 ecore_con_server_flush(svr->server);
751 #define CLENC(_member) \
752 d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \
757 dd = (unsigned char *)&v; \
760 *(dat + s + 0) = dd[0]; \
761 *(dat + s + 1) = dd[1]; \
762 *(dat + s + 2) = dd[2]; \
763 *(dat + s + 3) = dd[3]; \
766 else if (md >= DLT_ADD16) \
770 dd = (unsigned char *)&v; \
773 *(dat + s + 0) = dd[0]; \
774 *(dat + s + 1) = dd[1]; \
777 else if (md >= DLT_ADD8) \
779 *(dat + s) = (unsigned char)d; \
784 * @defgroup Ecore_IPC_Client_Group IPC Client Functions
786 * Functions that deal with IPC client objects.
790 * Sends a message to the given IPC client.
791 * @param cl The given IPC client.
792 * @param major Major opcode of the message.
793 * @param minor Minor opcode of the message.
794 * @param ref Reference number of the message.
795 * @param ref_to Reference number of the message this message refers to.
796 * @param response Requires response.
797 * @param data The data to send as part of the message.
798 * @param size Length of the data, in bytes, to send.
799 * @return The number of bytes sent. @c 0 will be returned if there is
801 * @ingroup Ecore_IPC_Client_Group
802 * @todo This function needs to become an IPC message.
803 * @todo Make sure ref_to and response parameters are described correctly.
806 ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
808 Ecore_Ipc_Msg_Head msg;
810 int *head, md = 0, d, s;
811 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
813 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
815 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
816 "ecore_ipc_client_send");
819 EINA_SAFETY_ON_TRUE_RETURN_VAL(!cl->client, 0);
820 EINA_SAFETY_ON_TRUE_RETURN_VAL(!ecore_con_client_connected_get(cl->client), 0);
821 if (size < 0) size = 0;
826 msg.response = response;
833 *head |= md << (4 * 1);
835 *head |= md << (4 * 2);
837 *head |= md << (4 * 3);
839 *head |= md << (4 * 4);
841 *head |= md << (4 * 5);
842 *head = htonl(*head);
844 ret = ecore_con_client_send(cl->client, dat, s);
845 if (size > 0) ret += ecore_con_client_send(cl->client, data, size);
850 * Retrieves the IPC server that the given IPC client is connected to.
851 * @param cl The given IPC client.
852 * @return The IPC server the IPC client is connected to.
853 * @ingroup Ecore_IPC_Client_Group
855 EAPI Ecore_Ipc_Server *
856 ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
858 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
860 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
861 "ecore_ipc_client_server_get");
868 * Closes the connection and frees memory allocated to the given IPC
870 * @param cl The given client.
871 * @return Data associated with the client.
872 * @ingroup Ecore_IPC_Client_Group
875 ecore_ipc_client_del(Ecore_Ipc_Client *cl)
878 Ecore_Ipc_Server *svr;
880 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
882 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
883 "ecore_ipc_client_del");
889 if (cl->event_count == 0)
892 if (cl->client) ecore_con_client_del(cl->client);
893 svr->clients = eina_list_remove(svr->clients, cl);
894 if (cl->buf) free(cl->buf);
895 ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
902 * Sets the IPC data associated with the given IPC client to @p data.
903 * @param cl The given IPC client.
904 * @param data The data to associate with the IPC client.
905 * @ingroup Ecore_IPC_Client_Group
908 ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data)
910 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
912 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
913 "ecore_ipc_client_data_set");
916 cl->data = (void *)data;
920 * Retrieves the data that has been associated with the given IPC client.
921 * @param cl The given client.
922 * @return The data associated with the IPC client.
923 * @ingroup Ecore_IPC_Client_Group
926 ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
928 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
930 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
931 "ecore_ipc_client_data_get");
938 * Sets the max data payload size for an Ipc message in bytes
940 * @param cl The given client.
941 * @param size The maximum data payload size in bytes.
942 * @ingroup Ecore_Ipc_Client_Group
945 ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size)
947 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
949 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
950 "ecore_ipc_client_data_size_max_set");
953 cl->max_buf_size = size;
957 * Gets the max data payload size for an Ipc message in bytes
959 * @param cl The given client.
960 * @return The maximum data payload size in bytes on success, @c -1 on failure.
961 * @ingroup Ecore_Ipc_Client_Group
964 ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
966 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
968 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
969 "ecore_ipc_client_data_size_max_get");
972 return cl->max_buf_size;
976 * Gets the IP address of a client that has been connected to.
978 * @param cl The given client.
979 * @return A pointer to an internal string that contains the IP address of
980 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
981 * This string should not be modified or trusted to stay valid after
982 * deletion for the @p cl object. If no IP is known @c NULL is
984 * @ingroup Ecore_Ipc_Client_Group
987 ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl)
989 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
991 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
992 "ecore_ipc_client_ip_get");
995 return ecore_con_client_ip_get(cl->client);
999 * Flushes all pending data to the given client. Will return when done.
1001 * @param cl The given client.
1002 * @ingroup Ecore_Ipc_Client_Group
1005 ecore_ipc_client_flush(Ecore_Ipc_Client *cl)
1007 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
1009 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
1010 "ecore_ipc_client_flush");
1013 ecore_con_client_flush(cl->client);
1017 * Returns if SSL support is available
1018 * @return 1 if SSL is available, 0 if it is not.
1019 * @ingroup Ecore_Con_Client_Group
1022 ecore_ipc_ssl_available_get(void)
1024 return ecore_con_ssl_available_get();
1029 _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1031 Ecore_Con_Event_Client_Add *e;
1032 Ecore_Ipc_Server *svr;
1035 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1036 if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
1037 /* handling code here */
1039 Ecore_Ipc_Client *cl;
1041 cl = calloc(1, sizeof(Ecore_Ipc_Client));
1042 if (!cl) return ECORE_CALLBACK_CANCEL;
1044 ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
1045 cl->client = e->client;
1046 cl->max_buf_size = 32 * 1024;
1047 ecore_con_client_data_set(cl->client, (void *)cl);
1048 svr->clients = eina_list_append(svr->clients, cl);
1051 Ecore_Ipc_Event_Client_Add *e2;
1053 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
1058 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
1059 _ecore_ipc_event_client_add_free, NULL);
1063 return ECORE_CALLBACK_CANCEL;
1067 _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1069 Ecore_Con_Event_Client_Del *e;
1070 Ecore_Ipc_Server *svr;
1073 if (!e->client) return ECORE_CALLBACK_RENEW;
1074 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1075 if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
1076 /* handling code here */
1078 Ecore_Ipc_Client *cl;
1080 cl = ecore_con_client_data_get(e->client);
1083 Ecore_Ipc_Event_Client_Del *e2;
1087 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
1092 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
1093 _ecore_ipc_event_client_del_free, NULL);
1098 return ECORE_CALLBACK_CANCEL;
1102 _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1104 Ecore_Con_Event_Server_Add *e;
1107 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1108 /* handling code here */
1110 Ecore_Ipc_Server *svr;
1112 svr = ecore_con_server_data_get(e->server);
1113 if (!svr->delete_me)
1115 Ecore_Ipc_Event_Server_Add *e2;
1117 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
1122 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
1123 _ecore_ipc_event_server_add_free, NULL);
1127 return ECORE_CALLBACK_CANCEL;
1131 _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1133 Ecore_Con_Event_Server_Del *e;
1136 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1137 /* handling code here */
1139 Ecore_Ipc_Server *svr;
1141 svr = ecore_con_server_data_get(e->server);
1143 if (!svr->delete_me)
1145 Ecore_Ipc_Event_Server_Del *e2;
1147 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
1152 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
1153 _ecore_ipc_event_server_del_free, NULL);
1157 return ECORE_CALLBACK_CANCEL;
1161 md = ((head >> (4 * _n)) & 0xf); \
1162 if (md >= DLT_SET) s += 4; \
1163 else if (md >= DLT_ADD16) s += 2; \
1164 else if (md >= DLT_ADD8) s += 1;
1166 #define CLDEC(_n, _member) \
1167 md = ((head >> (4 * _n)) & 0xf); \
1168 if (md >= DLT_SET) \
1171 unsigned char *dv; \
1172 dv = (unsigned char *)&v; \
1173 dv[0] = *(cl->buf + offset + s + 0); \
1174 dv[1] = *(cl->buf + offset + s + 1); \
1175 dv[2] = *(cl->buf + offset + s + 2); \
1176 dv[3] = *(cl->buf + offset + s + 3); \
1177 d = (int)ntohl(v); \
1180 else if (md >= DLT_ADD16) \
1183 unsigned char *dv; \
1184 dv = (unsigned char *)&v; \
1185 dv[0] = *(cl->buf + offset + s + 0); \
1186 dv[1] = *(cl->buf + offset + s + 1); \
1187 d = (int)ntohs(v); \
1190 else if (md >= DLT_ADD8) \
1193 unsigned char *dv; \
1194 dv = (unsigned char *)&v; \
1195 dv[0] = *(cl->buf + offset + s + 0); \
1199 msg._member = _ecore_ipc_ddlt_int(d, cl->prev.i._member, md);
1202 _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1204 Ecore_Con_Event_Client_Data *e;
1205 Ecore_Ipc_Server *svr;
1208 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1209 if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
1210 /* handling code here */
1212 Ecore_Ipc_Client *cl;
1213 Ecore_Ipc_Msg_Head msg;
1217 cl = ecore_con_client_data_get(e->client);
1221 cl->buf_size = e->size;
1223 e->data = NULL; /* take it out of the old event */
1227 buf = realloc(cl->buf, cl->buf_size + e->size);
1233 return ECORE_CALLBACK_CANCEL;
1236 memcpy(cl->buf + cl->buf_size, e->data, e->size);
1237 cl->buf_size += e->size;
1239 /* examine header */
1241 if ((cl->buf_size - offset) >= (int)sizeof(int))
1243 int s, md, d = 0, head;
1246 dd = (unsigned char *)&head;
1247 dd[0] = *(cl->buf + offset + 0);
1248 dd[1] = *(cl->buf + offset + 1);
1249 dd[2] = *(cl->buf + offset + 2);
1250 dd[3] = *(cl->buf + offset + 3);
1252 dd = (unsigned char *)&d;
1260 if ((cl->buf_size - offset) < s)
1262 if (offset > 0) goto scroll;
1263 return ECORE_CALLBACK_CANCEL;
1273 if (msg.size < 0) msg.size = 0;
1274 /* there is enough data in the buffer for a full message */
1275 if ((cl->buf_size - offset) >= (s + msg.size))
1277 Ecore_Ipc_Event_Client_Data *e2;
1281 max = svr->max_buf_size;
1282 max2 = cl->max_buf_size;
1283 if ((max >= 0) && (max2 >= 0))
1285 if (max2 < max) max = max2;
1289 if (max < 0) max = max2;
1291 if ((max < 0) || (msg.size <= max))
1295 buf = malloc(msg.size);
1296 if (!buf) return ECORE_CALLBACK_CANCEL;
1297 memcpy(buf, cl->buf + offset + s, msg.size);
1301 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
1306 e2->major = msg.major;
1307 e2->minor = msg.minor;
1309 e2->ref_to = msg.ref_to;
1310 e2->response = msg.response;
1311 e2->size = msg.size;
1313 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
1314 _ecore_ipc_event_client_data_free,
1320 offset += (s + msg.size);
1321 if (cl->buf_size == offset)
1326 return ECORE_CALLBACK_CANCEL;
1335 buf = malloc(cl->buf_size - offset);
1341 return ECORE_CALLBACK_CANCEL;
1343 memcpy(buf, cl->buf + offset, cl->buf_size - offset);
1346 cl->buf_size -= offset;
1349 return ECORE_CALLBACK_CANCEL;
1353 md = ((head >> (4 * _n)) & 0xf); \
1354 if (md >= DLT_SET) s += 4; \
1355 else if (md >= DLT_ADD16) s += 2; \
1356 else if (md >= DLT_ADD8) s += 1;
1358 #define SVDEC(_n, _member) \
1359 md = ((head >> (4 * _n)) & 0xf); \
1360 if (md >= DLT_SET) \
1363 unsigned char *dv; \
1364 dv = (unsigned char *)&v; \
1365 dv[0] = *(svr->buf + offset + s + 0); \
1366 dv[1] = *(svr->buf + offset + s + 1); \
1367 dv[2] = *(svr->buf + offset + s + 2); \
1368 dv[3] = *(svr->buf + offset + s + 3); \
1369 d = (int)ntohl(v); \
1372 else if (md >= DLT_ADD16) \
1375 unsigned char *dv; \
1376 dv = (unsigned char *)&v; \
1377 dv[0] = *(svr->buf + offset + s + 0); \
1378 dv[1] = *(svr->buf + offset + s + 1); \
1379 d = (int)ntohs(v); \
1382 else if (md >= DLT_ADD8) \
1385 unsigned char *dv; \
1386 dv = (unsigned char *)&v; \
1387 dv[0] = *(svr->buf + offset + s + 0); \
1391 msg._member = _ecore_ipc_ddlt_int(d, svr->prev.i._member, md);
1394 _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1396 Ecore_Con_Event_Server_Data *e;
1399 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1400 /* handling code here */
1402 Ecore_Ipc_Server *svr;
1403 Ecore_Ipc_Msg_Head msg;
1407 svr = ecore_con_server_data_get(e->server);
1411 svr->buf_size = e->size;
1413 e->data = NULL; /* take it out of the old event */
1417 buf = realloc(svr->buf, svr->buf_size + e->size);
1423 return ECORE_CALLBACK_CANCEL;
1426 memcpy(svr->buf + svr->buf_size, e->data, e->size);
1427 svr->buf_size += e->size;
1429 /* examine header */
1431 if ((svr->buf_size - offset) >= (int)sizeof(int))
1433 int s, md, d = 0, head;
1436 dd = (unsigned char *)&head;
1437 dd[0] = *(svr->buf + offset + 0);
1438 dd[1] = *(svr->buf + offset + 1);
1439 dd[2] = *(svr->buf + offset + 2);
1440 dd[3] = *(svr->buf + offset + 3);
1442 dd = (unsigned char *)&d;
1450 if ((svr->buf_size - offset) < s)
1452 if (offset > 0) goto scroll;
1453 return ECORE_CALLBACK_CANCEL;
1463 if (msg.size < 0) msg.size = 0;
1464 /* there is enough data in the buffer for a full message */
1465 if ((svr->buf_size - offset) >= (s + msg.size))
1467 Ecore_Ipc_Event_Server_Data *e2;
1471 max = svr->max_buf_size;
1472 if ((max < 0) || (msg.size <= max))
1476 buf = malloc(msg.size);
1477 if (!buf) return ECORE_CALLBACK_CANCEL;
1478 memcpy(buf, svr->buf + offset + s, msg.size);
1480 if (!svr->delete_me)
1482 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
1487 e2->major = msg.major;
1488 e2->minor = msg.minor;
1490 e2->ref_to = msg.ref_to;
1491 e2->response = msg.response;
1492 e2->size = msg.size;
1494 ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
1495 _ecore_ipc_event_server_data_free,
1501 offset += (s + msg.size);
1502 if (svr->buf_size == offset)
1507 return ECORE_CALLBACK_CANCEL;
1516 buf = malloc(svr->buf_size - offset);
1522 return ECORE_CALLBACK_CANCEL;
1524 memcpy(buf, svr->buf + offset, svr->buf_size - offset);
1527 svr->buf_size -= offset;
1530 return ECORE_CALLBACK_CANCEL;
1534 _ecore_ipc_event_client_add_free(void *data __UNUSED__, void *ev)
1536 Ecore_Ipc_Event_Client_Add *e;
1539 e->client->event_count--;
1540 if ((e->client->event_count == 0) && (e->client->delete_me))
1541 ecore_ipc_client_del(e->client);
1546 _ecore_ipc_event_client_del_free(void *data __UNUSED__, void *ev)
1548 Ecore_Ipc_Event_Client_Del *e;
1551 e->client->event_count--;
1552 if ((e->client->event_count == 0) && (e->client->delete_me))
1553 ecore_ipc_client_del(e->client);
1558 _ecore_ipc_event_client_data_free(void *data __UNUSED__, void *ev)
1560 Ecore_Ipc_Event_Client_Data *e;
1563 e->client->event_count--;
1564 if (e->data) free(e->data);
1565 if ((e->client->event_count == 0) && (e->client->delete_me))
1566 ecore_ipc_client_del(e->client);
1571 _ecore_ipc_event_server_add_free(void *data __UNUSED__, void *ev)
1573 Ecore_Ipc_Event_Server_Add *e;
1576 e->server->event_count--;
1577 if ((e->server->event_count == 0) && (e->server->delete_me))
1578 ecore_ipc_server_del(e->server);
1583 _ecore_ipc_event_server_del_free(void *data __UNUSED__, void *ev)
1585 Ecore_Ipc_Event_Server_Add *e;
1588 e->server->event_count--;
1589 if ((e->server->event_count == 0) && (e->server->delete_me))
1590 ecore_ipc_server_del(e->server);
1595 _ecore_ipc_event_server_data_free(void *data __UNUSED__, void *ev)
1597 Ecore_Ipc_Event_Server_Data *e;
1600 if (e->data) free(e->data);
1601 e->server->event_count--;
1602 if ((e->server->event_count == 0) && (e->server->delete_me))
1603 ecore_ipc_server_del(e->server);