sunos_ioctl.c revision 1.14 1 1.14 deraadt /* $NetBSD: sunos_ioctl.c,v 1.14 1994/10/31 05:18:10 deraadt Exp $ */
2 1.11 cgd
3 1.1 deraadt /*
4 1.2 deraadt * Copyright (c) 1993 Markus Wild.
5 1.2 deraadt * All rights reserved.
6 1.1 deraadt *
7 1.1 deraadt * Redistribution and use in source and binary forms, with or without
8 1.1 deraadt * modification, are permitted provided that the following conditions
9 1.1 deraadt * are met:
10 1.1 deraadt * 1. Redistributions of source code must retain the above copyright
11 1.1 deraadt * notice, this list of conditions and the following disclaimer.
12 1.2 deraadt * 2. The name of the author may not be used to endorse or promote products
13 1.8 jtc * derived from this software without specific prior written permission
14 1.1 deraadt *
15 1.2 deraadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 1.2 deraadt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 1.2 deraadt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 1.2 deraadt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 1.2 deraadt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 1.2 deraadt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 1.2 deraadt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 1.2 deraadt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 1.2 deraadt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 1.2 deraadt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 1.1 deraadt *
26 1.13 deraadt * loosely from: Header: sunos_ioctl.c,v 1.7 93/05/28 04:40:43 torek Exp
27 1.1 deraadt */
28 1.1 deraadt
29 1.1 deraadt #include <sys/param.h>
30 1.1 deraadt #include <sys/proc.h>
31 1.13 deraadt #include <sys/systm.h>
32 1.1 deraadt #include <sys/file.h>
33 1.1 deraadt #include <sys/filedesc.h>
34 1.1 deraadt #include <sys/ioctl.h>
35 1.1 deraadt #include <sys/termios.h>
36 1.1 deraadt #include <sys/tty.h>
37 1.6 deraadt #include <sys/socket.h>
38 1.6 deraadt #include <sys/ioctl.h>
39 1.6 deraadt #include <net/if.h>
40 1.1 deraadt
41 1.13 deraadt #include <sys/mount.h>
42 1.13 deraadt
43 1.13 deraadt #include <sys/syscallargs.h>
44 1.13 deraadt #include <compat/sunos/sunos.h>
45 1.13 deraadt #include <compat/sunos/sunos_syscallargs.h>
46 1.13 deraadt
47 1.1 deraadt /*
48 1.1 deraadt * SunOS ioctl calls.
49 1.1 deraadt * This file is something of a hodge-podge.
50 1.1 deraadt * Support gets added as things turn up....
51 1.1 deraadt */
52 1.1 deraadt
53 1.2 deraadt static struct speedtab sptab[] = {
54 1.2 deraadt { 0, 0 },
55 1.2 deraadt { 50, 1 },
56 1.2 deraadt { 75, 2 },
57 1.2 deraadt { 110, 3 },
58 1.2 deraadt { 134, 4 },
59 1.2 deraadt { 135, 4 },
60 1.2 deraadt { 150, 5 },
61 1.2 deraadt { 200, 6 },
62 1.2 deraadt { 300, 7 },
63 1.2 deraadt { 600, 8 },
64 1.2 deraadt { 1200, 9 },
65 1.2 deraadt { 1800, 10 },
66 1.2 deraadt { 2400, 11 },
67 1.2 deraadt { 4800, 12 },
68 1.2 deraadt { 9600, 13 },
69 1.2 deraadt { 19200, 14 },
70 1.2 deraadt { 38400, 15 },
71 1.2 deraadt { -1, -1 }
72 1.2 deraadt };
73 1.2 deraadt
74 1.2 deraadt static u_long s2btab[] = {
75 1.2 deraadt 0,
76 1.2 deraadt 50,
77 1.2 deraadt 75,
78 1.2 deraadt 110,
79 1.2 deraadt 134,
80 1.2 deraadt 150,
81 1.2 deraadt 200,
82 1.2 deraadt 300,
83 1.2 deraadt 600,
84 1.2 deraadt 1200,
85 1.2 deraadt 1800,
86 1.2 deraadt 2400,
87 1.2 deraadt 4800,
88 1.2 deraadt 9600,
89 1.2 deraadt 19200,
90 1.2 deraadt 38400,
91 1.2 deraadt };
92 1.2 deraadt
93 1.2 deraadt /*
94 1.2 deraadt * these two conversion functions have mostly been done
95 1.2 deraadt * with some perl cut&paste, then handedited to comment
96 1.2 deraadt * out what doesn't exist under NetBSD.
97 1.2 deraadt * A note from Markus's code:
98 1.2 deraadt * (l & BITMASK1) / BITMASK1 * BITMASK2 is translated
99 1.2 deraadt * optimally by gcc m68k, much better than any ?: stuff.
100 1.2 deraadt * Code may vary with different architectures of course.
101 1.2 deraadt *
102 1.2 deraadt * I don't know what optimizer you used, but seeing divu's and
103 1.2 deraadt * bfextu's in the m68k assembly output did not encourage me...
104 1.2 deraadt * as well, gcc on the sparc definately generates much better
105 1.2 deraadt * code with ?:.
106 1.2 deraadt */
107 1.2 deraadt
108 1.2 deraadt static void
109 1.2 deraadt stios2btios(st, bt)
110 1.13 deraadt struct sunos_termios *st;
111 1.2 deraadt struct termios *bt;
112 1.2 deraadt {
113 1.2 deraadt register u_long l, r;
114 1.2 deraadt
115 1.2 deraadt l = st->c_iflag;
116 1.3 deraadt r = ((l & 0x00000001) ? IGNBRK : 0);
117 1.3 deraadt r |= ((l & 0x00000002) ? BRKINT : 0);
118 1.3 deraadt r |= ((l & 0x00000004) ? IGNPAR : 0);
119 1.3 deraadt r |= ((l & 0x00000008) ? PARMRK : 0);
120 1.3 deraadt r |= ((l & 0x00000010) ? INPCK : 0);
121 1.3 deraadt r |= ((l & 0x00000020) ? ISTRIP : 0);
122 1.3 deraadt r |= ((l & 0x00000040) ? INLCR : 0);
123 1.3 deraadt r |= ((l & 0x00000080) ? IGNCR : 0);
124 1.3 deraadt r |= ((l & 0x00000100) ? ICRNL : 0);
125 1.3 deraadt /* ((l & 0x00000200) ? IUCLC : 0) */
126 1.3 deraadt r |= ((l & 0x00000400) ? IXON : 0);
127 1.3 deraadt r |= ((l & 0x00000800) ? IXANY : 0);
128 1.3 deraadt r |= ((l & 0x00001000) ? IXOFF : 0);
129 1.3 deraadt r |= ((l & 0x00002000) ? IMAXBEL : 0);
130 1.2 deraadt bt->c_iflag = r;
131 1.2 deraadt
132 1.2 deraadt l = st->c_oflag;
133 1.3 deraadt r = ((l & 0x00000001) ? OPOST : 0);
134 1.3 deraadt /* ((l & 0x00000002) ? OLCUC : 0) */
135 1.3 deraadt r |= ((l & 0x00000004) ? ONLCR : 0);
136 1.3 deraadt /* ((l & 0x00000008) ? OCRNL : 0) */
137 1.3 deraadt /* ((l & 0x00000010) ? ONOCR : 0) */
138 1.3 deraadt /* ((l & 0x00000020) ? ONLRET : 0) */
139 1.3 deraadt /* ((l & 0x00000040) ? OFILL : 0) */
140 1.3 deraadt /* ((l & 0x00000080) ? OFDEL : 0) */
141 1.3 deraadt /* ((l & 0x00000100) ? NLDLY : 0) */
142 1.3 deraadt /* ((l & 0x00000100) ? NL1 : 0) */
143 1.3 deraadt /* ((l & 0x00000600) ? CRDLY : 0) */
144 1.3 deraadt /* ((l & 0x00000200) ? CR1 : 0) */
145 1.3 deraadt /* ((l & 0x00000400) ? CR2 : 0) */
146 1.3 deraadt /* ((l & 0x00000600) ? CR3 : 0) */
147 1.3 deraadt /* ((l & 0x00001800) ? TABDLY : 0) */
148 1.3 deraadt /* ((l & 0x00000800) ? TAB1 : 0) */
149 1.3 deraadt /* ((l & 0x00001000) ? TAB2 : 0) */
150 1.3 deraadt r |= ((l & 0x00001800) ? OXTABS : 0);
151 1.3 deraadt /* ((l & 0x00002000) ? BSDLY : 0) */
152 1.3 deraadt /* ((l & 0x00002000) ? BS1 : 0) */
153 1.3 deraadt /* ((l & 0x00004000) ? VTDLY : 0) */
154 1.3 deraadt /* ((l & 0x00004000) ? VT1 : 0) */
155 1.3 deraadt /* ((l & 0x00008000) ? FFDLY : 0) */
156 1.3 deraadt /* ((l & 0x00008000) ? FF1 : 0) */
157 1.3 deraadt /* ((l & 0x00010000) ? PAGEOUT : 0) */
158 1.3 deraadt /* ((l & 0x00020000) ? WRAP : 0) */
159 1.2 deraadt bt->c_oflag = r;
160 1.2 deraadt
161 1.2 deraadt l = st->c_cflag;
162 1.14 deraadt switch (l & 0x00000030) {
163 1.14 deraadt case 0:
164 1.14 deraadt r = CS5;
165 1.14 deraadt break;
166 1.14 deraadt case 0x00000010:
167 1.14 deraadt r = CS6;
168 1.14 deraadt break;
169 1.14 deraadt case 0x00000020:
170 1.14 deraadt r = CS7;
171 1.14 deraadt break;
172 1.14 deraadt case 0x00000030:
173 1.14 deraadt r = CS8;
174 1.14 deraadt break;
175 1.14 deraadt }
176 1.3 deraadt r |= ((l & 0x00000040) ? CSTOPB : 0);
177 1.3 deraadt r |= ((l & 0x00000080) ? CREAD : 0);
178 1.3 deraadt r |= ((l & 0x00000100) ? PARENB : 0);
179 1.3 deraadt r |= ((l & 0x00000200) ? PARODD : 0);
180 1.3 deraadt r |= ((l & 0x00000400) ? HUPCL : 0);
181 1.3 deraadt r |= ((l & 0x00000800) ? CLOCAL : 0);
182 1.3 deraadt /* ((l & 0x00001000) ? LOBLK : 0) */
183 1.3 deraadt r |= ((l & 0x80000000) ? (CRTS_IFLOW|CCTS_OFLOW) : 0);
184 1.2 deraadt bt->c_cflag = r;
185 1.2 deraadt
186 1.2 deraadt bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f];
187 1.2 deraadt
188 1.2 deraadt l = st->c_lflag;
189 1.3 deraadt r = ((l & 0x00000001) ? ISIG : 0);
190 1.3 deraadt r |= ((l & 0x00000002) ? ICANON : 0);
191 1.3 deraadt /* ((l & 0x00000004) ? XCASE : 0) */
192 1.3 deraadt r |= ((l & 0x00000008) ? ECHO : 0);
193 1.3 deraadt r |= ((l & 0x00000010) ? ECHOE : 0);
194 1.3 deraadt r |= ((l & 0x00000020) ? ECHOK : 0);
195 1.3 deraadt r |= ((l & 0x00000040) ? ECHONL : 0);
196 1.3 deraadt r |= ((l & 0x00000080) ? NOFLSH : 0);
197 1.3 deraadt r |= ((l & 0x00000100) ? TOSTOP : 0);
198 1.3 deraadt r |= ((l & 0x00000200) ? ECHOCTL : 0);
199 1.3 deraadt r |= ((l & 0x00000400) ? ECHOPRT : 0);
200 1.3 deraadt r |= ((l & 0x00000800) ? ECHOKE : 0);
201 1.3 deraadt /* ((l & 0x00001000) ? DEFECHO : 0) */
202 1.3 deraadt r |= ((l & 0x00002000) ? FLUSHO : 0);
203 1.3 deraadt r |= ((l & 0x00004000) ? PENDIN : 0);
204 1.2 deraadt bt->c_lflag = r;
205 1.2 deraadt
206 1.2 deraadt bt->c_cc[VINTR] = st->c_cc[0] ? st->c_cc[0] : _POSIX_VDISABLE;
207 1.2 deraadt bt->c_cc[VQUIT] = st->c_cc[1] ? st->c_cc[1] : _POSIX_VDISABLE;
208 1.2 deraadt bt->c_cc[VERASE] = st->c_cc[2] ? st->c_cc[2] : _POSIX_VDISABLE;
209 1.2 deraadt bt->c_cc[VKILL] = st->c_cc[3] ? st->c_cc[3] : _POSIX_VDISABLE;
210 1.2 deraadt bt->c_cc[VEOF] = st->c_cc[4] ? st->c_cc[4] : _POSIX_VDISABLE;
211 1.2 deraadt bt->c_cc[VEOL] = st->c_cc[5] ? st->c_cc[5] : _POSIX_VDISABLE;
212 1.2 deraadt bt->c_cc[VEOL2] = st->c_cc[6] ? st->c_cc[6] : _POSIX_VDISABLE;
213 1.2 deraadt /* bt->c_cc[VSWTCH] = st->c_cc[7] ? st->c_cc[7] : _POSIX_VDISABLE; */
214 1.2 deraadt bt->c_cc[VSTART] = st->c_cc[8] ? st->c_cc[8] : _POSIX_VDISABLE;
215 1.2 deraadt bt->c_cc[VSTOP] = st->c_cc[9] ? st->c_cc[9] : _POSIX_VDISABLE;
216 1.2 deraadt bt->c_cc[VSUSP] = st->c_cc[10] ? st->c_cc[10] : _POSIX_VDISABLE;
217 1.2 deraadt bt->c_cc[VDSUSP] = st->c_cc[11] ? st->c_cc[11] : _POSIX_VDISABLE;
218 1.2 deraadt bt->c_cc[VREPRINT] = st->c_cc[12] ? st->c_cc[12] : _POSIX_VDISABLE;
219 1.2 deraadt bt->c_cc[VDISCARD] = st->c_cc[13] ? st->c_cc[13] : _POSIX_VDISABLE;
220 1.2 deraadt bt->c_cc[VWERASE] = st->c_cc[14] ? st->c_cc[14] : _POSIX_VDISABLE;
221 1.2 deraadt bt->c_cc[VLNEXT] = st->c_cc[15] ? st->c_cc[15] : _POSIX_VDISABLE;
222 1.2 deraadt bt->c_cc[VSTATUS] = st->c_cc[16] ? st->c_cc[16] : _POSIX_VDISABLE;
223 1.2 deraadt }
224 1.2 deraadt
225 1.2 deraadt
226 1.2 deraadt static void
227 1.2 deraadt btios2stios(bt, st)
228 1.2 deraadt struct termios *bt;
229 1.13 deraadt struct sunos_termios *st;
230 1.2 deraadt {
231 1.2 deraadt register u_long l, r;
232 1.2 deraadt
233 1.2 deraadt l = bt->c_iflag;
234 1.3 deraadt r = ((l & IGNBRK) ? 0x00000001 : 0);
235 1.3 deraadt r |= ((l & BRKINT) ? 0x00000002 : 0);
236 1.3 deraadt r |= ((l & IGNPAR) ? 0x00000004 : 0);
237 1.3 deraadt r |= ((l & PARMRK) ? 0x00000008 : 0);
238 1.3 deraadt r |= ((l & INPCK) ? 0x00000010 : 0);
239 1.3 deraadt r |= ((l & ISTRIP) ? 0x00000020 : 0);
240 1.3 deraadt r |= ((l & INLCR) ? 0x00000040 : 0);
241 1.3 deraadt r |= ((l & IGNCR) ? 0x00000080 : 0);
242 1.3 deraadt r |= ((l & ICRNL) ? 0x00000100 : 0);
243 1.3 deraadt /* ((l & IUCLC) ? 0x00000200 : 0) */
244 1.3 deraadt r |= ((l & IXON) ? 0x00000400 : 0);
245 1.3 deraadt r |= ((l & IXANY) ? 0x00000800 : 0);
246 1.3 deraadt r |= ((l & IXOFF) ? 0x00001000 : 0);
247 1.3 deraadt r |= ((l & IMAXBEL) ? 0x00002000 : 0);
248 1.2 deraadt st->c_iflag = r;
249 1.2 deraadt
250 1.2 deraadt l = bt->c_oflag;
251 1.3 deraadt r = ((l & OPOST) ? 0x00000001 : 0);
252 1.3 deraadt /* ((l & OLCUC) ? 0x00000002 : 0) */
253 1.3 deraadt r |= ((l & ONLCR) ? 0x00000004 : 0);
254 1.3 deraadt /* ((l & OCRNL) ? 0x00000008 : 0) */
255 1.3 deraadt /* ((l & ONOCR) ? 0x00000010 : 0) */
256 1.3 deraadt /* ((l & ONLRET) ? 0x00000020 : 0) */
257 1.3 deraadt /* ((l & OFILL) ? 0x00000040 : 0) */
258 1.3 deraadt /* ((l & OFDEL) ? 0x00000080 : 0) */
259 1.3 deraadt /* ((l & NLDLY) ? 0x00000100 : 0) */
260 1.3 deraadt /* ((l & NL1) ? 0x00000100 : 0) */
261 1.3 deraadt /* ((l & CRDLY) ? 0x00000600 : 0) */
262 1.3 deraadt /* ((l & CR1) ? 0x00000200 : 0) */
263 1.3 deraadt /* ((l & CR2) ? 0x00000400 : 0) */
264 1.3 deraadt /* ((l & CR3) ? 0x00000600 : 0) */
265 1.3 deraadt /* ((l & TABDLY) ? 0x00001800 : 0) */
266 1.3 deraadt /* ((l & TAB1) ? 0x00000800 : 0) */
267 1.3 deraadt /* ((l & TAB2) ? 0x00001000 : 0) */
268 1.3 deraadt r |= ((l & OXTABS) ? 0x00001800 : 0);
269 1.3 deraadt /* ((l & BSDLY) ? 0x00002000 : 0) */
270 1.3 deraadt /* ((l & BS1) ? 0x00002000 : 0) */
271 1.3 deraadt /* ((l & VTDLY) ? 0x00004000 : 0) */
272 1.3 deraadt /* ((l & VT1) ? 0x00004000 : 0) */
273 1.3 deraadt /* ((l & FFDLY) ? 0x00008000 : 0) */
274 1.3 deraadt /* ((l & FF1) ? 0x00008000 : 0) */
275 1.3 deraadt /* ((l & PAGEOUT) ? 0x00010000 : 0) */
276 1.3 deraadt /* ((l & WRAP) ? 0x00020000 : 0) */
277 1.2 deraadt st->c_oflag = r;
278 1.2 deraadt
279 1.2 deraadt l = bt->c_cflag;
280 1.14 deraadt switch (l & CSIZE) {
281 1.14 deraadt case CS5:
282 1.14 deraadt r = 0;
283 1.14 deraadt break;
284 1.14 deraadt case CS6:
285 1.14 deraadt r = 0x00000010;
286 1.14 deraadt break;
287 1.14 deraadt case CS7:
288 1.14 deraadt r = 0x00000020;
289 1.14 deraadt break;
290 1.14 deraadt case CS8:
291 1.14 deraadt r = 0x00000030;
292 1.14 deraadt break;
293 1.14 deraadt }
294 1.3 deraadt r |= ((l & CSTOPB) ? 0x00000040 : 0);
295 1.3 deraadt r |= ((l & CREAD) ? 0x00000080 : 0);
296 1.3 deraadt r |= ((l & PARENB) ? 0x00000100 : 0);
297 1.3 deraadt r |= ((l & PARODD) ? 0x00000200 : 0);
298 1.3 deraadt r |= ((l & HUPCL) ? 0x00000400 : 0);
299 1.3 deraadt r |= ((l & CLOCAL) ? 0x00000800 : 0);
300 1.3 deraadt /* ((l & LOBLK) ? 0x00001000 : 0) */
301 1.3 deraadt r |= ((l & (CRTS_IFLOW|CCTS_OFLOW)) ? 0x80000000 : 0);
302 1.2 deraadt st->c_cflag = r;
303 1.2 deraadt
304 1.2 deraadt l = bt->c_lflag;
305 1.3 deraadt r = ((l & ISIG) ? 0x00000001 : 0);
306 1.3 deraadt r |= ((l & ICANON) ? 0x00000002 : 0);
307 1.3 deraadt /* ((l & XCASE) ? 0x00000004 : 0) */
308 1.3 deraadt r |= ((l & ECHO) ? 0x00000008 : 0);
309 1.3 deraadt r |= ((l & ECHOE) ? 0x00000010 : 0);
310 1.3 deraadt r |= ((l & ECHOK) ? 0x00000020 : 0);
311 1.3 deraadt r |= ((l & ECHONL) ? 0x00000040 : 0);
312 1.3 deraadt r |= ((l & NOFLSH) ? 0x00000080 : 0);
313 1.3 deraadt r |= ((l & TOSTOP) ? 0x00000100 : 0);
314 1.3 deraadt r |= ((l & ECHOCTL) ? 0x00000200 : 0);
315 1.3 deraadt r |= ((l & ECHOPRT) ? 0x00000400 : 0);
316 1.3 deraadt r |= ((l & ECHOKE) ? 0x00000800 : 0);
317 1.3 deraadt /* ((l & DEFECHO) ? 0x00001000 : 0) */
318 1.3 deraadt r |= ((l & FLUSHO) ? 0x00002000 : 0);
319 1.3 deraadt r |= ((l & PENDIN) ? 0x00004000 : 0);
320 1.2 deraadt st->c_lflag = r;
321 1.2 deraadt
322 1.2 deraadt l = ttspeedtab(bt->c_ospeed, sptab);
323 1.2 deraadt if (l >= 0)
324 1.2 deraadt st->c_cflag |= l;
325 1.2 deraadt
326 1.2 deraadt st->c_cc[0] = bt->c_cc[VINTR] != _POSIX_VDISABLE? bt->c_cc[VINTR]:0;
327 1.2 deraadt st->c_cc[1] = bt->c_cc[VQUIT] != _POSIX_VDISABLE? bt->c_cc[VQUIT]:0;
328 1.2 deraadt st->c_cc[2] = bt->c_cc[VERASE] != _POSIX_VDISABLE? bt->c_cc[VERASE]:0;
329 1.2 deraadt st->c_cc[3] = bt->c_cc[VKILL] != _POSIX_VDISABLE? bt->c_cc[VKILL]:0;
330 1.2 deraadt st->c_cc[4] = bt->c_cc[VEOF] != _POSIX_VDISABLE? bt->c_cc[VEOF]:0;
331 1.2 deraadt st->c_cc[5] = bt->c_cc[VEOL] != _POSIX_VDISABLE? bt->c_cc[VEOL]:0;
332 1.2 deraadt st->c_cc[6] = bt->c_cc[VEOL2] != _POSIX_VDISABLE? bt->c_cc[VEOL2]:0;
333 1.2 deraadt st->c_cc[7] = 0;
334 1.2 deraadt /* bt->c_cc[VSWTCH] != _POSIX_VDISABLE? bt->c_cc[VSWTCH]: */
335 1.2 deraadt st->c_cc[8] = bt->c_cc[VSTART] != _POSIX_VDISABLE? bt->c_cc[VSTART]:0;
336 1.2 deraadt st->c_cc[9] = bt->c_cc[VSTOP] != _POSIX_VDISABLE? bt->c_cc[VSTOP]:0;
337 1.2 deraadt st->c_cc[10]= bt->c_cc[VSUSP] != _POSIX_VDISABLE? bt->c_cc[VSUSP]:0;
338 1.2 deraadt st->c_cc[11]= bt->c_cc[VDSUSP] != _POSIX_VDISABLE? bt->c_cc[VDSUSP]:0;
339 1.2 deraadt st->c_cc[12]= bt->c_cc[VREPRINT]!= _POSIX_VDISABLE? bt->c_cc[VREPRINT]:0;
340 1.2 deraadt st->c_cc[13]= bt->c_cc[VDISCARD]!= _POSIX_VDISABLE? bt->c_cc[VDISCARD]:0;
341 1.2 deraadt st->c_cc[14]= bt->c_cc[VWERASE] != _POSIX_VDISABLE? bt->c_cc[VWERASE]:0;
342 1.2 deraadt st->c_cc[15]= bt->c_cc[VLNEXT] != _POSIX_VDISABLE? bt->c_cc[VLNEXT]:0;
343 1.2 deraadt st->c_cc[16]= bt->c_cc[VSTATUS] != _POSIX_VDISABLE? bt->c_cc[VSTATUS]:0;
344 1.2 deraadt
345 1.2 deraadt st->c_line = 0;
346 1.2 deraadt }
347 1.2 deraadt
348 1.2 deraadt static void
349 1.2 deraadt stios2stio(ts, t)
350 1.13 deraadt struct sunos_termios *ts;
351 1.13 deraadt struct sunos_termio *t;
352 1.2 deraadt {
353 1.2 deraadt t->c_iflag = ts->c_iflag;
354 1.2 deraadt t->c_oflag = ts->c_oflag;
355 1.2 deraadt t->c_cflag = ts->c_cflag;
356 1.2 deraadt t->c_lflag = ts->c_lflag;
357 1.2 deraadt t->c_line = ts->c_line;
358 1.2 deraadt bcopy(ts->c_cc, t->c_cc, 8);
359 1.2 deraadt }
360 1.2 deraadt
361 1.2 deraadt static void
362 1.2 deraadt stio2stios(t, ts)
363 1.13 deraadt struct sunos_termio *t;
364 1.13 deraadt struct sunos_termios *ts;
365 1.2 deraadt {
366 1.2 deraadt ts->c_iflag = t->c_iflag;
367 1.2 deraadt ts->c_oflag = t->c_oflag;
368 1.2 deraadt ts->c_cflag = t->c_cflag;
369 1.2 deraadt ts->c_lflag = t->c_lflag;
370 1.2 deraadt ts->c_line = t->c_line;
371 1.2 deraadt bcopy(t->c_cc, ts->c_cc, 8); /* don't touch the upper fields! */
372 1.2 deraadt }
373 1.1 deraadt
374 1.2 deraadt int
375 1.13 deraadt sunos_ioctl(p, uap, retval)
376 1.1 deraadt register struct proc *p;
377 1.13 deraadt struct sunos_ioctl_args *uap;
378 1.12 cgd register_t *retval;
379 1.1 deraadt {
380 1.1 deraadt register struct filedesc *fdp = p->p_fd;
381 1.1 deraadt register struct file *fp;
382 1.1 deraadt register int (*ctl)();
383 1.1 deraadt int error;
384 1.1 deraadt
385 1.13 deraadt if ( (unsigned)SCARG(uap, fd) >= fdp->fd_nfiles ||
386 1.13 deraadt (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL)
387 1.2 deraadt return EBADF;
388 1.2 deraadt
389 1.1 deraadt if ((fp->f_flag & (FREAD|FWRITE)) == 0)
390 1.2 deraadt return EBADF;
391 1.2 deraadt
392 1.1 deraadt ctl = fp->f_ops->fo_ioctl;
393 1.1 deraadt
394 1.13 deraadt switch (SCARG(uap, com)) {
395 1.1 deraadt case _IOR('t', 0, int):
396 1.13 deraadt SCARG(uap, com) = TIOCGETD;
397 1.1 deraadt break;
398 1.2 deraadt case _IOW('t', 1, int):
399 1.2 deraadt {
400 1.2 deraadt int disc;
401 1.1 deraadt
402 1.13 deraadt if ((error = copyin(SCARG(uap, data), (caddr_t)&disc,
403 1.2 deraadt sizeof disc)) != 0)
404 1.2 deraadt return error;
405 1.2 deraadt
406 1.2 deraadt /* map SunOS NTTYDISC into our termios discipline */
407 1.2 deraadt if (disc == 2)
408 1.2 deraadt disc = 0;
409 1.2 deraadt /* all other disciplines are not supported by NetBSD */
410 1.2 deraadt if (disc)
411 1.2 deraadt return ENXIO;
412 1.1 deraadt
413 1.2 deraadt return (*ctl)(fp, TIOCSETD, (caddr_t)&disc, p);
414 1.4 deraadt }
415 1.13 deraadt case _IOW('t', 101, int): /* sun SUNOS_TIOCSSOFTCAR */
416 1.4 deraadt {
417 1.4 deraadt int x; /* unused */
418 1.4 deraadt
419 1.13 deraadt return copyin((caddr_t)&x, SCARG(uap, data), sizeof x);
420 1.4 deraadt }
421 1.13 deraadt case _IOR('t', 100, int): /* sun SUNOS_TIOCSSOFTCAR */
422 1.4 deraadt {
423 1.4 deraadt int x = 0;
424 1.4 deraadt
425 1.13 deraadt return copyout((caddr_t)&x, SCARG(uap, data), sizeof x);
426 1.2 deraadt }
427 1.2 deraadt case _IO('t', 36): /* sun TIOCCONS, no parameters */
428 1.2 deraadt {
429 1.1 deraadt int on = 1;
430 1.2 deraadt return (*ctl)(fp, TIOCCONS, (caddr_t)&on, p);
431 1.1 deraadt }
432 1.13 deraadt case _IOW('t', 37, struct sunos_ttysize):
433 1.2 deraadt {
434 1.2 deraadt struct winsize ws;
435 1.13 deraadt struct sunos_ttysize ss;
436 1.1 deraadt
437 1.1 deraadt if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
438 1.1 deraadt return (error);
439 1.2 deraadt
440 1.13 deraadt if ((error = copyin (SCARG(uap, data), &ss, sizeof (ss))) != 0)
441 1.2 deraadt return error;
442 1.2 deraadt
443 1.2 deraadt ws.ws_row = ss.ts_row;
444 1.2 deraadt ws.ws_col = ss.ts_col;
445 1.2 deraadt
446 1.1 deraadt return ((*ctl)(fp, TIOCSWINSZ, (caddr_t)&ws, p));
447 1.1 deraadt }
448 1.13 deraadt case _IOW('t', 38, struct sunos_ttysize):
449 1.2 deraadt {
450 1.2 deraadt struct winsize ws;
451 1.13 deraadt struct sunos_ttysize ss;
452 1.1 deraadt
453 1.1 deraadt if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
454 1.1 deraadt return (error);
455 1.2 deraadt
456 1.2 deraadt ss.ts_row = ws.ws_row;
457 1.2 deraadt ss.ts_col = ws.ws_col;
458 1.2 deraadt
459 1.13 deraadt return copyout ((caddr_t)&ss, SCARG(uap, data), sizeof (ss));
460 1.1 deraadt }
461 1.9 pk case _IOW('t', 130, int):
462 1.13 deraadt SCARG(uap, com) = TIOCSPGRP;
463 1.1 deraadt break;
464 1.1 deraadt case _IOR('t', 131, int):
465 1.13 deraadt SCARG(uap, com) = TIOCGPGRP;
466 1.1 deraadt break;
467 1.1 deraadt case _IO('t', 132):
468 1.13 deraadt SCARG(uap, com) = TIOCSCTTY;
469 1.1 deraadt break;
470 1.13 deraadt case SUNOS_TCGETA:
471 1.13 deraadt case SUNOS_TCGETS:
472 1.2 deraadt {
473 1.2 deraadt struct termios bts;
474 1.13 deraadt struct sunos_termios sts;
475 1.13 deraadt struct sunos_termio st;
476 1.2 deraadt
477 1.2 deraadt if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
478 1.2 deraadt return error;
479 1.2 deraadt
480 1.2 deraadt btios2stios (&bts, &sts);
481 1.13 deraadt if (SCARG(uap, com) == SUNOS_TCGETA) {
482 1.2 deraadt stios2stio (&sts, &st);
483 1.13 deraadt return copyout((caddr_t)&st, SCARG(uap, data),
484 1.13 deraadt sizeof (st));
485 1.2 deraadt } else
486 1.13 deraadt return copyout((caddr_t)&sts, SCARG(uap, data),
487 1.13 deraadt sizeof (sts));
488 1.2 deraadt /*NOTREACHED*/
489 1.2 deraadt }
490 1.13 deraadt case SUNOS_TCSETA:
491 1.13 deraadt case SUNOS_TCSETAW:
492 1.13 deraadt case SUNOS_TCSETAF:
493 1.2 deraadt {
494 1.2 deraadt struct termios bts;
495 1.13 deraadt struct sunos_termios sts;
496 1.13 deraadt struct sunos_termio st;
497 1.1 deraadt
498 1.13 deraadt if ((error = copyin(SCARG(uap, data), (caddr_t)&st,
499 1.2 deraadt sizeof (st))) != 0)
500 1.2 deraadt return error;
501 1.2 deraadt
502 1.2 deraadt /* get full BSD termios so we don't lose information */
503 1.2 deraadt if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
504 1.2 deraadt return error;
505 1.2 deraadt
506 1.2 deraadt /*
507 1.2 deraadt * convert to sun termios, copy in information from
508 1.2 deraadt * termio, and convert back, then set new values.
509 1.2 deraadt */
510 1.2 deraadt btios2stios(&bts, &sts);
511 1.2 deraadt stio2stios(&st, &sts);
512 1.2 deraadt stios2btios(&sts, &bts);
513 1.1 deraadt
514 1.13 deraadt return (*ctl)(fp, SCARG(uap, com) - SUNOS_TCSETA + TIOCSETA,
515 1.2 deraadt (caddr_t)&bts, p);
516 1.2 deraadt }
517 1.13 deraadt case SUNOS_TCSETS:
518 1.13 deraadt case SUNOS_TCSETSW:
519 1.13 deraadt case SUNOS_TCSETSF:
520 1.2 deraadt {
521 1.2 deraadt struct termios bts;
522 1.13 deraadt struct sunos_termios sts;
523 1.2 deraadt
524 1.13 deraadt if ((error = copyin (SCARG(uap, data), (caddr_t)&sts,
525 1.2 deraadt sizeof (sts))) != 0)
526 1.2 deraadt return error;
527 1.2 deraadt stios2btios (&sts, &bts);
528 1.13 deraadt return (*ctl)(fp, SCARG(uap, com) - SUNOS_TCSETS + TIOCSETA,
529 1.2 deraadt (caddr_t)&bts, p);
530 1.6 deraadt }
531 1.6 deraadt /*
532 1.6 deraadt * Pseudo-tty ioctl translations.
533 1.6 deraadt */
534 1.9 pk case _IOW('t', 32, int): { /* TIOCTCNTL */
535 1.9 pk int error, on;
536 1.9 pk
537 1.13 deraadt if (error = copyin (SCARG(uap, data), (caddr_t)&on, sizeof (on)))
538 1.9 pk return error;
539 1.9 pk return (*ctl)(fp, TIOCUCNTL, (caddr_t)&on, p);
540 1.9 pk }
541 1.6 deraadt case _IOW('t', 33, int): { /* TIOCSIGNAL */
542 1.6 deraadt int error, sig;
543 1.6 deraadt
544 1.13 deraadt if (error = copyin (SCARG(uap, data), (caddr_t)&sig, sizeof (sig)))
545 1.6 deraadt return error;
546 1.7 deraadt return (*ctl)(fp, TIOCSIG, (caddr_t)&sig, p);
547 1.6 deraadt }
548 1.6 deraadt
549 1.6 deraadt /*
550 1.6 deraadt * Socket ioctl translations.
551 1.6 deraadt */
552 1.6 deraadt #define IFREQ_IN(a) { \
553 1.6 deraadt struct ifreq ifreq; \
554 1.13 deraadt if (error = copyin (SCARG(uap, data), (caddr_t)&ifreq, sizeof (ifreq))) \
555 1.6 deraadt return error; \
556 1.6 deraadt return (*ctl)(fp, a, (caddr_t)&ifreq, p); \
557 1.6 deraadt }
558 1.6 deraadt #define IFREQ_INOUT(a) { \
559 1.6 deraadt struct ifreq ifreq; \
560 1.13 deraadt if (error = copyin (SCARG(uap, data), (caddr_t)&ifreq, sizeof (ifreq))) \
561 1.6 deraadt return error; \
562 1.6 deraadt if (error = (*ctl)(fp, a, (caddr_t)&ifreq, p)) \
563 1.6 deraadt return error; \
564 1.13 deraadt return copyout ((caddr_t)&ifreq, SCARG(uap, data), sizeof (ifreq)); \
565 1.6 deraadt }
566 1.6 deraadt
567 1.6 deraadt case _IOW('i', 12, struct ifreq):
568 1.6 deraadt /* SIOCSIFADDR */
569 1.6 deraadt break;
570 1.6 deraadt
571 1.6 deraadt case _IOWR('i', 13, struct ifreq):
572 1.6 deraadt IFREQ_INOUT(OSIOCGIFADDR);
573 1.6 deraadt
574 1.6 deraadt case _IOW('i', 14, struct ifreq):
575 1.6 deraadt /* SIOCSIFDSTADDR */
576 1.6 deraadt break;
577 1.6 deraadt
578 1.6 deraadt case _IOWR('i', 15, struct ifreq):
579 1.6 deraadt IFREQ_INOUT(OSIOCGIFDSTADDR);
580 1.6 deraadt
581 1.6 deraadt case _IOW('i', 16, struct ifreq):
582 1.6 deraadt /* SIOCSIFFLAGS */
583 1.6 deraadt break;
584 1.6 deraadt
585 1.6 deraadt case _IOWR('i', 17, struct ifreq):
586 1.6 deraadt /* SIOCGIFFLAGS */
587 1.6 deraadt break;
588 1.6 deraadt
589 1.6 deraadt case _IOW('i', 21, struct ifreq):
590 1.6 deraadt IFREQ_IN(SIOCSIFMTU);
591 1.6 deraadt
592 1.6 deraadt case _IOWR('i', 22, struct ifreq):
593 1.6 deraadt IFREQ_INOUT(SIOCGIFMTU);
594 1.6 deraadt
595 1.6 deraadt case _IOWR('i', 23, struct ifreq):
596 1.6 deraadt IFREQ_INOUT(SIOCGIFBRDADDR);
597 1.6 deraadt
598 1.6 deraadt case _IOW('i', 24, struct ifreq):
599 1.6 deraadt IFREQ_IN(SIOCSIFBRDADDR);
600 1.6 deraadt
601 1.6 deraadt case _IOWR('i', 25, struct ifreq):
602 1.6 deraadt IFREQ_INOUT(OSIOCGIFNETMASK);
603 1.6 deraadt
604 1.6 deraadt case _IOW('i', 26, struct ifreq):
605 1.6 deraadt IFREQ_IN(SIOCSIFNETMASK);
606 1.6 deraadt
607 1.6 deraadt case _IOWR('i', 27, struct ifreq):
608 1.6 deraadt IFREQ_INOUT(SIOCGIFMETRIC);
609 1.6 deraadt
610 1.6 deraadt case _IOWR('i', 28, struct ifreq):
611 1.6 deraadt IFREQ_IN(SIOCSIFMETRIC);
612 1.6 deraadt
613 1.6 deraadt case _IOW('i', 30, struct arpreq):
614 1.6 deraadt /* SIOCSARP */
615 1.6 deraadt break;
616 1.6 deraadt
617 1.6 deraadt case _IOWR('i', 31, struct arpreq):
618 1.10 deraadt /* SIOCGARP */
619 1.10 deraadt break;
620 1.6 deraadt
621 1.6 deraadt case _IOW('i', 32, struct arpreq):
622 1.6 deraadt /* SIOCDARP */
623 1.6 deraadt break;
624 1.6 deraadt
625 1.6 deraadt case _IOW('i', 18, struct ifreq): /* SIOCSIFMEM */
626 1.6 deraadt case _IOWR('i', 19, struct ifreq): /* SIOCGIFMEM */
627 1.6 deraadt case _IOW('i', 40, struct ifreq): /* SIOCUPPER */
628 1.6 deraadt case _IOW('i', 41, struct ifreq): /* SIOCLOWER */
629 1.6 deraadt case _IOW('i', 44, struct ifreq): /* SIOCSETSYNC */
630 1.6 deraadt case _IOWR('i', 45, struct ifreq): /* SIOCGETSYNC */
631 1.6 deraadt case _IOWR('i', 46, struct ifreq): /* SIOCSDSTATS */
632 1.6 deraadt case _IOWR('i', 47, struct ifreq): /* SIOCSESTATS */
633 1.6 deraadt case _IOW('i', 48, int): /* SIOCSPROMISC */
634 1.6 deraadt case _IOW('i', 49, struct ifreq): /* SIOCADDMULTI */
635 1.6 deraadt case _IOW('i', 50, struct ifreq): /* SIOCDELMULTI */
636 1.6 deraadt return EOPNOTSUPP;
637 1.6 deraadt
638 1.6 deraadt case _IOWR('i', 20, struct ifconf): /* SIOCGIFCONF */
639 1.6 deraadt {
640 1.6 deraadt struct ifconf ifconf;
641 1.6 deraadt
642 1.6 deraadt /*
643 1.6 deraadt * XXX: two more problems
644 1.6 deraadt * 1. our sockaddr's are variable length, not always sizeof(sockaddr)
645 1.6 deraadt * 2. this returns a name per protocol, ie. it returns two "lo0"'s
646 1.6 deraadt */
647 1.13 deraadt if (error = copyin (SCARG(uap, data), (caddr_t)&ifconf,
648 1.13 deraadt sizeof (ifconf)))
649 1.6 deraadt return error;
650 1.6 deraadt if (error = (*ctl)(fp, OSIOCGIFCONF, (caddr_t)&ifconf, p))
651 1.6 deraadt return error;
652 1.13 deraadt return copyout ((caddr_t)&ifconf, SCARG(uap, data),
653 1.13 deraadt sizeof (ifconf));
654 1.1 deraadt }
655 1.1 deraadt }
656 1.1 deraadt return (ioctl(p, uap, retval));
657 1.1 deraadt }
658