/* * Ioctls for all tty devices. */ int tty_ioctl(struct tty *tp, u_long cmd, void *data) { struct tty_queue *qp; switch (cmd) { case TCGETS: if (copyout(&tp->t_termios, data, sizeof(struct termios))) return -EFAULT; break; case TCSETSW: case TCSETSF: tty_wait(tp); if (cmd == TCSETSF) tty_flush(tp, FREAD); /* FALLTHROUGH */ case TCSETS: if (copyin(data, &tp->t_termios, sizeof(struct termios))) return -EFAULT; break; case TIOCSPGRP: /* set pgrp of tty */ if (copyin(data, &tp->t_pgid, sizeof(pid_t))) return -EFAULT; break; case TIOCGPGRP: if (copyout(&tp->t_pgid, data, sizeof(pid_t))) return -EFAULT; break; #ifdef TIOCFLUSH case TIOCFLUSH: { int flags; if (copyin(data, &flags, sizeof(flags))) return -EFAULT; if (flags == 0) flags = FREAD | FWRITE; else flags &= FREAD | FWRITE; tty_flush(tp, flags); break; } #endif #ifdef TIOCSTART case TIOCSTART: if (tp->t_state & TS_TTSTOP) { tp->t_state &= ~TS_TTSTOP; tty_start(tp); } break; #endif #ifdef TIOCSTOP case TIOCSTOP: if (!(tp->t_state & TS_TTSTOP)) { tp->t_state |= TS_TTSTOP; } break; #endif case TIOCGWINSZ: if (copyout(&tp->t_winsize, data, sizeof(struct winsize))) return -EFAULT; break; case TIOCSWINSZ: if (copyin(data, &tp->t_winsize, sizeof(struct winsize))) return -EFAULT; break; #ifdef TIOCSETSIGT case TIOCSETSIGT: /* Prex */ if (copyin(data, &tp->t_pid, sizeof(pid_t))) return -EFAULT; break; #endif case TIOCINQ: qp = (tp->t_lflag & ICANON) ? &tp->t_canq : &tp->t_rawq; if (copyout(&qp->tq_count, data, sizeof(int))) return -EFAULT; break; case TIOCOUTQ: if (copyout(&tp->t_outq.tq_count, data, sizeof(int))) return -EFAULT; break; } return 0; }
/* * Ioctls for all tty devices. */ static int tty_ioctl(file_t file, u_long cmd, void *data) { struct tty *tp = file->priv; int flags; struct tty_queue *qp; switch (cmd) { case TIOCGETA: if (umem_copyout(&tp->t_termios, data, sizeof(struct termios))) return EFAULT; break; case TIOCSETAW: case TIOCSETAF: tty_wait(tp); if (cmd == TIOCSETAF) tty_flush(tp, FREAD); /* FALLTHROUGH */ case TIOCSETA: if (umem_copyin(data, &tp->t_termios, sizeof(struct termios))) return EFAULT; break; case TIOCSPGRP: /* set pgrp of tty */ if (umem_copyin(data, &tp->t_pgid, sizeof(pid_t))) return EFAULT; break; case TIOCGPGRP: if (umem_copyout(&tp->t_pgid, data, sizeof(pid_t))) return EFAULT; break; case TIOCFLUSH: if (umem_copyin(data, &flags, sizeof(flags))) return EFAULT; break; if (flags == 0) flags = FREAD | FWRITE; else flags &= FREAD | FWRITE; tty_flush(tp, flags); break; case TIOCSTART: if (tp->t_state & TS_TTSTOP) { tp->t_state &= ~TS_TTSTOP; tty_start(tp); } break; case TIOCSTOP: if (!(tp->t_state & TS_TTSTOP)) { tp->t_state |= TS_TTSTOP; } break; case TIOCGWINSZ: if (umem_copyout(&tp->t_winsize, data, sizeof(struct winsize))) return EFAULT; break; case TIOCSWINSZ: if (umem_copyin(&tp->t_winsize, data, sizeof(struct winsize))) return EFAULT; break; case TIOCSETSIGT: if (umem_copyin(data, &sig_task, sizeof(task_t))) return EFAULT; break; case TIOCINQ: qp = (tp->t_lflag & ICANON) ? &tp->t_canq : &tp->t_rawq; if (umem_copyout(&qp->tq_count, data, sizeof(int))) return EFAULT; break; case TIOCOUTQ: if (umem_copyout(&tp->t_outq.tq_count, data, sizeof(int))) return EFAULT; break; } return 0; }