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