diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/zle_main.c | 2 | ||||
-rw-r--r-- | Src/builtin.c | 13 | ||||
-rw-r--r-- | Src/glob.c | 2 | ||||
-rw-r--r-- | Src/init.c | 30 | ||||
-rw-r--r-- | Src/utils.c | 51 |
5 files changed, 60 insertions, 38 deletions
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index d8cbcb645..21ee8a4ed 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -716,7 +716,7 @@ raw_getbyte(int do_keytmout, char *cptr) # endif - callhookfunc(lwatch_funcs[i], funcargs); + callhookfunc(lwatch_funcs[i], funcargs, 0); if (errflag) { /* No sensible way of handling errors here */ errflag = 0; diff --git a/Src/builtin.c b/Src/builtin.c index e4ca9b3d9..adb0f6ee2 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -1087,7 +1087,6 @@ cd_try_chdir(char *pfix, char *dest, int hard) static void cd_new_pwd(int func, LinkNode dir) { - Eprog prog; char *new_pwd, *s; int dirstacksize; @@ -1134,15 +1133,9 @@ cd_new_pwd(int func, LinkNode dir) } /* execute the chpwd function */ - if ((prog = getshfunc("chpwd")) != &dummy_eprog) { - int osc = sfcontext; - - fflush(stdout); - fflush(stderr); - sfcontext = SFC_HOOK; - doshfunc("chpwd", prog, NULL, 0, 1); - sfcontext = osc; - } + fflush(stdout); + fflush(stderr); + callhookfunc("chpwd", NULL, 1); dirstacksize = getiparam("DIRSTACKSIZE"); /* handle directory stack sizes out of range */ diff --git a/Src/glob.c b/Src/glob.c index aa0ce1ac4..394e91d01 100644 --- a/Src/glob.c +++ b/Src/glob.c @@ -1246,7 +1246,7 @@ zglob(LinkList list, LinkNode np, int nountok) int arglen; /* Find matching delimiters */ - tt = get_strarg(s, &arglen, NULL); + tt = get_strarg(s, &arglen); if (!*tt) { zerr("missing end of name"); data = 0; diff --git a/Src/init.c b/Src/init.c index 7645af6b2..fad36bf0f 100644 --- a/Src/init.c +++ b/Src/init.c @@ -137,29 +137,33 @@ loop(int toplevel, int justonce) } if (hend(prog)) { int toksav = tok; - Eprog preprog; - if (toplevel && (preprog = getshfunc("preexec")) != &dummy_eprog) { + if (toplevel && + (getshfunc("preexec") != &dummy_eprog || + paramtab->getnode(paramtab, "preexec_functions"))) { LinkList args; - int osc = sfcontext; char *cmdstr; - args = znewlinklist(); - zaddlinknode(args, "preexec"); + /* + * As we're about to freeheap() or popheap() + * anyway, there's no gain in using permanent + * storage here. + */ + args = newlinklist(); + addlinknode(args, "preexec"); /* If curline got dumped from the history, we don't know * what the user typed. */ if (hist_ring && curline.histnum == curhist) - zaddlinknode(args, hist_ring->node.nam); + addlinknode(args, hist_ring->node.nam); else - zaddlinknode(args, ""); - zaddlinknode(args, getjobtext(prog, NULL)); - zaddlinknode(args, cmdstr = getpermtext(prog, NULL)); + addlinknode(args, ""); + addlinknode(args, dupstring(getjobtext(prog, NULL))); + addlinknode(args, cmdstr = getpermtext(prog, NULL)); + + callhookfunc("preexec", args, 1); - sfcontext = SFC_HOOK; - doshfunc("preexec", preprog, args, 0, 1); - sfcontext = osc; + /* The only permanent storage is from getpermtext() */ zsfree(cmdstr); - freelinklist(args, (FreeFunc) NULL); errflag = 0; } if (stopmsg) /* unset 'you have stopped jobs' flag */ diff --git a/Src/utils.c b/Src/utils.c index ed4abe3f1..5b6998950 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -1079,28 +1079,53 @@ time_t lastmailcheck; /**/ time_t lastwatch; +/* + * Call a function given by "name" with optional arguments + * "lnklist". If "arrayp" is not zero, we also look through + * the array "name"_functions and execute functions found there. + */ + /**/ mod_export int -callhookfunc(char *name, LinkList lnklst) +callhookfunc(char *name, LinkList lnklst, int arrayp) { Eprog prog; - - if ((prog = getshfunc(name)) != &dummy_eprog) { /* * Save stopmsg, since user doesn't get a chance to respond * to a list of jobs generated in a hook. */ - int osc = sfcontext, osm = stopmsg; + int osc = sfcontext, osm = stopmsg, stat = 1; + + sfcontext = SFC_HOOK; - sfcontext = SFC_HOOK; + if ((prog = getshfunc(name)) != &dummy_eprog) { doshfunc(name, prog, lnklst, 0, 1); - sfcontext = osc; - stopmsg = osm; + stat = 0; + } - return 0; + if (arrayp) { + char **arrptr; + int namlen = strlen(name); +#define HOOK_SUFFIX "_functions" +#define HOOK_SUFFIX_LEN 11 /* including NUL byte */ + VARARR(char, arrnam, namlen + HOOK_SUFFIX_LEN); + memcpy(arrnam, name, namlen); + memcpy(arrnam + namlen, HOOK_SUFFIX, HOOK_SUFFIX_LEN); + + if ((arrptr = getaparam(arrnam))) { + for (; *arrptr; arrptr++) { + if ((prog = getshfunc(*arrptr)) != &dummy_eprog) { + doshfunc(arrnam, prog, lnklst, 0, 1); + stat = 0; + } + } + } } - return 1; + sfcontext = osc; + stopmsg = osm; + + return stat; } /* do pre-prompt stuff */ @@ -1136,15 +1161,15 @@ preprompt(void) /* If a shell function named "precmd" exists, * * then execute it. */ - callhookfunc("precmd", NULL); + callhookfunc("precmd", NULL, 1); if (errflag) return; - /* If 1) the parameter PERIOD exists, 2) the shell function * + /* If 1) the parameter PERIOD exists, 2) a hook function for * * "periodic" exists, 3) it's been greater than PERIOD since we * - * executed "periodic", then execute it now. */ + * executed any such hook, then execute it now. */ if (period && (time(NULL) > lastperiodic + period) && - !callhookfunc("periodic", NULL)) + !callhookfunc("periodic", NULL, 1)) lastperiodic = time(NULL); if (errflag) return; |