Ejemplo n.º 1
0
static inline int input_available_p(struct tty_struct *tty, int amt)
{
	tty_flush_to_ldisc(tty);
	if (tty->icanon && !L_EXTPROC(tty)) {
		if (tty->canon_data)
			return 1;
	} else if (tty->read_cnt >= (amt ? amt : 1))
		return 1;

	return 0;
}
Ejemplo n.º 2
0
static void pty_close(struct tty_struct *tty, struct file *filp)
{
    BUG_ON(!tty);
    if (tty->driver->subtype == PTY_TYPE_MASTER)
        WARN_ON(tty->count > 1);
    else {
        if (test_bit(TTY_IO_ERROR, &tty->flags))
            return;
        if (tty->count > 2)
            return;
    }
    set_bit(TTY_IO_ERROR, &tty->flags);
    wake_up_interruptible(&tty->read_wait);
    wake_up_interruptible(&tty->write_wait);
    spin_lock_irq(&tty->ctrl_lock);
    tty->packet = 0;
    spin_unlock_irq(&tty->ctrl_lock);
    /* Review - krefs on tty_link ?? */
    if (!tty->link)
        return;
    tty_flush_to_ldisc(tty->link);
    set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
    wake_up_interruptible(&tty->link->read_wait);
    wake_up_interruptible(&tty->link->write_wait);
    if (tty->driver->subtype == PTY_TYPE_MASTER) {
        set_bit(TTY_OTHER_CLOSED, &tty->flags);
#ifdef CONFIG_UNIX98_PTYS
        if (tty->driver == ptm_driver) {
            mutex_lock(&devpts_mutex);
            if (tty->link->driver_data)
                devpts_pty_kill(tty->link->driver_data);
            mutex_unlock(&devpts_mutex);
        }
#endif
        tty_vhangup(tty->link);
    }
}