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 */
18 char buf[1024], buf2[128], buf3[4096];
19 char *tmp, *user, *disp, *base;
22 tmp = getenv("TMPDIR");
23 if (!tmp) tmp = "/tmp";
26 tmp = getenv("XDG_RUNTIME_DIR");
28 tmp = getenv("SD_USER_SOCKETS_DIR");
31 user = getenv("USER");
40 snprintf(buf2, sizeof(buf2), "%i", uidint);
45 disp = getenv("DISPLAY");
46 if (!disp) disp = ":0";
48 e_util_env_set("E_IPC_SOCKET", "");
51 for (trynum = 0; trynum <= 4096; trynum++)
56 snprintf(buf, sizeof(buf), "%s/enlightenment-%s@%08x%08x",
57 base, user, id1, id2);
59 if (stat(buf, &st) == 0)
61 if ((st.st_uid == getuid()) &&
62 ((st.st_mode & (S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)) ==
65 snprintf(buf3, sizeof(buf3), "%s/disp-%s-%i",
67 _e_ipc_server = ecore_ipc_server_add
68 (ECORE_IPC_LOCAL_SYSTEM, buf3, 0, NULL);
69 if (_e_ipc_server) break;
75 if (!_e_ipc_server) return 0;
77 e_util_env_set("E_IPC_SOCKET", buf3);
78 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
79 _e_ipc_cb_client_add, NULL);
80 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
81 _e_ipc_cb_client_del, NULL);
82 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
83 _e_ipc_cb_client_data, NULL);
94 e_ipc_codec_shutdown();
97 ecore_ipc_server_del(_e_ipc_server);
105 /* local subsystem globals */
107 _e_ipc_cb_client_add(void *data __UNUSED__, int type __UNUSED__, void *event)
109 Ecore_Ipc_Event_Client_Add *e;
112 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
113 return ECORE_CALLBACK_PASS_ON;
114 return ECORE_CALLBACK_PASS_ON;
118 _e_ipc_cb_client_del(void *data __UNUSED__, int type __UNUSED__, void *event)
120 Ecore_Ipc_Event_Client_Del *e;
123 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
124 return ECORE_CALLBACK_PASS_ON;
125 /* delete client sruct */
126 e_thumb_client_del(e);
128 e_init_client_del(e);
129 ecore_ipc_client_del(e->client);
130 return ECORE_CALLBACK_PASS_ON;
134 _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
136 Ecore_Ipc_Event_Client_Data *e;
139 if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
140 return ECORE_CALLBACK_PASS_ON;
143 case E_IPC_DOMAIN_SETUP:
144 case E_IPC_DOMAIN_REQUEST:
145 case E_IPC_DOMAIN_REPLY:
146 case E_IPC_DOMAIN_EVENT:
149 case E_IPC_OP_EXEC_ACTION:
151 E_Ipc_2Str *req = NULL;
153 if (e_ipc_codec_2str_dec(e->data, e->size, &req))
155 Eina_List *m = e_manager_list();
161 E_Manager *man = eina_list_data_get(m);
165 E_Action *act = e_action_find(req->str1);
167 if ((act) && (act->func.go))
169 act->func.go(E_OBJECT(man), req->str2);
175 d = e_ipc_codec_int_enc(ok, &len);
178 ecore_ipc_client_send(e->client,
180 E_IPC_OP_EXEC_ACTION_REPLY,
200 case E_IPC_DOMAIN_THUMB:
201 e_thumb_client_data(e);
204 case E_IPC_DOMAIN_FM:
205 e_fm2_client_data(e);
208 case E_IPC_DOMAIN_INIT:
209 e_init_client_data(e);
212 case E_IPC_DOMAIN_ALERT:
216 case E_ALERT_OP_RESTART:
217 if (getenv("E_START_MTRACK"))
218 e_util_env_set("MTRACK", "track");
221 case E_ALERT_OP_EXIT:
230 return ECORE_CALLBACK_PASS_ON;