Annotation of sys/compat/bsdos/bsdos_ioctl.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: bsdos_ioctl.c,v 1.4 2003/06/17 21:56:25 millert Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 1999 Todd C. Miller <Todd.Miller@courtesan.com>
! 5: *
! 6: * Permission to use, copy, modify, and distribute this software for any
! 7: * purpose with or without fee is hereby granted, provided that the above
! 8: * copyright notice and this permission notice appear in all copies.
! 9: *
! 10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 17: */
! 18:
! 19: #include <sys/param.h>
! 20: #include <sys/systm.h>
! 21: #include <sys/proc.h>
! 22: #include <sys/mount.h>
! 23:
! 24: #include <sys/syscallargs.h>
! 25:
! 26: #include <compat/bsdos/bsdos_syscallargs.h>
! 27: #include <compat/bsdos/bsdos_ioctl.h>
! 28:
! 29: #include <compat/ossaudio/ossaudio.h>
! 30: #include <compat/ossaudio/ossaudiovar.h>
! 31:
! 32: #include <compat/common/compat_util.h>
! 33:
! 34: static void bsdos_to_oss(struct bsdos_sys_ioctl_args *, struct oss_sys_ioctl_args *);
! 35:
! 36: /*
! 37: * BSD/OS and OSS have different values for IOC_*. Also,
! 38: * sizeof(bsdos_audio_buf_info) != sizeof(oss_audio_buf_info) which
! 39: * is encoded in OSS_SNDCTL_DSP_GETOSPACE and OSS_SNDCTL_DSP_GETISPACE.
! 40: */
! 41: static void
! 42: bsdos_to_oss(bap, oap)
! 43: struct bsdos_sys_ioctl_args *bap;
! 44: struct oss_sys_ioctl_args *oap;
! 45: {
! 46: u_long bcom, ocom;
! 47:
! 48: bcom = SCARG(bap, com);
! 49: ocom = bcom & ~BSDOS_IOC_DIRMASK;
! 50: switch (bcom & BSDOS_IOC_DIRMASK) {
! 51: case BSDOS_IOC_VOID:
! 52: ocom |= OSS_IOC_VOID;
! 53: break;
! 54: case BSDOS_IOC_OUT:
! 55: if (bcom == BSDOS_SNDCTL_DSP_GETOSPACE)
! 56: ocom = OSS_SNDCTL_DSP_GETOSPACE;
! 57: else if (bcom == BSDOS_SNDCTL_DSP_GETISPACE)
! 58: ocom = OSS_SNDCTL_DSP_GETISPACE;
! 59: else
! 60: ocom |= OSS_IOC_OUT;
! 61: break;
! 62: case BSDOS_IOC_IN:
! 63: ocom |= OSS_IOC_IN;
! 64: break;
! 65: case BSDOS_IOC_INOUT:
! 66: ocom |= OSS_IOC_INOUT;
! 67: break;
! 68: }
! 69: SCARG(oap, fd) = SCARG(bap, fd);
! 70: SCARG(oap, com) = ocom;
! 71: SCARG(oap, data) = SCARG(bap, data);
! 72: }
! 73:
! 74: int
! 75: bsdos_sys_ioctl(p, v, retval)
! 76: struct proc *p;
! 77: void *v;
! 78: register_t *retval;
! 79: {
! 80: struct bsdos_sys_ioctl_args /* {
! 81: syscallarg(int) fd;
! 82: syscallarg(u_long) com;
! 83: syscallarg(caddr_t) data;
! 84: } */ *uap = v;
! 85: struct oss_sys_ioctl_args ap;
! 86:
! 87: /*
! 88: * XXX should support 'T' timer ioctl's
! 89: * XXX also /dev/sequencer and /dev/patmgr#
! 90: */
! 91: switch (BSDOS_IOCGROUP(SCARG(uap, com))) {
! 92: case 'M':
! 93: bsdos_to_oss(uap, &ap);
! 94: return (oss_ioctl_mixer(p, &ap, retval));
! 95: case 'Q':
! 96: bsdos_to_oss(uap, &ap);
! 97: return (oss_ioctl_sequencer(p, &ap, retval));
! 98: case 'P':
! 99: bsdos_to_oss(uap, &ap);
! 100: /*
! 101: * Special handling since the BSD/OS audio_buf_info
! 102: * struct lacks a fragstotal member.
! 103: */
! 104: if (SCARG(uap, com) == BSDOS_SNDCTL_DSP_GETOSPACE ||
! 105: SCARG(uap, com) == BSDOS_SNDCTL_DSP_GETISPACE)
! 106: {
! 107: struct oss_audio_buf_info oss_buf, *oss_bufp;
! 108: struct bsdos_audio_buf_info bsdos_buf;
! 109: caddr_t sg = stackgap_init(p->p_emul);
! 110: int error;
! 111:
! 112: oss_bufp = stackgap_alloc(&sg, sizeof(*oss_bufp));
! 113: SCARG(&ap, data) = (void *) oss_bufp;
! 114: error = oss_ioctl_audio(p, &ap, retval);
! 115: if (error)
! 116: return (error);
! 117: error = copyin(oss_bufp, &oss_buf, sizeof(oss_buf));
! 118: if (error)
! 119: return (error);
! 120: bsdos_buf.fragments = oss_buf.fragstotal;
! 121: bsdos_buf.fragsize = oss_buf.fragsize;
! 122: bsdos_buf.bytes = oss_buf.bytes;
! 123: error = copyout(&bsdos_buf, SCARG(uap, data),
! 124: sizeof(bsdos_buf));
! 125: if (error)
! 126: return (error);
! 127: } else
! 128: return (oss_ioctl_audio(p, &ap, retval));
! 129: }
! 130: return (sys_ioctl(p, uap, retval));
! 131: }
CVSweb