about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2022-06-09 13:30:55 -0700
committerBart Schaefer <schaefer@zsh.org>2022-06-09 13:30:55 -0700
commitd24ab95469fd5514e308fcb4926a218abe492082 (patch)
tree3f8ade9362748bf2b72157e5f7421274f2d24250
parentc36068357b32b90cf034991bad7e9e1386c396c7 (diff)
downloadzsh-d24ab95469fd5514e308fcb4926a218abe492082.tar.gz
zsh-d24ab95469fd5514e308fcb4926a218abe492082.tar.xz
zsh-d24ab95469fd5514e308fcb4926a218abe492082.zip
50351: "functions -c" can set signal traps
-rw-r--r--ChangeLog4
-rw-r--r--Src/builtin.c17
2 files changed, 20 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2dce207dc..742e7d716 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2022-06-09  Bart Schaefer  <schaefer@zsh.org>
+
+	* 50351: Src/builtin.c: "functions -c" can set signal traps
+
 2022-06-09  Jun-ichi Takimoto  <takimoto-j@kba.biglobe.ne.jp>
 
 	* 50342: Src/jobs.c, Test/A05execution.ztst: fix test added by
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;
     }