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