Implement size and is_tty with termios on Redox
This commit is contained in:
parent
dbf6546b3e
commit
5fdabb4320
|
@ -11,3 +11,8 @@ exclude = ["target", "CHANGELOG.md", "image.png", "Cargo.lock"]
|
|||
|
||||
[target.'cfg(not(target_os = "redox"))'.dependencies]
|
||||
libc = "0.2.8"
|
||||
|
||||
|
||||
[target.'cfg(target_os = "redox")'.dependencies]
|
||||
redox_syscall = "0.1"
|
||||
redox_termios = "0.1"
|
||||
|
|
|
@ -17,6 +17,12 @@ extern crate libc;
|
|||
#[cfg(not(target_os = "redox"))]
|
||||
mod termios;
|
||||
|
||||
#[cfg(target_os = "redox")]
|
||||
extern crate redox_termios;
|
||||
|
||||
#[cfg(target_os = "redox")]
|
||||
extern crate syscall;
|
||||
|
||||
mod async;
|
||||
pub use async::{AsyncReader, async_stdin};
|
||||
|
||||
|
|
21
src/size.rs
21
src/size.rs
|
@ -57,16 +57,21 @@ pub fn terminal_size() -> io::Result<(u16, u16)> {
|
|||
/// Get the size of the terminal.
|
||||
#[cfg(target_os = "redox")]
|
||||
pub fn terminal_size() -> io::Result<(u16, u16)> {
|
||||
use std::env;
|
||||
use redox_termios;
|
||||
use syscall;
|
||||
|
||||
let width = try!(env::var("COLUMNS").map_err(|x| io::Error::new(io::ErrorKind::NotFound, x)))
|
||||
.parse()
|
||||
.unwrap_or(0);
|
||||
let height = try!(env::var("LINES").map_err(|x| io::Error::new(io::ErrorKind::NotFound, x)))
|
||||
.parse()
|
||||
.unwrap_or(0);
|
||||
if let Ok(fd) = syscall::dup(1, b"winsize") {
|
||||
let mut winsize = redox_termios::Winsize::default();
|
||||
let res = syscall::read(fd, &mut winsize);
|
||||
let _ = syscall::close(fd);
|
||||
if let Ok(count) = res {
|
||||
if count == winsize.len() {
|
||||
return Ok((winsize.ws_col, winsize.ws_row));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok((width, height))
|
||||
Err(io::Error::new(io::ErrorKind::Other, "Unable to get the terminal size."))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
|
11
src/tty.rs
11
src/tty.rs
|
@ -11,8 +11,15 @@ pub fn is_tty<T: AsRawFd>(stream: &T) -> bool {
|
|||
|
||||
/// This will panic.
|
||||
#[cfg(target_os = "redox")]
|
||||
pub fn is_tty<T: AsRawFd>(_stream: &T) -> bool {
|
||||
unimplemented!();
|
||||
pub fn is_tty<T: AsRawFd>(stream: &T) -> bool {
|
||||
use syscall;
|
||||
|
||||
if let Ok(fd) = syscall::dup(stream.as_raw_fd(), b"termios") {
|
||||
let _ = syscall::close(fd);
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the TTY device.
|
||||
|
|
Loading…
Reference in New Issue