1*dab6ef8bSlukem /* $NetBSD: kern_sig_13.c,v 1.6 2001/11/13 02:08:01 lukem Exp $ */ 2a255f23eSkleink 3a255f23eSkleink /*- 4fb526e05Smycroft * Copyright (c) 1998 The NetBSD Foundation, Inc. 5a255f23eSkleink * All rights reserved. 6a255f23eSkleink * 7a255f23eSkleink * This code is derived from software contributed to The NetBSD Foundation 8fb526e05Smycroft * by Charles M. Hannum. 9a255f23eSkleink * 10a255f23eSkleink * Redistribution and use in source and binary forms, with or without 11a255f23eSkleink * modification, are permitted provided that the following conditions 12a255f23eSkleink * are met: 13a255f23eSkleink * 1. Redistributions of source code must retain the above copyright 14a255f23eSkleink * notice, this list of conditions and the following disclaimer. 15a255f23eSkleink * 2. Redistributions in binary form must reproduce the above copyright 16a255f23eSkleink * notice, this list of conditions and the following disclaimer in the 17a255f23eSkleink * documentation and/or other materials provided with the distribution. 18a255f23eSkleink * 3. All advertising materials mentioning features or use of this software 19a255f23eSkleink * must display the following acknowledgement: 20a255f23eSkleink * This product includes software developed by the NetBSD 21a255f23eSkleink * Foundation, Inc. and its contributors. 22a255f23eSkleink * 4. Neither the name of The NetBSD Foundation nor the names of its 23a255f23eSkleink * contributors may be used to endorse or promote products derived 24a255f23eSkleink * from this software without specific prior written permission. 25a255f23eSkleink * 26a255f23eSkleink * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27a255f23eSkleink * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28a255f23eSkleink * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29a255f23eSkleink * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30a255f23eSkleink * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31a255f23eSkleink * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32a255f23eSkleink * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33a255f23eSkleink * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34a255f23eSkleink * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35a255f23eSkleink * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36a255f23eSkleink * POSSIBILITY OF SUCH DAMAGE. 37a255f23eSkleink */ 38a255f23eSkleink 39*dab6ef8bSlukem #include <sys/cdefs.h> 40*dab6ef8bSlukem __KERNEL_RCSID(0, "$NetBSD: kern_sig_13.c,v 1.6 2001/11/13 02:08:01 lukem Exp $"); 41*dab6ef8bSlukem 42a255f23eSkleink #include <sys/param.h> 43a255f23eSkleink #include <sys/proc.h> 44a255f23eSkleink #include <sys/signal.h> 45fb526e05Smycroft #include <sys/signalvar.h> 46a255f23eSkleink #include <sys/systm.h> 47a255f23eSkleink 48a255f23eSkleink #include <sys/mount.h> 49a255f23eSkleink #include <sys/syscallargs.h> 50a255f23eSkleink 515d7a8f4aSkleink #include <machine/limits.h> 525d7a8f4aSkleink 53a255f23eSkleink #include <compat/common/compat_util.h> 54a255f23eSkleink 55fb526e05Smycroft void 56fb526e05Smycroft native_sigset13_to_sigset(oss, ss) 57fb526e05Smycroft const sigset13_t *oss; 58fb526e05Smycroft sigset_t *ss; 59fb526e05Smycroft { 60fb526e05Smycroft 61fb526e05Smycroft ss->__bits[0] = *oss; 62fb526e05Smycroft ss->__bits[1] = 0; 63fb526e05Smycroft ss->__bits[2] = 0; 64fb526e05Smycroft ss->__bits[3] = 0; 65fb526e05Smycroft } 66fb526e05Smycroft 67fb526e05Smycroft void 68fb526e05Smycroft native_sigset_to_sigset13(ss, oss) 69fb526e05Smycroft const sigset_t *ss; 70fb526e05Smycroft sigset13_t *oss; 71fb526e05Smycroft { 72fb526e05Smycroft 73fb526e05Smycroft *oss = ss->__bits[0]; 74fb526e05Smycroft } 75fb526e05Smycroft 76fb526e05Smycroft void 77fb526e05Smycroft native_sigaction13_to_sigaction(osa, sa) 78fb526e05Smycroft const struct sigaction13 *osa; 79fb526e05Smycroft struct sigaction *sa; 80fb526e05Smycroft { 81fb526e05Smycroft 82fb526e05Smycroft sa->sa_handler = osa->sa_handler; 83fb526e05Smycroft native_sigset13_to_sigset(&osa->sa_mask, &sa->sa_mask); 84fb526e05Smycroft sa->sa_flags = osa->sa_flags; 85fb526e05Smycroft } 86fb526e05Smycroft 87fb526e05Smycroft void 88fb526e05Smycroft native_sigaction_to_sigaction13(sa, osa) 89fb526e05Smycroft const struct sigaction *sa; 90fb526e05Smycroft struct sigaction13 *osa; 91fb526e05Smycroft { 92fb526e05Smycroft 93fb526e05Smycroft osa->sa_handler = sa->sa_handler; 94fb526e05Smycroft native_sigset_to_sigset13(&sa->sa_mask, &osa->sa_mask); 95fb526e05Smycroft osa->sa_flags = sa->sa_flags; 96fb526e05Smycroft } 97fb526e05Smycroft 98fb526e05Smycroft void 99fb526e05Smycroft native_sigaltstack13_to_sigaltstack(osa, sa) 100fb526e05Smycroft const struct sigaltstack13 *osa; 101fb526e05Smycroft struct sigaltstack *sa; 102fb526e05Smycroft { 103fb526e05Smycroft 104fb526e05Smycroft sa->ss_sp = osa->ss_sp; 105fb526e05Smycroft sa->ss_size = osa->ss_size; 106fb526e05Smycroft sa->ss_flags = osa->ss_flags; 107fb526e05Smycroft } 108fb526e05Smycroft 109fb526e05Smycroft void 110fb526e05Smycroft native_sigaltstack_to_sigaltstack13(sa, osa) 111fb526e05Smycroft const struct sigaltstack *sa; 112fb526e05Smycroft struct sigaltstack13 *osa; 113fb526e05Smycroft { 114fb526e05Smycroft 115fb526e05Smycroft osa->ss_sp = sa->ss_sp; 116fb526e05Smycroft osa->ss_size = sa->ss_size; 117fb526e05Smycroft osa->ss_flags = sa->ss_flags; 118fb526e05Smycroft } 119a255f23eSkleink 120a255f23eSkleink int 121a255f23eSkleink compat_13_sys_sigaltstack(p, v, retval) 122a255f23eSkleink struct proc *p; 123a255f23eSkleink void *v; 124a255f23eSkleink register_t *retval; 125a255f23eSkleink { 126a255f23eSkleink struct compat_13_sys_sigaltstack_args /* { 127a255f23eSkleink syscallarg(const struct sigaltstack13 *) nss; 128a255f23eSkleink syscallarg(struct sigaltstack13 *) oss; 129a255f23eSkleink } */ *uap = v; 130fb526e05Smycroft struct sigaltstack13 ness, oess; 131fb526e05Smycroft struct sigaltstack nbss, obss; 132a255f23eSkleink int error; 133a255f23eSkleink 134fb526e05Smycroft if (SCARG(uap, nss)) { 135fb526e05Smycroft error = copyin(SCARG(uap, nss), &ness, sizeof(ness)); 136fb526e05Smycroft if (error) 137a255f23eSkleink return (error); 138fb526e05Smycroft native_sigaltstack13_to_sigaltstack(&ness, &nbss); 139fb526e05Smycroft } 140fb526e05Smycroft error = sigaltstack1(p, 141fb526e05Smycroft SCARG(uap, nss) ? &nbss : 0, SCARG(uap, oss) ? &obss : 0); 142fb526e05Smycroft if (error) 143a255f23eSkleink return (error); 144fb526e05Smycroft if (SCARG(uap, oss)) { 145fb526e05Smycroft native_sigaltstack_to_sigaltstack13(&obss, &oess); 146fb526e05Smycroft error = copyout(&oess, SCARG(uap, oss), sizeof(oess)); 147fb526e05Smycroft if (error) 148a255f23eSkleink return (error); 149a255f23eSkleink } 150a255f23eSkleink return (0); 151a255f23eSkleink } 152fb526e05Smycroft 153fb526e05Smycroft int 154fb526e05Smycroft compat_13_sys_sigaction(p, v, retval) 155fb526e05Smycroft struct proc *p; 156fb526e05Smycroft void *v; 157fb526e05Smycroft register_t *retval; 158fb526e05Smycroft { 159fb526e05Smycroft struct compat_13_sys_sigaction_args /* { 160fb526e05Smycroft syscallarg(int) signum; 161fb526e05Smycroft syscallarg(const struct sigaction13 *) nsa; 162fb526e05Smycroft syscallarg(struct sigaction13 *) osa; 163fb526e05Smycroft } */ *uap = v; 164fb526e05Smycroft struct sigaction13 nesa, oesa; 165fb526e05Smycroft struct sigaction nbsa, obsa; 166fb526e05Smycroft int error; 167fb526e05Smycroft 168fb526e05Smycroft if (SCARG(uap, nsa)) { 169fb526e05Smycroft error = copyin(SCARG(uap, nsa), &nesa, sizeof(nesa)); 170fb526e05Smycroft if (error) 171fb526e05Smycroft return (error); 172fb526e05Smycroft native_sigaction13_to_sigaction(&nesa, &nbsa); 173fb526e05Smycroft } 174fb526e05Smycroft error = sigaction1(p, SCARG(uap, signum), 175fb526e05Smycroft SCARG(uap, nsa) ? &nbsa : 0, SCARG(uap, osa) ? &obsa : 0); 176fb526e05Smycroft if (error) 177fb526e05Smycroft return (error); 178fb526e05Smycroft if (SCARG(uap, osa)) { 179fb526e05Smycroft native_sigaction_to_sigaction13(&obsa, &oesa); 180fb526e05Smycroft error = copyout(&oesa, SCARG(uap, osa), sizeof(oesa)); 181fb526e05Smycroft if (error) 182fb526e05Smycroft return (error); 183fb526e05Smycroft } 184fb526e05Smycroft return (0); 185fb526e05Smycroft } 186fb526e05Smycroft 187fb526e05Smycroft int 188fb526e05Smycroft compat_13_sys_sigprocmask(p, v, retval) 189a82aeb55Saugustss struct proc *p; 190fb526e05Smycroft void *v; 191fb526e05Smycroft register_t *retval; 192fb526e05Smycroft { 193fb526e05Smycroft struct compat_13_sys_sigprocmask_args /* { 194fb526e05Smycroft syscallarg(int) how; 195fb526e05Smycroft syscallarg(int) mask; 196fb526e05Smycroft } */ *uap = v; 197fb526e05Smycroft sigset13_t ness, oess; 198fb526e05Smycroft sigset_t nbss, obss; 199fb526e05Smycroft int error; 200fb526e05Smycroft 201fb526e05Smycroft ness = SCARG(uap, mask); 202fb526e05Smycroft native_sigset13_to_sigset(&ness, &nbss); 203fb526e05Smycroft error = sigprocmask1(p, SCARG(uap, how), &nbss, &obss); 204fb526e05Smycroft if (error) 205fb526e05Smycroft return (error); 206fb526e05Smycroft native_sigset_to_sigset13(&obss, &oess); 207fb526e05Smycroft *retval = oess; 208fb526e05Smycroft return (0); 209fb526e05Smycroft } 210fb526e05Smycroft 211fb526e05Smycroft int 212fb526e05Smycroft compat_13_sys_sigpending(p, v, retval) 213fb526e05Smycroft struct proc *p; 214fb526e05Smycroft void *v; 215fb526e05Smycroft register_t *retval; 216fb526e05Smycroft { 217fb526e05Smycroft sigset13_t ess; 218fb526e05Smycroft sigset_t bss; 219fb526e05Smycroft 220fb526e05Smycroft sigpending1(p, &bss); 221fb526e05Smycroft native_sigset_to_sigset13(&bss, &ess); 222fb526e05Smycroft *retval = ess; 223fb526e05Smycroft return (0); 224fb526e05Smycroft } 225fb526e05Smycroft 226fb526e05Smycroft int 227fb526e05Smycroft compat_13_sys_sigsuspend(p, v, retval) 228a82aeb55Saugustss struct proc *p; 229fb526e05Smycroft void *v; 230fb526e05Smycroft register_t *retval; 231fb526e05Smycroft { 232fb526e05Smycroft struct compat_13_sys_sigsuspend_args /* { 233fb526e05Smycroft syscallarg(sigset13_t) mask; 234fb526e05Smycroft } */ *uap = v; 235fb526e05Smycroft sigset13_t ess; 236fb526e05Smycroft sigset_t bss; 237fb526e05Smycroft 238fb526e05Smycroft ess = SCARG(uap, mask); 239fb526e05Smycroft native_sigset13_to_sigset(&ess, &bss); 240fb526e05Smycroft return (sigsuspend1(p, &bss)); 241fb526e05Smycroft } 242