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)
39 if ((st.st_uid == getuid()) &&
40 ((st.st_mode & (S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)) ==
46 e_error_message_show(_("Possible IPC Hack Attempt. The IPC socket\n"
47 "directory already exists BUT has permissions\n"
48 "that are too leanient (must only be readable\n" "and writable by the owner, and nobody else)\n"
49 "or is not owned by you. Please check:\n"
50 "%s/enlightenment-%s\n"), tmp, user);
56 e_error_message_show(_("The IPC socket directory cannot be created or\n"
59 "%s/enlightenment-%s\n"),
64 snprintf(buf, sizeof(buf), "%s/enlightenment-%s/disp-%s-%i",
65 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,
72 _e_ipc_cb_client_add, NULL);
73 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
74 _e_ipc_cb_client_del, NULL);
75 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
76 _e_ipc_cb_client_data, NULL);
87 e_ipc_codec_shutdown();
90 ecore_ipc_server_del(_e_ipc_server);
98 /* local subsystem globals */
100 _e_ipc_cb_client_add(void *data __UNUSED__, int type __UNUSED__, void *event)
102 Ecore_Ipc_Event_Client_Add *e;
105 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
106 return ECORE_CALLBACK_PASS_ON;
107 return ECORE_CALLBACK_PASS_ON;
111 _e_ipc_cb_client_del(void *data __UNUSED__, int type __UNUSED__, void *event)
113 Ecore_Ipc_Event_Client_Del *e;
116 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
117 return ECORE_CALLBACK_PASS_ON;
118 /* delete client sruct */
119 e_thumb_client_del(e);
121 e_init_client_del(e);
122 ecore_ipc_client_del(e->client);
123 return ECORE_CALLBACK_PASS_ON;
127 _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
129 Ecore_Ipc_Event_Client_Data *e;
132 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
133 return ECORE_CALLBACK_PASS_ON;
136 case E_IPC_DOMAIN_SETUP:
137 case E_IPC_DOMAIN_REQUEST:
138 case E_IPC_DOMAIN_REPLY:
139 case E_IPC_DOMAIN_EVENT:
142 case E_IPC_OP_EXEC_ACTION:
144 E_Ipc_2Str *req = NULL;
146 if (e_ipc_codec_2str_dec(e->data, e->size, &req))
148 Eina_List *m = e_manager_list();
154 E_Manager *man = eina_list_data_get(m);
158 E_Action *act = e_action_find(req->str1);
160 if ((act) && (act->func.go))
162 act->func.go(E_OBJECT(man), req->str2);
168 d = e_ipc_codec_int_enc(ok, &len);
171 ecore_ipc_client_send(e->client,
173 E_IPC_OP_EXEC_ACTION_REPLY,
193 case E_IPC_DOMAIN_THUMB:
194 e_thumb_client_data(e);
197 case E_IPC_DOMAIN_FM:
198 e_fm2_client_data(e);
201 case E_IPC_DOMAIN_INIT:
202 e_init_client_data(e);
205 case E_IPC_DOMAIN_ALERT:
209 case E_ALERT_OP_RESTART:
210 if (getenv("E_START_MTRACK"))
211 e_util_env_set("MTRACK", "track");
214 case E_ALERT_OP_EXIT: