xref: /titanic_51/usr/src/lib/libast/common/features/signal.c (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*3e14f97fSRoger A. Faulkner *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6da2e3ebdSchin *                  Common Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10da2e3ebdSchin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11da2e3ebdSchin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
19da2e3ebdSchin *                   Phong Vo <kpv@research.att.com>                    *
20da2e3ebdSchin *                                                                      *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin /*
24da2e3ebdSchin  * Glenn Fowler
257c2fbfb3SApril Chin  * AT&T Research
26da2e3ebdSchin  *
27da2e3ebdSchin  * generate signal features
28da2e3ebdSchin  */
29da2e3ebdSchin 
307c2fbfb3SApril Chin #include "FEATURE/standards"
317c2fbfb3SApril Chin 
327c2fbfb3SApril Chin #define strsignal	______strsignal
337c2fbfb3SApril Chin 
34da2e3ebdSchin #include <signal.h>
35da2e3ebdSchin 
367c2fbfb3SApril Chin #undef	strsignal
377c2fbfb3SApril Chin 
38da2e3ebdSchin struct _m_
39da2e3ebdSchin {
40da2e3ebdSchin 	char*		text;
41da2e3ebdSchin 	char*		name;
42da2e3ebdSchin 	int		value;
43da2e3ebdSchin };
44da2e3ebdSchin 
45da2e3ebdSchin #define elementsof(x)	(sizeof(x)/sizeof(x[0]))
46da2e3ebdSchin 
47da2e3ebdSchin static struct _m_ map[] =
48da2e3ebdSchin {
49da2e3ebdSchin #ifdef SIGABRT
507c2fbfb3SApril Chin #define HAD_SIGABRT	1
51da2e3ebdSchin "Abort",			"ABRT",		SIGABRT,
52da2e3ebdSchin #endif
53da2e3ebdSchin #ifdef SIGAIO
547c2fbfb3SApril Chin #define HAD_SIGAIO	1
55da2e3ebdSchin "Asynchronous I/O",		"AIO",		SIGAIO,
56da2e3ebdSchin #endif
57da2e3ebdSchin #ifdef SIGALRM
587c2fbfb3SApril Chin #define HAD_SIGALRM	1
59da2e3ebdSchin "Alarm call",			"ALRM",		SIGALRM,
60da2e3ebdSchin #endif
61da2e3ebdSchin #ifdef SIGAPOLLO
627c2fbfb3SApril Chin #define HAD_SIGAPOLLO	1
63da2e3ebdSchin "Apollo",			"APOLLO",	SIGAPOLLO,
64da2e3ebdSchin #endif
65da2e3ebdSchin #ifdef SIGBUS
667c2fbfb3SApril Chin #define HAD_SIGBUS	1
67da2e3ebdSchin "Bus error",			"BUS",		SIGBUS,
68da2e3ebdSchin #endif
69da2e3ebdSchin #ifdef SIGCHLD
707c2fbfb3SApril Chin #define HAD_SIGCHLD	1
71da2e3ebdSchin "Child status change",		"CHLD",		SIGCHLD,
72da2e3ebdSchin #endif
73da2e3ebdSchin #ifdef SIGCLD
747c2fbfb3SApril Chin #define HAD_SIGCLD	1
75da2e3ebdSchin "Death of child", 		"CLD",		SIGCLD,
76da2e3ebdSchin #endif
77da2e3ebdSchin #ifdef SIGCONT
787c2fbfb3SApril Chin #define HAD_SIGCONT	1
79da2e3ebdSchin "Stopped process continued",	"CONT",		SIGCONT,
80da2e3ebdSchin #endif
81da2e3ebdSchin #ifdef SIGDANGER
827c2fbfb3SApril Chin #define HAD_SIGDANGER	1
83da2e3ebdSchin "System crash soon",		"DANGER",	SIGDANGER,
84da2e3ebdSchin #endif
85da2e3ebdSchin #ifdef SIGDEBUG
867c2fbfb3SApril Chin #define HAD_SIGDEBUG	1
87da2e3ebdSchin "Debug trap",			"DEBUG",	SIGDEBUG,
88da2e3ebdSchin #endif
89da2e3ebdSchin #ifdef SIGDIL
907c2fbfb3SApril Chin #define HAD_SIGDIL	1
91da2e3ebdSchin "DIL trap",			"DIL",		SIGDIL,
92da2e3ebdSchin #endif
93da2e3ebdSchin #ifdef SIGEMT
947c2fbfb3SApril Chin #define HAD_SIGEMT	1
95da2e3ebdSchin "EMT trap",			"EMT",		SIGEMT,
96da2e3ebdSchin #endif
97da2e3ebdSchin #ifdef SIGERR
987c2fbfb3SApril Chin #define HAD_SIGERR	1
99da2e3ebdSchin "ERR trap",			"ERR",		SIGERR,
100da2e3ebdSchin #endif
101da2e3ebdSchin #ifdef SIGEXIT
1027c2fbfb3SApril Chin #define HAD_SIGEXIT	1
103da2e3ebdSchin "Exit",				"EXIT",		SIGEXIT,
104da2e3ebdSchin #endif
105da2e3ebdSchin #ifdef SIGFPE
1067c2fbfb3SApril Chin #define HAD_SIGFPE	1
107da2e3ebdSchin "Floating exception",		"FPE",		SIGFPE,
108da2e3ebdSchin #endif
109da2e3ebdSchin #ifdef SIGFREEZE
1107c2fbfb3SApril Chin #define HAD_SIGFREEZE	1
111da2e3ebdSchin "CPR freeze",			"FREEZE",	SIGFREEZE,
112da2e3ebdSchin #endif
113da2e3ebdSchin #ifdef SIGHUP
1147c2fbfb3SApril Chin #define HAD_SIGHUP	1
115da2e3ebdSchin "Hangup",			"HUP",		SIGHUP,
116da2e3ebdSchin #endif
117da2e3ebdSchin #ifdef SIGILL
1187c2fbfb3SApril Chin #define HAD_SIGILL	1
119da2e3ebdSchin "Illegal instruction",		"ILL",		SIGILL,
120da2e3ebdSchin #endif
121da2e3ebdSchin #ifdef SIGINT
1227c2fbfb3SApril Chin #define HAD_SIGINT	1
123da2e3ebdSchin "Interrupt",			"INT",		SIGINT,
124da2e3ebdSchin #endif
125da2e3ebdSchin #ifdef SIGIO
1267c2fbfb3SApril Chin #define HAD_SIGIO	1
127da2e3ebdSchin "IO possible",			"IO",		SIGIO,
128da2e3ebdSchin #endif
129da2e3ebdSchin #ifdef SIGIOT
1307c2fbfb3SApril Chin #define HAD_SIGIOT	1
131da2e3ebdSchin "IOT trap",			"IOT",		SIGIOT,
132da2e3ebdSchin #endif
133da2e3ebdSchin #ifdef SIGKILL
1347c2fbfb3SApril Chin #define HAD_SIGKILL	1
135da2e3ebdSchin "Killed",			"KILL",		SIGKILL,
136da2e3ebdSchin #endif
137da2e3ebdSchin #ifdef SIGLAB
1387c2fbfb3SApril Chin #define HAD_SIGLAB	1
139da2e3ebdSchin "Security label changed",	"LAB",		SIGLAB,
140da2e3ebdSchin #endif
141da2e3ebdSchin #ifdef SIGLOST
1427c2fbfb3SApril Chin #define HAD_SIGLOST	1
143da2e3ebdSchin "Resources lost",		"LOST",		SIGLOST,
144da2e3ebdSchin #endif
145da2e3ebdSchin #ifdef SIGLWP
1467c2fbfb3SApril Chin #define HAD_SIGLWP	1
147da2e3ebdSchin "Thread event",			"LWP",		SIGLWP,
148da2e3ebdSchin #endif
149da2e3ebdSchin #ifdef SIGMIGRATE
1507c2fbfb3SApril Chin #define HAD_SIGMIGRATE	1
151da2e3ebdSchin "Migrate process",		"MIGRATE",	SIGMIGRATE,
152da2e3ebdSchin #endif
153da2e3ebdSchin #ifdef SIGPHONE
1547c2fbfb3SApril Chin #define HAD_SIGPHONE	1
155da2e3ebdSchin "Phone status change",		"PHONE",	SIGPHONE,
156da2e3ebdSchin #endif
157da2e3ebdSchin #ifdef SIGPIPE
1587c2fbfb3SApril Chin #define HAD_SIGPIPE	1
159da2e3ebdSchin "Broken pipe",			"PIPE",		SIGPIPE,
160da2e3ebdSchin #endif
161da2e3ebdSchin #ifdef SIGPOLL
1627c2fbfb3SApril Chin #define HAD_SIGPOLL	1
163da2e3ebdSchin "Poll event",			"POLL",		SIGPOLL,
164da2e3ebdSchin #endif
165da2e3ebdSchin #ifdef SIGPROF
1667c2fbfb3SApril Chin #define HAD_SIGPROF	1
167da2e3ebdSchin "Profile timer alarm",		"PROF",		SIGPROF,
168da2e3ebdSchin #endif
169da2e3ebdSchin #ifdef SIGPWR
1707c2fbfb3SApril Chin #define HAD_SIGPWR	1
171da2e3ebdSchin "Power fail",			"PWR",		SIGPWR,
172da2e3ebdSchin #endif
173da2e3ebdSchin #ifdef SIGQUIT
1747c2fbfb3SApril Chin #define HAD_SIGQUIT	1
175da2e3ebdSchin "Quit",				"QUIT",		SIGQUIT,
176da2e3ebdSchin #endif
177da2e3ebdSchin #ifdef SIGSEGV
1787c2fbfb3SApril Chin #define HAD_SIGSEGV	1
179da2e3ebdSchin "Memory fault",			"SEGV",		SIGSEGV,
180da2e3ebdSchin #endif
181da2e3ebdSchin #ifdef SIGSOUND
1827c2fbfb3SApril Chin #define HAD_SIGSOUND	1
183da2e3ebdSchin "Sound completed",		"SOUND",	SIGSOUND,
184da2e3ebdSchin #endif
185da2e3ebdSchin #ifdef SIGSSTOP
1867c2fbfb3SApril Chin #define HAD_SIGSSTOP	1
187da2e3ebdSchin "Sendable stop",		"SSTOP",	SIGSSTOP,
188da2e3ebdSchin #endif
189da2e3ebdSchin #ifdef gould
1907c2fbfb3SApril Chin #define HAD_gould	1
191da2e3ebdSchin "Stack overflow",		"STKOV",	28,
192da2e3ebdSchin #endif
193da2e3ebdSchin #ifdef SIGSTOP
1947c2fbfb3SApril Chin #define HAD_SIGSTOP	1
195da2e3ebdSchin "Stopped (signal)",		"STOP",		SIGSTOP,
196da2e3ebdSchin #endif
197da2e3ebdSchin #ifdef SIGSYS
1987c2fbfb3SApril Chin #define HAD_SIGSYS	1
199da2e3ebdSchin "Bad system call", 		"SYS",		SIGSYS,
200da2e3ebdSchin #endif
201da2e3ebdSchin #ifdef SIGTERM
2027c2fbfb3SApril Chin #define HAD_SIGTERM	1
203da2e3ebdSchin "Terminated",			"TERM",		SIGTERM,
204da2e3ebdSchin #endif
205da2e3ebdSchin #ifdef SIGTHAW
2067c2fbfb3SApril Chin #define HAD_SIGTHAW	1
207da2e3ebdSchin "CPR thaw",			"THAW",		SIGTHAW,
208da2e3ebdSchin #endif
209da2e3ebdSchin #ifdef SIGTINT
2107c2fbfb3SApril Chin #define HAD_SIGTINT	1
211da2e3ebdSchin "Interrupt (terminal)",		"TINT",		SIGTINT,
212da2e3ebdSchin #endif
213da2e3ebdSchin #ifdef SIGTRAP
2147c2fbfb3SApril Chin #define HAD_SIGTRAP	1
215da2e3ebdSchin "Trace trap",			"TRAP",		SIGTRAP,
216da2e3ebdSchin #endif
217da2e3ebdSchin #ifdef SIGTSTP
2187c2fbfb3SApril Chin #define HAD_SIGTSTP	1
219da2e3ebdSchin "Stopped",			"TSTP",		SIGTSTP,
220da2e3ebdSchin #endif
221da2e3ebdSchin #ifdef SIGTTIN
2227c2fbfb3SApril Chin #define HAD_SIGTTIN	1
223da2e3ebdSchin "Stopped (tty input)",		"TTIN",		SIGTTIN,
224da2e3ebdSchin #endif
225da2e3ebdSchin #ifdef SIGTTOU
2267c2fbfb3SApril Chin #define HAD_SIGTTOU	1
227da2e3ebdSchin "Stopped (tty output)",		"TTOU",		SIGTTOU,
228da2e3ebdSchin #endif
229da2e3ebdSchin #ifdef SIGURG
2307c2fbfb3SApril Chin #define HAD_SIGURG	1
231da2e3ebdSchin "Urgent IO",			"URG",		SIGURG,
232da2e3ebdSchin #endif
233da2e3ebdSchin #ifdef SIGUSR1
2347c2fbfb3SApril Chin #define HAD_SIGUSR1	1
235da2e3ebdSchin "User signal 1",		"USR1",		SIGUSR1,
236da2e3ebdSchin #endif
237da2e3ebdSchin #ifdef SIGUSR2
2387c2fbfb3SApril Chin #define HAD_SIGUSR2	1
239da2e3ebdSchin "User signal 2",		"USR2",		SIGUSR2,
240da2e3ebdSchin #endif
241da2e3ebdSchin #ifdef SIGVTALRM
2427c2fbfb3SApril Chin #define HAD_SIGVTALRM	1
243da2e3ebdSchin "Virtual timer alarm",		"VTALRM",	SIGVTALRM,
244da2e3ebdSchin #endif
245da2e3ebdSchin #ifdef SIGWAITING
2467c2fbfb3SApril Chin #define HAD_SIGWAITING	1
247da2e3ebdSchin "All threads blocked",		"WAITING",	SIGWAITING,
248da2e3ebdSchin #endif
249da2e3ebdSchin #ifdef SIGWINCH
2507c2fbfb3SApril Chin #define HAD_SIGWINCH	1
251da2e3ebdSchin "Window change", 		"WINCH",	SIGWINCH,
252da2e3ebdSchin #endif
253da2e3ebdSchin #ifdef SIGWIND
2547c2fbfb3SApril Chin #define HAD_SIGWIND	1
255da2e3ebdSchin "Window change",		"WIND",		SIGWIND,
256da2e3ebdSchin #endif
257da2e3ebdSchin #ifdef SIGWINDOW
2587c2fbfb3SApril Chin #define HAD_SIGWINDOW	1
259da2e3ebdSchin "Window change",		"WINDOW",	SIGWINDOW,
260da2e3ebdSchin #endif
261da2e3ebdSchin #ifdef SIGXCPU
2627c2fbfb3SApril Chin #define HAD_SIGXCPU	1
263da2e3ebdSchin "CPU time limit",		"XCPU",		SIGXCPU,
264da2e3ebdSchin #endif
265da2e3ebdSchin #ifdef SIGXFSZ
2667c2fbfb3SApril Chin #define HAD_SIGXFSZ	1
267da2e3ebdSchin "File size limit",		"XFSZ",		SIGXFSZ,
268da2e3ebdSchin #endif
2697c2fbfb3SApril Chin #include "FEATURE/siglist"
270da2e3ebdSchin 0
271da2e3ebdSchin };
272da2e3ebdSchin 
273da2e3ebdSchin #define RANGE_MIN	(1<<14)
274da2e3ebdSchin #define RANGE_MAX	(1<<13)
275da2e3ebdSchin #define RANGE_RT	(1<<12)
276da2e3ebdSchin 
277da2e3ebdSchin #define RANGE_SIG	(~(RANGE_MIN|RANGE_MAX|RANGE_RT))
278da2e3ebdSchin 
2797c2fbfb3SApril Chin static int		mapindex[1024];
2807c2fbfb3SApril Chin 
2817c2fbfb3SApril Chin #if _lib_strsignal
2827c2fbfb3SApril Chin extern char*		strsignal(int);
2837c2fbfb3SApril Chin #endif
284da2e3ebdSchin 
285da2e3ebdSchin int
main()286da2e3ebdSchin main()
287da2e3ebdSchin {
288da2e3ebdSchin 	register int	i;
289da2e3ebdSchin 	register int	j;
290da2e3ebdSchin 	register int	k;
2917c2fbfb3SApril Chin 	int		m;
292da2e3ebdSchin 	int		n;
2937c2fbfb3SApril Chin #if _lib_strsignal
2947c2fbfb3SApril Chin 	char*		s;
2957c2fbfb3SApril Chin #endif
296da2e3ebdSchin 
297da2e3ebdSchin 	k = 0;
298da2e3ebdSchin 	for (i = 0; map[i].name; i++)
2997c2fbfb3SApril Chin 		if ((j = map[i].value) > 0 && j < elementsof(mapindex) && !mapindex[j])
300da2e3ebdSchin 		{
3017c2fbfb3SApril Chin 			if (j > k)
3027c2fbfb3SApril Chin 				k = j;
3037c2fbfb3SApril Chin 			mapindex[j] = i;
304da2e3ebdSchin 		}
305da2e3ebdSchin #ifdef SIGRTMIN
306da2e3ebdSchin 	i = SIGRTMIN;
307da2e3ebdSchin #ifdef SIGRTMAX
308da2e3ebdSchin 	j = SIGRTMAX;
309da2e3ebdSchin #else
310da2e3ebdSchin 	j = i;
311da2e3ebdSchin #endif
3127c2fbfb3SApril Chin 	if (j >= elementsof(mapindex))
3137c2fbfb3SApril Chin 		j = elementsof(mapindex) - 1;
3147c2fbfb3SApril Chin 	if (i <= j && i > 0 && i < elementsof(mapindex) && j > 0 && j < elementsof(mapindex))
315da2e3ebdSchin 	{
3167c2fbfb3SApril Chin 		if (j > k)
3177c2fbfb3SApril Chin 			k = j;
3187c2fbfb3SApril Chin 		mapindex[i] = RANGE_MIN | RANGE_RT;
319da2e3ebdSchin 		n = 1;
320da2e3ebdSchin 		while (++i < j)
3217c2fbfb3SApril Chin 			mapindex[i] = RANGE_RT | n++;
3227c2fbfb3SApril Chin 		mapindex[j] = RANGE_MAX | RANGE_RT | n;
323da2e3ebdSchin 	}
324da2e3ebdSchin #endif
325da2e3ebdSchin 	printf("#pragma prototyped\n");
326da2e3ebdSchin 	printf("#define SIG_MAX	%d\n", k);
327da2e3ebdSchin 	printf("\n");
328da2e3ebdSchin 	printf("static const char* const	sig_name[] =\n");
329da2e3ebdSchin 	printf("{\n");
330da2e3ebdSchin 	for (i = 0; i <= k; i++)
3317c2fbfb3SApril Chin 		if (!(j = mapindex[i]))
3327c2fbfb3SApril Chin 			printf("	\"%d\",\n", i);
333da2e3ebdSchin 		else if (j & RANGE_RT)
334da2e3ebdSchin 		{
3357c2fbfb3SApril Chin 			if (j & RANGE_MIN)
3367c2fbfb3SApril Chin 				printf("	\"RTMIN\",\n");
3377c2fbfb3SApril Chin 			else if (j & RANGE_MAX)
3387c2fbfb3SApril Chin 				printf("	\"RTMAX\",\n");
3397c2fbfb3SApril Chin 			else
3407c2fbfb3SApril Chin 			{
3417c2fbfb3SApril Chin 				m = j & RANGE_SIG;
3427c2fbfb3SApril Chin 				if (m > n / 2)
3437c2fbfb3SApril Chin 					printf("	\"RTMAX-%d\",\n", n - m);
3447c2fbfb3SApril Chin 				else
3457c2fbfb3SApril Chin 					printf("	\"RTMIN+%d\",\n", m);
346da2e3ebdSchin 			}
3477c2fbfb3SApril Chin 		}
3487c2fbfb3SApril Chin 		else
3497c2fbfb3SApril Chin 			printf("	\"%s\",\n", map[j].name);
350da2e3ebdSchin 	printf("	0\n");
351da2e3ebdSchin 	printf("};\n");
352da2e3ebdSchin 	printf("\n");
353da2e3ebdSchin 	printf("static const char* const	sig_text[] =\n");
354da2e3ebdSchin 	printf("{\n");
355da2e3ebdSchin 	for (i = 0; i <= k; i++)
3567c2fbfb3SApril Chin 		if (!(j = mapindex[i]))
3577c2fbfb3SApril Chin 			printf("	\"Signal %d\",\n", i);
3587c2fbfb3SApril Chin 		else if (j & RANGE_RT)
3597c2fbfb3SApril Chin 			printf("	\"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
3607c2fbfb3SApril Chin 		else if (map[j].text)
3617c2fbfb3SApril Chin 			printf("	\"%s\",\n", map[j].text);
3627c2fbfb3SApril Chin #if _lib_strsignal
3637c2fbfb3SApril Chin 		else if (s = strsignal(i))
3647c2fbfb3SApril Chin 			printf("	\"%s\",\n", s);
3657c2fbfb3SApril Chin #endif
3667c2fbfb3SApril Chin 		else
3677c2fbfb3SApril Chin 			printf("	\"Signal %d\",\n", i);
368da2e3ebdSchin 	printf("	0\n");
369da2e3ebdSchin 	printf("};\n");
370da2e3ebdSchin 	return 0;
371da2e3ebdSchin }
372