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