ipc: simplify IPC creation, make it work on Windows as well.

Summary:
Windows names are inside \\.\pipe\ namespace and shouldn't contain
"/", actually even on UNIX it is not required to craft the whole path
as ecore_ipc/ecore_con will automatically encode based on local/system
local, name and port.

Reviewers: stephenmhouston, vtorri

Differential Revision: https://phab.enlightenment.org/D4755
This commit is contained in:
Gustavo Sverzut Barbieri 2017-03-30 11:29:24 -03:00
parent c6e6047d1a
commit e27b26ebe1
2 changed files with 19 additions and 55 deletions

View File

@ -2,8 +2,6 @@
#undef ERR #undef ERR
#define ERR(...) do { printf(__VA_ARGS__); putc('\n', stdout); } while(0) #define ERR(...) do { printf(__VA_ARGS__); putc('\n', stdout); } while(0)
char *e_ipc_socket = NULL;
#ifdef USE_IPC #ifdef USE_IPC
/* local subsystem functions */ /* local subsystem functions */
static Eina_Bool _e_ipc_cb_client_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); static Eina_Bool _e_ipc_cb_client_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
@ -17,53 +15,19 @@ static Ecore_Ipc_Server *_e_ipc_server = NULL;
int int
e_ipc_init(void) e_ipc_init(void)
{ {
char buf[4096], buf3[4096];
const char *tmp, *user, *base = NULL;
int pid, trynum = 0, id1 = 0;
tmp = eina_environment_tmp_get();
if (ecore_file_is_dir(tmp) && ecore_file_can_write(tmp))
base = tmp;
else
ERR("Temp dir could not be accessed");
#ifdef _WIN32
user = getenv("USERNAME");
#else
user = getenv("USER");
#endif
setenv("EPHOTO_IPC_SOCKET", "", 1);
pid = (int)getpid();
for (trynum = 0; trynum <= 4096; trynum++)
{
snprintf(buf, sizeof(buf), "%s/e-%s@%x",
base, user, id1);
if (!mkdir(buf, S_IRWXU))
{
#ifdef USE_IPC
snprintf(buf3, sizeof(buf3), "%s/%i",
buf, pid);
_e_ipc_server = ecore_ipc_server_add
(ECORE_IPC_LOCAL_SYSTEM, buf3, 0, NULL);
if (_e_ipc_server)
#endif
{
e_ipc_socket = strdup(ecore_file_file_get(buf));
break;
}
}
id1 = rand();
}
#ifdef USE_IPC #ifdef USE_IPC
int port = getpid();
/* NOTE: windows has no getppid(), so use an envvar */
char port_str[sizeof("2147483648")] = "";
snprintf(port_str, sizeof(port_str), "%d", port);
setenv("EPHOTO_IPC_PORT", port_str, 1);
_e_ipc_server = ecore_ipc_server_add
(ECORE_IPC_LOCAL_SYSTEM, "ephoto", port, NULL);
if (!_e_ipc_server) if (!_e_ipc_server)
{ {
ERR("Gave up after 4096 sockets in '%s'. All failed", base); ERR("Couldn't create Ephoto IPC server port=%d", port);
return 0; return 0;
} }
setenv("EPHOTO_IPC_SOCKET", "", 1);
setenv("EPHOTO_IPC_SOCKET", buf3, 1);
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
_e_ipc_cb_client_del, NULL); _e_ipc_cb_client_del, NULL);
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
@ -82,7 +46,6 @@ e_ipc_shutdown(void)
_e_ipc_server = NULL; _e_ipc_server = NULL;
} }
#endif #endif
free(e_ipc_socket);
return 1; return 1;
} }

View File

@ -114,19 +114,20 @@ main(int argc,
static int static int
_e_ipc_init(void) _e_ipc_init(void)
{ {
char *sdir; const char *port_str = getenv("EPHOTO_IPC_PORT");
int port;
sdir = getenv("EPHOTO_IPC_SOCKET"); if ((!port_str) || ((port = atoi(port_str)) == 0))
if (!sdir)
{ {
printf("The EPHOTO_IPC_SOCKET environment variable is not set. This is\n" printf("Error: could not query Ephoto IPC port=%s\n", port_str);
"exported by Enlightenment to all processes it launches.\n" return 0;
"This environment variable must be set and must point to\n" }
"Enlightenment's IPC socket file (minus port number).\n"); _e_ipc_server = ecore_ipc_server_connect
(ECORE_IPC_LOCAL_SYSTEM, "ephoto", port, NULL);
if (!_e_ipc_server)
{
printf("Error: could not connect to Ephoto IPC port=%d\n", port);
return 0; return 0;
} }
_e_ipc_server = ecore_ipc_server_connect(ECORE_IPC_LOCAL_SYSTEM, sdir, 0, NULL);
if (!_e_ipc_server) return 0;
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, _e_ipc_cb_server_add, NULL); ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, _e_ipc_cb_server_add, NULL);
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, _e_ipc_cb_server_del, NULL); ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, _e_ipc_cb_server_del, NULL);