xref: /csrg-svn/sys/hp/hpux/hpux_sig.c (revision 41486)
1*41486Smckusick /*
2*41486Smckusick  * Copyright (c) 1988 University of Utah.
3*41486Smckusick  * Copyright (c) 1990 The Regents of the University of California.
4*41486Smckusick  * All rights reserved.
5*41486Smckusick  *
6*41486Smckusick  * This code is derived from software contributed to Berkeley by
7*41486Smckusick  * the Systems Programming Group of the University of Utah Computer
8*41486Smckusick  * Science Department.
9*41486Smckusick  *
10*41486Smckusick  * %sccs.include.redist.c%
11*41486Smckusick  *
12*41486Smckusick  * from: Utah $Hdr: hpux_compat.c 1.33 89/08/23$
13*41486Smckusick  *
14*41486Smckusick  *	@(#)hpux_sig.c	7.1 (Berkeley) 05/08/90
15*41486Smckusick  */
16*41486Smckusick 
17*41486Smckusick /*
18*41486Smckusick  * Signal related HPUX compatibility routines
19*41486Smckusick  */
20*41486Smckusick 
21*41486Smckusick #ifdef HPUXCOMPAT
22*41486Smckusick 
23*41486Smckusick #include "param.h"
24*41486Smckusick #include "systm.h"
25*41486Smckusick #include "user.h"
26*41486Smckusick #include "kernel.h"
27*41486Smckusick #include "proc.h"
28*41486Smckusick #include "hpux.h"
29*41486Smckusick 
30*41486Smckusick /* indexed by HPUX signal number - 1 */
31*41486Smckusick char hpuxtobsdsigmap[NSIG] = {
32*41486Smckusick /*01*/	SIGHUP,  SIGINT, SIGQUIT, SIGILL,   SIGTRAP, SIGIOT,  SIGEMT,   SIGFPE,
33*41486Smckusick /*09*/  SIGKILL, SIGBUS, SIGSEGV, SIGSYS,   SIGPIPE, SIGALRM, SIGTERM,  SIGUSR1,
34*41486Smckusick /*17*/  SIGUSR2, SIGCHLD, 0,      SIGVTALRM,SIGPROF, SIGIO,   SIGWINCH, SIGSTOP,
35*41486Smckusick /*25*/	SIGTSTP, SIGCONT,SIGTTIN, SIGTTOU,  SIGURG,  0,       0,        0
36*41486Smckusick };
37*41486Smckusick 
38*41486Smckusick /* indexed by BSD signal number - 1 */
39*41486Smckusick char bsdtohpuxsigmap[NSIG] = {
40*41486Smckusick /*01*/	 1,  2,  3,  4,  5,  6,  7,  8,
41*41486Smckusick /*09*/   9, 10, 11, 12, 13, 14, 15, 29,
42*41486Smckusick /*17*/  24, 25, 26, 18, 27, 28, 22,  0,
43*41486Smckusick /*25*/	 0, 20, 21, 23,  0, 16, 17,  0
44*41486Smckusick };
45*41486Smckusick 
46*41486Smckusick /*
47*41486Smckusick  * XXX: In addition to mapping the signal number we also have
48*41486Smckusick  * to see if the "old" style signal mechinism is needed.
49*41486Smckusick  * If so, we set the OUSIG flag.  This is not really correct
50*41486Smckusick  * as under HP-UX "old" style handling can be set on a per
51*41486Smckusick  * signal basis and we are setting it for all signals in one
52*41486Smckusick  * swell foop.  I suspect we can get away with this since I
53*41486Smckusick  * doubt any program of interest mixes the two semantics.
54*41486Smckusick  */
55*41486Smckusick hpuxsigvec()
56*41486Smckusick {
57*41486Smckusick 	register struct a {
58*41486Smckusick 		int	signo;
59*41486Smckusick 		struct	sigvec *nsv;
60*41486Smckusick 		struct	sigvec *osv;
61*41486Smckusick 	} *uap = (struct a  *)u.u_ap;
62*41486Smckusick 	struct sigvec vec;
63*41486Smckusick 	register struct sigvec *sv;
64*41486Smckusick 	register int sig;
65*41486Smckusick 	int bit;
66*41486Smckusick 
67*41486Smckusick 	sig = hpuxtobsdsig(uap->signo);
68*41486Smckusick 	if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
69*41486Smckusick 		u.u_error = EINVAL;
70*41486Smckusick 		return;
71*41486Smckusick 	}
72*41486Smckusick 	sv = &vec;
73*41486Smckusick 	if (uap->osv) {
74*41486Smckusick 		sv->sv_handler = u.u_signal[sig];
75*41486Smckusick 		sv->sv_mask = u.u_sigmask[sig];
76*41486Smckusick 		bit = sigmask(sig);
77*41486Smckusick 		sv->sv_flags = 0;
78*41486Smckusick 		if ((u.u_sigonstack & bit) != 0)
79*41486Smckusick 			sv->sv_flags |= SV_ONSTACK;
80*41486Smckusick 		if ((u.u_sigintr & bit) != 0)
81*41486Smckusick 			sv->sv_flags |= SV_INTERRUPT;
82*41486Smckusick #if 0
83*41486Smckusick /* XXX -- SOUSIG no longer exists, do something here */
84*41486Smckusick 		if (u.u_procp->p_flag & SOUSIG)
85*41486Smckusick 			sv->sv_flags |= HPUXSV_RESET;		/* XXX */
86*41486Smckusick #endif
87*41486Smckusick 		u.u_error =
88*41486Smckusick 		    copyout((caddr_t)sv, (caddr_t)uap->osv, sizeof (vec));
89*41486Smckusick 		if (u.u_error)
90*41486Smckusick 			return;
91*41486Smckusick 	}
92*41486Smckusick 	if (uap->nsv) {
93*41486Smckusick 		u.u_error =
94*41486Smckusick 		    copyin((caddr_t)uap->nsv, (caddr_t)sv, sizeof (vec));
95*41486Smckusick 		if (u.u_error)
96*41486Smckusick 			return;
97*41486Smckusick 		if (sig == SIGCONT && sv->sv_handler == SIG_IGN) {
98*41486Smckusick 			u.u_error = EINVAL;
99*41486Smckusick 			return;
100*41486Smckusick 		}
101*41486Smckusick 		setsigvec(sig, (struct sigaction *)sv);
102*41486Smckusick #if 0
103*41486Smckusick /* XXX -- SOUSIG no longer exists, do something here */
104*41486Smckusick 		if (sv->sv_flags & HPUXSV_RESET)
105*41486Smckusick 			u.u_procp->p_flag |= SOUSIG;		/* XXX */
106*41486Smckusick #endif
107*41486Smckusick 	}
108*41486Smckusick }
109*41486Smckusick 
110*41486Smckusick hpuxsigblock()
111*41486Smckusick {
112*41486Smckusick 	struct a {
113*41486Smckusick 		int	mask;
114*41486Smckusick 	} *uap = (struct a *)u.u_ap;
115*41486Smckusick 
116*41486Smckusick 	(void) splhigh();
117*41486Smckusick 	u.u_r.r_val1 = bsdtohpuxmask(u.u_procp->p_sigmask);
118*41486Smckusick 	u.u_procp->p_sigmask |= hpuxtobsdmask(uap->mask) &~ sigcantmask;
119*41486Smckusick 	(void) spl0();
120*41486Smckusick }
121*41486Smckusick 
122*41486Smckusick hpuxsigsetmask()
123*41486Smckusick {
124*41486Smckusick 	struct a {
125*41486Smckusick 		int	mask;
126*41486Smckusick 	} *uap = (struct a *)u.u_ap;
127*41486Smckusick 
128*41486Smckusick 	(void) splhigh();
129*41486Smckusick 	u.u_r.r_val1 = bsdtohpuxmask(u.u_procp->p_sigmask);
130*41486Smckusick 	u.u_procp->p_sigmask = hpuxtobsdmask(uap->mask) &~ sigcantmask;
131*41486Smckusick 	(void) spl0();
132*41486Smckusick }
133*41486Smckusick 
134*41486Smckusick hpuxsigpause()
135*41486Smckusick {
136*41486Smckusick 	struct a {
137*41486Smckusick 		int	mask;
138*41486Smckusick 	} *uap = (struct a *)u.u_ap;
139*41486Smckusick 
140*41486Smckusick 	uap->mask = hpuxtobsdmask(uap->mask);
141*41486Smckusick 	sigsuspend();
142*41486Smckusick }
143*41486Smckusick 
144*41486Smckusick /* not totally correct, but close enuf' */
145*41486Smckusick hpuxkill()
146*41486Smckusick {
147*41486Smckusick 	struct a {
148*41486Smckusick 		int	pid;
149*41486Smckusick 		int	signo;
150*41486Smckusick 	} *uap = (struct a *)u.u_ap;
151*41486Smckusick 
152*41486Smckusick 	if (uap->signo) {
153*41486Smckusick 		uap->signo = hpuxtobsdsig(uap->signo);
154*41486Smckusick 		if (uap->signo == 0)
155*41486Smckusick 			uap->signo = NSIG;
156*41486Smckusick 	}
157*41486Smckusick 	kill();
158*41486Smckusick }
159*41486Smckusick 
160*41486Smckusick ohpuxssig()
161*41486Smckusick {
162*41486Smckusick 	struct a {
163*41486Smckusick 		int	signo;
164*41486Smckusick 		sig_t	fun;
165*41486Smckusick 	} *uap = (struct a *)u.u_ap;
166*41486Smckusick 	register int a;
167*41486Smckusick 	struct sigvec vec;
168*41486Smckusick 	register struct sigvec *sv = &vec;
169*41486Smckusick 	struct proc *p = u.u_procp;
170*41486Smckusick 
171*41486Smckusick 	a = hpuxtobsdsig(uap->signo);
172*41486Smckusick 	sv->sv_handler = uap->fun;
173*41486Smckusick 	/*
174*41486Smckusick 	 * Kill processes trying to use job control facilities
175*41486Smckusick 	 * (this'll help us find any vestiges of the old stuff).
176*41486Smckusick 	 */
177*41486Smckusick 	if ((a &~ 0377) ||
178*41486Smckusick 	    (sv->sv_handler != SIG_DFL && sv->sv_handler != SIG_IGN &&
179*41486Smckusick 	     ((int)sv->sv_handler) & 1)) {
180*41486Smckusick 		psignal(p, SIGSYS);
181*41486Smckusick 		return;
182*41486Smckusick 	}
183*41486Smckusick 	if (a <= 0 || a >= NSIG || a == SIGKILL || a == SIGSTOP ||
184*41486Smckusick 	    a == SIGCONT && sv->sv_handler == SIG_IGN) {
185*41486Smckusick 		u.u_error = EINVAL;
186*41486Smckusick 		return;
187*41486Smckusick 	}
188*41486Smckusick 	sv->sv_mask = 0;
189*41486Smckusick 	sv->sv_flags = SV_INTERRUPT;
190*41486Smckusick 	u.u_r.r_val1 = (int)u.u_signal[a];
191*41486Smckusick 	setsigvec(a, (struct sigaction *)sv);
192*41486Smckusick #if 0
193*41486Smckusick 	p->p_flag |= SOUSIG;		/* mark as simulating old stuff */
194*41486Smckusick #endif
195*41486Smckusick }
196*41486Smckusick 
197*41486Smckusick /* signal numbers: convert from HPUX to BSD */
198*41486Smckusick hpuxtobsdsig(sig)
199*41486Smckusick 	register int sig;
200*41486Smckusick {
201*41486Smckusick 	if (--sig < 0 || sig >= NSIG)
202*41486Smckusick 		return(0);
203*41486Smckusick 	return((int)hpuxtobsdsigmap[sig]);
204*41486Smckusick }
205*41486Smckusick 
206*41486Smckusick /* signal numbers: convert from BSD to HPUX */
207*41486Smckusick bsdtohpuxsig(sig)
208*41486Smckusick 	register int sig;
209*41486Smckusick {
210*41486Smckusick 	if (--sig < 0 || sig >= NSIG)
211*41486Smckusick 		return(0);
212*41486Smckusick 	return((int)bsdtohpuxsigmap[sig]);
213*41486Smckusick }
214*41486Smckusick 
215*41486Smckusick /* signal masks: convert from HPUX to BSD (not pretty or fast) */
216*41486Smckusick hpuxtobsdmask(mask)
217*41486Smckusick 	register int mask;
218*41486Smckusick {
219*41486Smckusick 	register int nmask, sig, nsig;
220*41486Smckusick 
221*41486Smckusick 	if (mask == 0 || mask == -1)
222*41486Smckusick 		return(mask);
223*41486Smckusick 	nmask = 0;
224*41486Smckusick 	for (sig = 1; sig < NSIG; sig++)
225*41486Smckusick 		if ((mask & sigmask(sig)) && (nsig = hpuxtobsdsig(sig)))
226*41486Smckusick 			nmask |= sigmask(nsig);
227*41486Smckusick 	return(nmask);
228*41486Smckusick }
229*41486Smckusick 
230*41486Smckusick bsdtohpuxmask(mask)
231*41486Smckusick 	register int mask;
232*41486Smckusick {
233*41486Smckusick 	register int nmask, sig, nsig;
234*41486Smckusick 
235*41486Smckusick 	if (mask == 0 || mask == -1)
236*41486Smckusick 		return(mask);
237*41486Smckusick 	nmask = 0;
238*41486Smckusick 	for (sig = 1; sig < NSIG; sig++)
239*41486Smckusick 		if ((mask & sigmask(sig)) && (nsig = bsdtohpuxsig(sig)))
240*41486Smckusick 			nmask |= sigmask(nsig);
241*41486Smckusick 	return(nmask);
242*41486Smckusick }
243*41486Smckusick #endif
244