public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Maximiliano Sandoval <m.sandoval@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox v2 1/2] sys: Use safe wrapper for libc::isatty
Date: Fri, 16 Feb 2024 15:59:00 +0100	[thread overview]
Message-ID: <20240216145901.420097-1-m.sandoval@proxmox.com> (raw)

From: Maximiliano Sandoval R <m.sandoval@proxmox.com>

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 <m.sandoval@proxmox.com>
---
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<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 +93,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





             reply	other threads:[~2024-02-16 14:59 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-16 14:59 Maximiliano Sandoval [this message]
2024-02-16 14:59 ` [pbs-devel] [PATCH proxmox v2 2/2] router: " Maximiliano Sandoval
2024-02-16 15:57 ` [pbs-devel] applied: [PATCH proxmox v2 1/2] sys: " Dietmar Maurer
  -- strict thread matches above, loose matches on Subject: below --
2023-11-20  8:16 [pbs-devel] " Maximiliano Sandoval R
2023-11-27  9:15 ` Fabian Grünbichler
2023-11-27 10:09   ` Maximiliano Sandoval
2023-11-27 13:15   ` Wolfgang Bumiller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240216145901.420097-1-m.sandoval@proxmox.com \
    --to=m.sandoval@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal