---
src/execline/trap.c | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/src/execline/trap.c b/src/execline/trap.c
index ba1b25a..1a4aa60 100644
--- a/src/execline/trap.c
+++ b/src/execline/trap.c
_at__at_ -18,7 +18,7 _at__at_
#include <execline/execline.h>
-#define USAGE "trap [ -x ] { signal { cmdline } ... } prog..."
+#define USAGE "trap [ -x ] [ -P ] { signal { cmdline } ... } prog..."
#define dieusage() strerr_dieusage(100, USAGE) ;
static inline void trap_action (unsigned int i, char const *const *envp, size_t envlen, pid_t *pids, char const *const **argvs)
_at__at_ -50,7 +50,7 _at__at_ int main (int argc, char const **argv, char const *const *envp)
size_t envlen = env_len(envp) ;
iopause_fd x = { .events = IOPAUSE_READ } ;
sigset_t full, set ;
- int xfersigs = 0 ;
+ int xfersigs = 0, adopt = 0 ;
unsigned int argc1 ;
unsigned int i = 0 ;
PROG = "trap" ;
_at__at_ -59,11 +59,12 _at__at_ int main (int argc, char const **argv, char const *const *envp)
subgetopt l = SUBGETOPT_ZERO ;
for (;;)
{
- int opt = subgetopt_r(argc, argv, "xt:", &l) ;
+ int opt = subgetopt_r(argc, argv, "xP", &l) ;
if (opt == -1) break ;
switch (opt)
{
case 'x' : xfersigs = 1 ; break ;
+ case 'P' : adopt = 1 ; break ;
default : dieusage() ;
}
}
_at__at_ -121,8 +122,23 _at__at_ int main (int argc, char const **argv, char const *const *envp)
if (x.fd == -1) strerr_diefu1sys(111, "selfpipe_init") ;
if (!selfpipe_trapset(&set)) strerr_diefu1sys(111, "trap signals") ;
- pids[SKALIBS_NSIG] = cspawn(argv[argc1 + 1], argv + argc1 + 1, envp, CSPAWN_FLAGS_SELFPIPE_FINISH, 0, 0) ;
- if (!pids[SKALIBS_NSIG]) strerr_diefu2sys(111, "spawn ", argv[argc1 + 1]) ;
+ if (!adopt)
+ {
+ pids[SKALIBS_NSIG] = cspawn(argv[argc1 + 1], argv + argc1 + 1, envp, CSPAWN_FLAGS_SELFPIPE_FINISH, 0, 0) ;
+ if (!pids[SKALIBS_NSIG]) strerr_diefu2sys(111, "spawn ", argv[argc1 + 1]) ;
+ } else {
+ int status;
+ if (argc > argc1 + 2)
+ dieusage();
+ if (!pid_scan(argv[argc1 + 1], &pids[SKALIBS_NSIG]))
+ strerr_dieinvalid(100, "PID");
+ switch (waitpid_nointr(pids[SKALIBS_NSIG], &status, WNOHANG))
+ {
+ case -1: strerr_dief2sys(111, "invalid ", "PID") ;
+ case 0 : break ;
+ default : return wait_estatus(status) ;
+ }
+ }
loop:
if (iopause_g(&x, 1, 0) < 0) strerr_diefu1sys(111, "iopause") ;
--
2.44.0
Received on Sat May 04 2024 - 21:58:21 CEST
This archive was generated by hypermail 2.4.0 : Sat May 04 2024 - 21:59:38 CEST