diff options
Diffstat (limited to '')
-rw-r--r-- | src/trap.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/trap.c b/src/trap.c index 3f93c46..ba32da6 100644 --- a/src/trap.c +++ b/src/trap.c @@ -69,7 +69,9 @@ /* trap handler commands */ -char *trap[NSIG]; +static char *trap[NSIG]; +/* number of non-null traps */ +int trapcnt; /* current value of signal */ char sigmode[NSIG - 1]; /* indicates specified signal received */ @@ -125,11 +127,17 @@ trapcmd(int argc, char **argv) if (action) { if (action[0] == '-' && action[1] == '\0') action = NULL; - else + else { + if (*action) + trapcnt++; action = savestr(action); + } } - if (trap[signo]) + if (trap[signo]) { + if (*trap[signo]) + trapcnt--; ckfree(trap[signo]); + } trap[signo] = action; if (signo != 0) setsignal(signo); @@ -150,16 +158,17 @@ clear_traps(void) { char **tp; + INTOFF; for (tp = trap ; tp < &trap[NSIG] ; tp++) { if (*tp && **tp) { /* trap not NULL or SIG_IGN */ - INTOFF; ckfree(*tp); *tp = NULL; if (tp != &trap[0]) setsignal(tp - trap); - INTON; } } + trapcnt = 0; + INTON; } |