signal.c revision 3e14f97f673e8a630f076077de35afdd43dc1587
/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1985-2010 AT&T Intellectual Property *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* http://www.opensource.org/licenses/cpl1.0.txt *
* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* David Korn <dgk@research.att.com> *
* Phong Vo <kpv@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
/*
* Glenn Fowler
* AT&T Research
*
* generate signal features
*/
#include "FEATURE/standards"
#define strsignal ______strsignal
#include <signal.h>
#undef strsignal
struct _m_
{
char* text;
char* name;
int value;
};
#define elementsof(x) (sizeof(x)/sizeof(x[0]))
static struct _m_ map[] =
{
#ifdef SIGABRT
#define HAD_SIGABRT 1
"Abort", "ABRT", SIGABRT,
#endif
#ifdef SIGAIO
#define HAD_SIGAIO 1
"Asynchronous I/O", "AIO", SIGAIO,
#endif
#ifdef SIGALRM
#define HAD_SIGALRM 1
"Alarm call", "ALRM", SIGALRM,
#endif
#ifdef SIGAPOLLO
#define HAD_SIGAPOLLO 1
"Apollo", "APOLLO", SIGAPOLLO,
#endif
#ifdef SIGBUS
#define HAD_SIGBUS 1
"Bus error", "BUS", SIGBUS,
#endif
#ifdef SIGCHLD
#define HAD_SIGCHLD 1
"Child status change", "CHLD", SIGCHLD,
#endif
#ifdef SIGCLD
#define HAD_SIGCLD 1
"Death of child", "CLD", SIGCLD,
#endif
#ifdef SIGCONT
#define HAD_SIGCONT 1
"Stopped process continued", "CONT", SIGCONT,
#endif
#ifdef SIGDANGER
#define HAD_SIGDANGER 1
"System crash soon", "DANGER", SIGDANGER,
#endif
#ifdef SIGDEBUG
#define HAD_SIGDEBUG 1
"Debug trap", "DEBUG", SIGDEBUG,
#endif
#ifdef SIGDIL
#define HAD_SIGDIL 1
"DIL trap", "DIL", SIGDIL,
#endif
#ifdef SIGEMT
#define HAD_SIGEMT 1
"EMT trap", "EMT", SIGEMT,
#endif
#ifdef SIGERR
#define HAD_SIGERR 1
"ERR trap", "ERR", SIGERR,
#endif
#ifdef SIGEXIT
#define HAD_SIGEXIT 1
"Exit", "EXIT", SIGEXIT,
#endif
#ifdef SIGFPE
#define HAD_SIGFPE 1
"Floating exception", "FPE", SIGFPE,
#endif
#ifdef SIGFREEZE
#define HAD_SIGFREEZE 1
"CPR freeze", "FREEZE", SIGFREEZE,
#endif
#ifdef SIGHUP
#define HAD_SIGHUP 1
"Hangup", "HUP", SIGHUP,
#endif
#ifdef SIGILL
#define HAD_SIGILL 1
"Illegal instruction", "ILL", SIGILL,
#endif
#ifdef SIGINT
#define HAD_SIGINT 1
"Interrupt", "INT", SIGINT,
#endif
#ifdef SIGIO
#define HAD_SIGIO 1
"IO possible", "IO", SIGIO,
#endif
#ifdef SIGIOT
#define HAD_SIGIOT 1
"IOT trap", "IOT", SIGIOT,
#endif
#ifdef SIGKILL
#define HAD_SIGKILL 1
"Killed", "KILL", SIGKILL,
#endif
#ifdef SIGLAB
#define HAD_SIGLAB 1
"Security label changed", "LAB", SIGLAB,
#endif
#ifdef SIGLOST
#define HAD_SIGLOST 1
"Resources lost", "LOST", SIGLOST,
#endif
#ifdef SIGLWP
#define HAD_SIGLWP 1
"Thread event", "LWP", SIGLWP,
#endif
#ifdef SIGMIGRATE
#define HAD_SIGMIGRATE 1
"Migrate process", "MIGRATE", SIGMIGRATE,
#endif
#ifdef SIGPHONE
#define HAD_SIGPHONE 1
"Phone status change", "PHONE", SIGPHONE,
#endif
#ifdef SIGPIPE
#define HAD_SIGPIPE 1
"Broken pipe", "PIPE", SIGPIPE,
#endif
#ifdef SIGPOLL
#define HAD_SIGPOLL 1
"Poll event", "POLL", SIGPOLL,
#endif
#ifdef SIGPROF
#define HAD_SIGPROF 1
"Profile timer alarm", "PROF", SIGPROF,
#endif
#ifdef SIGPWR
#define HAD_SIGPWR 1
"Power fail", "PWR", SIGPWR,
#endif
#ifdef SIGQUIT
#define HAD_SIGQUIT 1
"Quit", "QUIT", SIGQUIT,
#endif
#ifdef SIGSEGV
#define HAD_SIGSEGV 1
"Memory fault", "SEGV", SIGSEGV,
#endif
#ifdef SIGSOUND
#define HAD_SIGSOUND 1
"Sound completed", "SOUND", SIGSOUND,
#endif
#ifdef SIGSSTOP
#define HAD_SIGSSTOP 1
"Sendable stop", "SSTOP", SIGSSTOP,
#endif
#ifdef gould
#define HAD_gould 1
"Stack overflow", "STKOV", 28,
#endif
#ifdef SIGSTOP
#define HAD_SIGSTOP 1
"Stopped (signal)", "STOP", SIGSTOP,
#endif
#ifdef SIGSYS
#define HAD_SIGSYS 1
"Bad system call", "SYS", SIGSYS,
#endif
#ifdef SIGTERM
#define HAD_SIGTERM 1
"Terminated", "TERM", SIGTERM,
#endif
#ifdef SIGTHAW
#define HAD_SIGTHAW 1
"CPR thaw", "THAW", SIGTHAW,
#endif
#ifdef SIGTINT
#define HAD_SIGTINT 1
"Interrupt (terminal)", "TINT", SIGTINT,
#endif
#ifdef SIGTRAP
#define HAD_SIGTRAP 1
"Trace trap", "TRAP", SIGTRAP,
#endif
#ifdef SIGTSTP
#define HAD_SIGTSTP 1
"Stopped", "TSTP", SIGTSTP,
#endif
#ifdef SIGTTIN
#define HAD_SIGTTIN 1
"Stopped (tty input)", "TTIN", SIGTTIN,
#endif
#ifdef SIGTTOU
#define HAD_SIGTTOU 1
"Stopped (tty output)", "TTOU", SIGTTOU,
#endif
#ifdef SIGURG
#define HAD_SIGURG 1
"Urgent IO", "URG", SIGURG,
#endif
#ifdef SIGUSR1
#define HAD_SIGUSR1 1
"User signal 1", "USR1", SIGUSR1,
#endif
#ifdef SIGUSR2
#define HAD_SIGUSR2 1
"User signal 2", "USR2", SIGUSR2,
#endif
#ifdef SIGVTALRM
#define HAD_SIGVTALRM 1
"Virtual timer alarm", "VTALRM", SIGVTALRM,
#endif
#ifdef SIGWAITING
#define HAD_SIGWAITING 1
"All threads blocked", "WAITING", SIGWAITING,
#endif
#ifdef SIGWINCH
#define HAD_SIGWINCH 1
"Window change", "WINCH", SIGWINCH,
#endif
#ifdef SIGWIND
#define HAD_SIGWIND 1
"Window change", "WIND", SIGWIND,
#endif
#ifdef SIGWINDOW
#define HAD_SIGWINDOW 1
"Window change", "WINDOW", SIGWINDOW,
#endif
#ifdef SIGXCPU
#define HAD_SIGXCPU 1
"CPU time limit", "XCPU", SIGXCPU,
#endif
#ifdef SIGXFSZ
#define HAD_SIGXFSZ 1
"File size limit", "XFSZ", SIGXFSZ,
#endif
#include "FEATURE/siglist"
0
};
#define RANGE_MIN (1<<14)
#define RANGE_MAX (1<<13)
#define RANGE_RT (1<<12)
#define RANGE_SIG (~(RANGE_MIN|RANGE_MAX|RANGE_RT))
static int mapindex[1024];
#if _lib_strsignal
extern char* strsignal(int);
#endif
int
main()
{
register int i;
register int j;
register int k;
int m;
int n;
#if _lib_strsignal
char* s;
#endif
k = 0;
for (i = 0; map[i].name; i++)
if ((j = map[i].value) > 0 && j < elementsof(mapindex) && !mapindex[j])
{
if (j > k)
k = j;
mapindex[j] = i;
}
#ifdef SIGRTMIN
i = SIGRTMIN;
#ifdef SIGRTMAX
j = SIGRTMAX;
#else
j = i;
#endif
if (j >= elementsof(mapindex))
j = elementsof(mapindex) - 1;
if (i <= j && i > 0 && i < elementsof(mapindex) && j > 0 && j < elementsof(mapindex))
{
if (j > k)
k = j;
mapindex[i] = RANGE_MIN | RANGE_RT;
n = 1;
while (++i < j)
mapindex[i] = RANGE_RT | n++;
mapindex[j] = RANGE_MAX | RANGE_RT | n;
}
#endif
printf("#pragma prototyped\n");
printf("#define SIG_MAX %d\n", k);
printf("\n");
printf("static const char* const sig_name[] =\n");
printf("{\n");
for (i = 0; i <= k; i++)
if (!(j = mapindex[i]))
printf(" \"%d\",\n", i);
else if (j & RANGE_RT)
{
if (j & RANGE_MIN)
printf(" \"RTMIN\",\n");
else if (j & RANGE_MAX)
printf(" \"RTMAX\",\n");
else
{
m = j & RANGE_SIG;
if (m > n / 2)
printf(" \"RTMAX-%d\",\n", n - m);
else
printf(" \"RTMIN+%d\",\n", m);
}
}
else
printf(" \"%s\",\n", map[j].name);
printf(" 0\n");
printf("};\n");
printf("\n");
printf("static const char* const sig_text[] =\n");
printf("{\n");
for (i = 0; i <= k; i++)
if (!(j = mapindex[i]))
printf(" \"Signal %d\",\n", i);
else if (j & RANGE_RT)
printf(" \"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
else if (map[j].text)
printf(" \"%s\",\n", map[j].text);
#if _lib_strsignal
else if (s = strsignal(i))
printf(" \"%s\",\n", s);
#endif
else
printf(" \"Signal %d\",\n", i);
printf(" 0\n");
printf("};\n");
return 0;
}