xref: /onnv-gate/usr/src/lib/libast/common/features/signal.c (revision 4887:feebf9260c2e)
1*4887Schin /***********************************************************************
2*4887Schin *                                                                      *
3*4887Schin *               This software is part of the ast package               *
4*4887Schin *           Copyright (c) 1985-2007 AT&T Knowledge Ventures            *
5*4887Schin *                      and is licensed under the                       *
6*4887Schin *                  Common Public License, Version 1.0                  *
7*4887Schin *                      by AT&T Knowledge Ventures                      *
8*4887Schin *                                                                      *
9*4887Schin *                A copy of the License is available at                 *
10*4887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11*4887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*4887Schin *                                                                      *
13*4887Schin *              Information and Software Systems Research               *
14*4887Schin *                            AT&T Research                             *
15*4887Schin *                           Florham Park NJ                            *
16*4887Schin *                                                                      *
17*4887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
18*4887Schin *                  David Korn <dgk@research.att.com>                   *
19*4887Schin *                   Phong Vo <kpv@research.att.com>                    *
20*4887Schin *                                                                      *
21*4887Schin ***********************************************************************/
22*4887Schin #pragma prototyped
23*4887Schin /*
24*4887Schin  * Glenn Fowler
25*4887Schin  * AT&T Bell Laboratories
26*4887Schin  *
27*4887Schin  * generate signal features
28*4887Schin  */
29*4887Schin 
30*4887Schin #include <signal.h>
31*4887Schin 
32*4887Schin struct _m_
33*4887Schin {
34*4887Schin 	char*		text;
35*4887Schin 	char*		name;
36*4887Schin 	int		value;
37*4887Schin };
38*4887Schin 
39*4887Schin #define elementsof(x)	(sizeof(x)/sizeof(x[0]))
40*4887Schin 
41*4887Schin static struct _m_ map[] =
42*4887Schin {
43*4887Schin #ifdef SIGABRT
44*4887Schin "Abort",			"ABRT",		SIGABRT,
45*4887Schin #endif
46*4887Schin #ifdef SIGAIO
47*4887Schin "Asynchronous I/O",		"AIO",		SIGAIO,
48*4887Schin #endif
49*4887Schin #ifdef SIGALRM
50*4887Schin "Alarm call",			"ALRM",		SIGALRM,
51*4887Schin #endif
52*4887Schin #ifdef SIGAPOLLO
53*4887Schin "Apollo",			"APOLLO",	SIGAPOLLO,
54*4887Schin #endif
55*4887Schin #ifdef SIGBUS
56*4887Schin "Bus error",			"BUS",		SIGBUS,
57*4887Schin #endif
58*4887Schin #ifdef SIGCHLD
59*4887Schin "Child status change",		"CHLD",		SIGCHLD,
60*4887Schin #endif
61*4887Schin #ifdef SIGCLD
62*4887Schin "Death of child", 		"CLD",		SIGCLD,
63*4887Schin #endif
64*4887Schin #ifdef SIGCONT
65*4887Schin "Stopped process continued",	"CONT",		SIGCONT,
66*4887Schin #endif
67*4887Schin #ifdef SIGDANGER
68*4887Schin "System crash soon",		"DANGER",	SIGDANGER,
69*4887Schin #endif
70*4887Schin #ifdef SIGDEBUG
71*4887Schin "Debug trap",			"DEBUG",	SIGDEBUG,
72*4887Schin #endif
73*4887Schin #ifdef SIGDIL
74*4887Schin "DIL trap",			"DIL",		SIGDIL,
75*4887Schin #endif
76*4887Schin #ifdef SIGEMT
77*4887Schin "EMT trap",			"EMT",		SIGEMT,
78*4887Schin #endif
79*4887Schin #ifdef SIGERR
80*4887Schin "ERR trap",			"ERR",		SIGERR,
81*4887Schin #endif
82*4887Schin #ifdef SIGEXIT
83*4887Schin "Exit",				"EXIT",		SIGEXIT,
84*4887Schin #endif
85*4887Schin #ifdef SIGFPE
86*4887Schin "Floating exception",		"FPE",		SIGFPE,
87*4887Schin #endif
88*4887Schin #ifdef SIGFREEZE
89*4887Schin "CPR freeze",			"FREEZE",	SIGFREEZE,
90*4887Schin #endif
91*4887Schin #ifdef SIGHUP
92*4887Schin "Hangup",			"HUP",		SIGHUP,
93*4887Schin #endif
94*4887Schin #ifdef SIGILL
95*4887Schin "Illegal instruction",		"ILL",		SIGILL,
96*4887Schin #endif
97*4887Schin #ifdef SIGINT
98*4887Schin "Interrupt",			"INT",		SIGINT,
99*4887Schin #endif
100*4887Schin #ifdef SIGIO
101*4887Schin "IO possible",			"IO",		SIGIO,
102*4887Schin #endif
103*4887Schin #ifdef SIGIOT
104*4887Schin "IOT trap",			"IOT",		SIGIOT,
105*4887Schin #endif
106*4887Schin #ifdef SIGKILL
107*4887Schin "Killed",			"KILL",		SIGKILL,
108*4887Schin #endif
109*4887Schin #ifdef SIGLAB
110*4887Schin "Security label changed",	"LAB",		SIGLAB,
111*4887Schin #endif
112*4887Schin #ifdef SIGLOST
113*4887Schin "Resources lost",		"LOST",		SIGLOST,
114*4887Schin #endif
115*4887Schin #ifdef SIGLWP
116*4887Schin "Thread event",			"LWP",		SIGLWP,
117*4887Schin #endif
118*4887Schin #ifdef SIGMIGRATE
119*4887Schin "Migrate process",		"MIGRATE",	SIGMIGRATE,
120*4887Schin #endif
121*4887Schin #ifdef SIGPHONE
122*4887Schin "Phone status change",		"PHONE",	SIGPHONE,
123*4887Schin #endif
124*4887Schin #ifdef SIGPIPE
125*4887Schin "Broken pipe",			"PIPE",		SIGPIPE,
126*4887Schin #endif
127*4887Schin #ifdef SIGPOLL
128*4887Schin "Poll event",			"POLL",		SIGPOLL,
129*4887Schin #endif
130*4887Schin #ifdef SIGPROF
131*4887Schin "Profile timer alarm",		"PROF",		SIGPROF,
132*4887Schin #endif
133*4887Schin #ifdef SIGPWR
134*4887Schin "Power fail",			"PWR",		SIGPWR,
135*4887Schin #endif
136*4887Schin #ifdef SIGQUIT
137*4887Schin "Quit",				"QUIT",		SIGQUIT,
138*4887Schin #endif
139*4887Schin #ifdef SIGSEGV
140*4887Schin "Memory fault",			"SEGV",		SIGSEGV,
141*4887Schin #endif
142*4887Schin #ifdef SIGSOUND
143*4887Schin "Sound completed",		"SOUND",	SIGSOUND,
144*4887Schin #endif
145*4887Schin #ifdef SIGSSTOP
146*4887Schin "Sendable stop",		"SSTOP",	SIGSSTOP,
147*4887Schin #endif
148*4887Schin #ifdef gould
149*4887Schin "Stack overflow",		"STKOV",	28,
150*4887Schin #endif
151*4887Schin #ifdef SIGSTOP
152*4887Schin "Stopped (signal)",		"STOP",		SIGSTOP,
153*4887Schin #endif
154*4887Schin #ifdef SIGSYS
155*4887Schin "Bad system call", 		"SYS",		SIGSYS,
156*4887Schin #endif
157*4887Schin #ifdef SIGTERM
158*4887Schin "Terminated",			"TERM",		SIGTERM,
159*4887Schin #endif
160*4887Schin #ifdef SIGTHAW
161*4887Schin "CPR thaw",			"THAW",		SIGTHAW,
162*4887Schin #endif
163*4887Schin #ifdef SIGTINT
164*4887Schin "Interrupt (terminal)",		"TINT",		SIGTINT,
165*4887Schin #endif
166*4887Schin #ifdef SIGTRAP
167*4887Schin "Trace trap",			"TRAP",		SIGTRAP,
168*4887Schin #endif
169*4887Schin #ifdef SIGTSTP
170*4887Schin "Stopped",			"TSTP",		SIGTSTP,
171*4887Schin #endif
172*4887Schin #ifdef SIGTTIN
173*4887Schin "Stopped (tty input)",		"TTIN",		SIGTTIN,
174*4887Schin #endif
175*4887Schin #ifdef SIGTTOU
176*4887Schin "Stopped (tty output)",		"TTOU",		SIGTTOU,
177*4887Schin #endif
178*4887Schin #ifdef SIGURG
179*4887Schin "Urgent IO",			"URG",		SIGURG,
180*4887Schin #endif
181*4887Schin #ifdef SIGUSR1
182*4887Schin "User signal 1",		"USR1",		SIGUSR1,
183*4887Schin #endif
184*4887Schin #ifdef SIGUSR2
185*4887Schin "User signal 2",		"USR2",		SIGUSR2,
186*4887Schin #endif
187*4887Schin #ifdef SIGVTALRM
188*4887Schin "Virtual timer alarm",		"VTALRM",	SIGVTALRM,
189*4887Schin #endif
190*4887Schin #ifdef SIGWAITING
191*4887Schin "All threads blocked",		"WAITING",	SIGWAITING,
192*4887Schin #endif
193*4887Schin #ifdef SIGWINCH
194*4887Schin "Window change", 		"WINCH",	SIGWINCH,
195*4887Schin #endif
196*4887Schin #ifdef SIGWIND
197*4887Schin "Window change",		"WIND",		SIGWIND,
198*4887Schin #endif
199*4887Schin #ifdef SIGWINDOW
200*4887Schin "Window change",		"WINDOW",	SIGWINDOW,
201*4887Schin #endif
202*4887Schin #ifdef SIGXCPU
203*4887Schin "CPU time limit",		"XCPU",		SIGXCPU,
204*4887Schin #endif
205*4887Schin #ifdef SIGXFSZ
206*4887Schin "File size limit",		"XFSZ",		SIGXFSZ,
207*4887Schin #endif
208*4887Schin 0
209*4887Schin };
210*4887Schin 
211*4887Schin #define RANGE_MIN	(1<<14)
212*4887Schin #define RANGE_MAX	(1<<13)
213*4887Schin #define RANGE_RT	(1<<12)
214*4887Schin 
215*4887Schin #define RANGE_SIG	(~(RANGE_MIN|RANGE_MAX|RANGE_RT))
216*4887Schin 
217*4887Schin static int		index[64];
218*4887Schin 
219*4887Schin int
220*4887Schin main()
221*4887Schin {
222*4887Schin 	register int	i;
223*4887Schin 	register int	j;
224*4887Schin 	register int	k;
225*4887Schin 	int		n;
226*4887Schin 
227*4887Schin 	k = 0;
228*4887Schin 	for (i = 0; map[i].name; i++)
229*4887Schin 		if ((j = map[i].value) > 0 && j < elementsof(index) && !index[j])
230*4887Schin 		{
231*4887Schin 			if (j > k) k = j;
232*4887Schin 			index[j] = i;
233*4887Schin 		}
234*4887Schin #ifdef SIGRTMIN
235*4887Schin 	i = SIGRTMIN;
236*4887Schin #ifdef SIGRTMAX
237*4887Schin 	j = SIGRTMAX;
238*4887Schin #else
239*4887Schin 	j = i;
240*4887Schin #endif
241*4887Schin 	if (j >= elementsof(index)) j = elementsof(index) - 1;
242*4887Schin 	if (i <= j && i > 0 && i < elementsof(index) && j > 0 && j < elementsof(index))
243*4887Schin 	{
244*4887Schin 		if (j > k) k = j;
245*4887Schin 		index[i] = RANGE_MIN | RANGE_RT;
246*4887Schin 		n = 1;
247*4887Schin 		while (++i < j)
248*4887Schin 			index[i] = RANGE_RT | n++;
249*4887Schin 		index[j] = RANGE_MAX | RANGE_RT | n;
250*4887Schin 	}
251*4887Schin #endif
252*4887Schin 	printf("#pragma prototyped\n");
253*4887Schin 	printf("#define SIG_MAX	%d\n", k);
254*4887Schin 	printf("\n");
255*4887Schin 	printf("static const char* const	sig_name[] =\n");
256*4887Schin 	printf("{\n");
257*4887Schin 	for (i = 0; i <= k; i++)
258*4887Schin 		if (!(j = index[i])) printf("	\"%d\",\n", i);
259*4887Schin 		else if (j & RANGE_RT)
260*4887Schin 		{
261*4887Schin 			if (j & RANGE_MIN) printf("	\"RTMIN\",\n");
262*4887Schin 			else if (j & RANGE_MAX) printf("	\"RTMAX\",\n");
263*4887Schin 			else printf("	\"RT%d\",\n", j & RANGE_SIG);
264*4887Schin 		}
265*4887Schin 		else printf("	\"%s\",\n", map[j].name);
266*4887Schin 	printf("	0\n");
267*4887Schin 	printf("};\n");
268*4887Schin 	printf("\n");
269*4887Schin 	printf("static const char* const	sig_text[] =\n");
270*4887Schin 	printf("{\n");
271*4887Schin 	for (i = 0; i <= k; i++)
272*4887Schin 		if (!(j = index[i])) printf("	\"Signal %d\",\n", i);
273*4887Schin 		else if (j & RANGE_RT) printf("	\"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
274*4887Schin 		else printf("	\"%s\",\n", map[j].text);
275*4887Schin 	printf("	0\n");
276*4887Schin 	printf("};\n");
277*4887Schin 	return 0;
278*4887Schin }
279