xref: /onnv-gate/usr/src/lib/libast/common/features/signal.c (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.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
258462SApril.Chin@Sun.COM  * AT&T Research
264887Schin  *
274887Schin  * generate signal features
284887Schin  */
294887Schin 
308462SApril.Chin@Sun.COM #include "FEATURE/standards"
318462SApril.Chin@Sun.COM 
328462SApril.Chin@Sun.COM #define strsignal	______strsignal
338462SApril.Chin@Sun.COM 
344887Schin #include <signal.h>
354887Schin 
368462SApril.Chin@Sun.COM #undef	strsignal
378462SApril.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
508462SApril.Chin@Sun.COM #define HAD_SIGABRT	1
514887Schin "Abort",			"ABRT",		SIGABRT,
524887Schin #endif
534887Schin #ifdef SIGAIO
548462SApril.Chin@Sun.COM #define HAD_SIGAIO	1
554887Schin "Asynchronous I/O",		"AIO",		SIGAIO,
564887Schin #endif
574887Schin #ifdef SIGALRM
588462SApril.Chin@Sun.COM #define HAD_SIGALRM	1
594887Schin "Alarm call",			"ALRM",		SIGALRM,
604887Schin #endif
614887Schin #ifdef SIGAPOLLO
628462SApril.Chin@Sun.COM #define HAD_SIGAPOLLO	1
634887Schin "Apollo",			"APOLLO",	SIGAPOLLO,
644887Schin #endif
654887Schin #ifdef SIGBUS
668462SApril.Chin@Sun.COM #define HAD_SIGBUS	1
674887Schin "Bus error",			"BUS",		SIGBUS,
684887Schin #endif
694887Schin #ifdef SIGCHLD
708462SApril.Chin@Sun.COM #define HAD_SIGCHLD	1
714887Schin "Child status change",		"CHLD",		SIGCHLD,
724887Schin #endif
734887Schin #ifdef SIGCLD
748462SApril.Chin@Sun.COM #define HAD_SIGCLD	1
754887Schin "Death of child", 		"CLD",		SIGCLD,
764887Schin #endif
774887Schin #ifdef SIGCONT
788462SApril.Chin@Sun.COM #define HAD_SIGCONT	1
794887Schin "Stopped process continued",	"CONT",		SIGCONT,
804887Schin #endif
814887Schin #ifdef SIGDANGER
828462SApril.Chin@Sun.COM #define HAD_SIGDANGER	1
834887Schin "System crash soon",		"DANGER",	SIGDANGER,
844887Schin #endif
854887Schin #ifdef SIGDEBUG
868462SApril.Chin@Sun.COM #define HAD_SIGDEBUG	1
874887Schin "Debug trap",			"DEBUG",	SIGDEBUG,
884887Schin #endif
894887Schin #ifdef SIGDIL
908462SApril.Chin@Sun.COM #define HAD_SIGDIL	1
914887Schin "DIL trap",			"DIL",		SIGDIL,
924887Schin #endif
934887Schin #ifdef SIGEMT
948462SApril.Chin@Sun.COM #define HAD_SIGEMT	1
954887Schin "EMT trap",			"EMT",		SIGEMT,
964887Schin #endif
974887Schin #ifdef SIGERR
988462SApril.Chin@Sun.COM #define HAD_SIGERR	1
994887Schin "ERR trap",			"ERR",		SIGERR,
1004887Schin #endif
1014887Schin #ifdef SIGEXIT
1028462SApril.Chin@Sun.COM #define HAD_SIGEXIT	1
1034887Schin "Exit",				"EXIT",		SIGEXIT,
1044887Schin #endif
1054887Schin #ifdef SIGFPE
1068462SApril.Chin@Sun.COM #define HAD_SIGFPE	1
1074887Schin "Floating exception",		"FPE",		SIGFPE,
1084887Schin #endif
1094887Schin #ifdef SIGFREEZE
1108462SApril.Chin@Sun.COM #define HAD_SIGFREEZE	1
1114887Schin "CPR freeze",			"FREEZE",	SIGFREEZE,
1124887Schin #endif
1134887Schin #ifdef SIGHUP
1148462SApril.Chin@Sun.COM #define HAD_SIGHUP	1
1154887Schin "Hangup",			"HUP",		SIGHUP,
1164887Schin #endif
1174887Schin #ifdef SIGILL
1188462SApril.Chin@Sun.COM #define HAD_SIGILL	1
1194887Schin "Illegal instruction",		"ILL",		SIGILL,
1204887Schin #endif
1214887Schin #ifdef SIGINT
1228462SApril.Chin@Sun.COM #define HAD_SIGINT	1
1234887Schin "Interrupt",			"INT",		SIGINT,
1244887Schin #endif
1254887Schin #ifdef SIGIO
1268462SApril.Chin@Sun.COM #define HAD_SIGIO	1
1274887Schin "IO possible",			"IO",		SIGIO,
1284887Schin #endif
1294887Schin #ifdef SIGIOT
1308462SApril.Chin@Sun.COM #define HAD_SIGIOT	1
1314887Schin "IOT trap",			"IOT",		SIGIOT,
1324887Schin #endif
1334887Schin #ifdef SIGKILL
1348462SApril.Chin@Sun.COM #define HAD_SIGKILL	1
1354887Schin "Killed",			"KILL",		SIGKILL,
1364887Schin #endif
1374887Schin #ifdef SIGLAB
1388462SApril.Chin@Sun.COM #define HAD_SIGLAB	1
1394887Schin "Security label changed",	"LAB",		SIGLAB,
1404887Schin #endif
1414887Schin #ifdef SIGLOST
1428462SApril.Chin@Sun.COM #define HAD_SIGLOST	1
1434887Schin "Resources lost",		"LOST",		SIGLOST,
1444887Schin #endif
1454887Schin #ifdef SIGLWP
1468462SApril.Chin@Sun.COM #define HAD_SIGLWP	1
1474887Schin "Thread event",			"LWP",		SIGLWP,
1484887Schin #endif
1494887Schin #ifdef SIGMIGRATE
1508462SApril.Chin@Sun.COM #define HAD_SIGMIGRATE	1
1514887Schin "Migrate process",		"MIGRATE",	SIGMIGRATE,
1524887Schin #endif
1534887Schin #ifdef SIGPHONE
1548462SApril.Chin@Sun.COM #define HAD_SIGPHONE	1
1554887Schin "Phone status change",		"PHONE",	SIGPHONE,
1564887Schin #endif
1574887Schin #ifdef SIGPIPE
1588462SApril.Chin@Sun.COM #define HAD_SIGPIPE	1
1594887Schin "Broken pipe",			"PIPE",		SIGPIPE,
1604887Schin #endif
1614887Schin #ifdef SIGPOLL
1628462SApril.Chin@Sun.COM #define HAD_SIGPOLL	1
1634887Schin "Poll event",			"POLL",		SIGPOLL,
1644887Schin #endif
1654887Schin #ifdef SIGPROF
1668462SApril.Chin@Sun.COM #define HAD_SIGPROF	1
1674887Schin "Profile timer alarm",		"PROF",		SIGPROF,
1684887Schin #endif
1694887Schin #ifdef SIGPWR
1708462SApril.Chin@Sun.COM #define HAD_SIGPWR	1
1714887Schin "Power fail",			"PWR",		SIGPWR,
1724887Schin #endif
1734887Schin #ifdef SIGQUIT
1748462SApril.Chin@Sun.COM #define HAD_SIGQUIT	1
1754887Schin "Quit",				"QUIT",		SIGQUIT,
1764887Schin #endif
1774887Schin #ifdef SIGSEGV
1788462SApril.Chin@Sun.COM #define HAD_SIGSEGV	1
1794887Schin "Memory fault",			"SEGV",		SIGSEGV,
1804887Schin #endif
1814887Schin #ifdef SIGSOUND
1828462SApril.Chin@Sun.COM #define HAD_SIGSOUND	1
1834887Schin "Sound completed",		"SOUND",	SIGSOUND,
1844887Schin #endif
1854887Schin #ifdef SIGSSTOP
1868462SApril.Chin@Sun.COM #define HAD_SIGSSTOP	1
1874887Schin "Sendable stop",		"SSTOP",	SIGSSTOP,
1884887Schin #endif
1894887Schin #ifdef gould
1908462SApril.Chin@Sun.COM #define HAD_gould	1
1914887Schin "Stack overflow",		"STKOV",	28,
1924887Schin #endif
1934887Schin #ifdef SIGSTOP
1948462SApril.Chin@Sun.COM #define HAD_SIGSTOP	1
1954887Schin "Stopped (signal)",		"STOP",		SIGSTOP,
1964887Schin #endif
1974887Schin #ifdef SIGSYS
1988462SApril.Chin@Sun.COM #define HAD_SIGSYS	1
1994887Schin "Bad system call", 		"SYS",		SIGSYS,
2004887Schin #endif
2014887Schin #ifdef SIGTERM
2028462SApril.Chin@Sun.COM #define HAD_SIGTERM	1
2034887Schin "Terminated",			"TERM",		SIGTERM,
2044887Schin #endif
2054887Schin #ifdef SIGTHAW
2068462SApril.Chin@Sun.COM #define HAD_SIGTHAW	1
2074887Schin "CPR thaw",			"THAW",		SIGTHAW,
2084887Schin #endif
2094887Schin #ifdef SIGTINT
2108462SApril.Chin@Sun.COM #define HAD_SIGTINT	1
2114887Schin "Interrupt (terminal)",		"TINT",		SIGTINT,
2124887Schin #endif
2134887Schin #ifdef SIGTRAP
2148462SApril.Chin@Sun.COM #define HAD_SIGTRAP	1
2154887Schin "Trace trap",			"TRAP",		SIGTRAP,
2164887Schin #endif
2174887Schin #ifdef SIGTSTP
2188462SApril.Chin@Sun.COM #define HAD_SIGTSTP	1
2194887Schin "Stopped",			"TSTP",		SIGTSTP,
2204887Schin #endif
2214887Schin #ifdef SIGTTIN
2228462SApril.Chin@Sun.COM #define HAD_SIGTTIN	1
2234887Schin "Stopped (tty input)",		"TTIN",		SIGTTIN,
2244887Schin #endif
2254887Schin #ifdef SIGTTOU
2268462SApril.Chin@Sun.COM #define HAD_SIGTTOU	1
2274887Schin "Stopped (tty output)",		"TTOU",		SIGTTOU,
2284887Schin #endif
2294887Schin #ifdef SIGURG
2308462SApril.Chin@Sun.COM #define HAD_SIGURG	1
2314887Schin "Urgent IO",			"URG",		SIGURG,
2324887Schin #endif
2334887Schin #ifdef SIGUSR1
2348462SApril.Chin@Sun.COM #define HAD_SIGUSR1	1
2354887Schin "User signal 1",		"USR1",		SIGUSR1,
2364887Schin #endif
2374887Schin #ifdef SIGUSR2
2388462SApril.Chin@Sun.COM #define HAD_SIGUSR2	1
2394887Schin "User signal 2",		"USR2",		SIGUSR2,
2404887Schin #endif
2414887Schin #ifdef SIGVTALRM
2428462SApril.Chin@Sun.COM #define HAD_SIGVTALRM	1
2434887Schin "Virtual timer alarm",		"VTALRM",	SIGVTALRM,
2444887Schin #endif
2454887Schin #ifdef SIGWAITING
2468462SApril.Chin@Sun.COM #define HAD_SIGWAITING	1
2474887Schin "All threads blocked",		"WAITING",	SIGWAITING,
2484887Schin #endif
2494887Schin #ifdef SIGWINCH
2508462SApril.Chin@Sun.COM #define HAD_SIGWINCH	1
2514887Schin "Window change", 		"WINCH",	SIGWINCH,
2524887Schin #endif
2534887Schin #ifdef SIGWIND
2548462SApril.Chin@Sun.COM #define HAD_SIGWIND	1
2554887Schin "Window change",		"WIND",		SIGWIND,
2564887Schin #endif
2574887Schin #ifdef SIGWINDOW
2588462SApril.Chin@Sun.COM #define HAD_SIGWINDOW	1
2594887Schin "Window change",		"WINDOW",	SIGWINDOW,
2604887Schin #endif
2614887Schin #ifdef SIGXCPU
2628462SApril.Chin@Sun.COM #define HAD_SIGXCPU	1
2634887Schin "CPU time limit",		"XCPU",		SIGXCPU,
2644887Schin #endif
2654887Schin #ifdef SIGXFSZ
2668462SApril.Chin@Sun.COM #define HAD_SIGXFSZ	1
2674887Schin "File size limit",		"XFSZ",		SIGXFSZ,
2684887Schin #endif
2698462SApril.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 
2798462SApril.Chin@Sun.COM static int		mapindex[1024];
2808462SApril.Chin@Sun.COM 
2818462SApril.Chin@Sun.COM #if _lib_strsignal
2828462SApril.Chin@Sun.COM extern char*		strsignal(int);
2838462SApril.Chin@Sun.COM #endif
2844887Schin 
2854887Schin int
main()2864887Schin main()
2874887Schin {
2884887Schin 	register int	i;
2894887Schin 	register int	j;
2904887Schin 	register int	k;
2918462SApril.Chin@Sun.COM 	int		m;
2924887Schin 	int		n;
2938462SApril.Chin@Sun.COM #if _lib_strsignal
2948462SApril.Chin@Sun.COM 	char*		s;
2958462SApril.Chin@Sun.COM #endif
2964887Schin 
2974887Schin 	k = 0;
2984887Schin 	for (i = 0; map[i].name; i++)
2998462SApril.Chin@Sun.COM 		if ((j = map[i].value) > 0 && j < elementsof(mapindex) && !mapindex[j])
3004887Schin 		{
3018462SApril.Chin@Sun.COM 			if (j > k)
3028462SApril.Chin@Sun.COM 				k = j;
3038462SApril.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
3128462SApril.Chin@Sun.COM 	if (j >= elementsof(mapindex))
3138462SApril.Chin@Sun.COM 		j = elementsof(mapindex) - 1;
3148462SApril.Chin@Sun.COM 	if (i <= j && i > 0 && i < elementsof(mapindex) && j > 0 && j < elementsof(mapindex))
3154887Schin 	{
3168462SApril.Chin@Sun.COM 		if (j > k)
3178462SApril.Chin@Sun.COM 			k = j;
3188462SApril.Chin@Sun.COM 		mapindex[i] = RANGE_MIN | RANGE_RT;
3194887Schin 		n = 1;
3204887Schin 		while (++i < j)
3218462SApril.Chin@Sun.COM 			mapindex[i] = RANGE_RT | n++;
3228462SApril.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++)
3318462SApril.Chin@Sun.COM 		if (!(j = mapindex[i]))
3328462SApril.Chin@Sun.COM 			printf("	\"%d\",\n", i);
3334887Schin 		else if (j & RANGE_RT)
3344887Schin 		{
3358462SApril.Chin@Sun.COM 			if (j & RANGE_MIN)
3368462SApril.Chin@Sun.COM 				printf("	\"RTMIN\",\n");
3378462SApril.Chin@Sun.COM 			else if (j & RANGE_MAX)
3388462SApril.Chin@Sun.COM 				printf("	\"RTMAX\",\n");
3398462SApril.Chin@Sun.COM 			else
3408462SApril.Chin@Sun.COM 			{
3418462SApril.Chin@Sun.COM 				m = j & RANGE_SIG;
3428462SApril.Chin@Sun.COM 				if (m > n / 2)
3438462SApril.Chin@Sun.COM 					printf("	\"RTMAX-%d\",\n", n - m);
3448462SApril.Chin@Sun.COM 				else
3458462SApril.Chin@Sun.COM 					printf("	\"RTMIN+%d\",\n", m);
3468462SApril.Chin@Sun.COM 			}
3474887Schin 		}
3488462SApril.Chin@Sun.COM 		else
3498462SApril.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++)
3568462SApril.Chin@Sun.COM 		if (!(j = mapindex[i]))
3578462SApril.Chin@Sun.COM 			printf("	\"Signal %d\",\n", i);
3588462SApril.Chin@Sun.COM 		else if (j & RANGE_RT)
3598462SApril.Chin@Sun.COM 			printf("	\"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
3608462SApril.Chin@Sun.COM 		else if (map[j].text)
3618462SApril.Chin@Sun.COM 			printf("	\"%s\",\n", map[j].text);
3628462SApril.Chin@Sun.COM #if _lib_strsignal
3638462SApril.Chin@Sun.COM 		else if (s = strsignal(i))
3648462SApril.Chin@Sun.COM 			printf("	\"%s\",\n", s);
3658462SApril.Chin@Sun.COM #endif
3668462SApril.Chin@Sun.COM 		else
3678462SApril.Chin@Sun.COM 			printf("	\"Signal %d\",\n", i);
3684887Schin 	printf("	0\n");
3694887Schin 	printf("};\n");
3704887Schin 	return 0;
3714887Schin }
372