1*4887Schin /***********************************************************************
2*4887Schin *                                                                      *
3*4887Schin *               This software is part of the ast package               *
4*4887Schin *           Copyright (c) 1985-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 *                 Glenn Fowler <gsf@research.att.com>                  *
18*4887Schin *                  David Korn <dgk@research.att.com>                   *
19*4887Schin *                   Phong Vo <kpv@research.att.com>                    *
20*4887Schin *                                                                      *
21*4887Schin ***********************************************************************/
22*4887Schin #pragma prototyped
23*4887Schin 
24*4887Schin /*
25*4887Schin  * signal that disables syscall restart on interrupt with clear signal mask
26*4887Schin  * fun==SIG_DFL also unblocks signal
27*4887Schin  */
28*4887Schin 
29*4887Schin #if !_UWIN
30*4887Schin 
31*4887Schin #undef	signal
32*4887Schin #define signal		______signal
33*4887Schin 
34*4887Schin #endif
35*4887Schin 
36*4887Schin #include <ast.h>
37*4887Schin #include <sig.h>
38*4887Schin 
39*4887Schin #if !_UWIN
40*4887Schin 
41*4887Schin #undef	signal
42*4887Schin 
43*4887Schin #undef	_def_map_ast
44*4887Schin #include <ast_map.h>
45*4887Schin 
46*4887Schin #if defined(__EXPORT__)
47*4887Schin #define extern	__EXPORT__
48*4887Schin #endif
49*4887Schin 
50*4887Schin #endif
51*4887Schin 
52*4887Schin #if defined(SV_ABORT)
53*4887Schin #undef	SV_INTERRUPT
54*4887Schin #define SV_INTERRUPT	SV_ABORT
55*4887Schin #endif
56*4887Schin 
57*4887Schin #if !_std_signal && (_lib_sigaction && defined(SA_NOCLDSTOP) || _lib_sigvec && defined(SV_INTERRUPT))
58*4887Schin 
59*4887Schin #if !defined(SA_NOCLDSTOP) || !defined(SA_INTERRUPT) && defined(SV_INTERRUPT)
60*4887Schin #undef	SA_INTERRUPT
61*4887Schin #define SA_INTERRUPT	SV_INTERRUPT
62*4887Schin #undef	sigaction
63*4887Schin #define sigaction	sigvec
64*4887Schin #undef	sigemptyset
65*4887Schin #define sigemptyset(p)	(*(p)=0)
66*4887Schin #undef	sa_flags
67*4887Schin #define sa_flags	sv_flags
68*4887Schin #undef	sa_handler
69*4887Schin #define sa_handler	sv_handler
70*4887Schin #undef	sa_mask
71*4887Schin #define	sa_mask		sv_mask
72*4887Schin #endif
73*4887Schin 
74*4887Schin extern Sig_handler_t
75*4887Schin signal(int sig, Sig_handler_t fun)
76*4887Schin {
77*4887Schin 	struct sigaction	na;
78*4887Schin 	struct sigaction	oa;
79*4887Schin #ifdef SIGNO_MASK
80*4887Schin 	unsigned int		flags;
81*4887Schin #endif
82*4887Schin 
83*4887Schin #ifdef SIGNO_MASK
84*4887Schin 	flags = sig & ~SIGNO_MASK;
85*4887Schin 	sig &= SIGNO_MASK;
86*4887Schin #endif
87*4887Schin 	if (fun == SIG_DFL)
88*4887Schin 		sigunblock(sig);
89*4887Schin 	memzero(&na, sizeof(na));
90*4887Schin 	na.sa_handler = fun;
91*4887Schin #if defined(SA_INTERRUPT) || defined(SA_RESTART)
92*4887Schin 	switch (sig)
93*4887Schin 	{
94*4887Schin #if defined(SIGIO) || defined(SIGTSTP) || defined(SIGTTIN) || defined(SIGTTOU)
95*4887Schin #if defined(SIGIO)
96*4887Schin 	case SIGIO:
97*4887Schin #endif
98*4887Schin #if defined(SIGTSTP)
99*4887Schin 	case SIGTSTP:
100*4887Schin #endif
101*4887Schin #if defined(SIGTTIN)
102*4887Schin 	case SIGTTIN:
103*4887Schin #endif
104*4887Schin #if defined(SIGTTOU)
105*4887Schin 	case SIGTTOU:
106*4887Schin #endif
107*4887Schin #if defined(SA_RESTART)
108*4887Schin 		na.sa_flags = SA_RESTART;
109*4887Schin #endif
110*4887Schin 		break;
111*4887Schin #endif
112*4887Schin 	default:
113*4887Schin #if defined(SA_INTERRUPT)
114*4887Schin 		na.sa_flags = SA_INTERRUPT;
115*4887Schin #endif
116*4887Schin 		break;
117*4887Schin 	}
118*4887Schin #endif
119*4887Schin 	return(sigaction(sig, &na, &oa) ? (Sig_handler_t)0 : oa.sa_handler);
120*4887Schin }
121*4887Schin 
122*4887Schin #else
123*4887Schin 
124*4887Schin NoN(signal)
125*4887Schin 
126*4887Schin #endif
127