diff --git a/CHANGELOG.md b/CHANGELOG.md index 41c6f255c4..bb3aeedb16 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 9622f39222..e8df1ed95b 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 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 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) }