Date: Mon, 4 Aug 2008 14:32:10 GMT From: Ed Schouten <ed@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 146624 for review Message-ID: <200808041432.m74EWAwu062098@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=146624 Change 146624 by ed@ed_flippo on 2008/08/04 14:31:46 The POSIX onlinepubs stated: Any subsequent read from the terminal device shall return the value of zero, indicating end-of-file; see read(). The current TTY code already did this, but only after the read() was started after switching to the zombie state. Move the zombie state handling just before going to sleep. Affected files ... .. //depot/projects/mpsafetty/sys/kern/tty_ttydisc.c#6 edit Differences ... ==== //depot/projects/mpsafetty/sys/kern/tty_ttydisc.c#6 (text+ko) ==== @@ -146,6 +146,8 @@ if (clen == 0) { if (ioflag & IO_NDELAY) return (EWOULDBLOCK); + else if (tp->t_flags & TF_ZOMBIE) + return (0); error = tty_wait(tp, &tp->t_inwait); if (error) @@ -195,6 +197,9 @@ /* We have to wait for more */ if (ioflag & IO_NDELAY) return (EWOULDBLOCK); + else if (tp->t_flags & TF_ZOMBIE) + return (0); + error = tty_wait(tp, &tp->t_inwait); if (error) return (error); @@ -202,7 +207,8 @@ } static int -ttydisc_read_raw_read_timer(struct tty *tp, struct uio *uio, int ioflag, int oresid) +ttydisc_read_raw_read_timer(struct tty *tp, struct uio *uio, int ioflag, + int oresid) { size_t vmin = MAX(tp->t_termios.c_cc[VMIN], 1); unsigned int vtime = tp->t_termios.c_cc[VTIME]; @@ -239,12 +245,12 @@ */ if (ioflag & IO_NDELAY) return (EWOULDBLOCK); + else if (tp->t_flags & TF_ZOMBIE) + return (0); + error = tty_timedwait(tp, &tp->t_inwait, hz); - if (error == EWOULDBLOCK) { - return (0); - } else if (error) { + if (error) return (error); - } } return (0); @@ -284,6 +290,9 @@ /* We have to wait for more */ if (ioflag & IO_NDELAY) return (EWOULDBLOCK); + else if (tp->t_flags & TF_ZOMBIE) + return (0); + error = tty_wait(tp, &tp->t_inwait); if (error) return (error); @@ -300,7 +309,7 @@ tty_lock_assert(tp, MA_OWNED); - if (uio->uio_resid == 0 || tp->t_flags & TF_ZOMBIE) + if (uio->uio_resid == 0) return (0); if (CMP_FLAG(l, ICANON)) @@ -308,7 +317,8 @@ else if (tp->t_termios.c_cc[VTIME] == 0) error = ttydisc_read_raw_no_timer(tp, uio, ioflag); else if (tp->t_termios.c_cc[VMIN] == 0) - error = ttydisc_read_raw_read_timer(tp, uio, ioflag, uio->uio_resid); + error = ttydisc_read_raw_read_timer(tp, uio, ioflag, + uio->uio_resid); else error = ttydisc_read_raw_interbyte_timer(tp, uio, ioflag);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808041432.m74EWAwu062098>