diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/builtin.c | 24 |
2 files changed, 26 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index d4a00f67a..77f5df6c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-04-20 Peter Stephenson <pws@csr.com> + + * 19801: Src/builtin.c: Autoloading of TRAP functions was never + implemented. + 2004-04-20 Oliver Kiddle <opk@zsh.org> * 19767, 19785: Src/builtin.c, Src/exec.c, Src/hashtable.c, diff --git a/Src/builtin.c b/Src/builtin.c index 6f443851a..010c8c1f3 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -2508,14 +2508,32 @@ bin_functions(char *name, char **argv, Options ops, int func) /* no flags, so just print */ shfunctab->printnode((HashNode) shf, pflags); } else if (on & PM_UNDEFINED) { + int signum, ok = 1; + /* Add a new undefined (autoloaded) function to the * * hash table with the corresponding flags set. */ shf = (Shfunc) zshcalloc(sizeof *shf); shf->flags = on; shf->funcdef = mkautofn(shf); - shfunctab->addnode(shfunctab, ztrdup(*argv), shf); - if (OPT_ISSET(ops,'X') && eval_autoload(shf, shf->nam, ops, func)) - returnval = 1; + + if (!strncmp(*argv, "TRAP", 4) && + (signum = getsignum(*argv + 4)) != -1) { + if (settrap(signum, shf->funcdef)) { + freeeprog(shf->funcdef); + zfree(shf, sizeof(*shf)); + returnval = 1; + ok = 0; + } + else + sigtrapped[signum] |= ZSIG_FUNC; + } + + if (ok) { + shfunctab->addnode(shfunctab, ztrdup(*argv), shf); + if (OPT_ISSET(ops,'X') && + eval_autoload(shf, shf->nam, ops, func)) + returnval = 1; + } } else returnval = 1; } |