xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/features/signal.c (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2012 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                  David Korn <dgk@research.att.com>                   *
19 *                   Phong Vo <kpv@research.att.com>                    *
20 *                                                                      *
21 ***********************************************************************/
22 #pragma prototyped
23 /*
24  * Glenn Fowler
25  * AT&T Research
26  *
27  * generate signal features
28  */
29 
30 #include "FEATURE/standards"
31 
32 #define strsignal	______strsignal
33 
34 #include <signal.h>
35 
36 #undef	strsignal
37 
38 struct _m_
39 {
40 	char*		text;
41 	char*		name;
42 	int		value;
43 };
44 
45 #define elementsof(x)	(sizeof(x)/sizeof(x[0]))
46 
47 static struct _m_ map[] =
48 {
49 #ifdef SIGABRT
50 #define HAD_SIGABRT	1
51 "Abort",			"ABRT",		SIGABRT,
52 #endif
53 #ifdef SIGAIO
54 #define HAD_SIGAIO	1
55 "Asynchronous I/O",		"AIO",		SIGAIO,
56 #endif
57 #ifdef SIGALRM
58 #define HAD_SIGALRM	1
59 "Alarm call",			"ALRM",		SIGALRM,
60 #endif
61 #ifdef SIGAPOLLO
62 #define HAD_SIGAPOLLO	1
63 "Apollo",			"APOLLO",	SIGAPOLLO,
64 #endif
65 #ifdef SIGBUS
66 #define HAD_SIGBUS	1
67 "Bus error",			"BUS",		SIGBUS,
68 #endif
69 #ifdef SIGCHLD
70 #define HAD_SIGCHLD	1
71 "Child status change",		"CHLD",		SIGCHLD,
72 #endif
73 #ifdef SIGCLD
74 #define HAD_SIGCLD	1
75 "Death of child", 		"CLD",		SIGCLD,
76 #endif
77 #ifdef SIGCONT
78 #define HAD_SIGCONT	1
79 "Stopped process continued",	"CONT",		SIGCONT,
80 #endif
81 #ifdef SIGDANGER
82 #define HAD_SIGDANGER	1
83 "System crash soon",		"DANGER",	SIGDANGER,
84 #endif
85 #ifdef SIGDEBUG
86 #define HAD_SIGDEBUG	1
87 "Debug trap",			"DEBUG",	SIGDEBUG,
88 #endif
89 #ifdef SIGDIL
90 #define HAD_SIGDIL	1
91 "DIL trap",			"DIL",		SIGDIL,
92 #endif
93 #ifdef SIGEMT
94 #define HAD_SIGEMT	1
95 "EMT trap",			"EMT",		SIGEMT,
96 #endif
97 #ifdef SIGERR
98 #define HAD_SIGERR	1
99 "ERR trap",			"ERR",		SIGERR,
100 #endif
101 #ifdef SIGEXIT
102 #define HAD_SIGEXIT	1
103 "Exit",				"EXIT",		SIGEXIT,
104 #endif
105 #ifdef SIGFPE
106 #define HAD_SIGFPE	1
107 "Floating exception",		"FPE",		SIGFPE,
108 #endif
109 #ifdef SIGFREEZE
110 #define HAD_SIGFREEZE	1
111 "CPR freeze",			"FREEZE",	SIGFREEZE,
112 #endif
113 #ifdef SIGHUP
114 #define HAD_SIGHUP	1
115 "Hangup",			"HUP",		SIGHUP,
116 #endif
117 #ifdef SIGILL
118 #define HAD_SIGILL	1
119 "Illegal instruction",		"ILL",		SIGILL,
120 #endif
121 #ifdef SIGINT
122 #define HAD_SIGINT	1
123 "Interrupt",			"INT",		SIGINT,
124 #endif
125 #ifdef SIGIO
126 #define HAD_SIGIO	1
127 "IO possible",			"IO",		SIGIO,
128 #endif
129 #ifdef SIGIOT
130 #define HAD_SIGIOT	1
131 "IOT trap",			"IOT",		SIGIOT,
132 #endif
133 #ifdef SIGKILL
134 #define HAD_SIGKILL	1
135 "Killed",			"KILL",		SIGKILL,
136 #endif
137 #ifdef SIGLAB
138 #define HAD_SIGLAB	1
139 "Security label changed",	"LAB",		SIGLAB,
140 #endif
141 #ifdef SIGLOST
142 #define HAD_SIGLOST	1
143 "Resources lost",		"LOST",		SIGLOST,
144 #endif
145 #ifdef SIGLWP
146 #define HAD_SIGLWP	1
147 "Thread event",			"LWP",		SIGLWP,
148 #endif
149 #ifdef SIGMIGRATE
150 #define HAD_SIGMIGRATE	1
151 "Migrate process",		"MIGRATE",	SIGMIGRATE,
152 #endif
153 #ifdef SIGPHONE
154 #define HAD_SIGPHONE	1
155 "Phone status change",		"PHONE",	SIGPHONE,
156 #endif
157 #ifdef SIGPIPE
158 #define HAD_SIGPIPE	1
159 "Broken pipe",			"PIPE",		SIGPIPE,
160 #endif
161 #ifdef SIGPOLL
162 #define HAD_SIGPOLL	1
163 "Poll event",			"POLL",		SIGPOLL,
164 #endif
165 #ifdef SIGPROF
166 #define HAD_SIGPROF	1
167 "Profile timer alarm",		"PROF",		SIGPROF,
168 #endif
169 #ifdef SIGPWR
170 #define HAD_SIGPWR	1
171 "Power fail",			"PWR",		SIGPWR,
172 #endif
173 #ifdef SIGQUIT
174 #define HAD_SIGQUIT	1
175 "Quit",				"QUIT",		SIGQUIT,
176 #endif
177 #ifdef SIGSEGV
178 #define HAD_SIGSEGV	1
179 "Memory fault",			"SEGV",		SIGSEGV,
180 #endif
181 #ifdef SIGSOUND
182 #define HAD_SIGSOUND	1
183 "Sound completed",		"SOUND",	SIGSOUND,
184 #endif
185 #ifdef SIGSSTOP
186 #define HAD_SIGSSTOP	1
187 "Sendable stop",		"SSTOP",	SIGSSTOP,
188 #endif
189 #ifdef SIGSTKFLT
190 #define HAD_SIGSTKFLT	1
191 "Stack fault",			"STKFLT",	SIGSTKFLT,
192 #endif
193 #ifdef gould
194 #define HAD_gould	1
195 "Stack overflow",		"STKOV",	28,
196 #endif
197 #ifdef SIGSTOP
198 #define HAD_SIGSTOP	1
199 "Stopped (signal)",		"STOP",		SIGSTOP,
200 #endif
201 #ifdef SIGSYS
202 #define HAD_SIGSYS	1
203 "Bad system call", 		"SYS",		SIGSYS,
204 #endif
205 #ifdef SIGTERM
206 #define HAD_SIGTERM	1
207 "Terminated",			"TERM",		SIGTERM,
208 #endif
209 #ifdef SIGTHAW
210 #define HAD_SIGTHAW	1
211 "CPR thaw",			"THAW",		SIGTHAW,
212 #endif
213 #ifdef SIGTINT
214 #define HAD_SIGTINT	1
215 "Interrupt (terminal)",		"TINT",		SIGTINT,
216 #endif
217 #ifdef SIGTRAP
218 #define HAD_SIGTRAP	1
219 "Trace trap",			"TRAP",		SIGTRAP,
220 #endif
221 #ifdef SIGTSTP
222 #define HAD_SIGTSTP	1
223 "Stopped",			"TSTP",		SIGTSTP,
224 #endif
225 #ifdef SIGTTIN
226 #define HAD_SIGTTIN	1
227 "Stopped (tty input)",		"TTIN",		SIGTTIN,
228 #endif
229 #ifdef SIGTTOU
230 #define HAD_SIGTTOU	1
231 "Stopped (tty output)",		"TTOU",		SIGTTOU,
232 #endif
233 #ifdef SIGURG
234 #define HAD_SIGURG	1
235 "Urgent IO",			"URG",		SIGURG,
236 #endif
237 #ifdef SIGUSR1
238 #define HAD_SIGUSR1	1
239 "User signal 1",		"USR1",		SIGUSR1,
240 #endif
241 #ifdef SIGUSR2
242 #define HAD_SIGUSR2	1
243 "User signal 2",		"USR2",		SIGUSR2,
244 #endif
245 #ifdef SIGVTALRM
246 #define HAD_SIGVTALRM	1
247 "Virtual timer alarm",		"VTALRM",	SIGVTALRM,
248 #endif
249 #ifdef SIGWAITING
250 #define HAD_SIGWAITING	1
251 "All threads blocked",		"WAITING",	SIGWAITING,
252 #endif
253 #ifdef SIGWINCH
254 #define HAD_SIGWINCH	1
255 "Window change", 		"WINCH",	SIGWINCH,
256 #endif
257 #ifdef SIGWIND
258 #define HAD_SIGWIND	1
259 "Window change",		"WIND",		SIGWIND,
260 #endif
261 #ifdef SIGWINDOW
262 #define HAD_SIGWINDOW	1
263 "Window change",		"WINDOW",	SIGWINDOW,
264 #endif
265 #ifdef SIGXCPU
266 #define HAD_SIGXCPU	1
267 "CPU time limit",		"XCPU",		SIGXCPU,
268 #endif
269 #ifdef SIGXFSZ
270 #define HAD_SIGXFSZ	1
271 "File size limit",		"XFSZ",		SIGXFSZ,
272 #endif
273 #include "FEATURE/siglist"
274 0
275 };
276 
277 #define RANGE_MIN	(1<<14)
278 #define RANGE_MAX	(1<<13)
279 #define RANGE_RT	(1<<12)
280 
281 #define RANGE_SIG	(~(RANGE_MIN|RANGE_MAX|RANGE_RT))
282 
283 static int		mapindex[1024];
284 
285 #if _lib_strsignal
286 extern char*		strsignal(int);
287 #endif
288 
289 int
main()290 main()
291 {
292 	register int	i;
293 	register int	j;
294 	register int	k;
295 	int		m;
296 	int		n;
297 #if _lib_strsignal
298 	char*		s;
299 #endif
300 
301 	k = 0;
302 	for (i = 0; map[i].name; i++)
303 		if ((j = map[i].value) > 0 && j < elementsof(mapindex) && !mapindex[j])
304 		{
305 			if (j > k)
306 				k = j;
307 			mapindex[j] = i;
308 		}
309 #ifdef SIGRTMIN
310 	i = _SIGRTMIN;
311 #ifdef SIGRTMAX
312 	j = _SIGRTMAX;
313 #else
314 	j = i;
315 #endif
316 	if (j >= elementsof(mapindex))
317 		j = elementsof(mapindex) - 1;
318 	if (i <= j && i > 0 && i < elementsof(mapindex) && j > 0 && j < elementsof(mapindex))
319 	{
320 		if (j > k)
321 			k = j;
322 		mapindex[i] = RANGE_MIN | RANGE_RT;
323 		n = 1;
324 		while (++i < j)
325 			mapindex[i] = RANGE_RT | n++;
326 		mapindex[j] = RANGE_MAX | RANGE_RT | n;
327 	}
328 #endif
329 	printf("#pragma prototyped\n");
330 	printf("#define SIG_MAX	%d\n", k);
331 	printf("\n");
332 	printf("static const char* const	sig_name[] =\n");
333 	printf("{\n");
334 	for (i = 0; i <= k; i++)
335 		if (!(j = mapindex[i]))
336 			printf("	\"%d\",\n", i);
337 		else if (j & RANGE_RT)
338 		{
339 			if (j & RANGE_MIN)
340 				printf("	\"RTMIN\",\n");
341 			else if (j & RANGE_MAX)
342 				printf("	\"RTMAX\",\n");
343 			else
344 			{
345 				m = j & RANGE_SIG;
346 				if (m > n / 2)
347 					printf("	\"RTMAX-%d\",\n", n - m);
348 				else
349 					printf("	\"RTMIN+%d\",\n", m);
350 			}
351 		}
352 		else
353 			printf("	\"%s\",\n", map[j].name);
354 	printf("	0\n");
355 	printf("};\n");
356 	printf("\n");
357 	printf("static const char* const	sig_text[] =\n");
358 	printf("{\n");
359 	for (i = 0; i <= k; i++)
360 		if (!(j = mapindex[i]))
361 			printf("	\"Signal %d\",\n", i);
362 		else if (j & RANGE_RT)
363 			printf("	\"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
364 		else if (map[j].text)
365 			printf("	\"%s\",\n", map[j].text);
366 #if _lib_strsignal
367 		else if (s = strsignal(i))
368 			printf("	\"%s\",\n", s);
369 #endif
370 		else
371 			printf("	\"Signal %d\",\n", i);
372 	printf("	0\n");
373 	printf("};\n");
374 	return 0;
375 }
376