--- 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.0Received 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