1 use std::io;
2 
3 use super::{cvt, syscall, Termios};
4 
get_terminal_attr() -> io::Result<Termios>5 pub 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<()>19 pub 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)31 pub fn raw_terminal_attr(ios: &mut Termios) {
32     ios.make_raw()
33 }
34