1 use std::io; 2 3 use super::{cvt, syscall, Termios}; 4 get_terminal_attr() -> io::Result<Termios>5pub fn get_terminal_attr() -> io::Result<Termios> { 6 let mut termios = Termios::default(); 7 8 let fd = cvt(syscall::dup(0, b"termios"))?; 9 let res = cvt(syscall::read(fd, &mut termios)); 10 let _ = syscall::close(fd); 11 12 if res? == termios.len() { 13 Ok(termios) 14 } else { 15 Err(io::Error::new(io::ErrorKind::Other, "Unable to get the terminal attributes.")) 16 } 17 } 18 set_terminal_attr(termios: &Termios) -> io::Result<()>19pub fn set_terminal_attr(termios: &Termios) -> io::Result<()> { 20 let fd = cvt(syscall::dup(0, b"termios"))?; 21 let res = cvt(syscall::write(fd, termios)); 22 let _ = syscall::close(fd); 23 24 if res? == termios.len() { 25 Ok(()) 26 } else { 27 Err(io::Error::new(io::ErrorKind::Other, "Unable to set the terminal attributes.")) 28 } 29 } 30 raw_terminal_attr(ios: &mut Termios)31pub fn raw_terminal_attr(ios: &mut Termios) { 32 ios.make_raw() 33 } 34