|
@@ -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))
|
|
if (I_IUCLC(tty) && L_IEXTEN(tty))
|
|
c = tolower(c);
|
|
c = tolower(c);
|
|
|
|
|
|
|
|
+ if (L_EXTPROC(tty)) {
|
|
|
|
+ put_tty_queue(c, tty);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
|
|
if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
|
|
I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
|
|
I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
|
|
c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_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);
|
|
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);
|
|
kill_fasync(&tty->fasync, SIGIO, POLL_IN);
|
|
if (waitqueue_active(&tty->read_wait))
|
|
if (waitqueue_active(&tty->read_wait))
|
|
wake_up_interruptible(&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)
|
|
static inline int input_available_p(struct tty_struct *tty, int amt)
|
|
{
|
|
{
|
|
tty_flush_to_ldisc(tty);
|
|
tty_flush_to_ldisc(tty);
|
|
- if (tty->icanon) {
|
|
|
|
|
|
+ if (tty->icanon && !L_EXTPROC(tty)) {
|
|
if (tty->canon_data)
|
|
if (tty->canon_data)
|
|
return 1;
|
|
return 1;
|
|
} else if (tty->read_cnt >= (amt ? amt : 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);
|
|
spin_lock_irqsave(&tty->read_lock, flags);
|
|
tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
|
|
tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
|
|
tty->read_cnt -= n;
|
|
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);
|
|
spin_unlock_irqrestore(&tty->read_lock, flags);
|
|
*b += n;
|
|
*b += n;
|
|
*nr -= n;
|
|
*nr -= n;
|
|
@@ -1812,7 +1823,7 @@ do_it_again:
|
|
nr--;
|
|
nr--;
|
|
}
|
|
}
|
|
|
|
|
|
- if (tty->icanon) {
|
|
|
|
|
|
+ if (tty->icanon && !L_EXTPROC(tty)) {
|
|
/* N.B. avoid overrun if nr == 0 */
|
|
/* N.B. avoid overrun if nr == 0 */
|
|
while (nr && tty->read_cnt) {
|
|
while (nr && tty->read_cnt) {
|
|
int eol;
|
|
int eol;
|