From 757168e2c8af374436108266cc3cfd32a946a590 Mon Sep 17 00:00:00 2001 From: Sven Wischnowsky Date: Tue, 16 Jan 2001 13:44:18 +0000 Subject: remove 13108 (trap queues); replace with signal queueing to ensure that user signal handlers are only executed when it is safe to run them (13365) --- Src/Zle/compcore.c | 16 +++++++++++----- Src/Zle/complist.c | 11 ++++++++++- Src/Zle/computil.c | 10 ++++++++++ Src/Zle/zle_main.c | 35 ++++++++++++++++++----------------- Src/Zle/zle_tricky.c | 19 +++++++++++++++---- 5 files changed, 64 insertions(+), 27 deletions(-) (limited to 'Src/Zle') diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index 06e7afbfb..a7ada2564 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -1526,14 +1526,15 @@ get_user_var(char *nam) /* Otherwise it should be a parameter name. */ char **arr = NULL, *val; + queue_signals(); if ((arr = getaparam(nam)) || (arr = gethparam(nam))) - return (incompfunc ? arrdup(arr) : arr); - - if ((val = getsparam(nam))) { + arr = (incompfunc ? arrdup(arr) : arr); + else if ((val = getsparam(nam))) { arr = (char **) zhalloc(2*sizeof(char *)); arr[0] = (incompfunc ? dupstring(val) : val); arr[1] = NULL; } + unqueue_signals(); return arr; } } @@ -1542,14 +1543,19 @@ static char ** get_data_arr(char *name, int keys) { struct value vbuf; + char **ret; Value v; + queue_signals(); if (!(v = fetchvalue(&vbuf, &name, 1, (keys ? SCANPM_WANTKEYS : SCANPM_WANTVALS) | SCANPM_MATCHMANY))) - return NULL; + ret = NULL; + else + ret = getarrvalue(v); + unqueue_signals(); - return getarrvalue(v); + return ret; } /* This is used by compadd to add a couple of matches. The arguments are diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c index 6982dc774..714719d62 100644 --- a/Src/Zle/complist.c +++ b/Src/Zle/complist.c @@ -340,6 +340,7 @@ getcols(Listcols c) int i, l; max_caplen = lr_caplen = 0; + queue_signals(); if (!(s = getsparam("ZLS_COLORS")) && !(s = getsparam("ZLS_COLOURS"))) { for (i = 0; i < NUM_COLS; i++) @@ -356,6 +357,7 @@ getcols(Listcols c) if ((max_caplen = strlen(c->files[COL_MA]->col)) < (l = strlen(c->files[COL_EC]->col))) max_caplen = l; + unqueue_signals(); return; } /* We have one of the parameters, use it. */ @@ -366,6 +368,7 @@ getcols(Listcols c) s++; else s = getcoldef(c, s); + unqueue_signals(); /* Use default values for those that aren't set explicitly. */ for (i = 0; i < NUM_COLS; i++) { @@ -1528,8 +1531,10 @@ complistmatches(Hookdef dummy, Chdata dat) mscroll = 0; mlistp = NULL; + queue_signals(); if (mselect >= 0 || mlbeg >= 0 || - (mlistp = getsparam("LISTPROMPT"))) { + (mlistp = dupstring(getsparam("LISTPROMPT")))) { + unqueue_signals(); if (mlistp && !*mlistp) mlistp = "%SAt %p: Hit TAB for more, or the character to insert%s"; trashzle(); @@ -1545,6 +1550,7 @@ complistmatches(Hookdef dummy, Chdata dat) minfo.asked = (listdat.nlines + nlnct <= lines); } } else { + unqueue_signals(); mlistp = NULL; if (asklist()) { amatches = oamatches; @@ -1641,6 +1647,7 @@ domenuselect(Hookdef dummy, Chdata dat) int nolist = 0; char *s; + queue_signals(); if (fdat || (dummy && (!(s = getsparam("MENUSELECT")) || (dat && dat->num < atoi(s))))) { if (fdat) { @@ -1648,6 +1655,7 @@ domenuselect(Hookdef dummy, Chdata dat) fdat->num = dat->num; fdat->nmesg = dat->nmesg; } + unqueue_signals(); return 0; } if ((s = getsparam("MENUSCROLL"))) { @@ -1659,6 +1667,7 @@ domenuselect(Hookdef dummy, Chdata dat) } if ((mstatus = dupstring(getsparam("MENUPROMPT"))) && !*mstatus) mstatus = "%SScrolling active: current selection at %p%s"; + unqueue_signals(); mhasstat = (mstatus && *mstatus); fdat = dat; selectlocalmap(mskeymap); diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index 3672de687..4afc492dc 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -2606,6 +2606,7 @@ bin_compquote(char *nam, char **args, char *ops, int func) while ((name = *args++)) { name = dupstring(name); + queue_signals(); if ((v = getvalue(&vbuf, &name, 0))) { switch (PM_TYPE(v->pm->flags)) { case PM_SCALAR: @@ -2630,6 +2631,7 @@ bin_compquote(char *nam, char **args, char *ops, int func) } } else zwarnnam(nam, "unknown parameter: %s", args[-1], 0); + unqueue_signals(); } return 0; } @@ -3580,6 +3582,7 @@ bin_compfiles(char *nam, char **args, char *ops, int func) zwarnnam(nam, "too few arguments", NULL, 0); return 1; } + queue_signals(); if (!(tmp = getaparam(args[1]))) { zwarnnam(nam, "unknown parameter: %s", args[1], 0); return 0; @@ -3590,6 +3593,7 @@ bin_compfiles(char *nam, char **args, char *ops, int func) l, getaparam(args[2]), args[3], args[4], args[5], getaparam(args[6]), args + 7)); + unqueue_signals(); return 0; } case 'i': @@ -3608,16 +3612,19 @@ bin_compfiles(char *nam, char **args, char *ops, int func) zwarnnam(nam, "too many arguments", NULL, 0); return 1; } + queue_signals(); tmp = getaparam(args[2]); l = newlinklist(); if (tmp) for (; *tmp; tmp++) addlinknode(l, *tmp); if (!(tmp = getaparam(args[1]))) { + unqueue_signals(); zwarnnam(nam, "unknown parameter: %s", args[1], 0); return 0; } cf_ignore(tmp, l, args[3], args[4]); + unqueue_signals(); set_list_array(args[2], l); return 0; } @@ -3635,12 +3642,15 @@ bin_compfiles(char *nam, char **args, char *ops, int func) zwarnnam(nam, "too many arguments", NULL, 0); return 1; } + queue_signals(); if (!(tmp = getaparam(args[1]))) { + unqueue_signals(); zwarnnam(nam, "unknown parameter: %s", args[1], 0); return 0; } if ((l = cf_remove_other(tmp, args[2], &ret))) set_list_array(args[1], l); + unqueue_signals(); return ret; } } diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index b2a662072..c5923d74d 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -313,17 +313,12 @@ static int breakread(int fd, char *buf, int n) { fd_set f; - int ret; FD_ZERO(&f); FD_SET(fd, &f); - ALLOWTRAPS { - ret = (select(fd + 1, (SELECT_ARG_2_T) & f, NULL, NULL, NULL) == -1 ? - EOF : read(fd, buf, n)); - } DISALLOWTRAPS; - - return ret; + return (select(fd + 1, (SELECT_ARG_2_T) & f, NULL, NULL, NULL) == -1 ? + EOF : read(fd, buf, n)); } # define read breakread @@ -394,7 +389,7 @@ getkey(int keytmout) # else ioctl(SHTTY, TCSETA, &ti.tio); # endif - r = ztrapread(SHTTY, &cc, 1); + r = read(SHTTY, &cc, 1); # ifdef HAVE_TERMIOS_H tcsetattr(SHTTY, TCSANOW, &shttyinfo.tio); # else @@ -405,7 +400,7 @@ getkey(int keytmout) #endif } for (;;) { - r = ztrapread(SHTTY, &cc, 1); + r = read(SHTTY, &cc, 1); if (r == 1) break; if (r == 0) { @@ -664,8 +659,11 @@ execzlefunc(Thingy func, char **args) ret = completecall(args); if (atcurhist) histline = curhist; - } else + } else { + queue_signals(); ret = w->u.fn(args); + unqueue_signals(); + } if (!(wflags & ZLE_NOTCOMMAND)) lastcmd = wflags; } @@ -836,9 +834,11 @@ bin_vared(char *name, char **args, char *ops, int func) } /* handle non-existent parameter */ s = args[0]; + queue_signals(); v = fetchvalue(&vbuf, &s, (!create || type == PM_SCALAR), SCANPM_WANTKEYS|SCANPM_WANTVALS|SCANPM_MATCHMANY); if (!v && !create) { + unqueue_signals(); zwarnnam(name, "no such variable: %s", args[0], 0); return 1; } else if (v) { @@ -885,11 +885,13 @@ bin_vared(char *name, char **args, char *ops, int func) } else { s = ztrdup(getstrvalue(v)); } - pm = v->pm; + unqueue_signals(); } else if (*s) { + unqueue_signals(); zwarnnam(name, "invalid parameter name: %s", args[0], 0); return 1; } else { + unqueue_signals(); s = ztrdup(s); } @@ -935,14 +937,12 @@ bin_vared(char *name, char **args, char *ops, int func) if (t[strlen(t) - 1] == '\n') t[strlen(t) - 1] = '\0'; /* final assignment of parameter value */ - if (create && (!pm || (type && PM_TYPE(pm->flags) != type))) { - if (pm) - unsetparam(args[0]); + if (create) { + unsetparam(args[0]); createparam(args[0], type); - pm = 0; } - if (!pm) - pm = (Param) paramtab->getnode(paramtab, args[0]); + queue_signals(); + pm = (Param) paramtab->getnode(paramtab, args[0]); if (pm && (PM_TYPE(pm->flags) & (PM_ARRAY|PM_HASHED))) { char **a; @@ -957,6 +957,7 @@ bin_vared(char *name, char **args, char *ops, int func) sethparam(args[0], a); } else setsparam(args[0], t); + unqueue_signals(); return 0; } diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index d6250ce23..7476b833b 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -535,24 +535,33 @@ parambeg(char *s) static int docomplete(int lst) { + static int active = 0; + char *s, *ol; int olst = lst, chl = 0, ne = noerrs, ocs, ret = 0, dat[2]; + if (active) { + zwarn("completion cannot be used recursively (yet)", NULL, 0); + return 1; + } + active = 1; if (undoing) setlastline(); if (!module_loaded("zsh/complete")) load_module("zsh/compctl"); - if (runhookdef(BEFORECOMPLETEHOOK, (void *) &lst)) + if (runhookdef(BEFORECOMPLETEHOOK, (void *) &lst)) { + active = 0; return 0; - + } /* Expand history references before starting completion. If anything * * changed, do no more. */ - if (doexpandhist()) + if (doexpandhist()) { + active = 0; return 0; - + } metafy_line(); ocs = cs; @@ -608,6 +617,7 @@ docomplete(int lst) unmetafy_line(); zsfree(s); zsfree(qword); + active = 0; return 1; } ocs = cs; @@ -785,6 +795,7 @@ docomplete(int lst) dat[1] = ret; runhookdef(AFTERCOMPLETEHOOK, (void *) dat); + active = 0; return dat[1]; } -- cgit 1.4.1