Hi, > n_tty_set_room() in drivers/tty/n_tty.c (3.10 mainline)
> From n_tty_set_room(): > /* > * If we are doing input canonicalization, and there are no > * pending newlines, let characters through without limit, so > * that erase characters will be handled. Other excess > * characters will be beeped. > */ > if (left <= 0) > left = ldata->icanon && !ldata->canon_data; > old_left = tty->receive_room; > tty->receive_room = left; I took a long look at this code and thought about how it could be made to work for readline's case and also for the canonical readers. I came up with this simple patch: diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 4bf0fc0..2ba7f4e 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c @@ -149,7 +149,8 @@ static int set_room(struct tty_struct *tty) * characters will be beeped. */ if (left <= 0) - left = ldata->icanon && !ldata->canon_data; + if (waitqueue_active(&tty->read_wait)) + left = ldata->icanon && !ldata->canon_data; old_left = tty->receive_room; tty->receive_room = left; This is of course just an idea, but I tested this and it worked correctly for the cases I was testing. The effect of this patch is that when there is a canonical reader waiting for input, it maintains the previous behavior, but when there's no reader (like when readline is changing modes), it blocks and doesn't lose any characters. Another approach would be to recalculate the size of canon_data when the mode is changed, but this would probably be much more invasive, and awfully less efficient since it would imply going through the buffer. What do you think? Is the proposed solution, or something along those lines, acceptable? If there are other cases that need to be taken into account and that I currently don't know about, please let me know. -- "If you think your users are idiots, only idiots will use it." -- Linus Torvalds Saludos /\/\ /\ >< `/
signature.asc
Description: Digital signature