summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-04-08 01:37:32 +0900
committerGitHub <noreply@github.com>2020-04-08 01:37:32 +0900
commitf1ad2f5806001000e37cd7c03b0f6ce6c575449e (patch)
treef1d9e175f150c38ab1301bcbfb6056138b1e2208
parent1d9e5fbc04b656a5e8c10b3642578d7a62656c8e (diff)
parent5b6a3335cac79730d20860b3b9aa5738d0c40377 (diff)
downloadrust-libc-f1ad2f5806001000e37cd7c03b0f6ce6c575449e.tar.gz
Merge pull request #1717 from jclulow/illumos-cfmakeraw
fix cfmakeraw() for illumos and Solaris
-rw-r--r--src/unix/solarish/compat.rs27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/unix/solarish/compat.rs b/src/unix/solarish/compat.rs
index a33645211c..610dd10973 100644
--- a/src/unix/solarish/compat.rs
+++ b/src/unix/solarish/compat.rs
@@ -4,8 +4,7 @@
use unix::solarish::*;
pub unsafe fn cfmakeraw(termios: *mut ::termios) {
- let mut t = *termios as ::termios;
- t.c_iflag &= !(IMAXBEL
+ (*termios).c_iflag &= !(IMAXBEL
| IGNBRK
| BRKINT
| PARMRK
@@ -14,10 +13,26 @@ pub unsafe fn cfmakeraw(termios: *mut ::termios) {
| IGNCR
| ICRNL
| IXON);
- t.c_oflag &= !OPOST;
- t.c_lflag &= !(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
- t.c_cflag &= !(CSIZE | PARENB);
- t.c_cflag |= CS8;
+ (*termios).c_oflag &= !OPOST;
+ (*termios).c_lflag &= !(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
+ (*termios).c_cflag &= !(CSIZE | PARENB);
+ (*termios).c_cflag |= CS8;
+
+ // By default, most software expects a pending read to block until at
+ // least one byte becomes available. As per termio(7I), this requires
+ // setting the MIN and TIME parameters appropriately.
+ //
+ // As a somewhat unfortunate artefact of history, the MIN and TIME slots
+ // in the control character array overlap with the EOF and EOL slots used
+ // for canonical mode processing. Because the EOF character needs to be
+ // the ASCII EOT value (aka Control-D), it has the byte value 4. When
+ // switching to raw mode, this is interpreted as a MIN value of 4; i.e.,
+ // reads will block until at least four bytes have been input.
+ //
+ // Other platforms with a distinct MIN slot like Linux and FreeBSD appear
+ // to default to a MIN value of 1, so we'll force that value here:
+ (*termios).c_cc[VMIN] = 1;
+ (*termios).c_cc[VTIME] = 0;
}
pub unsafe fn cfsetspeed(