From 72a8a2ce40ee9913c676f922551f65ca3cdd0e3b Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Wed, 15 Jan 2020 02:35:11 +0000 Subject: [PATCH] ecore_exe/efl_exe - implement exit with parent on bsds with procctl --- header_checks/meson.build | 1 + src/lib/ecore/ecore_exe_posix.c | 8 ++++++++ src/lib/ecore/efl_exe.c | 12 ++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/header_checks/meson.build b/header_checks/meson.build index 3aaf3776c6..1d3f0e171f 100644 --- a/header_checks/meson.build +++ b/header_checks/meson.build @@ -97,6 +97,7 @@ function_checks = [ ['mmap', ['sys/mman.h']], ['mtrace', ['mcheck.h']], ['prctl', ['sys/prctl.h']], + ['procctl', ['sys/procctl.h']], ['realpath', ['stdlib.h']], ['setxattr', ['sys/types.h', 'sys/xattr.h']], ['siglongjmp', ['setjmp.h']], diff --git a/src/lib/ecore/ecore_exe_posix.c b/src/lib/ecore/ecore_exe_posix.c index 44d9c73ca8..07f1058ab0 100644 --- a/src/lib/ecore/ecore_exe_posix.c +++ b/src/lib/ecore/ecore_exe_posix.c @@ -16,6 +16,8 @@ #ifdef HAVE_PRCTL # include +#elif defined(HAVE_PROCCTL) +# include #endif #ifdef HAVE_SYS_WAIT_H @@ -1000,6 +1002,12 @@ _ecore_exe_exec_it(const char *exe_cmd, { prctl(PR_SET_PDEATHSIG, SIGTERM); } +#elif defined(HAVE_PROCCTL) + if ((flags & ECORE_EXE_TERM_WITH_PARENT)) + { + int sig = SIGTERM; + procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &sig); + } #endif if (!(flags & ECORE_EXE_NOT_LEADER)) setsid(); diff --git a/src/lib/ecore/efl_exe.c b/src/lib/ecore/efl_exe.c index 8609dbfac5..b2c6341523 100644 --- a/src/lib/ecore/efl_exe.c +++ b/src/lib/ecore/efl_exe.c @@ -25,8 +25,10 @@ # include # ifdef HAVE_PRCTL # include +# elif defined(HAVE_PROCCTL) +# include # endif -# ifdef HAVE_SYS_WAIT_H +#ifdef HAVE_SYS_WAIT_H # include # endif # ifndef HAVE_CLEARENV @@ -150,7 +152,13 @@ _exec(const char *cmd, Efl_Exe_Flags flags, Efl_Task_Flags task_flags) # ifdef HAVE_PRCTL if (task_flags & EFL_TASK_FLAGS_EXIT_WITH_PARENT) prctl(PR_SET_PDEATHSIG, SIGTERM); -# endif +#elif defined(HAVE_PROCCTL) + if (task_flags & EFL_TASK_FLAGS_EXIT_WITH_PARENT) + { + int sig = SIGTERM; + procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &sig); + } +#endif if (flags & EFL_EXE_FLAGS_GROUP_LEADER) setsid(); if (use_sh) // We have to use a shell to run this.