Author: ed
Date: Sun Aug  2 14:25:26 2009
New Revision: 196036
URL: http://svn.freebsd.org/changeset/base/196036

Log:
  Fix two bugs related to TTY input:
  
  - fix write() on pseudo-terminal masters to return the amount of bytes
    passed to the TTY, not the amount of bytes read from user.
  
  - fix ttydisc_rint_bypass() to set the high watermark when it cannot
    write all input, just like ttydisc_rint() itself.
  
  Approved by:  re (kib)

Modified:
  head/sys/kern/tty_pts.c
  head/sys/kern/tty_ttydisc.c

Modified: head/sys/kern/tty_pts.c
==============================================================================
--- head/sys/kern/tty_pts.c     Sun Aug  2 13:37:00 2009        (r196035)
+++ head/sys/kern/tty_pts.c     Sun Aug  2 14:25:26 2009        (r196036)
@@ -204,8 +204,10 @@ ptsdev_write(struct file *fp, struct uio
                error = uiomove(ib, iblen, uio);
 
                tty_lock(tp);
-               if (error != 0)
+               if (error != 0) {
+                       iblen = 0;
                        goto done;
+               }
 
                /*
                 * When possible, avoid the slow path. rint_bypass()
@@ -260,6 +262,12 @@ ptsdev_write(struct file *fp, struct uio
 
 done:  ttydisc_rint_done(tp);
        tty_unlock(tp);
+
+       /*
+        * Don't account for the part of the buffer that we couldn't
+        * pass to the TTY.
+        */
+       uio->uio_resid += iblen;
        return (error);
 }
 

Modified: head/sys/kern/tty_ttydisc.c
==============================================================================
--- head/sys/kern/tty_ttydisc.c Sun Aug  2 13:37:00 2009        (r196035)
+++ head/sys/kern/tty_ttydisc.c Sun Aug  2 14:25:26 2009        (r196036)
@@ -1060,6 +1060,8 @@ ttydisc_rint_bypass(struct tty *tp, cons
 
        ret = ttyinq_write(&tp->t_inq, buf, len, 0);
        ttyinq_canonicalize(&tp->t_inq);
+       if (ret < len)
+               tty_hiwat_in_block(tp);
 
        return (ret);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to