da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 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* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * trap [-p] action sig...
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * kill [-l] [sig...]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * kill [-s sig] pid...
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * research!dgk
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "defs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "jobs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "builtins.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define L_FLAG 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_FLAG 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char trapfmt[] = "trap -- %s %s\n";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int sig_number(const char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sig_list(Shell_t*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint b_trap(int argc,char *argv[],void *extra)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *arg = argv[1];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int sig, clear = 0, dflag = 0, pflag = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Shell_t *shp = ((Shbltin_t*)extra)->shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(argc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (sig = optget(argv, sh_opttrap)) switch (sig)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'p':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pflag=1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(0), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(error_info.errors)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2),"%s", optusage((char*)0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(arg = *argv)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *action = arg;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!dflag && !pflag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* first argument all digits or - means clear */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(isdigit(*arg))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin arg++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin clear = (arg!=action && *arg==0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!clear)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ++argv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*action=='-' && action[1]==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin clear++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /*
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 */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(*action=='+' && action[1]==0 && sh.st.self == &sh.global)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin clear++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dflag++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!argv[0])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),e_condition);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(arg = *argv++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig = sig_number(arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sig<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2,e_trap,arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* internal traps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sig&SH_TRAP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig &= ~SH_TRAP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sig>SH_DEBUGTRAP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2,e_trap,arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(pflag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(arg=shp->st.trap[sig])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sfstdout,sh_fmtq(arg),'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->st.trap[sig])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(shp->st.trap[sig]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.trap[sig] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!clear && *action)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.trap[sig] = strdup(action);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sig == SH_DEBUGTRAP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->st.trap[sig])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->trapnote |= SH_SIGTRAP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->trapnote = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sig>shp->sigmax)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2,e_trap,arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(pflag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char **trapcom = (shp->st.otrapcom?shp->st.otrapcom:shp->st.trapcom);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(arg=trapcom[sig])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sfstdout,arg,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(clear)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_sigclear(sig);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(dflag)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin signal(sig,SIG_DFL);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sig >= shp->st.trapmax)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.trapmax = sig+1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz arg = shp->st.trapcom[sig];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_sigtrap(sig);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz shp->st.trapcom[sig] = (shp->sigflag[sig]&SH_SIGOFF) ? Empty : strdup(action);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(arg && arg != Empty)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz free(arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else /* print out current traps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig_list(shp,-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint b_kill(int argc,char *argv[],void *extra)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *signame;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int sig=SIGTERM, flag=0, n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Shell_t *shp = ((Shbltin_t*)extra)->shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(argc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((n = optget(argv,sh_optkill))) switch(n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((signame=argv[opt_info.index++]) && (sig=sig_number(signame+1))>=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto endopts;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.index--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig = (int)opt_info.num;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto endopts;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 's':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag |= S_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin signame = opt_info.arg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto endopts;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'l':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag |= L_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinendopts:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*argv && strcmp(*argv,"--")==0 && strcmp(*(argv-1),"--")!=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv++;
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 sfsync(sfstderr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flag&L_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(*argv))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig_list(shp,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else while(signame = *argv++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(isdigit(*signame))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig_list(shp,((int)strtol(signame, (char**)0, 10)&0177)+1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((sig=sig_number(signame))<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->exitval = 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),e_nosignal,signame);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%d\n",sig);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(shp->exitval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flag&S_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((sig=sig_number(signame)) < 0 || sig > shp->sigmax)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),e_nosignal,signame);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(job_walk(sfstdout,job_kill,sig,argv))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->exitval = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(shp->exitval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Given the name or number of a signal return the signal number
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int sig_number(const char *string)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Shtable_t *tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int n,o,sig=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *last, *name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(isdigit(*string))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = strtol(string,&last,10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin o = staktell();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = *string++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(islower(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = toupper(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputc(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(c);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(o);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(memcmp(stakptr(o),"SIG",3)==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin o += 3;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(isdigit(*stakptr(o)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = strtol(stakptr(o),&last,10);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!*last)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return(n);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp = sh_locate(stakptr(o),(const Shtable_t*)shtab_signals,sizeof(*shtab_signals));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = tp->sh_number;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sig==1 && (n>=(SH_TRAP-1) && n < (1<<SH_SIGBITS)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* sig prefix cannot match internal traps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = (Shtable_t*)((char*)tp + sizeof(*shtab_signals));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(stakptr(o),tp->sh_name)==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = tp->sh_number;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((n>>SH_SIGBITS)&SH_SIGRUNTIME)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = sh.sigruntime[(n&((1<<SH_SIGBITS)-1))-1];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n &= (1<<SH_SIGBITS)-1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(n < SH_TRAP)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n--;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(n<0 && sh.sigruntime[1] && (name=stakptr(o)) && *name++=='R' && *name++=='T')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name[0]=='M' && name[1]=='I' && name[2]=='N' && name[3]=='+')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((sig=(int)strtol(name+4,&name,10)) >= 0 && !*name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = sh.sigruntime[SH_SIGRTMIN] + sig;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(name[0]=='M' && name[1]=='A' && name[2]=='X' && name[3]=='-')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((sig=(int)strtol(name+4,&name,10)) >= 0 && !*name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = sh.sigruntime[SH_SIGRTMAX] - sig;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if((sig=(int)strtol(name,&name,10)) > 0 && !*name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = sh.sigruntime[SH_SIGRTMIN] + sig - 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(n<sh.sigruntime[SH_SIGRTMIN] || n>sh.sigruntime[SH_SIGRTMAX])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = -1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * synthesize signal name for sig in buf
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * pfx!=0 prepends SIG to default signal number
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic char* sig_name(int sig, char* buf, int pfx)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin i = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sig>sh.sigruntime[SH_SIGRTMIN] && sig<sh.sigruntime[SH_SIGRTMAX])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'R';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'T';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'M';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sig>sh.sigruntime[SH_SIGRTMIN]+(sh.sigruntime[SH_SIGRTMAX]-sh.sigruntime[SH_SIGRTMIN])/2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'A';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'X';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = '-';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sig = sh.sigruntime[SH_SIGRTMAX]-sig;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'I';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'N';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = '+';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sig = sig-sh.sigruntime[SH_SIGRTMIN];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(pfx)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'S';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'I';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i++] = 'G';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin i += sfsprintf(buf+i, 8, "%d", sig);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf[i] = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return buf;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
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
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void sig_list(register Shell_t *shp,register int flag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const struct shtable2 *tp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register int sig;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register char *sname;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char name[10];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char *names[SH_TRAP];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char *traps[SH_DEBUGTRAP+1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp=shtab_signals;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(flag<=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* not all signals may be defined, so initialize */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for(sig=shp->sigmax; sig>=0; sig--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin names[sig] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(sig=SH_DEBUGTRAP; sig>=0; sig--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin traps[sig] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for(; *tp->sh_name; tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sig = tp->sh_number&((1<<SH_SIGBITS)-1);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (((tp->sh_number>>SH_SIGBITS) & SH_SIGRUNTIME) && (sig = sh.sigruntime[sig-1]+1) == 1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sig==flag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,"%s\n",tp->sh_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(sig&SH_TRAP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin traps[sig&~SH_TRAP] = (char*)tp->sh_name;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if(sig-- && sig < elementsof(names))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin names[sig] = (char*)tp->sh_name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flag > 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfputr(sfstdout, sig_name(flag-1,name,0), '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(flag<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* print the traps */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register char *trap,**trapcom;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig = shp->st.trapmax;
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 {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(trap=trapcom[sig]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(sig > shp->sigmax || !(sname=(char*)names[sig]))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sname = sig_name(sig,name,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,trapfmt,sh_fmtq(trap),sname);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(sig=SH_DEBUGTRAP; sig>=0; sig--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(trap=shp->st.trap[sig]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout,trapfmt,sh_fmtq(trap),traps[sig]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* print all the signal names */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for(sig=1; sig <= shp->sigmax; sig++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!(sname=(char*)names[sig]))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sname = sig_name(sig,name,1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfputr(sfstdout,sname,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}