This source file includes following definitions.
- bsdos_to_oss
- bsdos_sys_ioctl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
38
39
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
82
83
84 *uap = v;
85 struct oss_sys_ioctl_args ap;
86
87
88
89
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
102
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 }