summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Zeller <mike@mikezeller.net>2019-01-21 20:21:11 +0000
committerDavid Cuddeback <david.cuddeback@gmail.com>2020-04-04 17:11:19 -0600
commitecbab66e7f4c2655f59d29e47f45ccdb99db5111 (patch)
treeae50b8a077236104409f3bb8438835542b990980
parentdbf9528bbed22b221d7afe03ea6dfb617a01ddee (diff)
downloadtermios-rs-ecbab66e7f4c2655f59d29e47f45ccdb99db5111.zip
Add illumos support
-rw-r--r--README.md1
-rw-r--r--src/ffi.rs26
-rw-r--r--src/lib.rs5
-rw-r--r--src/os/mod.rs2
-rw-r--r--src/os/solaris.rs176
5 files changed, 210 insertions, 0 deletions
diff --git a/README.md b/README.md
index 0ae6ba6..94a65cb 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,7 @@ termios definitions for the following platforms:
* FreeBSD (amd64)
* OpenBSD (amd64)
* DragonFly BSD (x86_64)
+* illumos (x86_64)
## Usage
Add `termios` as a dependency in `Cargo.toml`:
diff --git a/src/ffi.rs b/src/ffi.rs
index 89e2084..8906f1c 100644
--- a/src/ffi.rs
+++ b/src/ffi.rs
@@ -10,11 +10,37 @@ extern "C" {
pub fn tcdrain(fd: c_int) -> c_int;
pub fn tcflush(fd: c_int, queue_selector: c_int) -> c_int;
pub fn tcflow(fd: c_int, action: c_int) -> c_int;
+ #[cfg(not(target_os = "solaris"))]
pub fn cfmakeraw(termios_p: *mut ::os::target::termios);
pub fn cfgetispeed(termios_p: *const ::os::target::termios) -> ::os::target::speed_t;
pub fn cfgetospeed(termios_p: *const ::os::target::termios) -> ::os::target::speed_t;
pub fn cfsetispeed(termios_p: *mut ::os::target::termios, speed: ::os::target::speed_t) -> c_int;
pub fn cfsetospeed(termios_p: *mut ::os::target::termios, speed: ::os::target::speed_t) -> c_int;
+ #[cfg(not(target_os = "solaris"))]
pub fn cfsetspeed(termios_p: *mut ::os::target::termios, speed: ::os::target::speed_t) -> c_int;
pub fn tcgetsid(fd: c_int) -> pid_t;
}
+
+#[cfg(target_os = "solaris")]
+#[no_mangle]
+pub unsafe extern "C" fn cfmakeraw(termios: *mut ::os::target::termios) {
+ use ::os::target::{IMAXBEL, IGNBRK, BRKINT, PARMRK, ISTRIP, INLCR, IGNCR, ICRNL, IXON};
+ use ::os::target::{OPOST, ECHO, ECHONL, ICANON, ISIG, IEXTEN, CSIZE, PARENB, CS8};
+
+ let mut t = *termios;
+
+ t.c_iflag &= !(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
+ t.c_oflag &= !OPOST;
+ t.c_lflag &= !(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+ t.c_cflag &= !(CSIZE|PARENB);
+ t.c_cflag |= CS8;
+}
+
+#[cfg(target_os = "solaris")]
+#[no_mangle]
+pub unsafe extern "C" fn cfsetspeed(termios_p: *mut ::os::target::termios, speed: ::os::target::speed_t) -> c_int {
+ match cfsetispeed(termios_p, speed) {
+ 0 => cfsetospeed(termios_p, speed),
+ err => err,
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index d229427..568aff0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -104,6 +104,11 @@
//! cfsetspeed(termios, termios::os::dragonfly::B230400)
//! }
//!
+//! #[cfg(target_os = "solaris")]
+//! fn set_fastest_speed(termios: &mut Termios) -> io::Result<()> {
+//! cfsetspeed(termios, termios::os::solaris::B921600)
+//! }
+//!
//! # let fd = 1;
//! let mut termios = Termios::from_fd(fd).unwrap();
//! set_fastest_speed(&mut termios).unwrap();
diff --git a/src/os/mod.rs b/src/os/mod.rs
index 519723c..f453532 100644
--- a/src/os/mod.rs
+++ b/src/os/mod.rs
@@ -6,6 +6,7 @@
#[cfg(target_os = "freebsd")] pub use self::freebsd as target;
#[cfg(target_os = "openbsd")] pub use self::openbsd as target;
#[cfg(target_os = "dragonfly")] pub use self::dragonfly as target;
+#[cfg(target_os = "solaris")] pub use self::solaris as target;
#[cfg(target_os = "linux")] pub mod linux;
#[cfg(target_os = "android")] pub mod android;
@@ -13,3 +14,4 @@
#[cfg(target_os = "freebsd")] pub mod freebsd;
#[cfg(target_os = "openbsd")] pub mod openbsd;
#[cfg(target_os = "dragonfly")] pub mod dragonfly;
+#[cfg(target_os = "solaris")] pub mod solaris;
diff --git a/src/os/solaris.rs b/src/os/solaris.rs
new file mode 100644
index 0000000..27ffc61
--- /dev/null
+++ b/src/os/solaris.rs
@@ -0,0 +1,176 @@
+#![allow(non_camel_case_types)]
+
+use libc::{c_int,c_uint,c_uchar};
+
+pub type cc_t = c_uchar;
+pub type speed_t = c_uint;
+pub type tcflag_t = c_uint;
+
+#[derive(Debug,Copy,Clone,Eq,PartialEq)]
+#[repr(C)]
+pub struct termios {
+ pub c_iflag: tcflag_t,
+ pub c_oflag: tcflag_t,
+ pub c_cflag: tcflag_t,
+ pub c_lflag: tcflag_t,
+ pub c_cc: [cc_t; NCCS]
+}
+
+pub const NCCS: usize = 19;
+
+// c_cc characters
+pub const VINTR: usize = 0;
+pub const VQUIT: usize = 1;
+pub const VERASE: usize = 2;
+pub const VKILL: usize = 3;
+pub const VEOF: usize = 4;
+pub const VEOL: usize = 5;
+pub const VEOL2: usize = 6;
+pub const VMIN: usize = 4;
+pub const VTIME: usize = 5;
+pub const VSWTCH: usize = 7;
+pub const VSTART: usize = 8;
+pub const VSTOP: usize = 9;
+pub const VSUSP: usize = 10;
+pub const VDSUSP: usize = 11;
+pub const VREPRINT: usize = 12;
+pub const VDISCARD: usize = 13;
+pub const VWERASE: usize = 14;
+pub const VLNEXT: usize = 15;
+pub const VSTATUS: usize = 16;
+pub const VERASE2: usize = 17;
+
+// c_iflag bits
+pub const IGNBRK: tcflag_t = 0o000001;
+pub const BRKINT: tcflag_t = 0o000002;
+pub const IGNPAR: tcflag_t = 0o000004;
+pub const PARMRK: tcflag_t = 0o000010;
+pub const INPCK: tcflag_t = 0o000020;
+pub const ISTRIP: tcflag_t = 0o000040;
+pub const INLCR: tcflag_t = 0o000100;
+pub const IGNCR: tcflag_t = 0o000200;
+pub const ICRNL: tcflag_t = 0o000400;
+pub const IUCLC: tcflag_t = 0o001000;
+pub const IXON: tcflag_t = 0o002000;
+pub const IXANY: tcflag_t = 0o004000;
+pub const IXOFF: tcflag_t = 0o010000;
+pub const IMAXBEL: tcflag_t = 0o020000;
+
+// c_oflag bits
+pub const OPOST: tcflag_t = 0o000001;
+pub const OLCUC: tcflag_t = 0o000002;
+pub const ONLCR: tcflag_t = 0o000004;
+pub const OCRNL: tcflag_t = 0o000010;
+pub const ONOCR: tcflag_t = 0o000020;
+pub const ONLRET: tcflag_t = 0o000040;
+pub const OFILL: tcflag_t = 0o000100;
+pub const OFDEL: tcflag_t = 0o000200;
+pub const NLDLY: tcflag_t = 0o000400;
+pub const NL0: tcflag_t = 0o000000;
+pub const NL1: tcflag_t = 0o000400;
+pub const CRDLY: tcflag_t = 0o003000;
+pub const CR0: tcflag_t = 0o000000;
+pub const CR1: tcflag_t = 0o001000;
+pub const CR2: tcflag_t = 0o002000;
+pub const CR3: tcflag_t = 0o003000;
+pub const TABDLY: tcflag_t = 0o014000;
+pub const TAB0: tcflag_t = 0o000000;
+pub const TAB1: tcflag_t = 0o004000;
+pub const TAB2: tcflag_t = 0o010000;
+pub const TAB3: tcflag_t = 0o014000;
+pub const BSDLY: tcflag_t = 0o020000;
+pub const BS0: tcflag_t = 0o000000;
+pub const BS1: tcflag_t = 0o020000;
+pub const FFDLY: tcflag_t = 0o100000;
+pub const FF0: tcflag_t = 0o000000;
+pub const FF1: tcflag_t = 0o100000;
+pub const VTDLY: tcflag_t = 0o040000;
+pub const VT0: tcflag_t = 0o000000;
+pub const VT1: tcflag_t = 0o040000;
+pub const XTABS: tcflag_t = 0o014000;
+
+// c_cflag bits
+pub const CBAUD: tcflag_t = 0o000017;
+pub const CSIZE: tcflag_t = 0o000060;
+pub const CS5: tcflag_t = 0o000000;
+pub const CS6: tcflag_t = 0o000020;
+pub const CS7: tcflag_t = 0o000040;
+pub const CS8: tcflag_t = 0o000060;
+pub const CSTOPB: tcflag_t = 0o000100;
+pub const CREAD: tcflag_t = 0o000200;
+pub const PARENB: tcflag_t = 0o000400;
+pub const PARODD: tcflag_t = 0o001000;
+pub const HUPCL: tcflag_t = 0o002000;
+pub const CLOCAL: tcflag_t = 0o004000;
+pub const RCV1EN: tcflag_t = 0o010000;
+pub const XMT1EN: tcflag_t = 0o020000;
+pub const LOBLK: tcflag_t = 0o040000;
+pub const XCLUDE: tcflag_t = 0o100000;
+pub const CRTSXOFF: tcflag_t = 0o10000000000;
+pub const CRTSCTS: tcflag_t = 0o20000000000;
+pub const CIBAUD: tcflag_t = 0o3600000;
+pub const PAREXT: tcflag_t = 0o4000000;
+pub const CBAUDEXT: tcflag_t = 0o10000000;
+pub const CIBAUDEXT: tcflag_t = 0o20000000;
+
+// c_lflag bits
+pub const ISIG: tcflag_t = 0o000001;
+pub const ICANON: tcflag_t = 0o000002;
+pub const XCASE: tcflag_t = 0o000004;
+pub const ECHO: tcflag_t = 0o000010;
+pub const ECHOE: tcflag_t = 0o000020;
+pub const ECHOK: tcflag_t = 0o000040;
+pub const ECHONL: tcflag_t = 0o000100;
+pub const NOFLSH: tcflag_t = 0o000200;
+pub const TOSTOP: tcflag_t = 0o000400;
+pub const ECHOCTL: tcflag_t = 0o001000;
+pub const ECHOPRT: tcflag_t = 0o002000;
+pub const ECHOKE: tcflag_t = 0o004000;
+pub const DEFECHO: tcflag_t = 0o010000;
+pub const FLUSHO: tcflag_t = 0o020000;
+pub const PENDIN: tcflag_t = 0o040000;
+pub const IEXTEN: tcflag_t = 0o100000;
+
+// baud rates
+pub const B0: speed_t = 0;
+pub const B50: speed_t = 1;
+pub const B75: speed_t = 2;
+pub const B110: speed_t = 3;
+pub const B134: speed_t = 4;
+pub const B150: speed_t = 5;
+pub const B200: speed_t = 6;
+pub const B300: speed_t = 7;
+pub const B600: speed_t = 8;
+pub const B1200: speed_t = 9;
+pub const B1800: speed_t = 10;
+pub const B2400: speed_t = 11;
+pub const B4800: speed_t = 12;
+pub const B9600: speed_t = 13;
+pub const B19200: speed_t = 14;
+pub const B38400: speed_t = 15;
+pub const EXTA: speed_t = B19200;
+pub const EXTB: speed_t = B38400;
+pub const B57600: speed_t = 16;
+pub const B76800: speed_t = 17;
+pub const B115200: speed_t = 18;
+pub const B153600: speed_t = 19;
+pub const B230400: speed_t = 20;
+pub const B307200: speed_t = 21;
+pub const B460800: speed_t = 22;
+pub const B921600: speed_t = 23;
+
+// tcflow()
+pub const TCOOFF: c_int = 0;
+pub const TCOON: c_int = 1;
+pub const TCIOFF: c_int = 2;
+pub const TCION: c_int = 3;
+
+// tcflush()
+pub const TCIFLUSH: c_int = 0;
+pub const TCOFLUSH: c_int = 1;
+pub const TCIOFLUSH: c_int = 2;
+
+// tcsetattr()
+pub const TCSANOW: c_int = 0o052016;
+pub const TCSADRAIN: c_int = 0o052017;
+pub const TCSAFLUSH: c_int = 0o052020;