Deleted Added
sdiff udiff text old ( 86468 ) new ( 89306 )
full compact
1/* $NetBSD: ibcs2_ioctl.c,v 1.6 1995/03/14 15:12:28 scottb Exp $ */
2
3/*
4 * Copyright (c) 1994, 1995 Scott Bartram
5 * All rights reserved.
6 *
7 * based on compat/sunos/sun_ioctl.c
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/i386/ibcs2/ibcs2_ioctl.c 89306 2002-01-13 11:58:06Z alfred $
29 */
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/consio.h>
34#include <sys/fcntl.h>
35#include <sys/file.h>
36#include <sys/filedesc.h>
37#include <sys/filio.h>
38#include <sys/ioctl_compat.h>
39#include <sys/kbio.h>
40#include <sys/lock.h>
41#include <sys/mutex.h>
42#include <sys/sysproto.h>
43#include <sys/tty.h>
44
45#include <i386/ibcs2/ibcs2_signal.h>
46#include <i386/ibcs2/ibcs2_socksys.h>
47#include <i386/ibcs2/ibcs2_stropts.h>
48#include <i386/ibcs2/ibcs2_proto.h>
49#include <i386/ibcs2/ibcs2_termios.h>
50#include <i386/ibcs2/ibcs2_util.h>
51#include <i386/ibcs2/ibcs2_ioctl.h>
52
53static void stios2btios __P((struct ibcs2_termios *, struct termios *));
54static void btios2stios __P((struct termios *, struct ibcs2_termios *));
55static void stios2stio __P((struct ibcs2_termios *, struct ibcs2_termio *));
56static void stio2stios __P((struct ibcs2_termio *, struct ibcs2_termios *));
57static int ibcs2_do_ioctl __P((struct proc *, struct ibcs2_ioctl_args *,
58 struct file *));
59
60
61int
62ibcs2_gtty(struct thread *td, struct ibcs2_gtty_args *args)
63{
64 struct ioctl_args ioctl_arg;
65
66 ioctl_arg.fd = args->fd;
67 ioctl_arg.com = TIOCGETC;
68 ioctl_arg.data = (caddr_t)args->buf;
69
70 return ioctl(td, &ioctl_arg);
71}
72
73int
74ibcs2_stty(struct thread *td, struct ibcs2_stty_args *args)
75{
76 struct ioctl_args ioctl_arg;
77
78 ioctl_arg.fd = args->fd;
79 ioctl_arg.com = TIOCSETC;
80 ioctl_arg.data = (caddr_t)args->buf;
81
82 return ioctl(td, &ioctl_arg);
83}
84
85
86/*
87 * iBCS2 ioctl calls.
88 */
89
90static struct speedtab sptab[] = {
91 { 0, 0 },
92 { 50, 1 },
93 { 75, 2 },
94 { 110, 3 },
95 { 134, 4 },
96 { 135, 4 },
97 { 150, 5 },
98 { 200, 6 },
99 { 300, 7 },
100 { 600, 8 },
101 { 1200, 9 },
102 { 1800, 10 },
103 { 2400, 11 },
104 { 4800, 12 },
105 { 9600, 13 },
106 { 19200, 14 },
107 { 38400, 15 },
108 { -1, -1 }
109};
110
111static u_long s2btab[] = {
112 0,
113 50,
114 75,
115 110,
116 134,
117 150,
118 200,
119 300,
120 600,
121 1200,
122 1800,
123 2400,
124 4800,
125 9600,
126 19200,
127 38400,
128};
129
130static void
131stios2btios(st, bt)
132 struct ibcs2_termios *st;
133 struct termios *bt;
134{
135 register u_long l, r;
136
137 l = st->c_iflag; r = 0;
138 if (l & IBCS2_IGNBRK) r |= IGNBRK;
139 if (l & IBCS2_BRKINT) r |= BRKINT;
140 if (l & IBCS2_IGNPAR) r |= IGNPAR;
141 if (l & IBCS2_PARMRK) r |= PARMRK;
142 if (l & IBCS2_INPCK) r |= INPCK;
143 if (l & IBCS2_ISTRIP) r |= ISTRIP;
144 if (l & IBCS2_INLCR) r |= INLCR;
145 if (l & IBCS2_IGNCR) r |= IGNCR;
146 if (l & IBCS2_ICRNL) r |= ICRNL;
147 if (l & IBCS2_IXON) r |= IXON;
148 if (l & IBCS2_IXANY) r |= IXANY;
149 if (l & IBCS2_IXOFF) r |= IXOFF;
150 if (l & IBCS2_IMAXBEL) r |= IMAXBEL;
151 bt->c_iflag = r;
152
153 l = st->c_oflag; r = 0;
154 if (l & IBCS2_OPOST) r |= OPOST;
155 if (l & IBCS2_ONLCR) r |= ONLCR;
156 if (l & IBCS2_TAB3) r |= OXTABS;
157 bt->c_oflag = r;
158
159 l = st->c_cflag; r = 0;
160 switch (l & IBCS2_CSIZE) {
161 case IBCS2_CS5: r |= CS5; break;
162 case IBCS2_CS6: r |= CS6; break;
163 case IBCS2_CS7: r |= CS7; break;
164 case IBCS2_CS8: r |= CS8; break;
165 }
166 if (l & IBCS2_CSTOPB) r |= CSTOPB;
167 if (l & IBCS2_CREAD) r |= CREAD;
168 if (l & IBCS2_PARENB) r |= PARENB;
169 if (l & IBCS2_PARODD) r |= PARODD;
170 if (l & IBCS2_HUPCL) r |= HUPCL;
171 if (l & IBCS2_CLOCAL) r |= CLOCAL;
172 bt->c_cflag = r;
173
174 bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f];
175
176 l = st->c_lflag; r = 0;
177 if (l & IBCS2_ISIG) r |= ISIG;
178 if (l & IBCS2_ICANON) r |= ICANON;
179 if (l & IBCS2_ECHO) r |= ECHO;
180 if (l & IBCS2_ECHOE) r |= ECHOE;
181 if (l & IBCS2_ECHOK) r |= ECHOK;
182 if (l & IBCS2_ECHONL) r |= ECHONL;
183 if (l & IBCS2_NOFLSH) r |= NOFLSH;
184 if (l & IBCS2_TOSTOP) r |= TOSTOP;
185 bt->c_lflag = r;
186
187 bt->c_cc[VINTR] =
188 st->c_cc[IBCS2_VINTR] ? st->c_cc[IBCS2_VINTR] : _POSIX_VDISABLE;
189 bt->c_cc[VQUIT] =
190 st->c_cc[IBCS2_VQUIT] ? st->c_cc[IBCS2_VQUIT] : _POSIX_VDISABLE;
191 bt->c_cc[VERASE] =
192 st->c_cc[IBCS2_VERASE] ? st->c_cc[IBCS2_VERASE] : _POSIX_VDISABLE;
193 bt->c_cc[VKILL] =
194 st->c_cc[IBCS2_VKILL] ? st->c_cc[IBCS2_VKILL] : _POSIX_VDISABLE;
195 if (bt->c_lflag & ICANON) {
196 bt->c_cc[VEOF] =
197 st->c_cc[IBCS2_VEOF] ? st->c_cc[IBCS2_VEOF] : _POSIX_VDISABLE;
198 bt->c_cc[VEOL] =
199 st->c_cc[IBCS2_VEOL] ? st->c_cc[IBCS2_VEOL] : _POSIX_VDISABLE;
200 } else {
201 bt->c_cc[VMIN] = st->c_cc[IBCS2_VMIN];
202 bt->c_cc[VTIME] = st->c_cc[IBCS2_VTIME];
203 }
204 bt->c_cc[VEOL2] =
205 st->c_cc[IBCS2_VEOL2] ? st->c_cc[IBCS2_VEOL2] : _POSIX_VDISABLE;
206#if 0
207 bt->c_cc[VSWTCH] =
208 st->c_cc[IBCS2_VSWTCH] ? st->c_cc[IBCS2_VSWTCH] : _POSIX_VDISABLE;
209#endif
210 bt->c_cc[VSTART] =
211 st->c_cc[IBCS2_VSTART] ? st->c_cc[IBCS2_VSTART] : _POSIX_VDISABLE;
212 bt->c_cc[VSTOP] =
213 st->c_cc[IBCS2_VSTOP] ? st->c_cc[IBCS2_VSTOP] : _POSIX_VDISABLE;
214 bt->c_cc[VSUSP] =
215 st->c_cc[IBCS2_VSUSP] ? st->c_cc[IBCS2_VSUSP] : _POSIX_VDISABLE;
216 bt->c_cc[VDSUSP] = _POSIX_VDISABLE;
217 bt->c_cc[VREPRINT] = _POSIX_VDISABLE;
218 bt->c_cc[VDISCARD] = _POSIX_VDISABLE;
219 bt->c_cc[VWERASE] = _POSIX_VDISABLE;
220 bt->c_cc[VLNEXT] = _POSIX_VDISABLE;
221 bt->c_cc[VSTATUS] = _POSIX_VDISABLE;
222}
223
224static void
225btios2stios(bt, st)
226 struct termios *bt;
227 struct ibcs2_termios *st;
228{
229 register u_long l, r;
230
231 l = bt->c_iflag; r = 0;
232 if (l & IGNBRK) r |= IBCS2_IGNBRK;
233 if (l & BRKINT) r |= IBCS2_BRKINT;
234 if (l & IGNPAR) r |= IBCS2_IGNPAR;
235 if (l & PARMRK) r |= IBCS2_PARMRK;
236 if (l & INPCK) r |= IBCS2_INPCK;
237 if (l & ISTRIP) r |= IBCS2_ISTRIP;
238 if (l & INLCR) r |= IBCS2_INLCR;
239 if (l & IGNCR) r |= IBCS2_IGNCR;
240 if (l & ICRNL) r |= IBCS2_ICRNL;
241 if (l & IXON) r |= IBCS2_IXON;
242 if (l & IXANY) r |= IBCS2_IXANY;
243 if (l & IXOFF) r |= IBCS2_IXOFF;
244 if (l & IMAXBEL) r |= IBCS2_IMAXBEL;
245 st->c_iflag = r;
246
247 l = bt->c_oflag; r = 0;
248 if (l & OPOST) r |= IBCS2_OPOST;
249 if (l & ONLCR) r |= IBCS2_ONLCR;
250 if (l & OXTABS) r |= IBCS2_TAB3;
251 st->c_oflag = r;
252
253 l = bt->c_cflag; r = 0;
254 switch (l & CSIZE) {
255 case CS5: r |= IBCS2_CS5; break;
256 case CS6: r |= IBCS2_CS6; break;
257 case CS7: r |= IBCS2_CS7; break;
258 case CS8: r |= IBCS2_CS8; break;
259 }
260 if (l & CSTOPB) r |= IBCS2_CSTOPB;
261 if (l & CREAD) r |= IBCS2_CREAD;
262 if (l & PARENB) r |= IBCS2_PARENB;
263 if (l & PARODD) r |= IBCS2_PARODD;
264 if (l & HUPCL) r |= IBCS2_HUPCL;
265 if (l & CLOCAL) r |= IBCS2_CLOCAL;
266 st->c_cflag = r;
267
268 l = bt->c_lflag; r = 0;
269 if (l & ISIG) r |= IBCS2_ISIG;
270 if (l & ICANON) r |= IBCS2_ICANON;
271 if (l & ECHO) r |= IBCS2_ECHO;
272 if (l & ECHOE) r |= IBCS2_ECHOE;
273 if (l & ECHOK) r |= IBCS2_ECHOK;
274 if (l & ECHONL) r |= IBCS2_ECHONL;
275 if (l & NOFLSH) r |= IBCS2_NOFLSH;
276 if (l & TOSTOP) r |= IBCS2_TOSTOP;
277 st->c_lflag = r;
278
279 l = ttspeedtab(bt->c_ospeed, sptab);
280 if ((int)l >= 0)
281 st->c_cflag |= l;
282
283 st->c_cc[IBCS2_VINTR] =
284 bt->c_cc[VINTR] != _POSIX_VDISABLE ? bt->c_cc[VINTR] : 0;
285 st->c_cc[IBCS2_VQUIT] =
286 bt->c_cc[VQUIT] != _POSIX_VDISABLE ? bt->c_cc[VQUIT] : 0;
287 st->c_cc[IBCS2_VERASE] =
288 bt->c_cc[VERASE] != _POSIX_VDISABLE ? bt->c_cc[VERASE] : 0;
289 st->c_cc[IBCS2_VKILL] =
290 bt->c_cc[VKILL] != _POSIX_VDISABLE ? bt->c_cc[VKILL] : 0;
291 if (bt->c_lflag & ICANON) {
292 st->c_cc[IBCS2_VEOF] =
293 bt->c_cc[VEOF] != _POSIX_VDISABLE ? bt->c_cc[VEOF] : 0;
294 st->c_cc[IBCS2_VEOL] =
295 bt->c_cc[VEOL] != _POSIX_VDISABLE ? bt->c_cc[VEOL] : 0;
296 } else {
297 st->c_cc[IBCS2_VMIN] = bt->c_cc[VMIN];
298 st->c_cc[IBCS2_VTIME] = bt->c_cc[VTIME];
299 }
300 st->c_cc[IBCS2_VEOL2] =
301 bt->c_cc[VEOL2] != _POSIX_VDISABLE ? bt->c_cc[VEOL2] : 0;
302 st->c_cc[IBCS2_VSWTCH] =
303 0;
304 st->c_cc[IBCS2_VSUSP] =
305 bt->c_cc[VSUSP] != _POSIX_VDISABLE ? bt->c_cc[VSUSP] : 0;
306 st->c_cc[IBCS2_VSTART] =
307 bt->c_cc[VSTART] != _POSIX_VDISABLE ? bt->c_cc[VSTART] : 0;
308 st->c_cc[IBCS2_VSTOP] =
309 bt->c_cc[VSTOP] != _POSIX_VDISABLE ? bt->c_cc[VSTOP] : 0;
310
311 st->c_line = 0;
312}
313
314static void
315stios2stio(ts, t)
316 struct ibcs2_termios *ts;
317 struct ibcs2_termio *t;
318{
319 t->c_iflag = ts->c_iflag;
320 t->c_oflag = ts->c_oflag;
321 t->c_cflag = ts->c_cflag;
322 t->c_lflag = ts->c_lflag;
323 t->c_line = ts->c_line;
324 bcopy(ts->c_cc, t->c_cc, IBCS2_NCC);
325}
326
327static void
328stio2stios(t, ts)
329 struct ibcs2_termio *t;
330 struct ibcs2_termios *ts;
331{
332 ts->c_iflag = t->c_iflag;
333 ts->c_oflag = t->c_oflag;
334 ts->c_cflag = t->c_cflag;
335 ts->c_lflag = t->c_lflag;
336 ts->c_line = t->c_line;
337 bcopy(t->c_cc, ts->c_cc, IBCS2_NCC);
338}
339
340int
341ibcs2_ioctl(td, uap)
342 struct thread *td;
343 struct ibcs2_ioctl_args *uap;
344{
345 struct proc *p = td->td_proc;
346 struct file *fp;
347 int error;
348
349 fp = ffind_hold(td, uap->fd);
350 if (fp == NULL) {
351 DPRINTF(("ibcs2_ioctl(%d): bad fd %d ", p->p_pid,
352 SCARG(uap, fd)));
353 return EBADF;
354 }
355
356 if ((fp->f_flag & (FREAD|FWRITE)) == 0) {
357 fdrop(fp, td);
358 DPRINTF(("ibcs2_ioctl(%d): bad fp flag ", p->p_pid));
359 return EBADF;
360 }
361
362 switch (SCARG(uap, cmd)) {
363 case IBCS2_TCGETA:
364 case IBCS2_XCGETA:
365 case IBCS2_OXCGETA:
366 {
367 struct termios bts;
368 struct ibcs2_termios sts;
369 struct ibcs2_termio st;
370
371 if ((error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bts, td)) != 0)
372 break;
373
374 btios2stios (&bts, &sts);
375 if (SCARG(uap, cmd) == IBCS2_TCGETA) {
376 stios2stio (&sts, &st);
377 error = copyout((caddr_t)&st, SCARG(uap, data),
378 sizeof (st));
379#ifdef DEBUG_IBCS2
380 if (error)
381 DPRINTF(("ibcs2_ioctl(%d): copyout failed ",
382 p->p_pid));
383#endif
384 break;
385 } else {
386 error = copyout((caddr_t)&sts, SCARG(uap, data),
387 sizeof (sts));
388 break;
389 }
390 /*NOTREACHED*/
391 }
392
393 case IBCS2_TCSETA:
394 case IBCS2_TCSETAW:
395 case IBCS2_TCSETAF:
396 {
397 struct termios bts;
398 struct ibcs2_termios sts;
399 struct ibcs2_termio st;
400
401 if ((error = copyin(SCARG(uap, data), (caddr_t)&st,
402 sizeof(st))) != 0) {
403 DPRINTF(("ibcs2_ioctl(%d): TCSET copyin failed ",
404 p->p_pid));
405 break;
406 }
407
408 /* get full BSD termios so we don't lose information */
409 if ((error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bts, td)) != 0) {
410 DPRINTF(("ibcs2_ioctl(%d): TCSET ctl failed fd %d ",
411 p->p_pid, SCARG(uap, fd)));
412 break;
413 }
414
415 /*
416 * convert to iBCS2 termios, copy in information from
417 * termio, and convert back, then set new values.
418 */
419 btios2stios(&bts, &sts);
420 stio2stios(&st, &sts);
421 stios2btios(&sts, &bts);
422
423 error = fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_TCSETA + TIOCSETA,
424 (caddr_t)&bts, td);
425 break;
426 }
427
428 case IBCS2_XCSETA:
429 case IBCS2_XCSETAW:
430 case IBCS2_XCSETAF:
431 {
432 struct termios bts;
433 struct ibcs2_termios sts;
434
435 if ((error = copyin(SCARG(uap, data), (caddr_t)&sts,
436 sizeof (sts))) != 0)
437 break;
438 stios2btios (&sts, &bts);
439 error = fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_XCSETA + TIOCSETA,
440 (caddr_t)&bts, td);
441 break;
442 }
443
444 case IBCS2_OXCSETA:
445 case IBCS2_OXCSETAW:
446 case IBCS2_OXCSETAF:
447 {
448 struct termios bts;
449 struct ibcs2_termios sts;
450
451 if ((error = copyin(SCARG(uap, data), (caddr_t)&sts,
452 sizeof (sts))) != 0)
453 break;
454 stios2btios (&sts, &bts);
455 error = fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_OXCSETA + TIOCSETA,
456 (caddr_t)&bts, td);
457 break;
458 }
459
460 case IBCS2_TCSBRK:
461 DPRINTF(("ibcs2_ioctl(%d): TCSBRK ", p->p_pid));
462 error = ENOSYS;
463 break;
464
465 case IBCS2_TCXONC:
466 {
467 switch ((int)SCARG(uap, data)) {
468 case 0:
469 case 1:
470 DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid));
471 error = ENOSYS;
472 break;
473 case 2:
474 error = fo_ioctl(fp, TIOCSTOP, (caddr_t)0, td);
475 break;
476 case 3:
477 error = fo_ioctl(fp, TIOCSTART, (caddr_t)1, td);
478 break;
479 default:
480 error = EINVAL;
481 break;
482 }
483 break;
484 }
485
486 case IBCS2_TCFLSH:
487 {
488 int arg;
489
490 switch ((int)SCARG(uap, data)) {
491 case 0:
492 arg = FREAD;
493 break;
494 case 1:
495 arg = FWRITE;
496 break;
497 case 2:
498 arg = FREAD | FWRITE;
499 break;
500 default:
501 fdrop(fp, td);
502 return EINVAL;
503 }
504 error = fo_ioctl(fp, TIOCFLUSH, (caddr_t)&arg, td);
505 break;
506 }
507
508 case IBCS2_TIOCGWINSZ:
509 SCARG(uap, cmd) = TIOCGWINSZ;
510 error = ioctl(td, (struct ioctl_args *)uap);
511 break;
512
513 case IBCS2_TIOCSWINSZ:
514 SCARG(uap, cmd) = TIOCSWINSZ;
515 error = ioctl(td, (struct ioctl_args *)uap);
516 break;
517
518 case IBCS2_TIOCGPGRP:
519 {
520 pid_t pg_id;
521
522 PROC_LOCK(p);
523 pg_id = p->p_pgrp->pg_id;
524 PROC_UNLOCK(p);
525 error = copyout((caddr_t)&pg_id, SCARG(uap, data),
526 sizeof(pg_id));
527 break;
528 }
529
530 case IBCS2_TIOCSPGRP: /* XXX - is uap->data a pointer to pgid? */
531 {
532 struct setpgid_args sa;
533
534 SCARG(&sa, pid) = 0;
535 SCARG(&sa, pgid) = (int)SCARG(uap, data);
536 error = setpgid(td, &sa);
537 break;
538 }
539
540 case IBCS2_TCGETSC: /* SCO console - get scancode flags */
541 error = EINTR; /* ENOSYS; */
542 break;
543
544 case IBCS2_TCSETSC: /* SCO console - set scancode flags */
545 error = 0; /* ENOSYS; */
546 break;
547
548 case IBCS2_JWINSIZE: /* Unix to Jerq I/O control */
549 {
550 struct ibcs2_jwinsize {
551 char bytex, bytey;
552 short bitx, bity;
553 } ibcs2_jwinsize;
554
555 PROC_LOCK(p);
556 ibcs2_jwinsize.bytex = 80;
557 /* p->p_session->s_ttyp->t_winsize.ws_col; XXX */
558 ibcs2_jwinsize.bytey = 25;
559 /* p->p_session->s_ttyp->t_winsize.ws_row; XXX */
560 ibcs2_jwinsize.bitx =
561 p->p_session->s_ttyp->t_winsize.ws_xpixel;
562 ibcs2_jwinsize.bity =
563 p->p_session->s_ttyp->t_winsize.ws_ypixel;
564 PROC_UNLOCK(p);
565 error = copyout((caddr_t)&ibcs2_jwinsize, SCARG(uap, data),
566 sizeof(ibcs2_jwinsize));
567 break;
568 }
569
570 /* keyboard and display ioctl's -- type 'K' */
571 case IBCS2_KDGKBMODE: /* get keyboard translation mode */
572 SCARG(uap, cmd) = KDGKBMODE;
573/* printf("ioctl KDGKBMODE = %x\n", SCARG(uap, cmd));*/
574 error = ioctl(td, (struct ioctl_args *)uap);
575 break;
576
577 case IBCS2_KDSKBMODE: /* set keyboard translation mode */
578 SCARG(uap, cmd) = KDSKBMODE;
579 error = ioctl(td, (struct ioctl_args *)uap);
580 break;
581
582 case IBCS2_KDMKTONE: /* sound tone */
583 SCARG(uap, cmd) = KDMKTONE;
584 error = ioctl(td, (struct ioctl_args *)uap);
585 break;
586
587 case IBCS2_KDGETMODE: /* get text/graphics mode */
588 SCARG(uap, cmd) = KDGETMODE;
589 error = ioctl(td, (struct ioctl_args *)uap);
590 break;
591
592 case IBCS2_KDSETMODE: /* set text/graphics mode */
593 SCARG(uap, cmd) = KDSETMODE;
594 error = ioctl(td, (struct ioctl_args *)uap);
595 break;
596
597 case IBCS2_KDSBORDER: /* set ega color border */
598 SCARG(uap, cmd) = KDSBORDER;
599 error = ioctl(td, (struct ioctl_args *)uap);
600 break;
601
602 case IBCS2_KDGKBSTATE:
603 SCARG(uap, cmd) = KDGKBSTATE;
604 error = ioctl(td, (struct ioctl_args *)uap);
605 break;
606
607 case IBCS2_KDSETRAD:
608 SCARG(uap, cmd) = KDSETRAD;
609 error = ioctl(td, (struct ioctl_args *)uap);
610 break;
611
612 case IBCS2_KDENABIO: /* enable direct I/O to ports */
613 SCARG(uap, cmd) = KDENABIO;
614 error = ioctl(td, (struct ioctl_args *)uap);
615 break;
616
617 case IBCS2_KDDISABIO: /* disable direct I/O to ports */
618 SCARG(uap, cmd) = KDDISABIO;
619 error = ioctl(td, (struct ioctl_args *)uap);
620 break;
621
622 case IBCS2_KIOCSOUND: /* start sound generation */
623 SCARG(uap, cmd) = KIOCSOUND;
624 error = ioctl(td, (struct ioctl_args *)uap);
625 break;
626
627 case IBCS2_KDGKBTYPE: /* get keyboard type */
628 SCARG(uap, cmd) = KDGKBTYPE;
629 error = ioctl(td, (struct ioctl_args *)uap);
630 break;
631
632 case IBCS2_KDGETLED: /* get keyboard LED status */
633 SCARG(uap, cmd) = KDGETLED;
634 error = ioctl(td, (struct ioctl_args *)uap);
635 break;
636
637 case IBCS2_KDSETLED: /* set keyboard LED status */
638 SCARG(uap, cmd) = KDSETLED;
639 error = ioctl(td, (struct ioctl_args *)uap);
640 break;
641
642 /* Xenix keyboard and display ioctl's from sys/kd.h -- type 'k' */
643 case IBCS2_GETFKEY: /* Get function key */
644 SCARG(uap, cmd) = GETFKEY;
645 error = ioctl(td, (struct ioctl_args *)uap);
646 break;
647
648 case IBCS2_SETFKEY: /* Set function key */
649 SCARG(uap, cmd) = SETFKEY;
650 error = ioctl(td, (struct ioctl_args *)uap);
651 break;
652
653 case IBCS2_GIO_SCRNMAP: /* Get screen output map table */
654 SCARG(uap, cmd) = GIO_SCRNMAP;
655 error = ioctl(td, (struct ioctl_args *)uap);
656 break;
657
658 case IBCS2_PIO_SCRNMAP: /* Set screen output map table */
659 SCARG(uap, cmd) = PIO_SCRNMAP;
660 error = ioctl(td, (struct ioctl_args *)uap);
661 break;
662
663 case IBCS2_GIO_KEYMAP: /* Get keyboard map table */
664 SCARG(uap, cmd) = GIO_KEYMAP;
665 error = ioctl(td, (struct ioctl_args *)uap);
666 break;
667
668 case IBCS2_PIO_KEYMAP: /* Set keyboard map table */
669 SCARG(uap, cmd) = PIO_KEYMAP;
670 error = ioctl(td, (struct ioctl_args *)uap);
671 break;
672
673 /* socksys */
674 case IBCS2_SIOCSOCKSYS:
675 error = ibcs2_socksys(td, (struct ibcs2_socksys_args *)uap);
676 break;
677
678 case IBCS2_FIONREAD:
679 case IBCS2_I_NREAD: /* STREAMS */
680 SCARG(uap, cmd) = FIONREAD;
681 error = ioctl(td, (struct ioctl_args *)uap);
682 break;
683
684 default:
685 DPRINTF(("ibcs2_ioctl(%d): unknown cmd 0x%lx ",
686 td->proc->p_pid, SCARG(uap, cmd)));
687 error = ENOSYS;
688 break;
689 }
690
691 fdrop(fp, td);
692 return error;
693}