2004-11-24 19:37:45 -08:00
|
|
|
#include "e.h"
|
|
|
|
|
2014-03-20 10:29:02 -07:00
|
|
|
EINTERN char *e_ipc_socket = NULL;
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
#ifdef USE_IPC
|
2004-11-24 19:37:45 -08:00
|
|
|
/* local subsystem functions */
|
2011-07-25 02:40:18 -07:00
|
|
|
static Eina_Bool _e_ipc_cb_client_add(void *data __UNUSED__, int type __UNUSED__, void *event);
|
|
|
|
static Eina_Bool _e_ipc_cb_client_del(void *data __UNUSED__, int type __UNUSED__, void *event);
|
|
|
|
static Eina_Bool _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event);
|
2005-05-12 07:46:28 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* local subsystem globals */
|
2005-08-13 01:04:38 -07:00
|
|
|
static Ecore_Ipc_Server *_e_ipc_server = NULL;
|
2006-03-09 21:48:46 -08:00
|
|
|
#endif
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
/* externally accessible functions */
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_ipc_init(void)
|
|
|
|
{
|
2012-10-15 08:45:01 -07:00
|
|
|
char buf[4096], buf2[128], buf3[4096];
|
2012-06-29 22:33:36 -07:00
|
|
|
char *tmp, *user, *disp, *base;
|
2013-08-18 03:51:03 -07:00
|
|
|
int pid, trynum = 0, id1 = 0;
|
|
|
|
struct stat st;
|
2010-06-24 09:19:12 -07:00
|
|
|
|
2006-07-04 11:36:29 -07:00
|
|
|
tmp = getenv("TMPDIR");
|
|
|
|
if (!tmp) tmp = "/tmp";
|
2012-06-29 22:33:36 -07:00
|
|
|
base = tmp;
|
|
|
|
|
|
|
|
tmp = getenv("XDG_RUNTIME_DIR");
|
2013-08-18 03:51:03 -07:00
|
|
|
if (tmp)
|
|
|
|
{
|
|
|
|
if (stat(tmp, &st) == 0)
|
|
|
|
{
|
|
|
|
if ((st.st_uid == getuid()) &&
|
|
|
|
((st.st_mode & (S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)) ==
|
|
|
|
(S_IRWXU | S_IFDIR)))
|
|
|
|
base = tmp;
|
|
|
|
else
|
|
|
|
ERR("XDG_RUNTIME_DIR of '%s' failed permissions check", tmp);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ERR("XDG_RUNTIME_DIR of '%s' cannot be accessed", tmp);
|
|
|
|
}
|
|
|
|
|
2012-06-29 22:33:36 -07:00
|
|
|
tmp = getenv("SD_USER_SOCKETS_DIR");
|
2013-08-18 03:51:03 -07:00
|
|
|
if (tmp)
|
|
|
|
{
|
|
|
|
if (stat(tmp, &st) == 0)
|
|
|
|
{
|
|
|
|
if ((st.st_uid == getuid()) &&
|
|
|
|
((st.st_mode & (S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)) ==
|
|
|
|
(S_IRWXU | S_IFDIR)))
|
|
|
|
base = tmp;
|
|
|
|
else
|
|
|
|
ERR("SD_USER_SOCKETS_DIR of '%s' failed permissions check", tmp);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ERR("SD_USER_SOCKETS_DIR of '%s' cannot be accessed", tmp);
|
|
|
|
}
|
2013-01-11 02:34:29 -08:00
|
|
|
|
2006-07-04 11:36:29 -07:00
|
|
|
user = getenv("USER");
|
2012-06-29 22:33:36 -07:00
|
|
|
if (!user)
|
|
|
|
{
|
|
|
|
int uidint;
|
2013-01-11 02:34:29 -08:00
|
|
|
|
2012-06-29 22:33:36 -07:00
|
|
|
user = "__unknown__";
|
|
|
|
uidint = getuid();
|
|
|
|
if (uidint >= 0)
|
|
|
|
{
|
|
|
|
snprintf(buf2, sizeof(buf2), "%i", uidint);
|
|
|
|
user = buf2;
|
|
|
|
}
|
|
|
|
}
|
2013-01-11 02:34:29 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
disp = getenv("DISPLAY");
|
|
|
|
if (!disp) disp = ":0";
|
2013-01-11 02:34:29 -08:00
|
|
|
|
2012-06-29 22:33:36 -07:00
|
|
|
e_util_env_set("E_IPC_SOCKET", "");
|
2013-01-11 02:34:29 -08:00
|
|
|
|
2006-07-04 11:36:29 -07:00
|
|
|
pid = (int)getpid();
|
2012-06-29 22:33:36 -07:00
|
|
|
for (trynum = 0; trynum <= 4096; trynum++)
|
2006-07-04 11:36:29 -07:00
|
|
|
{
|
2012-11-13 22:38:25 -08:00
|
|
|
snprintf(buf, sizeof(buf), "%s/e-%s@%x",
|
|
|
|
base, user, id1);
|
2013-12-07 12:32:11 -08:00
|
|
|
if (mkdir(buf, S_IRWXU) < 0)
|
|
|
|
goto retry;
|
2013-12-07 12:33:16 -08:00
|
|
|
if (stat(buf, &st) < 0)
|
|
|
|
goto retry;
|
|
|
|
if ((st.st_uid == getuid()) &&
|
|
|
|
((st.st_mode & (S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)) ==
|
|
|
|
(S_IRWXU | S_IFDIR)))
|
2011-06-29 07:13:34 -07:00
|
|
|
{
|
2014-03-20 10:29:02 -07:00
|
|
|
#ifdef USE_IPC
|
2013-12-07 12:33:16 -08:00
|
|
|
snprintf(buf3, sizeof(buf3), "%s/%s-%i",
|
|
|
|
buf, disp, pid);
|
|
|
|
_e_ipc_server = ecore_ipc_server_add
|
|
|
|
(ECORE_IPC_LOCAL_SYSTEM, buf3, 0, NULL);
|
2014-03-20 10:29:02 -07:00
|
|
|
if (_e_ipc_server)
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
e_ipc_socket = strdup(ecore_file_file_get(buf));
|
|
|
|
break;
|
|
|
|
}
|
2011-06-29 07:13:34 -07:00
|
|
|
}
|
2013-12-07 12:32:11 -08:00
|
|
|
retry:
|
2012-06-29 22:33:36 -07:00
|
|
|
id1 = rand();
|
2006-07-04 11:36:29 -07:00
|
|
|
}
|
2014-03-20 10:29:02 -07:00
|
|
|
#ifdef USE_IPC
|
2013-08-18 03:51:03 -07:00
|
|
|
if (!_e_ipc_server)
|
|
|
|
{
|
|
|
|
ERR("Gave up after 4096 sockets in '%s'. All failed", base);
|
|
|
|
return 0;
|
|
|
|
}
|
2012-06-29 22:33:36 -07:00
|
|
|
|
2013-07-25 01:06:51 -07:00
|
|
|
INF("E_IPC_SOCKET=%s", buf3);
|
2012-06-29 22:33:36 -07:00
|
|
|
e_util_env_set("E_IPC_SOCKET", buf3);
|
2012-06-20 23:19:43 -07:00
|
|
|
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
|
2011-07-25 02:40:18 -07:00
|
|
|
_e_ipc_cb_client_add, NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
|
2011-07-25 02:40:18 -07:00
|
|
|
_e_ipc_cb_client_del, NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
|
2011-07-25 02:40:18 -07:00
|
|
|
_e_ipc_cb_client_data, NULL);
|
2010-06-24 09:19:12 -07:00
|
|
|
|
2005-05-12 07:46:28 -07:00
|
|
|
e_ipc_codec_init();
|
2010-06-24 09:19:12 -07:00
|
|
|
#endif
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_ipc_shutdown(void)
|
|
|
|
{
|
2010-06-24 09:19:12 -07:00
|
|
|
#ifdef USE_IPC
|
2005-05-12 07:46:28 -07:00
|
|
|
e_ipc_codec_shutdown();
|
2004-11-24 19:37:45 -08:00
|
|
|
if (_e_ipc_server)
|
|
|
|
{
|
2011-06-29 07:13:34 -07:00
|
|
|
ecore_ipc_server_del(_e_ipc_server);
|
|
|
|
_e_ipc_server = NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2007-04-04 23:59:02 -07:00
|
|
|
#endif
|
2014-03-20 10:29:02 -07:00
|
|
|
E_FREE(e_ipc_socket);
|
2007-04-04 23:59:02 -07:00
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
#ifdef USE_IPC
|
2004-11-24 19:37:45 -08:00
|
|
|
/* local subsystem globals */
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2011-07-25 02:40:18 -07:00
|
|
|
_e_ipc_cb_client_add(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
Ecore_Ipc_Event_Client_Add *e;
|
2010-06-24 09:19:12 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
e = event;
|
2012-06-20 23:19:43 -07:00
|
|
|
if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
|
2011-07-25 02:40:18 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2011-07-25 02:40:18 -07:00
|
|
|
_e_ipc_cb_client_del(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
Ecore_Ipc_Event_Client_Del *e;
|
2010-06-24 09:19:12 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
e = event;
|
2012-06-20 23:19:43 -07:00
|
|
|
if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
|
2011-07-25 02:40:18 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
/* delete client sruct */
|
2006-07-08 02:18:04 -07:00
|
|
|
e_thumb_client_del(e);
|
2007-03-02 09:00:20 -08:00
|
|
|
e_fm2_client_del(e);
|
2004-11-24 19:37:45 -08:00
|
|
|
ecore_ipc_client_del(e->client);
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2011-07-25 02:40:18 -07:00
|
|
|
_e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
Ecore_Ipc_Event_Client_Data *e;
|
2010-06-24 09:19:12 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
e = event;
|
2012-06-20 23:19:43 -07:00
|
|
|
if (ecore_ipc_client_server_get(e->client) != _e_ipc_server)
|
2011-07-25 02:40:18 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2006-07-08 02:18:04 -07:00
|
|
|
switch (e->major)
|
2004-11-26 04:20:38 -08:00
|
|
|
{
|
2006-07-08 02:18:04 -07:00
|
|
|
case E_IPC_DOMAIN_SETUP:
|
|
|
|
case E_IPC_DOMAIN_REQUEST:
|
|
|
|
case E_IPC_DOMAIN_REPLY:
|
|
|
|
case E_IPC_DOMAIN_EVENT:
|
2009-10-25 08:55:11 -07:00
|
|
|
switch (e->minor)
|
|
|
|
{
|
2011-06-29 07:13:34 -07:00
|
|
|
case E_IPC_OP_EXEC_ACTION:
|
2013-01-11 02:34:29 -08:00
|
|
|
{
|
|
|
|
E_Ipc_2Str *req = NULL;
|
|
|
|
|
|
|
|
if (e_ipc_codec_2str_dec(e->data, e->size, &req))
|
|
|
|
{
|
|
|
|
Eina_List *m = e_manager_list();
|
|
|
|
int len, ok = 0;
|
|
|
|
void *d;
|
|
|
|
|
|
|
|
if (m)
|
|
|
|
{
|
|
|
|
E_Manager *man = eina_list_data_get(m);
|
|
|
|
|
|
|
|
if (man)
|
|
|
|
{
|
|
|
|
E_Action *act = e_action_find(req->str1);
|
|
|
|
|
|
|
|
if ((act) && (act->func.go))
|
|
|
|
{
|
|
|
|
act->func.go(E_OBJECT(man), req->str2);
|
|
|
|
ok = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
d = e_ipc_codec_int_enc(ok, &len);
|
|
|
|
if (d)
|
|
|
|
{
|
|
|
|
ecore_ipc_client_send(e->client,
|
|
|
|
E_IPC_DOMAIN_REPLY,
|
|
|
|
E_IPC_OP_EXEC_ACTION_REPLY,
|
|
|
|
0, 0, 0, d, len);
|
|
|
|
free(d);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (req)
|
|
|
|
{
|
|
|
|
E_FREE(req->str1);
|
|
|
|
E_FREE(req->str2);
|
|
|
|
E_FREE(req);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2011-06-29 07:13:34 -07:00
|
|
|
|
|
|
|
default:
|
2009-10-25 08:55:11 -07:00
|
|
|
break;
|
|
|
|
}
|
2011-06-29 07:13:34 -07:00
|
|
|
break;
|
|
|
|
|
2006-07-08 02:18:04 -07:00
|
|
|
case E_IPC_DOMAIN_THUMB:
|
2011-06-29 07:13:34 -07:00
|
|
|
e_thumb_client_data(e);
|
|
|
|
break;
|
|
|
|
|
2007-03-02 09:00:20 -08:00
|
|
|
case E_IPC_DOMAIN_FM:
|
2011-06-29 07:13:34 -07:00
|
|
|
e_fm2_client_data(e);
|
|
|
|
break;
|
|
|
|
|
2011-08-31 06:52:29 -07:00
|
|
|
case E_IPC_DOMAIN_ALERT:
|
2013-01-11 02:34:29 -08:00
|
|
|
{
|
|
|
|
switch (e->minor)
|
|
|
|
{
|
|
|
|
case E_ALERT_OP_RESTART:
|
|
|
|
if (getenv("E_START_MTRACK"))
|
|
|
|
e_util_env_set("MTRACK", "track");
|
|
|
|
ecore_app_restart();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case E_ALERT_OP_EXIT:
|
|
|
|
exit(-11);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2004-11-26 04:20:38 -08:00
|
|
|
default:
|
2011-06-29 07:13:34 -07:00
|
|
|
break;
|
2004-11-26 04:20:38 -08:00
|
|
|
}
|
2012-06-29 22:33:36 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-06-24 09:19:12 -07:00
|
|
|
}
|
2011-06-29 07:13:34 -07:00
|
|
|
|
2006-03-11 08:18:27 -08:00
|
|
|
#endif
|