1 1.15 dsl /* $NetBSD: freebsd_ioctl.c,v 1.15 2007/12/20 23:02:47 dsl Exp $ */ 2 1.1 mycroft 3 1.1 mycroft /* 4 1.1 mycroft * Copyright (c) 1995 Frank van der Linden 5 1.1 mycroft * All rights reserved. 6 1.1 mycroft * 7 1.1 mycroft * Redistribution and use in source and binary forms, with or without 8 1.1 mycroft * modification, are permitted provided that the following conditions 9 1.1 mycroft * are met: 10 1.1 mycroft * 1. Redistributions of source code must retain the above copyright 11 1.1 mycroft * notice, this list of conditions and the following disclaimer. 12 1.1 mycroft * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 mycroft * notice, this list of conditions and the following disclaimer in the 14 1.1 mycroft * documentation and/or other materials provided with the distribution. 15 1.1 mycroft * 3. All advertising materials mentioning features or use of this software 16 1.1 mycroft * must display the following acknowledgement: 17 1.1 mycroft * This product includes software developed for the NetBSD Project 18 1.1 mycroft * by Frank van der Linden 19 1.1 mycroft * 4. The name of the author may not be used to endorse or promote products 20 1.1 mycroft * derived from this software without specific prior written permission 21 1.1 mycroft * 22 1.1 mycroft * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 1.1 mycroft * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 1.1 mycroft * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 1.1 mycroft * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 1.1 mycroft * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 1.1 mycroft * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 1.1 mycroft * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 1.1 mycroft * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 1.1 mycroft * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 1.1 mycroft * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 1.1 mycroft */ 33 1.6 lukem 34 1.6 lukem #include <sys/cdefs.h> 35 1.15 dsl __KERNEL_RCSID(0, "$NetBSD: freebsd_ioctl.c,v 1.15 2007/12/20 23:02:47 dsl Exp $"); 36 1.1 mycroft 37 1.1 mycroft #include <sys/param.h> 38 1.1 mycroft #include <sys/systm.h> 39 1.1 mycroft #include <sys/proc.h> 40 1.1 mycroft #include <sys/mount.h> 41 1.4 onoe #include <sys/sockio.h> 42 1.1 mycroft 43 1.1 mycroft #include <sys/syscallargs.h> 44 1.1 mycroft 45 1.4 onoe #include <net/if.h> 46 1.4 onoe 47 1.13 christos #include <compat/sys/sockio.h> 48 1.13 christos 49 1.1 mycroft #include <compat/freebsd/freebsd_syscallargs.h> 50 1.5 jdolecek #include <compat/common/compat_util.h> 51 1.1 mycroft #include <compat/freebsd/freebsd_ioctl.h> 52 1.1 mycroft 53 1.2 augustss #include <compat/ossaudio/ossaudio.h> 54 1.3 augustss #include <compat/ossaudio/ossaudiovar.h> 55 1.3 augustss 56 1.3 augustss /* The FreeBSD and OSS(Linux) encodings of ioctl R/W differ. */ 57 1.15 dsl static void freebsd_to_oss(const struct freebsd_sys_ioctl_args *, 58 1.3 augustss struct oss_sys_ioctl_args *); 59 1.3 augustss 60 1.3 augustss static void 61 1.15 dsl freebsd_to_oss(const struct freebsd_sys_ioctl_args *uap, struct oss_sys_ioctl_args *rap) 62 1.3 augustss { 63 1.3 augustss u_long ocmd, ncmd; 64 1.3 augustss 65 1.3 augustss ocmd = SCARG(uap, com); 66 1.3 augustss ncmd = ocmd &~ FREEBSD_IOC_DIRMASK; 67 1.3 augustss switch(ocmd & FREEBSD_IOC_DIRMASK) { 68 1.3 augustss case FREEBSD_IOC_VOID: ncmd |= OSS_IOC_VOID; break; 69 1.3 augustss case FREEBSD_IOC_OUT: ncmd |= OSS_IOC_OUT; break; 70 1.3 augustss case FREEBSD_IOC_IN: ncmd |= OSS_IOC_IN; break; 71 1.3 augustss case FREEBSD_IOC_INOUT: ncmd |= OSS_IOC_INOUT; break; 72 1.3 augustss } 73 1.3 augustss SCARG(rap, fd) = SCARG(uap, fd); 74 1.3 augustss SCARG(rap, com) = ncmd; 75 1.3 augustss SCARG(rap, data) = SCARG(uap, data); 76 1.3 augustss } 77 1.2 augustss 78 1.4 onoe 79 1.15 dsl static void freebsd_to_netbsd_ifioctl(const struct freebsd_sys_ioctl_args *uap, 80 1.4 onoe struct sys_ioctl_args *nap); 81 1.4 onoe 82 1.4 onoe static void 83 1.15 dsl freebsd_to_netbsd_ifioctl(const struct freebsd_sys_ioctl_args *uap, struct sys_ioctl_args *nap) 84 1.4 onoe { 85 1.4 onoe u_long ocmd, ncmd; 86 1.4 onoe ocmd = SCARG(uap, com); 87 1.4 onoe switch (ocmd) { 88 1.4 onoe case FREEBSD_SIOCALIFADDR: 89 1.4 onoe ncmd =SIOCALIFADDR; 90 1.4 onoe break; 91 1.4 onoe case FREEBSD_SIOCGLIFADDR: 92 1.4 onoe ncmd =SIOCGLIFADDR; 93 1.4 onoe break; 94 1.4 onoe case FREEBSD_SIOCDLIFADDR: 95 1.4 onoe ncmd =SIOCDLIFADDR; 96 1.4 onoe break; 97 1.4 onoe case FREEBSD_SIOCGIFMTU: 98 1.4 onoe ncmd = SIOCGIFMTU; 99 1.4 onoe break; 100 1.4 onoe case FREEBSD_SIOCSIFMTU: 101 1.4 onoe ncmd = SIOCSIFMTU; 102 1.4 onoe break; 103 1.4 onoe default: 104 1.4 onoe ncmd = ocmd; 105 1.4 onoe break; 106 1.4 onoe } 107 1.4 onoe SCARG(nap, fd) = SCARG(uap, fd); 108 1.4 onoe SCARG(nap, com) = ncmd; 109 1.4 onoe SCARG(nap, data) = SCARG(uap, data); 110 1.4 onoe } 111 1.4 onoe 112 1.1 mycroft int 113 1.15 dsl freebsd_sys_ioctl(struct lwp *l, const struct freebsd_sys_ioctl_args *uap, register_t *retval) 114 1.1 mycroft { 115 1.15 dsl /* { 116 1.1 mycroft syscallarg(int) fd; 117 1.1 mycroft syscallarg(u_long) com; 118 1.12 christos syscallarg(void *) data; 119 1.15 dsl } */ 120 1.3 augustss struct oss_sys_ioctl_args ap; 121 1.4 onoe struct sys_ioctl_args nap; 122 1.1 mycroft 123 1.1 mycroft /* 124 1.1 mycroft * XXX - <sys/cdio.h>'s incompatibility 125 1.1 mycroft * _IO('c', 25..27, *): incompatible 126 1.1 mycroft * _IO('c', 28... , *): not exist 127 1.1 mycroft */ 128 1.1 mycroft /* XXX - <sys/mtio.h> */ 129 1.1 mycroft /* XXX - <sys/scsiio.h> */ 130 1.1 mycroft /* XXX - should convert machine dependent ioctl()s */ 131 1.2 augustss 132 1.2 augustss switch (FREEBSD_IOCGROUP(SCARG(uap, com))) { 133 1.2 augustss case 'M': 134 1.3 augustss freebsd_to_oss(uap, &ap); 135 1.10 christos return oss_ioctl_mixer(l, &ap, retval); 136 1.2 augustss case 'Q': 137 1.3 augustss freebsd_to_oss(uap, &ap); 138 1.10 christos return oss_ioctl_sequencer(l, &ap, retval); 139 1.2 augustss case 'P': 140 1.3 augustss freebsd_to_oss(uap, &ap); 141 1.10 christos return oss_ioctl_audio(l, &ap, retval); 142 1.4 onoe case 'i': 143 1.4 onoe freebsd_to_netbsd_ifioctl(uap, &nap); 144 1.7 thorpej return sys_ioctl(l, &nap, retval); 145 1.2 augustss default: 146 1.15 dsl return sys_ioctl(l, (const void *)uap, retval); 147 1.2 augustss } 148 1.1 mycroft } 149