1*4887Schin /***********************************************************************
2*4887Schin *                                                                      *
3*4887Schin *               This software is part of the ast package               *
4*4887Schin *           Copyright (c) 1982-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 *                  David Korn <dgk@research.att.com>                   *
18*4887Schin *                                                                      *
19*4887Schin ***********************************************************************/
20*4887Schin #pragma prototyped
21*4887Schin #ifndef SH_SIGBITS
22*4887Schin /*
23*4887Schin  *	UNIX shell
24*4887Schin  *	S. R. Bourne
25*4887Schin  *	Rewritten by David Korn
26*4887Schin  *
27*4887Schin  */
28*4887Schin 
29*4887Schin #include	<sig.h>
30*4887Schin #include	<setjmp.h>
31*4887Schin #include	<error.h>
32*4887Schin #include	<sfio.h>
33*4887Schin #include	"FEATURE/setjmp"
34*4887Schin #include	"FEATURE/sigfeatures"
35*4887Schin 
36*4887Schin #ifndef SIGWINCH
37*4887Schin #   ifdef SIGWIND
38*4887Schin #	define SIGWINCH	SIGWIND
39*4887Schin #   else
40*4887Schin #	ifdef SIGWINDOW
41*4887Schin #	    define SIGWINCH	SIGWINDOW
42*4887Schin #	endif
43*4887Schin #   endif
44*4887Schin #endif
45*4887Schin 
46*4887Schin typedef void (*SH_SIGTYPE)(int,void(*)(int));
47*4887Schin 
48*4887Schin #define SH_FORKLIM		16	/* fork timeout interval */
49*4887Schin 
50*4887Schin #define SH_TRAP			0200	/* bit for internal traps */
51*4887Schin #define SH_ERRTRAP		0	/* trap for non-zero exit status */
52*4887Schin #define SH_KEYTRAP		1	/* trap for keyboard event */
53*4887Schin #define SH_DEBUGTRAP		4	/* must be last internal trap */
54*4887Schin 
55*4887Schin #define SH_SIGBITS		8
56*4887Schin #define SH_SIGFAULT		1	/* signal handler is sh_fault */
57*4887Schin #define SH_SIGOFF		2	/* signal handler is SIG_IGN */
58*4887Schin #define SH_SIGSET		4	/* pending signal */
59*4887Schin #define SH_SIGTRAP		010	/* pending trap */
60*4887Schin #define SH_SIGDONE		020	/* default is exit */
61*4887Schin #define SH_SIGIGNORE		040	/* default is ingore signal */
62*4887Schin #define SH_SIGINTERACTIVE	0100	/* handle interactive specially */
63*4887Schin #define SH_SIGTSTP		0200	/* tstp signal received */
64*4887Schin #define SH_SIGALRM		0200	/* timer alarm received */
65*4887Schin #define SH_SIGTERM		SH_SIGOFF /* term signal received */
66*4887Schin 
67*4887Schin /*
68*4887Schin  * These are longjmp values
69*4887Schin  */
70*4887Schin 
71*4887Schin #define SH_JMPDOT	2
72*4887Schin #define SH_JMPEVAL	3
73*4887Schin #define SH_JMPTRAP	4
74*4887Schin #define SH_JMPIO	5
75*4887Schin #define SH_JMPCMD	6
76*4887Schin #define SH_JMPFUN	7
77*4887Schin #define SH_JMPERRFN	8
78*4887Schin #define SH_JMPSUB	9
79*4887Schin #define SH_JMPERREXIT	10
80*4887Schin #define SH_JMPEXIT	11
81*4887Schin #define SH_JMPSCRIPT	12
82*4887Schin 
83*4887Schin struct openlist
84*4887Schin {
85*4887Schin 	Sfio_t	*strm;
86*4887Schin 	struct openlist *next;
87*4887Schin };
88*4887Schin 
89*4887Schin struct checkpt
90*4887Schin {
91*4887Schin 	sigjmp_buf	buff;
92*4887Schin 	sigjmp_buf	*prev;
93*4887Schin 	int		topfd;
94*4887Schin 	int		mode;
95*4887Schin 	struct openlist	*olist;
96*4887Schin #if (ERROR_VERSION >= 20030214L)
97*4887Schin 	Error_context_t err;
98*4887Schin #else
99*4887Schin 	struct errorcontext err;
100*4887Schin #endif
101*4887Schin };
102*4887Schin 
103*4887Schin #define sh_pushcontext(bp,n)	( (bp)->mode=(n) , (bp)->olist=0,  \
104*4887Schin 				  (bp)->topfd=sh.topfd, (bp)->prev=sh.jmplist, \
105*4887Schin 				  (bp)->err = *ERROR_CONTEXT_BASE, \
106*4887Schin 					sh.jmplist = (sigjmp_buf*)(&(bp)->buff) \
107*4887Schin 				)
108*4887Schin #define sh_popcontext(bp)	(sh.jmplist=(bp)->prev, errorpop(&((bp)->err)))
109*4887Schin 
110*4887Schin extern void 	sh_fault(int);
111*4887Schin extern void 	sh_done(int);
112*4887Schin extern void 	sh_chktrap(void);
113*4887Schin extern void 	sh_sigclear(int);
114*4887Schin extern void 	sh_sigdone(void);
115*4887Schin extern void	sh_siginit(void);
116*4887Schin extern void 	sh_sigtrap(int);
117*4887Schin extern void 	sh_sigreset(int);
118*4887Schin extern void 	sh_timetraps(void);
119*4887Schin extern void 	*sh_timeradd(unsigned long,int ,void (*)(void*),void*);
120*4887Schin extern void	timerdel(void*);
121*4887Schin 
122*4887Schin extern const char e_alarm[];
123*4887Schin 
124*4887Schin #endif /* !SH_SIGBITS */
125