diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
commit | 3950ffe2a485479f6561c27364d3d7df5a21d124 (patch) | |
tree | 468c6e14449d1b1e279222ec32f676b0311917d2 /src/lib/libast/features/signal.c | |
download | ksh-upstream.tar.gz |
Imported Upstream version 93u+upstream
Diffstat (limited to 'src/lib/libast/features/signal.c')
-rw-r--r-- | src/lib/libast/features/signal.c | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/src/lib/libast/features/signal.c b/src/lib/libast/features/signal.c new file mode 100644 index 0000000..07c9b4b --- /dev/null +++ b/src/lib/libast/features/signal.c @@ -0,0 +1,371 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2011 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 * +* http://www.eclipse.org/org/documents/epl-v10.html * +* (with md5 checksum b35adb5213ca9657e911e9befb180842) * +* * +* 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; +} |