* "functions -c" and TRAPxxx @ 2022-06-07 1:59 Bart Schaefer 2022-06-07 9:57 ` Peter Stephenson 0 siblings, 1 reply; 7+ messages in thread From: Bart Schaefer @ 2022-06-07 1:59 UTC (permalink / raw) To: Zsh hackers list I'm not feeling quite knowledgeable enough about settrap / removetrapnode vis-a-vis reference counting to offer a patch for this yet, so if someone else wants to jump in or educate me, please do. Creating a TRAPxxx function by "aliasing" to another function with "functions -c" does not create the expected trap handler. % TRAPUSR1() { print $0 } % functions -c TRAPUSR1 TRAPUSR2 % trap TRAPUSR1 () { print $0 } % functions -m TRAP\* TRAPUSR1 () { print $0 } TRAPUSR2 () { print $0 } % Aside: Local trap handling in _main_complete confuses trap-name completion: % compinit % zstyle '*' format %d % trap % functions -c TRAP<TAB> old name TRAPINT TRAPQUIT I don't know that we can do anything about this, I just found it briefly confusing. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "functions -c" and TRAPxxx 2022-06-07 1:59 "functions -c" and TRAPxxx Bart Schaefer @ 2022-06-07 9:57 ` Peter Stephenson 2022-06-07 14:57 ` Bart Schaefer 0 siblings, 1 reply; 7+ messages in thread From: Peter Stephenson @ 2022-06-07 9:57 UTC (permalink / raw) To: Zsh hackers list > On 07 June 2022 at 02:59 Bart Schaefer <schaefer@brasslantern.com> wrote: > I'm not feeling quite knowledgeable enough about settrap / > removetrapnode vis-a-vis reference counting to offer a patch for this > yet, so if someone else wants to jump in or educate me, please do. > > Creating a TRAPxxx function by "aliasing" to another function with > "functions -c" does not create the expected trap handler. I don't think there's any magic for this, it'll have to be ad hoc calls to settrap and unsettrap based on the function name. pws ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "functions -c" and TRAPxxx 2022-06-07 9:57 ` Peter Stephenson @ 2022-06-07 14:57 ` Bart Schaefer 2022-06-09 3:24 ` Bart Schaefer 0 siblings, 1 reply; 7+ messages in thread From: Bart Schaefer @ 2022-06-07 14:57 UTC (permalink / raw) To: Peter Stephenson; +Cc: Zsh hackers list On Tue, Jun 7, 2022 at 2:59 AM Peter Stephenson <p.w.stephenson@ntlworld.com> wrote: > > > Creating a TRAPxxx function by "aliasing" to another function with > > "functions -c" does not create the expected trap handler. > > I don't think there's any magic for this, it'll have to be ad hoc > calls to settrap and unsettrap based on the function name. Yes, but e.g. in exec.c there is a comment /* * Remove the old node explicitly in case it has * an alternative name */ I know most of what's going on there, but "functions -c" is creating an alternate name, and there is also the failure case of settrap() returning nonzero to handle. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "functions -c" and TRAPxxx 2022-06-07 14:57 ` Bart Schaefer @ 2022-06-09 3:24 ` Bart Schaefer 2022-06-09 8:55 ` Peter Stephenson 0 siblings, 1 reply; 7+ messages in thread From: Bart Schaefer @ 2022-06-09 3:24 UTC (permalink / raw) To: Zsh hackers list On Tue, Jun 7, 2022 at 7:57 AM Bart Schaefer <schaefer@brasslantern.com> wrote: > > I know most of what's going on there, but "functions -c" is creatin > an alternate name, and there is also the failure case of settrap() > returning nonzero to handle. The following works for the case of settrap() succeeding, but I'm not sure how to force settrap() to fail. diff --git a/Src/builtin.c b/Src/builtin.c index 1cef7cce8..7f00d9d29 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -3274,6 +3274,7 @@ bin_functions(char *name, char **argv, Options ops, int func) if (OPT_ISSET(ops,'c')) { Shfunc newsh; + char *s = argv[1]; if (!*argv || !argv[1] || argv[2]) { zwarnnam(name, "-c: requires two arguments"); return 1; @@ -3305,7 +3306,21 @@ bin_functions(char *name, char **argv, Options ops, int func) newsh->redir->nref++; if (shf->sticky) newsh->sticky = sticky_emulation_dup(sticky, 0); - shfunctab->addnode(shfunctab, ztrdup(argv[1]), &newsh->node); + /* is newsh a signal trap? (adapted from exec.c) */ + if (!strncmp(s, "TRAP", 4)) { + int signum = getsignum(s + 4); + if (signum != -1) { + if (settrap(signum, NULL, ZSIG_FUNC)) { + freeeprog(newsh->funcdef); + dircache_set(&newsh->filename, NULL); + zfree(newsh, sizeof(*newsh)); + return 1; + } + /* Remove any old node explicitly */ + removetrapnode(signum); + } + } + shfunctab->addnode(shfunctab, ztrdup(s), &newsh->node); return 0; } ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "functions -c" and TRAPxxx 2022-06-09 3:24 ` Bart Schaefer @ 2022-06-09 8:55 ` Peter Stephenson 2022-06-09 15:19 ` Bart Schaefer 0 siblings, 1 reply; 7+ messages in thread From: Peter Stephenson @ 2022-06-09 8:55 UTC (permalink / raw) To: Zsh hackers list > On 09 June 2022 at 04:24 Bart Schaefer <schaefer@brasslantern.com> wrote: > On Tue, Jun 7, 2022 at 7:57 AM Bart Schaefer <schaefer@brasslantern.com> wrote: > > > > I know most of what's going on there, but "functions -c" is creatin > > an alternate name, and there is also the failure case of settrap() > > returning nonzero to handle. > > The following works for the case of settrap() succeeding, but I'm not > sure how to force settrap() to fail. Looks entirely plausible; given TRAP{INT,QUIT} already work this ought to work too. Looks like the only way for settrap to fail is using a signal number that's not handled interactively. pws ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "functions -c" and TRAPxxx 2022-06-09 8:55 ` Peter Stephenson @ 2022-06-09 15:19 ` Bart Schaefer 2022-06-09 20:51 ` Bart Schaefer 0 siblings, 1 reply; 7+ messages in thread From: Bart Schaefer @ 2022-06-09 15:19 UTC (permalink / raw) To: Zsh hackers list On Thu, Jun 9, 2022 at 1:56 AM Peter Stephenson <p.w.stephenson@ntlworld.com> wrote: > > Looks like the only way for settrap to fail is using a signal number > that's not handled interactively. % trapper() { print $0 } % for t in $(kill -l) for> do functions -c trapper TRAP$t || echo cannot $t for> done % So as far as I can tell it's not possible for settrap() to fail (on ubuntu, anyway) if getsignum() succeeds. Some of those traps are ignored (STOP, KILL) but you can set them anyway. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: "functions -c" and TRAPxxx 2022-06-09 15:19 ` Bart Schaefer @ 2022-06-09 20:51 ` Bart Schaefer 0 siblings, 0 replies; 7+ messages in thread From: Bart Schaefer @ 2022-06-09 20:51 UTC (permalink / raw) To: Zsh hackers list On Thu, Jun 9, 2022 at 8:19 AM Bart Schaefer <schaefer@brasslantern.com> wrote: > > So as far as I can tell it's not possible for settrap() to fail (on > ubuntu, anyway) if getsignum() succeeds. Hmm, I have a different result now, so I must have ... run the wrong build, before? % for x in $(kill -l); do for> { functions -c trapper TRAP$x } always { TRY_BLOCK_ERROR=0 } for> done zsh: can't trap SIGTSTP in interactive shells zsh: can't trap SIGTTIN in interactive shells zsh: can't trap SIGTTOU in interactive shells Interesting that failing to set a trap is a hard error condition. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-06-09 20:52 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-06-07 1:59 "functions -c" and TRAPxxx Bart Schaefer 2022-06-07 9:57 ` Peter Stephenson 2022-06-07 14:57 ` Bart Schaefer 2022-06-09 3:24 ` Bart Schaefer 2022-06-09 8:55 ` Peter Stephenson 2022-06-09 15:19 ` Bart Schaefer 2022-06-09 20:51 ` Bart Schaefer
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/zsh/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).