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 *

--- 11 unchanged lines hidden (view full) ---

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 86468 2001-11-16 20:32:32Z iedowse $
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>

--- 12 unchanged lines hidden (view full) ---

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 *));
57
58
59int
60ibcs2_gtty(struct thread *td, struct ibcs2_gtty_args *args)
61{
62 struct ioctl_args ioctl_arg;
63
64 ioctl_arg.fd = args->fd;

--- 271 unchanged lines hidden (view full) ---

336}
337
338int
339ibcs2_ioctl(td, uap)
340 struct thread *td;
341 struct ibcs2_ioctl_args *uap;
342{
343 struct proc *p = td->td_proc;
344 struct filedesc *fdp = p->p_fd;
345 struct file *fp;
346 int error;
347
348 if (SCARG(uap, fd) < 0 || SCARG(uap, fd) >= fdp->fd_nfiles ||
349 (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL) {
350 DPRINTF(("ibcs2_ioctl(%d): bad fd %d ", p->p_pid,
351 SCARG(uap, fd)));
352 return EBADF;
353 }
354
355 if ((fp->f_flag & (FREAD|FWRITE)) == 0) {
356 DPRINTF(("ibcs2_ioctl(%d): bad fp flag ", p->p_pid));
357 return EBADF;
358 }
359
360 switch (SCARG(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, td)) != 0)
370 return error;
371
372 btios2stios (&bts, &sts);
373 if (SCARG(uap, cmd) == IBCS2_TCGETA) {
374 stios2stio (&sts, &st);
375 error = copyout((caddr_t)&st, SCARG(uap, data),
376 sizeof (st));
377#ifdef DEBUG_IBCS2
378 if (error)
379 DPRINTF(("ibcs2_ioctl(%d): copyout failed ",
380 p->p_pid));
381#endif
382 return error;
383 } else
384 return copyout((caddr_t)&sts, SCARG(uap, data),
385 sizeof (sts));
386 /*NOTREACHED*/
387 }
388
389 case IBCS2_TCSETA:
390 case IBCS2_TCSETAW:
391 case IBCS2_TCSETAF:
392 {
393 struct termios bts;
394 struct ibcs2_termios sts;
395 struct ibcs2_termio st;
396
397 if ((error = copyin(SCARG(uap, data), (caddr_t)&st,
398 sizeof(st))) != 0) {
399 DPRINTF(("ibcs2_ioctl(%d): TCSET copyin failed ",
400 p->p_pid));
401 return error;
402 }
403
404 /* get full BSD termios so we don't lose information */
405 if ((error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bts, td)) != 0) {
406 DPRINTF(("ibcs2_ioctl(%d): TCSET ctl failed fd %d ",
407 p->p_pid, SCARG(uap, fd)));
408 return error;
409 }
410
411 /*
412 * convert to iBCS2 termios, copy in information from
413 * termio, and convert back, then set new values.
414 */
415 btios2stios(&bts, &sts);
416 stio2stios(&st, &sts);
417 stios2btios(&sts, &bts);
418
419 return fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_TCSETA + TIOCSETA,
420 (caddr_t)&bts, td);
421 }
422
423 case IBCS2_XCSETA:
424 case IBCS2_XCSETAW:
425 case IBCS2_XCSETAF:
426 {
427 struct termios bts;
428 struct ibcs2_termios sts;
429
430 if ((error = copyin(SCARG(uap, data), (caddr_t)&sts,
431 sizeof (sts))) != 0) {
432 return error;
433 }
434 stios2btios (&sts, &bts);
435 return fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_XCSETA + TIOCSETA,
436 (caddr_t)&bts, td);
437 }
438
439 case IBCS2_OXCSETA:
440 case IBCS2_OXCSETAW:
441 case IBCS2_OXCSETAF:
442 {
443 struct termios bts;
444 struct ibcs2_termios sts;
445
446 if ((error = copyin(SCARG(uap, data), (caddr_t)&sts,
447 sizeof (sts))) != 0) {
448 return error;
449 }
450 stios2btios (&sts, &bts);
451 return fo_ioctl(fp, SCARG(uap, cmd) - IBCS2_OXCSETA + TIOCSETA,
452 (caddr_t)&bts, td);
453 }
454
455 case IBCS2_TCSBRK:
456 DPRINTF(("ibcs2_ioctl(%d): TCSBRK ", p->p_pid));
457 return ENOSYS;
458
459 case IBCS2_TCXONC:
460 {
461 switch ((int)SCARG(uap, data)) {
462 case 0:
463 case 1:
464 DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid));
465 return ENOSYS;
466 case 2:
467 return fo_ioctl(fp, TIOCSTOP, (caddr_t)0, td);
468 case 3:
469 return fo_ioctl(fp, TIOCSTART, (caddr_t)1, td);
470 default:
471 return EINVAL;
472 }
473 }
474
475 case IBCS2_TCFLSH:
476 {
477 int arg;
478
479 switch ((int)SCARG(uap, data)) {
480 case 0:
481 arg = FREAD;
482 break;
483 case 1:
484 arg = FWRITE;
485 break;
486 case 2:
487 arg = FREAD | FWRITE;
488 break;
489 default:
490 return EINVAL;
491 }
492 return fo_ioctl(fp, TIOCFLUSH, (caddr_t)&arg, td);
493 }
494
495 case IBCS2_TIOCGWINSZ:
496 SCARG(uap, cmd) = TIOCGWINSZ;
497 return ioctl(td, (struct ioctl_args *)uap);
498
499 case IBCS2_TIOCSWINSZ:
500 SCARG(uap, cmd) = TIOCSWINSZ;
501 return ioctl(td, (struct ioctl_args *)uap);
502
503 case IBCS2_TIOCGPGRP:
504 PROC_LOCK(p);
505 error = copyout((caddr_t)&p->p_pgrp->pg_id, SCARG(uap, data),
506 sizeof(p->p_pgrp->pg_id));
507 PROC_UNLOCK(p);
508 return error;
509
510 case IBCS2_TIOCSPGRP: /* XXX - is uap->data a pointer to pgid? */
511 {
512 struct setpgid_args sa;
513
514 SCARG(&sa, pid) = 0;
515 SCARG(&sa, pgid) = (int)SCARG(uap, data);
516 if ((error = setpgid(td, &sa)) != 0)
517 return error;
518 return 0;
519 }
520
521 case IBCS2_TCGETSC: /* SCO console - get scancode flags */
522 return EINTR; /* ENOSYS; */
523
524 case IBCS2_TCSETSC: /* SCO console - set scancode flags */
525 return 0; /* ENOSYS; */
526
527 case IBCS2_JWINSIZE: /* Unix to Jerq I/O control */
528 {
529 struct ibcs2_jwinsize {
530 char bytex, bytey;
531 short bitx, bity;
532 } ibcs2_jwinsize;
533
534 PROC_LOCK(p);
535 ibcs2_jwinsize.bytex = 80;
536 /* p->p_session->s_ttyp->t_winsize.ws_col; XXX */
537 ibcs2_jwinsize.bytey = 25;
538 /* p->p_session->s_ttyp->t_winsize.ws_row; XXX */
539 ibcs2_jwinsize.bitx =
540 p->p_session->s_ttyp->t_winsize.ws_xpixel;
541 ibcs2_jwinsize.bity =
542 p->p_session->s_ttyp->t_winsize.ws_ypixel;
543 PROC_UNLOCK(p);
544 return copyout((caddr_t)&ibcs2_jwinsize, SCARG(uap, data),
545 sizeof(ibcs2_jwinsize));
546 }
547
548 /* keyboard and display ioctl's -- type 'K' */
549 case IBCS2_KDGKBMODE: /* get keyboard translation mode */
550 SCARG(uap, cmd) = KDGKBMODE;
551/* printf("ioctl KDGKBMODE = %x\n", SCARG(uap, cmd));*/
552 return ioctl(td, (struct ioctl_args *)uap);
553
554 case IBCS2_KDSKBMODE: /* set keyboard translation mode */
555 SCARG(uap, cmd) = KDSKBMODE;
556 return ioctl(td, (struct ioctl_args *)uap);
557
558 case IBCS2_KDMKTONE: /* sound tone */
559 SCARG(uap, cmd) = KDMKTONE;
560 return ioctl(td, (struct ioctl_args *)uap);
561
562 case IBCS2_KDGETMODE: /* get text/graphics mode */
563 SCARG(uap, cmd) = KDGETMODE;
564 return ioctl(td, (struct ioctl_args *)uap);
565
566 case IBCS2_KDSETMODE: /* set text/graphics mode */
567 SCARG(uap, cmd) = KDSETMODE;
568 return ioctl(td, (struct ioctl_args *)uap);
569
570 case IBCS2_KDSBORDER: /* set ega color border */
571 SCARG(uap, cmd) = KDSBORDER;
572 return ioctl(td, (struct ioctl_args *)uap);
573
574 case IBCS2_KDGKBSTATE:
575 SCARG(uap, cmd) = KDGKBSTATE;
576 return ioctl(td, (struct ioctl_args *)uap);
577
578 case IBCS2_KDSETRAD:
579 SCARG(uap, cmd) = KDSETRAD;
580 return ioctl(td, (struct ioctl_args *)uap);
581
582 case IBCS2_KDENABIO: /* enable direct I/O to ports */
583 SCARG(uap, cmd) = KDENABIO;
584 return ioctl(td, (struct ioctl_args *)uap);
585
586 case IBCS2_KDDISABIO: /* disable direct I/O to ports */
587 SCARG(uap, cmd) = KDDISABIO;
588 return ioctl(td, (struct ioctl_args *)uap);
589
590 case IBCS2_KIOCSOUND: /* start sound generation */
591 SCARG(uap, cmd) = KIOCSOUND;
592 return ioctl(td, (struct ioctl_args *)uap);
593
594 case IBCS2_KDGKBTYPE: /* get keyboard type */
595 SCARG(uap, cmd) = KDGKBTYPE;
596 return ioctl(td, (struct ioctl_args *)uap);
597
598 case IBCS2_KDGETLED: /* get keyboard LED status */
599 SCARG(uap, cmd) = KDGETLED;
600 return ioctl(td, (struct ioctl_args *)uap);
601
602 case IBCS2_KDSETLED: /* set keyboard LED status */
603 SCARG(uap, cmd) = KDSETLED;
604 return ioctl(td, (struct ioctl_args *)uap);
605
606 /* Xenix keyboard and display ioctl's from sys/kd.h -- type 'k' */
607 case IBCS2_GETFKEY: /* Get function key */
608 SCARG(uap, cmd) = GETFKEY;
609 return ioctl(td, (struct ioctl_args *)uap);
610
611 case IBCS2_SETFKEY: /* Set function key */
612 SCARG(uap, cmd) = SETFKEY;
613 return ioctl(td, (struct ioctl_args *)uap);
614
615 case IBCS2_GIO_SCRNMAP: /* Get screen output map table */
616 SCARG(uap, cmd) = GIO_SCRNMAP;
617 return ioctl(td, (struct ioctl_args *)uap);
618
619 case IBCS2_PIO_SCRNMAP: /* Set screen output map table */
620 SCARG(uap, cmd) = PIO_SCRNMAP;
621 return ioctl(td, (struct ioctl_args *)uap);
622
623 case IBCS2_GIO_KEYMAP: /* Get keyboard map table */
624 SCARG(uap, cmd) = GIO_KEYMAP;
625 return ioctl(td, (struct ioctl_args *)uap);
626
627 case IBCS2_PIO_KEYMAP: /* Set keyboard map table */
628 SCARG(uap, cmd) = PIO_KEYMAP;
629 return ioctl(td, (struct ioctl_args *)uap);
630
631 /* socksys */
632 case IBCS2_SIOCSOCKSYS:
633 return ibcs2_socksys(td, (struct ibcs2_socksys_args *)uap);
634
635 case IBCS2_FIONREAD:
636 case IBCS2_I_NREAD: /* STREAMS */
637 SCARG(uap, cmd) = FIONREAD;
638 return ioctl(td, (struct ioctl_args *)uap);
639
640 default:
641 DPRINTF(("ibcs2_ioctl(%d): unknown cmd 0x%lx ",
642 td->proc->p_pid, SCARG(uap, cmd)));
643 return ENOSYS;
644 }
645 return ENOSYS;
646}