4 /* local subsystem functions */
5 static Eina_Bool _e_ipc_cb_client_add(void *data __UNUSED__, int type __UNUSED__, void *event);
6 static Eina_Bool _e_ipc_cb_client_del(void *data __UNUSED__, int type __UNUSED__, void *event);
7 static Eina_Bool _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event);
9 /* local subsystem globals */
10 static Ecore_Ipc_Server *_e_ipc_server = NULL;
13 /* externally accessible functions */
19 char *tmp, *user, *disp;
22 tmp = getenv("TMPDIR");
23 if (!tmp) tmp = "/tmp";
24 user = getenv("USER");
25 if (!user) user = "__unknown__";
26 disp = getenv("DISPLAY");
27 if (!disp) disp = ":0";
29 snprintf(buf, sizeof(buf), "%s/enlightenment-%s", tmp, user);
30 if (mkdir(buf, S_IRWXU) == 0)
37 if (stat(buf, &st) == 0)
41 ((st.st_mode & (S_IFDIR|S_IRWXU|S_IRWXG|S_IRWXO)) ==
47 e_error_message_show(_("Possible IPC Hack Attempt. The IPC socket\n"
48 "directory already exists BUT has permissions\n"
49 "that are too leanient (must only be readable\n" "and writable by the owner, and nobody else)\n"
50 "or is not owned by you. Please check:\n"
51 "%s/enlightenment-%s\n"), tmp, user);
57 e_error_message_show(_("The IPC socket directory cannot be created or\n"
60 "%s/enlightenment-%s\n"),
65 snprintf(buf, sizeof(buf), "%s/enlightenment-%s/disp-%s-%i", tmp, user, disp, pid);
66 _e_ipc_server = ecore_ipc_server_add(ECORE_IPC_LOCAL_SYSTEM, buf, 0, NULL);
67 e_util_env_set("E_IPC_SOCKET", "");
68 if (!_e_ipc_server) return 0;
69 e_util_env_set("E_IPC_SOCKET", buf);
70 printf("INFO: E_IPC_SOCKET=%s\n", buf);
71 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD, _e_ipc_cb_client_add, NULL);
72 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, _e_ipc_cb_client_del, NULL);
73 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, _e_ipc_cb_client_data, NULL);
84 e_ipc_codec_shutdown();
87 ecore_ipc_server_del(_e_ipc_server);
95 /* local subsystem globals */
97 _e_ipc_cb_client_add(void *data __UNUSED__, int type __UNUSED__, void *event)
99 Ecore_Ipc_Event_Client_Add *e;
102 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server) return ECORE_CALLBACK_PASS_ON;
103 return ECORE_CALLBACK_PASS_ON;
107 _e_ipc_cb_client_del(void *data __UNUSED__, int type __UNUSED__, void *event)
109 Ecore_Ipc_Event_Client_Del *e;
112 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server) return ECORE_CALLBACK_PASS_ON;
113 /* delete client sruct */
114 e_thumb_client_del(e);
116 e_init_client_del(e);
117 ecore_ipc_client_del(e->client);
118 return ECORE_CALLBACK_PASS_ON;
122 _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
124 Ecore_Ipc_Event_Client_Data *e;
127 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server) return ECORE_CALLBACK_PASS_ON;
130 case E_IPC_DOMAIN_SETUP:
131 case E_IPC_DOMAIN_REQUEST:
132 case E_IPC_DOMAIN_REPLY:
133 case E_IPC_DOMAIN_EVENT:
136 case E_IPC_OP_EXEC_ACTION:
138 E_Ipc_2Str *req = NULL;
140 if (e_ipc_codec_2str_dec(e->data, e->size, &req))
142 Eina_List *m = e_manager_list();
148 E_Manager *man = eina_list_data_get(m);
152 E_Action *act = e_action_find(req->str1);
154 if (act && act->func.go)
156 act->func.go(E_OBJECT(man), req->str2);
162 d = e_ipc_codec_int_enc(ok, &len);
165 ecore_ipc_client_send(e->client,
167 E_IPC_OP_EXEC_ACTION_REPLY,
185 case E_IPC_DOMAIN_THUMB:
186 e_thumb_client_data(e);
188 case E_IPC_DOMAIN_FM:
189 e_fm2_client_data(e);
191 case E_IPC_DOMAIN_INIT:
192 e_init_client_data(e);