Skip site navigation (1)Skip section navigation (2)
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>