summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshell/common/bltins/trap.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libshell/common/bltins/trap.c')
-rw-r--r--usr/src/lib/libshell/common/bltins/trap.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/usr/src/lib/libshell/common/bltins/trap.c b/usr/src/lib/libshell/common/bltins/trap.c
index a298a35742..494d5d8431 100644
--- a/usr/src/lib/libshell/common/bltins/trap.c
+++ b/usr/src/lib/libshell/common/bltins/trap.c
@@ -1,7 +1,7 @@
/***********************************************************************
* *
* This software is part of the ast package *
-* Copyright (c) 1982-2008 AT&T Intellectual Property *
+* Copyright (c) 1982-2009 AT&T Intellectual Property *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Intellectual Property *
@@ -30,7 +30,6 @@
*/
#include "defs.h"
-#include <ctype.h>
#include "jobs.h"
#include "builtins.h"
@@ -150,10 +149,11 @@ int b_trap(int argc,char *argv[],void *extra)
{
if(sig >= shp->st.trapmax)
shp->st.trapmax = sig+1;
- if(arg=shp->st.trapcom[sig])
- free(arg);
- shp->st.trapcom[sig] = strdup(action);
+ arg = shp->st.trapcom[sig];
sh_sigtrap(sig);
+ shp->st.trapcom[sig] = (shp->sigflag[sig]&SH_SIGOFF) ? Empty : strdup(action);
+ if(arg && arg != Empty)
+ free(arg);
}
}
}
@@ -260,6 +260,12 @@ static int sig_number(const char *string)
{
sig = 1;
o += 3;
+ if(isdigit(*stakptr(o)))
+ {
+ n = strtol(stakptr(o),&last,10);
+ if(!*last)
+ return(n);
+ }
}
tp = sh_locate(stakptr(o),(const Shtable_t*)shtab_signals,sizeof(*shtab_signals));
n = tp->sh_number;
@@ -279,7 +285,7 @@ static int sig_number(const char *string)
if(n < SH_TRAP)
n--;
}
- if(n<0 && (name=stakptr(o)) && *name++=='R' && *name++=='T')
+ if(n<0 && sh.sigruntime[1] && (name=stakptr(o)) && *name++=='R' && *name++=='T')
{
if(name[0]=='M' && name[1]=='I' && name[2]=='N' && name[3]=='+')
{
@@ -348,7 +354,7 @@ static char* sig_name(int sig, char* buf, int pfx)
static void sig_list(register Shell_t *shp,register int flag)
{
register const struct shtable2 *tp;
- register int sig = shp->sigmax+1;
+ register int sig;
register char *sname;
char name[10];
const char *names[SH_TRAP];
@@ -357,16 +363,16 @@ static void sig_list(register Shell_t *shp,register int flag)
if(flag<=0)
{
/* not all signals may be defined, so initialize */
- while(--sig >= 0)
+ for(sig=shp->sigmax; sig>=0; sig--)
names[sig] = 0;
for(sig=SH_DEBUGTRAP; sig>=0; sig--)
traps[sig] = 0;
}
- while(*tp->sh_name)
+ for(; *tp->sh_name; tp++)
{
sig = tp->sh_number&((1<<SH_SIGBITS)-1);
- if ((tp->sh_number>>SH_SIGBITS) & SH_SIGRUNTIME)
- sig = sh.sigruntime[sig-1]+1;
+ if (((tp->sh_number>>SH_SIGBITS) & SH_SIGRUNTIME) && (sig = sh.sigruntime[sig-1]+1) == 1)
+ continue;
if(sig==flag)
{
sfprintf(sfstdout,"%s\n",tp->sh_name);
@@ -374,9 +380,8 @@ static void sig_list(register Shell_t *shp,register int flag)
}
else if(sig&SH_TRAP)
traps[sig&~SH_TRAP] = (char*)tp->sh_name;
- else if(sig < sizeof(names)/sizeof(char*))
+ else if(sig-- && sig < elementsof(names))
names[sig] = (char*)tp->sh_name;
- tp++;
}
if(flag > 0)
sfputr(sfstdout, sig_name(flag-1,name,0), '\n');
@@ -391,7 +396,7 @@ static void sig_list(register Shell_t *shp,register int flag)
{
if(!(trap=trapcom[sig]))
continue;
- if(!(sname=(char*)names[sig+1]))
+ if(sig > shp->sigmax || !(sname=(char*)names[sig]))
sname = sig_name(sig,name,1);
sfprintf(sfstdout,trapfmt,sh_fmtq(trap),sname);
}
@@ -405,9 +410,9 @@ static void sig_list(register Shell_t *shp,register int flag)
else
{
/* print all the signal names */
- for(sig=2; sig <= shp->sigmax; sig++)
+ for(sig=1; sig <= shp->sigmax; sig++)
{
- if(!(sname=(char*)names[sig+1]))
+ if(!(sname=(char*)names[sig]))
sname = sig_name(sig,name,1);
sfputr(sfstdout,sname,'\n');
}