summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHomu <homu@barosl.com>2017-02-26 04:36:08 +0900
committerHomu <homu@barosl.com>2017-02-26 04:36:08 +0900
commitcb1c9150595a25a5f53f9ee77e37b5e9187824ac (patch)
tree9a14498fb40432019473f6231224585de257b892
parent4c9e42f0f776f1533f03e78af25f0efbf628fb88 (diff)
parent8b6242eb0d83d3902b11cea395536509f44f6559 (diff)
downloadnix-cb1c9150595a25a5f53f9ee77e37b5e9187824ac.zip
Auto merge of #518 - berkowski:baud_constants, r=posborne
Added BaudRate enum for termios Issue #514 Does not provide `BaudRate::EXTA` or `BaudRate::EXTB` constants. These seem to alias to `B19200` and `B38400` respectively and so break the 1:1 mapping needed by `From`. I don't know their historic use.
-rw-r--r--CHANGELOG.md5
-rw-r--r--src/sys/termios.rs177
2 files changed, 174 insertions, 8 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 41c6f255..bb3aeedb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased]
### Added
+- Added `::nix::sys::termios::BaudRate` enum to provide portable baudrate
+ values. ([#518](https://github.com/nix-rust/nix/pull/518))
- Added a new `WaitStatus::PtraceEvent` to support ptrace events on Linux
and Android ([([#438](https://github.com/nix-rust/nix/pull/438))
- Added support for POSIX AIO
@@ -41,6 +43,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).
([#503](https://github.com/nix-rust/nix/pull/503))
### Changed
+- `::nix::sys::termios::{cfgetispeed, cfsetispeed, cfgetospeed, cfsetospeed}`
+ switched to use `BaudRate` enum from `speed_t`.
+ ([#518](https://github.com/nix-rust/nix/pull/518))
- `epoll_ctl` now could accept None as argument `event`
when op is `EpollOp::EpollCtlDel`.
([#480](https://github.com/nix-rust/nix/pull/480))
diff --git a/src/sys/termios.rs b/src/sys/termios.rs
index 9622f392..e8df1ed9 100644
--- a/src/sys/termios.rs
+++ b/src/sys/termios.rs
@@ -125,6 +125,83 @@ mod ffi {
pub c_ospeed: speed_t
}
+ #[derive(Clone, Copy, Debug, PartialEq)]
+ pub enum BaudRate {
+ B0,
+ B50,
+ B75,
+ B110,
+ B134,
+ B150,
+ B200,
+ B300,
+ B600,
+ B1200,
+ B1800,
+ B2400,
+ B4800,
+ B9600,
+ B19200,
+ B38400,
+ B7200,
+ B14400,
+ B28800,
+ B57600,
+ B76800,
+ B115200,
+ B230400,
+ #[cfg(any(target_os = "netbsd", target_os = "freebsd"))]
+ B460800,
+ #[cfg(any(target_os = "netbsd", target_os = "freebsd"))]
+ B921600,
+ }
+
+ impl From<speed_t> for BaudRate {
+ fn from(s: speed_t) -> BaudRate {
+
+ use libc::{
+ B0, B50, B75, B110, B134, B150,
+ B200, B300, B600, B1200, B1800, B2400,
+ B4800, B9600, B19200, B38400,
+ B7200, B14400, B28800, B57600,
+ B76800, B115200, B230400};
+
+ #[cfg(any(target_os = "netbsd", target_os = "freebsd"))]
+ use libc::{B460800, B921600};
+
+ match s {
+ B0 => BaudRate::B0,
+ B50 => BaudRate::B50,
+ B75 => BaudRate::B75,
+ B110 => BaudRate::B110,
+ B134 => BaudRate::B134,
+ B150 => BaudRate::B150,
+ B200 => BaudRate::B200,
+ B300 => BaudRate::B300,
+ B600 => BaudRate::B600,
+ B1200 => BaudRate::B1200,
+ B1800 => BaudRate::B1800,
+ B2400 => BaudRate::B2400,
+ B4800 => BaudRate::B4800,
+ B9600 => BaudRate::B9600,
+ B19200 => BaudRate::B19200,
+ B38400 => BaudRate::B38400,
+ B7200 => BaudRate::B7200,
+ B14400 => BaudRate::B14400,
+ B28800 => BaudRate::B28800,
+ B57600 => BaudRate::B57600,
+ B76800 => BaudRate::B76800,
+ B115200 => BaudRate::B115200,
+ B230400 => BaudRate::B230400,
+ #[cfg(any(target_os = "netbsd", target_os = "freebsd"))]
+ B460800 => BaudRate::B460800,
+ #[cfg(any(target_os = "netbsd", target_os = "freebsd"))]
+ B921600 => BaudRate::B921600,
+ b @ _ => unreachable!("Invalid baud constant: {}", b),
+ }
+ }
+ }
+
pub const VEOF: usize = 0;
pub const VEOL: usize = 1;
pub const VEOL2: usize = 2;
@@ -293,6 +370,90 @@ mod ffi {
pub c_ospeed: speed_t
}
+ #[derive(Clone, Copy, Debug, PartialEq)]
+ pub enum BaudRate {
+ B0,
+ B50,
+ B75,
+ B110,
+ B134,
+ B150,
+ B200,
+ B300,
+ B600,
+ B1200,
+ B1800,
+ B2400,
+ B4800,
+ B9600,
+ B19200,
+ B38400,
+ B57600,
+ B115200,
+ B230400,
+ B460800,
+ B500000,
+ B576000,
+ B921600,
+ B1000000,
+ B1152000,
+ B1500000,
+ B2000000,
+ B2500000,
+ B3000000,
+ B3500000,
+ B4000000,
+ }
+
+ impl From<speed_t> for BaudRate {
+ fn from(s: speed_t) -> BaudRate {
+
+ use libc::{
+ B0, B50, B75, B110, B134, B150,
+ B200, B300, B600, B1200, B1800, B2400,
+ B4800, B9600, B19200, B38400, B57600,
+ B115200, B230400, B460800, B500000,
+ B576000, B921600, B1000000, B1152000,
+ B1500000, B2000000, B2500000, B3000000,
+ B3500000, B4000000};
+
+ match s {
+ B0 => BaudRate::B0,
+ B50 => BaudRate::B50,
+ B75 => BaudRate::B75,
+ B110 => BaudRate::B110,
+ B134 => BaudRate::B134,
+ B150 => BaudRate::B150,
+ B200 => BaudRate::B200,
+ B300 => BaudRate::B300,
+ B600 => BaudRate::B600,
+ B1200 => BaudRate::B1200,
+ B1800 => BaudRate::B1800,
+ B2400 => BaudRate::B2400,
+ B4800 => BaudRate::B4800,
+ B9600 => BaudRate::B9600,
+ B19200 => BaudRate::B19200,
+ B38400 => BaudRate::B38400,
+ B57600 => BaudRate::B57600,
+ B115200 => BaudRate::B115200,
+ B230400 => BaudRate::B230400,
+ B460800 => BaudRate::B460800,
+ B500000 => BaudRate::B500000,
+ B576000 => BaudRate::B576000,
+ B921600 => BaudRate::B921600,
+ B1000000 => BaudRate::B1000000,
+ B1152000 => BaudRate::B1152000,
+ B1500000 => BaudRate::B1500000,
+ B2000000 => BaudRate::B2000000,
+ B2500000 => BaudRate::B2500000,
+ B3000000 => BaudRate::B3000000,
+ B3500000 => BaudRate::B3500000,
+ B4000000 => BaudRate::B4000000,
+ b @ _ => unreachable!("Invalid baud constant: {}", b),
+ }
+ }
+ }
+
pub const VEOF: usize = 4;
pub const VEOL: usize = 11;
pub const VEOL2: usize = 16;
@@ -426,27 +587,27 @@ mod ffi {
}
}
-pub fn cfgetispeed(termios: &Termios) -> speed_t {
+pub fn cfgetispeed(termios: &Termios) -> BaudRate {
unsafe {
- ffi::cfgetispeed(termios)
+ ffi::cfgetispeed(termios).into()
}
}
-pub fn cfgetospeed(termios: &Termios) -> speed_t {
+pub fn cfgetospeed(termios: &Termios) -> BaudRate {
unsafe {
- ffi::cfgetospeed(termios)
+ ffi::cfgetospeed(termios).into()
}
}
-pub fn cfsetispeed(termios: &mut Termios, speed: speed_t) -> Result<()> {
+pub fn cfsetispeed(termios: &mut Termios, baud: BaudRate) -> Result<()> {
Errno::result(unsafe {
- ffi::cfsetispeed(termios, speed)
+ ffi::cfsetispeed(termios, baud as speed_t)
}).map(drop)
}
-pub fn cfsetospeed(termios: &mut Termios, speed: speed_t) -> Result<()> {
+pub fn cfsetospeed(termios: &mut Termios, baud: BaudRate) -> Result<()> {
Errno::result(unsafe {
- ffi::cfsetospeed(termios, speed)
+ ffi::cfsetospeed(termios, baud as speed_t)
}).map(drop)
}