forked from enlightenment/efl
exactness: protect against forked calls
there came up a issue, where a excatness spawned processes were bringing up a efreetd instance, when the efreetd instance turned off itself, the files for exactness were written again, which is wrong. This ensures that forked instances do not take any actions. Differential Revision: https://phab.enlightenment.org/D11634
This commit is contained in:
parent
3598654965
commit
b3786aa83a
|
@ -4,6 +4,31 @@
|
|||
|
||||
#include "common.h"
|
||||
|
||||
Eina_Bool
|
||||
ex_is_original_app(void)
|
||||
{
|
||||
const char *original_pid_env = getenv("EXACTNESS_ORIGINAL_PID");
|
||||
if (original_pid_env)
|
||||
{
|
||||
pid_t original_pid = atoi(original_pid_env);
|
||||
if (original_pid == getpid())
|
||||
return EINA_TRUE;
|
||||
}
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
ex_set_original_envvar(void)
|
||||
{
|
||||
const char *original_pid_env = getenv("EXACTNESS_ORIGINAL_PID");
|
||||
if (!original_pid_env)
|
||||
{
|
||||
char pid[30];
|
||||
snprintf(pid, sizeof(pid), "%d", getpid());
|
||||
setenv("EXACTNESS_ORIGINAL_PID", pid, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ex_prepare_elm_overloay(void)
|
||||
{
|
||||
|
|
|
@ -260,6 +260,9 @@ typedef struct
|
|||
Evas *(*_evas_new)(void);
|
||||
const char *_exactness_action_type_to_string_get(Exactness_Action_Type type);
|
||||
|
||||
|
||||
Eina_Bool ex_is_original_app(void);
|
||||
void ex_set_original_envvar(void);
|
||||
Eina_Bool exactness_image_compare(Exactness_Image *img1, Exactness_Image *img2, Exactness_Image **diff_img);
|
||||
Exactness_Unit *exactness_unit_file_read(const char *filename);
|
||||
Eina_Bool exactness_unit_file_write(Exactness_Unit *unit, const char *filename);
|
||||
|
|
|
@ -1039,6 +1039,8 @@ eina_init(void)
|
|||
|
||||
ORIGINAL_CALL("eina_init");
|
||||
|
||||
ex_set_original_envvar();
|
||||
|
||||
if (original_return == 1)
|
||||
{
|
||||
const char *dest = getenv("EXACTNESS_DEST");
|
||||
|
@ -1080,7 +1082,7 @@ ecore_evas_init(void)
|
|||
|
||||
ORIGINAL_CALL("ecore_evas_init")
|
||||
|
||||
if (original_return == 1)
|
||||
if (ex_is_original_app() && original_return == 1)
|
||||
{
|
||||
_setup_ee_creation();
|
||||
}
|
||||
|
@ -1095,7 +1097,7 @@ elm_init(int argc, char **argv)
|
|||
int original_return;
|
||||
ORIGINAL_CALL("elm_init", argc, argv)
|
||||
|
||||
if (original_return == 1)
|
||||
if (ex_is_original_app() && original_return == 1)
|
||||
ex_prepare_elm_overloay();
|
||||
|
||||
return original_return;
|
||||
|
@ -1106,7 +1108,8 @@ ecore_main_loop_begin(void)
|
|||
{
|
||||
int original_return;
|
||||
ORIGINAL_CALL("ecore_main_loop_begin")
|
||||
_write_unit_file();
|
||||
if (ex_is_original_app())
|
||||
_write_unit_file();
|
||||
(void)original_return;
|
||||
}
|
||||
|
||||
|
@ -1115,7 +1118,8 @@ efl_loop_begin(Eo *obj)
|
|||
{
|
||||
Eina_Value *original_return;
|
||||
ORIGINAL_CALL_T(Eina_Value*, "efl_loop_begin", obj);
|
||||
_write_unit_file();
|
||||
if (ex_is_original_app())
|
||||
_write_unit_file();
|
||||
return original_return;
|
||||
}
|
||||
|
||||
|
@ -1125,7 +1129,7 @@ eina_shutdown(void)
|
|||
int original_return;
|
||||
static Eina_Bool output_written = EINA_FALSE;
|
||||
ORIGINAL_CALL("eina_shutdown")
|
||||
if (original_return == 1 && !output_written)
|
||||
if (ex_is_original_app() &&original_return == 1 && !output_written)
|
||||
{
|
||||
output_written = EINA_TRUE;
|
||||
_write_unit_file();
|
||||
|
|
|
@ -314,7 +314,9 @@ eina_init(void)
|
|||
|
||||
ORIGINAL_CALL("eina_init");
|
||||
|
||||
if (original_return == 1)
|
||||
ex_set_original_envvar();
|
||||
|
||||
if (ex_is_original_app() && original_return == 1)
|
||||
{
|
||||
_log_domain = eina_log_domain_register("exactness_recorder", NULL);
|
||||
|
||||
|
@ -336,7 +338,7 @@ ecore_evas_init(void)
|
|||
|
||||
ORIGINAL_CALL("ecore_evas_init")
|
||||
|
||||
if (original_return == 1)
|
||||
if (ex_is_original_app() && original_return == 1)
|
||||
{
|
||||
_setup_ee_creation();
|
||||
|
||||
|
@ -352,7 +354,7 @@ elm_init(int argc, char **argv)
|
|||
int original_return;
|
||||
ORIGINAL_CALL("elm_init", argc, argv)
|
||||
|
||||
if (original_return == 1)
|
||||
if (ex_is_original_app() && original_return == 1)
|
||||
ex_prepare_elm_overloay();
|
||||
|
||||
return original_return;
|
||||
|
@ -363,7 +365,8 @@ ecore_main_loop_begin(void)
|
|||
{
|
||||
int original_return;
|
||||
ORIGINAL_CALL("ecore_main_loop_begin")
|
||||
_output_write();
|
||||
if (ex_is_original_app())
|
||||
_output_write();
|
||||
(void)original_return;
|
||||
}
|
||||
|
||||
|
@ -372,7 +375,8 @@ efl_loop_begin(Eo *obj)
|
|||
{
|
||||
Eina_Value *original_return;
|
||||
ORIGINAL_CALL_T(Eina_Value*, "efl_loop_begin", obj);
|
||||
_output_write();
|
||||
if (ex_is_original_app())
|
||||
_output_write();
|
||||
return original_return;
|
||||
}
|
||||
|
||||
|
@ -382,7 +386,7 @@ eina_shutdown(void)
|
|||
int original_return;
|
||||
static Eina_Bool output_written = EINA_FALSE;
|
||||
ORIGINAL_CALL("eina_shutdown")
|
||||
if (original_return == 1 && !output_written)
|
||||
if (ex_is_original_app() && original_return == 1 && !output_written)
|
||||
{
|
||||
output_written = EINA_TRUE;
|
||||
_output_write();
|
||||
|
|
Loading…
Reference in New Issue