1 /* $NetBSD: ibcs2_ioctl.c,v 1.6 1995/03/14 15:12:28 scottb Exp $ */
4 * Copyright (c) 1994, 1995 Scott Bartram
7 * based on compat/sunos/sun_ioctl.c
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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
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.
28 * $FreeBSD: src/sys/i386/ibcs2/ibcs2_ioctl.c,v 1.13.2.1 2001/07/31 20:14:21 jon Exp $
29 * $DragonFly: src/sys/emulation/ibcs2/i386/Attic/ibcs2_ioctl.c,v 1.3 2003/06/23 17:55:38 dillon Exp $
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/fcntl.h>
36 #include <sys/filedesc.h>
37 #include <sys/filio.h>
38 #include <sys/ioctl_compat.h>
40 #include <machine/console.h>
42 #include <sys/sysproto.h>
44 #include <i386/ibcs2/ibcs2_signal.h>
45 #include <i386/ibcs2/ibcs2_socksys.h>
46 #include <i386/ibcs2/ibcs2_stropts.h>
47 #include <i386/ibcs2/ibcs2_proto.h>
48 #include <i386/ibcs2/ibcs2_termios.h>
49 #include <i386/ibcs2/ibcs2_util.h>
50 #include <i386/ibcs2/ibcs2_ioctl.h>
52 static void stios2btios __P((struct ibcs2_termios *, struct termios *));
53 static void btios2stios __P((struct termios *, struct ibcs2_termios *));
54 static void stios2stio __P((struct ibcs2_termios *, struct ibcs2_termio *));
55 static void stio2stios __P((struct ibcs2_termio *, struct ibcs2_termios *));
59 ibcs2_gtty(struct ibcs2_gtty_args *args)
61 struct ioctl_args ioctl_arg;
63 ioctl_arg.fd = args->fd;
64 ioctl_arg.com = TIOCGETC;
65 ioctl_arg.data = (caddr_t)args->buf;
67 return ioctl(&ioctl_arg);
71 ibcs2_stty(struct ibcs2_stty_args *args)
73 struct ioctl_args ioctl_arg;
75 ioctl_arg.fd = args->fd;
76 ioctl_arg.com = TIOCSETC;
77 ioctl_arg.data = (caddr_t)args->buf;
79 return ioctl(&ioctl_arg);
87 static struct speedtab sptab[] = {
108 static u_long s2btab[] = {
129 struct ibcs2_termios *st;
132 register u_long l, r;
134 l = st->c_iflag; r = 0;
135 if (l & IBCS2_IGNBRK) r |= IGNBRK;
136 if (l & IBCS2_BRKINT) r |= BRKINT;
137 if (l & IBCS2_IGNPAR) r |= IGNPAR;
138 if (l & IBCS2_PARMRK) r |= PARMRK;
139 if (l & IBCS2_INPCK) r |= INPCK;
140 if (l & IBCS2_ISTRIP) r |= ISTRIP;
141 if (l & IBCS2_INLCR) r |= INLCR;
142 if (l & IBCS2_IGNCR) r |= IGNCR;
143 if (l & IBCS2_ICRNL) r |= ICRNL;
144 if (l & IBCS2_IXON) r |= IXON;
145 if (l & IBCS2_IXANY) r |= IXANY;
146 if (l & IBCS2_IXOFF) r |= IXOFF;
147 if (l & IBCS2_IMAXBEL) r |= IMAXBEL;
150 l = st->c_oflag; r = 0;
151 if (l & IBCS2_OPOST) r |= OPOST;
152 if (l & IBCS2_ONLCR) r |= ONLCR;
153 if (l & IBCS2_TAB3) r |= OXTABS;
156 l = st->c_cflag; r = 0;
157 switch (l & IBCS2_CSIZE) {
158 case IBCS2_CS5: r |= CS5; break;
159 case IBCS2_CS6: r |= CS6; break;
160 case IBCS2_CS7: r |= CS7; break;
161 case IBCS2_CS8: r |= CS8; break;
163 if (l & IBCS2_CSTOPB) r |= CSTOPB;
164 if (l & IBCS2_CREAD) r |= CREAD;
165 if (l & IBCS2_PARENB) r |= PARENB;
166 if (l & IBCS2_PARODD) r |= PARODD;
167 if (l & IBCS2_HUPCL) r |= HUPCL;
168 if (l & IBCS2_CLOCAL) r |= CLOCAL;
171 bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f];
173 l = st->c_lflag; r = 0;
174 if (l & IBCS2_ISIG) r |= ISIG;
175 if (l & IBCS2_ICANON) r |= ICANON;
176 if (l & IBCS2_ECHO) r |= ECHO;
177 if (l & IBCS2_ECHOE) r |= ECHOE;
178 if (l & IBCS2_ECHOK) r |= ECHOK;
179 if (l & IBCS2_ECHONL) r |= ECHONL;
180 if (l & IBCS2_NOFLSH) r |= NOFLSH;
181 if (l & IBCS2_TOSTOP) r |= TOSTOP;
185 st->c_cc[IBCS2_VINTR] ? st->c_cc[IBCS2_VINTR] : _POSIX_VDISABLE;
187 st->c_cc[IBCS2_VQUIT] ? st->c_cc[IBCS2_VQUIT] : _POSIX_VDISABLE;
189 st->c_cc[IBCS2_VERASE] ? st->c_cc[IBCS2_VERASE] : _POSIX_VDISABLE;
191 st->c_cc[IBCS2_VKILL] ? st->c_cc[IBCS2_VKILL] : _POSIX_VDISABLE;
192 if (bt->c_lflag & ICANON) {
194 st->c_cc[IBCS2_VEOF] ? st->c_cc[IBCS2_VEOF] : _POSIX_VDISABLE;
196 st->c_cc[IBCS2_VEOL] ? st->c_cc[IBCS2_VEOL] : _POSIX_VDISABLE;
198 bt->c_cc[VMIN] = st->c_cc[IBCS2_VMIN];
199 bt->c_cc[VTIME] = st->c_cc[IBCS2_VTIME];
202 st->c_cc[IBCS2_VEOL2] ? st->c_cc[IBCS2_VEOL2] : _POSIX_VDISABLE;
205 st->c_cc[IBCS2_VSWTCH] ? st->c_cc[IBCS2_VSWTCH] : _POSIX_VDISABLE;
208 st->c_cc[IBCS2_VSTART] ? st->c_cc[IBCS2_VSTART] : _POSIX_VDISABLE;
210 st->c_cc[IBCS2_VSTOP] ? st->c_cc[IBCS2_VSTOP] : _POSIX_VDISABLE;
212 st->c_cc[IBCS2_VSUSP] ? st->c_cc[IBCS2_VSUSP] : _POSIX_VDISABLE;
213 bt->c_cc[VDSUSP] = _POSIX_VDISABLE;
214 bt->c_cc[VREPRINT] = _POSIX_VDISABLE;
215 bt->c_cc[VDISCARD] = _POSIX_VDISABLE;
216 bt->c_cc[VWERASE] = _POSIX_VDISABLE;
217 bt->c_cc[VLNEXT] = _POSIX_VDISABLE;
218 bt->c_cc[VSTATUS] = _POSIX_VDISABLE;
224 struct ibcs2_termios *st;
226 register u_long l, r;
228 l = bt->c_iflag; r = 0;
229 if (l & IGNBRK) r |= IBCS2_IGNBRK;
230 if (l & BRKINT) r |= IBCS2_BRKINT;
231 if (l & IGNPAR) r |= IBCS2_IGNPAR;
232 if (l & PARMRK) r |= IBCS2_PARMRK;
233 if (l & INPCK) r |= IBCS2_INPCK;
234 if (l & ISTRIP) r |= IBCS2_ISTRIP;
235 if (l & INLCR) r |= IBCS2_INLCR;
236 if (l & IGNCR) r |= IBCS2_IGNCR;
237 if (l & ICRNL) r |= IBCS2_ICRNL;
238 if (l & IXON) r |= IBCS2_IXON;
239 if (l & IXANY) r |= IBCS2_IXANY;
240 if (l & IXOFF) r |= IBCS2_IXOFF;
241 if (l & IMAXBEL) r |= IBCS2_IMAXBEL;
244 l = bt->c_oflag; r = 0;
245 if (l & OPOST) r |= IBCS2_OPOST;
246 if (l & ONLCR) r |= IBCS2_ONLCR;
247 if (l & OXTABS) r |= IBCS2_TAB3;
250 l = bt->c_cflag; r = 0;
252 case CS5: r |= IBCS2_CS5; break;
253 case CS6: r |= IBCS2_CS6; break;
254 case CS7: r |= IBCS2_CS7; break;
255 case CS8: r |= IBCS2_CS8; break;
257 if (l & CSTOPB) r |= IBCS2_CSTOPB;
258 if (l & CREAD) r |= IBCS2_CREAD;
259 if (l & PARENB) r |= IBCS2_PARENB;
260 if (l & PARODD) r |= IBCS2_PARODD;
261 if (l & HUPCL) r |= IBCS2_HUPCL;
262 if (l & CLOCAL) r |= IBCS2_CLOCAL;
265 l = bt->c_lflag; r = 0;
266 if (l & ISIG) r |= IBCS2_ISIG;
267 if (l & ICANON) r |= IBCS2_ICANON;
268 if (l & ECHO) r |= IBCS2_ECHO;
269 if (l & ECHOE) r |= IBCS2_ECHOE;
270 if (l & ECHOK) r |= IBCS2_ECHOK;
271 if (l & ECHONL) r |= IBCS2_ECHONL;
272 if (l & NOFLSH) r |= IBCS2_NOFLSH;
273 if (l & TOSTOP) r |= IBCS2_TOSTOP;
276 l = ttspeedtab(bt->c_ospeed, sptab);
280 st->c_cc[IBCS2_VINTR] =
281 bt->c_cc[VINTR] != _POSIX_VDISABLE ? bt->c_cc[VINTR] : 0;
282 st->c_cc[IBCS2_VQUIT] =
283 bt->c_cc[VQUIT] != _POSIX_VDISABLE ? bt->c_cc[VQUIT] : 0;
284 st->c_cc[IBCS2_VERASE] =
285 bt->c_cc[VERASE] != _POSIX_VDISABLE ? bt->c_cc[VERASE] : 0;
286 st->c_cc[IBCS2_VKILL] =
287 bt->c_cc[VKILL] != _POSIX_VDISABLE ? bt->c_cc[VKILL] : 0;
288 if (bt->c_lflag & ICANON) {
289 st->c_cc[IBCS2_VEOF] =
290 bt->c_cc[VEOF] != _POSIX_VDISABLE ? bt->c_cc[VEOF] : 0;
291 st->c_cc[IBCS2_VEOL] =
292 bt->c_cc[VEOL] != _POSIX_VDISABLE ? bt->c_cc[VEOL] : 0;
294 st->c_cc[IBCS2_VMIN] = bt->c_cc[VMIN];
295 st->c_cc[IBCS2_VTIME] = bt->c_cc[VTIME];
297 st->c_cc[IBCS2_VEOL2] =
298 bt->c_cc[VEOL2] != _POSIX_VDISABLE ? bt->c_cc[VEOL2] : 0;
299 st->c_cc[IBCS2_VSWTCH] =
301 st->c_cc[IBCS2_VSUSP] =
302 bt->c_cc[VSUSP] != _POSIX_VDISABLE ? bt->c_cc[VSUSP] : 0;
303 st->c_cc[IBCS2_VSTART] =
304 bt->c_cc[VSTART] != _POSIX_VDISABLE ? bt->c_cc[VSTART] : 0;
305 st->c_cc[IBCS2_VSTOP] =
306 bt->c_cc[VSTOP] != _POSIX_VDISABLE ? bt->c_cc[VSTOP] : 0;
313 struct ibcs2_termios *ts;
314 struct ibcs2_termio *t;
316 t->c_iflag = ts->c_iflag;
317 t->c_oflag = ts->c_oflag;
318 t->c_cflag = ts->c_cflag;
319 t->c_lflag = ts->c_lflag;
320 t->c_line = ts->c_line;
321 bcopy(ts->c_cc, t->c_cc, IBCS2_NCC);
326 struct ibcs2_termio *t;
327 struct ibcs2_termios *ts;
329 ts->c_iflag = t->c_iflag;
330 ts->c_oflag = t->c_oflag;
331 ts->c_cflag = t->c_cflag;
332 ts->c_lflag = t->c_lflag;
333 ts->c_line = t->c_line;
334 bcopy(t->c_cc, ts->c_cc, IBCS2_NCC);
338 ibcs2_ioctl(struct ibcs2_ioctl_args *uap)
340 struct proc *p = curproc;
341 struct filedesc *fdp = p->p_fd;
345 if (SCARG(uap, fd) < 0 || SCARG(uap, fd) >= fdp->fd_nfiles ||
346 (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL) {
347 DPRINTF(("ibcs2_ioctl(%d): bad fd %d ", p->p_pid,
352 if ((fp->f_flag & (FREAD|FWRITE)) == 0) {
353 DPRINTF(("ibcs2_ioctl(%d): bad fp flag ", p->p_pid));
357 switch (SCARG(uap, cmd)) {
363 struct ibcs2_termios sts;
364 struct ibcs2_termio st;
366 if ((error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
369 btios2stios (&bts, &sts);
370 if (SCARG(uap, cmd) == IBCS2_TCGETA) {
371 stios2stio (&sts, &st);
372 error = copyout((caddr_t)&st, SCARG(uap, data),
376 DPRINTF(("ibcs2_ioctl(%d): copyout failed ",
381 return copyout((caddr_t)&sts, SCARG(uap, data),
391 struct ibcs2_termios sts;
392 struct ibcs2_termio st;
394 if ((error = copyin(SCARG(uap, data), (caddr_t)&st,
396 DPRINTF(("ibcs2_ioctl(%d): TCSET copyin failed ",
401 /* get full BSD termios so we don't lose information */
402 if ((error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bts, p)) != 0) {
403 DPRINTF(("ibcs2_ioctl(%d): TCSET ctl failed fd %d ",
404 p->p_pid, SCARG(uap, fd)));
409 * convert to iBCS2 termios, copy in information from
410 * termio, and convert back, then set new values.
412 btios2stios(&bts, &sts);
413 stio2stios(&st, &sts);
414 stios2btios(&sts, &bts);
416 return fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_TCSETA + TIOCSETA,
425 struct ibcs2_termios sts;
427 if ((error = copyin(SCARG(uap, data), (caddr_t)&sts,
428 sizeof (sts))) != 0) {
431 stios2btios (&sts, &bts);
432 return fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_XCSETA + TIOCSETA,
441 struct ibcs2_termios sts;
443 if ((error = copyin(SCARG(uap, data), (caddr_t)&sts,
444 sizeof (sts))) != 0) {
447 stios2btios (&sts, &bts);
448 return fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_OXCSETA + TIOCSETA,
453 DPRINTF(("ibcs2_ioctl(%d): TCSBRK ", p->p_pid));
458 switch ((int)SCARG(uap, data)) {
461 DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid));
464 return fo_ioctl(fp, TIOCSTOP, (caddr_t)0, p);
466 return fo_ioctl(fp, TIOCSTART, (caddr_t)1, p);
476 switch ((int)SCARG(uap, data)) {
484 arg = FREAD | FWRITE;
489 return fo_ioctl(fp, TIOCFLUSH, (caddr_t)&arg, p);
492 case IBCS2_TIOCGWINSZ:
493 SCARG(uap, cmd) = TIOCGWINSZ;
494 return ioctl((struct ioctl_args *)uap);
496 case IBCS2_TIOCSWINSZ:
497 SCARG(uap, cmd) = TIOCSWINSZ;
498 return ioctl((struct ioctl_args *)uap);
500 case IBCS2_TIOCGPGRP:
501 return copyout((caddr_t)&p->p_pgrp->pg_id, SCARG(uap, data),
502 sizeof(p->p_pgrp->pg_id));
504 case IBCS2_TIOCSPGRP: /* XXX - is uap->data a pointer to pgid? */
506 struct setpgid_args sa;
509 SCARG(&sa, pgid) = (int)SCARG(uap, data);
510 if ((error = setpgid(&sa)) != 0)
515 case IBCS2_TCGETSC: /* SCO console - get scancode flags */
516 return EINTR; /* ENOSYS; */
518 case IBCS2_TCSETSC: /* SCO console - set scancode flags */
519 return 0; /* ENOSYS; */
521 case IBCS2_JWINSIZE: /* Unix to Jerq I/O control */
523 struct ibcs2_jwinsize {
528 ibcs2_jwinsize.bytex = 80;
529 /* p->p_session->s_ttyp->t_winsize.ws_col; XXX */
530 ibcs2_jwinsize.bytey = 25;
531 /* p->p_session->s_ttyp->t_winsize.ws_row; XXX */
532 ibcs2_jwinsize.bitx =
533 p->p_session->s_ttyp->t_winsize.ws_xpixel;
534 ibcs2_jwinsize.bity =
535 p->p_session->s_ttyp->t_winsize.ws_ypixel;
536 return copyout((caddr_t)&ibcs2_jwinsize, SCARG(uap, data),
537 sizeof(ibcs2_jwinsize));
540 /* keyboard and display ioctl's -- type 'K' */
541 case IBCS2_KDGKBMODE: /* get keyboard translation mode */
542 SCARG(uap, cmd) = KDGKBMODE;
543 /* printf("ioctl KDGKBMODE = %x\n", SCARG(uap, cmd));*/
544 return ioctl((struct ioctl_args *)uap);
546 case IBCS2_KDSKBMODE: /* set keyboard translation mode */
547 SCARG(uap, cmd) = KDSKBMODE;
548 return ioctl((struct ioctl_args *)uap);
550 case IBCS2_KDMKTONE: /* sound tone */
551 SCARG(uap, cmd) = KDMKTONE;
552 return ioctl((struct ioctl_args *)uap);
554 case IBCS2_KDGETMODE: /* get text/graphics mode */
555 SCARG(uap, cmd) = KDGETMODE;
556 return ioctl((struct ioctl_args *)uap);
558 case IBCS2_KDSETMODE: /* set text/graphics mode */
559 SCARG(uap, cmd) = KDSETMODE;
560 return ioctl((struct ioctl_args *)uap);
562 case IBCS2_KDSBORDER: /* set ega color border */
563 SCARG(uap, cmd) = KDSBORDER;
564 return ioctl((struct ioctl_args *)uap);
566 case IBCS2_KDGKBSTATE:
567 SCARG(uap, cmd) = KDGKBSTATE;
568 return ioctl((struct ioctl_args *)uap);
571 SCARG(uap, cmd) = KDSETRAD;
572 return ioctl((struct ioctl_args *)uap);
574 case IBCS2_KDENABIO: /* enable direct I/O to ports */
575 SCARG(uap, cmd) = KDENABIO;
576 return ioctl((struct ioctl_args *)uap);
578 case IBCS2_KDDISABIO: /* disable direct I/O to ports */
579 SCARG(uap, cmd) = KDDISABIO;
580 return ioctl((struct ioctl_args *)uap);
582 case IBCS2_KIOCSOUND: /* start sound generation */
583 SCARG(uap, cmd) = KIOCSOUND;
584 return ioctl((struct ioctl_args *)uap);
586 case IBCS2_KDGKBTYPE: /* get keyboard type */
587 SCARG(uap, cmd) = KDGKBTYPE;
588 return ioctl((struct ioctl_args *)uap);
590 case IBCS2_KDGETLED: /* get keyboard LED status */
591 SCARG(uap, cmd) = KDGETLED;
592 return ioctl((struct ioctl_args *)uap);
594 case IBCS2_KDSETLED: /* set keyboard LED status */
595 SCARG(uap, cmd) = KDSETLED;
596 return ioctl((struct ioctl_args *)uap);
598 /* Xenix keyboard and display ioctl's from sys/kd.h -- type 'k' */
599 case IBCS2_GETFKEY: /* Get function key */
600 SCARG(uap, cmd) = GETFKEY;
601 return ioctl((struct ioctl_args *)uap);
603 case IBCS2_SETFKEY: /* Set function key */
604 SCARG(uap, cmd) = SETFKEY;
605 return ioctl((struct ioctl_args *)uap);
607 case IBCS2_GIO_SCRNMAP: /* Get screen output map table */
608 SCARG(uap, cmd) = GIO_SCRNMAP;
609 return ioctl((struct ioctl_args *)uap);
611 case IBCS2_PIO_SCRNMAP: /* Set screen output map table */
612 SCARG(uap, cmd) = PIO_SCRNMAP;
613 return ioctl((struct ioctl_args *)uap);
615 case IBCS2_GIO_KEYMAP: /* Get keyboard map table */
616 SCARG(uap, cmd) = GIO_KEYMAP;
617 return ioctl((struct ioctl_args *)uap);
619 case IBCS2_PIO_KEYMAP: /* Set keyboard map table */
620 SCARG(uap, cmd) = PIO_KEYMAP;
621 return ioctl((struct ioctl_args *)uap);
624 case IBCS2_SIOCSOCKSYS:
625 return ibcs2_socksys((struct ibcs2_socksys_args *)uap);
627 case IBCS2_I_NREAD: /* STREAMS */
628 SCARG(uap, cmd) = FIONREAD;
629 return ioctl((struct ioctl_args *)uap);
632 DPRINTF(("ibcs2_ioctl(%d): unknown cmd 0x%lx ",
633 p->p_pid, SCARG(uap, cmd)));