summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/builtin.c18
-rw-r--r--Src/jobs.c54
-rw-r--r--Src/zsh.h3
3 files changed, 48 insertions, 27 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 09034c514..69d78c926 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -4978,13 +4978,14 @@ bin_trap(char *name, char **argv, UNUSED(Options ops), UNUSED(int func))
shfunctab->printnode(hn, 0);
DPUTS(!hn, "BUG: I did not find any trap functions!");
} else if (sigtrapped[sig]) {
+ char *name = getsigname(sig);
if (!siglists[sig])
- printf("trap -- '' %s\n", sigs[sig]);
+ printf("trap -- '' %s\n", name);
else {
s = getpermtext(siglists[sig], NULL);
printf("trap -- ");
quotedzputs(s, stdout);
- printf(" %s\n", sigs[sig]);
+ printf(" %s\n", name);
zsfree(s);
}
}
@@ -5017,14 +5018,25 @@ bin_trap(char *name, char **argv, UNUSED(Options ops), UNUSED(int func))
/* set traps */
for (; *argv; argv++) {
Eprog t;
+ int flags;
sig = getsignum(*argv);
if (sig == -1) {
zwarnnam(name, "undefined signal: %s", *argv, 0);
break;
}
+ if (!strcmp(sigs[sig], *argv))
+ flags = 0;
+ else {
+ /*
+ * Record that the signal is used under an assumed name.
+ * If we ever have more than one alias per signal this
+ * will need improving.
+ */
+ flags = ZSIG_ALIAS;
+ }
t = dupeprog(prog, 0);
- if (settrap(sig, t, 0))
+ if (settrap(sig, t, flags))
freeeprog(t);
}
return *argv != NULL;
diff --git a/Src/jobs.c b/Src/jobs.c
index 5c1574acf..f5ade7c2b 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1819,18 +1819,6 @@ bin_fg(char *name, char **argv, Options ops, int func)
return retval;
}
-#if defined(SIGCHLD) && defined(SIGCLD)
-#if SIGCHLD == SIGCLD
-#define ALT_SIGS 1
-#endif
-#endif
-#if defined(SIGPOLL) && defined(SIGIO)
-#if SIGPOLL == SIGIO
-#define ALT_SIGS 1
-#endif
-#endif
-
-#ifdef ALT_SIGS
const struct {
const char *name;
int num;
@@ -1845,9 +1833,15 @@ const struct {
{ "IO", SIGIO },
#endif
#endif
+#if !defined(SIGERR)
+ /*
+ * If SIGERR is not defined by the operating system, use it
+ * as an alias for SIGZERR.
+ */
+ { "ERR", SIGZERR },
+#endif
{ NULL, 0 }
};
-#endif
/* kill: send a signal to a process. The process(es) may be specified *
* by job specifier (see above) or pid. A signal, defaulting to *
@@ -1879,7 +1873,6 @@ bin_kill(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
for (sig = 1; sig <= SIGCOUNT; sig++)
if (!cstrpcmp(sigs + sig, &signame))
break;
-#ifdef ALT_SIGS
if (sig > SIGCOUNT) {
int i;
@@ -1890,7 +1883,6 @@ bin_kill(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
break;
}
}
-#endif
if (sig > SIGCOUNT) {
zwarnnam(nam, "unknown signal: SIG%s",
signame, 0);
@@ -1953,7 +1945,6 @@ bin_kill(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
break;
if (*signame == '0' && !signame[1])
sig = 0;
-#ifdef ALT_SIGS
if (sig > SIGCOUNT) {
int i;
@@ -1964,7 +1955,6 @@ bin_kill(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
break;
}
}
-#endif
if (sig > SIGCOUNT) {
zwarnnam(nam, "unknown signal: SIG%s", signame, 0);
zwarnnam(nam, "type kill -l for a List of signals", NULL, 0);
@@ -2042,18 +2032,40 @@ getsignum(char *s)
if (!strcmp(s, sigs[i]))
return i;
-#ifdef ALT_SIGS
for (i = 0; alt_sigs[i].name; i++)
{
if (!strcmp(s, alt_sigs[i].name))
return alt_sigs[i].num;
}
-#endif
/* no matching signal */
return -1;
}
+/* Get the name for a signal. */
+
+/**/
+mod_export const char *
+getsigname(int sig)
+{
+ if (sigtrapped[sig] & ZSIG_ALIAS)
+ {
+ int i;
+ for (i = 0; alt_sigs[i].name; i++)
+ if (sig == alt_sigs[i].num)
+ return alt_sigs[i].name;
+ }
+ else
+ return sigs[sig];
+
+ /* shouldn't reach here */
+#ifdef DEBUG
+ dputs("Bad alias flag for signal");
+#endif
+ return "";
+}
+
+
/* Get the function node for a trap, taking care about alternative names */
/**/
HashNode
@@ -2062,9 +2074,7 @@ gettrapnode(int sig, int ignoredisable)
char fname[20];
HashNode hn;
HashNode (*getptr)(HashTable ht, char *name);
-#ifdef ALT_SIGS
int i;
-#endif
if (ignoredisable)
getptr = shfunctab->getnode2;
else
@@ -2074,7 +2084,6 @@ gettrapnode(int sig, int ignoredisable)
if ((hn = getptr(shfunctab, fname)))
return hn;
-#ifdef ALT_SIGS
for (i = 0; alt_sigs[i].name; i++) {
if (alt_sigs[i].num == sig) {
sprintf(fname, "TRAP%s", alt_sigs[i].name);
@@ -2082,7 +2091,6 @@ gettrapnode(int sig, int ignoredisable)
return hn;
}
}
-#endif
return NULL;
}
diff --git a/Src/zsh.h b/Src/zsh.h
index 6e1916690..3dacf637f 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1852,7 +1852,8 @@ struct heap {
/* Mask to get the above flags */
#define ZSIG_MASK (ZSIG_TRAPPED|ZSIG_IGNORED|ZSIG_FUNC)
/* No. of bits to shift local level when storing in sigtrapped */
-#define ZSIG_SHIFT 3
+#define ZSIG_ALIAS (1<<3) /* Trap is stored under an alias */
+#define ZSIG_SHIFT 4
/**********************************/
/* Flags to third argument of zle */