trap.c revision 7c2fbfb345896881c631598ee3852ce9ce33fb07
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Copyright (c) 1982-2008 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * trap [-p] action sig...
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * kill [-l] [sig...]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * kill [-s sig] pid...
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * research!dgk
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int sig_number(const char*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int sig, clear = 0, dflag = 0, pflag = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Shell_t *shp = ((Shbltin_t*)extra)->shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2),"%s", optusage((char*)0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* first argument all digits or - means clear */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * NOTE: 2007-11-26: workaround for tests/signal.sh
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * if function semantics can be worked out then it
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * may merit a -d,--default option
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(*action=='+' && action[1]==0 && sh.st.self == &sh.global)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* internal traps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char **trapcom = (shp->st.otrapcom?shp->st.otrapcom:shp->st.trapcom);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else /* print out current traps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *signame;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Shell_t *shp = ((Shbltin_t*)extra)->shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((signame=argv[opt_info.index++]) && (sig=sig_number(signame+1))>=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*argv && strcmp(*argv,"--")==0 && strcmp(*(argv-1),"--")!=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(error_info.errors || flag==(L_FLAG|S_FLAG) || (!(*argv) && !(flag&L_FLAG)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2),"%s", optusage((char*)0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* just in case we send a kill -9 $$ */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig_list(shp,((int)strtol(signame, (char**)0, 10)&0177)+1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Given the name or number of a signal return the signal number
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int n,o,sig=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp = sh_locate(stakptr(o),(const Shtable_t*)shtab_signals,sizeof(*shtab_signals));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* sig prefix cannot match internal traps */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(n<0 && (name=stakptr(o)) && *name++=='R' && *name++=='T')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name[0]=='M' && name[1]=='I' && name[2]=='N' && name[3]=='+')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((sig=(int)strtol(name+4,&name,10)) >= 0 && !*name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(name[0]=='M' && name[1]=='A' && name[2]=='X' && name[3]=='-')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((sig=(int)strtol(name+4,&name,10)) >= 0 && !*name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if((sig=(int)strtol(name,&name,10)) > 0 && !*name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(n<sh.sigruntime[SH_SIGRTMIN] || n>sh.sigruntime[SH_SIGRTMAX])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(n);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * synthesize signal name for sig in buf
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * pfx!=0 prepends SIG to default signal number
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic char* sig_name(int sig, char* buf, int pfx)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sig>sh.sigruntime[SH_SIGRTMIN] && sig<sh.sigruntime[SH_SIGRTMAX])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sig>sh.sigruntime[SH_SIGRTMIN]+(sh.sigruntime[SH_SIGRTMAX]-sh.sigruntime[SH_SIGRTMIN])/2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if <flag> is positive, then print signal name corresponding to <flag>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if <flag> is zero, then print all signal names
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if <flag> is negative, then print all traps
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sig_list(register Shell_t *shp,register int flag)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register char *sname;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* not all signals may be defined, so initialize */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(--sig >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(flag<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* print the traps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* use parent traps if otrapcom is set (for $(trap) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trapcom = (shp->st.otrapcom?shp->st.otrapcom:shp->st.trapcom);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(--sig >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* print all the signal names */