From 430df21720f93ee46c8510d20b07c224c17394ff Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Fri, 16 Feb 2024 15:59:00 +0100 Subject: [PATCH] sys: Use safe wrapper for libc::isatty Use the `std::io::IsTerminal` trait introduced in Rust 1.70. Internally it calls `libc::isatty`, see [1, 2]. Note that it switches the comparison from `== 1` to `!= 0` which shouldn't make a difference assuming that libc::isatty upholds the promises made in its man page. The MSRV was set on the workspace to reflect this change. [1] https://doc.rust-lang.org/src/std/io/stdio.rs.html#1079 [2] https://doc.rust-lang.org/src/std/sys/unix/io.rs.html#79 Signed-off-by: Maximiliano Sandoval --- Cargo.toml | 1 + proxmox-sys/src/linux/tty.rs | 22 +++++++++------------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index de79f7ca..58d5a67e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,7 @@ license = "AGPL-3" repository = "https://git.proxmox.com/?p=proxmox.git" homepage = "https://proxmox.com" exclude = [ "debian" ] +rust-version = "1.70" [workspace.dependencies] # any features enabled here are enabled on all members using 'workspace = true'! diff --git a/proxmox-sys/src/linux/tty.rs b/proxmox-sys/src/linux/tty.rs index fdea1629..9a1e4679 100644 --- a/proxmox-sys/src/linux/tty.rs +++ b/proxmox-sys/src/linux/tty.rs @@ -1,4 +1,4 @@ -use std::io::{self, Read, Write}; +use std::io::{self, IsTerminal, Read, Write}; use std::mem::MaybeUninit; use std::os::unix::io::{AsRawFd, OwnedFd}; @@ -25,20 +25,16 @@ pub fn stdout_terminal_size() -> (usize, usize) { (winsize.ws_row as usize, winsize.ws_col as usize) } -/// Returns whether the current stdout is a tty . -/// # Safety -/// -/// uses unsafe call to libc::isatty +/// Returns whether the current stdout is a tty. +#[deprecated(note = "Use std::io::stdout().is_terminal()")] pub fn stdout_isatty() -> bool { - unsafe { libc::isatty(std::io::stdin().as_raw_fd()) == 1 } + std::io::stdout().is_terminal() } -/// Returns whether the current stdin is a tty . -/// # Safety -/// -/// uses unsafe call to libc::isatty +/// Returns whether the current stdin is a tty. +#[deprecated(note = "Use std::io::stdin().is_terminal()")] pub fn stdin_isatty() -> bool { - unsafe { libc::isatty(std::io::stdin().as_raw_fd()) == 1 } + std::io::stdin().is_terminal() } pub enum TtyOutput { @@ -75,7 +71,7 @@ impl TtyOutput { /// Get an output file descriptor for the current terminal. pub fn open() -> io::Result> { let stdout = std::io::stdout(); - if unsafe { libc::isatty(stdout.as_raw_fd()) } == 1 { + if stdout.is_terminal() { Ok(Some(TtyOutput::Stdout(stdout))) } else { match crate::fd::open( @@ -97,7 +93,7 @@ impl TtyOutput { /// first. pub fn read_password(query: &str) -> Result, Error> { let input = std::io::stdin(); - if unsafe { libc::isatty(input.as_raw_fd()) } != 1 { + if !input.is_terminal() { let mut out = String::new(); input.read_line(&mut out)?; return Ok(out.into_bytes());