xref: /onnv-gate/usr/src/lib/libast/common/features/signal.c (revision 8462:6e341f5569ba)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*8462SApril.Chin@Sun.COM *          Copyright (c) 1985-2008 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
7*8462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
184887Schin *                  David Korn <dgk@research.att.com>                   *
194887Schin *                   Phong Vo <kpv@research.att.com>                    *
204887Schin *                                                                      *
214887Schin ***********************************************************************/
224887Schin #pragma prototyped
234887Schin /*
244887Schin  * Glenn Fowler
25*8462SApril.Chin@Sun.COM  * AT&T Research
264887Schin  *
274887Schin  * generate signal features
284887Schin  */
294887Schin 
30*8462SApril.Chin@Sun.COM #include "FEATURE/standards"
31*8462SApril.Chin@Sun.COM 
32*8462SApril.Chin@Sun.COM #define strsignal	______strsignal
33*8462SApril.Chin@Sun.COM 
344887Schin #include <signal.h>
354887Schin 
36*8462SApril.Chin@Sun.COM #undef	strsignal
37*8462SApril.Chin@Sun.COM 
384887Schin struct _m_
394887Schin {
404887Schin 	char*		text;
414887Schin 	char*		name;
424887Schin 	int		value;
434887Schin };
444887Schin 
454887Schin #define elementsof(x)	(sizeof(x)/sizeof(x[0]))
464887Schin 
474887Schin static struct _m_ map[] =
484887Schin {
494887Schin #ifdef SIGABRT
50*8462SApril.Chin@Sun.COM #define HAD_SIGABRT	1
514887Schin "Abort",			"ABRT",		SIGABRT,
524887Schin #endif
534887Schin #ifdef SIGAIO
54*8462SApril.Chin@Sun.COM #define HAD_SIGAIO	1
554887Schin "Asynchronous I/O",		"AIO",		SIGAIO,
564887Schin #endif
574887Schin #ifdef SIGALRM
58*8462SApril.Chin@Sun.COM #define HAD_SIGALRM	1
594887Schin "Alarm call",			"ALRM",		SIGALRM,
604887Schin #endif
614887Schin #ifdef SIGAPOLLO
62*8462SApril.Chin@Sun.COM #define HAD_SIGAPOLLO	1
634887Schin "Apollo",			"APOLLO",	SIGAPOLLO,
644887Schin #endif
654887Schin #ifdef SIGBUS
66*8462SApril.Chin@Sun.COM #define HAD_SIGBUS	1
674887Schin "Bus error",			"BUS",		SIGBUS,
684887Schin #endif
694887Schin #ifdef SIGCHLD
70*8462SApril.Chin@Sun.COM #define HAD_SIGCHLD	1
714887Schin "Child status change",		"CHLD",		SIGCHLD,
724887Schin #endif
734887Schin #ifdef SIGCLD
74*8462SApril.Chin@Sun.COM #define HAD_SIGCLD	1
754887Schin "Death of child", 		"CLD",		SIGCLD,
764887Schin #endif
774887Schin #ifdef SIGCONT
78*8462SApril.Chin@Sun.COM #define HAD_SIGCONT	1
794887Schin "Stopped process continued",	"CONT",		SIGCONT,
804887Schin #endif
814887Schin #ifdef SIGDANGER
82*8462SApril.Chin@Sun.COM #define HAD_SIGDANGER	1
834887Schin "System crash soon",		"DANGER",	SIGDANGER,
844887Schin #endif
854887Schin #ifdef SIGDEBUG
86*8462SApril.Chin@Sun.COM #define HAD_SIGDEBUG	1
874887Schin "Debug trap",			"DEBUG",	SIGDEBUG,
884887Schin #endif
894887Schin #ifdef SIGDIL
90*8462SApril.Chin@Sun.COM #define HAD_SIGDIL	1
914887Schin "DIL trap",			"DIL",		SIGDIL,
924887Schin #endif
934887Schin #ifdef SIGEMT
94*8462SApril.Chin@Sun.COM #define HAD_SIGEMT	1
954887Schin "EMT trap",			"EMT",		SIGEMT,
964887Schin #endif
974887Schin #ifdef SIGERR
98*8462SApril.Chin@Sun.COM #define HAD_SIGERR	1
994887Schin "ERR trap",			"ERR",		SIGERR,
1004887Schin #endif
1014887Schin #ifdef SIGEXIT
102*8462SApril.Chin@Sun.COM #define HAD_SIGEXIT	1
1034887Schin "Exit",				"EXIT",		SIGEXIT,
1044887Schin #endif
1054887Schin #ifdef SIGFPE
106*8462SApril.Chin@Sun.COM #define HAD_SIGFPE	1
1074887Schin "Floating exception",		"FPE",		SIGFPE,
1084887Schin #endif
1094887Schin #ifdef SIGFREEZE
110*8462SApril.Chin@Sun.COM #define HAD_SIGFREEZE	1
1114887Schin "CPR freeze",			"FREEZE",	SIGFREEZE,
1124887Schin #endif
1134887Schin #ifdef SIGHUP
114*8462SApril.Chin@Sun.COM #define HAD_SIGHUP	1
1154887Schin "Hangup",			"HUP",		SIGHUP,
1164887Schin #endif
1174887Schin #ifdef SIGILL
118*8462SApril.Chin@Sun.COM #define HAD_SIGILL	1
1194887Schin "Illegal instruction",		"ILL",		SIGILL,
1204887Schin #endif
1214887Schin #ifdef SIGINT
122*8462SApril.Chin@Sun.COM #define HAD_SIGINT	1
1234887Schin "Interrupt",			"INT",		SIGINT,
1244887Schin #endif
1254887Schin #ifdef SIGIO
126*8462SApril.Chin@Sun.COM #define HAD_SIGIO	1
1274887Schin "IO possible",			"IO",		SIGIO,
1284887Schin #endif
1294887Schin #ifdef SIGIOT
130*8462SApril.Chin@Sun.COM #define HAD_SIGIOT	1
1314887Schin "IOT trap",			"IOT",		SIGIOT,
1324887Schin #endif
1334887Schin #ifdef SIGKILL
134*8462SApril.Chin@Sun.COM #define HAD_SIGKILL	1
1354887Schin "Killed",			"KILL",		SIGKILL,
1364887Schin #endif
1374887Schin #ifdef SIGLAB
138*8462SApril.Chin@Sun.COM #define HAD_SIGLAB	1
1394887Schin "Security label changed",	"LAB",		SIGLAB,
1404887Schin #endif
1414887Schin #ifdef SIGLOST
142*8462SApril.Chin@Sun.COM #define HAD_SIGLOST	1
1434887Schin "Resources lost",		"LOST",		SIGLOST,
1444887Schin #endif
1454887Schin #ifdef SIGLWP
146*8462SApril.Chin@Sun.COM #define HAD_SIGLWP	1
1474887Schin "Thread event",			"LWP",		SIGLWP,
1484887Schin #endif
1494887Schin #ifdef SIGMIGRATE
150*8462SApril.Chin@Sun.COM #define HAD_SIGMIGRATE	1
1514887Schin "Migrate process",		"MIGRATE",	SIGMIGRATE,
1524887Schin #endif
1534887Schin #ifdef SIGPHONE
154*8462SApril.Chin@Sun.COM #define HAD_SIGPHONE	1
1554887Schin "Phone status change",		"PHONE",	SIGPHONE,
1564887Schin #endif
1574887Schin #ifdef SIGPIPE
158*8462SApril.Chin@Sun.COM #define HAD_SIGPIPE	1
1594887Schin "Broken pipe",			"PIPE",		SIGPIPE,
1604887Schin #endif
1614887Schin #ifdef SIGPOLL
162*8462SApril.Chin@Sun.COM #define HAD_SIGPOLL	1
1634887Schin "Poll event",			"POLL",		SIGPOLL,
1644887Schin #endif
1654887Schin #ifdef SIGPROF
166*8462SApril.Chin@Sun.COM #define HAD_SIGPROF	1
1674887Schin "Profile timer alarm",		"PROF",		SIGPROF,
1684887Schin #endif
1694887Schin #ifdef SIGPWR
170*8462SApril.Chin@Sun.COM #define HAD_SIGPWR	1
1714887Schin "Power fail",			"PWR",		SIGPWR,
1724887Schin #endif
1734887Schin #ifdef SIGQUIT
174*8462SApril.Chin@Sun.COM #define HAD_SIGQUIT	1
1754887Schin "Quit",				"QUIT",		SIGQUIT,
1764887Schin #endif
1774887Schin #ifdef SIGSEGV
178*8462SApril.Chin@Sun.COM #define HAD_SIGSEGV	1
1794887Schin "Memory fault",			"SEGV",		SIGSEGV,
1804887Schin #endif
1814887Schin #ifdef SIGSOUND
182*8462SApril.Chin@Sun.COM #define HAD_SIGSOUND	1
1834887Schin "Sound completed",		"SOUND",	SIGSOUND,
1844887Schin #endif
1854887Schin #ifdef SIGSSTOP
186*8462SApril.Chin@Sun.COM #define HAD_SIGSSTOP	1
1874887Schin "Sendable stop",		"SSTOP",	SIGSSTOP,
1884887Schin #endif
1894887Schin #ifdef gould
190*8462SApril.Chin@Sun.COM #define HAD_gould	1
1914887Schin "Stack overflow",		"STKOV",	28,
1924887Schin #endif
1934887Schin #ifdef SIGSTOP
194*8462SApril.Chin@Sun.COM #define HAD_SIGSTOP	1
1954887Schin "Stopped (signal)",		"STOP",		SIGSTOP,
1964887Schin #endif
1974887Schin #ifdef SIGSYS
198*8462SApril.Chin@Sun.COM #define HAD_SIGSYS	1
1994887Schin "Bad system call", 		"SYS",		SIGSYS,
2004887Schin #endif
2014887Schin #ifdef SIGTERM
202*8462SApril.Chin@Sun.COM #define HAD_SIGTERM	1
2034887Schin "Terminated",			"TERM",		SIGTERM,
2044887Schin #endif
2054887Schin #ifdef SIGTHAW
206*8462SApril.Chin@Sun.COM #define HAD_SIGTHAW	1
2074887Schin "CPR thaw",			"THAW",		SIGTHAW,
2084887Schin #endif
2094887Schin #ifdef SIGTINT
210*8462SApril.Chin@Sun.COM #define HAD_SIGTINT	1
2114887Schin "Interrupt (terminal)",		"TINT",		SIGTINT,
2124887Schin #endif
2134887Schin #ifdef SIGTRAP
214*8462SApril.Chin@Sun.COM #define HAD_SIGTRAP	1
2154887Schin "Trace trap",			"TRAP",		SIGTRAP,
2164887Schin #endif
2174887Schin #ifdef SIGTSTP
218*8462SApril.Chin@Sun.COM #define HAD_SIGTSTP	1
2194887Schin "Stopped",			"TSTP",		SIGTSTP,
2204887Schin #endif
2214887Schin #ifdef SIGTTIN
222*8462SApril.Chin@Sun.COM #define HAD_SIGTTIN	1
2234887Schin "Stopped (tty input)",		"TTIN",		SIGTTIN,
2244887Schin #endif
2254887Schin #ifdef SIGTTOU
226*8462SApril.Chin@Sun.COM #define HAD_SIGTTOU	1
2274887Schin "Stopped (tty output)",		"TTOU",		SIGTTOU,
2284887Schin #endif
2294887Schin #ifdef SIGURG
230*8462SApril.Chin@Sun.COM #define HAD_SIGURG	1
2314887Schin "Urgent IO",			"URG",		SIGURG,
2324887Schin #endif
2334887Schin #ifdef SIGUSR1
234*8462SApril.Chin@Sun.COM #define HAD_SIGUSR1	1
2354887Schin "User signal 1",		"USR1",		SIGUSR1,
2364887Schin #endif
2374887Schin #ifdef SIGUSR2
238*8462SApril.Chin@Sun.COM #define HAD_SIGUSR2	1
2394887Schin "User signal 2",		"USR2",		SIGUSR2,
2404887Schin #endif
2414887Schin #ifdef SIGVTALRM
242*8462SApril.Chin@Sun.COM #define HAD_SIGVTALRM	1
2434887Schin "Virtual timer alarm",		"VTALRM",	SIGVTALRM,
2444887Schin #endif
2454887Schin #ifdef SIGWAITING
246*8462SApril.Chin@Sun.COM #define HAD_SIGWAITING	1
2474887Schin "All threads blocked",		"WAITING",	SIGWAITING,
2484887Schin #endif
2494887Schin #ifdef SIGWINCH
250*8462SApril.Chin@Sun.COM #define HAD_SIGWINCH	1
2514887Schin "Window change", 		"WINCH",	SIGWINCH,
2524887Schin #endif
2534887Schin #ifdef SIGWIND
254*8462SApril.Chin@Sun.COM #define HAD_SIGWIND	1
2554887Schin "Window change",		"WIND",		SIGWIND,
2564887Schin #endif
2574887Schin #ifdef SIGWINDOW
258*8462SApril.Chin@Sun.COM #define HAD_SIGWINDOW	1
2594887Schin "Window change",		"WINDOW",	SIGWINDOW,
2604887Schin #endif
2614887Schin #ifdef SIGXCPU
262*8462SApril.Chin@Sun.COM #define HAD_SIGXCPU	1
2634887Schin "CPU time limit",		"XCPU",		SIGXCPU,
2644887Schin #endif
2654887Schin #ifdef SIGXFSZ
266*8462SApril.Chin@Sun.COM #define HAD_SIGXFSZ	1
2674887Schin "File size limit",		"XFSZ",		SIGXFSZ,
2684887Schin #endif
269*8462SApril.Chin@Sun.COM #include "FEATURE/siglist"
2704887Schin 0
2714887Schin };
2724887Schin 
2734887Schin #define RANGE_MIN	(1<<14)
2744887Schin #define RANGE_MAX	(1<<13)
2754887Schin #define RANGE_RT	(1<<12)
2764887Schin 
2774887Schin #define RANGE_SIG	(~(RANGE_MIN|RANGE_MAX|RANGE_RT))
2784887Schin 
279*8462SApril.Chin@Sun.COM static int		mapindex[1024];
280*8462SApril.Chin@Sun.COM 
281*8462SApril.Chin@Sun.COM #if _lib_strsignal
282*8462SApril.Chin@Sun.COM extern char*		strsignal(int);
283*8462SApril.Chin@Sun.COM #endif
2844887Schin 
2854887Schin int
2864887Schin main()
2874887Schin {
2884887Schin 	register int	i;
2894887Schin 	register int	j;
2904887Schin 	register int	k;
291*8462SApril.Chin@Sun.COM 	int		m;
2924887Schin 	int		n;
293*8462SApril.Chin@Sun.COM #if _lib_strsignal
294*8462SApril.Chin@Sun.COM 	char*		s;
295*8462SApril.Chin@Sun.COM #endif
2964887Schin 
2974887Schin 	k = 0;
2984887Schin 	for (i = 0; map[i].name; i++)
299*8462SApril.Chin@Sun.COM 		if ((j = map[i].value) > 0 && j < elementsof(mapindex) && !mapindex[j])
3004887Schin 		{
301*8462SApril.Chin@Sun.COM 			if (j > k)
302*8462SApril.Chin@Sun.COM 				k = j;
303*8462SApril.Chin@Sun.COM 			mapindex[j] = i;
3044887Schin 		}
3054887Schin #ifdef SIGRTMIN
3064887Schin 	i = SIGRTMIN;
3074887Schin #ifdef SIGRTMAX
3084887Schin 	j = SIGRTMAX;
3094887Schin #else
3104887Schin 	j = i;
3114887Schin #endif
312*8462SApril.Chin@Sun.COM 	if (j >= elementsof(mapindex))
313*8462SApril.Chin@Sun.COM 		j = elementsof(mapindex) - 1;
314*8462SApril.Chin@Sun.COM 	if (i <= j && i > 0 && i < elementsof(mapindex) && j > 0 && j < elementsof(mapindex))
3154887Schin 	{
316*8462SApril.Chin@Sun.COM 		if (j > k)
317*8462SApril.Chin@Sun.COM 			k = j;
318*8462SApril.Chin@Sun.COM 		mapindex[i] = RANGE_MIN | RANGE_RT;
3194887Schin 		n = 1;
3204887Schin 		while (++i < j)
321*8462SApril.Chin@Sun.COM 			mapindex[i] = RANGE_RT | n++;
322*8462SApril.Chin@Sun.COM 		mapindex[j] = RANGE_MAX | RANGE_RT | n;
3234887Schin 	}
3244887Schin #endif
3254887Schin 	printf("#pragma prototyped\n");
3264887Schin 	printf("#define SIG_MAX	%d\n", k);
3274887Schin 	printf("\n");
3284887Schin 	printf("static const char* const	sig_name[] =\n");
3294887Schin 	printf("{\n");
3304887Schin 	for (i = 0; i <= k; i++)
331*8462SApril.Chin@Sun.COM 		if (!(j = mapindex[i]))
332*8462SApril.Chin@Sun.COM 			printf("	\"%d\",\n", i);
3334887Schin 		else if (j & RANGE_RT)
3344887Schin 		{
335*8462SApril.Chin@Sun.COM 			if (j & RANGE_MIN)
336*8462SApril.Chin@Sun.COM 				printf("	\"RTMIN\",\n");
337*8462SApril.Chin@Sun.COM 			else if (j & RANGE_MAX)
338*8462SApril.Chin@Sun.COM 				printf("	\"RTMAX\",\n");
339*8462SApril.Chin@Sun.COM 			else
340*8462SApril.Chin@Sun.COM 			{
341*8462SApril.Chin@Sun.COM 				m = j & RANGE_SIG;
342*8462SApril.Chin@Sun.COM 				if (m > n / 2)
343*8462SApril.Chin@Sun.COM 					printf("	\"RTMAX-%d\",\n", n - m);
344*8462SApril.Chin@Sun.COM 				else
345*8462SApril.Chin@Sun.COM 					printf("	\"RTMIN+%d\",\n", m);
346*8462SApril.Chin@Sun.COM 			}
3474887Schin 		}
348*8462SApril.Chin@Sun.COM 		else
349*8462SApril.Chin@Sun.COM 			printf("	\"%s\",\n", map[j].name);
3504887Schin 	printf("	0\n");
3514887Schin 	printf("};\n");
3524887Schin 	printf("\n");
3534887Schin 	printf("static const char* const	sig_text[] =\n");
3544887Schin 	printf("{\n");
3554887Schin 	for (i = 0; i <= k; i++)
356*8462SApril.Chin@Sun.COM 		if (!(j = mapindex[i]))
357*8462SApril.Chin@Sun.COM 			printf("	\"Signal %d\",\n", i);
358*8462SApril.Chin@Sun.COM 		else if (j & RANGE_RT)
359*8462SApril.Chin@Sun.COM 			printf("	\"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
360*8462SApril.Chin@Sun.COM 		else if (map[j].text)
361*8462SApril.Chin@Sun.COM 			printf("	\"%s\",\n", map[j].text);
362*8462SApril.Chin@Sun.COM #if _lib_strsignal
363*8462SApril.Chin@Sun.COM 		else if (s = strsignal(i))
364*8462SApril.Chin@Sun.COM 			printf("	\"%s\",\n", s);
365*8462SApril.Chin@Sun.COM #endif
366*8462SApril.Chin@Sun.COM 		else
367*8462SApril.Chin@Sun.COM 			printf("	\"Signal %d\",\n", i);
3684887Schin 	printf("	0\n");
3694887Schin 	printf("};\n");
3704887Schin 	return 0;
3714887Schin }
372