From ea0749e88a03cd2a64d1a427dd98fb36028a827d Mon Sep 17 00:00:00 2001 From: rbdpngn Date: Sun, 8 Jan 2006 07:42:56 +0000 Subject: [PATCH] Allow servers to disown their sockets. Allows for closing after a fork() without unlinking the socket in the filesystem. SVN revision: 19636 --- legacy/ecore/src/lib/ecore_con/Ecore_Con.h | 1 + legacy/ecore/src/lib/ecore_con/ecore_con.c | 20 ++++++++++++++++++++ legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h | 1 + legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c | 20 ++++++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/legacy/ecore/src/lib/ecore_con/Ecore_Con.h b/legacy/ecore/src/lib/ecore_con/Ecore_Con.h index de02560554..2701116629 100644 --- a/legacy/ecore/src/lib/ecore_con/Ecore_Con.h +++ b/legacy/ecore/src/lib/ecore_con/Ecore_Con.h @@ -151,6 +151,7 @@ extern "C" { EAPI int ecore_con_server_connected_get(Ecore_Con_Server *svr); EAPI int ecore_con_server_send(Ecore_Con_Server *svr, void *data, int size); EAPI void ecore_con_server_client_limit_set(Ecore_Con_Server *svr, int client_limit, char reject_excess_clients); + EAPI void ecore_con_server_disown(Ecore_Con_Server *svr); EAPI int ecore_con_client_send(Ecore_Con_Client *cl, void *data, int size); EAPI Ecore_Con_Server *ecore_con_client_server_get(Ecore_Con_Client *cl); diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con.c b/legacy/ecore/src/lib/ecore_con/ecore_con.c index dd228d3ecd..096eda8c0b 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con.c +++ b/legacy/ecore/src/lib/ecore_con/ecore_con.c @@ -605,6 +605,26 @@ ecore_con_server_client_limit_set(Ecore_Con_Server *svr, int client_limit, char svr->reject_excess_clients = reject_excess_clients; } +/** + * Flag the server as not owned by this process, important to use after + * forking so child processes do not remove a parents socket path. + * Beware that if you set this in the parent, stale sockets may be left + * around. + * @param svr The given server. + * @ingroup Ecore_Con_Server_Group + */ +void +ecore_con_server_disown(Ecore_Con_Server *svr) +{ + if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) + { + ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, + "ecore_con_server_client_limit_set"); + return; + } + svr->created = 0; +} + /** * @defgroup Ecore_Con_Client_Group Ecore Connection Client Functions * diff --git a/legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h b/legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h index 9071cacc2c..52455c684c 100644 --- a/legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h +++ b/legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h @@ -297,6 +297,7 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v); /* FIXME: this needs to become an ipc message */ EAPI int ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, void *data, int size); EAPI void ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients); + EAPI void ecore_ipc_server_disown(Ecore_Ipc_Server *svr); /* FIXME: this needs to become an ipc message */ EAPI int ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, void *data, int size); diff --git a/legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c b/legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c index 47da681761..207c850df5 100644 --- a/legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c +++ b/legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c @@ -600,6 +600,26 @@ ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients); } +/** + * Flag the server as not owned by this process, important to use after + * forking so child processes do not remove a parents socket path. + * Beware that if you set this in the parent, stale sockets may be left + * around. + * @param svr The given server. + * @ingroup Ecore_Ipc_Server_Group + */ +void +ecore_ipc_server_disown(Ecore_Ipc_Server *svr) +{ + if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER)) + { + ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER, + "ecore_ipc_server_client_limit_set"); + return; + } + ecore_con_server_disown(svr->server); +} + #define CLENC(_member) \ d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \ if (md >= DLT_SET) \