summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/Builtins/sched.c2
-rw-r--r--Src/Modules/zpty.c2
-rw-r--r--Src/Modules/zutil.c13
-rw-r--r--Src/builtin.c4
-rw-r--r--Src/exec.c47
-rw-r--r--Src/glob.c5
-rw-r--r--Src/init.c6
-rw-r--r--Src/params.c21
-rw-r--r--Src/signals.c2
9 files changed, 72 insertions, 30 deletions
diff --git a/Src/Builtins/sched.c b/Src/Builtins/sched.c
index 99167e110..1ec3269bd 100644
--- a/Src/Builtins/sched.c
+++ b/Src/Builtins/sched.c
@@ -119,7 +119,7 @@ checksched(void)
if ((sch->flags & SCHEDFLAG_TRASH_ZLE) && zleactive)
zleentry(ZLE_CMD_TRASH);
- execstring(sch->cmd, 0, 0);
+ execstring(sch->cmd, 0, 0, "sched");
zsfree(sch->cmd);
zfree(sch, sizeof(struct schedcmd));
diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c
index f25d442b2..2a81e68cb 100644
--- a/Src/Modules/zpty.c
+++ b/Src/Modules/zpty.c
@@ -396,7 +396,7 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock)
setsparam("TTY", ztrdup(ttystrname));
opts[INTERACTIVE] = 0;
- execode(prog, 1, 0);
+ execode(prog, 1, 0, "zpty");
stopmsg = 2;
zexit(lastval, 0);
}
diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c
index 698b7e3bd..76ca92f79 100644
--- a/Src/Modules/zutil.c
+++ b/Src/Modules/zutil.c
@@ -343,7 +343,7 @@ evalstyle(Stypat p)
char **ret, *str;
unsetparam("reply");
- execode(p->eval, 1, 0);
+ execode(p->eval, 1, 0, "style");
if (errflag) {
errflag = ef;
return NULL;
@@ -1253,7 +1253,7 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
char *action = getdata(ln);
if (action)
- execstring(action, 1, 0);
+ execstring(action, 1, 0, "zregexparse-action");
}
return 0;
}
@@ -1278,7 +1278,8 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
return 3;
}
if (next->pattern && pattry(next->patprog, subj) &&
- (!next->guard || (execstring(next->guard, 1, 0), !lastval))) {
+ (!next->guard || (execstring(next->guard, 1, 0,
+ "zregesparse-guard"), !lastval))) {
LinkNode aln;
char **mend;
int len;
@@ -1299,7 +1300,7 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
char *action = getdata(aln);
if (action)
- execstring(action, 1, 0);
+ execstring(action, 1, 0, "zregexparse-action");
}
restorematch(&match2);
@@ -1328,7 +1329,7 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
char *action = getdata(ln);
if (action)
- execstring(action, 1, 0);
+ execstring(action, 1, 0, "zregexparse-action");
}
return 0;
}
@@ -1339,7 +1340,7 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
for (ln = firstnode(nexts); ln; ln = nextnode(ln)) {
br = getdata(ln);
if (br->state->action)
- execstring(br->state->action, 1, 0);
+ execstring(br->state->action, 1, 0, "zregexparse-action");
}
}
return empty(nexts) ? 2 : 1;
diff --git a/Src/builtin.c b/Src/builtin.c
index d293a7a78..3f26f0304 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -1755,7 +1755,7 @@ fcedit(char *ename, char *fn)
return 1;
s = tricat(ename, " ", fn);
- execstring(s, 1, 0);
+ execstring(s, 1, 0, "fc");
zsfree(s);
return !lastval;
@@ -4883,7 +4883,7 @@ eval(char **argv)
/* No code to execute */
lastval = 0;
} else {
- execode(prog, 1, 0);
+ execode(prog, 1, 0, "eval");
if (errflag && !lastval)
lastval = errflag;
diff --git a/Src/exec.c b/Src/exec.c
index 19afc4ca4..8fd52420b 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -564,7 +564,7 @@ execute(LinkList args, int flags, int defpath)
STTYval = 0; /* this prevents infinite recursion */
zsfree(s);
- execstring(t, 1, 0);
+ execstring(t, 1, 0, "stty");
zsfree(t);
} else if (s) {
STTYval = 0;
@@ -970,21 +970,40 @@ entersubsh(int flags)
/**/
mod_export void
-execstring(char *s, int dont_change_job, int exiting)
+execstring(char *s, int dont_change_job, int exiting, char *context)
{
Eprog prog;
pushheap();
if ((prog = parse_string(s, 0)))
- execode(prog, dont_change_job, exiting);
+ execode(prog, dont_change_job, exiting, context);
popheap();
}
/**/
mod_export void
-execode(Eprog p, int dont_change_job, int exiting)
+execode(Eprog p, int dont_change_job, int exiting, char *context)
{
struct estate s;
+ static int zsh_eval_context_len;
+ int alen;
+
+ if (!zsh_eval_context_len) {
+ zsh_eval_context_len = 16;
+ alen = 0;
+ zsh_eval_context = (char **)zalloc(zsh_eval_context_len *
+ sizeof(*zsh_eval_context));
+ } else {
+ alen = arrlen(zsh_eval_context);
+ if (zsh_eval_context_len == alen + 1) {
+ zsh_eval_context_len *= 2;
+ zsh_eval_context = zrealloc(zsh_eval_context,
+ zsh_eval_context_len *
+ sizeof(*zsh_eval_context));
+ }
+ }
+ zsh_eval_context[alen] = context;
+ zsh_eval_context[alen+1] = NULL;
s.prog = p;
s.pc = p->prog;
@@ -994,6 +1013,12 @@ execode(Eprog p, int dont_change_job, int exiting)
execlist(&s, dont_change_job, exiting);
freeeprog(p); /* Free if now unused */
+
+ /*
+ * zsh_eval_context may have been altered by a recursive
+ * call, but that's OK since we're using the global value.
+ */
+ zsh_eval_context[alen] = NULL;
}
/* Execute a simplified command. This is used to execute things that
@@ -3571,7 +3596,7 @@ getoutput(char *cmd, int qt)
redup(pipes[1], 1);
entersubsh(ESUB_PGRP|ESUB_NOMONITOR);
cmdpush(CS_CMDSUBST);
- execode(prog, 0, 1);
+ execode(prog, 0, 1, "cmdsubst");
cmdpop();
close(1);
_exit(lastval);
@@ -3725,7 +3750,7 @@ getoutputfile(char *cmd, char **eptr)
redup(fd, 1);
entersubsh(ESUB_PGRP|ESUB_NOMONITOR);
cmdpush(CS_CMDSUBST);
- execode(prog, 0, 1);
+ execode(prog, 0, 1, "equalsubst");
cmdpop();
close(1);
_exit(lastval);
@@ -3827,7 +3852,7 @@ getproc(char *cmd, char **eptr)
#endif /* PATH_DEV_FD */
cmdpush(CS_CMDSUBST);
- execode(prog, 0, 1);
+ execode(prog, 0, 1, out ? "outsubst" : "insubst");
cmdpop();
zclose(out);
_exit(lastval);
@@ -3875,7 +3900,7 @@ getpipe(char *cmd, int nullexec)
redup(pipes[out], out);
closem(FDT_UNUSED); /* this closes pipes[!out] as well */
cmdpush(CS_CMDSUBST);
- execode(prog, 0, 1);
+ execode(prog, 0, 1, out ? "outsubst" : "insubst");
cmdpop();
_exit(lastval);
return 0;
@@ -4196,7 +4221,7 @@ execautofn(Estate state, UNUSED(int do_exec))
oldscriptname = scriptname;
oldscriptfilename = scriptfilename;
scriptname = scriptfilename = dupstring(shf->node.nam);
- execode(shf->funcdef, 1, 0);
+ execode(shf->funcdef, 1, 0, "loadautofunc");
scriptname = oldscriptname;
scriptfilename = oldscriptfilename;
@@ -4250,7 +4275,7 @@ loadautofn(Shfunc shf, int fksh, int autol)
} else {
VARARR(char, n, strlen(shf->node.nam) + 1);
strcpy(n, shf->node.nam);
- execode(prog, 1, 0);
+ execode(prog, 1, 0, "evalautofunc");
shf = (Shfunc) shfunctab->getnode(shfunctab, n);
if (!shf || (shf->node.flags & PM_UNDEFINED)) {
/* We're not actually in the function; decrement locallevel */
@@ -4538,7 +4563,7 @@ runshfunc(Eprog prog, FuncWrap wrap, char *name)
wrap = wrap->next;
}
startparamscope();
- execode(prog, 1, 0);
+ execode(prog, 1, 0, "shfunc");
if (ou) {
setunderscore(ou);
zfree(ou, ouu);
diff --git a/Src/glob.c b/Src/glob.c
index 036f88ccc..c552e6cf1 100644
--- a/Src/glob.c
+++ b/Src/glob.c
@@ -1806,7 +1806,7 @@ zglob(LinkList list, LinkNode np, int nountok)
/* Parsed OK, execute for each name */
for (tmpptr = matchbuf; tmpptr < matchptr; tmpptr++) {
setsparam("REPLY", ztrdup(tmpptr->name));
- execode(prog, 1, 0);
+ execode(prog, 1, 0, "globsort");
if (!errflag)
tmpptr->sortstrs[iexec] =
dupstring(getsparam("REPLY"));
@@ -3497,7 +3497,7 @@ qualsheval(char *name, UNUSED(struct stat *buf), UNUSED(off_t days), char *str)
unsetparam("reply");
setsparam("REPLY", ztrdup(name));
- execode(prog, 1, 0);
+ execode(prog, 1, 0, "globqual");
ret = lastval;
errflag = ef;
@@ -3516,6 +3516,7 @@ qualsheval(char *name, UNUSED(struct stat *buf), UNUSED(off_t days), char *str)
inserts = tmparr;
}
}
+
return !ret;
}
return 0;
diff --git a/Src/init.c b/Src/init.c
index 56c8c1822..dea9aff40 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -182,7 +182,7 @@ loop(int toplevel, int justonce)
}
if (stopmsg) /* unset 'you have stopped jobs' flag */
stopmsg--;
- execode(prog, 0, 0);
+ execode(prog, 0, 0, toplevel ? "toplevel" : "file");
tok = toksav;
if (toplevel)
noexitct = 0;
@@ -1125,7 +1125,7 @@ init_misc(void)
fclose(bshin);
SHIN = movefd(open("/dev/null", O_RDONLY | O_NOCTTY));
bshin = fdopen(SHIN, "r");
- execstring(cmd, 0, 1);
+ execstring(cmd, 0, 1, "cmdarg");
stopmsg = 1;
zexit(lastval, 0);
}
@@ -1213,7 +1213,7 @@ source(char *s)
if (prog) {
pushheap();
errflag = 0;
- execode(prog, 1, 0);
+ execode(prog, 1, 0, "filecode");
popheap();
if (errflag)
ret = SOURCE_ERROR;
diff --git a/Src/params.c b/Src/params.c
index b19881ee7..576de2f52 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -57,7 +57,8 @@ char **pparams, /* $argv */
**mailpath, /* $mailpath */
**manpath, /* $manpath */
**psvar, /* $psvar */
- **watch; /* $watch */
+ **watch, /* $watch */
+ **zsh_eval_context; /* $zsh_eval_context */
/**/
mod_export
char **path, /* $path */
@@ -341,6 +342,7 @@ IPDEF8("MAILPATH", &mailpath, "mailpath", 0),
IPDEF8("WATCH", &watch, "watch", 0),
IPDEF8("PATH", &path, "path", PM_RESTRICTED),
IPDEF8("PSVAR", &psvar, "psvar", 0),
+IPDEF8("ZSH_EVAL_CONTEXT", &zsh_eval_context, "zsh_eval_context", PM_READONLY),
/* MODULE_PATH is not imported for security reasons */
IPDEF8("MODULE_PATH", &module_path, "module_path", PM_DONTIMPORT|PM_RESTRICTED),
@@ -349,12 +351,21 @@ IPDEF8("MODULE_PATH", &module_path, "module_path", PM_DONTIMPORT|PM_RESTRICTED),
#define IPDEF9(A,B,C) IPDEF9F(A,B,C,0)
IPDEF9F("*", &pparams, NULL, PM_ARRAY|PM_SPECIAL|PM_DONTIMPORT|PM_READONLY),
IPDEF9F("@", &pparams, NULL, PM_ARRAY|PM_SPECIAL|PM_DONTIMPORT|PM_READONLY),
+
+/*
+ * This empty row indicates the end of parameters available in
+ * all emulations.
+ */
{{NULL,NULL,0},BR(NULL),NULL_GSU,0,0,NULL,NULL,NULL,0},
#define IPDEF10(A,B) {{NULL,A,PM_ARRAY|PM_SPECIAL},BR(NULL),GSU(B),10,0,NULL,NULL,NULL,0}
-/* The following parameters are not available in sh/ksh compatibility *
- * mode. All of these have sh compatible equivalents. */
+/*
+ * The following parameters are not available in sh/ksh compatibility *
+ * mode.
+ */
+
+/* All of these have sh compatible equivalents. */
IPDEF1("ARGC", argc_gsu, PM_READONLY),
IPDEF2("HISTCHARS", histchars_gsu, PM_DONTIMPORT),
IPDEF4("status", &lastval),
@@ -373,9 +384,13 @@ IPDEF9("manpath", &manpath, "MANPATH"),
IPDEF9("psvar", &psvar, "PSVAR"),
IPDEF9("watch", &watch, "WATCH"),
+IPDEF9F("zsh_eval_context", &zsh_eval_context, "ZSH_EVAL_CONTEXT", PM_READONLY),
+
IPDEF9F("module_path", &module_path, "MODULE_PATH", PM_RESTRICTED),
IPDEF9F("path", &path, "PATH", PM_RESTRICTED),
+/* These are known to zsh alone. */
+
IPDEF10("pipestatus", pipestatus_gsu),
{{NULL,NULL,0},BR(NULL),NULL_GSU,0,0,NULL,NULL,NULL,0},
diff --git a/Src/signals.c b/Src/signals.c
index f67a3e8ca..74aeadde7 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -1198,7 +1198,7 @@ dotrapargs(int sig, int *sigtr, void *sigfn)
trap_state = TRAP_STATE_PRIMED;
trapisfunc = isfunc = 0;
- execode((Eprog)sigfn, 1, 0);
+ execode((Eprog)sigfn, 1, 0, "trap");
}
runhookdef(AFTERTRAPHOOK, NULL);