Skip to content

Commit

Permalink
tty: move from libc to nix
Browse files Browse the repository at this point in the history
This moves the unsafe from our responsibility to nix and makes
the code a bit cleaner.
  • Loading branch information
tertsdiepraam committed Aug 17, 2022
1 parent 87e3899 commit 780be01
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 28 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/uu/tty/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ path = "src/tty.rs"

[dependencies]
clap = { version = "3.2", features = ["wrap_help", "cargo"] }
libc = "0.2.126"
nix = "0.25"
atty = "0.2"
uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] }

Expand Down
49 changes: 23 additions & 26 deletions src/uu/tty/src/tty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
// spell-checker:ignore (ToDO) ttyname filedesc

use clap::{crate_version, Arg, Command};
use std::ffi::CStr;
use std::io::Write;
use uucore::error::UResult;
use std::os::unix::io::AsRawFd;
use uucore::error::{UResult, set_exit_code};
use uucore::format_usage;

static ABOUT: &str = "Print the file name of the terminal connected to standard input.";
Expand All @@ -24,42 +24,39 @@ mod options {

#[uucore::main]
pub fn uumain(args: impl uucore::Args) -> UResult<()> {
let args = args.collect_lossy();

let matches = uu_app().get_matches_from(args);

let silent = matches.contains_id(options::SILENT);

// Call libc function ttyname
let tty = unsafe {
let ptr = libc::ttyname(libc::STDIN_FILENO);
if !ptr.is_null() {
String::from_utf8_lossy(CStr::from_ptr(ptr).to_bytes()).to_string()
// If silent, we don't need the name, only whether or not stdin is a tty.
if silent {
return if atty::is(atty::Stream::Stdin) {
Ok(())
} else {
"".to_owned()
Err(1.into())
}
};

let mut stdout = std::io::stdout();

if !silent {
let write_result = if !tty.chars().all(|c| c.is_whitespace()) {
writeln!(stdout, "{}", tty)
} else {
writeln!(stdout, "not a tty")
};
if write_result.is_err() || stdout.flush().is_err() {
// Don't return to prevent a panic later when another flush is attempted
// because the `uucore_procs::main` macro inserts a flush after execution for every utility.
std::process::exit(3);
// Get the ttyname via nix
let name = nix::unistd::ttyname(std::io::stdin().as_raw_fd());

let write_result = match name {
Ok(name) => writeln!(stdout, "{}", name.display()),
Err(_) => {
set_exit_code(1);
writeln!(stdout, "{}", "not a tty")
}
}
};

if write_result.is_err() || stdout.flush().is_err() {
// Don't return to prevent a panic later when another flush is attempted
// because the `uucore_procs::main` macro inserts a flush after execution for every utility.
std::process::exit(3);
};

if atty::is(atty::Stream::Stdin) {
Ok(())
} else {
Err(libc::EXIT_FAILURE.into())
}
Ok(())
}

pub fn uu_app<'a>() -> Command<'a> {
Expand Down

0 comments on commit 780be01

Please sign in to comment.