|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 University of Utah. ! 3: * Copyright (c) 1990 The Regents of the University of California. ! 4: * All rights reserved. ! 5: * ! 6: * This code is derived from software contributed to Berkeley by ! 7: * the Systems Programming Group of the University of Utah Computer ! 8: * Science Department. ! 9: * ! 10: * Redistribution is only permitted until one year after the first shipment ! 11: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 12: * binary forms are permitted provided that: (1) source distributions retain ! 13: * this entire copyright notice and comment, and (2) distributions including ! 14: * binaries display the following acknowledgement: This product includes ! 15: * software developed by the University of California, Berkeley and its ! 16: * contributors'' in the documentation or other materials provided with the ! 17: * distribution and in all advertising materials mentioning features or use ! 18: * of this software. Neither the name of the University nor the names of ! 19: * its contributors may be used to endorse or promote products derived from ! 20: * this software without specific prior written permission. ! 21: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 22: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 23: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 24: * ! 25: * from: Utah $Hdr: hpux_compat.c 1.33 89/08/23$ ! 26: * ! 27: * @(#)hpux_sig.c 7.4 (Berkeley) 6/28/90 ! 28: */ ! 29: ! 30: /* ! 31: * Signal related HPUX compatibility routines ! 32: */ ! 33: ! 34: #ifdef HPUXCOMPAT ! 35: ! 36: #include "param.h" ! 37: #include "systm.h" ! 38: #include "user.h" ! 39: #include "kernel.h" ! 40: #include "proc.h" ! 41: #include "hpux.h" ! 42: ! 43: /* indexed by HPUX signal number - 1 */ ! 44: char hpuxtobsdsigmap[NSIG] = { ! 45: /*01*/ SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGIOT, SIGEMT, SIGFPE, ! 46: /*09*/ SIGKILL, SIGBUS, SIGSEGV, SIGSYS, SIGPIPE, SIGALRM, SIGTERM, SIGUSR1, ! 47: /*17*/ SIGUSR2, SIGCHLD, 0, SIGVTALRM,SIGPROF, SIGIO, SIGWINCH, SIGSTOP, ! 48: /*25*/ SIGTSTP, SIGCONT,SIGTTIN, SIGTTOU, SIGURG, 0, 0, 0 ! 49: }; ! 50: ! 51: /* indexed by BSD signal number - 1 */ ! 52: char bsdtohpuxsigmap[NSIG] = { ! 53: /*01*/ 1, 2, 3, 4, 5, 6, 7, 8, ! 54: /*09*/ 9, 10, 11, 12, 13, 14, 15, 29, ! 55: /*17*/ 24, 25, 26, 18, 27, 28, 22, 0, ! 56: /*25*/ 0, 20, 21, 23, 0, 16, 17, 0 ! 57: }; ! 58: ! 59: /* ! 60: * XXX: In addition to mapping the signal number we also have ! 61: * to see if the "old" style signal mechinism is needed. ! 62: * If so, we set the OUSIG flag. This is not really correct ! 63: * as under HP-UX "old" style handling can be set on a per ! 64: * signal basis and we are setting it for all signals in one ! 65: * swell foop. I suspect we can get away with this since I ! 66: * doubt any program of interest mixes the two semantics. ! 67: */ ! 68: hpuxsigvec(p, uap, retval) ! 69: struct proc *p; ! 70: register struct args { ! 71: int signo; ! 72: struct sigvec *nsv; ! 73: struct sigvec *osv; ! 74: } *uap; ! 75: int *retval; ! 76: { ! 77: struct sigvec vec; ! 78: register struct sigvec *sv; ! 79: register int sig; ! 80: int bit, error; ! 81: ! 82: sig = hpuxtobsdsig(uap->signo); ! 83: if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) ! 84: return (EINVAL); ! 85: sv = &vec; ! 86: if (uap->osv) { ! 87: sv->sv_handler = u.u_signal[sig]; ! 88: sv->sv_mask = u.u_sigmask[sig]; ! 89: bit = sigmask(sig); ! 90: sv->sv_flags = 0; ! 91: if ((u.u_sigonstack & bit) != 0) ! 92: sv->sv_flags |= SV_ONSTACK; ! 93: if ((u.u_sigintr & bit) != 0) ! 94: sv->sv_flags |= SV_INTERRUPT; ! 95: #if 0 ! 96: /* XXX -- SOUSIG no longer exists, do something here */ ! 97: if (p->p_flag & SOUSIG) ! 98: sv->sv_flags |= HPUXSV_RESET; /* XXX */ ! 99: #endif ! 100: error = copyout((caddr_t)sv, (caddr_t)uap->osv, sizeof (vec)); ! 101: if (error) ! 102: return (error); ! 103: } ! 104: if (uap->nsv) { ! 105: error = copyin((caddr_t)uap->nsv, (caddr_t)sv, sizeof (vec)); ! 106: if (error) ! 107: return (error); ! 108: if (sig == SIGCONT && sv->sv_handler == SIG_IGN) ! 109: return (EINVAL); ! 110: setsigvec(p, sig, (struct sigaction *)sv); ! 111: #if 0 ! 112: /* XXX -- SOUSIG no longer exists, do something here */ ! 113: if (sv->sv_flags & HPUXSV_RESET) ! 114: p->p_flag |= SOUSIG; /* XXX */ ! 115: #endif ! 116: } ! 117: return (0); ! 118: } ! 119: ! 120: hpuxsigblock(p, uap, retval) ! 121: register struct proc *p; ! 122: struct args { ! 123: int mask; ! 124: } *uap; ! 125: int *retval; ! 126: { ! 127: ! 128: (void) splhigh(); ! 129: *retval = bsdtohpuxmask(p->p_sigmask); ! 130: p->p_sigmask |= hpuxtobsdmask(uap->mask) &~ sigcantmask; ! 131: (void) spl0(); ! 132: return (0); ! 133: } ! 134: ! 135: hpuxsigsetmask(p, uap, retval) ! 136: struct proc *p; ! 137: struct args { ! 138: int mask; ! 139: } *uap; ! 140: int *retval; ! 141: { ! 142: ! 143: (void) splhigh(); ! 144: *retval = bsdtohpuxmask(p->p_sigmask); ! 145: p->p_sigmask = hpuxtobsdmask(uap->mask) &~ sigcantmask; ! 146: (void) spl0(); ! 147: return (0); ! 148: } ! 149: ! 150: hpuxsigpause(p, uap, retval) ! 151: struct proc *p; ! 152: struct args { ! 153: int mask; ! 154: } *uap; ! 155: int *retval; ! 156: { ! 157: ! 158: uap->mask = hpuxtobsdmask(uap->mask); ! 159: return (sigsuspend(p, uap, retval)); ! 160: } ! 161: ! 162: /* not totally correct, but close enuf' */ ! 163: hpuxkill(p, uap, retval) ! 164: struct proc *p; ! 165: struct args { ! 166: int pid; ! 167: int signo; ! 168: } *uap; ! 169: int *retval; ! 170: { ! 171: ! 172: if (uap->signo) { ! 173: uap->signo = hpuxtobsdsig(uap->signo); ! 174: if (uap->signo == 0) ! 175: uap->signo = NSIG; ! 176: } ! 177: return (kill(p, uap, retval)); ! 178: } ! 179: ! 180: ohpuxssig(p, uap, retval) ! 181: struct proc *p; ! 182: struct args { ! 183: int signo; ! 184: sig_t fun; ! 185: } *uap; ! 186: int *retval; ! 187: { ! 188: register int a; ! 189: struct sigvec vec; ! 190: register struct sigvec *sv = &vec; ! 191: ! 192: a = hpuxtobsdsig(uap->signo); ! 193: sv->sv_handler = uap->fun; ! 194: /* ! 195: * Kill processes trying to use job control facilities ! 196: * (this'll help us find any vestiges of the old stuff). ! 197: */ ! 198: if ((a &~ 0377) || ! 199: (sv->sv_handler != SIG_DFL && sv->sv_handler != SIG_IGN && ! 200: ((int)sv->sv_handler) & 1)) { ! 201: psignal(p, SIGSYS); ! 202: return (0); ! 203: } ! 204: if (a <= 0 || a >= NSIG || a == SIGKILL || a == SIGSTOP || ! 205: a == SIGCONT && sv->sv_handler == SIG_IGN) ! 206: return (EINVAL); ! 207: sv->sv_mask = 0; ! 208: sv->sv_flags = SV_INTERRUPT; ! 209: *retval = (int)u.u_signal[a]; ! 210: setsigvec(p, a, (struct sigaction *)sv); ! 211: #if 0 ! 212: p->p_flag |= SOUSIG; /* mark as simulating old stuff */ ! 213: #endif ! 214: return (0); ! 215: } ! 216: ! 217: /* signal numbers: convert from HPUX to BSD */ ! 218: hpuxtobsdsig(sig) ! 219: register int sig; ! 220: { ! 221: if (--sig < 0 || sig >= NSIG) ! 222: return(0); ! 223: return((int)hpuxtobsdsigmap[sig]); ! 224: } ! 225: ! 226: /* signal numbers: convert from BSD to HPUX */ ! 227: bsdtohpuxsig(sig) ! 228: register int sig; ! 229: { ! 230: if (--sig < 0 || sig >= NSIG) ! 231: return(0); ! 232: return((int)bsdtohpuxsigmap[sig]); ! 233: } ! 234: ! 235: /* signal masks: convert from HPUX to BSD (not pretty or fast) */ ! 236: hpuxtobsdmask(mask) ! 237: register int mask; ! 238: { ! 239: register int nmask, sig, nsig; ! 240: ! 241: if (mask == 0 || mask == -1) ! 242: return(mask); ! 243: nmask = 0; ! 244: for (sig = 1; sig < NSIG; sig++) ! 245: if ((mask & sigmask(sig)) && (nsig = hpuxtobsdsig(sig))) ! 246: nmask |= sigmask(nsig); ! 247: return(nmask); ! 248: } ! 249: ! 250: bsdtohpuxmask(mask) ! 251: register int mask; ! 252: { ! 253: register int nmask, sig, nsig; ! 254: ! 255: if (mask == 0 || mask == -1) ! 256: return(mask); ! 257: nmask = 0; ! 258: for (sig = 1; sig < NSIG; sig++) ! 259: if ((mask & sigmask(sig)) && (nsig = bsdtohpuxsig(sig))) ! 260: nmask |= sigmask(nsig); ! 261: return(nmask); ! 262: } ! 263: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.