示例#1
0
文件: tty.c 项目: cya410/libraries
/*
 * 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;
}
示例#2
0
文件: tty.c 项目: AndrewD/prex
/*
 * 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;
}