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