14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*8462SApril.Chin@Sun.COM *          Copyright (c) 1982-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 *                  David Korn <dgk@research.att.com>                   *
184887Schin *                                                                      *
194887Schin ***********************************************************************/
204887Schin #pragma prototyped
214887Schin #ifndef SH_SIGBITS
224887Schin /*
234887Schin  *	UNIX shell
244887Schin  *	S. R. Bourne
254887Schin  *	Rewritten by David Korn
264887Schin  *
274887Schin  */
284887Schin 
294887Schin #include	<sig.h>
304887Schin #include	<setjmp.h>
314887Schin #include	<error.h>
324887Schin #include	<sfio.h>
334887Schin #include	"FEATURE/setjmp"
344887Schin #include	"FEATURE/sigfeatures"
354887Schin 
36*8462SApril.Chin@Sun.COM 
374887Schin #ifndef SIGWINCH
384887Schin #   ifdef SIGWIND
394887Schin #	define SIGWINCH	SIGWIND
404887Schin #   else
414887Schin #	ifdef SIGWINDOW
424887Schin #	    define SIGWINCH	SIGWINDOW
434887Schin #	endif
444887Schin #   endif
454887Schin #endif
464887Schin 
474887Schin typedef void (*SH_SIGTYPE)(int,void(*)(int));
484887Schin 
494887Schin #define SH_FORKLIM		16	/* fork timeout interval */
504887Schin 
514887Schin #define SH_TRAP			0200	/* bit for internal traps */
524887Schin #define SH_ERRTRAP		0	/* trap for non-zero exit status */
534887Schin #define SH_KEYTRAP		1	/* trap for keyboard event */
544887Schin #define SH_DEBUGTRAP		4	/* must be last internal trap */
554887Schin 
564887Schin #define SH_SIGBITS		8
574887Schin #define SH_SIGFAULT		1	/* signal handler is sh_fault */
584887Schin #define SH_SIGOFF		2	/* signal handler is SIG_IGN */
594887Schin #define SH_SIGSET		4	/* pending signal */
604887Schin #define SH_SIGTRAP		010	/* pending trap */
614887Schin #define SH_SIGDONE		020	/* default is exit */
624887Schin #define SH_SIGIGNORE		040	/* default is ingore signal */
634887Schin #define SH_SIGINTERACTIVE	0100	/* handle interactive specially */
644887Schin #define SH_SIGTSTP		0200	/* tstp signal received */
654887Schin #define SH_SIGALRM		0200	/* timer alarm received */
664887Schin #define SH_SIGTERM		SH_SIGOFF /* term signal received */
67*8462SApril.Chin@Sun.COM #define SH_SIGRUNTIME		0400	/* runtime value */
68*8462SApril.Chin@Sun.COM 
69*8462SApril.Chin@Sun.COM #define SH_SIGRTMIN		0	/* sh.sigruntime[] index */
70*8462SApril.Chin@Sun.COM #define SH_SIGRTMAX		1	/* sh.sigruntime[] index */
714887Schin 
724887Schin /*
734887Schin  * These are longjmp values
744887Schin  */
754887Schin 
764887Schin #define SH_JMPDOT	2
774887Schin #define SH_JMPEVAL	3
784887Schin #define SH_JMPTRAP	4
794887Schin #define SH_JMPIO	5
804887Schin #define SH_JMPCMD	6
814887Schin #define SH_JMPFUN	7
824887Schin #define SH_JMPERRFN	8
834887Schin #define SH_JMPSUB	9
844887Schin #define SH_JMPERREXIT	10
854887Schin #define SH_JMPEXIT	11
864887Schin #define SH_JMPSCRIPT	12
874887Schin 
884887Schin struct openlist
894887Schin {
904887Schin 	Sfio_t	*strm;
914887Schin 	struct openlist *next;
924887Schin };
934887Schin 
944887Schin struct checkpt
954887Schin {
964887Schin 	sigjmp_buf	buff;
974887Schin 	sigjmp_buf	*prev;
984887Schin 	int		topfd;
994887Schin 	int		mode;
1004887Schin 	struct openlist	*olist;
1014887Schin #if (ERROR_VERSION >= 20030214L)
1024887Schin 	Error_context_t err;
1034887Schin #else
1044887Schin 	struct errorcontext err;
1054887Schin #endif
1064887Schin };
1074887Schin 
1084887Schin #define sh_pushcontext(bp,n)	( (bp)->mode=(n) , (bp)->olist=0,  \
1094887Schin 				  (bp)->topfd=sh.topfd, (bp)->prev=sh.jmplist, \
1104887Schin 				  (bp)->err = *ERROR_CONTEXT_BASE, \
1114887Schin 					sh.jmplist = (sigjmp_buf*)(&(bp)->buff) \
1124887Schin 				)
1134887Schin #define sh_popcontext(bp)	(sh.jmplist=(bp)->prev, errorpop(&((bp)->err)))
1144887Schin 
1154887Schin extern void 	sh_fault(int);
116*8462SApril.Chin@Sun.COM extern void 	sh_done(void*,int);
1174887Schin extern void 	sh_chktrap(void);
1184887Schin extern void 	sh_sigclear(int);
1194887Schin extern void 	sh_sigdone(void);
120*8462SApril.Chin@Sun.COM extern void	sh_siginit(void*);
1214887Schin extern void 	sh_sigtrap(int);
1224887Schin extern void 	sh_sigreset(int);
1234887Schin extern void 	sh_timetraps(void);
1244887Schin extern void 	*sh_timeradd(unsigned long,int ,void (*)(void*),void*);
1254887Schin extern void	timerdel(void*);
1264887Schin 
1274887Schin extern const char e_alarm[];
1284887Schin 
1294887Schin #endif /* !SH_SIGBITS */
130