Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: "functions -c" and TRAPxxx
- X-seq: zsh-workers 50351
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: Re: "functions -c" and TRAPxxx
- Date: Wed, 8 Jun 2022 20:24:15 -0700
- Archived-at: <https://zsh.org/workers/50351>
- In-reply-to: <CAH+w=7asDd+fxxcqg9c=DcKfo1gKSnuyL3PskX7Fdf192Hfwdg@mail.gmail.com>
- List-id: <zsh-workers.zsh.org>
- References: <CAH+w=7Yp+vr_zbAd3YELD_AN_JTi7R_yDFTM7vt+X6AR00=z5A@mail.gmail.com> <1148576327.671240.1654595869665@mail2.virginmedia.com> <CAH+w=7asDd+fxxcqg9c=DcKfo1gKSnuyL3PskX7Fdf192Hfwdg@mail.gmail.com>
On Tue, Jun 7, 2022 at 7:57 AM Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> 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;
}
Messages sorted by:
Reverse Date,
Date,
Thread,
Author