Fix faulty error code handling in read(2) on TTYs.
When performing a non-blocking read(2), on a TTY while no data is available, we should return EAGAIN. But if there's a modem disconnect, we should return 0. Right now we only return 0 when doing a blocking read, which is wrong. MFC after: 1 month
This commit is contained in:
parent
6b67444bac
commit
6b1b791da6
@ -149,10 +149,10 @@ ttydisc_read_canonical(struct tty *tp, struct uio *uio, int ioflag)
|
||||
|
||||
/* No more data. */
|
||||
if (clen == 0) {
|
||||
if (ioflag & IO_NDELAY)
|
||||
return (EWOULDBLOCK);
|
||||
else if (tp->t_flags & TF_ZOMBIE)
|
||||
if (tp->t_flags & TF_ZOMBIE)
|
||||
return (0);
|
||||
else if (ioflag & IO_NDELAY)
|
||||
return (EWOULDBLOCK);
|
||||
|
||||
error = tty_wait(tp, &tp->t_inwait);
|
||||
if (error)
|
||||
@ -200,10 +200,10 @@ ttydisc_read_raw_no_timer(struct tty *tp, struct uio *uio, int ioflag)
|
||||
return (0);
|
||||
|
||||
/* We have to wait for more. */
|
||||
if (ioflag & IO_NDELAY)
|
||||
return (EWOULDBLOCK);
|
||||
else if (tp->t_flags & TF_ZOMBIE)
|
||||
if (tp->t_flags & TF_ZOMBIE)
|
||||
return (0);
|
||||
else if (ioflag & IO_NDELAY)
|
||||
return (EWOULDBLOCK);
|
||||
|
||||
error = tty_wait(tp, &tp->t_inwait);
|
||||
if (error)
|
||||
@ -248,10 +248,10 @@ ttydisc_read_raw_read_timer(struct tty *tp, struct uio *uio, int ioflag,
|
||||
* We have to wait for more. If the timer expires, we
|
||||
* should return a 0-byte read.
|
||||
*/
|
||||
if (ioflag & IO_NDELAY)
|
||||
return (EWOULDBLOCK);
|
||||
else if (tp->t_flags & TF_ZOMBIE)
|
||||
if (tp->t_flags & TF_ZOMBIE)
|
||||
return (0);
|
||||
else if (ioflag & IO_NDELAY)
|
||||
return (EWOULDBLOCK);
|
||||
|
||||
error = tty_timedwait(tp, &tp->t_inwait, hz);
|
||||
if (error)
|
||||
@ -293,10 +293,10 @@ ttydisc_read_raw_interbyte_timer(struct tty *tp, struct uio *uio, int ioflag)
|
||||
break;
|
||||
|
||||
/* We have to wait for more. */
|
||||
if (ioflag & IO_NDELAY)
|
||||
return (EWOULDBLOCK);
|
||||
else if (tp->t_flags & TF_ZOMBIE)
|
||||
if (tp->t_flags & TF_ZOMBIE)
|
||||
return (0);
|
||||
else if (ioflag & IO_NDELAY)
|
||||
return (EWOULDBLOCK);
|
||||
|
||||
error = tty_wait(tp, &tp->t_inwait);
|
||||
if (error)
|
||||
|
Loading…
x
Reference in New Issue
Block a user