[pbs-devel] [PATCH proxmox v2 1/2] sys: Use safe wrapper for libc::isatty
Fabian Grünbichler
f.gruenbichler at proxmox.com
Mon Nov 27 10:15:02 CET 2023
On November 20, 2023 9:16 am, Maximiliano Sandoval R wrote:
> 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 R <m.sandoval at proxmox.com>
> ---
> Differences from v1:
> - Rebased
> - Set MSRV to 1.70
>
>
> Cargo.toml | 1 +
> proxmox-sys/src/linux/tty.rs | 20 +++++++-------------
> 2 files changed, 8 insertions(+), 13 deletions(-)
>
> diff --git a/Cargo.toml b/Cargo.toml
> index d4d532b..b89d9d7 100644
> --- a/Cargo.toml
> +++ b/Cargo.toml
> @@ -42,6 +42,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 fdea162..375e0ec 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,14 @@ 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.
> 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.
> pub fn stdin_isatty() -> bool {
> - unsafe { libc::isatty(std::io::stdin().as_raw_fd()) == 1 }
> + std::io::stdin().is_terminal()
> }
do we still need these two? I assume everything calling this would then
do something with stdin/stdout anyway, and could just as well call
is_terminal() on them? might be a candidate for deprecation, since the
original reason for their existence (pulling out the `unsafe` part into
a helper) is gone..
>
> pub enum TtyOutput {
> @@ -75,7 +69,7 @@ impl TtyOutput {
> /// Get an output file descriptor for the current terminal.
> pub fn open() -> io::Result<Option<Self>> {
> 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 +91,7 @@ impl TtyOutput {
> /// first.
> pub fn read_password(query: &str) -> Result<Vec<u8>, 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());
> --
> 2.39.2
>
>
>
> _______________________________________________
> pbs-devel mailing list
> pbs-devel at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
>
>
>
More information about the pbs-devel
mailing list