2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
10 #include "Ecore_Con.h"
11 #include "ecore_private.h"
12 #include "ecore_ipc_private.h"
13 #include "Ecore_Ipc.h"
15 #ifdef HAVE_NETINET_IN_H
16 # include <netinet/in.h>
19 #ifdef HAVE_WINSOCK2_H
20 # include <winsock2.h>
40 /* byte swappers - for dealing with big vs little endian machines */
42 _ecore_ipc_swap_16(unsigned short v)
46 s = (unsigned char *)(&v);
47 t = s[0]; s[0] = s[1]; s[1] = t;
52 _ecore_ipc_swap_32(unsigned int v)
56 s = (unsigned char *)(&v);
57 t = s[0]; s[0] = s[3]; s[3] = t;
58 t = s[1]; s[1] = s[2]; s[2] = t;
62 EAPI unsigned long long
63 _ecore_ipc_swap_64(unsigned long long v)
67 s = (unsigned char *)(&v);
68 t = s[0]; s[0] = s[7]; s[7] = t;
69 t = s[1]; s[1] = s[6]; s[6] = t;
70 t = s[2]; s[2] = s[5]; s[5] = t;
71 t = s[3]; s[3] = s[4]; s[4] = t;
75 static int _ecore_ipc_dlt_int(int out, int prev, int *mode);
76 static int _ecore_ipc_ddlt_int(int in, int prev, int mode);
79 _ecore_ipc_dlt_int(int out, int prev, int *mode)
89 if (out == (int)0xffffffff)
104 if (out == prev >> 1)
111 if (!(dlt & 0xffffff00))
117 if (!(dlt & 0xffffff00))
123 if (!(dlt & 0x00ffffff))
126 return (dlt >> 24) & 0xff;
129 if (!(dlt & 0x00ffffff))
132 return (dlt >> 24) & 0xff;
136 if (!(dlt & 0xffff0000))
142 if (!(dlt & 0xffff0000))
148 if (!(dlt & 0x0000ffff))
151 return (dlt >> 16) & 0xffff;
154 if (!(dlt & 0x0000ffff))
157 return (dlt >> 16) & 0xffff;
165 _ecore_ipc_ddlt_int(int in, int prev, int mode)
191 return prev + (in << 24);
194 return prev - (in << 24);
203 return prev + (in << 16);
206 return prev - (in << 16);
223 static int _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
224 static int _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
225 static int _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
226 static int _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
227 static int _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
228 static int _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
229 static void _ecore_ipc_event_client_add_free(void *data, void *ev);
230 static void _ecore_ipc_event_client_del_free(void *data, void *ev);
231 static void _ecore_ipc_event_client_data_free(void *data, void *ev);
232 static void _ecore_ipc_event_server_add_free(void *data, void *ev);
233 static void _ecore_ipc_event_server_del_free(void *data, void *ev);
234 static void _ecore_ipc_event_server_data_free(void *data, void *ev);
236 EAPI int ECORE_IPC_EVENT_CLIENT_ADD = 0;
237 EAPI int ECORE_IPC_EVENT_CLIENT_DEL = 0;
238 EAPI int ECORE_IPC_EVENT_SERVER_ADD = 0;
239 EAPI int ECORE_IPC_EVENT_SERVER_DEL = 0;
240 EAPI int ECORE_IPC_EVENT_CLIENT_DATA = 0;
241 EAPI int ECORE_IPC_EVENT_SERVER_DATA = 0;
243 static int _ecore_ipc_init_count = 0;
244 static Eina_List *servers = NULL;
245 static Ecore_Event_Handler *handler[6];
248 * @defgroup Ecore_IPC_Library_Group IPC Library Functions
250 * Functions that set up and shut down the Ecore IPC Library.
254 * Initialises the Ecore IPC library.
255 * @return Number of times the library has been initialised without
257 * @ingroup Ecore_IPC_Library_Group
264 if (++_ecore_ipc_init_count != 1)
265 return _ecore_ipc_init_count;
267 if (!ecore_con_init())
268 return --_ecore_ipc_init_count;
270 ECORE_IPC_EVENT_CLIENT_ADD = ecore_event_type_new();
271 ECORE_IPC_EVENT_CLIENT_DEL = ecore_event_type_new();
272 ECORE_IPC_EVENT_SERVER_ADD = ecore_event_type_new();
273 ECORE_IPC_EVENT_SERVER_DEL = ecore_event_type_new();
274 ECORE_IPC_EVENT_CLIENT_DATA = ecore_event_type_new();
275 ECORE_IPC_EVENT_SERVER_DATA = ecore_event_type_new();
277 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
278 _ecore_ipc_event_client_add, NULL);
279 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
280 _ecore_ipc_event_client_del, NULL);
281 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
282 _ecore_ipc_event_server_add, NULL);
283 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
284 _ecore_ipc_event_server_del, NULL);
285 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
286 _ecore_ipc_event_client_data, NULL);
287 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
288 _ecore_ipc_event_server_data, NULL);
289 return _ecore_ipc_init_count;
293 * Shuts down the Ecore IPC library.
294 * @return Number of times the library has been initialised without being
296 * @ingroup Ecore_IPC_Library_Group
299 ecore_ipc_shutdown(void)
303 if (--_ecore_ipc_init_count != 0)
304 return _ecore_ipc_init_count;
306 while (servers) ecore_ipc_server_del(eina_list_data_get(servers));
308 for (i = 0; i < 6; i++)
309 ecore_event_handler_del(handler[i]);
311 ecore_con_shutdown();
313 return _ecore_ipc_init_count;
317 * @defgroup Ecore_IPC_Server_Group IPC Server Functions
319 * Functions the deal with IPC server objects.
323 * Creates an IPC server that listens for connections.
325 * For more details about the @p compl_type, @p name and @p port
326 * parameters, see the @ref ecore_con_server_add documentation.
328 * @param compl_type The connection type.
329 * @param name Name to associate with the socket used for connection.
330 * @param port Number to identify with socket used for connection.
331 * @param data Data to associate with the IPC server.
332 * @return New IPC server. If there is an error, @c NULL is returned.
333 * @ingroup Ecore_IPC_Server_Group
334 * @todo Need to add protocol type parameter to this function.
336 EAPI Ecore_Ipc_Server *
337 ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, const void *data)
339 Ecore_Ipc_Server *svr;
341 Ecore_Con_Type extra = 0;
343 svr = calloc(1, sizeof(Ecore_Ipc_Server));
344 if (!svr) return NULL;
346 type &= ~ECORE_IPC_USE_SSL;
347 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
350 case ECORE_IPC_LOCAL_USER:
351 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
353 case ECORE_IPC_LOCAL_SYSTEM:
354 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
356 case ECORE_IPC_REMOTE_SYSTEM:
357 svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
368 svr->max_buf_size = 32 * 1024;
369 svr->data = (void *)data;
370 servers = eina_list_append(servers, svr);
371 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
376 * Creates an IPC server object to represent the IPC server listening
379 * For more details about the @p compl_type, @p name and @p port
380 * parameters, see the @ref ecore_con_server_connect documentation.
382 * @param compl_type The IPC connection type.
383 * @param name Name used to determine which socket to use for the
385 * @param port Number used to identify the socket to use for the
387 * @param data Data to associate with the server.
388 * @return A new IPC server. @c NULL is returned on error.
389 * @ingroup Ecore_IPC_Server_Group
390 * @todo Need to add protocol type parameter.
392 EAPI Ecore_Ipc_Server *
393 ecore_ipc_server_connect(Ecore_Ipc_Type compl_type, char *name, int port, const void *data)
395 Ecore_Ipc_Server *svr;
397 Ecore_Con_Type extra = 0;
399 svr = calloc(1, sizeof(Ecore_Ipc_Server));
400 if (!svr) return NULL;
402 type &= ~ECORE_IPC_USE_SSL;
403 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
406 case ECORE_IPC_LOCAL_USER:
407 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
409 case ECORE_IPC_LOCAL_SYSTEM:
410 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
412 case ECORE_IPC_REMOTE_SYSTEM:
413 svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
424 svr->max_buf_size = -1;
425 svr->data = (void *)data;
426 servers = eina_list_append(servers, svr);
427 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
432 * Closes the connection and frees the given IPC server.
433 * @param svr The given IPC server.
434 * @return The data associated with the server when it was created.
435 * @ingroup Ecore_IPC_Server_Group
438 ecore_ipc_server_del(Ecore_Ipc_Server *svr)
442 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
444 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
445 "ecore_ipc_server_del");
448 if (svr->delete_me) return NULL;
453 if (svr->event_count == 0)
455 Ecore_Ipc_Client *cl;
457 EINA_LIST_FREE(svr->clients, cl)
458 ecore_ipc_client_del(cl);
459 ecore_con_server_del(svr->server);
460 servers = eina_list_remove(servers, svr);
462 if (svr->buf) free(svr->buf);
463 ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
470 * Retrieves the data associated with the given IPC server.
471 * @param svr The given IPC server.
472 * @return The associated data.
473 * @ingroup Ecore_IPC_Server_Group
476 ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
478 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
480 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
481 "ecore_ipc_server_data_get");
488 * Retrieves whether the given IPC server is currently connected.
489 * @param svr The given IPC server.
490 * @return @c 1 if the server is connected. @c 0 otherwise.
491 * @ingroup Ecore_IPC_Server_Group
494 ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
496 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
498 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
499 "ecore_ipc_server_connected_get");
502 return ecore_con_server_connected_get(svr->server);
506 * Retrieves the list of clients for this server.
507 * @param svr The given IPC server.
508 * @return An Eina_List with the clients.
509 * @ingroup Ecore_IPC_Server_Group
512 ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
514 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
516 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
517 "ecore_ipc_server_clients_get");
520 return svr->client_list;
523 #define SVENC(_member) \
524 d = _ecore_ipc_dlt_int(msg._member, svr->prev.o._member, &md); \
529 dd = (unsigned char *)&v; \
532 *(dat + s + 0) = dd[0]; \
533 *(dat + s + 1) = dd[1]; \
534 *(dat + s + 2) = dd[2]; \
535 *(dat + s + 3) = dd[3]; \
538 else if (md >= DLT_ADD16) \
542 dd = (unsigned char *)&v; \
545 *(dat + s + 0) = dd[0]; \
546 *(dat + s + 1) = dd[1]; \
549 else if (md >= DLT_ADD8) \
551 *(dat + s + 0) = (unsigned char)d; \
556 * Sends a message to the given IPC server.
558 * The content of the parameters, excluding the @p svr paramter, is up to
561 * @param svr The given IPC server.
562 * @param major Major opcode of the message.
563 * @param minor Minor opcode of the message.
564 * @param ref Message reference number.
565 * @param ref_to Reference number of the message this message refers to.
566 * @param response Requires response.
567 * @param data The data to send as part of the message.
568 * @param size Length of the data, in bytes, to send.
569 * @return Number of bytes sent. @c 0 is returned if there is an error.
570 * @ingroup Ecore_IPC_Server_Group
571 * @todo This function needs to become an IPC message.
572 * @todo Fix up the documentation: Make sure what ref_to and response are.
575 ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
577 Ecore_Ipc_Msg_Head msg;
579 int *head, md = 0, d, s;
580 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
582 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
584 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
585 "ecore_ipc_server_send");
588 if (size < 0) size = 0;
593 msg.response = response;
600 *head |= md << (4 * 1);
602 *head |= md << (4 * 2);
604 *head |= md << (4 * 3);
606 *head |= md << (4 * 4);
608 *head |= md << (4 * 5);
609 *head = htonl(*head);
611 ret = ecore_con_server_send(svr->server, dat, s);
612 if (size > 0) ret += ecore_con_server_send(svr->server, data, size);
617 * Sets a limit on the number of clients that can be handled concurrently
618 * by the given server, and a policy on what to do if excess clients try to
620 * Beware that if you set this once ecore is already running, you may
621 * already have pending CLIENT_ADD events in your event queue. Those
622 * clients have already connected and will not be affected by this call.
623 * Only clients subsequently trying to connect will be affected.
624 * @param svr The given server.
625 * @param client_limit The maximum number of clients to handle
626 * concurrently. -1 means unlimited (default). 0
627 * effectively disables the server.
628 * @param reject_excess_clients Set to 1 to automatically disconnect
629 * excess clients as soon as they connect if you are
630 * already handling client_limit clients. Set to 0
631 * (default) to just hold off on the "accept()"
632 * system call until the number of active clients
633 * drops. This causes the kernel to queue up to 4096
634 * connections (or your kernel's limit, whichever is
636 * @ingroup Ecore_Ipc_Server_Group
639 ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients)
641 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
643 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
644 "ecore_ipc_server_client_limit_set");
647 ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients);
651 * Sets the max data payload size for an Ipc message in bytes
653 * @param svr The given server.
654 * @param size The maximum data payload size in bytes.
655 * @ingroup Ecore_Ipc_Server_Group
658 ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size)
660 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
662 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
663 "ecore_ipc_server_data_size_max_set");
666 svr->max_buf_size = size;
670 * Gets the max data payload size for an Ipc message in bytes
672 * @param svr The given server.
673 * @return The maximum data payload in bytes.
674 * @ingroup Ecore_Ipc_Server_Group
677 ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
679 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
681 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
682 "ecore_ipc_server_data_size_max_get");
685 return svr->max_buf_size;
689 * Gets the IP address of a server that has been connected to.
691 * @param svr The given server.
692 * @return A pointer to an internal string that contains the IP address of
693 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
694 * This string should not be modified or trusted to stay valid after
695 * deletion for the @p svr object. If no IP is known NULL is returned.
696 * @ingroup Ecore_Ipc_Server_Group
699 ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr)
701 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
703 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
704 "ecore_ipc_server_ip_get");
707 return ecore_con_server_ip_get(svr->server);
711 * Flushes all pending data to the given server. Will return when done.
713 * @param svr The given server.
714 * @ingroup Ecore_Ipc_Server_Group
717 ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
719 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
721 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
722 "ecore_ipc_server_server_flush");
725 ecore_con_server_flush(svr->server);
728 #define CLENC(_member) \
729 d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \
734 dd = (unsigned char *)&v; \
737 *(dat + s + 0) = dd[0]; \
738 *(dat + s + 1) = dd[1]; \
739 *(dat + s + 2) = dd[2]; \
740 *(dat + s + 3) = dd[3]; \
743 else if (md >= DLT_ADD16) \
747 dd = (unsigned char *)&v; \
750 *(dat + s + 0) = dd[0]; \
751 *(dat + s + 1) = dd[1]; \
754 else if (md >= DLT_ADD8) \
756 *(dat + s) = (unsigned char)d; \
761 * @defgroup Ecore_IPC_Client_Group IPC Client Functions
763 * Functions that deal with IPC client objects.
767 * Sends a message to the given IPC client.
768 * @param cl The given IPC client.
769 * @param major Major opcode of the message.
770 * @param minor Minor opcode of the message.
771 * @param ref Reference number of the message.
772 * @param ref_to Reference number of the message this message refers to.
773 * @param response Requires response.
774 * @param data The data to send as part of the message.
775 * @param size Length of the data, in bytes, to send.
776 * @return The number of bytes sent. @c 0 will be returned if there is
778 * @ingroup Ecore_IPC_Client_Group
779 * @todo This function needs to become an IPC message.
780 * @todo Make sure ref_to and response parameters are described correctly.
783 ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
785 Ecore_Ipc_Msg_Head msg;
787 int *head, md = 0, d, s;
788 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
790 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
792 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
793 "ecore_ipc_client_send");
796 if (size < 0) size = 0;
801 msg.response = response;
808 *head |= md << (4 * 1);
810 *head |= md << (4 * 2);
812 *head |= md << (4 * 3);
814 *head |= md << (4 * 4);
816 *head |= md << (4 * 5);
817 *head = htonl(*head);
819 ret = ecore_con_client_send(cl->client, dat, s);
820 if (size > 0) ret += ecore_con_client_send(cl->client, data, size);
825 * Retrieves the IPC server that the given IPC client is connected to.
826 * @param cl The given IPC client.
827 * @return The IPC server the IPC client is connected to.
828 * @ingroup Ecore_IPC_Client_Group
830 EAPI Ecore_Ipc_Server *
831 ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
833 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
835 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
836 "ecore_ipc_client_server_get");
839 return (ecore_con_server_data_get(ecore_con_client_server_get(cl->client)));
843 * Closes the connection and frees memory allocated to the given IPC
845 * @param cl The given client.
846 * @return Data associated with the client.
847 * @ingroup Ecore_IPC_Client_Group
850 ecore_ipc_client_del(Ecore_Ipc_Client *cl)
853 Ecore_Ipc_Server *svr;
855 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
857 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
858 "ecore_ipc_client_del");
864 if (cl->event_count == 0)
866 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
867 ecore_con_client_del(cl->client);
868 svr->clients = eina_list_remove(svr->clients, cl);
869 if (cl->buf) free(cl->buf);
870 ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
877 * Sets the IPC data associated with the given IPC client to @p data.
878 * @param cl The given IPC client.
879 * @param data The data to associate with the IPC client.
880 * @ingroup Ecore_IPC_Client_Group
883 ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data)
885 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
887 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
888 "ecore_ipc_client_data_set");
891 cl->data = (void *)data;
895 * Retrieves the data that has been associated with the given IPC client.
896 * @param cl The given client.
897 * @return The data associated with the IPC client.
898 * @ingroup Ecore_IPC_Client_Group
901 ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
903 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
905 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
906 "ecore_ipc_client_data_get");
913 * Sets the max data payload size for an Ipc message in bytes
915 * @param client The given client.
916 * @param size The maximum data payload size in bytes.
917 * @ingroup Ecore_Ipc_Client_Group
920 ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size)
922 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
924 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
925 "ecore_ipc_client_data_size_max_set");
928 cl->max_buf_size = size;
932 * Sets the max data payload size for an Ipc message in bytes
934 * @param cl The given client.
935 * @param size The maximum data payload size in bytes.
936 * @ingroup Ecore_Ipc_Client_Group
939 ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
941 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
943 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
944 "ecore_ipc_client_data_size_max_get");
947 return cl->max_buf_size;
951 * Gets the IP address of a client that has been connected to.
953 * @param cl The given client.
954 * @return A pointer to an internal string that contains the IP address of
955 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
956 * This string should not be modified or trusted to stay valid after
957 * deletion for the @p cl object. If no IP is known NULL is returned.
958 * @ingroup Ecore_Ipc_Client_Group
961 ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl)
963 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
965 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
966 "ecore_ipc_client_ip_get");
969 return ecore_con_client_ip_get(cl->client);
973 * Flushes all pending data to the given client. Will return when done.
975 * @param cl The given client.
976 * @ingroup Ecore_Ipc_Client_Group
979 ecore_ipc_client_flush(Ecore_Ipc_Client *cl)
981 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
983 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
984 "ecore_ipc_client_flush");
987 ecore_con_client_flush(cl->client);
991 * Returns if SSL support is available
992 * @return 1 if SSL is available, 0 if it is not.
993 * @ingroup Ecore_Con_Client_Group
996 ecore_ipc_ssl_available_get(void)
998 return ecore_con_ssl_available_get();
1003 _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1005 Ecore_Con_Event_Client_Add *e;
1008 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
1009 /* handling code here */
1011 Ecore_Ipc_Client *cl;
1012 Ecore_Ipc_Server *svr;
1014 cl = calloc(1, sizeof(Ecore_Ipc_Client));
1016 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1017 ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
1018 cl->client = e->client;
1019 cl->max_buf_size = 32 * 1024;
1020 ecore_con_client_data_set(cl->client, (void *)cl);
1021 svr->clients = eina_list_append(svr->clients, cl);
1022 svr->client_list = eina_list_append(svr->client_list, cl);
1025 Ecore_Ipc_Event_Client_Add *e2;
1027 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
1032 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
1033 _ecore_ipc_event_client_add_free, NULL);
1041 _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1043 Ecore_Con_Event_Client_Del *e;
1046 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
1047 /* handling code here */
1049 Ecore_Ipc_Client *cl;
1051 cl = ecore_con_client_data_get(e->client);
1053 Ecore_Ipc_Event_Client_Del *e2;
1054 Ecore_Ipc_Server *svr;
1056 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1057 svr->client_list = eina_list_remove(svr->client_list, cl);
1060 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
1065 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
1066 _ecore_ipc_event_client_del_free, NULL);
1075 _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1077 Ecore_Con_Event_Server_Add *e;
1080 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return 1;
1081 /* handling code here */
1083 Ecore_Ipc_Server *svr;
1085 svr = ecore_con_server_data_get(e->server);
1086 if (!svr->delete_me)
1088 Ecore_Ipc_Event_Server_Add *e2;
1090 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
1095 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
1096 _ecore_ipc_event_server_add_free, NULL);
1104 _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1106 Ecore_Con_Event_Server_Del *e;
1109 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return 1;
1110 /* handling code here */
1112 Ecore_Ipc_Server *svr;
1114 svr = ecore_con_server_data_get(e->server);
1115 if (!svr->delete_me)
1117 Ecore_Ipc_Event_Server_Del *e2;
1119 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
1124 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
1125 _ecore_ipc_event_server_del_free, NULL);
1133 md = ((head >> (4 * _n)) & 0xf); \
1134 if (md >= DLT_SET) s += 4; \
1135 else if (md >= DLT_ADD16) s += 2; \
1136 else if (md >= DLT_ADD8) s += 1;
1138 #define CLDEC(_n, _member) \
1139 md = ((head >> (4 * _n)) & 0xf); \
1140 if (md >= DLT_SET) \
1143 unsigned char *dv; \
1144 dv = (unsigned char *)&v; \
1145 dv[0] = *(cl->buf + offset + s + 0); \
1146 dv[1] = *(cl->buf + offset + s + 1); \
1147 dv[2] = *(cl->buf + offset + s + 2); \
1148 dv[3] = *(cl->buf + offset + s + 3); \
1149 d = (int)ntohl(v); \
1152 else if (md >= DLT_ADD16) \
1155 unsigned char *dv; \
1156 dv = (unsigned char *)&v; \
1157 dv[0] = *(cl->buf + offset + s + 0); \
1158 dv[1] = *(cl->buf + offset + s + 1); \
1159 d = (int)ntohs(v); \
1162 else if (md >= DLT_ADD8) \
1165 unsigned char *dv; \
1166 dv = (unsigned char *)&v; \
1167 dv[0] = *(cl->buf + offset + s + 0); \
1171 msg._member = _ecore_ipc_ddlt_int(d, cl->prev.i._member, md);
1174 _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1176 Ecore_Con_Event_Client_Data *e;
1179 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
1180 /* handling code here */
1182 Ecore_Ipc_Client *cl;
1183 Ecore_Ipc_Msg_Head msg;
1187 cl = ecore_con_client_data_get(e->client);
1191 cl->buf_size = e->size;
1193 e->data = NULL; /* take it out of the old event */
1197 buf = realloc(cl->buf, cl->buf_size + e->size);
1206 memcpy(cl->buf + cl->buf_size, e->data, e->size);
1207 cl->buf_size += e->size;
1209 /* examine header */
1211 if ((cl->buf_size - offset) >= (int)sizeof(int))
1213 int s, md, d = 0, head;
1216 dd = (unsigned char *)&head;
1217 dd[0] = *(cl->buf + offset + 0);
1218 dd[1] = *(cl->buf + offset + 1);
1219 dd[2] = *(cl->buf + offset + 2);
1220 dd[3] = *(cl->buf + offset + 3);
1222 dd = (unsigned char *)&d;
1230 if ((cl->buf_size - offset) < s)
1232 if (offset > 0) goto scroll;
1243 if (msg.size < 0) msg.size = 0;
1244 /* there is enough data in the buffer for a full message */
1245 if ((cl->buf_size - offset) >= (s + msg.size))
1247 Ecore_Ipc_Event_Client_Data *e2;
1248 Ecore_Ipc_Server *svr;
1252 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
1253 max = svr->max_buf_size;
1254 max2 = cl->max_buf_size;
1255 if ((max >= 0) && (max2 >= 0))
1257 if (max2 < max) max = max2;
1261 if (max < 0) max = max2;
1263 if ((max < 0) || (msg.size <= max))
1267 buf = malloc(msg.size);
1269 memcpy(buf, cl->buf + offset + s, msg.size);
1273 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
1278 e2->major = msg.major;
1279 e2->minor = msg.minor;
1281 e2->ref_to = msg.ref_to;
1282 e2->response = msg.response;
1283 e2->size = msg.size;
1285 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
1286 _ecore_ipc_event_client_data_free,
1292 offset += (s + msg.size);
1293 if (cl->buf_size == offset)
1307 buf = malloc(cl->buf_size - offset);
1315 memcpy(buf, cl->buf + offset, cl->buf_size - offset);
1318 cl->buf_size -= offset;
1325 md = ((head >> (4 * _n)) & 0xf); \
1326 if (md >= DLT_SET) s += 4; \
1327 else if (md >= DLT_ADD16) s += 2; \
1328 else if (md >= DLT_ADD8) s += 1;
1330 #define SVDEC(_n, _member) \
1331 md = ((head >> (4 * _n)) & 0xf); \
1332 if (md >= DLT_SET) \
1335 unsigned char *dv; \
1336 dv = (unsigned char *)&v; \
1337 dv[0] = *(svr->buf + offset + s + 0); \
1338 dv[1] = *(svr->buf + offset + s + 1); \
1339 dv[2] = *(svr->buf + offset + s + 2); \
1340 dv[3] = *(svr->buf + offset + s + 3); \
1341 d = (int)ntohl(v); \
1344 else if (md >= DLT_ADD16) \
1347 unsigned char *dv; \
1348 dv = (unsigned char *)&v; \
1349 dv[0] = *(svr->buf + offset + s + 0); \
1350 dv[1] = *(svr->buf + offset + s + 1); \
1351 d = (int)ntohs(v); \
1354 else if (md >= DLT_ADD8) \
1357 unsigned char *dv; \
1358 dv = (unsigned char *)&v; \
1359 dv[0] = *(svr->buf + offset + s + 0); \
1363 msg._member = _ecore_ipc_ddlt_int(d, svr->prev.i._member, md);
1366 _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1368 Ecore_Con_Event_Server_Data *e;
1371 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return 1;
1372 /* handling code here */
1374 Ecore_Ipc_Server *svr;
1375 Ecore_Ipc_Msg_Head msg;
1379 svr = ecore_con_server_data_get(e->server);
1383 svr->buf_size = e->size;
1385 e->data = NULL; /* take it out of the old event */
1389 buf = realloc(svr->buf, svr->buf_size + e->size);
1398 memcpy(svr->buf + svr->buf_size, e->data, e->size);
1399 svr->buf_size += e->size;
1401 /* examine header */
1403 if ((svr->buf_size - offset) >= (int)sizeof(int))
1405 int s, md, d = 0, head;
1408 dd = (unsigned char *)&head;
1409 dd[0] = *(svr->buf + offset + 0);
1410 dd[1] = *(svr->buf + offset + 1);
1411 dd[2] = *(svr->buf + offset + 2);
1412 dd[3] = *(svr->buf + offset + 3);
1414 dd = (unsigned char *)&d;
1422 if ((svr->buf_size - offset) < s)
1424 if (offset > 0) goto scroll;
1435 if (msg.size < 0) msg.size = 0;
1436 /* there is enough data in the buffer for a full message */
1437 if ((svr->buf_size - offset) >= (s + msg.size))
1439 Ecore_Ipc_Event_Server_Data *e2;
1443 max = svr->max_buf_size;
1444 if ((max < 0) || (msg.size <= max))
1448 buf = malloc(msg.size);
1450 memcpy(buf, svr->buf + offset + s, msg.size);
1452 if (!svr->delete_me)
1454 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
1459 e2->major = msg.major;
1460 e2->minor = msg.minor;
1462 e2->ref_to = msg.ref_to;
1463 e2->response = msg.response;
1464 e2->size = msg.size;
1466 ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
1467 _ecore_ipc_event_server_data_free,
1473 offset += (s + msg.size);
1474 if (svr->buf_size == offset)
1488 buf = malloc(svr->buf_size - offset);
1496 memcpy(buf, svr->buf + offset, svr->buf_size - offset);
1499 svr->buf_size -= offset;
1506 _ecore_ipc_event_client_add_free(void *data __UNUSED__, void *ev)
1508 Ecore_Ipc_Event_Client_Add *e;
1511 e->client->event_count--;
1512 if ((e->client->event_count == 0) && (e->client->delete_me))
1513 ecore_ipc_client_del(e->client);
1518 _ecore_ipc_event_client_del_free(void *data __UNUSED__, void *ev)
1520 Ecore_Ipc_Event_Client_Del *e;
1523 e->client->event_count--;
1524 if ((e->client->event_count == 0) && (e->client->delete_me))
1525 ecore_ipc_client_del(e->client);
1530 _ecore_ipc_event_client_data_free(void *data __UNUSED__, void *ev)
1532 Ecore_Ipc_Event_Client_Data *e;
1535 e->client->event_count--;
1536 if (e->data) free(e->data);
1537 if ((e->client->event_count == 0) && (e->client->delete_me))
1538 ecore_ipc_client_del(e->client);
1543 _ecore_ipc_event_server_add_free(void *data __UNUSED__, void *ev)
1545 Ecore_Ipc_Event_Server_Add *e;
1548 e->server->event_count--;
1549 if ((e->server->event_count == 0) && (e->server->delete_me))
1550 ecore_ipc_server_del(e->server);
1555 _ecore_ipc_event_server_del_free(void *data __UNUSED__, void *ev)
1557 Ecore_Ipc_Event_Server_Add *e;
1560 e->server->event_count--;
1561 if ((e->server->event_count == 0) && (e->server->delete_me))
1562 ecore_ipc_server_del(e->server);
1567 _ecore_ipc_event_server_data_free(void *data __UNUSED__, void *ev)
1569 Ecore_Ipc_Event_Server_Data *e;
1572 if (e->data) free(e->data);
1573 e->server->event_count--;
1574 if ((e->server->event_count == 0) && (e->server->delete_me))
1575 ecore_ipc_server_del(e->server);