From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 5F88F92238 for ; Fri, 16 Feb 2024 15:59:03 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 483214E38 for ; Fri, 16 Feb 2024 15:59:03 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Fri, 16 Feb 2024 15:59:02 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 5946B4854B for ; Fri, 16 Feb 2024 15:59:02 +0100 (CET) From: Maximiliano Sandoval To: pbs-devel@lists.proxmox.com Date: Fri, 16 Feb 2024 15:59:00 +0100 Message-Id: <20240216145901.420097-1-m.sandoval@proxmox.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.020 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pbs-devel] [PATCH proxmox v2 1/2] sys: Use safe wrapper for libc::isatty X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Feb 2024 14:59:03 -0000 From: Maximiliano Sandoval R 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 --- Differences from v1: - Mark old fns as depreacted 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()); -- 2.39.2