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