#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
extern char *strrchr();
static char *signames[NSIG];
char *progname;
void sigstat();
main(argc, argv)
int argc;
char **argv;
{
register int i;
char *t;
if (t = strrchr(argv[0], '/'))
progname = ++t;
else
progname = argv[0];
init_signames();
if (argc == 1) {
for (i = 1; i < NSIG; i++)
sigstat(i);
exit(0);
}
for (i = 1; i < argc; i++)
sigstat(atoi(argv[i]));
exit(0);
}
void
sigstat(sig)
int sig;
{
struct sigaction oact;
char *signame;
sigset_t set, oset;
int blocked;
if (sig < 0 || sig >= NSIG) {
fprintf(stderr, "%s: %d: signal out of range\n", progname, sig);
return;
}
signame = signames[sig];
sigemptyset(&oset);
sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
if (sigismember(&oset, sig))
printf("%s: signal is blocked\n", signame);
sigaction(sig, (struct sigaction *)NULL, &oact);
if (oact.sa_handler == SIG_IGN)
printf("%s: signal is ignored\n", signame);
else if (oact.sa_handler == SIG_DFL)
printf("%s: signal is defaulted\n", signame);
else
printf("%s: signal is trapped (?)\n", signame);
}
init_signames()
{
register int i;
bzero(signames, sizeof(signames));
#if defined (SIGHUP)
signames[SIGHUP] = "SIGHUP";
#endif
#if defined (SIGINT)
signames[SIGINT] = "SIGINT";
#endif
#if defined (SIGQUIT)
signames[SIGQUIT] = "SIGQUIT";
#endif
#if defined (SIGILL)
signames[SIGILL] = "SIGILL";
#endif
#if defined (SIGTRAP)
signames[SIGTRAP] = "SIGTRAP";
#endif
#if defined (SIGABRT)
signames[SIGABRT] = "SIGABRT";
#endif
#if defined (SIGIOT)
signames[SIGIOT] = "SIGIOT";
#endif
#if defined (SIGEMT)
signames[SIGEMT] = "SIGEMT";
#endif
#if defined (SIGFPE)
signames[SIGFPE] = "SIGFPE";
#endif
#if defined (SIGKILL)
signames[SIGKILL] = "SIGKILL";
#endif
#if defined (SIGBUS)
signames[SIGBUS] = "SIGBUS";
#endif
#if defined (SIGSEGV)
signames[SIGSEGV] = "SIGSEGV";
#endif
#if defined (SIGSYS)
signames[SIGSYS] = "SIGSYS";
#endif
#if defined (SIGPIPE)
signames[SIGPIPE] = "SIGPIPE";
#endif
#if defined (SIGALRM)
signames[SIGALRM] = "SIGALRM";
#endif
#if defined (SIGTERM)
signames[SIGTERM] = "SIGTERM";
#endif
#if defined (SIGCLD)
signames[SIGCLD] = "SIGCLD";
#endif
#if defined (SIGPWR)
signames[SIGPWR] = "SIGPWR";
#endif
#if defined (SIGPOLL)
signames[SIGPOLL] = "SIGPOLL";
#endif
#if defined (SIGURG)
signames[SIGURG] = "SIGURG";
#endif
#if defined (SIGSTOP)
signames[SIGSTOP] = "SIGSTOP";
#endif
#if defined (SIGTSTP)
signames[SIGTSTP] = "SIGTSTP";
#endif
#if defined (SIGCONT)
signames[SIGCONT] = "SIGCONT";
#endif
#if defined (SIGCHLD)
signames[SIGCHLD] = "SIGCHLD";
#endif
#if defined (SIGTTIN)
signames[SIGTTIN] = "SIGTTIN";
#endif
#if defined (SIGTTOU)
signames[SIGTTOU] = "SIGTTOU";
#endif
#if defined (SIGIO)
signames[SIGIO] = "SIGIO";
#endif
#if defined (SIGXCPU)
signames[SIGXCPU] = "SIGXCPU";
#endif
#if defined (SIGXFSZ)
signames[SIGXFSZ] = "SIGXFSZ";
#endif
#if defined (SIGVTALRM)
signames[SIGVTALRM] = "SIGVTALRM";
#endif
#if defined (SIGPROF)
signames[SIGPROF] = "SIGPROF";
#endif
#if defined (SIGWINCH)
signames[SIGWINCH] = "SIGWINCH";
#endif
#if defined (SIGLOST)
signames[SIGLOST] = "SIGLOST";
#endif
#if defined (SIGUSR1)
signames[SIGUSR1] = "SIGUSR1";
#endif
#if defined (SIGUSR2)
signames[SIGUSR2] = "SIGUSR2";
#endif
#if defined (SIGMSG)
signames[SIGMSG] = "SIGMSG";
#endif
#if defined (SIGPWR)
signames[SIGPWR] = "SIGPWR";
#endif
#if defined (SIGDANGER)
signames[SIGDANGER] = "SIGDANGER";
#endif
#if defined (SIGMIGRATE)
signames[SIGMIGRATE] = "SIGMIGRATE";
#endif
#if defined (SIGPRE)
signames[SIGPRE] = "SIGPRE";
#endif
#if defined (SIGGRANT)
signames[SIGGRANT] = "SIGGRANT";
#endif
#if defined (SIGRETRACT)
signames[SIGRETRACT] = "SIGRETRACT";
#endif
#if defined (SIGSOUND)
signames[SIGSOUND] = "SIGSOUND";
#endif
for (i = 0; i < NSIG; i++)
if (signames[i] == (char *)NULL) {
signames[i] = (char *)malloc (16);;
sprintf (signames[i], "signal %d", i);
}
}