1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
19*b30d1939SAndy Fiddaman *                   Phong Vo <kpv@research.att.com>                    *
20*b30d1939SAndy Fiddaman *                                                                      *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #pragma prototyped
23*b30d1939SAndy Fiddaman 
24*b30d1939SAndy Fiddaman /*
25*b30d1939SAndy Fiddaman  * signal that disables syscall restart on interrupt with clear signal mask
26*b30d1939SAndy Fiddaman  * fun==SIG_DFL also unblocks signal
27*b30d1939SAndy Fiddaman  */
28*b30d1939SAndy Fiddaman 
29*b30d1939SAndy Fiddaman #if !_UWIN
30*b30d1939SAndy Fiddaman 
31*b30d1939SAndy Fiddaman #undef	signal
32*b30d1939SAndy Fiddaman #define signal		______signal
33*b30d1939SAndy Fiddaman 
34*b30d1939SAndy Fiddaman #endif
35*b30d1939SAndy Fiddaman 
36*b30d1939SAndy Fiddaman #include <ast.h>
37*b30d1939SAndy Fiddaman #include <sig.h>
38*b30d1939SAndy Fiddaman 
39*b30d1939SAndy Fiddaman #if !_UWIN
40*b30d1939SAndy Fiddaman 
41*b30d1939SAndy Fiddaman #undef	signal
42*b30d1939SAndy Fiddaman 
43*b30d1939SAndy Fiddaman #undef	_def_map_ast
44*b30d1939SAndy Fiddaman #include <ast_map.h>
45*b30d1939SAndy Fiddaman 
46*b30d1939SAndy Fiddaman #if defined(__EXPORT__)
47*b30d1939SAndy Fiddaman #define extern	__EXPORT__
48*b30d1939SAndy Fiddaman #endif
49*b30d1939SAndy Fiddaman 
50*b30d1939SAndy Fiddaman #endif
51*b30d1939SAndy Fiddaman 
52*b30d1939SAndy Fiddaman #if defined(SV_ABORT)
53*b30d1939SAndy Fiddaman #undef	SV_INTERRUPT
54*b30d1939SAndy Fiddaman #define SV_INTERRUPT	SV_ABORT
55*b30d1939SAndy Fiddaman #endif
56*b30d1939SAndy Fiddaman 
57*b30d1939SAndy Fiddaman #if !_std_signal && (_lib_sigaction && defined(SA_NOCLDSTOP) || _lib_sigvec && defined(SV_INTERRUPT))
58*b30d1939SAndy Fiddaman 
59*b30d1939SAndy Fiddaman #if !defined(SA_NOCLDSTOP) || !defined(SA_INTERRUPT) && defined(SV_INTERRUPT)
60*b30d1939SAndy Fiddaman #undef	SA_INTERRUPT
61*b30d1939SAndy Fiddaman #define SA_INTERRUPT	SV_INTERRUPT
62*b30d1939SAndy Fiddaman #undef	sigaction
63*b30d1939SAndy Fiddaman #define sigaction	sigvec
64*b30d1939SAndy Fiddaman #undef	sigemptyset
65*b30d1939SAndy Fiddaman #define sigemptyset(p)	(*(p)=0)
66*b30d1939SAndy Fiddaman #undef	sa_flags
67*b30d1939SAndy Fiddaman #define sa_flags	sv_flags
68*b30d1939SAndy Fiddaman #undef	sa_handler
69*b30d1939SAndy Fiddaman #define sa_handler	sv_handler
70*b30d1939SAndy Fiddaman #undef	sa_mask
71*b30d1939SAndy Fiddaman #define	sa_mask		sv_mask
72*b30d1939SAndy Fiddaman #endif
73*b30d1939SAndy Fiddaman 
74*b30d1939SAndy Fiddaman extern Sig_handler_t
signal(int sig,Sig_handler_t fun)75*b30d1939SAndy Fiddaman signal(int sig, Sig_handler_t fun)
76*b30d1939SAndy Fiddaman {
77*b30d1939SAndy Fiddaman 	struct sigaction	na;
78*b30d1939SAndy Fiddaman 	struct sigaction	oa;
79*b30d1939SAndy Fiddaman 	int			unblock;
80*b30d1939SAndy Fiddaman #ifdef SIGNO_MASK
81*b30d1939SAndy Fiddaman 	unsigned int		flags;
82*b30d1939SAndy Fiddaman #endif
83*b30d1939SAndy Fiddaman 
84*b30d1939SAndy Fiddaman 	if (sig < 0)
85*b30d1939SAndy Fiddaman 	{
86*b30d1939SAndy Fiddaman 		sig = -sig;
87*b30d1939SAndy Fiddaman 		unblock = 0;
88*b30d1939SAndy Fiddaman 	}
89*b30d1939SAndy Fiddaman 	else
90*b30d1939SAndy Fiddaman 		unblock = fun == SIG_DFL;
91*b30d1939SAndy Fiddaman #ifdef SIGNO_MASK
92*b30d1939SAndy Fiddaman 	flags = sig & ~SIGNO_MASK;
93*b30d1939SAndy Fiddaman 	sig &= SIGNO_MASK;
94*b30d1939SAndy Fiddaman #endif
95*b30d1939SAndy Fiddaman 	memzero(&na, sizeof(na));
96*b30d1939SAndy Fiddaman 	na.sa_handler = fun;
97*b30d1939SAndy Fiddaman #if defined(SA_INTERRUPT) || defined(SA_RESTART)
98*b30d1939SAndy Fiddaman 	switch (sig)
99*b30d1939SAndy Fiddaman 	{
100*b30d1939SAndy Fiddaman #if defined(SIGIO) || defined(SIGTSTP) || defined(SIGTTIN) || defined(SIGTTOU)
101*b30d1939SAndy Fiddaman #if defined(SIGIO)
102*b30d1939SAndy Fiddaman 	case SIGIO:
103*b30d1939SAndy Fiddaman #endif
104*b30d1939SAndy Fiddaman #if defined(SIGTSTP)
105*b30d1939SAndy Fiddaman 	case SIGTSTP:
106*b30d1939SAndy Fiddaman #endif
107*b30d1939SAndy Fiddaman #if defined(SIGTTIN)
108*b30d1939SAndy Fiddaman 	case SIGTTIN:
109*b30d1939SAndy Fiddaman #endif
110*b30d1939SAndy Fiddaman #if defined(SIGTTOU)
111*b30d1939SAndy Fiddaman 	case SIGTTOU:
112*b30d1939SAndy Fiddaman #endif
113*b30d1939SAndy Fiddaman #if defined(SA_RESTART)
114*b30d1939SAndy Fiddaman 		na.sa_flags = SA_RESTART;
115*b30d1939SAndy Fiddaman #endif
116*b30d1939SAndy Fiddaman 		break;
117*b30d1939SAndy Fiddaman #endif
118*b30d1939SAndy Fiddaman 	default:
119*b30d1939SAndy Fiddaman #if defined(SA_INTERRUPT)
120*b30d1939SAndy Fiddaman 		na.sa_flags = SA_INTERRUPT;
121*b30d1939SAndy Fiddaman #endif
122*b30d1939SAndy Fiddaman 		break;
123*b30d1939SAndy Fiddaman 	}
124*b30d1939SAndy Fiddaman #endif
125*b30d1939SAndy Fiddaman 	if (sigaction(sig, &na, &oa))
126*b30d1939SAndy Fiddaman 		return 0;
127*b30d1939SAndy Fiddaman 	if (unblock)
128*b30d1939SAndy Fiddaman 		sigunblock(sig);
129*b30d1939SAndy Fiddaman 	return oa.sa_handler;
130*b30d1939SAndy Fiddaman }
131*b30d1939SAndy Fiddaman 
132*b30d1939SAndy Fiddaman #else
133*b30d1939SAndy Fiddaman 
134*b30d1939SAndy Fiddaman NoN(signal)
135*b30d1939SAndy Fiddaman 
136*b30d1939SAndy Fiddaman #endif
137