diff options
Diffstat (limited to 'usr/src/lib/libshell/common/bltins/trap.c')
-rw-r--r-- | usr/src/lib/libshell/common/bltins/trap.c | 37 |
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'); } |