Annotation of sys/compat/common/kern_sig_43.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: kern_sig_43.c,v 1.7 2003/06/02 23:27:59 millert Exp $ */
! 2: /* $NetBSD: kern_sig_43.c,v 1.7 1996/03/14 19:31:47 christos Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1982, 1986, 1989, 1991, 1993
! 6: * The Regents of the University of California. All rights reserved.
! 7: * (c) UNIX System Laboratories, Inc.
! 8: * All or some portions of this file are derived from material licensed
! 9: * to the University of California by American Telephone and Telegraph
! 10: * Co. or Unix System Laboratories, Inc. and are reproduced herein with
! 11: * the permission of UNIX System Laboratories, Inc.
! 12: *
! 13: * Redistribution and use in source and binary forms, with or without
! 14: * modification, are permitted provided that the following conditions
! 15: * are met:
! 16: * 1. Redistributions of source code must retain the above copyright
! 17: * notice, this list of conditions and the following disclaimer.
! 18: * 2. Redistributions in binary form must reproduce the above copyright
! 19: * notice, this list of conditions and the following disclaimer in the
! 20: * documentation and/or other materials provided with the distribution.
! 21: * 3. Neither the name of the University nor the names of its contributors
! 22: * may be used to endorse or promote products derived from this software
! 23: * without specific prior written permission.
! 24: *
! 25: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 26: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 27: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 28: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 29: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 30: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 31: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 32: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 33: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 34: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 35: * SUCH DAMAGE.
! 36: *
! 37: * @(#)kern_sig.c 8.7 (Berkeley) 4/18/94
! 38: */
! 39:
! 40: #include <sys/param.h>
! 41: #include <sys/signalvar.h>
! 42: #include <sys/resourcevar.h>
! 43: #include <sys/namei.h>
! 44: #include <sys/vnode.h>
! 45: #include <sys/proc.h>
! 46: #include <sys/systm.h>
! 47: #include <sys/timeb.h>
! 48: #include <sys/times.h>
! 49: #include <sys/buf.h>
! 50: #include <sys/acct.h>
! 51: #include <sys/file.h>
! 52: #include <sys/kernel.h>
! 53: #include <sys/wait.h>
! 54: #include <sys/ktrace.h>
! 55: #include <sys/syslog.h>
! 56: #include <sys/stat.h>
! 57: #include <sys/core.h>
! 58:
! 59: #include <sys/mount.h>
! 60: #include <sys/syscallargs.h>
! 61:
! 62: #include <machine/cpu.h>
! 63:
! 64: #include <uvm/uvm_extern.h>
! 65: #include <sys/user.h> /* for coredump */
! 66:
! 67: int
! 68: compat_43_sys_sigblock(p, v, retval)
! 69: register struct proc *p;
! 70: void *v;
! 71: register_t *retval;
! 72: {
! 73: struct compat_43_sys_sigblock_args /* {
! 74: syscallarg(int) mask;
! 75: } */ *uap = v;
! 76: int s;
! 77:
! 78: s = splhigh();
! 79: *retval = p->p_sigmask;
! 80: p->p_sigmask |= SCARG(uap, mask) &~ sigcantmask;
! 81: splx(s);
! 82: return (0);
! 83: }
! 84:
! 85:
! 86: int
! 87: compat_43_sys_sigsetmask(p, v, retval)
! 88: struct proc *p;
! 89: void *v;
! 90: register_t *retval;
! 91: {
! 92: struct compat_43_sys_sigsetmask_args /* {
! 93: syscallarg(int) mask;
! 94: } */ *uap = v;
! 95: int s;
! 96:
! 97: s = splhigh();
! 98: *retval = p->p_sigmask;
! 99: p->p_sigmask = SCARG(uap, mask) &~ sigcantmask;
! 100: splx(s);
! 101: return (0);
! 102: }
! 103:
! 104:
! 105: /* ARGSUSED */
! 106: int
! 107: compat_43_sys_sigstack(p, v, retval)
! 108: struct proc *p;
! 109: void *v;
! 110: register_t *retval;
! 111: {
! 112: register struct compat_43_sys_sigstack_args /* {
! 113: syscallarg(struct sigstack *) nss;
! 114: syscallarg(struct sigstack *) oss;
! 115: } */ *uap = v;
! 116: struct sigstack ss;
! 117: struct sigacts *psp;
! 118: int error = 0;
! 119:
! 120: psp = p->p_sigacts;
! 121: ss.ss_sp = psp->ps_sigstk.ss_sp;
! 122: ss.ss_onstack = psp->ps_sigstk.ss_flags & SS_ONSTACK;
! 123: if (SCARG(uap, oss) && (error = copyout((caddr_t)&ss,
! 124: (caddr_t)SCARG(uap, oss), sizeof (struct sigstack))))
! 125: return (error);
! 126: if (SCARG(uap, nss) == 0)
! 127: return (0);
! 128: error = copyin((caddr_t)SCARG(uap, nss), (caddr_t)&ss,
! 129: sizeof (ss));
! 130: if (error)
! 131: return (error);
! 132: psp->ps_flags |= SAS_ALTSTACK;
! 133: psp->ps_sigstk.ss_sp = ss.ss_sp;
! 134: psp->ps_sigstk.ss_size = 0;
! 135: psp->ps_sigstk.ss_flags |= ss.ss_onstack & SS_ONSTACK;
! 136: return (0);
! 137: }
! 138:
! 139: /*
! 140: * Generalized interface signal handler, 4.3-compatible.
! 141: */
! 142: /* ARGSUSED */
! 143: int
! 144: compat_43_sys_sigvec(p, v, retval)
! 145: struct proc *p;
! 146: void *v;
! 147: register_t *retval;
! 148: {
! 149: register struct compat_43_sys_sigvec_args /* {
! 150: syscallarg(int) signum;
! 151: syscallarg(struct sigvec *) nsv;
! 152: syscallarg(struct sigvec *) osv;
! 153: } */ *uap = v;
! 154: struct sigvec vec;
! 155: register struct sigacts *ps = p->p_sigacts;
! 156: register struct sigvec *sv;
! 157: register int signum;
! 158: int bit, error;
! 159:
! 160: signum = SCARG(uap, signum);
! 161: if (signum <= 0 || signum >= NSIG ||
! 162: signum == SIGKILL || signum == SIGSTOP)
! 163: return (EINVAL);
! 164: sv = &vec;
! 165: if (SCARG(uap, osv)) {
! 166: *(sig_t *)&sv->sv_handler = ps->ps_sigact[signum];
! 167: sv->sv_mask = ps->ps_catchmask[signum];
! 168: bit = sigmask(signum);
! 169: sv->sv_flags = 0;
! 170: if ((ps->ps_sigonstack & bit) != 0)
! 171: sv->sv_flags |= SV_ONSTACK;
! 172: if ((ps->ps_sigintr & bit) != 0)
! 173: sv->sv_flags |= SV_INTERRUPT;
! 174: if ((ps->ps_sigreset & bit) != 0)
! 175: sv->sv_flags |= SV_RESETHAND;
! 176: if (p->p_flag & P_NOCLDSTOP)
! 177: sv->sv_flags |= SA_NOCLDSTOP;
! 178: sv->sv_mask &= ~bit;
! 179: error = copyout((caddr_t)sv, (caddr_t)SCARG(uap, osv),
! 180: sizeof (vec));
! 181: if (error)
! 182: return (error);
! 183: }
! 184: if (SCARG(uap, nsv)) {
! 185: error = copyin((caddr_t)SCARG(uap, nsv), (caddr_t)sv,
! 186: sizeof (vec));
! 187: if (error)
! 188: return (error);
! 189: sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */
! 190: setsigvec(p, signum, (struct sigaction *)sv);
! 191: }
! 192: return (0);
! 193: }
! 194:
! 195:
! 196: /* ARGSUSED */
! 197: int
! 198: compat_43_sys_killpg(p, v, retval)
! 199: struct proc *p;
! 200: void *v;
! 201: register_t *retval;
! 202: {
! 203: register struct compat_43_sys_killpg_args /* {
! 204: syscallarg(int) pgid;
! 205: syscallarg(int) signum;
! 206: } */ *uap = v;
! 207:
! 208: if ((u_int)SCARG(uap, signum) >= NSIG)
! 209: return (EINVAL);
! 210: return (killpg1(p, SCARG(uap, signum), SCARG(uap, pgid), 0));
! 211: }
CVSweb