/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1982-2012 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* David Korn <dgk@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
/*
* trap [-p] action sig...
* kill [-l] [sig...]
* kill [-s sig] pid...
*
* David Korn
* AT&T Labs
* research!dgk
*
*/
#include "defs.h"
#include "jobs.h"
#include "builtins.h"
static int sig_number(Shell_t*,const char*);
{
{
case 'p':
pflag=1;
break;
case ':':
break;
case '?':
return(2);
break;
}
if(error_info.errors)
{
{
/* first argument all digits or - means clear */
arg++;
if(!clear)
{
++argv;
clear++;
/*
* if function semantics can be worked out then it
* may merit a -d,--default option
*/
{
clear++;
dflag++;
}
}
if(!argv[0])
}
{
if(sig<0)
{
return(1);
}
/* internal traps */
{
if(sig>SH_DEBUGTRAP)
{
return(1);
}
if(pflag)
{
continue;
}
if(sig == SH_DEBUGTRAP)
{
else
}
continue;
}
{
return(1);
}
else if(pflag)
{
}
else if(clear)
{
if(dflag)
}
else
{
}
}
}
else /* print out current traps */
return(0);
}
{
register char *signame;
int usemenu = 0;
{
case ':':
goto endopts;
break;
case 'n':
goto endopts;
case 's':
goto endopts;
case 'L':
usemenu = -1;
case 'l':
break;
case '?':
break;
}
argv++;
/* just in case we send a kill -9 $$ */
{
if(!(*argv))
{
else
{
{
}
}
}
}
{
}
}
/*
* Given the name or number of a signal return the signal number
*/
{
register int n,o,sig=0;
{
if(*last)
n = -1;
}
else
{
register int c;
o = staktell();
do
{
c = *string++;
if(islower(c))
c = toupper(c);
stakputc(c);
}
while(c);
stakseek(o);
{
sig = 1;
o += 3;
{
if(!*last)
return(n);
}
}
{
/* sig prefix cannot match internal traps */
n = 0;
}
if((n>>SH_SIGBITS)&SH_SIGRUNTIME)
else
{
if(n < SH_TRAP)
n--;
}
{
{
}
{
}
n = -1;
}
}
return(n);
}
/*
* synthesize signal name for sig in buf
* pfx!=0 prepends SIG to default signal number
*/
{
register int i;
i = 0;
{
buf[i++] = 'R';
buf[i++] = 'T';
buf[i++] = 'M';
if(sig>shp->gd->sigruntime[SH_SIGRTMIN]+(shp->gd->sigruntime[SH_SIGRTMAX]-shp->gd->sigruntime[SH_SIGRTMIN])/2)
{
buf[i++] = 'A';
buf[i++] = 'X';
buf[i++] = '-';
}
else
{
buf[i++] = 'I';
buf[i++] = 'N';
buf[i++] = '+';
}
}
else if(pfx)
{
buf[i++] = 'S';
buf[i++] = 'I';
buf[i++] = 'G';
}
buf[i] = 0;
return buf;
}
/*
* if <flag> is positive, then print signal name corresponding to <flag>
* if <flag> is zero, then print all signal names
* if <flag> is -1, then print all signal names in menu format
* if <flag> is <-1, then print all traps
*/
{
register int sig;
register char *sname;
if(flag<=0)
{
/* not all signals may be defined, so initialize */
}
{
continue;
{
return;
}
}
if(flag > 0)
else if(flag<-1)
{
/* print the traps */
/* use parent traps if otrapcom is set (for $(trap) */
while(--sig >= 0)
{
continue;
}
{
continue;
}
}
else
{
/* print all the signal names */
{
{
if(flag)
}
if(flag)
else
}
if(flag)
{
}
}
}