1 /* $OpenBSD: osf1_ioctl.c,v 1.5 2002/03/14 01:26:50 millert Exp $ */
2 /* $NetBSD: osf1_ioctl.c,v 1.11 1999/05/05 01:51:33 cgd Exp $ */
3
4 /*
5 * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Christopher G. Demetriou
18 * for the NetBSD Project.
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 /*
35 * Copyright (c) 1994, 1995 Carnegie-Mellon University.
36 * All rights reserved.
37 *
38 * Author: Chris G. Demetriou
39 *
40 * Permission to use, copy, modify and distribute this software and
41 * its documentation is hereby granted, provided that both the copyright
42 * notice and this permission notice appear in all copies of the
43 * software, derivative works or modified versions, and any portions
44 * thereof, and that both notices appear in supporting documentation.
45 *
46 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
47 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
48 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
49 *
50 * Carnegie Mellon requests users of this software to return to
51 *
52 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
53 * School of Computer Science
54 * Carnegie Mellon University
55 * Pittsburgh PA 15213-3890
56 *
57 * any improvements or extensions that they make and grant Carnegie the
58 * rights to redistribute these changes.
59 */
60
61 #include <sys/param.h>
62 #include <sys/systm.h>
63 #include <sys/ioctl.h>
64 #include <sys/termios.h>
65 #include <sys/mount.h>
66 #include <sys/syscallargs.h>
67
68 #include <compat/osf1/osf1.h>
69 #include <compat/osf1/osf1_syscallargs.h>
70
71 #ifdef SYSCALL_DEBUG
72 extern int scdebug;
73 #endif
74
75 int osf1_ioctl_f(struct proc *p, struct sys_ioctl_args *nuap,
76 register_t *retval, int cmd, int dir, int len);
77 int osf1_ioctl_i(struct proc *p, struct sys_ioctl_args *nuap,
78 register_t *retval, int cmd, int dir, int len);
79 int osf1_ioctl_t(struct proc *p, struct sys_ioctl_args *nuap,
80 register_t *retval, int cmd, int dir, int len);
81 int osf1_ioctl_m(struct proc *p, struct sys_ioctl_args *nuap,
82 register_t *retval, int cmd, int dir, int len);
83
84 int
85 osf1_sys_ioctl(p, v, retval)
86 struct proc *p;
87 void *v;
88 register_t *retval;
89 {
90 struct osf1_sys_ioctl_args *uap = v;
91 struct sys_ioctl_args a;
92 int op, dir, group, cmd, len;
93 #ifdef SYSCALL_DEBUG
94 char *dirstr;
95 #endif
96
97 op = SCARG(uap, com);
98 dir = op & OSF1_IOC_DIRMASK;
99 group = OSF1_IOCGROUP(op);
100 cmd = OSF1_IOCCMD(op);
101 len = OSF1_IOCPARM_LEN(op);
102
103 switch (dir) {
104 case OSF1_IOC_VOID:
105 dir = IOC_VOID;
106 #ifdef SYSCALL_DEBUG
107 dirstr = "none";
108 #endif
109 break;
110 case OSF1_IOC_OUT:
111 dir = IOC_OUT;
112 #ifdef SYSCALL_DEBUG
113 dirstr = "out";
114 #endif
115 break;
116 case OSF1_IOC_IN:
117 dir = IOC_IN;
118 #ifdef SYSCALL_DEBUG
119 dirstr = "in";
120 #endif
121 break;
122 case OSF1_IOC_INOUT:
123 dir = IOC_INOUT;
124 #ifdef SYSCALL_DEBUG
125 dirstr = "in-out";
126 #endif
127 break;
128 default:
129 return (EINVAL);
130 break;
131 }
132 #ifdef SYSCALL_DEBUG
133 if (scdebug)
134 printf(
135 "OSF/1 IOCTL: group = %c, cmd = %d, len = %d, dir = %s\n",
136 group, cmd, len, dirstr);
137 #endif
138
139 SCARG(&a, fd) = SCARG(uap, fd);
140 SCARG(&a, com) = SCARG(uap, com) & 0xffffffff; /* XXX */
141 SCARG(&a, data) = SCARG(uap, data);
142 switch (group) {
143 case 'f':
144 return osf1_ioctl_f(p, &a, retval, cmd, dir, len);
145 case 'i':
146 return osf1_ioctl_i(p, &a, retval, cmd, dir, len);
147 case 't':
148 return osf1_ioctl_t(p, &a, retval, cmd, dir, len);
149 case 'm':
150 return osf1_ioctl_m(p, &a, retval, cmd, dir, len);
151 default:
152 return (ENOTTY);
153 }
154 }
155
156 int
157 osf1_ioctl_f(p, uap, retval, cmd, dir, len)
158 struct proc *p;
159 struct sys_ioctl_args *uap;
160 register_t *retval;
161 int cmd;
162 int dir;
163 int len;
164 {
165
166 switch (cmd) {
167 case 1: /* OSF/1 FIOCLEX */
168 case 2: /* OSF/1 FIONCLEX */
169 case 123: /* OSF/1 FIOGETOWN */
170 case 124: /* OSF/1 FIOSETOWN */
171 case 125: /* OSF/1 FIOASYNC */
172 case 126: /* OSF/1 FIONBIO */
173 case 127: /* OSF/1 FIONREAD */
174 /* same as in OpenBSD */
175 break;
176
177 default:
178 return (ENOTTY);
179 }
180
181 return sys_ioctl(p, uap, retval);
182 }
183
184 /*
185 * Mag Tape ioctl's
186 */
187 int
188 osf1_ioctl_m(p, uap, retval, cmd, dir, len)
189 struct proc *p;
190 struct sys_ioctl_args *uap;
191 register_t *retval;
192 int cmd;
193 int dir;
194 int len;
195 {
196 switch (cmd) {
197 case 1: /* OSF/1 MTIOCTOP (XXX) */
198 case 2: /* OSF/1 MTIOCGET (XXX) */
199 /* same as in OpenBSD */
200 break;
201 default:
202 return (ENOTTY);
203 }
204
205 return sys_ioctl(p, uap, retval);
206 }
207
208 int
209 osf1_ioctl_i(p, uap, retval, cmd, dir, len)
210 struct proc *p;
211 struct sys_ioctl_args *uap;
212 register_t *retval;
213 int cmd;
214 int dir;
215 int len;
216 {
217
218 switch (cmd) {
219 case 12: /* OSF/1 SIOCSIFADDR */
220 case 14: /* OSF/1 SIOCSIFDSTADDR */
221 case 16: /* OSF/1 SIOCSIFFLAGS (XXX) */
222 case 17: /* OSF/1 SIOCGIFFLAGS (XXX) */
223 case 19: /* OSF/1 SIOCSIFBRDADDR */
224 case 22: /* OSF/1 SIOCSIFNETMASK */
225 case 23: /* OSF/1 SIOCGIFMETRIC */
226 case 24: /* OSF/1 SIOCSIFMETRIC */
227 case 25: /* OSF/1 SIOCDIFADDR */
228 case 33: /* OSF/1 SIOCGIFADDR */
229 case 34: /* OSF/1 SIOCGIFDSTADDR */
230 case 35: /* OSF/1 SIOCGIFBRDADDR */
231 case 37: /* OSF/1 SIOCGIFNETMASK */
232 /* same as in OpenBSD */
233 break;
234
235 default:
236 return (ENOTTY);
237 }
238
239 return sys_ioctl(p, uap, retval);
240 }
241
242 int
243 osf1_ioctl_t(p, uap, retval, cmd, dir, len)
244 struct proc *p;
245 struct sys_ioctl_args *uap;
246 register_t *retval;
247 int cmd;
248 int dir;
249 int len;
250 {
251
252 switch (cmd) {
253 #ifdef COMPAT_43
254 case 8: /* OSF/1 COMPAT_43 TIOCGETP (XXX) */
255 case 9: /* OSF/1 COMPAT_43 TIOCSETP (XXX) */
256 #endif
257 case 19: /* OSF/1 TIOCGETA (XXX) */
258 case 20: /* OSF/1 TIOCSETA (XXX) */
259 case 21: /* OSF/1 TIOCSETAW (XXX) */
260 case 22: /* OSF/1 TIOCSETAF (XXX) */
261 case 26: /* OSF/1 TIOCGETD (XXX) */
262 case 27: /* OSF/1 TIOCSETD (XXX) */
263 case 97: /* OSF/1 TIOCSCTTY */
264 case 103: /* OSF/1 TIOCSWINSZ */
265 case 104: /* OSF/1 TIOCGWINSZ */
266 /* same as in OpenBSD */
267 break;
268
269 default:
270 return (ENOTTY);
271 }
272
273 return sys_ioctl(p, uap, retval);
274 }