]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - drivers/char/n_tty.c
tty: Add EXTPROC support for LINEMODE
[mirror_ubuntu-zesty-kernel.git] / drivers / char / n_tty.c
index bdae8327143c3400497829c6080817535af52eb2..428f4fe0b5f745f81ee0e076b2e20d3717115b99 100644 (file)
@@ -1102,6 +1102,11 @@ static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
        if (I_IUCLC(tty) && L_IEXTEN(tty))
                c = tolower(c);
 
+       if (L_EXTPROC(tty)) {
+               put_tty_queue(c, tty);
+               return;
+       }
+
        if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
            I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
            c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
@@ -1409,7 +1414,8 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
 
        n_tty_set_room(tty);
 
-       if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) {
+       if ((!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) ||
+               L_EXTPROC(tty)) {
                kill_fasync(&tty->fasync, SIGIO, POLL_IN);
                if (waitqueue_active(&tty->read_wait))
                        wake_up_interruptible(&tty->read_wait);
@@ -1585,7 +1591,7 @@ static int n_tty_open(struct tty_struct *tty)
 static inline int input_available_p(struct tty_struct *tty, int amt)
 {
        tty_flush_to_ldisc(tty);
-       if (tty->icanon) {
+       if (tty->icanon && !L_EXTPROC(tty)) {
                if (tty->canon_data)
                        return 1;
        } else if (tty->read_cnt >= (amt ? amt : 1))
@@ -1632,6 +1638,11 @@ static int copy_from_read_buf(struct tty_struct *tty,
                spin_lock_irqsave(&tty->read_lock, flags);
                tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
                tty->read_cnt -= n;
+               /* Turn single EOF into zero-length read */
+               if (L_EXTPROC(tty) && tty->icanon && n == 1) {
+                       if (!tty->read_cnt && (*b)[n-1] == EOF_CHAR(tty))
+                               n--;
+               }
                spin_unlock_irqrestore(&tty->read_lock, flags);
                *b += n;
                *nr -= n;
@@ -1812,7 +1823,7 @@ do_it_again:
                        nr--;
                }
 
-               if (tty->icanon) {
+               if (tty->icanon && !L_EXTPROC(tty)) {
                        /* N.B. avoid overrun if nr == 0 */
                        while (nr && tty->read_cnt) {
                                int eol;